Przeglądaj źródła

Merge branch 'work20230919' of http://120.55.44.4:10080/xujunjie/WorkloadWeb into work20230919
解决冲突
# Conflicts:
# src/pages/PurchaseAdmin/PurchaseList/DailyRecord/components/WriteRecordModal.js
# src/pages/PurchaseAdmin/PurchaseList/DailyRecord/index.js

Renxy 1 rok temu
rodzic
commit
96d3fa67b3

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

@@ -143,31 +143,41 @@ 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 })}
+              showSearch
+              filterOption={(input, option) => {
+                return (option?.children[0] ?? '').includes(input);
+              }}
+            >
+              {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()}

+ 86 - 64
src/pages/PurchaseAdmin/PurchaseList/Approval/List.js

@@ -77,6 +77,7 @@ function List(props) {
   const [addFirmVisible, setAddFirmVisible] = useState(false);
   const [recordVisible, setRecordVisible] = useState(false);
   const [isEdit, setIsEdit] = useState(false);
+
   const columns = [
     {
       title: '项目编号',
@@ -103,20 +104,20 @@ function List(props) {
         return str;
       },
     },
-    {
-      title: '规模',
-      dataIndex: 'process_info',
-      render: info => {
-        let str = '';
-        if (info) {
-          const data = JSON.parse(info) || [];
-          console.log('-----------------', data);
-          const list = data.map(item => item.scale);
-          str = list.join('+');
-        }
-        return str;
-      },
-    },
+    // {
+    //   title: '规模',
+    //   dataIndex: 'process_info',
+    //   render: info => {
+    //     let str = '';
+    //     if (info) {
+    //       const data = JSON.parse(info) || [];
+    //       console.log('-----------------', data);
+    //       const list = data.map(item => item.scale);
+    //       str = list.join('+');
+    //     }
+    //     return str;
+    //   },
+    // },
 
     {
       title: '项目种类',
@@ -190,7 +191,7 @@ function List(props) {
     },
     {
       title: '操作',
-      render: record => renderEditBtns(record),
+      render: record => renderEditBtns2(record),
     },
   ];
 
@@ -337,7 +338,10 @@ function List(props) {
         callback: () => setAddVisible(false),
       });
     }
+    // 刷新table
+    queryList({ current: 1 });
   };
+
   const onDelete = item => {
     Modal.confirm({
       title: '删除',
@@ -353,6 +357,7 @@ function List(props) {
       },
     });
   };
+
   const onSubmitAuth = item => {
     Modal.confirm({
       title: '提交审核',
@@ -371,6 +376,7 @@ function List(props) {
       },
     });
   };
