Browse Source

人员调配详情以及bug修复

zhangjie 1 year ago
parent
commit
2146d38641

+ 9 - 0
src/components/common/status-tag/config.js

@@ -5,6 +5,7 @@ import {
   violationFlowStatusFilter,
   publishStatusFilter,
   attendanceResultFilter,
+  crmStatusFilter,
 } from '@/utils/filter';
 
 const configs = {
@@ -46,6 +47,14 @@ const configs = {
     },
     valFilter: publishStatusFilter,
   },
+  crmStatus: {
+    themeDict: {
+      PUBLISH: 'success',
+      UN_PUBLISH: 'danger',
+      FINISH: 'primary',
+    },
+    valFilter: crmStatusFilter,
+  },
   attendanceResult: {
     themeDict: {
       NORMAL: 'success',

+ 15 - 0
src/style/global.less

@@ -500,6 +500,21 @@ body {
       min-height: 65px;
     }
   }
+  .sop-step-content {
+    flex-grow: 2;
+    border-radius: 3px;
+    border: 1px solid @light-border-color;
+    padding: 16px;
+    overflow: auto;
+
+    > h3 {
+      font-size: 16px;
+      font-weight: bold;
+      color: @dark-text-color;
+      line-height: 24px;
+      margin-bottom: 16px;
+    }
+  }
 }
 // sop-step-history
 .sop-step-history {

+ 4 - 0
src/utils/filter.js

@@ -29,6 +29,7 @@ import {
   VIOLATION_FLOW_STATUS,
   WARN_TYPE,
   WARN_FLOW_STATUS,
+  CRM_STATUS,
 } from '@/config/constants';
 import { dateFormat } from './tool';
 
@@ -147,3 +148,6 @@ export function warnTypeFilter(val) {
 export function warnFlowStatusFilter(val) {
   return WARN_FLOW_STATUS[val] || DEFAULT_FIELD;
 }
+export function crmStatusFilter(val) {
+  return CRM_STATUS[val] || DEFAULT_FIELD;
+}

+ 9 - 2
src/views/my-workbenches/workbenches/my-waits/index.vue

@@ -24,7 +24,7 @@
       <TaskList
         :tableData="tableData"
         :pagination="pagination"
-        :onChange="onChange"
+        @success="taskModified"
       ></TaskList>
     </div>
   </div>
@@ -37,6 +37,8 @@ import { getMyWaits } from '@/api/my-workbenches';
 import { WAIT_HANDLE_TYPE } from '@/config/constants';
 import { dictToOptionList } from '@/utils/tool';
 import TaskList from './waits-list.vue';
+import { useWorkStore } from '@/store';
+const workStore = useWorkStore();
 
 const tabs = [
   {
@@ -64,7 +66,7 @@ const {
   loading: loading,
   pagination: pagination,
   tableData: tableData,
-  onChange: onChange,
+  fetchData,
   search: search,
 } = useFetchTable(getMyWaits, {
   params: params,
@@ -114,4 +116,9 @@ const fields = ref([
     ],
   },
 ]);
+
+const taskModified = () => {
+  fetchData();
+  workStore.updateWorkCounts();
+};
 </script>

+ 2 - 1
src/views/my-workbenches/workbenches/my-waits/waits-list.vue

@@ -70,6 +70,7 @@ const { tableData, pagination, onChange } = defineProps([
   'pagination',
   'onChange',
 ]);
+const emit = defineEmits(['success']);
 
 const showSopStepDialog = ref(false);
 const curSopData = ref({});
@@ -78,6 +79,6 @@ const editSopFlowHandle = (row) => {
   showSopStepDialog.value = true;
 };
 const sopStepConfirm = () => {
-  onChange(pagination);
+  emit('success');
 };
 </script>

+ 4 - 3
src/views/resource-guard/device-guard/registration-query/index.vue

@@ -41,9 +41,10 @@
           {{ timestampFilter(row[col.colKey]) }}
         </template>
         <template #detail="{ col, row }">
-          <t-link theme="primary" hover="color" @click="handleDetail(row)">
-            {{ row[col.colKey] }}
-          </t-link>
+          <more-content
+            :content="row[col.colKey]"
+            @action="handleDetail(row)"
+          ></more-content>
         </template>
       </t-table>
     </div>

+ 171 - 0
src/views/resource-guard/person-guard/person-allocate/deploy-detail-dialog.vue

@@ -0,0 +1,171 @@
+<template>
+  <my-drawer
+    class="sop-dialog"
+    :visible="visible"
+    size="80%"
+    header="调配详情"
+    attach="body"
+    :close-btn="true"
+    @close="emit('update:visible', false)"
+  >
+    <div class="sop-step">
+      <t-collapse class="sop-step-mid" defaultExpandAll>
+        <t-collapse-panel disabled>
+          <template #expandIcon></template>
+          <template #header> 基础信息 </template>
+          <t-form :labelWidth="66" colon>
+            <t-row :gutter="[20, 0]">
+              <t-col :span="6">
+                <t-form-item label="服务单元"
+                  >{{ curRow.serviceUnitName }}
+                </t-form-item>
+              </t-col>
+              <t-col :span="6">
+                <t-form-item label="项目单号">{{ curRow.crmNo }} </t-form-item>
+              </t-col>
+              <t-col :span="6">
+                <t-form-item label="客户类型"
+                  >{{ customerTypeFilter(curRow.customType) }}
+                </t-form-item>
+              </t-col>
+              <t-col :span="6">
+                <t-form-item label="客户名称"
+                  >{{ curRow.customName }}
+                </t-form-item>
+              </t-col>
+              <t-col :span="6">
+                <t-form-item label="服务档位">{{ curRow.level }} </t-form-item>
+              </t-col>
+              <t-col :span="12">
+                <t-form-item label="客户地址">
+                  <t-space>
+                    <span>{{ curRow.province }}</span>
+                    <span>{{ curRow.city }}</span>
+                    <span>{{ curRow.area }}</span>
+                    <span>{{ curRow.address }}</span>
+                  </t-space>
+                </t-form-item>
+              </t-col>
+            </t-row>
+          </t-form>
+        </t-collapse-panel>
+      </t-collapse>
+      <div class="sop-step-content">
+        <h3>人员调配</h3>
+        <t-form label-width="110px">
+          <t-form-item label="区域协调人">
+            <t-radio v-model="curRow.ss" disabled>由大区经理兼任</t-radio>
+          </t-form-item>
+        </t-form>
+        <div class="deploy-list">
+          <div
+            v-for="item in roleConfigInfo"
+            :key="item.roleId"
+            class="deploy-item"
+          >
+            <div class="deploy-label">
+              <t-tag size="large">{{ item.roleName }}</t-tag>
+            </div>
+            <div class="deploy-content">
+              <t-space>
+                <t-tag v-for="user in item.userList" :key="user.userId">
+                  {{
+                    `${user.archiverName}_${user.supplierName}_${user.archivesCity}`
+                  }}
+                </t-tag>
+              </t-space>
+            </div>
+          </div>
+        </div>
+        <h3 class="m-t-24px">发布状态</h3>
+        <t-space :size="40">
+          <div>
+            SOP发布:
+            <status-tag :value="curRow.crmStatus" type="crmStatus"></status-tag>
+          </div>
+        </t-space>
+      </div>
+    </div>
+
+    <template #foot>
+      <t-button theme="primary" @click="emit('update:visible', false)"
+        >返回</t-button
+      >
+    </template>
+  </my-drawer>
+</template>
+<script setup name="DeployDetailDialog">
+import { ref, watch } from 'vue';
+import { personAllocateRoleDetailApi } from '@/api/resource-guard';
+import { customerTypeFilter } from '@/utils/filter';
+
+const emit = defineEmits(['update:visible', 'success']);
+const props = defineProps({
+  visible: Boolean,
+  curRow: Object,
+});
+let roleConfigInfo = ref([]);
+
+const getDetail = async () => {
+  const res = await personAllocateRoleDetailApi(props.curRow.crmNo).catch(
+    () => {}
+  );
+  if (!res) return;
+
+  const roleQuota = {
+    REGION_COORDINATOR: props.curRow.coordinatorQuota,
+    EFFECT_ENGINEER: props.curRow.effectQuota,
+    ASSISTANT_ENGINEER: props.curRow.assistantQuota,
+  };
+
+  if (res.length) {
+    let roleConfigMap = {};
+
+    res.forEach((item) => {
+      if (!roleConfigMap[item.roleResult.roleId]) {
+        roleConfigMap[item.roleResult.roleId] = {
+          quota: roleQuota[item.roleResult.roleType],
+          userList: [],
+          ...item.roleResult,
+        };
+      }
+      roleConfigMap[item.roleResult.roleId].userList.push(item);
+    });
+    roleConfigInfo.value = Object.values(roleConfigMap);
+  } else {
+    roleConfigInfo.value = [];
+  }
+};
+
+watch(
+  () => props.visible,
+  (val) => {
+    if (val) getDetail();
+  }
+);
+</script>
+
+<style lang="less" scoped>
+.deploy-list {
+  .deploy-item {
+    margin: 16px 0;
+    display: flex;
+  }
+  .deploy-label {
+    flex-grow: 0;
+    flex-shrink: 0;
+    width: 110px;
+    margin-right: 8px;
+    .t-tag {
+      width: 100%;
+    }
+  }
+  .deploy-content {
+    border-radius: 4px;
+    border: 1px solid #d9d9d9;
+    padding: 4px;
+    min-height: 32px;
+    min-width: 300px;
+  }
+}
+</style>

+ 9 - 1
src/views/resource-guard/person-guard/person-allocate/index.vue

@@ -126,6 +126,11 @@
       :curRow="curRow"
       @success="personDeploySuccess"
     ></person-deploy-dialog>
+    <!-- DeployDetailDialog -->
+    <deploy-detail-dialog
+      v-model:visible="showDeployDetailDialog"
+      :curRow="curRow"
+    ></deploy-detail-dialog>
   </div>
 </template>
 
@@ -144,11 +149,13 @@ import {
 } from '@/api/resource-guard';
 import { customerTypeFilter } from '@/utils/filter';
 import PersonDeployDialog from './person-deploy-dialog.vue';
+import DeployDetailDialog from './deploy-detail-dialog.vue';
 import usePermission from '@/hooks/usePermission';
 const { perm } = usePermission();
 
 const curRow = ref(null);
 const showPersonDeployDialog = ref(false);
+const showDeployDetailDialog = ref(false);
 
 let areaInfo = ref(['', '', '']);
 let statisticsInfo = ref({});
@@ -362,6 +369,7 @@ const handleCancelSubmitSop = (row) => {
 };
 
 const handleDetail = (row) => {
-  console.log(row);
+  curRow.value = row;
+  showDeployDetailDialog.value = true;
 };
 </script>

+ 14 - 10
src/views/sop/sop-manage/sop-step/index.vue

@@ -176,7 +176,7 @@
                     </template>
                     <div class="content-detail">
                       <div class="content-detail-head">
-                        {{ item.approveUserName }}
+                        {{ item.approveUserName || '--' }}
                       </div>
                       <div class="content-detail-body">
                         <p>开始处理:{{ timestampFilter(item.createTime) }}</p>
@@ -280,9 +280,11 @@ const currFlowTaskResultSetup = ref(null);
 const flowId = props.sop.flowId;
 const crmInfo = ref({});
 const approveRejectFormIds = {
-  // [taskkey]:[formId]
-  f_usertask_office_inside_approve_region_3: 'approve_radio_3',
-  f_usertask_office_inside_approve_engineer_4: 'approve_radio_4',
+  // taskkey:[formId]
+  f_usertask_office_inside_approve_3: [
+    'approve_radio_region_3',
+    'approve_radio_engineer_3',
+  ],
 };
 const stepHistoryShow = ref(false);
 const flowApproveHistoryList = ref([]);
@@ -558,18 +560,20 @@ const submitHandle = async (approve = 'START') => {
     const valid = await form.value[0].validate();
     if (valid !== true) return;
 
-    if (curStepData.value.setup === 1) {
-      approve = 'START';
-    } else {
-      const approveRejectFormId =
-        approveRejectFormIds[curStepData.value.taskKey];
-      if (approveRejectFormId && formData.value[approveRejectFormId] === '0') {
+    if (curStepData.value.setup !== 1) {
+      const rejectFormIds = approveRejectFormIds[curStepData.value.taskKey];
+      if (
+        rejectFormIds &&
+        rejectFormIds.some((fid) => formData.value[fid] === '0')
+      ) {
         approve = 'REJECT';
       } else {
         approve = 'PASS';
       }
     }
   }
+  // console.log(approve);
+  // if (approve) return;
 
   if (IS_FILL_MODE.value) {
     let data = {

+ 1 - 2
src/views/user/auth-manage/user-manage/index.vue

@@ -94,9 +94,8 @@ const showUpdateUserPwdDialog = ref(false);
 const curRow = ref(null);
 
 const columns = [
-  { colKey: 'id', title: '用户ID', width: 200 },
+  { colKey: 'loginName', title: '登录名', width: 140 },
   { colKey: 'realName', title: '姓名', minWidth: 140 },
-  { colKey: 'loginName', title: '登录名', minWidth: 140 },
   { colKey: 'genderStr', title: '性别', width: 80 },
   { colKey: 'mobileNumber', title: '手机', width: 160 },
   { colKey: 'orgName', title: '所属节点', width: 160 },