From bf17f9f44b808b84d18f35fef6de9ae86b74133f Mon Sep 17 00:00:00 2001 From: cclu <1106109051@qq.com> Date: Wed, 9 Apr 2025 16:29:40 +0800 Subject: [PATCH] =?UTF-8?q?=20feat(=E6=A8=A1=E5=9D=97):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E4=B8=AA=E5=BE=88=E6=A3=92=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/router.ts | 5 + src/layouts/index.tsx | 16 +- src/models/user.ts | 11 +- src/pages/authority.ts | 3 + src/pages/examine/modal/index.tsx | 2 +- .../record/components/recordDetail.tsx | 70 +- src/pages/examine/record/index.tsx | 41 +- src/pages/examine/recordSummary/index.tsx | 602 ++++++++++++++++++ src/pages/setting/menu/components/addMenu.tsx | 211 +++++- src/pages/setting/menu/index.tsx | 89 ++- src/pages/setting/menu/service.ts | 8 +- 11 files changed, 971 insertions(+), 87 deletions(-) create mode 100644 src/pages/examine/recordSummary/index.tsx diff --git a/config/router.ts b/config/router.ts index 20bd1d4..f3402e1 100644 --- a/config/router.ts +++ b/config/router.ts @@ -44,6 +44,11 @@ export default [ path: '/examine/record', name: '考核记录管理', component: "@/pages/examine/record/index", + }, + { + path: '/examine/recordSummary', + name: '考核记录汇总', + component: "@/pages/examine/recordSummary/index", } ] }, diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx index 128b916..e8b013c 100644 --- a/src/layouts/index.tsx +++ b/src/layouts/index.tsx @@ -1,11 +1,4 @@ -/* - * @Author: cclu 1106109051@qq.com - * @Date: 2025-02-27 15:55:46 - * @LastEditors: cclu 1106109051@qq.com - * @LastEditTime: 2025-03-10 17:46:55 - * @FilePath: \umi4-admin-main\src\layouts\index.tsx - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ + import type { FC } from 'react'; import { useState, useEffect } from 'react'; import { Dropdown, Layout, Menu, Tabs, Tooltip } from 'antd'; @@ -201,6 +194,13 @@ const BasicLayout: FC<{ user: UserModelState, global: ProfileModelState, dispatc name: "考核记录管理", path: "/examine/record", }, + { + SYSTEMMODULE_DESC: "", + guid: "7", + hideInMenu: false, + name: "考核记录汇总", + path: "/examine/recordSummary", + }, { SYSTEMMODULE_DESC: "", guid: "6", diff --git a/src/models/user.ts b/src/models/user.ts index 25e2566..48d6977 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -242,7 +242,13 @@ const UserModel: UserModelType = { path: '/examine/record', name: '考核记录管理', component: "@/pages/examine/record", - } + }, + { + path: '/examine/recordSummary', + name: '考核记录汇总', + component: "@/pages/examine/recordSummary", + }, + ] }, { @@ -289,7 +295,8 @@ const UserModel: UserModelType = { '/examine/modal', '/examine/question', '/examine/record', - '/setting/menu' + '/setting/menu', + '/examine/recordSummary' ], rootSubmenuKeys: handleGetRootSubmenuKeys(menuRes.data), indexAllMenuItemById: handleGetEachDatumFromNestedDataByKey(menuRes.data, 'id'), diff --git a/src/pages/authority.ts b/src/pages/authority.ts index a315255..b808b9c 100644 --- a/src/pages/authority.ts +++ b/src/pages/authority.ts @@ -14,6 +14,9 @@ const authority: PageAuthority = { '/examine/record': [ '/examine/record', ], + '/examine/recordSummary': [ + '/examine/recordSummary', + ], '/setting/menu': ['/setting/menu'] }; diff --git a/src/pages/examine/modal/index.tsx b/src/pages/examine/modal/index.tsx index 54abaf8..2b46ade 100644 --- a/src/pages/examine/modal/index.tsx +++ b/src/pages/examine/modal/index.tsx @@ -481,7 +481,7 @@ const examineModal: React.FC<{ currentUser: any }> = (props) => { const fileData = await handleUploadFile(formData) console.log('fileData', fileData); - let imgUrl: string = `https://es.robot-z.cn/${fileData.data.path}` + let imgUrl: string = `https://es.eshangtech.com/${fileData.data.path}` await handleUpdateTemplates({ ...data.data, qrUrl: imgUrl diff --git a/src/pages/examine/record/components/recordDetail.tsx b/src/pages/examine/record/components/recordDetail.tsx index 527ca35..6855234 100644 --- a/src/pages/examine/record/components/recordDetail.tsx +++ b/src/pages/examine/record/components/recordDetail.tsx @@ -536,33 +536,51 @@ const RecordDetail = ({ parentRow, show, detailType, currentUser, onRef, showErr readonly /> - - ( -
-
{listDom}
-
{action}
+ + { + formRes?.imgsList && formRes?.imgsList.length > 0 ? + +
+ { + formRes?.imgsList && formRes?.imgsList.length > 0 ? + formRes?.imgsList.map((item: string) => { + return + }) + : '' + }
- )} - > -
- { - formRes?.imgsList && formRes?.imgsList.length > 0 ? - formRes?.imgsList.map((item: string) => { - return - }) - : '' - } -
- - + + + // + // ( + //
+ //
{listDom}
+ //
{action}
+ //
+ // )} + // > + //
+ // { + // formRes?.imgsList && formRes?.imgsList.length > 0 ? + // formRes?.imgsList.map((item: string) => { + // return + // }) + // : '' + // } + //
+ //
+ // + : "" + } } diff --git a/src/pages/examine/record/index.tsx b/src/pages/examine/record/index.tsx index ade954e..d8cb11a 100644 --- a/src/pages/examine/record/index.tsx +++ b/src/pages/examine/record/index.tsx @@ -39,22 +39,29 @@ const examineRecord: React.FC<{ currentUser: any }> = (props) => { title: "统计日期", dataIndex: "staticDate", hideInTable: true, - valueType: "dateRange", - initialValue: [moment().startOf('M'), moment()], - search: { - transform: (value: any) => { - return { - startTime: moment(value[0]).format('YYYY-MM-DD'), - endTime: moment(value[1]).format('YYYY-MM-DD') - }; - }, - }, - fieldProps: { - picker: "day", - format: 'YYYY-MM-DD', - } + valueType: "date", + initialValue: moment().subtract('1', 'd'), }, // { + // title: "统计日期", + // dataIndex: "staticDate", + // hideInTable: true, + // valueType: "dateRange", + // initialValue: [moment().startOf('M'), moment()], + // search: { + // transform: (value: any) => { + // return { + // startTime: moment(value[0]).format('YYYY-MM-DD'), + // endTime: moment(value[1]).format('YYYY-MM-DD') + // }; + // }, + // }, + // fieldProps: { + // picker: "day", + // format: 'YYYY-MM-DD', + // } + // }, + // { // title: "服务区", // dataIndex: "serverPartId", // hideInTable: true, @@ -289,7 +296,7 @@ const examineRecord: React.FC<{ currentUser: any }> = (props) => { expandRowByClick: true }} rowKey={(record) => { - return `${record?.id}` + return `${record?.id}-${record?.code}` }} scroll={{ x: "100%", y: 'calc(100vh - 400px)' }} headerTitle={考核记录管理} @@ -304,8 +311,8 @@ const examineRecord: React.FC<{ currentUser: any }> = (props) => { const req: any = { serverPartIds: selectedId && selectedId.length > 0 ? selectedId : [], - startTime: params?.startTime ? `${params?.startTime}T00:00:00` : "", - endTime: params?.endTime ? `${params?.endTime}T23:59:59` : "", + startTime: params?.staticDate ? `${params?.staticDate}T00:00:00` : "", + endTime: params?.staticDate ? `${params?.staticDate}T23:59:59` : "", // serverPartId: params?.serverPartId ? params?.serverPartId : undefined, extend: params?.inspectionType ? [{ key: "situation", diff --git a/src/pages/examine/recordSummary/index.tsx b/src/pages/examine/recordSummary/index.tsx new file mode 100644 index 0000000..ee820a8 --- /dev/null +++ b/src/pages/examine/recordSummary/index.tsx @@ -0,0 +1,602 @@ +import { ConnectState } from "@/models/global"; +import { ActionType, FormInstance, ProTable } from "@ant-design/pro-components"; +import { useRef, useState } from "react"; +import { connect } from "umi"; +import moment from "moment"; +import { Button, Drawer, Image, message, Popconfirm, Space } from "antd"; +import LeftSelectTree from "@/components/leftSelectTree/leftSelectTree"; +import { handleGetRecordTreeList } from "../record/service"; + +const recordSummary: React.FC<{ currentUser: any }> = (props) => { + const { currentUser } = props + + const actionRef = useRef(); + const formRef = useRef(); + + const drawerActionRef = useRef(); + const drawerFormRef = useRef(); + const recordDetailRef = useRef() + // 显示的附件数据 + const [showImgList, setShowImgList] = useState([]) + // 预览图片 + const [imagePreviewVisible, setImagePreviewVisible] = useState(false) + // 预览的索引 + const [previewIndex, setPreviewIndex] = useState(0) + // 当行数据 + const [currentRow, setCurrentRow] = useState() + // 显示详情抽屉 + const [showDetail, setShowDetail] = useState(false) + // 显示类型 1 巡查次数 2 正常 3 异常 4 待处理 5 处理中 6 已处理 + const [showType, setShowType] = useState(0) + // 外侧表格的搜索条件 + const [searchParams, setSearchParams] = useState() + + // 判断是否点了出现的是异常处理的抽屉 + const [showAbnormal, setShowAbnormal] = useState(false) + // 树相关的属性和方法 + const [selectedId, setSelectedId] = useState() + const [columnsStateMap, setColumnsStateMap] = useState({ + score: { show: false } + }) + const [collapsible, setCollapsible] = useState(false) + + const columns: any = [ + { + title: "统计日期", + dataIndex: "staticDate", + hideInTable: true, + valueType: "dateRange", + initialValue: [moment().startOf('M'), moment()], + search: { + transform: (value: any) => { + return { + startTime: moment(value[0]).startOf('m').format('YYYY-MM-DD'), + endTime: moment(value[1]).format('YYYY-MM-DD') + }; + }, + }, + fieldProps: { + picker: "day", + format: 'YYYY-MM-DD', + } + }, + { + title:
服务区名称
, + dataIndex: "serverPartName", + hideInSearch: true, + width: 200, + ellipsis: true, + render: (_, record) => { + return record?.type === 'district' || record?.type === 'servicePart' ? record?.name : + record?.template ? record?.template.title : "-" + } + }, + { + title:
巡查次数
, + dataIndex: "inspectionNumber", + align: 'center', + hideInSearch: true, + width: 150, + ellipsis: true, + render: (_, record) => { + return record?.template?.id && record?.inspectionNumber > 0 ? { + setCurrentRow(record) + setShowType(1) + setShowDetail(true) + }}> + {record?.inspectionNumber || '-'} + : {record?.inspectionNumber || '-'} + } + }, + { + title:
正常
, + dataIndex: "normalNumber", + align: 'center', + hideInSearch: true, + width: 150, + ellipsis: true, + render: (_, record) => { + return record?.template?.id && record?.normalNumber > 0 ? { + setCurrentRow(record) + setShowType(2) + setShowDetail(true) + }}> + {record?.normalNumber || '-'} + : {record?.normalNumber || '-'} + } + }, + { + title:
异常
, + dataIndex: "errorNumber", + align: 'center', + hideInSearch: true, + width: 150, + ellipsis: true, + render: (_, record) => { + return record?.template?.id && record?.errorNumber > 0 ? { + setCurrentRow(record) + setShowType(3) + setShowDetail(true) + }}> + {record?.errorNumber || '-'} + : {record?.errorNumber || '-'} + } + }, + { + title:
待处理
, + dataIndex: "pendingProcessNumber", + align: 'center', + hideInSearch: true, + width: 150, + ellipsis: true, + render: (_, record) => { + return record?.template?.id && record?.pendingProcessNumber > 0 ? { + setCurrentRow(record) + setShowType(4) + setShowDetail(true) + }}> + {record?.pendingProcessNumber || '-'} + : {record?.pendingProcessNumber || '-'} + } + }, + { + title:
处理中
, + dataIndex: "processingNumber", + align: 'center', + hideInSearch: true, + width: 150, + ellipsis: true, + render: (_, record) => { + return record?.template?.id && record?.processingNumber > 0 ? { + setCurrentRow(record) + setShowType(5) + setShowDetail(true) + }}> + {record?.processingNumber || '-'} + : {record?.processingNumber || '-'} + } + }, + { + title:
已处理
, + dataIndex: "processedNumber", + align: 'center', + hideInSearch: true, + width: 150, + ellipsis: true, + render: (_, record) => { + return record?.template?.id && record?.processedNumber > 0 ? { + setCurrentRow(record) + setShowType(6) + setShowDetail(true) + }}> + {record?.processedNumber || '-'} + : {record?.processedNumber || '-'} + } + } + ] + + const drawerColumns: any = [ + // { + // title: "巡查类型", + // dataIndex: "inspectionType", + // hideInTable: true, + // valueType: "select", + // valueEnum: { + // "1": '异常', + // "0": "正常" + // } + // }, + { + title:
服务区名称
, + dataIndex: "serverPartName", + hideInSearch: true, + width: 200, + ellipsis: true, + render: (_, record) => { + return record?.type === 'district' || record?.type === 'servicePart' ? record?.name : + record?.template ? record?.template.title : "-" + } + }, + { + title:
巡查类型
, + dataIndex: "placeName", + hideInSearch: true, + width: 100, + align: 'center', + ellipsis: true, + render: (_, record) => { + let res: any = record.extend ? JSON.parse(record.extend) : "-" + return {res.situation === 1 ? '异常' : res.situation === 0 ? '正常' : ''} + } + }, + { + title:
巡查内容
, + dataIndex: "uploadResult", + hideInSearch: true, + width: 200, + ellipsis: true, + render: (_, record) => { + let extendObj = record?.extend ? JSON.parse(record?.extend) : "" + return extendObj?.uploadResult ? extendObj?.uploadResult : "-" + } + }, + { + title:
巡查结果
, + dataIndex: "uploadResult", + hideInSearch: true, + width: 350, + ellipsis: true, + render: (_, record) => { + let str: string = '' + if (record?.questionResponses && record?.questionResponses.length > 0) { + record?.questionResponses.forEach((item: any, index: number) => { + let anwers: string = '' + if (item.choiceResponse && item.choiceResponse.length > 0) { + item.choiceResponse.forEach((subItem: string, subIndex: number) => { + anwers += `${subIndex > 0 ? ',' : ''}${subItem}` + }) + } + str += `${index > 0 ? ',' : ''}考核内容:${item.question.title},考核结果:${anwers}` + }) + } + return str || '' + } + }, + { + title:
巡查总分
, + dataIndex: "score", + hideInSearch: true, + valueType: 'digit', + width: 100, + align: 'center', + }, + { + title:
巡查时间
, + dataIndex: "createdAt", + hideInSearch: true, + width: 150, + ellipsis: true, + align: 'center', + render: (_, record) => { + return record?.createdAt ? moment(record?.createdAt).format('YYYY-MM-DD HH:mm:ss') : '-' + } + }, + { + title:
巡查人
, + dataIndex: "userName", + hideInSearch: true, + width: 100, + ellipsis: true, + align: 'center', + }, + { + title:
处理状态
, + dataIndex: "errorStatus", + hideInSearch: true, + width: 100, + ellipsis: true, + align: 'center', + render: (_, record) => { + let res: any = record.extend ? JSON.parse(record.extend) : "-" + return { + res.errorStatus === 0 + ? "待处理" + : res.errorStatus === 1 + ? "处理中" + : res.errorStatus === 2 + ? "已处理" + : "-" + } + } + }, + { + title:
现场图片
, + dataIndex: "placeName", + hideInSearch: true, + width: 150, + ellipsis: true, + align: 'center', + render: (_, record) => { + let extendObj = record?.extend ? JSON.parse(record?.extend) : "" + let imgList = extendObj.imgsList + return imgList && imgList.length > 0 ? + : "-" + } + } + ] + + + return ( +
+ + +
+ { + return `${record?.id}-${record?.code}` + }} + scroll={{ x: "100%", y: 'calc(100vh - 400px)' }} + headerTitle={考核记录汇总} + search={{ span: 6 }} + request={async (params) => { + if (!(selectedId && selectedId.length > 0)) { + return + } + + const req: any = { + serverPartIds: selectedId && selectedId.length > 0 ? selectedId : [], + startTime: params?.startTime ? `${params?.startTime}T00:00:00` : "", + endTime: params?.endTime ? `${params?.endTime}T23:59:59` : "", + // serverPartId: params?.serverPartId ? params?.serverPartId : undefined, + extend: params?.inspectionType ? [{ + key: "situation", + value: params?.inspectionType + }] : undefined + } + + setSearchParams(params) + + console.log('req', req); + const data = await handleGetRecordTreeList(req) + console.log('dat3a333', data); + + // 处理一下 根据第三层的实际巡查记录 汇总到第二层来 + if (data && data.length > 0) { + data.forEach((item: any) => { + if (item.children && item.children.length > 0) { + item.children.forEach((subItem: any) => { + if (subItem.children && subItem.children.length > 0) { + // 点位的id数据 肯定要求不重复的 + let templateIdList: number[] = [] + // 遍历完之后 要替换的 + let newChildren: any = [] + + subItem.children.forEach((thirdItem: any) => { + let extendObj: any = {} + if (thirdItem.extend) { + extendObj = JSON.parse(thirdItem.extend) + } + if (templateIdList.indexOf(thirdItem.template.id) === -1) { + templateIdList.push(thirdItem.template.id) + // 没有过的点位数据 就给他默认值 + newChildren.push({ + template: thirdItem.template, + inspectionNumber: 1, + normalNumber: extendObj?.situation === 0 ? 1 : 0, + errorNumber: extendObj?.situation === 1 ? 1 : 0, + pendingProcessNumber: extendObj?.errorStatus === 0 ? 1 : 0, + processingNumber: extendObj?.errorStatus === 1 ? 1 : 0, + processedNumber: extendObj?.errorStatus === 2 ? 1 : 0, + }) + } else { + // 如果已经有过了的点位 给他加当前的状态就好 + if (newChildren && newChildren.length > 0) { + newChildren.forEach((fourthItem: any) => { + if (fourthItem.template.id === thirdItem.template.id) { + fourthItem.inspectionNumber += 1 + if (extendObj?.situation === 0) { + fourthItem.normalNumber += 1 + } else if (extendObj?.situation === 1) { + fourthItem.errorNumber += 1 + } + + if (extendObj?.errorStatus === 0) { + fourthItem.pendingProcessNumber += 1 + } else if (extendObj?.errorStatus === 1) { + fourthItem.processingNumber += 1 + } else if (extendObj?.errorStatus === 2) { + fourthItem.processedNumber += 1 + } + } + }) + } + } + }) + subItem.children = newChildren + } + }) + } + }) + + + data.forEach((item: any) => { + let inspectionNumberItemSum: number = 0 + let normalNumberItemSum: number = 0 + let errorNumberItemSum: number = 0 + let pendingProcessNumberItemSum: number = 0 + let processingNumberItemSum: number = 0 + let processedNumberItemSum: number = 0 + if (item.children && item.children.length > 0) { + item.children.forEach((subItem: any) => { + let inspectionNumberSum: number = 0 + let normalNumberSum: number = 0 + let errorNumberSum: number = 0 + let pendingProcessNumberSum: number = 0 + let processingNumberSum: number = 0 + let processedNumberSum: number = 0 + if (subItem.children && subItem.children.length > 0) { + subItem.children.forEach((thirdItem: any) => { + inspectionNumberSum += thirdItem.inspectionNumber + normalNumberSum += thirdItem.normalNumber + errorNumberSum += thirdItem.errorNumber + pendingProcessNumberSum += thirdItem.pendingProcessNumber + processingNumberSum += thirdItem.processingNumber + processedNumberSum += thirdItem.processedNumber + }) + } + subItem.inspectionNumber = inspectionNumberSum + subItem.normalNumber = normalNumberSum + subItem.errorNumber = errorNumberSum + subItem.pendingProcessNumber = pendingProcessNumberSum + subItem.processingNumber = processingNumberSum + subItem.processedNumber = processedNumberSum + + inspectionNumberItemSum += subItem.inspectionNumber + normalNumberItemSum += subItem.normalNumber + errorNumberItemSum += subItem.errorNumber + pendingProcessNumberItemSum += subItem.pendingProcessNumber + processingNumberItemSum += subItem.processingNumber + processedNumberItemSum += subItem.processedNumber + }) + item.inspectionNumber = inspectionNumberItemSum + item.normalNumber = normalNumberItemSum + item.errorNumber = errorNumberItemSum + item.pendingProcessNumber = pendingProcessNumberItemSum + item.processingNumber = processingNumberItemSum + item.processedNumber = processedNumberItemSum + } + }) + } + console.log('resresres', data); + + + if (data && data.length > 0) { + return { data, success: true } + } + return { data: [], success: true } + }} + toolbar={{ + + }} + columnsState={{ + value: columnsStateMap, + onChange: setColumnsStateMap, + }} + + > + +
+ + { + showImgList && showImgList.length > 0 &&
+ + { + setImagePreviewVisible(vis) + }, + current: previewIndex + }}> + { + showImgList.map((n) => + + ) + } + + + +
+ } + + { + setCurrentRow(undefined) + setShowType(0) + setShowDetail(false) + setShowImgList([]) + setImagePreviewVisible(false) + }} + open={showDetail} + destroyOnClose + width={'60%'} + > + { + return `${record?.id}-${record?.code}` + }} + scroll={{ x: "100%", y: 'calc(100vh - 400px)' }} + headerTitle={考核记录管理} + search={{ span: 6 }} + request={async (params) => { + + console.log('searchParams', searchParams); + console.log('currentRow', currentRow); + if (!currentRow?.template?.serverPartId) { + return + } + + + // showType 1 巡查次数 2 正常 3 异常 4 待处理 5 处理中 6 已处理 + + + const req: any = { + serverPartIds: [currentRow?.template?.serverPartId], + startTime: searchParams?.startTime ? `${searchParams?.startTime}T00:00:00` : "", + endTime: searchParams?.endTime ? `${searchParams?.endTime}T23:59:59` : "", + extend: showType === 1 ? undefined : showType === 2 ? [ + { + key: "situation", + value: 0, + }, + ] : showType === 3 ? [ + { + key: "situation", + value: 1, + }, + ] : showType === 4 ? [ + { + key: "errorStatus", + value: 0, + } + ] : + showType === 5 ? [ + { + key: "errorStatus", + value: 1, + } + ] : + showType === 6 ? [ + { + key: "errorStatus", + value: 2, + } + ] : undefined + } + console.log('req', req); + const data = await handleGetRecordTreeList(req) + console.log('data', data); + + if (data && data.length > 0) { + return { data, success: true } + } + return { data: [], success: true } + }} + > + + +
+ ) +} + +export default connect(({ user }: ConnectState) => ({ + currentUser: user.data +}))(recordSummary); \ No newline at end of file diff --git a/src/pages/setting/menu/components/addMenu.tsx b/src/pages/setting/menu/components/addMenu.tsx index 2ba1c74..d29989b 100644 --- a/src/pages/setting/menu/components/addMenu.tsx +++ b/src/pages/setting/menu/components/addMenu.tsx @@ -1,26 +1,213 @@ -import { Modal } from "antd"; +import { ProForm, ProFormDigit, ProFormRadio, ProFormText, ProFormTextArea, ProFormTreeSelect } from "@ant-design/pro-components"; +import { Col, FormInstance, message, Modal, Row } from "antd"; +import { useRef, useState } from "react"; import { connect } from "umi"; +import { ConnectState } from "@/models/global"; +import { handleAddMenus, handleGetMenuList } from "../service"; type DetailProps = { currentUser?: any // 用户详情的公参 showDrawer: boolean // 显示悬浮框的判断 parentRow?: any // 点击的行 编辑的时候有用 + setShowDrawer: any // 改变悬浮框现实状态 + parentTableRef?: any // 父级表格实例 } -const AddBigType = ({ currentUser, showDrawer, parentRow }: DetailProps) => { +const AddMenu = ({ currentUser, showDrawer, parentRow, setShowDrawer, parentTableRef }: DetailProps) => { + console.log('showDrawer', showDrawer); + // 表单实例 + const formRef = useRef(); + // 当前的菜单类型 + const [currentMenuType, setCurrentMenuType] = useState(1) - { - }} - onCancel={() => { + return ( + { + formRef.current?.validateFields().then(async (res: any) => { + console.log('res', res); + const req: any = { + parentId: res.parentId || 1, + menuCode: res.menuCode, + menuName: res.menuName, + menuIcon: res.menuIcon || "", + menuPath: res.menuPath || "", + component: "", + permission: "", + menuType: res.menuType, + sortOrder: res.sortOrder, + hidden: res.hidden === 1 ? false : res.hidden === 2 ? true : '', + operator: currentUser.adminName + } + const data = await handleAddMenus(req) + console.log('datadsa', data); + if (data.code === 200) { + message.success(data.message) + if (parentTableRef) { + parentTableRef.current.reload() + } - }} - /> + formRef.current?.resetFields() + setShowDrawer(false) + } + }) + }} + onCancel={() => { + setShowDrawer(false) + }} + > + + + + + + + + + + + { + const req: any = { + + } + const data = await handleGetMenuList() + let res: any = [] + if (data && data.length > 0) { + res = data + } + return res + }} + fieldProps={{ + fieldNames: { + label: "menuName", + value: "id" + } + }} + /> + + + { + currentMenuType === 1 ? + + "} + fieldProps={ + { + addonAfter: 去复制 + } + } + + /> + : "" + } + + { + currentMenuType === 2 ? + + + : '' + } + + + + + + + + + + + { + console.log('e', e); + setCurrentMenuType(Number(e.target.value)) + } + }} + /> + + + {/* + + */} + + + + ); } export default connect(({ user }: ConnectState) => ({ currentUser: user.data -}))(AddBigType); \ No newline at end of file +}))(AddMenu); \ No newline at end of file diff --git a/src/pages/setting/menu/index.tsx b/src/pages/setting/menu/index.tsx index fdfaa20..e86da33 100644 --- a/src/pages/setting/menu/index.tsx +++ b/src/pages/setting/menu/index.tsx @@ -1,8 +1,11 @@ + import { ActionType, FormInstance, ProTable } from "@ant-design/pro-components"; -import { Button } from "antd"; +import { Button, Space } from "antd"; import { useRef, useState } from "react"; import { connect } from "umi"; import { handleGetMenuList } from "./service"; +import AddMenu from "./components/addMenu"; +import moment from "moment"; const menuIndex: React.FC<{ currentUser: any }> = (props) => { const { currentUser } = props @@ -11,48 +14,69 @@ const menuIndex: React.FC<{ currentUser: any }> = (props) => { const formRef = useRef(); // 打开新增的悬浮框 const [openAddModal, setOpenAddModal] = useState(false) - // 显示新增和编辑的悬浮框 - - + // 行数据 + const [currentRow, setCurrentRow] = useState() + // 表格默认隐藏字段 + const [columnsStateMap, setColumnsStateMap] = useState({ + menuCode: { show: false }, + createdAt: { show: false }, + }) // 表格组件 const columns: any = [ { - title: "菜单名称", + title:
菜单名称
, dataIndex: "menuName", width: 300, hideInSearch: true, }, { - title: "菜单图标", + title:
菜单编号
, + dataIndex: "menuCode", + width: 300, + hideInSearch: true, + }, + { + title:
菜单图标
, dataIndex: "menuIcon", width: 120, hideInSearch: true, }, { - title: "菜单索引", - dataIndex: "id", - width: 180, + title:
菜单索引
, + dataIndex: "sortOrder", + align: 'center', + width: 100, hideInSearch: true, }, { - title: '状态', + title:
状态
, dataIndex: 'hidden', hideInSearch: true, - width: 180, + width: 100, + render: (_, record) => { + return record?.hidden ? '隐藏' : '显示' + } }, { - title: '说明', - dataIndex: 'desc', + title:
创建时间
, + dataIndex: 'createdAt', width: 200, - hideInSearch: true + hideInSearch: true, + render: (_, record) => { + return record?.createdAt ? moment(record?.createdAt).format('YYYY-MM-DD HH:mm:ss') : "" + } }, { - title: '操作', + title:
操作
, dataIndex: 'option', valueType: 'option', hideInDescriptions: true, - width: 260, - render: (_, record) => { } + width: 100, + render: (_, record) => { + return + + + } } ] // 表格子集的columns @@ -97,6 +121,23 @@ const menuIndex: React.FC<{ currentUser: any }> = (props) => { } ] + // 模块列表 + const expandedRowRender = (data: any) => { + console.log('data', data); + + return (data && data.length > 0 ? + + : []) + } + return (
= (props) => { formRef={formRef} columns={columns} bordered - expandable={{ - expandRowByClick: true - }} rowKey={(record) => { return `${record?.id}` }} @@ -132,7 +170,18 @@ const menuIndex: React.FC<{ currentUser: any }> = (props) => { ] }} + expandable={{ + expandRowByClick: true, + // expandedRowRender + }} + columnsState={{ + value: columnsStateMap, + onChange: setColumnsStateMap, + }} /> + + +
) } diff --git a/src/pages/setting/menu/service.ts b/src/pages/setting/menu/service.ts index a687c7d..61383f2 100644 --- a/src/pages/setting/menu/service.ts +++ b/src/pages/setting/menu/service.ts @@ -1,10 +1,16 @@ import request from "@/utils/request" -// 拿到类别列表接口 +// 拿到菜单列表数据 export async function handleGetMenuList(params?: any) { const data = await request.get('/menus/getAll', { params }) if (data.code === 200) { return data.data } return [] +} + +// 新增菜单 +export async function handleAddMenus(params?: any) { + const data = await request.post('/menus', params) + return data } \ No newline at end of file