+
   const queryList = page => {
     dispatch({
       type: 'approval/queryApproval',
@@ -393,37 +399,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 +454,17 @@ function List(props) {
         </a>
       </>
     );
+    let projectEditBtn = (
+      <a
+        onClick={() => {
+          setIsEdit(true);
+          setCurrentItem(record);
+          setDetailVisible(true);
+        }}
+      >
+        项目编辑
+      </a>
+    );
     let statusBtn = (
       <>
         <a
@@ -464,7 +483,7 @@ function List(props) {
         >
           设置人日预算
         </a>
-        <Divider type="vertical" />
+        {/* <Divider type="vertical" />
         <a
           onClick={() => {
             setCurrentItem(record);
@@ -483,12 +502,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 +533,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 +684,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}

+ 30 - 5
src/pages/PurchaseAdmin/PurchaseList/DailyRecord/components/WriteRecordModal.js

@@ -6,7 +6,8 @@ import { approvalLog } from '@/services/record';
 
 const WriteRecordModal = ({ detail, visible, user, projects, loading = false, onOk, onCancel }) => {
   const [form] = Form.useForm();
-  const defaultData = { code_id: '', title: '', content: '' };
+  const defaultData = { id: '', code_id: '', title: '', content: '' };
+
   const [list, setList] = useState([defaultData]);
   const [name, setName] = useState();
   // console.log(user, list);
@@ -39,11 +40,30 @@ const WriteRecordModal = ({ detail, visible, user, projects, loading = false, on
   };
 
   const handleOk = () => {
-    onOk(list);
+    // 新建的不需要传id字段
+    const params = list.map(item => {
+      if (item.id === '') {
+        return {
+          code_id: item.code_id,
+          title: item.title,
+          content: item.content,
+        };
+      } else {
+        return item;
+      }
+    });
+    onOk(params);
   };
 
   return (
-    <Modal title="写日志" open={visible} width={800} onOk={handleOk} onCancel={onCancel}>
+    <Modal
+      title="写日志"
+      open={visible}
+      width={800}
+      onOk={handleOk}
+      onCancel={onCancel}
+      destroyOnClose
+    >
       <Form
         labelCol={{ span: 4 }}
         wrapperCol={{ span: 18 }}
@@ -72,6 +92,7 @@ const WriteRecordModal = ({ detail, visible, user, projects, loading = false, on
               idx={idx}
               projects={projects}
               data={item}
+              showDeleteIcon={idx !== 0}
               onChange={handleChangeItem}
               onDelete={handleDelItem}
             />
@@ -90,11 +111,13 @@ const WriteRecordModal = ({ detail, visible, user, projects, loading = false, on
 
 export default WriteRecordModal;
 
-const RenderItem = ({ idx, data, projects, onChange, onDelete }) => {
+const RenderItem = ({ idx, data, showDeleteIcon, projects, onChange, onDelete }) => {
   const [form] = Form.useForm();
+
   const projectName = useMemo(() => {
     return projects.find(item => item.ID == data.code_id)?.Name || '';
   }, [data.code_id]);
+
   return (
     <div className={styles.itemContent}>
       <Form
@@ -154,7 +177,9 @@ const RenderItem = ({ idx, data, projects, onChange, onDelete }) => {
           />
         </Form.Item>
       </Form>
-      <DeleteOutlined className={styles.delIcon} onClick={idx => onDelete(idx)} />
+      {showDeleteIcon && (
+        <DeleteOutlined className={styles.delIcon} onClick={idx => onDelete(idx)} />
+      )}
     </div>
   );
 };

+ 77 - 14
src/pages/PurchaseAdmin/PurchaseList/DailyRecord/index.js

@@ -1,5 +1,6 @@
-import { Button, DatePicker, Space, Table, message } from 'antd';
-import { useEffect, useState } from 'react';
+import { Button, DatePicker, Space, Table, Modal, message, Spin } from 'antd';
+import { ExclamationCircleOutlined } from '@ant-design/icons';
+import { useEffect, useMemo, useState } from 'react';
 import WriteRecordModal from './components/WriteRecordModal';
 import { connect } from 'dva';
 import RecordDetailModal from './components/RecordDetail';
@@ -17,17 +18,29 @@ import { log } from 'lodash-decorators/utils';
 import moment from 'moment';
 import { async } from '@antv/x6/lib/registry/marker/async';
 
+const { confirm } = Modal;
+
 const DailyRecord = props => {
-  const { currentUser, projects, dispatch } = props;
+  const { currentUser, projects, loading: propsLoading, dispatch } = props;
 
-  const [date, setDate] = useState('');
+  const [date, setDate] = useState({});
+  const [pageInfo, setPageInfo] = useState({ current: 1, pageSize: 9, total: 999 });
   const [writeVisible, setWriteVisible] = useState(false);
   const [detailVisible, setDetailVisible] = useState(false);
   const [selectedLogID, setselectedLogID] = useState('');
   const [logDetail, setLogDetail] = useState([]);
 
+  const [mockLogDetail, setMockLogDetail] = useState([]);
+
   // 请求列表
-  const { data, run, loading } = useRequest(date => approvalLogOwnList(date));
+  const { data, run, loading: listLoading } = useRequest(approvalLogOwnList, {
+    defaultParams: [{ ...date, ...pageInfo }],
+    onSuccess: data => {
+      if (data?.pagination) {
+        setPageInfo(data.pagination);
+      }
+    },
+  });
 
   // 查询日志详情
   // const { data: logDetail, run: runDetail, loading: detailLoading } = useRequest(
@@ -42,16 +55,17 @@ const DailyRecord = props => {
   console.log('-----------', logDetail);
 
   // 添加日志
-  const { run: runAdd } = useRequest(approvalAddLog, {
+  const { run: runAdd, loading: addLoading } = useRequest(approvalAddLog, {
     manual: true,
     onSuccess: () => {
       message.success('添加日志成功');
+      setWriteVisible(false);
       run();
     },
   });
 
   // 删除日志
-  const { run: runDelete } = useRequest(approvalDeleteLog, {
+  const { run: runDelete, loading: deleteLoading } = useRequest(approvalDeleteLog, {
     manual: true,
     onSuccess: () => {
       message.success('删除日志成功');
@@ -60,7 +74,7 @@ const DailyRecord = props => {
   });
 
   // 编辑日志
-  const { run: runEdit } = useRequest(approvalEditLog, {
+  const { run: runEdit, loading: editLoading } = useRequest(approvalEditLog, {
     manual: true,
     onSuccess: () => {
       message.success('编辑日志成功');
@@ -90,6 +104,26 @@ const DailyRecord = props => {
     runEdit(params);
   };
 
+  // 统一管理 加载状态
+  const allLoading = useMemo(() => {
+    const loadingList = [propsLoading, listLoading, deleteLoading, addLoading, editLoading];
+    if (loadingList.find(item => item)) {
+      return true;
+    }
+    return false;
+  }, [propsLoading, listLoading, deleteLoading, addLoading, editLoading]);
+
+  const deleteRecord = record => {
+    confirm({
+      title: '提示',
+      icon: <ExclamationCircleOutlined />,
+      content: '确认删除此条日志?',
+      onOk() {
+        runDelete(record.log_id);
+      },
+    });
+  };
+
   const columns = [
     {
       title: '日志标题',
@@ -123,36 +157,65 @@ const DailyRecord = props => {
           <Space>
             <a onClick={() => toEdit(record.log_id)}>编辑</a>
             <a onClick={() => toDetail(record.log_id)}>详情</a>
-            <a onClick={() => runDelete(record.log_id)}>删除</a>
+            <a onClick={() => deleteRecord(record)}>删除</a>
           </Space>
         );
       },
     },
   ];
 
+  // 加载项目列表,如果没有
   useEffect(() => {
     if (!projects?.length) {
       dispatch({ type: 'record/queryProject' });
     }
   }, []);
 
-  const onChange = (date, dateString) => {
-    run({ s_time: `${dateString} 00:00:00`, e_time: `${dateString} 23:59:59` });
+  const handleDataPicked = (_date, dateString) => {
+    let params = '';
+    if (dateString) {
+      params = { ...pageInfo, s_time: `${dateString} 00:00:00`, e_time: `${dateString} 23:59:59` };
+    }
+    run(params);
+    setDate(params);
   };
+
+  const handlePageChange = (page, pageSize) => {
+    let params = '';
+    if (date) {
+      params = date;
+    }
+    params.currentPage = page;
+    params.pageSize = pageSize;
+    run(params);
+    setPageInfo({ ...pageInfo, current: page, pageSize: pageSize });
+  };
+
   return (
     <div>
       <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '20px' }}>
         <Space size={24}>
-          <DatePicker onChange={onChange} />
+          <DatePicker onChange={handleDataPicked} />
           <Button type="primary" onClick={() => {}}>
             查询
           </Button>
         </Space>
-        <Button type="primary" onClick={() => setWriteVisible(true)}>
+        <Button
+          type="primary"
+          onClick={() => {
+            setWriteVisible(true);
+          }}
+        >
           写日志
         </Button>
       </div>
-      <Table columns={columns} dataSource={data?.list} pagination={data?.pagination} />
+      <Spin spinning={allLoading}>
+        <Table
+          columns={columns}
+          dataSource={data?.list}
+          pagination={{ ...pageInfo, onChange: handlePageChange }}
+        />
+      </Spin>
       <WriteRecordModal
         detail={logDetail}
         visible={writeVisible}

+ 2 - 3
src/services/record.js

@@ -9,10 +9,9 @@ export async function approvalAddLog(params) {
 }
 
 // 删除日志
-export async function approvalDeleteLog(params) {
-  return request(`/api/v2/approval/log/${params.id}`, {
+export async function approvalDeleteLog(logID) {
+  return request(`/api/v2/approval/log/${logID}`, {
     method: 'DELETE',
-    body: params,
   });
 }