ylj20011123 abcad3423f update
2026-02-09 19:28:24 +08:00

491 lines
20 KiB
TypeScript

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<ActionType>();
const formRef = useRef<FormInstance>();
const modalFormRef = useRef<FormInstance>();
const chosePlayerRef = useRef<any>();
// 折叠左侧业务类型属性选择框
const [collapsible, setCollapsible] = useState<boolean>(false)
// 左侧业务类型数据
const [treeView, setTreeView] = useState<any>()
// 左侧业务类型数据对象
const [serviceTypeObj, setServiceTypeObj] = useState<any>()
// 树相关的属性和方法
const [selectedId, setSelectedId] = useState<string>()
// 存储当前数据的搜索条件
const [searchParams, setSearchParams] = useState<any>()
// 显示新增环节的悬浮框
const [modalVisible, setModalVisible] = useState<boolean>(false)
// 选中的当前行数据
const [currentRow, setCurrentRow] = useState<any>()
// 悬浮框的确认按钮的loading
const [confirmLoading, setConfirmLoading] = useState<boolean>(false)
// 参与人列表
const [playerList, setPlayerList] = useState<any>()
// 当前已经存在了的参与人
const [defaultPerson, setDefaultPerson] = useState<any>()
// 显示参与人的悬浮框
const [showChosePlayer, setShowChosePlayer] = useState<boolean>(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 (
<Space>
<a onClick={() => {
setCurrentRow(record)
setModalVisible(true)
}}></a>
<Popconfirm
title="确认删除?"
onConfirm={async () => {
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)
}
}}
>
<a></a>
</Popconfirm>
</Space>
)
}
}
]
// 解构左侧类型
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 (
<div style={{ height: 'calc(100vh - 100px)', background: "#fff", display: 'flex' }}>
<div>
<ProCard
style={{ width: !collapsible ? "300px" : "60px" }}
className="pageTable-leftnav"
bodyStyle={{ padding: 0, paddingTop: 20, paddingLeft: 20, width: !collapsible ? "300px" : "60px" }}
extra={<MenuFoldOutlined onClick={() => {
setCollapsible(!collapsible)
}} />}
colSpan={!collapsible ? "300px" : "60px"}
title={!collapsible ? "请选择业务类型" : ""}
headerBordered
collapsed={collapsible}
>
{treeView && treeView.length > 0 ? <Tree
checkable
treeData={[{
label: '全部',
value: 0,
key: '0-0',
children: treeView
}]}
fieldNames={{
title: "label",
key: "key"
}}
blockNode
defaultExpandedKeys={['0-0']}
onCheck={(checkedKeys: React.Key[] | any, info) => {
const selectedIds = info.checkedNodes.filter(n => n?.type === 2)
setSelectedId(selectedIds.map(n => n?.value)?.toString() || '')
}}
// switcherIcon={<PlusOutlined />}
/> : ''}
</ProCard>
</div>
<div style={{
width: !collapsible ? 'calc(100% - 300px)' : 'calc(100% - 60px)',
paddingTop: 0,
paddingBottom: 0,
paddingRight: 0
}}>
<ProTable
actionRef={actionRef}
formRef={formRef}
columns={columns}
bordered
expandable={{
expandRowByClick: true
}}
headerTitle={'业务配置'}
search={{ span: 6 }}
request={async (params) => {
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: [
<Button
key="new"
icon={<PlusOutlined />}
type="primary"
onClick={(e) => {
setModalVisible(true)
}}
>
</Button>
]
}}
/>
</div>
<Modal
title={currentRow ? "编辑环节" : "新增环节"}
width={600}
destroyOnClose
open={modalVisible}
confirmLoading={confirmLoading}
onOk={(e) => {
setModalVisible(false)
modalFormRef.current?.validateFields().then((res: any) => {
modalFormRef.current?.submit()
})
}}
onCancel={(e) => {
setModalVisible(false)
modalFormRef.current?.resetFields();
setDefaultPerson([])
setPlayerList([])
setCurrentRow(undefined)
}}
>
<ProForm
formRef={modalFormRef}
submitter={false}
initialValues={currentRow}
request={async () => {
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)
}}
>
<ProFormTreeSelect
label={"业务类型"}
name={"OPERATION_TYPE"}
request={async (params) => {
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: '请选择业务类型',
},
]}
/>
<ProFormText
label={'环节名称'}
name={'APPROVALROUTE_NAME'}
rules={[
{
required: true,
message: '请输入环节名称',
},
]}
/>
<ProFormDigit
label={"业务状态"}
name={"APPROVALROUTE_STATE"}
rules={[
{
required: true,
message: '请选择业务状态',
},
]}
/>
<ProFormDigit
label={"下一个业务状态"}
name={"NEXT_STATE"}
rules={[
{
required: true,
message: '请选择下一个业务状态',
},
]}
tooltip={'若下一状态为审结则是9000'}
/>
<ProFormSelect
label={'参与人'}
name={'APPROVALSTAFF_ID'}
width={'lg'}
fieldProps={{
options: playerList || [],
mode: 'multiple'
}}
addonAfter={
<Button type="primary" icon={<FileSearchOutlined />}
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)
}}>
</Button>}
/>
</ProForm>
</Modal>
<Modal
title={'选择参与人'}
width={'80%'}
open={showChosePlayer}
destroyOnClose
bodyStyle={{
height: '700px',
overflowY: 'auto'
}}
onOk={(e) => {
setShowChosePlayer(false)
let detailList: any = chosePlayerRef?.current?.selectedRowDetail
console.log('detailListdetailList', detailList);
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)
}}
>
<ChosePlayers onRef={chosePlayerRef} actionRef={actionRef} defaultPerson={defaultPerson} />
</Modal>
</div>
)
}
export default BusinessConfiguration;