Преглед изворни кода

Merge branch 'develop' of http://120.55.44.4:10080/xujunjie/GtDigManageWeb into develop

ZhaoJun пре 2 година
родитељ
комит
89f101d903

+ 7 - 7
src/app.tsx

@@ -113,13 +113,13 @@ export const request: RequestConfig = {
     (res: any) => {
       const resData = res.data;
       const { code, msg, data } = resData;
-      // if (code !== 200) {
-      //   let error: any = {};
-      //   error.name = 'AjaxError';
-      //   error.info = { code, msg, data };
-      //   // throw error;
-      //   return Promise.reject(error);
-      // }
+      if (code !== 200) {
+        let error: any = {};
+        error.name = 'AjaxError';
+        error.info = { code, msg, data };
+        // throw error;
+        return Promise.reject(error);
+      }
       return res;
     },
   ],

+ 2 - 1
src/components/DDComponents/InnerContactField/index.js

@@ -6,8 +6,9 @@ const { Option } = Select;
 
 function InnerContactField(props) {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const { value, onChange, disabled = false } = props;
   const { userList, run, loading } = useModel('userList');
   useEffect(() => {

+ 2 - 1
src/components/DDComponents/ManufacturerField/index.js

@@ -7,8 +7,9 @@ const { Option } = Select;
 
 function ManufacturerField(props) {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const { value, disabled = false, onChange } = props;
   //供应商列表
   const {

+ 2 - 1
src/components/UserDropdown/index.tsx

@@ -23,8 +23,9 @@ const RenderDropDown = (menu: any) => {
 
 export default function UserDropdown(props: any) {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   return (
     <div className={styles.root}>
       <Dropdown placement="top" dropdownRender={(menu) => RenderDropDown(menu)}>

+ 1 - 1
src/pages/ContractManager/component/AuditSteps.jsx

@@ -1,4 +1,4 @@
-import { Steps } from 'antd';
+import { Steps, Tooltip } from 'antd';
 const AuditSteps = (props) => {
   // const data =
   //   '[{"id":13,"desc":"","auditor":7,"AuditorUser":{"UserName":"admin","CName":"管理员","Title":"","Mobile":"13426370450","Email":"123123@qq.com","Status":1,"IsSuper":true,"DepId":"undefined","Dep":null,"Password":"4297f44b13955235245b2497399d7a93","QyWxUserId":"HanTangHeYing","DingUserId":"","Role":null,"RoleNames":"","ID":7,"CreatedBy":0,"CreatedOn":"2019-10-04T16:48:04+08:00","UpdatedBy":0,"UpdatedOn":"2022-06-17T14:23:15+08:00","DeletedBy":0,"DeletedOn":null,"DeletedFlag":0,"DefaultProject":"","ForbiddenModule":0,"IsDepLeader":0,"UserType":0,"Permission":null,"Permissions":null,"is_leader":0,"is_accountant":0,"is_opt_mgr":0,"is_wty_mgr":0},"seq":1,"oa_id":7,"seq_name":"审批1","audit_time":"1970-01-01T08:00:00+08:00"},{"id":14,"desc":"","auditor":7,"AuditorUser":{"UserName":"admin","CName":"管理员","Title":"","Mobile":"13426370450","Email":"123123@qq.com","Status":1,"IsSuper":true,"DepId":"undefined","Dep":null,"Password":"4297f44b13955235245b2497399d7a93","QyWxUserId":"HanTangHeYing","DingUserId":"","Role":null,"RoleNames":"","ID":7,"CreatedBy":0,"CreatedOn":"2019-10-04T16:48:04+08:00","UpdatedBy":0,"UpdatedOn":"2022-06-17T14:23:15+08:00","DeletedBy":0,"DeletedOn":null,"DeletedFlag":0,"DefaultProject":"","ForbiddenModule":0,"IsDepLeader":0,"UserType":0,"Permission":null,"Permissions":null,"is_leader":0,"is_accountant":0,"is_opt_mgr":0,"is_wty_mgr":0},"seq":2,"oa_id":7,"seq_name":"审批2","audit_time":"1970-01-01T08:00:00+08:00"}]';

+ 90 - 0
src/pages/ContractManager/component/DraftModal.jsx

@@ -0,0 +1,90 @@
+import { Modal, Table, Space, Divider, message } from 'antd';
+import { useRequest, useModel } from '@umijs/max';
+import { queryContractDraft } from '@/services/contract';
+import { queryDelDraft } from '../../../services/contract';
+import { useEffect } from 'react';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
+
+const DraftModal = ({ open, onCancel, onOk }) => {
+  const [modal, contextHolder] = Modal.useModal();
+  const columns = [
+    {
+      title: '合同名称',
+      dataIndex: 'name',
+      key: 'name',
+      width: 100,
+    },
+    {
+      title: '操作',
+      width: '40%',
+      align: 'center',
+      render: (record) => {
+        return (
+          <Space>
+            <a onClick={() => handlerOk(record)}>打开</a>
+            <a onClick={() => handleDel(record.id)}>删除</a>
+          </Space>
+        );
+      },
+    },
+  ];
+
+  const handleDel = (id) => {
+    modal.confirm({
+      icon: <ExclamationCircleOutlined />,
+      title: '提示:',
+      content: <div>确定删除草稿!</div>,
+      onOk: () => runDel({ id }),
+    });
+  };
+
+  useEffect(() => {
+    if (open) runList();
+  }, [open]);
+
+  const {
+    data,
+    loading,
+    run: runList,
+  } = useRequest(queryContractDraft, {
+    formatResult: (res) => {
+      if (res?.data) {
+        return res.data?.list;
+      }
+    },
+  });
+
+  const { run: runDel } = useRequest(queryDelDraft, {
+    manual: true,
+    onSuccess: (res) => {
+      message.success('删除成功');
+      runList();
+    },
+  });
+
+  const handlerOk = (record) => {
+    const data = JSON.parse(record.content);
+    onOk(data);
+  };
+
+  return (
+    <Modal
+      title="草稿箱"
+      open={open}
+      footer={null}
+      onCancel={onCancel}
+      onOk={onOk}
+      width={700}
+    >
+      <Table
+        dataSource={data}
+        columns={columns}
+        loading={loading}
+        pagination={false}
+      />
+      {contextHolder}
+    </Modal>
+  );
+};
+
+export default DraftModal;

+ 91 - 263
src/pages/ContractManager/component/Modal.jsx

@@ -38,7 +38,7 @@ export const Type = {
   add: 0, //新增
   detail: 1, //详情
   cancel: 2, //作废
-  check: 3, //审核
+  save: 3, //保存草稿
 };
 
 export const StatusText = [
@@ -61,13 +61,10 @@ export const Status = {
   CalCheckSuccess: 6,
 };
 
-let isInLine = location.host.includes('work.greentech.com');
-
 const ContractModal = (props) => {
   const [form] = Form.useForm();
-  const {
-    initialState: { user },
-  } = useModel('@@initialState');
+  const { initialState } = useModel('@@initialState');
+  const user = initialState?.user || {};
   const { userList, run: userListRun } = useModel('userList');
   const { depList, run: depListRun } = useModel('depList');
   const [auditList, setAuditList] = useState([]);
@@ -96,8 +93,6 @@ const ContractModal = (props) => {
       ID: '行政部',
     },
   ];
-
-  const [isPass, setIsPass] = useState(1);
   const [companyDepList, setCompanyDepList] = useState(depList || []);
   const [archivesDepList, setArchivesDepList] = useState(archivesOptions);
   const [dealDisable, setDealDisable] = useState(false);
@@ -120,76 +115,38 @@ const ContractModal = (props) => {
   const parent_code = Form.useWatch('parent_code', form);
 
   //审批流拼接
-  const formData = isInLine
-    ? [
-        {
-          name: '是否本部',
-          id: 'DDSelectField_4ad8bda8-60ce-428b-88a3-bf1a18c24a50',
-          type: 'DDSelectField',
-          value: ['是'],
-        },
-        {
-          name: '合同归档部门',
-          id: 'DDSelectField_3b661423-9fb8-4498-9eda-bcadf2d98473',
-          type: 'DDSelectField',
-          value: ['财务部'],
-        },
-        {
-          name: '合同编码',
-          id: 'TextField_f73531d8-c2c0-4769-a8ef-68b2eae2dc3a',
-          type: 'TextField',
-          value: ['1'],
-        },
-        {
-          name: '提审类型',
-          id: 'DDSelectField_bed77d5f-d02c-4f1d-98bf-0638245a3331',
-          type: 'DDSelectField',
-          value: ['1'],
-        },
-      ]
-    : [
-        {
-          name: '是否本部',
-          id: 'DDSelectField_4fbddb04-9b4f-4281-991b-5047f835fb9d',
-          type: 'DDSelectField',
-          value: ['是'],
-        },
-        {
-          name: '合同归档部门',
-          id: 'DDSelectField_1235c6b9-9d74-4856-a62d-6ca1bb9716a6',
-          type: 'DDSelectField',
-          value: ['财务部'],
-        },
-        {
-          name: '合同编码',
-          id: 'TextField_1a01000b-4458-4dfb-bd13-74a74e7a33e5',
-          type: 'TextField',
-          value: ['1'],
-        },
-        {
-          name: '提审类型',
-          id: 'DDSelectField_c79e124c-c933-4ea1-b799-faceaf830a9b',
-          type: 'DDSelectField',
-          value: ['1'],
-        },
-      ];
+  const formData = [
+    {
+      name: '是否本部',
+      id: 'DDSelectField_4ad8bda8-60ce-428b-88a3-bf1a18c24a50',
+      type: 'DDSelectField',
+      value: ['是'],
+    },
+    {
+      name: '合同归档部门',
+      id: 'DDSelectField_3b661423-9fb8-4498-9eda-bcadf2d98473',
+      type: 'DDSelectField',
+      value: ['财务部'],
+    },
+    {
+      name: '合同编码',
+      id: 'TextField_f73531d8-c2c0-4769-a8ef-68b2eae2dc3a',
+      type: 'TextField',
+      value: ['1'],
+    },
+    {
+      name: '提审类型',
+      id: 'DDSelectField_bed77d5f-d02c-4f1d-98bf-0638245a3331',
+      type: 'DDSelectField',
+      value: ['1'],
+    },
+  ];
 
   //计算审批流数据
   const advance = {
-    flow_id: isInLine ? 47 : 40,
+    flow_id: 47,
     form_list: null,
-    // node_level_id:0,
-    // id:0,
-    // project_id:0,
-    // cur_template_node_id:0,
-    // next_template_node_id:0,
-    // template_node_id:0,
-    // flow_path:null,
-    // template_id:0,
-    // cur_template_id:0,
-    // next_template_id:0,
     formComponentValues: '',
-    // audit_list:[],
   };
 
   //旧审批流兼容
@@ -316,7 +273,6 @@ const ContractModal = (props) => {
 
   useEffect(() => {
     if (!visible) {
-      setIsPass(1);
       setDealDisable(false);
       setAuditList([]);
       setCompanyDepList([]);
@@ -329,6 +285,14 @@ const ContractModal = (props) => {
     }
   }, [visible]);
 
+  useEffect(() => {
+    //兼容之前选择的所属部门,用的现在的接口匹配不到部门显示数字的问题
+    if (data?.company_id) {
+      const deps = getDepItemById(data?.company_id)?.children;
+      setCompanyDepList(deps);
+    }
+  }, [data, depList]);
+
   useEffect(() => {
     form.resetFields();
     if (data?.status >= Status.Checking) runAudit({ extend_code: data.code });
@@ -358,17 +322,7 @@ const ContractModal = (props) => {
       (data?.status == Status.CheckReject && forceModify)
     )
       return true;
-    let currentAuditUserID;
-    if (data?.status == Status.Checking && auditData) {
-      const { OaAuditList, audit_status } = auditData;
-      currentAuditUserID = OaAuditList[audit_status]?.auditor;
-    } else if (data?.status == Status.CalChecking && auditCelData) {
-      const { OaAuditList, audit_status } = auditCelData;
-      currentAuditUserID = OaAuditList[audit_status]?.auditor;
-    }
-    if (user.ID == currentAuditUserID) return true;
-    return false;
-  }, [user, data, auditData, auditCelData, forceModify]);
+  }, [data, type, forceModify]);
 
   useEffect(() => {
     if (
@@ -438,6 +392,7 @@ const ContractModal = (props) => {
     runAuditList(param);
   }, [company, archives_dep]);
 
+  //根据项目名称填充项目编号逻辑
   useEffect(() => {
     if (
       type !== Type.add &&
@@ -464,9 +419,9 @@ const ContractModal = (props) => {
     if (forceModify && data?.status == Status.CheckReject) {
       return { contract: false, recall: false };
     }
-    if (data?.status == Status.ReCall) {
-      return { contract: false, recall: true };
-    }
+    // if (data?.status == Status.ReCall) {
+    //   return { contract: false, recall: true };
+    // }
     if (data?.status > Status.None) {
       return { contract: true, recall: true };
     }
@@ -574,24 +529,32 @@ const ContractModal = (props) => {
         values.created_by = user?.ID;
         values.id = data?.id;
         handleOk(values, Type.add, form, audit_list);
-      } else if (data?.status == Status.Checking) {
-        let result = {
-          id: auditData?.id,
-          status: values.is_pass,
-          desc: '',
-        };
-        handleOk(result, Type.check, data?.status);
-      } else if (data?.status == Status.CalChecking) {
-        let result = {
-          id: auditCelData?.id,
-          status: values.is_pass,
-          desc: '',
-        };
-        handleOk(result, Type.check, data?.status);
       }
     });
   };
 
+  const handleSaveDraft = () => {
+    let values = form.getFieldsValue();
+    if (!values.name) {
+      message.error('请填写合同名称!');
+      return;
+    }
+    Object.keys(values).forEach((key) => {
+      if (Array.isArray(values[key]))
+        values[key].length == 0
+          ? delete values[key]
+          : (values[key] = JSON.stringify(values[key]));
+    });
+    if (values.effect_on)
+      values.effect_on = dayjs(values.effect_on).format(FORMAT);
+    const params = {
+      name: values.name,
+      content: JSON.stringify(values),
+    };
+    if (data?.id) params.id = data?.id;
+    handleOk(params, Type.save);
+  };
+
   const getDepItemById = (id) => {
     const fun = (list) => {
       for (let i = 0; i < list.length; i++) {
@@ -619,7 +582,7 @@ const ContractModal = (props) => {
   const renderFooter = () => {
     return (
       <Space>
-        {data?.status == Status.Checking && type !== Type.check && (
+        {data?.status == Status.Checking && (
           <Button onClick={() => handlerReCall(auditData?.id)}>撤回</Button>
         )}
         <Button
@@ -640,6 +603,11 @@ const ContractModal = (props) => {
             修改
           </Button>
         )}
+        {type == Type.add && (
+          <Button type="primary" onClick={handleSaveDraft}>
+            保存草稿
+          </Button>
+        )}
         <Button type="primary" onClick={handleSubmit} disabled={!isSuper}>
           提交
         </Button>
@@ -678,7 +646,10 @@ const ContractModal = (props) => {
                 name="company_id"
                 label="所属公司:"
                 tooltip="请选择该存档合同所属公司"
-                initialValue={data?.company_id}
+                initialValue={
+                  //不可编辑的时候直接赋值为company_name
+                  !disableds.contract ? data?.company_id : data?.company_name
+                }
                 rules={[
                   {
                     required: true,
@@ -690,7 +661,7 @@ const ContractModal = (props) => {
                   showSearch
                   style={{ width: '100%' }}
                   placeholder="请选择"
-                  disabled={disableds.contract || disableds.recall}
+                  disabled={disableds.contract}
                   filterOption={(input, option) =>
                     (option?.label ?? '')
                       .toLowerCase()
@@ -724,24 +695,7 @@ const ContractModal = (props) => {
                   },
                 ]}
               >
-                <Select
-                  showSearch
-                  style={{ width: '100%' }}
-                  placeholder="请选择"
-                  disabled={disableds.contract || disableds.recall}
-                  filterOption={(input, option) =>
-                    (option?.label ?? '')
-                      .toLowerCase()
-                      .includes(input.toLowerCase())
-                  }
-                  options={companyDepList?.map((item) => {
-                    return {
-                      value: item.ID,
-                      label: item.Name,
-                    };
-                  })}
-                />
-                {/* <TreeSelect
+                <TreeSelect
                   style={{ width: '100%' }}
                   placeholder="请选择"
                   showSearch
@@ -751,10 +705,10 @@ const ContractModal = (props) => {
                     value: 'ID',
                     children: 'children',
                   }}
-                  disabled={disableds.contract || disableds.recall}
+                  disabled={disableds.contract}
                   dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
                   treeData={companyDepList}
-                /> */}
+                />
               </Form.Item>
             </Col>
           </Row>
@@ -789,24 +743,7 @@ const ContractModal = (props) => {
                   },
                 ]}
               >
-                <Select
-                  showSearch
-                  style={{ width: '100%' }}
-                  placeholder="请选择"
-                  disabled={disableds.contract}
-                  filterOption={(input, option) =>
-                    (option?.label ?? '')
-                      .toLowerCase()
-                      .includes(input.toLowerCase())
-                  }
-                  options={companyDepList?.map((item) => {
-                    return {
-                      value: item.ID,
-                      label: item.Name,
-                    };
-                  })}
-                />
-                {/* <TreeSelect
+                <TreeSelect
                   style={{ width: '100%' }}
                   placeholder="请选择"
                   showSearch
@@ -819,7 +756,7 @@ const ContractModal = (props) => {
                   }}
                   dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
                   treeData={companyDepList}
-                /> */}
+                />
               </Form.Item>
             </Col>
           </Row>
@@ -839,7 +776,7 @@ const ContractModal = (props) => {
                   },
                 ]}
               >
-                <Radio.Group disabled={disableds.contract || disableds.recall}>
+                <Radio.Group disabled={disableds.contract}>
                   <Radio value={1}>是</Radio>
                   <Radio value={0}>否</Radio>
                 </Radio.Group>
@@ -861,7 +798,9 @@ const ContractModal = (props) => {
               <Form.Item
                 name="effect_on"
                 label="合同签订日期:"
-                initialValue={data?.effect_on}
+                initialValue={
+                  data?.effect_on ? dayjs(data?.effect_on, FORMAT) : ''
+                }
                 tooltip="合同主体各方签字盖章完成之日,以最后签字盖章的为准"
                 rules={[
                   {
@@ -870,14 +809,10 @@ const ContractModal = (props) => {
                   },
                 ]}
               >
-                {type == Type.add ? (
-                  <DatePicker
-                    style={{ width: '100%' }}
-                    disabled={disableds.contract}
-                  />
-                ) : (
-                  <Input disabled={disableds.contract} />
-                )}
+                <DatePicker
+                  style={{ width: '100%' }}
+                  disabled={disableds.contract}
+                />
               </Form.Item>
               <Form.Item
                 name="project_name"
@@ -949,10 +884,7 @@ const ContractModal = (props) => {
                     : []
                 }
               >
-                <Input
-                  placeholder="请填写"
-                  disabled={disableds.contract || disableds.recall}
-                />
+                <Input placeholder="请填写" disabled={disableds.contract} />
               </Form.Item>
               <Form.Item
                 name="code"
@@ -1021,7 +953,7 @@ const ContractModal = (props) => {
             name="party_c"
             label="丙方(及其他):"
             tooltip="可多选。合同主体可以下拉选择,可选项需要经办人在“主页--供应商管理”中创建。经办人可以维护和更新供应商信息。"
-            initialValue={data?.party_c ? data?.party_c.split(',') : []}
+            initialValue={data?.party_c ? data?.party_c?.split(',') : []}
             labelCol={{ span: 4 }}
           >
             <Select
@@ -1155,58 +1087,6 @@ const ContractModal = (props) => {
               </div>
             </>
           )}
-          {isSuper && data.status == Status.Checking && (
-            <>
-              <ModuleTitle title="审核情况" />
-              <Row>
-                <Col span={10} offset={1}>
-                  <Form.Item
-                    name="check_by"
-                    initialValue={user?.CName}
-                    label="审核人:"
-                  >
-                    <Input disabled />
-                  </Form.Item>
-                  <Form.Item name="is_pass" initialValue={1} label="审核意见:">
-                    <Select
-                      onChange={(e) => {
-                        setIsPass(e);
-                      }}
-                      style={{ width: '100%' }}
-                      options={[
-                        {
-                          value: 1,
-                          label: '同意',
-                        },
-                        {
-                          value: 2,
-                          label: '拒绝',
-                        },
-                      ]}
-                    />
-                  </Form.Item>
-                </Col>
-                <Col span={10}>
-                  <Form.Item
-                    name="check_date"
-                    initialValue={dayjs().format(FORMAT)}
-                    label="审核时间:"
-                  >
-                    <Input disabled />
-                  </Form.Item>
-                </Col>
-              </Row>
-              {isPass == 2 && (
-                <Form.Item
-                  name="check_desc"
-                  label="拒绝原因:"
-                  labelCol={{ span: 4 }}
-                >
-                  <Input.TextArea />
-                </Form.Item>
-              )}
-            </>
-          )}
           {(type == Type.cancel || data?.status >= Status.CalChecking) && (
             <>
               <ModuleTitle title="作废信息" />
@@ -1253,58 +1133,6 @@ const ContractModal = (props) => {
               </div>
             </>
           )}
-          {isSuper && data.status == Status.CalChecking && (
-            <>
-              <ModuleTitle title="审核情况" />
-              <Row>
-                <Col span={10} offset={1}>
-                  <Form.Item
-                    name="cancel_check_by"
-                    initialValue={user?.CName}
-                    label="审核人:"
-                  >
-                    <Input disabled />
-                  </Form.Item>
-                  <Form.Item name="is_pass" initialValue={1} label="审核意见:">
-                    <Select
-                      onChange={(e) => {
-                        setIsPass(e);
-                      }}
-                      style={{ width: '100%' }}
-                      options={[
-                        {
-                          value: 1,
-                          label: '同意',
-                        },
-                        {
-                          value: 0,
-                          label: '拒绝',
-                        },
-                      ]}
-                    />
-                  </Form.Item>
-                </Col>
-                <Col span={10}>
-                  <Form.Item
-                    name="check_date"
-                    initialValue={dayjs().format(FORMAT)}
-                    label="审核时间:"
-                  >
-                    <Input disabled />
-                  </Form.Item>
-                </Col>
-              </Row>
-              {!isPass && (
-                <Form.Item
-                  name="cancel_check_result"
-                  label="拒绝原因:"
-                  labelCol={{ span: 4 }}
-                >
-                  <Input.TextArea />
-                </Form.Item>
-              )}
-            </>
-          )}
           {(type == Type.add || data?.status == Status.ReCall || forceModify) &&
             auditList.length > 0 && (
               <>

+ 42 - 40
src/pages/ContractManager/index.jsx

@@ -21,6 +21,7 @@ import {
   queryContractCancelCheck,
   queryContractCheck,
   queryContractDownload,
+  queryContractSaveDraft,
   queryDelById,
   queryGetContractList,
   queryOAReCall,
@@ -33,6 +34,7 @@ import EllipsisText from './component/EllipsisText';
 import { stringify } from 'qs';
 import { audit, createAduit } from '@/services/boom';
 import { ExclamationCircleOutlined } from '@ant-design/icons';
+import DraftModal from './component/DraftModal';
 
 const ConteactManager = (props) => {
   const { dispatch } = props;
@@ -44,9 +46,8 @@ const ConteactManager = (props) => {
     current: 1,
     name: '',
   });
-  const {
-    initialState: { user },
-  } = useModel('@@initialState');
+  const { initialState } = useModel('@@initialState');
+  const user = initialState?.user || {};
   const [visible, setVisible] = useState(false);
   const [detail, setDetail] = useState({});
   const [data, setData] = useState([]);
@@ -57,6 +58,8 @@ const ConteactManager = (props) => {
   const [fileViewerData, setFileViewerData] = useState();
   const [modal, contextHolder] = Modal.useModal();
 
+  const [draftOpen, setDraftOpen] = useState(false);
+
   const showBtn = (record, type) => {
     let bool = false;
     switch (type) {
@@ -284,40 +287,6 @@ const ConteactManager = (props) => {
     },
   });
 
-  // //作废审核
-  // const { run: calCheckRun } = useRequest(
-  //   (data) => queryContractCancelCheck(data),
-  //   {
-  //     manual: true,
-  //     onSuccess: () => {
-  //       message.success('审核成功');
-  //       setVisible(false);
-  //       run(searchData);
-  //     },
-  //     onError: () => {
-  //       message.success('审核失败');
-  //     },
-  //   },
-  // );
-
-  // //审核合同
-  // const { run: runCheck, loading: checkLoading } = useRequest(
-  //   (data) => queryContractCheck(data),
-  //   {
-  //     manual: true,
-  //     onSuccess: () => {
-  //       // conAuditRun({ multi_status: '1,4', currentPage: 1, page_size: 10 });
-  //       // conAuditedRun({ check_by: user.CName });
-  //       setVisible(false);
-  //       run(searchData);
-  //       message.success('审核成功');
-  //     },
-  //     onErroe: () => {
-  //       message.error('审核失败');
-  //     },
-  //   },
-  // );
-
   //审核合同
   const { run: runOACheck } = useRequest(audit, {
     manual: true,
@@ -344,9 +313,21 @@ const ConteactManager = (props) => {
 
   //发起OA审批
   const { run: createRun } = useRequest(
-    (data) => createAduit({ ...data, flow_id: 40, cc_list: [], files: '' }),
+    (data) => createAduit({ ...data, flow_id: 47, cc_list: [], files: '' }),
+    {
+      manual: true,
+    },
+  );
+
+  //保存草稿
+  const { run: saveDraftRun } = useRequest(
+    (data) => queryContractSaveDraft(data),
     {
       manual: true,
+      onSuccess: (res) => {
+        setVisible(false);
+        message.success('保存成功');
+      },
     },
   );
 
@@ -410,6 +391,14 @@ const ConteactManager = (props) => {
     );
   };
 
+  const handleDraftOpen = (data) => {
+    console.log(data);
+    setDraftOpen(false);
+    typeRef.current = Type.add;
+    setDetail(data);
+    setVisible(true);
+  };
+
   const handleQueryChildren = async (req) => {
     const res = await queryGetContractList(req);
     if (res?.data?.list) {
@@ -449,12 +438,14 @@ const ConteactManager = (props) => {
         extend_code: data.code,
         extend_type: 0, //归档提交
       });
+    } else if (type == Type.save) {
+      saveDraftRun(data);
     }
   };
 
   const handlerReCall = async (id) => {
     modal.confirm({
-      icon: <ExclamationCircleOutlined />,
+      icon: <ExclamationCircleOutlined ined />,
       title: '提示:',
       content: <div>确定撤回合同存档审批!</div>,
       onOk: async () => {
@@ -462,7 +453,9 @@ const ConteactManager = (props) => {
         if (res.code == 200) {
           message.success('撤回成功');
           setVisible(false);
-          run(searchData);
+          setTimeout(() => {
+            run(searchData);
+          }, 1000);
         } else {
           message.success('撤回失败,请重试');
         }
@@ -550,6 +543,7 @@ const ConteactManager = (props) => {
         </Button>
         <Button
           type="primary"
+          className={styles.searchBtnSty}
           onClick={() => {
             typeRef.current = Type.add;
             setDetail({});
@@ -558,6 +552,9 @@ const ConteactManager = (props) => {
         >
           新增
         </Button>
+        <Button type="primary" onClick={() => setDraftOpen(true)}>
+          草稿箱
+        </Button>
         <Button
           type="primary"
           className={styles.exportBtnSty}
@@ -600,6 +597,11 @@ const ConteactManager = (props) => {
           setFileViewerVisible(false);
         }}
       />
+      <DraftModal
+        open={draftOpen}
+        onOk={handleDraftOpen}
+        onCancel={() => setDraftOpen(false)}
+      />
       {contextHolder}
     </PageContent>
   );

+ 2 - 1
src/pages/FileManagement/index.js

@@ -61,8 +61,9 @@ function FileManagement(props) {
   const [form] = Form.useForm();
   const [modal, contextHolder] = Modal.useModal();
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const { userList, run: userListRun } = useModel('userList');
   const [tableData, setTableData] = useState([]);
   const [visible, setVisible] = useState(false);

+ 2 - 1
src/pages/Flow/Audit.js

@@ -18,8 +18,9 @@ function Audit(props) {
   const [tabActiveKey, setTabActiveKey] = useState('1');
   const ref = useRef();
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const permission = user?.Permission || {};
 
   const curItem = useMemo(() => {

+ 2 - 2
src/pages/Flow/OaAuditDetail.js

@@ -14,9 +14,9 @@ import { queryContractDetail } from '../../services/contract';
 
 function OaAuditDetail() {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
-
+  const user = initialState?.user || {}
   const [auditVisible, setAuditVisible] = useState(false);
   const location = useLocation();
   const {

+ 1 - 1
src/pages/Home/index.js

@@ -90,7 +90,7 @@ function HomePage(props) {
       name: '个人中心',
       active: true,
       click: () => {
-        navigate('/profile/apply');
+        navigate('/profile');
       },
       Icon: require('@/assets/UnityMenu/userCenter.png'),
     },

+ 2 - 1
src/pages/ManufacturerMng/ManufacturerList.js

@@ -28,8 +28,9 @@ import {
 function ManufacturerList(props) {
   const { projectId = 1, data } = props;
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const [visible, setVisible] = useState(false);
   const [curItem, setCurItem] = useState(null);
   const [formDisabled, setFormDisabled] = useState(false);

+ 2 - 1
src/pages/Profile/apply.js

@@ -33,8 +33,9 @@ const TYPE = {
 };
 function Apply(props) {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const [tabActive, setTabActive] = useState('1');
   const [detail, setDetail] = useState({});
   const [conVisible, setConVisible] = useState(false);

+ 2 - 1
src/pages/Profile/approve.js

@@ -35,8 +35,9 @@ const TYPE = {
 };
 function Approve(props) {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const [tabActive, setTabActive] = useState('1');
   const [detail, setDetail] = useState({});
   const [conVisible, setConVisible] = useState(false);

+ 2 - 1
src/pages/Profile/approved.js

@@ -25,7 +25,8 @@ const TYPE = {
   OA: 2,
 };
 function Approved(props) {
-  const { initialState: { user }  } = useModel('@@initialState');
+  const { initialState  } = useModel('@@initialState');
+  const user = initialState?.user || {}
   // const [tabActive, setTabActive] = useState('1');
   // const [detail, setDetail] = useState({});
   const [conVisible, setConVisible] = useState(false);

+ 2 - 1
src/pages/UserCenter/index.js

@@ -5,8 +5,9 @@ import { useState } from 'react';
 
 const ChangePassWord = () => {
   const {
-    initialState: { user },
+    initialState,
   } = useModel('@@initialState');
+  const user = initialState?.user || {}
   const navigate = useNavigate();
 
   const onFinish = async (values) => {

+ 21 - 0
src/services/contract.js

@@ -106,3 +106,24 @@ export const queryContractDetail = async (data) => {
     params: data,
   });
 };
+
+//保存草稿
+export const queryContractSaveDraft = async (data) => {
+  return await request('/api/contract/v1/draft', {
+    method: 'POST',
+    data,
+  });
+};
+//删除草稿?id=1
+export const queryDelDraft = async (data) => {
+  return await request(`/api/contract/v1/draft`, {
+    method: 'DELETE',
+    params: data,
+  });
+};
+//草稿列表/api/contract/v1/draft
+export const queryContractDraft = async (data) => {
+  return await request(`/api/contract/v1/draft`, {
+    params: data,
+  });
+};