瀏覽代碼

1. 审批列表
2. 增加项目名称显示
3. 修复文件上传失败后无法删除
4. 清单列表页面增加项目搜索框,下拉和输入,模糊搜索与提示

xjj 2 年之前
父節點
當前提交
b6406714cb

+ 4 - 1
config/router.config.js

@@ -39,11 +39,14 @@ export default [
             path: '/home/flow-list',
             component: './Flow/List',
           },
-
           {
             path: '/home/auth',
             component: './Auth/Auth',
           },
+          {
+            path: '/home/submit',
+            component: './Auth/Submit',
+          },
         ],
       },
       {

+ 4 - 4
src/components/OssUpload/AliyunOssUploader.js

@@ -41,12 +41,12 @@ class AliyunOSSUpload extends React.Component {
 
   onRemove = file => {
     const { value, onChange } = this.props;
+    const { fileList } = this.state;
 
-    const files = value.filter(v => v.url !== file.url);
+    let newFileList = fileList.filter(item => item.url != file.url);
+    this.setState({ fileList: newFileList });
+    onChange?.(newFileList);
 
-    if (onChange) {
-      onChange(files);
-    }
   };
 
   transformFile = file => {

+ 151 - 0
src/pages/Auth/Submit.js

@@ -0,0 +1,151 @@
+import React, { useEffect, useState } from 'react';
+import { Table, Collapse, Space } from 'antd';
+import { connect } from 'dva';
+import router from 'umi/router';
+import { querySubmitList } from '@/services/bomAuth';
+
+const { Panel } = Collapse;
+
+function Auth(props) {
+  const { dispatch, typeOptions, currentUser,project } = props;
+  const [loading, setLoading] = useState(false);
+  const [data, setData] = useState({
+    list: [],
+    pagination: {},
+  });
+
+  const queryData = async page => {
+    setLoading(true);
+    try {
+      const res = await querySubmitList(currentUser.ID, { current_page: page?.current || 1 });
+      setData(res.data);
+    } catch (error) {}
+    setLoading(false);
+  };
+
+  const columns = [
+    {
+      title: '流程名称',
+      dataIndex: 'name',
+    },
+    {
+      title: '清单名称',
+      dataIndex: 'version_name',
+    },
+    // {
+    //   title: '所属项目',
+    //   dataIndex: 'project_id',
+    //   render: project_id => {
+    //     let p = project.list.find(p => p.id == project_id);
+    //     if (p) return `${p.project_name}(${p.project_full_code})`;
+    //   },
+    // },
+    {
+      title: '所属节点',
+      render: record => record.TemplateNodeInfo.label,
+    },
+    {
+      title: '分类',
+      render: item => typeOptions.find(cur => cur.id == item.classify_id)?.name,
+    },
+    {
+      title: '状态',
+      width: '15%',
+      render: item => {
+        let style = { color: getColor(item.audit_status) };
+        let txt = '';
+        switch (item.audit_status) {
+          case 0:
+            txt = '未提交';
+            break;
+          case 1:
+            txt = '待审批';
+            break;
+          case 2:
+            txt = '已拒绝';
+            break;
+          case 3:
+            txt = '已通过';
+            break;
+          case 4:
+            txt = '已提交';
+            break;
+        }
+        if (item.status == 1) txt = '已失效';
+        return <span style={style}>{txt}</span>;
+      },
+    },
+    {
+      title: '操作',
+      width: '20%',
+      render: item => (
+        <Space>
+          <a onClick={() => loadNode(item)}>加载</a>
+        </Space>
+      ),
+    },
+  ];
+
+  const loadNode = item => {
+    //调用接口获取version信息
+    dispatch({
+      type: 'auth/queryVersionByNode',
+      payload: { template_node_id: item.node_id },
+      callback: versionList => {
+        let version = versionList.find(v => v.id == item.id) || {};
+        localStorage.excelItem = JSON.stringify(version);
+        router.push(`/home/detail/${item.project_id}/${item.template_id}`);
+      },
+    });
+  };
+
+  //监测当前用户,有值时调用列表接口
+  useEffect(() => {
+    if (!currentUser.ID) return;
+    queryData();
+  }, [currentUser]);
+
+  useEffect(() => {
+    //分类列表
+    dispatch({ type: 'auth/queryClassify' });
+  }, []);
+
+  return (
+    <div>
+      <Table
+        loading={loading}
+        columns={columns}
+        dataSource={data.list}
+        pagination={data.pagination}
+        onChange={queryData}
+      />
+    </div>
+  );
+}
+const getColor = audit_status => {
+  let color = '';
+  switch (audit_status) {
+    case 2:
+      // 审批拒绝
+      color = '#f5222d';
+      break;
+    case 3:
+      // 审批成功
+      color = '#7cb305';
+      break;
+    case 4:
+      // 历史清单
+      color = '#9b9b9b';
+      break;
+
+    default:
+      break;
+  }
+  return color;
+};
+
+export default connect(({ auth, loading, user }) => ({
+  typeOptions: auth.typeOptions,
+  currentUser: user.currentUser,
+  loading,
+}))(Auth);

+ 9 - 7
src/pages/Detail/CommitAuditModal.js

@@ -124,20 +124,22 @@ function CommitAuditModal(props) {
     setAuditList([]);
   }, [visible]);
 
-  const OnModelFileDone = file => {
-    var path = OSSData.host + '/' + file.url;
-    uploadList.current = [...uploadList.current, path];
-    // const files = form.getFieldsValue('files');
-    // form.setFieldValue('files', files.concat(path));
+  // const OnModelFileDone = file => {
+  //   var path = OSSData.host + '/' + file.url;
+  //   uploadList.current = [...uploadList.current, path];
+  //   console.log(uploadList.current);
+  // };
+  const setUploadList = files => {
+    uploadList.current = files.map(file => OSSData.host + '/' + file.url);
     console.log(uploadList.current);
-    // setThumbnail(path);
   };
   const OnUploading = file => {};
   const uploadProps = {
     OSSData: OSSData,
-    onDone: OnModelFileDone,
+    // onDone: OnModelFileDone,
     onUploading: OnUploading,
     noStyle: false,
+    onChange: setUploadList,
     // showUploadList: false,
   };
 

+ 15 - 6
src/pages/Detail/CurrentInfo.js

@@ -1,18 +1,27 @@
-import React from 'react';
-import styles from "./Index.less"
+import React, { useMemo } from 'react';
+import styles from './Index.less';
+import { connect } from 'dva';
 
 function CurrentInfo(props) {
-  const { version, flowDetail } = props;
+  const { version, flowDetail, projectList } = props;
   const nodeId = version.template_node_id;
   if (!flowDetail?.nodes || !nodeId) return null;
   const node = flowDetail.nodes.find(item => item.Id == nodeId);
+  console.log(projectList);
+
+  const projectName = useMemo(() => {
+    let project = projectList.find(item => item.id == version?.project_id);
+    return project?.project_name || '';
+  }, [projectList, version]);
 
   return (
     <span className={styles.curTitle}>
-      当前清单: <span>{version.version_name || '-'}</span>当前节点:{' '}
-      <span>{node?.label || '-'}</span>
+      当前清单: <span>{version.version_name || '-'}</span>
+      当前节点:<span>{node?.label || '-'}</span>
+      所属项目:
+      <span>{projectName}</span>
     </span>
   );
 }
 
-export default CurrentInfo;
+export default connect(({ list }) => ({ projectList: list?.project?.list || [] }))(CurrentInfo);

+ 0 - 4
src/pages/Detail/models/detail.js

@@ -65,10 +65,6 @@ export default {
       list: [],
       pagination: false,
     },
-    project: {
-      list: [],
-      pagination: false,
-    },
     excel: {
       list: [],
       pagination: false,

+ 4 - 1
src/pages/Index.js

@@ -39,7 +39,7 @@ function LayoutDetail(props) {
     });
     clearInterval(timer);
     timer = setInterval(() => {
-      if(location.href.indexOf("/bom/home/audit") != -1) return
+      if (location.href.indexOf('/bom/home/audit') != -1) return;
       dispatch({
         type: 'authList/queryAuthList',
         payload: { user_id: currentUser.ID },
@@ -98,6 +98,9 @@ function LayoutDetail(props) {
                   </Badge>
                 </Link>
               </Menu.Item>
+              <Menu.Item key="/home/submit">
+                <Link to="/home/submit">已提交审批</Link>
+              </Menu.Item>
             </Menu>
           </div>
           <RightContent />

+ 84 - 44
src/pages/List/List.js

@@ -1,5 +1,5 @@
-import React, { useState, useEffect } from 'react';
-import { message, Modal, Table } from 'antd';
+import React, { useState, useEffect, useRef } from 'react';
+import { Button, Divider, Form, Input, message, Modal, Select, Table } from 'antd';
 import { connect } from 'dva';
 import router from 'umi/router';
 import FlowModal from '../Detail/FlowModal';
@@ -12,6 +12,8 @@ import {
 } from '@/services/boom';
 import { getToken } from '@/utils/utils';
 import ClassifyModal from './ClassifyModal';
+import VersionModal from './VersionModal';
+let token = getToken();
 
 function List(props) {
   const { excel, loading, project, dispatch, typeOptions, userList, versionList } = props;
@@ -26,56 +28,47 @@ function List(props) {
 
   const [data, setData] = useState([]);
 
-  let token = getToken();
+  const [form] = Form.useForm();
+  const filterRes = useRef({});
 
   const columns = [
     {
       title: '流程名称',
-      width: '35%',
-      render: item => item.version_name || item.name,
+      dataIndex: 'name',
+    },
+    {
+      title: '模板名称',
+      dataIndex: 'version_name',
     },
-    // {
-    //   title: '所属项目',
-    //   width: '35%',
-    //   render: item => {
-    //     if (!item.is_parent) return '';
-    //     return project.list.find(p => p.ID == item.project_id)?.Name;
-    //   },
-    // },
     {
       title: '所属项目',
-      width: '35%',
-      render: item => {
-        if (!item.is_parent) return '';
-        let p = project.list.find(p => p.id == item.project_id);
+      dataIndex: 'project_id',
+      render: project_id => {
+        let p = project.list.find(p => p.id == project_id);
         if (p) return `${p.project_name}(${p.project_full_code})`;
       },
     },
     {
       title: '操作',
-      render: record => {
-        if (record.is_parent) {
-          return (
-            <a
-              onClick={async () => {
-                try {
-                  setClassifyLoading(true);
-                  const data = await queryBindClassify({ project_id: record.project_id }); //record.project_id
-                  setClassifyLoading(false);
-                  setData({ project_id: record.project_id, classify: data });
-                  setVisible(true);
-                } catch (error) {}
-              }}
-            >
-              编辑
-            </a>
-          );
-        }
-        return (
+      render: record => (
+        <>
+          <a
+            onClick={async () => {
+              try {
+                setClassifyLoading(true);
+                const data = await queryBindClassify({ project_id: record.project_id }); //record.project_id
+                setClassifyLoading(false);
+                setData({ project_id: record.project_id, classify: data });
+                setVisible(true);
+              } catch (error) {}
+            }}
+          >
+            分类权限
+          </a>
+          <Divider type="vertical"></Divider>
           <a
             onClick={async () => {
               localStorage.excelId = record.id;
-
               setLoading2(true);
               try {
                 const data = await queryBoomFlowDetail({ id: record.template_id });
@@ -93,19 +86,28 @@ function List(props) {
               // router.push(`/home/detail/${record.project_id}/${record.template_id}`);
             }}
           >
-            查看
+            全部清单
           </a>
-        );
-      },
+          <Divider type="vertical"></Divider>
+          <a
+            onClick={() => {
+              setVersion(record);
+              setVersionVisible(true);
+            }}
+          >
+            最新清单
+          </a>
+        </>
+      ),
     },
   ];
-  const queryList = page => {
-    console.log(page);
+  const queryList = filter => {
+    filter = { ...filterRes.current, ...filter };
     dispatch({
       type: 'list/queryProjectRecord',
       payload: {
-        ...page,
-        currentPage: page.current,
+        ...filter,
+        currentPage: filter.current,
       },
     });
   };
@@ -192,6 +194,35 @@ function List(props) {
 
   return (
     <div>
+      <Form
+        form={form}
+        layout="inline"
+        style={{ marginBottom: 20 }}
+        onFinish={filter => queryList({ ...filter, currentPage: 1 })}
+      >
+        <Form.Item label="流程名称" name="name">
+          <Input />
+        </Form.Item>
+        <Form.Item label="所属项目" name="project_id">
+          <Select
+            style={{ width: 200 }}
+            showSearch
+            allowClear
+            options={project.list.map(item => ({
+              label: item.project_name,
+              value: item.id,
+            }))}
+            filterOption={(input, option) =>
+              (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
+            }
+          ></Select>
+        </Form.Item>
+        <Form.Item>
+          <Button htmlType="submit" type="primary">
+            查询
+          </Button>
+        </Form.Item>
+      </Form>
       <Table
         loading={loading || loading2}
         rowKey="id"
@@ -213,6 +244,15 @@ function List(props) {
         commitLoading={commitLoading}
         onDelVersion={onDelVersion}
       />
+      <VersionModal
+        userList={userList}
+        typeOptions={typeOptions}
+        versionList={versionList}
+        visible={versionVisible}
+        project_id={version.project_id}
+        onChangeVersion={version => changeVersion(version)}
+        onClose={() => setVersionVisible(false)}
+      />
       <ClassifyModal
         loading={classifyLoading}
         visible={visible}

+ 132 - 0
src/pages/List/VersionModal.js

@@ -0,0 +1,132 @@
+import { queryVersionsByProjectId } from '@/services/approval';
+import { Button, List, Modal, Select, Table, Space } from 'antd';
+import React, { useEffect, useMemo, useState } from 'react';
+
+const VersionModal = ({ project_id, userList, typeOptions, visible, onClose, onChangeVersion }) => {
+  const [data, setData] = useState({
+    list: [],
+    pagination: {},
+  });
+  const [loading, setLoading] = useState(false);
+  const columns = [
+    {
+      title: '名称',
+      dataIndex: 'version_name',
+    },
+    {
+      title: '所属节点',
+      render: record => record.TemplateNodeInfo.label,
+    },
+    {
+      title: '创建人',
+      dataIndex: 'author',
+      render: author => userList.find(cur => cur.ID == author)?.CName || '-',
+    },
+    {
+      title: '分类',
+      render: item => typeOptions.find(cur => cur.id == item.classify_id)?.name,
+    },
+    {
+      title: '状态',
+      width: '15%',
+      render: item => {
+        let style = { color: getColor(item.audit_status) };
+        let txt = '';
+        switch (item.audit_status) {
+          case 0:
+            txt = '未提交';
+            break;
+          case 1:
+            txt = '待审批';
+            break;
+          case 2:
+            txt = '已拒绝';
+            break;
+          case 3:
+            txt = '已通过';
+            break;
+          case 4:
+            txt = '已提交';
+            break;
+        }
+        if (item.status == 1) txt = '已失效';
+        return <span style={style}>{txt}</span>;
+      },
+    },
+    {
+      title: '操作',
+      width: '20%',
+      render: item => (
+        <Space>
+          <a
+            onClick={() => {
+              onChangeVersion(item);
+              onClose();
+            }}
+          >
+            加载
+          </a>
+        </Space>
+      ),
+    },
+  ];
+
+  const queryData = async page => {
+    setLoading(true);
+    try {
+      var res = await queryVersionsByProjectId(project_id, { current_page: page?.current || 1 });
+      setData(res.data);
+    } catch (error) {}
+    setLoading(false);
+  };
+
+  useEffect(() => {
+    if (!project_id) return;
+    queryData();
+  }, [project_id]);
+
+  return (
+    <Modal
+      width="60%"
+      maskClosable={false}
+      destroyOnClose
+      title="清单列表"
+      visible={visible}
+      onCancel={onClose}
+      onOk={onClose}
+      footer={false}
+    >
+      <Table
+        loading={loading}
+        columns={columns}
+        dataSource={data.list}
+        pagination={data.pagination}
+        scroll={{ y: 500 }}
+        onChange={queryData}
+      />
+    </Modal>
+  );
+};
+const getColor = audit_status => {
+  let color = '';
+  switch (audit_status) {
+    case 2:
+      // 审批拒绝
+      color = '#f5222d';
+      break;
+    case 3:
+      // 审批成功
+      color = '#7cb305';
+      break;
+    case 4:
+      // 历史清单
+      color = '#9b9b9b';
+      break;
+
+    default:
+      break;
+  }
+  return color;
+};
+
+export default VersionModal;

+ 14 - 14
src/pages/List/models/list.js

@@ -22,20 +22,20 @@ export default {
   effects: {
     *queryProjectRecord({ payload = {}, callback }, { call, put }) {
       const { data } = yield call(queryProjectRecord, payload);
-      let temp = {};
-      data.list.forEach(item => {
-        if (!temp[item.template_id]) {
-          temp[item.template_id] = {
-            id: `template-${item.template_id}`,
-            name: item.name,
-            project_id: item.project_id,
-            is_parent: true,
-            children: [],
-          };
-        }
-        temp[item.template_id].children.push(item);
-      });
-      data.list = Object.values(temp).reverse();
+      // let temp = {};
+      // data.list.forEach(item => {
+      //   if (!temp[item.template_id]) {
+      //     temp[item.template_id] = {
+      //       id: `template-${item.template_id}`,
+      //       name: item.name,
+      //       project_id: item.project_id,
+      //       is_parent: true,
+      //       children: [],
+      //     };
+      //   }
+      //   temp[item.template_id].children.push(item);
+      // });
+      // data.list = Object.values(temp).reverse();
       yield put({
         type: 'save',
         payload: { excel: data },

+ 5 - 0
src/services/approval.js

@@ -110,3 +110,8 @@ export async function deleteMember(data) {
     method: 'DELETE',
   });
 }
+
+// 查询项目下所有清单
+export async function queryVersionsByProjectId(projectId, params) {
+  return request(`/purchase/bom/get-bom-list/${projectId}?${stringify(params)}`);
+}

+ 5 - 0
src/services/bomAuth.js

@@ -17,3 +17,8 @@ export async function queryCheckedList({ user_id, params }) {
 export async function queryVersionByNode(params) {
   return request(`/purchase/bom/flow/node?${stringify(params)}`);
 }
+
+// 查询用户提交记录
+export async function querySubmitList(user_id,params) {
+  return request(`/purchase/bom/get-submit-list/${user_id}?${stringify(params)}`);
+}