From 9925f330bd89fb37c59e6a66d227600a0b277da2 Mon Sep 17 00:00:00 2001 From: ylj20011123 Date: Mon, 9 Feb 2026 14:33:36 +0800 Subject: [PATCH] update --- config/router.ts | 5 + src/models/user.ts | 7 + .../components/ChosePlayers.tsx | 205 +++ .../components/style.less | 7 + src/pages/BusinessConfiguration/index.tsx | 489 +++++++ .../ComplaintForwardingProcess/index.tsx | 1185 ++++++++++++++--- .../resizeImageHalf.ts | 96 ++ src/pages/ComplaintForwardingProcess/test.tsx | 304 +++++ src/pages/authority.ts | 1 + src/pages/serverpartAssets/service.ts | 149 +++ 10 files changed, 2258 insertions(+), 190 deletions(-) create mode 100644 src/pages/BusinessConfiguration/components/ChosePlayers.tsx create mode 100644 src/pages/BusinessConfiguration/components/style.less create mode 100644 src/pages/BusinessConfiguration/index.tsx create mode 100644 src/pages/ComplaintForwardingProcess/resizeImageHalf.ts create mode 100644 src/pages/ComplaintForwardingProcess/test.tsx diff --git a/config/router.ts b/config/router.ts index 2d6c8c6..252e620 100644 --- a/config/router.ts +++ b/config/router.ts @@ -87,6 +87,11 @@ export default [ path: '/ComplaintForwardingProcess/index', name: '投诉转发流程', component: "@/pages/ComplaintForwardingProcess/index", + }, + { + path: '/BusinessConfiguration/index', + name: '业务配置', + component: "@/pages/BusinessConfiguration/index", } ] diff --git a/src/models/user.ts b/src/models/user.ts index 948ba3f..390e335 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -317,6 +317,12 @@ const UserModel: UserModelType = { name: '投诉转发流程', component: "@/pages/ComplaintForwardingProcess/index", }, + { + path: '/BusinessConfiguration/index', + redirect: '', + name: '业务配置', + component: "@/pages/BusinessConfiguration/index", + }, ] } @@ -402,6 +408,7 @@ const UserModel: UserModelType = { "/realEstate/index", "/ComplaintApproval/index", "/ComplaintForwardingProcess/index", + "/BusinessConfiguration/index", // '/examine/index', // '/examine/modal', // '/examine/question', diff --git a/src/pages/BusinessConfiguration/components/ChosePlayers.tsx b/src/pages/BusinessConfiguration/components/ChosePlayers.tsx new file mode 100644 index 0000000..8fb6d3d --- /dev/null +++ b/src/pages/BusinessConfiguration/components/ChosePlayers.tsx @@ -0,0 +1,205 @@ +import { ActionType, ProCard, ProTable } from "@ant-design/pro-components" +import { useEffect, useImperativeHandle, useRef, useState } from "react" +import { getOnwer, getUserTypeTree, handleGetUserList } from "@/pages/serverpartAssets/service"; +import { Tree } from "antd"; +import './style.less' + +const ChosePlayers = ({ actionRef, onRef, defaultPerson }: { actionRef?: any, onRef: any, defaultPerson: any }) => { + const tableRef = useRef(); + // 是否显示账号分类查询树 + // 左侧业务类型数据 + const [treeView, setTreeView] = useState() + // 选择的部门 + const [selectedId, setSelectedId] = useState() + // 选择的行 + const [selectedRowKeys, setSelectedRowKeys] = useState() + // 选择的行的详情 + const [selectedRowDetail, setSelectedRowDetial] = useState() + + // 表格内容 + const columns: any = [ + { + title: '查询账号', + dataIndex: 'searchKey', + hideInDescriptions: true, + hideInTable: true, + fieldProps: { + placeholder: '请输入账号/用户名称/业主单位/手机号/经营单位' + } + }, + { + title: '账号部门', + dataIndex: 'USERTYPE_ID', + hideInSearch: true, + hideInDescriptions: true, + valueType: "treeSelect", + fieldProps: { + options: treeView, + }, + }, + { + title: '账号', + dataIndex: 'USER_PASSPORT', + sorter: (a, b) => { + return (a.USER_PASSPORT || '').localeCompare((b.USER_PASSPORT || '')) + }, + hideInSearch: true, + }, + { + title: '用户名称', + dataIndex: 'USER_NAME', + sorter: (a, b) => { + return (a.USER_NAME || '').localeCompare((b.USER_NAME || '')) + }, + hideInDescriptions: true, + hideInSearch: true, + }, + { + title: '手机号', + dataIndex: 'USER_MOBILEPHONE', + hideInSearch: true + }, + { + title: '状态', + dataIndex: 'USER_STATUS', + hideInSearch: true, + filters: true, + onFilter: true, + valueType: 'select', + initialValue: 1, + valueEnum: { + all: { text: '全部', status: 'Default' }, + 0: { text: '无效', status: 'Default' }, + 1: { text: '有效', status: 'Processing' }, + }, + + }, + { + title: '业主单位', + dataIndex: 'PROVINCE_UNIT', + hideInSearch: true, + ellipsis: true, + sorter: (a, b) => { + return (a.PROVINCE_UNIT || '').localeCompare((b.PROVINCE_UNIT || '')) + }, + valueType: "select", + request: async () => { + let data = await getOnwer({ ProvinceCode: "530000", DataType: 1 }) + if (data && data.length > 0) { + data.forEach((item: any) => { + item.value = item.value.toString() + }) + } + return data + } + }, + { + title: '备注', + dataIndex: 'USER_DESC', + hideInSearch: true, + render: (_, record) => { + return record?.USER_DESC + } + } + ] + + useEffect(() => { + getUserTypeTree({ UserTypePattern: 1000, ShowStatus: true }).then((res: any) => { + console.log('fdsklfja', res); + setTreeView(res[0].children) + }) + }, []) + + useEffect(() => { + console.log('defaultPersondefaultPerson', defaultPerson); + + if (defaultPerson && defaultPerson.length > 0) { + setSelectedRowDetial(defaultPerson) + let keyList: any = [] + defaultPerson.forEach((item: any) => { + keyList.push(item.USER_ID) + }) + setSelectedRowKeys(keyList) + } + }, [defaultPerson]) + + useImperativeHandle(onRef, () => ({ + selectedRowKeys, + selectedRowDetail + })) + + return ( +
+ + {treeView && treeView.length > 0 ? { + const selectedIds = info.checkedNodes.filter((n: any) => n?.type === 1) + let res: any = selectedIds.map(n => n?.value)?.toString() || '' + console.log('reqs', res); + setSelectedId(res) + }} + /> : ''} + +
+ { + if (!selectedId) return [] + const req: any = { + SearchParameter: { + UserTypeIds: selectedId, + USER_STATUS: 1 + }, + PageIndex: 1, + PageSize: 999999, + keyWord: params.searchKey ? { key: "USER_PASSPORT,USER_NAME,USER_MOBILEPHONE,PROVINCE_UNIT,BUSINESSMAN_NAME", value: params.searchKey } : null, + } + const data = await handleGetUserList(req) + console.log('dsajkdjas;da', data); + if (data && data.length > 0) { + return { data, success: true } + } + return { data: [], success: true } + }} + columns={columns} + rowSelection={{ + selectedRowKeys: selectedRowKeys, + onChange: (e: any, detail: any) => { + setSelectedRowDetial(detail) + setSelectedRowKeys(e) + }, + preserveSelectedRowKeys: true, + }} + /> +
+
+ ) +} +export default ChosePlayers; \ No newline at end of file diff --git a/src/pages/BusinessConfiguration/components/style.less b/src/pages/BusinessConfiguration/components/style.less new file mode 100644 index 0000000..4356fca --- /dev/null +++ b/src/pages/BusinessConfiguration/components/style.less @@ -0,0 +1,7 @@ +.ChosePlayersBox { + .ant-pro-card { + .ant-pro-card-body { + overflow-y: scroll; + } + } +} \ No newline at end of file diff --git a/src/pages/BusinessConfiguration/index.tsx b/src/pages/BusinessConfiguration/index.tsx new file mode 100644 index 0000000..e476c53 --- /dev/null +++ b/src/pages/BusinessConfiguration/index.tsx @@ -0,0 +1,489 @@ +import { FileSearchOutlined, MenuFoldOutlined, PlusOutlined } from "@ant-design/icons" +import { ActionType, ProCard, ProForm, ProFormDigit, ProFormSelect, ProFormText, ProFormTreeSelect, ProTable } from "@ant-design/pro-components" +import { Button, FormInstance, message, Modal, Popconfirm, Space, Tree } from "antd" +import { useEffect, useRef, useState } from "react" +import { getFieldEnumTree, handleDeleteAPPROVALROUTE, handleGetAPPROVALROUTEList, handleGetUserList, handleSynchroAPPROVALROUTE } from "../serverpartAssets/service" +import moment from "moment" +import ChosePlayers from "./components/ChosePlayers" + +const BusinessConfiguration = () => { + const actionRef = useRef(); + const formRef = useRef(); + const modalFormRef = useRef(); + const chosePlayerRef = useRef(); + + // 折叠左侧业务类型属性选择框 + const [collapsible, setCollapsible] = useState(false) + // 左侧业务类型数据 + const [treeView, setTreeView] = useState() + // 左侧业务类型数据对象 + const [serviceTypeObj, setServiceTypeObj] = useState() + // 树相关的属性和方法 + const [selectedId, setSelectedId] = useState() + // 存储当前数据的搜索条件 + const [searchParams, setSearchParams] = useState() + // 显示新增环节的悬浮框 + const [modalVisible, setModalVisible] = useState(false) + // 选中的当前行数据 + const [currentRow, setCurrentRow] = useState() + // 悬浮框的确认按钮的loading + const [confirmLoading, setConfirmLoading] = useState(false) + // 参与人列表 + const [playerList, setPlayerList] = useState() + // 当前已经存在了的参与人 + const [defaultPerson, setDefaultPerson] = useState() + // 显示参与人的悬浮框 + const [showChosePlayer, setShowChosePlayer] = useState(false) + + const columns: any = [ + { + title: '环节名称', + width: 150, + dataIndex: 'APPROVALROUTE_NAME', + align: 'center', + hideInSearch: true + }, + { + title: '业务状态', + width: 120, + dataIndex: 'APPROVALROUTE_STATE', + align: 'center', + sorter: (a, b) => a.APPROVALROUTE_STATE - b.APPROVALROUTE_STATE, + defaultSortOrder: 'ascend', + }, + { + title: '业务类型', + width: 120, + dataIndex: 'OPERATION_TYPE', + valueType: 'select', + align: 'center', + hideInSearch: true, + valueEnum: serviceTypeObj + }, + { + title: '下一业务状态', + width: 120, + dataIndex: 'NEXT_STATE', + align: 'center', + // valueType: 'select', + hideInSearch: true, + // valueEnum:{ + // 2000:'商户确认审核', + // 2010:'服务区经理审核', + // 2020:'片区中心审核', + // 2030:'经发部审核', + // 2040:'财务部审核', + // } + }, + { + title: '参与人', + dataIndex: 'APPROVALSTAFF_NAME', + align: 'center', + width: 200, + ellipsis: true, + hideInSearch: true, + }, + { + title: '生成时间', + width: 150, + dataIndex: 'RECORD_DATE', + align: 'center', + hideInSearch: true, + render: (_, record) => { + return record?.RECORD_DATE ? moment(record?.RECORD_DATE).format('YYYY-MM-DD') : '' + } + }, + { + title: '业主单位', + width: 120, + align: 'center', + dataIndex: 'PROVINCE_CODE', + hideInSearch: true, + }, + { + dataIndex: 'option', + title: '操作', + width: 120, + valueType: 'option', + align: 'center', + fixed: 'right', + hideInSearch: true, + render: (_, record) => { + return ( + + { + setCurrentRow(record) + setModalVisible(true) + }}>编辑 + { + const req: any = { + APPROVALROUTEId: record?.APPROVALROUTE_ID + } + const data = await handleDeleteAPPROVALROUTE(req) + if (data.Result_Code === 100) { + message.success('删除成功') + actionRef.current?.reload() + } else { + message.error(data.Result_Desc) + } + }} + > + 删除 + + + ) + } + } + + ] + + // 解构左侧类型 + const extractValueLabel = (list: any) => { + const result: any = {}; + + function traverse(nodes: any) { + if (!Array.isArray(nodes)) return; + + nodes.forEach(item => { + if (item.value !== undefined && item.label !== undefined) { + result[item.value] = item.label; + } + if (Array.isArray(item.children)) { + traverse(item.children); + } + }); + } + + traverse(list); + return result; + } + + useEffect(() => { + getFieldEnumTree({ FieldExplainField: 'PROCESS_TYPE', sessionName: 'PROCESS_TYPE' }).then((res: any) => { + console.log('resresresres', res); + let obj = extractValueLabel(res) + setServiceTypeObj(obj) + setTreeView(res) + }) + }, []); + + return ( +
+
+ { + setCollapsible(!collapsible) + }} />} + colSpan={!collapsible ? "300px" : "60px"} + title={!collapsible ? "请选择业务类型" : ""} + headerBordered + collapsed={collapsible} + > + {treeView && treeView.length > 0 ? { + const selectedIds = info.checkedNodes.filter(n => n?.type === 2) + setSelectedId(selectedIds.map(n => n?.value)?.toString() || '') + }} + // switcherIcon={} + /> : ''} + +
+ +
+ { + if (!selectedId) { + return + } + const req: any = { + SearchParameter: { + PROVINCE_CODE: '530000', + OPERATION_TYPES: selectedId || '', + APPROVALROUTE_VALID: 1 + }, + + PageIndex: 1, + PageSize: 999999 + } + setSearchParams(params) + const data = await handleGetAPPROVALROUTEList(req) + console.log('fdsjfhsdjkfhsa', data); + + if (data && data.length > 0) { + return { data, success: true } + } + return { data: [], success: true } + }} + toolbar={{ + actions: [ + + ] + }} + /> +
+ + + { + setModalVisible(false) + modalFormRef.current?.validateFields().then((res: any) => { + modalFormRef.current?.submit() + }) + }} + onCancel={(e) => { + setModalVisible(false) + modalFormRef.current?.resetFields(); + setDefaultPerson([]) + setPlayerList([]) + setCurrentRow(undefined) + }} + > + { + console.log('currentRowcurrentRow', currentRow); + + if (currentRow) { + if (currentRow?.APPROVALSTAFF_ID) { + const req: any = { + SearchParameter: { + USER_IDS: currentRow?.APPROVALSTAFF_ID + }, + PageIndex: 1, + PageSize: 999999 + } + const data = await handleGetUserList(req) + console.log('datadatadata', data); + setDefaultPerson(data) + + if (data && data.length > 0) { + const list: any = [] + data.forEach((item: any) => { + list.push({ label: item.USER_NAME, value: item.USER_ID.toString() }) + }) + setPlayerList(list) + } + } + + return { + ...currentRow, + APPROVALSTAFF_ID: currentRow?.APPROVALSTAFF_ID ? currentRow?.APPROVALSTAFF_ID.split(',') : null + } + } else { + return {} + } + }} + onFinish={async (res) => { + console.log('readas', res); + let req: any = {} + if (currentRow) { + req = { + APPROVALROUTE_ID: currentRow?.APPROVALROUTE_ID, + APPROVALROUTE_NAME: res?.APPROVALROUTE_NAME || '', + APPROVALROUTE_STATE: res?.APPROVALROUTE_STATE || '', + OPERATION_TYPE: res?.OPERATION_TYPE || '', + APPROVALSTAFF_ID: res?.APPROVALSTAFF_ID ? res?.APPROVALSTAFF_ID.toString() : null, + APPROVALROUTE_VALID: 1, + PROVINCE_CODE: '530000', + NEXT_STATE: res?.NEXT_STATE + } + } else { + req = { + APPROVALROUTE_NAME: res?.APPROVALROUTE_NAME || '', + APPROVALROUTE_STATE: res?.APPROVALROUTE_STATE || '', + OPERATION_TYPE: res?.OPERATION_TYPE || '', + APPROVALSTAFF_ID: res?.APPROVALSTAFF_ID ? res?.APPROVALSTAFF_ID.toString() : null, + APPROVALROUTE_VALID: 1, + PROVINCE_CODE: '530000', + NEXT_STATE: res?.NEXT_STATE + } + } + setConfirmLoading(true) + const data = await handleSynchroAPPROVALROUTE(req) + setConfirmLoading(false) + if (data.Result_Code === 100) { + message.success('新增成功') + modalFormRef.current?.resetFields(); + setCurrentRow(undefined) + actionRef.current?.reload() + setModalVisible(false) + setDefaultPerson([]) + setPlayerList([]) + return true + } + message.error(data.Result_Desc) + }} + > + { + let list: any = JSON.parse(JSON.stringify(treeView)) + if (list && list.length > 0) { + list.forEach((item: any) => { + item.disabled = true + }) + } + return list + }} + fieldProps={{ + treeDefaultExpandAll: true + }} + rules={[ + { + required: true, + message: '请选择业务类型', + }, + ]} + /> + + + + + + + + } + onClick={() => { + const res = modalFormRef.current?.getFieldValue('APPROVALSTAFF_ID') + console.log('resres', res); + + // if ([res] && [res].length > 0) { + // const list: any = [] + // [res].forEach((item: any) => { + // list.push(Number(item)) + // }) + // setDefaultPerson(list) + // } else { + // setDefaultPerson([]) + // setPlayerList([]) + // } + setShowChosePlayer(true) + }}> + 选择 + } + /> + + + + + { + setShowChosePlayer(false) + let detailList: any = chosePlayerRef.current.selectedRowDetail + let list: any = [] + if (detailList && detailList.length > 0) { + detailList.forEach((item: any) => { + list.push({ label: item.USER_NAME, value: item.USER_ID }) + }) + } + setPlayerList(list) + modalFormRef.current?.setFieldsValue({ APPROVALSTAFF_ID: chosePlayerRef.current.selectedRowKeys }) + }} + onCancel={(e) => { + setShowChosePlayer(false) + }} + > + + + +
+ ) +} + + + +export default BusinessConfiguration; \ No newline at end of file diff --git a/src/pages/ComplaintForwardingProcess/index.tsx b/src/pages/ComplaintForwardingProcess/index.tsx index 7c225ac..766a2f3 100644 --- a/src/pages/ComplaintForwardingProcess/index.tsx +++ b/src/pages/ComplaintForwardingProcess/index.tsx @@ -1,205 +1,1010 @@ -import { Button } from "antd"; -import ReactDOM from "react-dom"; +import { ActionType, FormInstance, ProForm, ProFormSelect, ProFormText, ProFormTextArea, ProFormTreeSelect, ProFormUploadButton, ProTable } from "@ant-design/pro-components"; import "./index.less"; +import { useRef, useState } from "react"; +import { Button, Col, message, Modal, Row, Image, Space, Popconfirm, Card, Steps, Tooltip } from "antd"; +import { ExclamationCircleOutlined, PlusOutlined } from "@ant-design/icons"; +import { getFieldEnum, getFieldEnumTreeNoSession, handleDeletePicture, handleDeleteSUGGESTION, handleGetAPPLYAPPROVEList, handleGetAPPROVALROUTEList, handleGetPictureList, handleGetServerpartDDL, handleGetSUGGESTIONList, handleSynchroAPPLYAPPROVE, handleSynchroSUGGESTION, uploadAHYDPicture } from "../serverpartAssets/service"; +import moment from "moment"; +import { resizeImageHalf } from "./resizeImageHalf"; +import { handleGetPassportInfoById } from "../DigitalElectronics/service"; + + +const beforeUpload = (file: any) => { + const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; + if (!isJpgOrPng) { + message.error('请上传JPEG、jpg、png格式的图片文件!'); + } + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + message.error('图片大小不超过 2MB!'); + } + return isJpgOrPng && isLt2M; +} const ComplaintForwardingProcess = () => { - // 附件1 结构 - const Attachment1 = () => ( -
-
附件1:受理工单
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
投诉人联系电话
受理部门受理时间
转办部门来电类别
来电内容
转办要求
处理反馈结果(可附页) -
- 反馈人:         时间:   年   月   日   时   分 -
-
-
- ); + const { confirm } = Modal; + const actionRef = useRef(); + const formRef = useRef(); + // 悬浮框的表单实例 + const modalRef = useRef(); + // 显示新增记录的悬浮框 + const [modalVisible, setModalVisible] = useState(false) + // 新增记录的悬浮框 + const [confirmLoading, setConfirmLoading] = useState(false) + // 拿到服务区列表 + const [serverPartList, setServerPartList] = useState() + // 文件列表 + const [fileList, setFileList] = useState([]) + // 预览图片 + const [imagePreviewVisible, setImagePreviewVisible] = useState(false) + // 当前行数据 + const [currentRow, setCurrentRow] = useState() + // 当前用户信息 + const [currentUser, setCurrentUser] = useState(); + // 拿到受理状态的list + const [SUGGESTIONSTATELIST, setSUGGESTIONSTATELIST] = useState(); + // 拿到当前 流程配置的最后流程 + const [lastApprovalRoute, setLastApprovalRoute] = useState(); + // 下一步配置流程的信息 或上一步驳回的信息 + const [nextApprovalRoute, setNextApprovalRoute] = useState(); + // 当前环节的配置信息 + const [currentApprovalRoute, setCurrentApprovalRoute] = useState(); + // 完整的整个流程记录 + const [allProcessRecord, setAllProcessRecord] = useState(); + // 流程进度 + const [progressList, setProgressList] = useState(); - // 附件2 结构 - const Attachment2 = () => ( -
-
“12328”交通运输服务监督电话话务转办单
-
编号:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
来电人联系电话
受理部门受理时间
转办单位来电类别
来电内容
转办要求 -
- 转办人:         时间: -
-
处理反馈结果(可附页) -
- 反馈人:         时间: -
-
-
- ); + // 判断是审核通过还是 驳回审核 1 审核通过 2 驳回 3 受理 + const [reviewType, setReviewType] = useState() - // 附件3 结构 - const Attachment3 = () => ( -
-
网络舆情处置报告书
-
反馈时间:   年   月   日
- - - - - - - - - - - - - - - - - - - - - - - - - -
反馈单位(加盖公章)
签发人
联系人手机号码
舆情概况
核实及处置情况(可另附页)
-
- ); + const columns: any = [ + { + title: "类型", + width: 120, + dataIndex: "SUGGESTION_TYPE", + valueType: "select", + align: 'center', + valueEnum: { + "0": "全部", + "1000": "投诉", + "1050": "表扬", + "4000": "咨询/建议" + }, + initialValue: "0" + }, + { + title: "服务区", + width: 120, + align: 'center', + dataIndex: "SERVERPART_NAME", + hideInSearch: true, + ellipsis: true, + }, + { + title: "人员名称", + width: 150, + align: 'center', + dataIndex: "SUGGESTION_NAME", + hideInSearch: true, + ellipsis: true, + }, + { + title: "联系电话", + width: 120, + align: 'center', + dataIndex: "PHONE_NUMBER", + hideInSearch: true, + ellipsis: true, + }, + { + title: "处理状态", + width: 120, + align: 'center', + dataIndex: "SUGGESTION_STATE", + valueType: "select", + request: async () => { + const req: any = { + SearchParameter: { + PROVINCE_CODE: '530000', + OPERATION_TYPES: '30', + APPROVALROUTE_VALID: 1 + }, - // 真正的打印函数,使用 Iframe 隔离 - const handlePrintByIframe = (AttachmentComponent: React.ComponentType) => { - // 1. 创建隐藏的 iframe - const iframe = document.createElement('iframe'); - iframe.style.position = 'fixed'; - iframe.style.right = '0'; - iframe.style.bottom = '0'; - iframe.style.width = '0'; - iframe.style.height = '0'; - iframe.style.border = '0'; - document.body.appendChild(iframe); + PageIndex: 1, + PageSize: 999999 + } + const data = await handleGetAPPROVALROUTEList(req) + console.log('dsjakdjaslkd', data); + setSUGGESTIONSTATELIST(data) + setLastApprovalRoute(data[data.length - 1]) + if (data && data.length > 0) { + let list: any = [] + data.forEach((item: any) => { + list.push({ label: item.APPROVALROUTE_NAME, value: item.APPROVALROUTE_STATE }) + }) + list.unshift({ label: "待受理", value: 1000 }) + list.push({ label: "已审结", value: 2000 }) + list.push({ label: "已审结", value: 3000 }) + return list + } else { + return [] + } + }, + ellipsis: true + }, + { + title:
详细描述
, + width: 300, + dataIndex: "SUGGESTION_REASON", + hideInSearch: true, + ellipsis: true, + }, + { + title:
发起时间
, + width: 150, + align: 'center', + dataIndex: "SUGGESTION_CREATEDATE", + hideInSearch: true, + ellipsis: true, + render: (_, record) => { + return record?.SUGGESTION_CREATEDATE ? moment(record?.SUGGESTION_CREATEDATE).format('YYYY-MM-DD HH:mm:ss') : "" + } + }, + { + title: "操作", + width: 150, + align: 'center', + dataIndex: "option", + hideInSearch: true, + render: (_, record) => { + return + { + record?.SUGGESTION_STATE === 1000 ? + { + setCurrentRow(record) + setModalVisible(true) + setReviewType(3) + }}> + 受理 + : + // lastApprovalRoute 为当前配置流程的 最后配置流程 那一整个 配置对象 可以拿到当前配置 和下一环节配置 下一环节配置 为最终的 + // 若 最后的配置流程的当前配置 大于等于 当前数据的配置 那么就出现审核通过 和 驳回审核 + lastApprovalRoute && lastApprovalRoute.APPROVALROUTE_STATE >= record.SUGGESTION_STATE ? + <> + { + setCurrentRow(record) + setModalVisible(true) + setReviewType(1) + }}>审核通过 + { + record?.SUGGESTION_STATE > 1010 ? + { + setCurrentRow(record) + setModalVisible(true) + setReviewType(2) + }}>驳回审核 : "" + } + + : + // 若当前记录流程 为最审结状态 那么就出现下载附件下载 + lastApprovalRoute && lastApprovalRoute.NEXT_STATE === record.SUGGESTION_STATE ? + { - const iframeDoc = iframe.contentWindow?.document; - if (!iframeDoc) return; - - // 2. 注入样式和容器 - iframeDoc.open(); - iframeDoc.write(` - - - 打印预览 - - - - - - - `); - iframeDoc.close(); - - // 3. 将 React 组件渲染到 iframe 中 - const printRoot = iframeDoc.getElementById('print-root'); - if (printRoot) { - ReactDOM.render(, printRoot); + }}> + 下载附件 + : + "" + } + {/* 一般情况下注释掉 */} + { + const req = { + SUGGESTIONId: record.SUGGESTION_ID + } + const res: any = await handleDeleteSUGGESTION(req) + if (res.Result_Code === 100) { + message.success("删除成功") + actionRef.current?.reload() + } else { + message.error(res.Result_Desc) + } + }}>删除 + + } } + ] - // 4. 调用打印 - setTimeout(() => { - iframe.contentWindow?.focus(); - iframe.contentWindow?.print(); - // 5. 打印完成后清理 - setTimeout(() => { - document.body.removeChild(iframe); - }, 1000); - }, 300); + // 处理树形数据 + const addDisabledIfHasChildren = (list: any) => { + if (!Array.isArray(list)) return list; + return list.map(item => { + const hasChildren = Array.isArray(item.children) && item.children.length > 0; + const newItem = { + ...item, + ...(hasChildren ? { disabled: true } : {}) + }; + if (hasChildren) { + newItem.children = addDisabledIfHasChildren(item.children); + } + return newItem; + }); + } + + // 预览上传后的图片 + const handlePreview = async () => { + setFileList(fileList) + setImagePreviewVisible(true) }; - return ( -
-
- - - -
+ // 新增或同步记录的方法 + const handleAddUpdateRecord = async (res: any) => { + let req: any = {} + if (currentRow) { + req = { + ...currentRow, + ...res, + OPERATE_DATE: moment().format("YYYY-MM-DD HH:mm:ss"), + } + } else { + req = { + SUGGESTION_TYPE: res.SUGGESTION_TYPE, + SUGGESTION_CHANNEL: "1", // 小程序上应该是空 后台我就写 1 + SERVERPART_ID: res.SERVERPART_ID, + PROVINCE_CODE: "530000", + MEMBERSHIP_ID: currentUser?.ID || "", + ENUM_LABEL: res.ENUM_LABEL ? res.ENUM_LABEL.toString() : "", + SUGGESTION_NAME: res.SUGGESTION_NAME, + PHONE_NUMBER: res.PHONE_NUMBER, + SUGGESTION_REASON: res.SUGGESTION_REASON, + SERVERPART_NAME: res.SERVERPART_NAME, + SUGGESTION_CREATEDATE: moment().format("YYYY-MM-DD HH:mm:ss"), + SUGGESTION_STATE: 1000, // 1000 为待受理状态 + OPERATE_DATE: moment().format("YYYY-MM-DD HH:mm:ss"), + } + } + setConfirmLoading(true) + console.log('reqreq', req); -
- 提示:点击按钮将使用 Iframe 隔离技术打开打印预览。这能确保**只打印表格内容**,而不会包含页面上的其他元素。 -
-
+ const data = await handleSynchroSUGGESTION(req) + if (data.Result_Code === 100) { + // 上传图片 + if (res.LOCALEPHOTO && res.LOCALEPHOTO.length > 0) { + for (const file of res.LOCALEPHOTO) { + const formData = new FormData(); + const originalFile = file.originFileObj || file; + try { + // 压缩图片 + const compressedFile = await resizeImageHalf(originalFile); + // 使用压缩后的文件 + formData.append('files[]', compressedFile); + formData.append('ImageName', compressedFile.name); + } catch (err) { + // 如果压缩失败,使用原图 + formData.append('files[]', originalFile); + formData.append('ImageName', originalFile.name); + } + + formData.append('TableId', data.Result_Data.SUGGESTION_ID); + formData.append('TableType', "1302"); + formData.append('ImageType', "1000"); // 1000 为 上传材料 2000的话 是 处理的附件资料 + let result = await uploadAHYDPicture(formData) + } + + setConfirmLoading(false) + } + await handleUpdateAddAPPLYAPPROVE('add', data.Result_Data.SUGGESTION_ID) + setConfirmLoading(false) + message.success("同步成功") + actionRef.current?.reload() + setModalVisible(false) + modalRef.current?.resetFields() + setReviewType(null) + setFileList([]) + setNextApprovalRoute(null) + setCurrentApprovalRoute(null) + setAllProcessRecord([]) + setProgressList([]) + } else { + setConfirmLoading(false) + message.error(data.Result_Desc) + } + } + + // 获取当前用户信息 + const handleGetUserInfo = async (id: string) => { + const req: any = { + UserIdEncrypted: id + } + const data = await handleGetPassportInfoById(req) + setCurrentUser(data) + return data + } + + // 修改受理状态 即改变status + const handleUpdateStatus = async (record: any) => { + // 审核通过走这个 + if (reviewType === 1 || reviewType === 3) { + console.log('下一环节信息', nextApprovalRoute); + console.log('当前表单数据', record); + const req: any = { + ...currentRow, + CHAIRMAN_ID: record?.nextPerson, + CHAIRMAN_NAME: record?.nextPersonName, + SUGGESTION_STATE: nextApprovalRoute?.APPROVALROUTE_STATE, + LEADERSHIP_INFO: record?.LEADERSHIP_INFO || "", + FEEDBACK_INFO: record?.FEEDBACK_INFO || "" + } + setConfirmLoading(true) + const data: any = await handleSynchroSUGGESTION(req) + setConfirmLoading(false) + if (data.Result_Code === 100) { + if (record?.ATTACHED_MATERIALS && record?.ATTACHED_MATERIALS.length > 0 && currentRow?.SUGGESTION_STATE === 1010) { + for (const file of record?.ATTACHED_MATERIALS) { + const formData = new FormData(); + const originalFile = file.originFileObj || file; + try { + // 压缩图片 + const compressedFile = await resizeImageHalf(originalFile); + // 使用压缩后的文件 + formData.append('files[]', compressedFile); + formData.append('ImageName', compressedFile.name); + } catch (err) { + // 如果压缩失败,使用原图 + formData.append('files[]', originalFile); + formData.append('ImageName', originalFile.name); + } + + formData.append('TableId', currentRow?.SUGGESTION_ID); + formData.append('TableType', "1302"); + formData.append('ImageType', "2000"); // 1000 为 上传材料 2000的话 是 处理的附件资料 + let result = await uploadAHYDPicture(formData) + } + + } + + await handleUpdateAddAPPLYAPPROVE() + message.success(reviewType === 1 ? '审核成功' : reviewType === 2 ? '驳回成功!' : reviewType === 3 ? "受理成功!" : "") + setModalVisible(false) + setCurrentRow(undefined) + setReviewType(null) + setFileList([]) + setNextApprovalRoute(null) + setCurrentApprovalRoute(null) + modalRef.current?.resetFields() + + actionRef.current?.reload() + } else { + message.error(data.Result_Desc) + } + } else if (reviewType === 2) { + // 驳回审核走这个 + // 因为这个data是整个流程最完整的过程数组 所以只能驳回到上一步去 + // 取到上一步的状态 + let lastStepDetail: any = allProcessRecord[allProcessRecord.length - 1] + const newStepReq: any = { + ...currentRow, + CHAIRMAN_ID: lastStepDetail?.STAFF_ID, + CHAIRMAN_NAME: lastStepDetail?.STAFF_NAME, + SUGGESTION_STATE: lastStepDetail?.APPLYAPPROVE_TYPE, + } + setConfirmLoading(true) + const newStepData: any = await handleSynchroSUGGESTION(newStepReq) + setConfirmLoading(false) + if (newStepData.Result_Code === 100) { + // 传入reject 里面的APPLYAPPROVE_INFO 就会是9999 就代表驳回 + await handleUpdateAddAPPLYAPPROVE('reject', '', record) + + message.success('驳回成功!') + setModalVisible(false) + setCurrentRow(undefined) + setReviewType(null) + setFileList([]) + setNextApprovalRoute(null) + setCurrentApprovalRoute(null) + modalRef.current?.resetFields() + + actionRef.current?.reload() + } else { + message.error(data.Result_Desc) + } + } + } + + // 请求当前流程的完整审核过程 + const handleGetAllProcessRecord = async () => { + const req: any = { + SearchParameter: { + TABLE_ID: currentRow?.SUGGESTION_ID, + TABLE_NAME: "MOBILESERVICE_PLATFORM.T_SUGGESTION", + }, + PageIndex: 1, + PageSize: 999999 + } + const data: any = await handleGetAPPLYAPPROVEList(req) + setAllProcessRecord(data) + let list: any = [] + if (data && data.length > 0) { + data.forEach((item: any) => { + list.push({ + title: item?.APPLYAPPROVE_NAME, + description: item?.APPLYAPPROVE_DATE + // description: item?.APPLYAPPROVE_INFO, + // status: item?.APPLYAPPROVE_TYPE === 1 ? 'process' : item?.APPLYAPPROVE_TYPE === 2 ? 'wait' : 'finish', + }) + }) + } + setProgressList(list) + } + + // 同步审批意见 + const handleUpdateAddAPPLYAPPROVE = async (type?: string, id?: string, record?: any) => { + // type 可能为 add 的时候 说明是新增的 reject 是驳回 + // id 是新增的时候同步 需要id + // record 是驳回的时候需要 需要拿到实际的表单数据 + const req: any = { + TABLE_ID: type === 'add' ? id : currentRow?.SUGGESTION_ID, + TABLE_NAME: "MOBILESERVICE_PLATFORM.T_SUGGESTION", + // APPLYAPPROVE_TYPE: reviewType,// 意见类型 1 审核 2 驳回 3 受理 + APPLYAPPROVE_TYPE: type === 'reject' ? 9999 : type === 'add' ? 1000 : currentApprovalRoute?.APPROVALROUTE_STATE,// 新增为1000 + APPLYAPPROVE_NAME: type === 'reject' ? '驳回流程' : type === 'add' ? '新增流程记录' : currentApprovalRoute?.APPROVALROUTE_NAME || "",// 环节名称 + APPLYAPPROVE_INFO: type === 'reject' ? record?.rejectionOpinion : "",// 审批意见 + APPLYAPPROVE_DATE: moment().format("YYYY-MM-DD HH:mm:ss"),// 审批时间 + STAFF_ID: currentUser?.ID,// 审批人ID + STAFF_NAME: currentUser?.Name,// 审批人姓名 + } + const data = await handleSynchroAPPLYAPPROVE(req) + } + + return ( +
+ { + let userInfo: any = {} + if (currentUser) { + userInfo = currentUser + } else { + const search = window.location.search; + const addressParams = Object.fromEntries(new URLSearchParams(search).entries()); + userInfo = await handleGetUserInfo(addressParams.UserIdEncrypted) + } + + console.log('paramsparamsparams', params); + const req: any = { + SearchParameter: { + SUGGESTION_TYPES: params?.SUGGESTION_TYPE === "0" ? '1000,1050,4000' : params?.SUGGESTION_TYPE,// 类型 + SUGGESTION_STATES: params?.SUGGESTION_TYPE === "0" ? '' : params?.SUGGESTION_TYPE,// 状态 + }, + SortStr: "SUGGESTION_CREATEDATE desc", + PageIndex: 1, + PageSize: "999999" + } + const data = await handleGetSUGGESTIONList(req) + if (data && data.length > 0) { + return { data, success: true } + } + return { data: [], success: true } + }} + toolbar={{ + actions: [ + + ] + }} + /> + + {fileList && fileList.length > 0 &&
+ { + setImagePreviewVisible(vis) + } + + }}> + { + fileList.map((n) => + + ) + } + + +
} + + + { + setModalVisible(false) + modalRef.current?.validateFields().then((res) => { + modalRef.current?.submit() + }) + }} + onCancel={(e) => { + setModalVisible(false) + setCurrentRow(undefined) + setReviewType(null) + setFileList([]) + setNextApprovalRoute(null) + setCurrentApprovalRoute(null) + setAllProcessRecord([]) + setProgressList([]) + modalRef.current?.resetFields() + }} + footer={
+ { + currentRow ? + <> + { + reviewType === 1 || reviewType === 3 ? + { + modalRef.current?.validateFields().then((res) => { + handleUpdateStatus(res) + }) + }} + > + + : + reviewType === 2 ? + { + modalRef.current?.validateFields().then((res) => { + handleUpdateStatus(res) + }) + }} + > + + + : '' + } + + : + <> + + + + } +
} + > + { + await handleAddUpdateRecord(res) + }} + request={async () => { + if (currentRow?.SUGGESTION_ID) { + // 拿图片信息 + const req: any = { + TableId: currentRow?.SUGGESTION_ID, + TableType: 1302, + ImageType: "1000" // 1000 为 上传材料 2000的话 是 处理的附件资料 + } + const data = await handleGetPictureList(req) + let list: any = [] + if (data.List && data.List.length > 0) { + data.List.forEach((n: any) => { + list.push({ + url: n.ImageUrl, + name: n.ImageName, + uid: String(n.ImageId), + status: 'done' + }) + }) + setFileList(list) + } + console.log('curr', currentRow); + let attachedMaterialsList: any = [] + if (currentRow?.SUGGESTION_STATE >= 1010) { + const req: any = { + TableId: currentRow?.SUGGESTION_ID, + TableType: 1302, + ImageType: "2000" // 1000 为 上传材料 2000的话 是 处理的附件资料 + } + const data = await handleGetPictureList(req) + if (data.List && data.List.length > 0) { + data.List.forEach((n: any) => { + attachedMaterialsList.push({ + url: n.ImageUrl, + name: n.ImageName, + uid: String(n.ImageId), + status: 'done' + }) + }) + } + } + console.log('attachedMaterialsList', attachedMaterialsList); + + await handleGetAllProcessRecord() + + return { + ...currentRow, + ENUM_LABEL: Number(currentRow?.ENUM_LABEL), + SERVERPART_ID: currentRow?.SERVERPART_ID ? String(currentRow?.SERVERPART_ID) : "", + SUGGESTION_TYPE: currentRow?.SUGGESTION_TYPE ? String(currentRow?.SUGGESTION_TYPE) : "", + LOCALEPHOTO: list, + ATTACHED_MATERIALS: attachedMaterialsList + } + } else { + return {} + } + }} + > + + + { + if (serverPartList && serverPartList.length > 0) { + return serverPartList + } else { + const req: any = { + ProvinceCode: "530000", + } + let list: any = [] + const data = await handleGetServerpartDDL(req) + if (data && data.length > 0) { + list = data + setServerPartList(list) + } else { + setServerPartList([]) + } + return list + } + }} + fieldProps={{ + showSearch: true, + filterOption: (input, option) => + (option?.label ?? '').toLowerCase().includes(input.toLowerCase()), + optionFilterProp: 'label', + onChange: async (value: any, option: any) => { + modalRef.current?.setFieldsValue({ SERVERPART_NAME: option.title }) + } + }} + rules={[{ + required: true, + message: '请选择服务区!' + }]} + readonly={reviewType} + /> + + + + + + + + { + return [ + { + label: "投诉", + value: "1000" + }, + { + label: "表扬", + value: "1050" + }, + { + label: "咨询/建议", + value: "4000" + } + ] + }} + rules={[{ + required: true, + message: '请选择投诉类型!' + }]} + readonly={reviewType} + /> + + + + { + const taxRateLabel: any = await getFieldEnumTreeNoSession({ FieldExplainField: 'BUSINESS_TARGET', notformate: true }) + let list: any = addDisabledIfHasChildren(taxRateLabel) + console.log('list', list); + + return list + }} + fieldProps={{ + treeDefaultExpandAll: true, + multiple: true, + }} + rules={[ + { + required: true, + message: '请选择标签', + }, + ]} + readonly={reviewType} + /> + + + + + + + + + + + + + + + { + // if (info.file.status === 'removed') { + // confirm({ + // title: '确认删除该图片吗?', + // icon: , + // async onOk() { + + + // const req: any = { + // ImagePath: info.file.path, + // TableType: '5000', + // } + // const data = await handleDeletePicture(req) + // if (data) { + // message.success('删除成功!') + // let list: any = JSON.parse(JSON.stringify(fileList)) + // let res: any = [] + // if (list && list.length > 0) { + // list.forEach((item: any) => { + // if (item.url === info.file.url) { + + // } else { + // res.push(item) + // } + // }) + // } + // setFileList(res) + // } + // } + // }); + // } + } + }} + /> + + + {/* 状态1010 即 项目管理单元安全员 的时候 出现 核实情况,处置结果,附件资料 */} + { + currentRow?.SUGGESTION_STATE >= 1010 ? + <> + + 1010} + /> + + + 1010} + /> + + + 1010} + fieldProps={{ + maxCount: 9 + }} + /> + + : "" + } + + { + reviewType !== 2 && currentRow ? + + { + console.log('SUGGESTIONSTATELIST', SUGGESTIONSTATELIST); + console.log('currentRow', currentRow); + let currentObj: any = {} // 当前环节的配置信息 + let nextStausId: any = "" + let nextStatusObj: any = "" + if (SUGGESTIONSTATELIST && SUGGESTIONSTATELIST.length > 0) { + SUGGESTIONSTATELIST.forEach((item: any) => { + if (currentRow?.SUGGESTION_STATE === 1000) { + nextStausId = 1010 + currentObj = { + APPROVALROUTE_NAME: "受理流程", + APPROVALROUTE_STATE: 1000, + APPROVALROUTE_VALID: 1, + NEXT_STATE: 1010, + OPERATION_TYPE: 30, + PROVINCE_CODE: "530000" + } + } else if (Number(item.APPROVALROUTE_STATE) === Number(currentRow?.SUGGESTION_STATE)) { + nextStausId = Number(item.NEXT_STATE) + currentObj = item + } + + }) + + SUGGESTIONSTATELIST.forEach((item: any) => { + if (item.APPROVALROUTE_STATE === nextStausId) { + nextStatusObj = item + } + }) + console.log('下一环节配置', nextStatusObj); + setNextApprovalRoute(nextStatusObj) + setCurrentApprovalRoute(currentObj) + let idList: any = nextStatusObj?.APPROVALSTAFF_ID ? nextStatusObj?.APPROVALSTAFF_ID.split(',') : [] + let nameList: any = nextStatusObj?.APPROVALSTAFF_NAME ? nextStatusObj?.APPROVALSTAFF_NAME.split(',') : [] + let list: any = [] + if (idList && idList.length > 0 && nameList && nameList.length > 0) { + let count: number = idList.length + for (let i = 0; i < count; i++) { + list.push({ label: nameList[i], value: idList[i] }) + } + } + console.log('listlistlist', list); + + return list + } else { + return [] + } + }} + fieldProps={{ + showSearch: true, + filterOption: (input, option) => + (option?.label ?? '').toLowerCase().includes(input.toLowerCase()), + optionFilterProp: 'label', + onChange: (e, option: any) => { + modalRef.current?.setFieldsValue({ nextPersonName: option.title }) + } + }} + /> + : "" + } + + {/* 出现驳回意见 */} + { + (currentRow?.SUGGESTION_STATE > 1010 && reviewType === 2) ? + + + : "" + } + + + + + + { + currentRow ? +
+
流程进度
+
+ + +
+
: "" + } +
+
+
); }; diff --git a/src/pages/ComplaintForwardingProcess/resizeImageHalf.ts b/src/pages/ComplaintForwardingProcess/resizeImageHalf.ts new file mode 100644 index 0000000..ae70de5 --- /dev/null +++ b/src/pages/ComplaintForwardingProcess/resizeImageHalf.ts @@ -0,0 +1,96 @@ +export interface ResizeHalfOptions { + quality?: number; +} + +export const resizeImageHalf = ( + file: File, + options: ResizeHalfOptions = {} +): Promise => { + const { + quality = 0.8 + } = options; + + return new Promise((resolve, reject) => { + if (!file || !file.type.includes('image')) { + reject(new Error('无效的图片文件')); + return; + } + + const reader = new FileReader(); + reader.onload = (e) => { + const img = new Image(); + img.onload = () => { + resizeToHalfDimensions(img, file, quality, resolve, reject); + }; + img.onerror = () => reject(new Error('图片加载失败')); + img.src = e.target?.result as string; + }; + reader.onerror = () => reject(new Error('文件读取失败')); + reader.readAsDataURL(file); + }); +}; + +/** + * 图片处理函数 - 将图片长宽分辨率精确减半 + */ +function resizeToHalfDimensions( + img: HTMLImageElement, + originalFile: File, + quality: number, + resolve: (file: File) => void, + reject: (error: Error) => void +) { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + + if (!ctx) { + reject(new Error('浏览器不支持Canvas')); + return; + } + + // 计算减半后的尺寸 + const halfWidth = Math.floor(img.width / 2); + const halfHeight = Math.floor(img.height / 2); + + console.log(`原图尺寸: ${img.width}x${img.height}`); + console.log(`减半后尺寸: ${halfWidth}x${halfHeight}`); + + // 设置canvas尺寸为原图的一半 + canvas.width = halfWidth; + canvas.height = halfHeight; + + // 在canvas上绘制缩小后的图片 + // 使用平滑缩放算法以获得更好的图像质量 + ctx.imageSmoothingEnabled = true; + ctx.imageSmoothingQuality = 'high'; + ctx.drawImage(img, 0, 0, halfWidth, halfHeight); + + // 将canvas转换为Blob并创建新的File对象 + canvas.toBlob( + (blob) => { + if (!blob) { + reject(new Error('图片处理失败')); + return; + } + + // 创建新的文件名,添加_resize_half后缀 + const fileNameParts = originalFile.name.split('.'); + const extension = fileNameParts.pop(); + const fileNameWithoutExtension = fileNameParts.join('.'); + const newFileName = `${fileNameWithoutExtension}_half.${extension}`; + + // 创建压缩后的文件对象 + const resizedFile = new File([blob], newFileName, { + type: originalFile.type, + lastModified: Date.now() + }); + + console.log(`✅ 图片尺寸减半完成: ${img.width}x${img.height} → ${halfWidth}x${halfHeight}`); + console.log(`文件大小: ${(originalFile.size / 1024).toFixed(1)}KB → ${(resizedFile.size / 1024).toFixed(1)}KB`); + + resolve(resizedFile); + }, + originalFile.type, + quality + ); +} \ No newline at end of file diff --git a/src/pages/ComplaintForwardingProcess/test.tsx b/src/pages/ComplaintForwardingProcess/test.tsx new file mode 100644 index 0000000..2b27961 --- /dev/null +++ b/src/pages/ComplaintForwardingProcess/test.tsx @@ -0,0 +1,304 @@ +import { Button } from "antd"; +import ReactDOM from "react-dom"; +import "./index.less"; + +const ComplaintForwardingProcess = () => { + // 附件1 结构(已根据您的要求优化) + const Attachment1 = () => ( +
+
附件1:投诉受理工单
+
编号:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
投诉人联系电话
受理部门受理时间
转办部门来电类别
来电内容
转办要求
处理反馈结果(可附页) +
+
+
+ 反馈人:         时间:   年   月   日   时   分 +
+
+
+
备注:投诉受理工单根据全年投诉发生的时间先后排序,并以彩云驿CYY、投诉GY、年份、工单编号(0001以此类推)。
+
+ ); + + // 附件2 结构(恢复独立,不受附件1样式影响) + const Attachment2 = () => ( +
+
“12328”交通运输服务监督电话话务转办单
+
编号:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
来电人联系电话
受理部门受理时间
转办单位来电类别
来电内容 +
+
+
+
转办要求 +
+
+
+ 转办人:         时间: +
+
+
处理反馈结果(可附页) +
+
+
+ 反馈人:         时间: +
+
+
+
+ ); + + // 附件3 结构(已加入高度优化) + const Attachment3 = () => ( +
+
网络舆情处置报告书
+
反馈时间:   年   月   日
+ + + + + + + + + + + + + + + + + + + + + + + + + +
反馈单位(加盖公章)
签发人
联系人手机号码
舆情概况 +
+
+
+
核实及处置情况(可另附页) +
+
+
+
+
+ ); + + // 真正的打印函数,使用 Iframe 隔离 + const handlePrintByIframe = (AttachmentComponent: React.ComponentType) => { + // 1. 创建隐藏的 iframe + const iframe = document.createElement('iframe'); + iframe.style.position = 'fixed'; + iframe.style.right = '0'; + iframe.style.bottom = '0'; + iframe.style.width = '0'; + iframe.style.height = '0'; + iframe.style.border = '0'; + document.body.appendChild(iframe); + + const iframeDoc = iframe.contentWindow?.document; + if (!iframeDoc) return; + + // 2. 注入样式和容器 + iframeDoc.open(); + iframeDoc.write(` + + + 打印预览 + + + + + + + `); + iframeDoc.close(); + + // 3. 将 React 组件渲染到 iframe 中 + const printRoot = iframeDoc.getElementById('print-root'); + if (printRoot) { + ReactDOM.render(, printRoot); + } + + // 4. 调用打印 + setTimeout(() => { + iframe.contentWindow?.focus(); + iframe.contentWindow?.print(); + // 5. 打印完成后清理 + setTimeout(() => { + document.body.removeChild(iframe); + }, 1000); + }, 300); + }; + + return ( +
+
+ + + +
+ +
+ 提示:点击按钮将使用 Iframe 隔离技术打开打印预览。这能确保**只打印表格内容**,而不会包含页面上的其他元素。 + 当前已优化布局:转办要求默认2行,反馈结果自动填充剩余页面高度。 +
+
+ ); +}; + +export default ComplaintForwardingProcess; diff --git a/src/pages/authority.ts b/src/pages/authority.ts index 50c04ef..cedc066 100644 --- a/src/pages/authority.ts +++ b/src/pages/authority.ts @@ -16,6 +16,7 @@ const authority: PageAuthority = { '/realEstate/index': ['/realEstate/index'], '/ComplaintApproval/index': ['/ComplaintApproval/index'], '/ComplaintForwardingProcess/index': ['/ComplaintForwardingProcess/index'], + '/BusinessConfiguration/index': ['/BusinessConfiguration/index'], }; diff --git a/src/pages/serverpartAssets/service.ts b/src/pages/serverpartAssets/service.ts index 3fb2b53..1a933b9 100644 --- a/src/pages/serverpartAssets/service.ts +++ b/src/pages/serverpartAssets/service.ts @@ -595,3 +595,152 @@ export async function handleGetServerpartList(params?: any) { } +// 查询业务环节配置的列表 +export async function handleGetAPPROVALROUTEList(params?: any) { + + const data = await requestSamember(`/BusinessProcess/GetAPPROVALROUTEList`, { + method: 'POST', + data: params, + }); + + if (data.Result_Code !== 100) { + return [] + } + + return data.Result_Data.List; + +} + +// 获取账号分类树 +export async function getUserTypeTree(params?: any) { + const data = await requestSamember('/FrameWork/GetUserTypeTree', { + method: 'GET', + params + }) + + if (data.Result_Code !== 100) { + return [] + } + + const treeTable = wrapTreeNode(data.Result_Data.List); + return [...treeTable]; +} + + +// 获取账号 +export async function handleGetUserList(params?: any) { + const data = await requestSamember('/Platform/GetUserList', { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + +export async function getOnwer(params?: any) { + const data = await requestSamember('/BaseInfo/BindingOwnerUnitDDL', { + method: 'GET', + params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + +// 配置审批环节 +export async function handleSynchroAPPROVALROUTE(params?: any) { + const data = await requestSamember('/BusinessProcess/SynchroAPPROVALROUTE', { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data +} + +// 删除配置审批环节 +export async function handleDeleteAPPROVALROUTE(params?: any) { + const data = await requestSamember(`/BusinessProcess/DeleteAPPROVALROUTE`, { + method: 'GET', + params + }); + if (data.Result_Code !== 100) { + return data + } + return data; +} + +// 获取用户建议表列表 +export async function handleGetSUGGESTIONList(params?: any) { + const data = await requestSamember('/SiteManage/GetSUGGESTIONList', { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + +// 同步用户建议表 +export async function handleSynchroSUGGESTION(params?: any) { + const data = await requestSamember('/SiteManage/SynchroSUGGESTION', { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data +} + +// 删除用户建议表 +export async function handleDeleteSUGGESTION(params?: any) { + const data = await requestSamember(`/SiteManage/DeleteSUGGESTION`, { + method: 'GET', + params + }); + if (data.Result_Code !== 100) { + return data + } + return data; +} + +// 同步审批意见 +export async function handleSynchroAPPLYAPPROVE(params?: any) { + const data = await requestSamember(`/BusinessProcess/SynchroAPPLYAPPROVE`, { + method: 'POST', + data: params + }); + if (data.Result_Code !== 100) { + return data + } + return data; +} + +// 审批意见的流程过程 +export async function handleGetAPPLYAPPROVEList(params?: any) { + const data = await requestSamember(`/BusinessProcess/GetAPPLYAPPROVEList`, { + method: 'POST', + data: params + }); + if (data.Result_Code !== 100) { + return data + } + return data.Result_Data.List; +} +