From 2209882466b8688022077e210d75662484d891c4 Mon Sep 17 00:00:00 2001 From: 32503 <325039231@qq.com> Date: Fri, 23 May 2025 16:06:00 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=AD=97=E5=85=B8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Dict/DictService.ts | 51 ++++ src/pages/Dict/DictionaryList.tsx | 386 ++++++++++++++++++++++++++++++ src/pages/Dict/DictionaryPage.tsx | 28 +++ 3 files changed, 465 insertions(+) create mode 100644 src/pages/Dict/DictService.ts create mode 100644 src/pages/Dict/DictionaryList.tsx create mode 100644 src/pages/Dict/DictionaryPage.tsx diff --git a/src/pages/Dict/DictService.ts b/src/pages/Dict/DictService.ts new file mode 100644 index 0000000..c40d842 --- /dev/null +++ b/src/pages/Dict/DictService.ts @@ -0,0 +1,51 @@ +import request from "@/utils/request"; + +// 字典项类型定义 +export interface DictionaryItem { + id: string; + code: string; + dicName: string; + dictTypeCode: string, + dictTypeName: string, + parentCode: string, + parentType: string, + orderFlag: number; + description: string; + createTime: string; + updateTime: string; +} + +// 获取字典列表 +// export const fetchDictionaries = async (): Promise => { +// const response = await axios.get('/api/sys-manager-ebtp-project/v1/dictProject/getDictList?parentCode=procurement_type&toParentCode=entrust'); +// return response.data.data; +// }; + +const prefix = '/api/sys-manager-ebtp-project/'; + +export async function fetchDictionaries(params: any) { + return request(prefix + 'v1/dictProject/selectDictList', { + params: params, + method: 'GET' + }); +} + +export async function createDictionary(params: any) { + return request(prefix + 'v1/dictProject', { + data: params, + method: 'POST' + }); +} + +export async function updateDictionary(params: any) { + return request(prefix + 'v1/dictProject', { + data: params, + method: 'POST' + }); +} + +export async function deleteDictionary(param: any) { + return request(prefix + 'v1/dictProject/delete/' + param, { + method: 'POST', + }); +} diff --git a/src/pages/Dict/DictionaryList.tsx b/src/pages/Dict/DictionaryList.tsx new file mode 100644 index 0000000..e430f7c --- /dev/null +++ b/src/pages/Dict/DictionaryList.tsx @@ -0,0 +1,386 @@ +import React, { useEffect, useState } from 'react'; +import { Table, Space, Button, Modal, Form, Input, Popconfirm, message, Tag } from 'antd'; +import { DeleteOutlined, EditOutlined, PlusOutlined, SearchOutlined, CheckCircleOutlined, CaretRightOutlined, CaretDownOutlined } from '@ant-design/icons'; +import {DictionaryItem, createDictionary, updateDictionary, deleteDictionary, fetchDictionaries} from './DictService'; + +interface DictionaryListProps {} + +const DictionaryList: React.FC = () => { + const [dataSource, setDataSource] = useState([]); + const [form] = Form.useForm(); + const [searchForm] = Form.useForm(); + const [isModalVisible, setIsModalVisible] = useState(false); + const [modalTitle, setModalTitle] = useState(''); + const [currentId, setCurrentId] = useState(null); + const [loading, setLoading] = useState(false); + const [searchParams, setSearchParams] = useState({ + parentCode: '', + parentType: '' + }); + // 选中的行ID + const [selectedRowId, setSelectedRowId] = useState(null); + // 选中的行数据 + const [selectedRow, setSelectedRow] = useState(null); + // 展开的行ID + const [expandedRowKeys, setExpandedRowKeys] = useState([]); + // 是否为新增子节点模式 + const [isChildAddMode, setIsChildAddMode] = useState(false); + + // const tableData: DictionaryItem[] = [ + // { + // "id": '1164', + // "code": "code", + // "dicName": "行政区划", + // "parentCode": '', + // "parentType": "", + // "orderFlag": 0, + // "description": '', + // "children": [ + // { + // "id": 1163, + // "code": "province", + // "dicName": "省份", + // "parentCode": "code", + // "parentType": "行政区划", + // "orderFlag": 1, + // "description": '' + // }, + // { + // "id": 1162, + // "code": "city", + // "dicName": "地市", + // "parentCode": "code", + // "parentType": "行政区域", + // "orderFlag": 3, + // "description": '' + // }, + // { + // "id": 1161, + // "code": "distict", + // "dicName": "区县", + // "parentCode": "code", + // "parentType": "行政区域", + // "orderFlag": 4, + // "description": "区县级" + // } + // ] + // } + // ]; + + const fetchData = async () => { + setLoading(true); + try { + const result = await fetchDictionaries(searchParams); // 传递搜索参数 + setDataSource(result.data); + } catch (error) { + message.error('获取字典列表失败'); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchData(); + }, [searchParams]); + + const handleAdd = () => { + form.resetFields(); + setModalTitle('新增字典'); + setIsModalVisible(true); + setCurrentId(null); + setIsChildAddMode(false); + }; + + const handleChildAdd = (record: DictionaryItem) =>{ + // 先清空表单 + form.resetFields(); + // 使用 setTimeout 确保表单重置完成后再设置值 + setTimeout(() => { + form.setFieldsValue({ + code: '', + dicName: '', + parentCode: record.code, + parentType: record.dicName, + orderFlag: '', + description: '', + }); + }, 0); + + setModalTitle(`新增${record.dicName}的子字典`); + setIsModalVisible(true); + setCurrentId(null); + setIsChildAddMode(true); + } + + const handleEdit = (record: DictionaryItem) => { + form.resetFields(); + + setTimeout(() => { + form.setFieldsValue({ + code: record.code, + dicName: record.dicName, + parentCode: record.parentCode, + parentType: record.parentType, + orderFlag: record.orderFlag, + description: record.description, + }); + }, 0); + + setModalTitle('编辑字典'); + setIsModalVisible(true); + setCurrentId(record.id); + setIsChildAddMode(false); + }; + + const handleDelete = async (id: string) => { + try { + await deleteDictionary(id); + message.success('删除成功'); + setSelectedRowId(null); + setSelectedRow(null); + fetchData(); + } catch (error) { + message.error('删除失败'); + } + }; + + const handleRowClick = (record: DictionaryItem) => { + if (selectedRowId === record.id) { + setSelectedRowId(null); + setSelectedRow(null); + } else { + setSelectedRowId(record.id); + setSelectedRow(record); + } + }; + + const handleExpand = (expanded: boolean, record: DictionaryItem) => { + if (expanded) { + setExpandedRowKeys([...expandedRowKeys, record.id]); + } else { + setExpandedRowKeys(expandedRowKeys.filter(key => key !== record.id)); + } + }; + + const handleSubmit = async () => { + try { + const values = await form.validateFields(); + if (currentId) { + values.id = currentId; + await updateDictionary(values); + message.success('更新成功'); + } else { + await createDictionary(values); + message.success('创建成功'); + } + setIsModalVisible(false); + fetchData(); + } catch (error) { + message.error(error.message || '操作失败'); + } + }; + + const handleSearch = (values: any) => { + setSearchParams({ + parentCode: values.parentCode || '', + parentType: values.parentType || '' + }); + }; + + const handleReset = () => { + searchForm.resetFields(); + setSearchParams({ + parentCode: '', + parentType: '' + }); + }; + + const expandIcon = ({ expanded, onExpand, record }: any) => { + if (record.children && record.children.length > 0) { + return ( + { + e.stopPropagation(); + onExpand(record); + }}> + {expanded ? : } + + ); + } + return null; + }; + + const columns = [ + { + title: '字典编号', + dataIndex: 'code', + key: 'code', + }, + { + title: '字典名称', + dataIndex: 'dicName', + key: 'dicName', + }, + { + title: '分组编码', + dataIndex: 'parentCode', + key: 'parentCode', + }, + { + title: '分组名称', + dataIndex: 'parentType', + key: 'parentType', + }, + { + title: '排序', + dataIndex: 'orderFlag', + key: 'orderFlag', + }, + { + title: '描述', + dataIndex: 'description', + key: 'description', + }, + { + title: '操作', + key: 'action', + render: (_: any, record: DictionaryItem) => ( + + + + handleDelete(record.id)} + okText="确定" + cancelText="取消" + > + + + + ), + }, + ]; + + return ( +
+
+ + + + + + + + + + + + +
+ +
+ + + + {selectedRow && ( + + 已选择: {selectedRow.dicName} + + )} +
+ + ({ + onClick: () => handleRowClick(record), + style: { + cursor: 'pointer', + backgroundColor: selectedRowId === record.id ? '#e6f7ff' : 'transparent', + }, + })} + expandable={{ + expandedRowKeys, + onExpand: handleExpand, + expandIcon, + }} + /> + + setIsModalVisible(false)} + onOk={handleSubmit} + okText="保存" + cancelText="取消" + > +
+ + {/* 使用 readOnly 替代 disabled,并添加灰色背景 */} + + + + + + + + + + + + + + + + + + +
+ + ); +}; + +export default DictionaryList; diff --git a/src/pages/Dict/DictionaryPage.tsx b/src/pages/Dict/DictionaryPage.tsx new file mode 100644 index 0000000..5fba497 --- /dev/null +++ b/src/pages/Dict/DictionaryPage.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Layout, Breadcrumb } from 'antd'; +import DictionaryList from './DictionaryList'; + +const { Content } = Layout; + +const DictionaryPage: React.FC = () => { + return ( + + + 系统管理 + 字典管理 + + + + + + ); +}; + +export default DictionaryPage; From a3c44b886b0382f849ac9ddba1c09d1197089631 Mon Sep 17 00:00:00 2001 From: houjishuang <46269784@qq.com> Date: Tue, 27 May 2025 17:12:59 +0800 Subject: [PATCH 2/3] dailijigou --- config/proxy.ts | 5 +++++ config/router.config.ts | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/config/proxy.ts b/config/proxy.ts index 16f18a0..45c60ae 100644 --- a/config/proxy.ts +++ b/config/proxy.ts @@ -38,6 +38,11 @@ export default { changeOrigin: true, pathRewrite: { '/api/sys-manager-ebtp-project': '' }, }, + '/api/biz-service-ebtp-agency': { + target: 'http://localhost:18099', + changeOrigin: true, + pathRewrite: { '/api/biz-service-ebtp-agency': '' }, + }, // '/api/wfap/v1/audit/bill/find/by/procid': { // target: 'http://10.242.31.158:8891/',//审批单 uat环境自动审批,暂时用不到 // changeOrigin: true, diff --git a/config/router.config.ts b/config/router.config.ts index 2d88327..3cfde99 100644 --- a/config/router.config.ts +++ b/config/router.config.ts @@ -105,7 +105,10 @@ export default [ path: '/PublicPlatform', component: './Bid/BiddingAnnouncement/components/PublicPlatform', }, - + { + path: '/ToAgencyManager', + component: './Agency/AgencyManager', + }, //==============================================================引入的业务路由 ...approvalForm,//审批单 ...juryRoom,//评标室内所有路由 From 7f28a0c355afe5136a9f7cc3708c3249c02ab47e Mon Sep 17 00:00:00 2001 From: houjishuang <46269784@qq.com> Date: Tue, 27 May 2025 17:14:29 +0800 Subject: [PATCH 3/3] dailiku --- .../components/EntrustedProject.tsx | 0 .../components/SelectProvider.tsx | 133 +++++++++ src/pages/Agency/AgencyManager/index.tsx | 272 ++++++++++++++++++ src/pages/Agency/AgencyManager/service.ts | 37 +++ 4 files changed, 442 insertions(+) create mode 100644 src/pages/Agency/AgencyManager/components/EntrustedProject.tsx create mode 100644 src/pages/Agency/AgencyManager/components/SelectProvider.tsx create mode 100644 src/pages/Agency/AgencyManager/index.tsx create mode 100644 src/pages/Agency/AgencyManager/service.ts diff --git a/src/pages/Agency/AgencyManager/components/EntrustedProject.tsx b/src/pages/Agency/AgencyManager/components/EntrustedProject.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Agency/AgencyManager/components/SelectProvider.tsx b/src/pages/Agency/AgencyManager/components/SelectProvider.tsx new file mode 100644 index 0000000..bf61904 --- /dev/null +++ b/src/pages/Agency/AgencyManager/components/SelectProvider.tsx @@ -0,0 +1,133 @@ +import React, { useState, useRef } from 'react'; +import { message, Modal, Input, Form, PageHeader, Button, Spin, Select, Tree } from 'antd'; +import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table'; +import { getPage, getDataById, deleteAgency, addAgency, updateAgency,disableAgency } from './service'; +// import './styles.less'; +import { getDicData } from '@/utils/session'; +import TextArea from 'antd/lib/input/TextArea'; + +const selectProvider: React.FC<{}> = () => { + //获取字典 + const getDict: any = getDicData(); + const [form] = Form.useForm(); + const [title, setTitle] = useState(''); + const [open, setOpen] = useState(false); + + const [checkedKeys, setCheckedKeys] = useState([]); + const [currentRoleId, setCurrentRoleId] = useState(null); + const dictData = JSON.parse(getDict); + const actionRef = useRef(); + const [spin, spinSet] = useState(false); + //查询分页数据 + const [pageData, pageDataSet] = useState({ + pageNo: 1, + pageSize: 10 + }); + const layout = { + labelCol: { span: 6 }, + wrapperCol: { span: 13 }, + }; + interface DictType { + value: string; + label: string; + } + const sys_normal_scope: DictType[] = [ + { value: 'EBTP', label: '招标采购中心' }, + ]; + + //委托列表 + const columns: ProColumns[] = [ + { title: '序号', valueType: 'index', width: 50, search: false, }, + { title: '供应商名称', dataIndex: 'providerName', },//, ellipsis: true + { title: '供应商分类', dataIndex: 'roleName', + valueEnum: { 'EBTP': { text: '招标采购中心', status: 'EBTP' }, }, + + },//, ellipsis: true//, ellipsis: true + { title: '品类', dataIndex: 'roleName', }, + { title: '准入时间', dataIndex: 'roleName', },//, ellipsis: true + { title: '准入人', dataIndex: 'roleName', search: false, hideInTable:true,},//, ellipsis: true + { title: '失效时间', dataIndex: 'roleName', search: false,},//, ellipsis: true + { title: '状态', dataIndex: 'status', },//, ellipsis: true + { title: 'id', dataIndex: 'id', search: false,hideInTable:true,},//, ellipsis: true + { title: 'providerId', dataIndex: 'providerId', search: false,hideInTable:true,}, + // { title: '创建时间', dataIndex: 'createDate', width: '10%', valueType: 'dateTime', search: false }, + + { + title: '操作', width: '9%', + valueType: 'option', + render: (_, record) => [ + + + + ] + }, + ]; + // 删除操作 + const handleSelect = (id: string) => { + Modal.confirm({ + title: '确认选择该供应商?', + onOk: async () => { + await deleteAgency(id).then((r: any) => { + if (r?.code == 200) { + message.success('删除成功'); + } else { + message.error('删除失败'); + } + }) + .finally(() => actionRef.current?.reload()); + }, + }); + }; + + + const [menuOptions, setMenuOptions] = useState([]); + + + return ( + + +
+ + actionRef={actionRef}//action触发后更新表格 + columns={columns}//表格 + options={false} + bordered={false} + className='tableSearch' + size='small' + search={{ labelWidth: 'auto', span: 6 }} + request={(params) => + getPage({ + ...params, + basePageRequest: { pageNo: pageData.pageNo, pageSize: pageData.pageSize }, + }).then((res) => { + const result = { + data: res.data.records, + total: res.data.total, + success: res.success, + pageSize: res.data.size, + current: res.data.current + } + return result; + }) + } + toolBarRender={() => [ + , + ] + } + pagination={{ + defaultPageSize: 10, + showSizeChanger: false, + onChange: (page, pageSize) => pageDataSet({ pageNo: page, pageSize: pageSize }), + onShowSizeChange: (current, size) => pageDataSet({ pageNo: current, pageSize: size }), + }} + onReset={() => { pageDataSet({ pageNo: 1, pageSize: 10 }) }} + /> + +
+ {/* 查看 */} +
+ ) +}; +export default selectProvider; \ No newline at end of file diff --git a/src/pages/Agency/AgencyManager/index.tsx b/src/pages/Agency/AgencyManager/index.tsx new file mode 100644 index 0000000..b693adf --- /dev/null +++ b/src/pages/Agency/AgencyManager/index.tsx @@ -0,0 +1,272 @@ +import React, { useState, useRef } from 'react'; +import { message, Modal, Input, Form, PageHeader, Button, Spin, Select, Tree } from 'antd'; +import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table'; +import { getPage, getDataById, deleteAgency, addAgency, updateAgency,disableAgency } from './service'; +// import './styles.less'; +import { getDicData } from '@/utils/session'; +import TextArea from 'antd/lib/input/TextArea'; + +const agency: React.FC<{}> = () => { + //获取字典 + const getDict: any = getDicData(); + const [form] = Form.useForm(); + const [title, setTitle] = useState(''); + const [open, setOpen] = useState(false); + + const [checkedKeys, setCheckedKeys] = useState([]); + const [currentRoleId, setCurrentRoleId] = useState(null); + const dictData = JSON.parse(getDict); + const actionRef = useRef(); + const [spin, spinSet] = useState(false); + //查询分页数据 + const [pageData, pageDataSet] = useState({ + pageNo: 1, + pageSize: 10 + }); + const layout = { + labelCol: { span: 6 }, + wrapperCol: { span: 13 }, + }; + interface DictType { + value: string; + label: string; + } + const sys_normal_scope: DictType[] = [ + { value: 'EBTP', label: '招标采购中心' }, + ]; + + //委托列表 + const columns: ProColumns[] = [ + { title: '序号', valueType: 'index', width: 50, search: false, }, + { title: '代理机构名称', dataIndex: 'providerName', },//, ellipsis: true + { title: '申请人', dataIndex: 'roleName', search: false, },//, ellipsis: true//, ellipsis: true + { title: '准入时间', dataIndex: 'roleName', search: false, },//, ellipsis: true + { title: '准入人', dataIndex: 'roleName', search: false, },//, ellipsis: true + { title: '失效时间', dataIndex: 'roleName', search: false,},//, ellipsis: true + { title: '状态', dataIndex: 'status', valueType: 'select', + valueEnum: { '1': { text: '有效', status: '1' },'0': { text: '无效', status: '0' }, }, + },//, ellipsis: true + { title: 'id', dataIndex: 'id', search: false,hideInTable:true,},//, ellipsis: true + // { title: '创建时间', dataIndex: 'createDate', width: '10%', valueType: 'dateTime', search: false }, + { title: 'providerId', dataIndex: 'providerId', search: false,hideInTable:true,}, + { + title: '操作', width: '9%', + valueType: 'option', + render: (_, record) => [ + , + , + , + + + ] + }, + ]; + // 删除操作 + const handleDelete = (id: string) => { + Modal.confirm({ + title: '确认删除该角色?', + onOk: async () => { + await deleteAgency(id).then((r: any) => { + if (r?.code == 200) { + message.success('删除成功'); + } else { + message.error('删除失败'); + } + }) + .finally(() => actionRef.current?.reload()); + }, + }); + }; + const handleAdd = async () => { + form.resetFields(); + // const menus = await menuTreeselect(); + // setMenuOptions(menus.data || []); + // setMenuOptions(menu || []); + + // 使用时转换 + setMenuOptions(formatMenuOptions(menu) || []); + setOpen(true); + setTitle('添加角色'); + }; + + const [menuOptions, setMenuOptions] = useState([]); + let menu = [{ + "id": '1', "parentId": '0', "label": "系统管理", "weight": 1, + "children": [{ + "id": '101', "parentId": '1', "label": "角色管理", "weight": 2, + "children": [{ "id": '1008', "parentId": '101', "label": "角色查询", "weight": 1 }, + { "id": '1009', "parentId": '101', "label": "角色新增", "weight": 2 }, + { "id": '1010', "parentId": '101', "label": "角色修改", "weight": 3 }, + { "id": '1011', "parentId": '101', "label": "角色删除", "weight": 4 }, + { "id": '1012', "parentId": '101', "label": "角色导出", "weight": 5 }] + }, + { + "id": '105', "parentId": '1', "label": "字典管理", "weight": 6, + "children": [{ "id": '1026', "parentId": '105', "label": "字典查询", "weight": 1 }, + { "id": '1027', "parentId": '105', "label": "字典新增", "weight": 2 }, + { "id": '1028', "parentId": '105', "label": "字典修改", "weight": 3 }, + { "id": '1029', "parentId": '105', "label": "字典删除", "weight": 4 }, + { "id": '1030', "parentId": '105', "label": "字典导出", "weight": 5 }] + }] + }, + { "id": '4', "parentId": '0', "label": "PLUS官网", "weight": 4 }, + { + "id": "1494925781048545281", "parentId": '0', "label": "个人待办", "weight": 18, + "children": [{ "id": "1494926258733633538", "parentId": "1494925781048545281", "label": "待办任务", "weight": 1 }, + { "id": "1494926586677874690", "parentId": "1494925781048545281", "label": "已办任务", "weight": 2 }] + }]; + const formatMenuOptions = (data: any[]) => { + return data.map(item => ({ + title: item.label, + key: item.id, + children: item.children ? formatMenuOptions(item.children) : undefined, + })); + }; + + const handleUpdate = async (record: any) => { + form.resetFields(); + const role = await getDataById(record.roleId); + // const menus = await roleMenuTreeselect(record.roleId); + // setMenuOptions(menus.data.menus || []); + setMenuOptions(formatMenuOptions(menu) || []); + setCheckedKeys(role.data.menuIds || []); + form.setFieldsValue({ + ...role.data, + menuIds: role.data.menuIds || [], + }); + // form.setFieldsValue(role.data); + setCurrentRoleId(record.roleId); + setOpen(true); + setTitle('修改角色'); + }; + + const closeModal = async () => { + actionRef.current?.reload(); + form.resetFields(); + setCheckedKeys([]); + setOpen(false); + }; + + const handleSubmit = async () => { + try { + const values = await form.validateFields(); + if (values.roleId) { + await updateAgency(values).then((r: any) => { + if (r?.code == 200) { + message.success('修改成功'); + } else { + message.error('修改失败'); + } + }); + } else { + await addAgency(values).then((r: any) => { + console.log("r?.code", r?.code) + if (r?.code == 200) { + message.success('新增成功'); + } else { + message.error('新增失败'); + } + }); + } + closeModal(); + } catch (error) { + console.error(error); + } + }; + const checkSupModal = ( + setOpen(false)}>关闭} + onOk={handleSubmit} + onCancel={() => closeModal()} + > +
+ + + + + + + + + + + +