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

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

xjj пре 2 година
родитељ
комит
4b45380cbb

+ 1 - 0
src/app.js

@@ -3,6 +3,7 @@ import fetch from 'dva/fetch';
 export const dva = {
   config: {
     onError(err) {
+      console.error(err);
       err.preventDefault();
     },
   },

+ 43 - 23
src/pages/PurchaseAdmin/PurchaseList/Approval/BudgetModal.js

@@ -3,33 +3,53 @@ import { Form, Modal, InputNumber } from 'antd';
 import { connect } from 'dva';
 
 function BudgetModal(props) {
-  const { visible, onCancel, onOk, loading, currentItem } = props;
+  const { visible, onCancel, onOk, loading, currentItem, dispatch, budget } = props;
   const [form] = Form.useForm();
 
   const subTypeList = [
-    { name: '建设期项目管理人员', code: '02-010' },
-    { name: '工程设计人日(含BIM设计)', code: '04-010' },
-    { name: '设计联络人日', code: '05-010' },
-    { name: '金科陪客户设计联络/培训人日', code: '05-050' },
-    { name: '采购和质量控制人日', code: '06-010' },
-    { name: '双胞胎运营平台实施人日', code: '07-010' },
-    { name: '预算审核及费控人日', code: '08-010' },
-    { name: '现场安装/调试/性能测试/试运行人日', code: '10-010' },
-    { name: '质保期项目经理人日', code: '11-010' },
-    { name: '质保期服务工程师人日', code: '11-030' },
-    { name: '运营期项目管理人员', code: '02-030' },
-    { name: '运营期培训人日', code: '05-070' },
-    { name: '运营期采购和质量控制人日', code: '06-030' },
-    { name: '运营期预算审核及费控人日', code: '08-030' },
-    { name: '质保采购工程师人日', code: '11-050' },
-    { name: '投资技术服务人日', code: '18-010' },
-    { name: '运营期技术服务人日', code: '18-030' },
+    { name: '建设期项目管理人员', code: '02-010', id: 12 },
+    { name: '工程设计人日(含BIM设计)', code: '04-010', id: 13 },
+    { name: '设计联络人日', code: '05-010', id: 14 },
+    { name: '金科陪客户设计联络/培训人日', code: '05-050', id: 16 },
+    { name: '采购和质量控制人日', code: '06-010', id: 17 },
+    { name: '双胞胎运营平台实施人日', code: '07-010', id: 18 },
+    { name: '预算审核及费控人日', code: '08-010', id: 19 },
+    { name: '现场安装/调试/性能测试/试运行人日', code: '10-010', id: 20 },
+    { name: '质保期项目经理人日', code: '11-010', id: 21 },
+    { name: '质保期服务工程师人日', code: '11-030', id: 22 },
+    { name: '运营期项目管理人员', code: '02-030', id: 26 },
+    { name: '运营期培训人日', code: '05-070', id: 27 },
+    { name: '运营期采购和质量控制人日', code: '06-030', id: 28 },
+    { name: '运营期预算审核及费控人日', code: '08-030', id: 29 },
+    { name: '质保采购工程师人日', code: '11-050', id: 30 },
+    { name: '投资技术服务人日', code: '18-010', id: 31 },
+    { name: '运营期技术服务人日', code: '18-030', id: 32 },
   ];
 
   const handleOk = () => {
-    onOk();
+    form.validateFields().then(values => {
+      console.log(values);
+      let params = [];
+      let isUpdate = budget?.length !== 0;
+      Object.keys(values).forEach(item => {
+        let elm = {
+          project_id: Number(currentItem?.id),
+          type_id: Number(item),
+          workload: Number(values[item])
+        };
+        if (isUpdate) {
+          elm.id = budget?.find(child => child.type_id == item)?.id;
+        }
+        params.push(elm);
+      })
+      console.log(params);
+      dispatch({
+        type: 'approval/setBudget',
+        payload: params,
+        callback: () => onOk?.(),
+      });
+    });
   };
-
   return (
     <Modal
       title="项目预算"
@@ -40,9 +60,9 @@ function BudgetModal(props) {
       confirmLoading={loading}
       destroyOnClose
     >
-      <Form labelCol={{ span: 10 }} wrapperCol={{ span: 10 }}>
+      <Form form={form} labelCol={{ span: 10 }} wrapperCol={{ span: 10 }}>
         {subTypeList.map(item => (
-          <Form.Item label={item.name} name={item.code} initialValue={0}>
+          <Form.Item label={item.name} name={item.id} initialValue={Number(budget?.find(child => child.type_id === item.id)?.workload) || 0}>
             <InputNumber min={0} style={{ width: '100%' }} />
           </Form.Item>
         ))}
@@ -51,4 +71,4 @@ function BudgetModal(props) {
   );
 }
 
-export default BudgetModal;
+export default connect()(BudgetModal);

+ 33 - 1
src/pages/PurchaseAdmin/PurchaseList/Approval/List.js

@@ -9,6 +9,7 @@ import ExecutionModal from './ExecutionModal';
 import MemberModal from './MemberModal';
 import QualityOperateModal from './QualityOperateModal';
 import BudgetModal from './BudgetModal';
+import ModifyManagerModal from './ModifyManagerModal';
 import { connect } from 'dva';
 
 const { Option } = Select;
@@ -31,6 +32,7 @@ function List(props) {
     loading,
     depUserTree,
     member,
+    budget,
   } = props;
   const [form] = Form.useForm();
   const [addVisible, setAddVisible] = useState(false);
@@ -42,6 +44,7 @@ function List(props) {
   const [selfItems, setSelfItems] = useState(false);
   const [currentItem, setCurrentItem] = useState({});
   const [qualityOperate, setQualityOperate] = useState(0);
+  const [modifyManagerVisible, setModifyManagerVisible] = useState(false);
   const columns = [
     {
       title: '项目编号',
@@ -345,7 +348,15 @@ function List(props) {
         <a
           onClick={() => {
             setCurrentItem(record);
-            setBudgetVisible(true);
+            dispatch({
+              type: 'approval/queryBudget',
+              payload: {
+                project_id: record?.id
+              },
+              callback: () => {
+                setBudgetVisible(true);
+              }
+            });
           }}
         >
           设置人日预算
@@ -445,6 +456,16 @@ function List(props) {
         }
         break;
     }
+    let modifyManager = (<a
+      onClick={() => {
+        setCurrentItem(record);
+        setModifyManagerVisible(true);
+      }}
+    >
+      修改项目经理
+    </a>)
+    if (project_status === 0 || project_status === 5)
+      dividerPush(modifyManager, toReturn);
     return toReturn;
   };
 
@@ -542,6 +563,16 @@ function List(props) {
         currentItem={currentItem}
         onCancel={() => setBudgetVisible(false)}
         onOk={() => setBudgetVisible(false)}
+        budget={budget}
+      />
+      <ModifyManagerModal
+        depUserTree={depUserTree}
+        loading={loading}
+        visible={modifyManagerVisible}
+        onClose={() => setModifyManagerVisible(false)}
+        currentItem={currentItem}
+        dataSource={member}
+        onOk={() => setModifyManagerVisible(false)}
       />
     </div>
   );
@@ -556,4 +587,5 @@ export default connect(({ approval, user, loading }) => ({
   loading: loading.models.approval,
   depUserTree: approval.depUserTree,
   member: approval.member,
+  budget: approval.budget
 }))(List);

+ 60 - 0
src/pages/PurchaseAdmin/PurchaseList/Approval/ModifyManagerModal.js

@@ -0,0 +1,60 @@
+import React, { useState, useEffect } from 'react';
+import { Form, Modal, TreeSelect, Table, Button, Input } from 'antd';
+import { connect } from 'dva';
+const { TreeNode } = TreeSelect;
+
+function ModifyManagerModal(props) {
+  const { visible, onClose, currentItem, loading, depUserTree, dataSource, dispatch, onOk } = props;
+  const [form] = Form.useForm();
+  // useEffect(() => {
+  //   form.resetFields();
+  // }, []);
+  const handleOk = () => {
+    form.validateFields().then(({ managerID }) => {
+      console.log(managerID,currentItem);
+      const [user_id, dep_id] = managerID.split('||');
+      dispatch({
+        type: 'approval/modifyManager',
+        payload: {
+          user_id: Number(user_id),
+          flag: Number(currentItem?.project_status),
+          project_id: Number(currentItem?.id)
+        },
+        callback: () => onOk?.(),
+      });
+    });
+  };
+
+  return (
+    <Modal
+      title="修改项目经理"
+      confirmLoading={loading}
+      maskClosable={false}
+      destroyOnClose
+      visible={visible}
+      onCancel={onClose}
+      onOk={handleOk}
+    >
+      <Form labelCol={{ span: 5 }} wrapperCol={{ span: 15 }} form={form}>
+        <Form.Item
+          label="项目经理"
+          name="managerID"
+          rules={[{ required: true, message: '请选择项目经理' }]}
+        >
+          <TreeSelect
+            showSearch
+            allowClear
+            style={{ width: '100%' }}
+            placeholder="请选择项目经理"
+            multiple={false}
+            filterTreeNode={(input, option) => {
+              return option.props.title === input;
+            }}
+            treeData={depUserTree}
+          />
+        </Form.Item>
+      </Form>
+    </Modal>
+  );
+}
+export default connect()(ModifyManagerModal);

+ 13 - 1
src/pages/PurchaseAdmin/PurchaseList/Approval/models/approval.js

@@ -18,6 +18,7 @@ import {
   deleteMember,
   queryBudget,
   setBudget,
+  modifyManager,
 } from '@/services/approval';
 import { message } from 'antd';
 import moment from 'moment';
@@ -244,19 +245,30 @@ export default {
       });
     },
 
-    *queryBudget({ payload }, { call, put }) {
+    *queryBudget({ payload, callback }, { call, put }) {
       const res = yield call(queryBudget, payload);
       if (!res) return;
       yield put({
         type: 'save',
         payload: { budget: res.data },
       });
+      callback?.();
     },
 
     *setBudget({ payload, callback }, { call, put }) {
       const res = yield call(setBudget, payload);
       if (!res) return;
       message.success('项目预算设置成功');
+      callback?.();
+    },
+    *modifyManager({ payload, callback }, { call, put }) {
+      const res = yield call(modifyManager, payload);
+      if (!res) return;
+      callback?.();
+      message.success('修改项目经理成功');
+      yield put({
+        type: 'queryApproval',
+      });
     },
   },
 

+ 33 - 18
src/pages/PurchaseAdmin/PurchaseList/WorkingHours/AddModal.js

@@ -1,10 +1,11 @@
 import React, { useState } from 'react';
-import { message, Form, Modal, Select, DatePicker } from 'antd';
+import { message, Form, Modal, Select, DatePicker, TreeSelect } from 'antd';
 import { connect } from 'dva';
 import moment from 'moment';
 
 const { Option } = Select;
 const { MonthPicker } = DatePicker;
+const { TreeNode } = TreeSelect;
 
 function AddModal(props) {
   const {
@@ -17,6 +18,7 @@ function AddModal(props) {
     dispatch,
     project = [],
     loading,
+    depUserTree
   } = props;
   const [form] = Form.useForm();
   const [type, setType] = useState({});
@@ -33,21 +35,24 @@ function AddModal(props) {
         values.project = '0';
       }
 
-      onOk([
-        {
-          type_id: Number(values.subType),
-          comment: '',
-          // 父级id
-          parent_type_id: Number(values.type),
-          data: [
-            {
-              project_id: Number(values.project),
-              workload: 0,
-              day: time,
-            },
-          ],
-        },
-      ]);
+      let params = [{
+        type_id: Number(values.subType),
+        comment: '',
+        // 父级id
+        parent_type_id: Number(values.type),
+        data: [
+          {
+            project_id: Number(values.project),
+            workload: 0,
+            day: time,
+          },
+        ],
+      }]
+      if (type.type == 0 && values.project == '0') {
+        console.log(values);
+        params[0].data[0].pay_dep_id = Number(values.pay_dep_id);
+      }
+      onOk(params);
 
       //将分类设为空,避免再次打开时有项目选单
       setType({});
@@ -181,8 +186,18 @@ function AddModal(props) {
   //部门选择
   const renderDepSelect = () => {
     return (
-      <Form.Item label="部门" name="dep" rules={[{ required: true, message: '请选择部门' }]}>
-        <Select></Select>
+      <Form.Item label="部门" name="pay_dep_id" rules={[{ required: true, message: '请选择部门' }]}>
+        <TreeSelect
+          showSearch
+          allowClear
+          // style={{ width: 240 }}
+          placeholder="请选择部门"
+          multiple={false}
+          treeData={depUserTree}
+          filterTreeNode={(input, option) => {
+            return option.props.title === input;
+          }}
+        />
       </Form.Item>
     );
   };

+ 3 - 3
src/pages/PurchaseAdmin/PurchaseList/WorkingHours/WorkList.js

@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
 import { InputNumber, Popover, Divider, Table, message } from 'antd';
 
 function WorkList(props) {
-  const { list, onAuth, onSave, onDelete, allType } = props;
+  const { list, onAuth, onSave, onDelete, allType, depUserMap } = props;
   const [expandedRowKeys, setExpandedRowKeys] = useState([]);
   const [dataSource, setDataSource] = useState([]);
   let workHour = {};
@@ -14,11 +14,11 @@ function WorkList(props) {
       render: type_id => allType[type_id]?.name,
     },
     {
-      title: '所属项目',
+      title: '所属项目/所属部门',
       width: '30%',
       render: item => {
         if (item.zIndex === 0) return '';
-        return item.Project?.Name || '-';
+        return item.Project?.Name || depUserMap?.get(item.pay_dep_id)?.Name || '-';
       },
     },
     {

+ 17 - 2
src/pages/PurchaseAdmin/PurchaseList/WorkingHours/index.js

@@ -6,7 +6,7 @@ import { connect } from 'dva';
 import moment from 'moment';
 
 function List(props) {
-  const { typeList, dispatch, loading, dataList, projectList, currentUser, allType } = props;
+  const { typeList, dispatch, loading, dataList, projectList, currentUser, allType, depUserTree, depUserMap } = props;
   const [visible, setVisible] = useState(false);
   const [current, setCurrent] = useState({
     date: moment(),
@@ -33,6 +33,7 @@ function List(props) {
                 project_id: item.project_id,
                 workload: workload,
                 day: item.time,
+                pay_dep_id: item.pay_dep_id
               },
             ],
           },
@@ -60,6 +61,7 @@ function List(props) {
       cancelText: '取消',
       onOk() {
         let params = [];
+        debugger
         for (let i = 0; i < dataList.length; i++) {
           const element = dataList[i];
           if (element.audit_state != 0) continue;
@@ -72,6 +74,7 @@ function List(props) {
               project_id: element.project_id,
               workload: element.workload,
               day: element.time,
+              pay_dep_id: element.pay_dep_id
             });
           } else {
             let data = [];
@@ -80,6 +83,7 @@ function List(props) {
               project_id: element.project_id,
               workload: element.workload,
               day: element.time,
+              pay_dep_id: element.pay_dep_id
             });
             params.push({
               type_id: Number(element.type_id),
@@ -119,6 +123,7 @@ function List(props) {
               project_id: element.project_id,
               workload: element.workload,
               day: element.time,
+              pay_dep_id: element.pay_dep_id
             });
           } else {
             let data = [];
@@ -127,6 +132,7 @@ function List(props) {
               project_id: element.project_id,
               workload: element.workload,
               day: element.time,
+              pay_dep_id: element.pay_dep_id
             });
             params.push({
               type_id: Number(element.type_id),
@@ -158,6 +164,7 @@ function List(props) {
             project_id: Number(item.project_id),
             workload: workload,
             day: item.time,
+            pay_dep_id: item.pay_dep_id
           },
         ],
       },
@@ -335,7 +342,11 @@ function List(props) {
   // useEffect(() => {
   //   onChangeDate(current.date);
   // }, [dataList]);
-
+  useEffect(() => {
+    dispatch({
+      type: 'workload/fetchDepV2',
+    });
+  }, []);
   return (
     <div>
       <Spin spinning={loading}>
@@ -376,6 +387,7 @@ function List(props) {
               onAuth={onAuth}
               onSave={onSave}
               onDelete={onDelete}
+              depUserMap={depUserMap}
             />
           </Col>
         </Row>
@@ -387,6 +399,7 @@ function List(props) {
         onOk={onAddWork}
         time={current.date?.format('YYYY-MM-DD')}
         onCancel={() => setVisible(false)}
+        depUserTree={depUserTree}
       />
     </div>
   );
@@ -398,4 +411,6 @@ export default connect(({ workload, user, loading }) => ({
   allType: workload.allType,
   currentUser: user.currentUser,
   loading: loading.models.workload,
+  depUserTree: workload.depUserTree,
+  depUserMap: workload.depUserMap
 }))(List);

+ 29 - 0
src/pages/PurchaseAdmin/PurchaseList/WorkingHours/models/workingHours.js

@@ -9,9 +9,25 @@ import {
   deleteWorkHour,
 } from '@/services/workHours';
 import { queryRole } from '@/services/SysAdmin';
+import { queryDepV2 } from '@/services/approval';
 import { message } from 'antd';
 import moment from 'moment';
 
+function getDepUserTree(data, map) {
+  data.title = `${data.Name}`;
+  data.key = `${data.ID}`;
+  data.value = `${data.ID}`;
+  map.set(data.ID, data);
+  if (!data.children) data.children = new Array();
+
+  if (data.children) {
+    data.children.forEach(item => {
+      getDepUserTree(item, map);
+    });
+  }
+  return data;
+}
+
 export default {
   namespace: 'workload',
   state: {
@@ -196,6 +212,19 @@ export default {
         callback,
       });
     },
+    *fetchDepV2({ payload, callback }, { call, put }) {
+      const response = yield call(queryDepV2, { pageSize: 999999 });
+      if (response) {
+        const depUserMap = new Map();
+        const depUserTree = response.data.list.map(item => {
+          return getDepUserTree(item, depUserMap);
+        });
+        yield put({
+          type: 'save',
+          payload: { depUserTree, depUserMap },
+        });
+      }
+    },
   },
 
   reducers: {

+ 8 - 0
src/services/approval.js

@@ -123,3 +123,11 @@ export async function setBudget(params) {
     body: params,
   });
 }
+
+//修改项目经理
+export async function modifyManager(params) {
+  return request(`/api/v2/workload/project/change_pm`, {
+    method: 'POST',
+    body: params,
+  });
+}