import React, { useState, useReducer, useRef, memo } from "react"; import { Card, Button } from "antd"; import { useRequest } from "umi"; import { doFetch } from "@/utils/doFetch"; import getPrem from "@/utils/getPrem"; //权限判断fn import Tableform from "@/components/Tableform"; import DrawInitForm from "@/components/DrawInitForm"; import { paFormConditionSelect, queryConValueSelect, } from "@/services/platform"; import defaultFields from "./fields"; const tabList = [ { key: "tab1", tab: <span style={{ fontSize: 14 }}>公共字段</span>, }, { key: "tab2", tab: <span style={{ fontSize: 14 }}>条件字段</span>, }, ], initState = { vs: false, fields: {}, iftype: {}, curitem: {}, tabKey: "tab1", formCharId: "", expandedRowKeys: [], }; function reducer(state, action) { let { type } = action, newState = {}; switch (type) { case "add": newState = { ...state, vs: true, iftype: { title: action.title, val: type, }, fields: { ...action.fields }, }; break; case "addcustomFields": newState = { ...state, vs: true, iftype: { title: action.title, val: type, }, fields: { ...action.fields }, curitem: action.curitem, }; break; case "condition": //新增条件 newState = { ...state, vs: true, iftype: { title: action.title, val: type, }, fields: { ...action.fields }, }; break; case "editCondition": //编辑条件 newState = { ...state, vs: true, iftype: { title: action.title, val: type, }, fields: { ...action.fields }, curitem: action.curitem, }; break; case "edit": newState = { ...state, vs: true, iftype: { title: action.title, val: type, }, fields: { ...action.fields }, curitem: action.curitem, }; break; case "changeTab": newState = { ...state, tabKey: action.tabKey, expandedRowKeys: [], }; break; case "changeFormCharId": newState = { ...state, formCharId: action.formCharId, expandedRowKeys: action.expandedRowKeys, }; break; case "close": newState = { ...state, vs: false, fields: {}, iftype: {}, curitem: {}, }; break; } return newState; } const ExpandedRowRender = memo( (props) => { const { checkedNodeKey, formCharId, expanded, tableRef, columns } = props; return ( <div style={{ minHeight: 200 }}> {expanded && ( <Tableform columns={columns} path="/ngic-base-business/paFormField/queryList" actionRef={tableRef} extraparams={{ fieldType: 2, formId: checkedNodeKey, formCharId: formCharId, }} bordered={false} ></Tableform> )} </div> ); }, (prev, next) => { if (prev.formCharId == next.formCharId) { return true; } else { return false; } } ); const Fieldmanage = (props) => { let actionRef = useRef(), ChildRef = useRef(); function reload() { actionRef?.current?.reload(); } function reloadChildren() { ChildRef?.current?.reload(); dispatch({ type: "close" }); } const [state, dispatch] = useReducer(reducer, initState), { vs, fields, iftype, curitem, tabKey, formCharId, expandedRowKeys } = state, { checkedNode } = props, columns = [ { title: "自定义字段名称", dataIndex: "fieldName", key: "fieldName", search: false, }, { title: "自定义字段属性", dataIndex: "fieldCharName", key: "fieldCharName", search: false, }, { title: "选项内容", dataIndex: "fieldCharValue", key: "fieldCharValue", search: false, }, { title: "操作", dataIndex: "option_dataindex", key: "option_dataindex", valueType: "option", width: 150, render: (text, row, _, action) => extraAction(text, row, _, action), }, ], columnss = [ { title: "条件字段", dataIndex: "fieldCondName", key: "fieldCondName", render: (_, row) => { return ( <span> {row.fieldCondName}={row.optCondName} </span> ); }, search: false, }, { title: "自定义字段名称", dataIndex: "fieidNames", key: "fieidNames", search: false, }, { title: "操作", dataIndex: "option_dataindex", key: "option_dataindex", valueType: "option", width: 215, render: (text, row, _, action) => extraAction(text, row, _, action, "tab2"), }, ], { run, loading } = useRequest(doFetch, { manual: true, formatResult: (res) => res, onSuccess: (result, params) => { if (result.code == "0000") { reload(); reloadChildren(); } }, }), conditionFields = { formConditionId: { value: null, type: "select", title: "条件字段", name: ["formConditionId"], required: true, options: { database: paFormConditionSelect, params: { formId: checkedNode?.key }, }, linked: true, }, optCondKey: { value: null, type: "select", title: "字段属性值", name: ["optCondKey"], required: true, belinked: { options: { database: queryConValueSelect, params: { formId: checkedNode?.key, formConditionId: "linked", }, }, }, }, }; function extraAction(text, record, _, action, types) { return [ types == "tab2" && getPrem("sysDepartment_save", action, "新增", () => { for (let i in defaultFields) { defaultFields[i].value = null; } let title = "新增自定义字段"; dispatch({ type: "addcustomFields", fields: defaultFields, curitem: record, title, }); }), getPrem("sysDepartment_save", action, "修改", () => { let title; if (tabKey == "tab1") { for (let i in defaultFields) { defaultFields[i].value = record[i]; } title = "修改公共字段"; dispatch({ type: "edit", fields: defaultFields, curitem: record, title, }); } else { if (record.formCharId) { for (let i in defaultFields) { defaultFields[i].value = record[i]; } title = "修改自定义字段"; dispatch({ type: "edit", fields: defaultFields, curitem: record, title, }); } else { for (let i in conditionFields) { conditionFields[i].value = record[i]; } title = "修改条件字段"; dispatch({ type: "editCondition", fields: conditionFields, curitem: record, title, }); } } }), getPrem("sysDepartment_deleteById", action, "删除", null, { title: tabKey == "tab1" ? "确认删除该公共字段?" : record.formCharId ? "确认删除该自定义字段?" : "确认删除该条件字段?", onConfirm: () => { run({ url: tabKey == "tab1" || record.formCharId ? "/ngic-base-business/paFormField/deleteById" : "/ngic-base-business/paFormChar/deleteById", params: { id: record.id }, }); }, }), ]; } let saveData = (values, fn) => { let newfields = JSON.parse(JSON.stringify(values)); //新增&修改 let difrid = iftype.val == "edit" || iftype.val == "editCondition" ? { id: curitem.id } : {}; let params, url; if (tabKey == "tab1") { params = iftype.val == "add" ? { ...newfields, formId: checkedNode?.key, fieldType: 1, } : { ...newfields, ...difrid, }; url = "/ngic-base-business/paFormField/save"; } else { if (iftype.val == "condition") { params = { ...newfields, formId: checkedNode?.key, }; url = "/ngic-base-business/paFormChar/save"; } else if (iftype.val == "editCondition") { params = { ...newfields, formId: checkedNode?.key, ...difrid, }; url = "/ngic-base-business/paFormChar/save"; } else if (iftype.val == "addcustomFields") { params = { ...newfields, formId: checkedNode?.key, fieldType: 2, formCharId: curitem.id, }; url = "/ngic-base-business/paFormField/save"; } else { params = { ...newfields, ...difrid, }; url = "/ngic-base-business/paFormField/save"; } } run({ url, params }); }; return ( <div> <Card tabList={tabList} activeTabKey={tabKey} onTabChange={(key) => { dispatch({ type: "changeTab", tabKey: key }); }} bordered={false} tabBarExtraContent={ <Button onClick={() => { let title; if (tabKey == "tab1") { for (let i in defaultFields) { defaultFields[i].value = null; } title = "新增公共字段"; dispatch({ type: "add", fields: defaultFields, title }); } else { for (let i in conditionFields) { conditionFields[i].value = null; } title = "新增条件字段"; dispatch({ type: "condition", fields: conditionFields, title }); } }} disabled={ !(checkedNode?.key && getPrem("bmNumberRule_save", "ifs")) } type="primary" > 新增 </Button> } > {tabKey == "tab1" && ( <Tableform columns={columns} path="/ngic-base-business/paFormField/queryList" actionRef={actionRef} extraparams={{ fieldType: 1, formId: checkedNode?.key }} bordered={false} ></Tableform> )} {tabKey == "tab2" && ( <Tableform columns={columnss} path="/ngic-base-business/paFormChar/queryList" actionRef={actionRef} extraparams={{ formId: checkedNode?.key }} expandable={{ expandedRowRender: (val) => { return ( <ExpandedRowRender columns={columns} tableRef={ChildRef} reloadChildren={reloadChildren} checkedNodeKey={checkedNode?.key} formCharId={formCharId} expanded={val.id == formCharId ? true : false} /> ); }, expandedRowKeys, }} bordered={false} onExpand={(expanded, record) => { if (expanded) { dispatch({ type: "changeFormCharId", formCharId: record.id, expandedRowKeys: [record.id], }); } else { dispatch({ type: "changeFormCharId", formCharId: record.id, expandedRowKeys: [], }); } }} ></Tableform> )} </Card> <DrawInitForm title={iftype.title} visible={vs} onClose={() => dispatch({ type: "close" })} footer={false} destroyOnClose={true} fields={fields} submitData={(values) => { saveData(values); }} onChange={(changedValues, allValues) => { //联动操作 }} submitting={loading || !vs} width={"60%"} > {(iftype.val == "edit" || iftype.val == "editCondition") && ( <div style={{ color: "#f50", marginBottom: 20 }}> <div>修改条件字段注意事项:</div> <div> 1. 修改条件字段中任一属性值内容提交后,仅新增该表单时才生效; </div> <div> 2. 修改前添加的表单数据(如:物料),查看与编辑时仍显示修改前信息,若需应用新的条件,需新增该表单数据; </div> <div> 修改条件字段后可能会影响到历史数据,为确保数据准确性,请谨慎操作! </div> </div> )} </DrawInitForm> </div> ); }; export default Fieldmanage;