xujunjie 1 жил өмнө
parent
commit
075ccde50c

+ 22 - 16
src/pages/PurchaseAdmin/PurchaseList/Approval/ApprovalModal.js

@@ -143,31 +143,37 @@ function AddModal(props) {
             ))}
           </Select>
         </Form.Item>
-        <Form.Item
-          label="项目客户"
-          name="supplier_id"
-          initialValue={data.supplier_id}
-          rules={[{ required: true, message: '请选择项目客户' }]}
-        >
-          <Select style={{ width: '100%' }} onChange={e => form.setFieldsValue({ supplier_id: e })}>
-            {supplierList.map(item => (
-              <Option key={item.id} value={item.id}>
-                {item.name}({item.id})
-              </Option>
-            ))}
-          </Select>
+        <div style={{ position: 'relative' }}>
+          <Form.Item
+            label="项目客户"
+            name="supplier_id"
+            initialValue={data.supplier_id}
+            rules={[{ required: true, message: '请选择项目客户' }]}
+          >
+            <Select
+              style={{ width: '100%' }}
+              onChange={e => form.setFieldsValue({ supplier_id: e })}
+            >
+              {supplierList.map(item => (
+                <Option key={item.id} value={Number(item.id)}>
+                  {item.name}({item.id})
+                </Option>
+              ))}
+            </Select>
+          </Form.Item>
           <Button
-            style={{ position: 'absolute', right: ' -95px' }}
+            style={{ position: 'absolute', right: ' -18px', top: '0' }}
             type="primary"
             onClick={onAddFirm}
           >
             新建客户
           </Button>
-        </Form.Item>
+        </div>
+
         <Form.Item
           label="项目规模"
           name="process_info"
-          // initialValue={String(data.industry_id || '')}
+          initialValue={data.process_info}
           rules={[{ required: true, message: '请填写项目规模' }]}
         >
           <TableRender />

+ 215 - 52
src/pages/PurchaseAdmin/PurchaseList/Approval/DetailModal.js

@@ -8,6 +8,7 @@ import { STATUS, SUB_STATUS } from './List';
 import { async } from '@antv/x6/lib/registry/marker/async';
 import { queryStatusHistory } from '@/services/approval';
 import { UploadOutlined } from '@ant-design/icons';
+import { startExecution, startOperate, startQuality } from '@/services/approval';
 
 const { Step } = Steps;
 // 新建
@@ -22,6 +23,7 @@ function DetailModal(props) {
     isEdit,
     flowList = [],
     disabled,
+    currentUser,
     loading,
   } = props;
   const [codes, setCodes] = useState({
@@ -34,40 +36,6 @@ function DetailModal(props) {
   const [params, setParams] = useState({});
   const [statusList, setStatusHistory] = useState([]);
 
-  const subSelectOptions = {
-    0: [
-      { value: 1, label: '预算和方式' },
-      { value: 7, label: '放弃' },
-      { value: 8, label: '失败' },
-      { value: 9, label: '关闭' },
-    ],
-    1: [
-      { value: 2, label: '招标' },
-      { value: 7, label: '放弃' },
-      { value: 8, label: '失败' },
-      { value: 9, label: '关闭' },
-    ],
-    2: [
-      { value: 3, label: '中标' },
-      { value: 8, label: '失败' },
-      { value: 9, label: '关闭' },
-    ],
-    3: [
-      { value: 4, label: '转执行' },
-      { value: 9, label: '关闭' },
-    ],
-    4: [
-      { value: 5, label: '转运营' },
-      { value: 6, label: '转质保' },
-      { value: 9, label: '关闭' },
-    ],
-    5: [
-      { value: 6, label: '转质保' },
-      { value: 9, label: '关闭' },
-    ],
-    6: [{ value: 9, label: '关闭' }],
-  };
-
   useEffect(() => {
     if (!visible || !data.id) return;
     setCodes({
@@ -79,11 +47,193 @@ function DetailModal(props) {
     });
     setParams({
       project_status: data?.project_status,
-      sub_status: data?.status,
+      // status: data?.status,
     });
     if (data?.id) initStatueHistory(data.id);
   }, [data, visible]);
 
+  const canEdit = useMemo(() => {
+    if (!data || !currentUser) return false;
+    let { audit_status, project_status } = data;
+
+    if (currentUser.IsSuper) return true;
+    switch (audit_status) {
+      case 0:
+        return currentUser.ID == data.author;
+      case 1:
+        return false;
+      case 2:
+        if (project_status == 0) return currentUser.ID == data.author;
+        if (project_status == 1) return currentUser.ID == data.LeaderId;
+        return false;
+      case 3:
+        switch (project_status) {
+          case 0:
+            return currentUser.ID == data.author;
+          case 1:
+            return currentUser.ID == data.LeaderId;
+          case 2:
+            return currentUser.ID == data.LeaderId || currentUser.ID == data.opt_manager_id;
+          case 3:
+            return currentUser.ID == data.LeaderId || currentUser.ID == data.wty_manager_id;
+        }
+        return false;
+    }
+  }, [currentUser, data, isEdit]);
+  const promise = useMemo(() => {
+    if (!data || !currentUser) return false;
+    let { audit_status, project_status, type_id } = data;
+    console.log('============', data);
+    let permission = currentUser.Permission;
+    let showModifyManager = false;
+    let showEditBtn = false;
+    let showMember = false;
+    let showStatus = false;
+    let showExecution = false;
+    if (isEdit) {
+      if (
+        (project_status === 0 || project_status === 1) &&
+        (permission['func-01-point-pm-list-change'] || currentUser.IsSuper)
+      ) {
+        showModifyManager = true;
+      }
+
+      switch (audit_status) {
+        //审核拒绝
+        case 2:
+          if (project_status == 0 && canEdit) showEditBtn = true;
+          else if (project_status == 1 && canEdit) {
+            showMember = true;
+            showStatus = true;
+          }
+          break;
+        //审核通过
+        case 3:
+          switch (project_status) {
+            //售前
+            case 0:
+              if (canEdit) {
+                showMember = true;
+                showExecution = true;
+              }
+              break;
+            //转执行
+            case 1:
+              if (canEdit) {
+                showMember = true;
+                showStatus = true;
+              }
+              break;
+            //转运营
+            case 2:
+            case 3:
+              if (canEdit) {
+                showMember = true;
+              }
+              break;
+          }
+          break;
+      }
+    }
+
+    return { showModifyManager, showEditBtn, showMember, showStatus, showExecution };
+  }, [currentUser, data, isEdit]);
+  const statusOptions = useMemo(() => {
+    if (!data?.id) return [];
+    const { showStatus, showExecution } = promise;
+    const execution = showExecution ? { value: 11, label: '转执行' } : null;
+    const ops = showStatus ? { value: 21, label: '转运营' } : null;
+    const qualityOperate = showStatus ? { value: 31, label: '转质保' } : null;
+    let subSelectOptions = {
+      0: [
+        { value: 1, label: '初步交流' },
+        { value: 42, label: '放弃' },
+        { value: 41, label: '失败' },
+        { value: 43, label: '关闭' },
+      ],
+      1: [
+        { value: 2, label: '预算和方式' },
+        { value: 42, label: '放弃' },
+        { value: 41, label: '失败' },
+        { value: 43, label: '关闭' },
+      ],
+      2: [
+        { value: 3, label: '招标' },
+        { value: 42, label: '放弃' },
+        { value: 41, label: '失败' },
+        { value: 43, label: '关闭' },
+      ],
+      3: [
+        { value: 4, label: '中标' },
+        { value: 41, label: '失败' },
+        { value: 43, label: '关闭' },
+      ],
+      4: [execution, { value: 43, label: '关闭' }],
+      // 11 转执行
+      11: [ops, qualityOperate, { value: 43, label: '关闭' }],
+      // 21 转运营
+      21: [qualityOperate, { value: 43, label: '关闭' }],
+      // 31 转质保
+      31: [{ value: 43, label: '关闭' }],
+      // 41 失败
+      // 42 放弃
+      // 43 关闭
+    };
+
+    return (subSelectOptions[data.status] || []).filter(item => item); // 过滤无权限选项
+  }, [promise]);
+
+  const renderManage = () => {
+    let label = '';
+    if (params.status == 11) {
+      label = '项目经理';
+    } else if (params.status == 21) {
+      label = '运营经理';
+    } else if (params.status == 31) {
+      label = '质保经理';
+    }
+    if (!label) return null;
+    return (
+      <>
+        <Form.Item
+          label={label}
+          name="managerID"
+          rules={[{ required: true, message: `请选择${label}` }]}
+        >
+          <TreeSelect
+            showSearch
+            allowClear
+            style={{ width: '100%' }}
+            placeholder={`请选择${label}`}
+            multiple={false}
+            filterTreeNode={(input, option) => {
+              return option.props.title === input;
+            }}
+            treeData={depUserTree}
+          />
+        </Form.Item>
+        {params.status == 11 && (
+          <Form.Item
+            label="合同状态"
+            name="contractStatus"
+            rules={[{ required: true, message: '请选择合同状态' }]}
+          >
+            <Select style={{ width: '100%' }}>
+              <Option key={0}>无合同</Option>
+              <Option key={1}>有合同</Option>
+            </Select>
+          </Form.Item>
+        )}
+      </>
+    );
+  };
+
+  const showUpload = useMemo(() => {
+    if (!isEdit) return false;
+    if (params.status == 2 || params.status == 3 || params.status == 4 || params.status == 11)
+      return true;
+  }, [params, isEdit]);
+
   const initStatueHistory = async id => {
     const res = await queryStatusHistory({ id });
     if (res.data) setStatusHistory(res.data);
@@ -91,7 +241,17 @@ function DetailModal(props) {
 
   const handleSubChange = e => {
     console.log(e);
-    setParams({ ...params, sub_status: e });
+    setParams({ ...params, status: e });
+  };
+
+  const onSave = () => {
+    if (params.status == 11) {
+      // '项目经理'
+    } else if (params.status == 21) {
+      // '运营经理'
+    } else if (params.status == 31) {
+      // '质保经理'
+    }
   };
 
   const uploadProps = {
@@ -110,9 +270,8 @@ function DetailModal(props) {
     },
   };
 
-  const renderDetail = () => (
-    <>
-      <div className={styles.subTitle}>项目详情</div>
+  const renderDetail = () => {
+    return (
       <Form labelCol={{ span: 4 }} wrapperCol={{ span: 18 }}>
         <Form.Item className={styles.formItem} label="项目名称">
           {data.project_name}
@@ -141,9 +300,9 @@ function DetailModal(props) {
             </Form.Item>
           </>
         )}
-        <Form.Item className={styles.formItem} label="售前项目经理">
-          {!isEdit && data.AuthorUser ? (
-            data.AuthorUser.CName
+        <Form.Item className={styles.formItem} label="项目经理">
+          {!promise.showModifyManager ? (
+            data.AuthorUser?.CName
           ) : (
             <TreeSelect
               defaultValue={data.AuthorUser?.CName}
@@ -185,16 +344,18 @@ function DetailModal(props) {
         <Form.Item className={styles.formItem} label="现阶段状态">
           {isEdit ? (
             <Select
-              defaultValue={SUB_STATUS[0].label}
+              // defaultValue={SUB_STATUS[0].label}
+              placeholder={SUB_STATUS.find(item => item.value == data?.status)?.label}
               style={{ width: '60%' }}
               onChange={handleSubChange}
-              options={data?.status || data?.status == 0 ? subSelectOptions[data?.status] : []}
+              options={statusOptions}
             />
           ) : (
             SUB_STATUS.find(item => item.value == data?.status)?.label
           )}
         </Form.Item>
-        {isEdit && data?.status >= 0 && data?.status <= 4 && (
+        {renderManage()}
+        {showUpload && (
           <Form.Item className={styles.formItem} label="上传文件">
             <Upload {...uploadProps}>
               <Button icon={<UploadOutlined />}>上传文件</Button>
@@ -202,14 +363,16 @@ function DetailModal(props) {
           </Form.Item>
         )}
         <Form.Item className={styles.formItem} label="项目规模">
-          <TableRender
-            onlyShow={true}
-            value={'[{"type":"UF","scale":"10"},{"type":"RO","scale":"20"}]'}
-          />
+          <TableRender onlyShow={true} value={data.process_info} />
+        </Form.Item>
+        <Form.Item>
+          <Button type="primary" onClick={onSave}>
+            保存
+          </Button>
         </Form.Item>
       </Form>
-    </>
-  );
+    );
+  };
 
   const flow = useMemo(() => {
     if (!data.flow_id) return {};
@@ -253,7 +416,7 @@ function DetailModal(props) {
       {/* {data.audit_status != 0 && renderAuth()} */}
       <Tabs defaultActiveKey="1">
         <Tabs.TabPane tab="成员管理" key="1">
-          <MemberModal isEdit={isEdit} currentItem={data} />
+          <MemberModal isEdit={promise.showMember} currentItem={data} />
         </Tabs.TabPane>
         <Tabs.TabPane tab="审核详情" key="2">
           {renderAuth()}

+ 66 - 51
src/pages/PurchaseAdmin/PurchaseList/Approval/List.js

@@ -110,7 +110,6 @@ function List(props) {
         let str = '';
         if (info) {
           const data = JSON.parse(info) || [];
-          console.log('-----------------', data);
           const list = data.map(item => item.scale);
           str = list.join('+');
         }
@@ -190,7 +189,7 @@ function List(props) {
     },
     {
       title: '操作',
-      render: record => renderEditBtns(record),
+      render: record => renderEditBtns2(record),
     },
   ];
 
@@ -393,37 +392,39 @@ function List(props) {
         onClick={() => {
           setCurrentItem(record);
           setDetailVisible(true);
+          setIsEdit(false);
         }}
       >
         项目详情
       </a>
     );
-    let memberBtn = (
-      <a
-        onClick={() => {
-          setCurrentItem(record);
-          setMemberVisible(true);
-        }}
-      >
-        成员管理
-      </a>
-    );
-    let executionBtn = (
-      <a
-        onClick={() => {
-          setCurrentItem(record);
-          setExecutionVisible(true);
-        }}
-      >
-        转执行
-      </a>
-    );
+    // let memberBtn = (
+    //   <a
+    //     onClick={() => {
+    //       setCurrentItem(record);
+    //       setMemberVisible(true);
+    //     }}
+    //   >
+    //     成员管理
+    //   </a>
+    // );
+    // let executionBtn = (
+    //   <a
+    //     onClick={() => {
+    //       setCurrentItem(record);
+    //       setExecutionVisible(true);
+    //     }}
+    //   >
+    //     转执行
+    //   </a>
+    // );
     let editBtn = (
       <>
         <a
           onClick={() => {
             setCurrentItem(record);
             setAddVisible(true);
+            setIsEdit(true);
           }}
         >
           编辑
@@ -446,6 +447,17 @@ function List(props) {
         </a>
       </>
     );
+    let projectEditBtn = (
+      <a
+        onClick={() => {
+          setIsEdit(true);
+          setCurrentItem(record);
+          setDetailVisible(true);
+        }}
+      >
+        项目编辑
+      </a>
+    );
     let statusBtn = (
       <>
         <a
@@ -464,7 +476,7 @@ function List(props) {
         >
           设置人日预算
         </a>
-        <Divider type="vertical" />
+        {/* <Divider type="vertical" />
         <a
           onClick={() => {
             setCurrentItem(record);
@@ -483,12 +495,12 @@ function List(props) {
           }}
         >
           转运营
-        </a>
+        </a> */}
       </>
     );
     let { audit_status, project_status, type_id } = record;
     //权限审核
-    let canEdit = () => {
+    let getEditStatus = () => {
       if (currentUser.IsSuper) return true;
       switch (audit_status) {
         case 0:
@@ -514,66 +526,68 @@ function List(props) {
       }
     };
     let toReturn = [];
+    const canEdit = getEditStatus();
     dividerPush(detailBtn, toReturn);
     switch (audit_status) {
       //未提交
       case 0:
-        canEdit() && dividerPush(editBtn, toReturn);
+        canEdit && dividerPush(editBtn, toReturn);
         break;
       //审核中
       case 1:
         break;
       //审核拒绝
       case 2:
-        if (project_status == 0 && canEdit()) dividerPush(editBtn, toReturn);
-        else if (project_status == 1 && canEdit()) {
-          dividerPush(memberBtn, toReturn);
+        if (project_status == 0 && canEdit) dividerPush(editBtn, toReturn);
+        else if (project_status == 1 && canEdit) {
+          // dividerPush(memberBtn, toReturn);
           dividerPush(statusBtn, toReturn);
         }
         break;
       //审核通过
       case 3:
+        canEdit && dividerPush(projectEditBtn, toReturn);
         switch (project_status) {
           //售前
           case 0:
-            if (canEdit()) {
-              dividerPush(memberBtn, toReturn);
-              dividerPush(executionBtn, toReturn);
+            if (canEdit) {
+              // dividerPush(memberBtn, toReturn);
+              // dividerPush(executionBtn, toReturn);
             }
             break;
           //转执行
           case 1:
-            if (canEdit()) {
-              dividerPush(memberBtn, toReturn);
+            if (canEdit) {
+              // dividerPush(memberBtn, toReturn);
               dividerPush(statusBtn, toReturn);
             }
             break;
           //转运营
           case 2:
-            canEdit() && dividerPush(memberBtn, toReturn);
+            // canEdit && dividerPush(memberBtn, toReturn);
             break;
           //转质保
           case 3:
-            canEdit() && dividerPush(memberBtn, toReturn);
+            // canEdit && dividerPush(memberBtn, toReturn);
             break;
         }
         break;
     }
-    let modifyManager = (
-      <a
-        onClick={() => {
-          setCurrentItem(record);
-          setModifyManagerVisible(true);
-        }}
-      >
-        修改项目经理
-      </a>
-    );
-    if (
-      (project_status === 0 || project_status === 1) &&
-      (permission['func-01-point-pm-list-change'] || currentUser.IsSuper)
-    )
-      dividerPush(modifyManager, toReturn);
+    // let modifyManager = (
+    //   <a
+    //     onClick={() => {
+    //       setCurrentItem(record);
+    //       setModifyManagerVisible(true);
+    //     }}
+    //   >
+    //     修改项目经理
+    //   </a>
+    // );
+    // if (
+    //   (project_status === 0 || project_status === 1) &&
+    //   (permission['func-01-point-pm-list-change'] || currentUser.IsSuper)
+    // )
+    //   dividerPush(modifyManager, toReturn);
     return toReturn;
   };
 
@@ -663,6 +677,7 @@ function List(props) {
         visible={detailVisible}
         data={currentItem}
         isEdit={isEdit}
+        currentUser={currentUser}
         onClose={() => setDetailVisible(false)}
       />
       <ExecutionModal

+ 1 - 1
src/pages/PurchaseAdmin/PurchaseList/Approval/TableRender.js

@@ -32,7 +32,7 @@ const TableRender = ({ value, onChange, onlyShow = false }) => {
   const renderItems = (item, idx) => {
     const { type, scale } = item;
     return (
-      <div className={styles.item} key={`${type}_${scale}_${idx}`}>
+      <div className={styles.item} key={`${idx}`}>
         <Select
           value={type}
           className={styles.itemLeft}