刘洋 1 an în urmă
părinte
comite
4ecb55f246
45 a modificat fișierele cu 414 adăugiri și 177 ștergeri
  1. 1 1
      package.json
  2. 36 0
      src/api/service-unit.js
  3. 5 5
      src/components/common/device-manage-new/tab2.vue
  4. 1 1
      src/components/global/my-table/index.vue
  5. 1 13
      src/components/global/search-form/index.vue
  6. 2 2
      src/config/constants.js
  7. 1 1
      src/hooks/useClearDialog.js
  8. 1 1
      src/hooks/useTableCrud.js
  9. 1 1
      src/store/modules/user.js
  10. 1 1
      src/utils/chart.js
  11. 1 1
      src/utils/request.js
  12. 1 1
      src/utils/tool.js
  13. 1 1
      src/views/my-workbenches/workbenches/notice/index.vue
  14. 1 1
      src/views/project-quality/project-quality-manage/issues-feedback/index.vue
  15. 1 1
      src/views/project-quality/project-quality-manage/issues-query/index.vue
  16. 1 1
      src/views/report/quality-analysis/index.vue
  17. 1 1
      src/views/report/service-analysis/index.vue
  18. 1 1
      src/views/resource-guard/device-guard/device-send/index.vue
  19. 1 1
      src/views/resource-guard/device-guard/registration-query/index.vue
  20. 1 1
      src/views/resource-guard/person-guard/person-allocate/person-deploy-dialog.vue
  21. 1 1
      src/views/resource-guard/person-guard/person-files/index.vue
  22. 1 1
      src/views/service-unit/dispatch/dispatch-manage/allocation-dialog.vue
  23. 59 59
      src/views/service-unit/dispatch/dispatch-manage/create-sop-item.vue
  24. 196 29
      src/views/service-unit/dispatch/dispatch-manage/create-sop.vue
  25. 1 1
      src/views/service-unit/dispatch/dispatch-manage/index.vue
  26. 1 1
      src/views/service-unit/service-unit-manage/range-manage/add-range-dialog.vue
  27. 1 1
      src/views/service-unit/service-unit-manage/unit-manage/index.vue
  28. 1 1
      src/views/sop/components/dynamic-form-item/device-table/index.vue
  29. 1 1
      src/views/sop/components/select-metadata.vue
  30. 1 1
      src/views/sop/sop-manage/device-out-in/index.vue
  31. 1 1
      src/views/sop/sop-manage/office-sop/index.vue
  32. 1 1
      src/views/sop/sop-manage/plan-change/index.vue
  33. 1 1
      src/views/sop/sop-manage/project-change-report/index.vue
  34. 77 31
      src/views/sop/sop-manage/student-sop/index.vue
  35. 1 1
      src/views/sop/sop-monitor/delay-warning/index.vue
  36. 1 1
      src/views/sop/sop-monitor/violation-registration/index.vue
  37. 1 1
      src/views/system/config-manage/checkin-manage/edit-checkin-dialog.vue
  38. 1 1
      src/views/system/config-manage/checkin-manage/index.vue
  39. 1 1
      src/views/system/config-manage/device-manage/index.vue
  40. 1 1
      src/views/system/notice-log/log-manage/index.vue
  41. 1 1
      src/views/system/notice-log/notice-manage/index.vue
  42. 1 1
      src/views/user/org-struct-manage/struct-manage/index.vue
  43. 1 1
      src/views/work-hours/work-hours-manage/abnormal-check/done-check.vue
  44. 1 1
      src/views/work-hours/work-hours-manage/abnormal-check/wait-check.vue
  45. 1 1
      src/views/work-hours/work-hours-manage/work-attendance-detail/index.vue

+ 1 - 1
package.json

@@ -31,7 +31,7 @@
     "echarts": "^5.4.2",
     "echarts-liquidfill": "^3.1.0",
     "element-resize-detector": "^1.2.4",
-    "lodash": "^4.17.21",
+    "lodash-es": "^4.17.21",
     "mitt": "^3.0.1",
     "mockjs": "^1.1.0",
     "nprogress": "^0.2.0",

+ 36 - 0
src/api/service-unit.js

@@ -130,3 +130,39 @@ export const serviceRegionRemoveApi = (serviceRegionId) =>
     params: { serviceRegionIdList: serviceRegionId },
     paramsSerializer,
   });
+
+/** v1.1.0 add */
+export const getDispatchInfoApi = (params) =>
+  request({
+    url: '/api/admin/tb/crm/detail/sop/var/info',
+    params,
+  });
+export const getSubSopListApi = (params) =>
+  request({
+    url: '/api/admin/tb/crm/detail/sop/info',
+    params,
+  });
+//派单明细sop变量保存接口
+export const saveProcessVarApi = (data) =>
+  request({
+    url: '/api/admin/tb/crm/detail/sop/var/save',
+    data,
+  });
+//创建/编辑派单明细sop接口
+export const saveSubSopListApi = (data) =>
+  request({
+    url: '/api/admin/tb/crm/detail/sop/save',
+    data,
+  });
+//发布
+export const subSopPublishApi = (params) =>
+  request({
+    url: '/api/admin/tb/crm/detail/sop/publish',
+    params,
+  });
+//删除
+export const subSopDeleteApi = (params) =>
+  request({
+    url: '/api/admin/tb/crm/detail/sop/delete',
+    params,
+  });

+ 5 - 5
src/components/common/device-manage-new/tab2.vue

@@ -7,8 +7,8 @@
     bordered
     class="mt-10px"
   >
-    <template #ddd="{ row }">
-      {{ RUNNING_STATUS[row.ddd] }}
+    <template #ccc="{ row }">
+      {{ RUNNING_STATUS[row.ccc] }}
     </template>
     <template #fff="{ row }">
       {{ DEVICE_USE_STATUS[row.fff] }}
@@ -79,7 +79,7 @@
 import { ref, computed } from 'vue';
 import { RUNNING_STATUS, DEVICE_USE_STATUS } from '@/config/constants';
 import { dictToOptionList } from '@/utils/tool';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 
 const curRow = ref(null);
 
@@ -289,8 +289,8 @@ const tableData = ref([
   {
     aaa: 'aaa',
     bbb: 'bbb',
-    ccc: 'ccc',
-    ddd: 'BREAK_DOWN',
+    ccc: 'BREAK_DOWN',
+    ddd: 'ddd',
     eee: 'eee',
     fff: '1',
     ggg: 'ggg',

+ 1 - 1
src/components/global/my-table/index.vue

@@ -22,7 +22,7 @@
 </template>
 <script setup name="MyTable">
 import { useAttrs, useSlots, ref, computed, defineComponent } from 'vue';
-import { cloneDeep, omit } from 'lodash';
+import { cloneDeep, omit } from 'lodash-es';
 const slots = useSlots();
 const attrs = useAttrs();
 const collapse = ref(false);

+ 1 - 13
src/components/global/search-form/index.vue

@@ -88,10 +88,8 @@ import {
 import { ChevronDownIcon, ChevronUpIcon } from 'tdesign-icons-vue-next';
 import SearchFormItem from './components/search-form-item.vue';
 import elementResizeDetectorMaker from 'element-resize-detector';
-import { cloneDeep } from 'lodash';
-import { useAppStore } from '@/store';
+import { cloneDeep } from 'lodash-es';
 const otherRows = ref(null);
-const appStore = useAppStore();
 let comWidth = ref(0);
 const { proxy } = getCurrentInstance();
 const listen = () => {
@@ -194,16 +192,6 @@ const fields = [
   },
 ];
 */
-// if (props.showAll) {
-//   //假设配置为不显示展开按钮,则要考虑把"查询"按钮排到末尾端
-//   let buttonsFieldIndex = props.fields.findIndex(
-//     (item) => item.type === 'buttons'
-//   );
-//   if (buttonsFieldIndex > -1) {
-//     let buttonsFieldArr = props.fields.splice(buttonsFieldIndex, 1);
-//     props.fields.push(buttonsFieldArr[0]);
-//   }
-// }
 const showExpandBtn = computed(() => {
   let allColSpanNum = filterFields.value.reduce((total, item) => {
     return total + item.colSpan;

+ 2 - 2
src/config/constants.js

@@ -245,8 +245,8 @@ export const DEVICE_SEND_STATUS = {
 };
 
 export const SERVICE_RANGE = {
-  1: '仅扫描',
-  2: '扫描+阅卷',
+  SCAN: '仅扫描',
+  SCAN_MARK: '扫描+阅卷',
 };
 
 export const DEVICE_USE_STATUS = {

+ 1 - 1
src/hooks/useClearDialog.js

@@ -1,5 +1,5 @@
 import { reactive, watch, ref } from 'vue';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 
 export default function useClearDialog(data, props, formRef, getDetail) {
   let formData = reactive(cloneDeep(data));

+ 1 - 1
src/hooks/useTableCrud.js

@@ -1,5 +1,5 @@
 import { computed, ref } from 'vue';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 import { MessagePlugin } from 'tdesign-vue-next';
 const ACTIONS = {
   edit: '修改',

+ 1 - 1
src/store/modules/user.js

@@ -1,5 +1,5 @@
 import { defineStore } from 'pinia';
-import { cloneDeep, omit } from 'lodash';
+import { cloneDeep, omit } from 'lodash-es';
 import { getMenus, logout, login } from '@/api/user';
 import router from '@/router/index';
 import asyncRoutes, {

+ 1 - 1
src/utils/chart.js

@@ -1,5 +1,5 @@
 import 'echarts-liquidfill/src/liquidFill.js';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 import { useAppStore } from '@/store';
 const appStore = useAppStore();
 

+ 1 - 1
src/utils/request.js

@@ -1,7 +1,7 @@
 import axios from 'axios';
 import { MessagePlugin as Message } from 'tdesign-vue-next';
 import { download, clear } from '@/utils/tool';
-import { get, isEmpty } from 'lodash';
+import { get, isEmpty } from 'lodash-es';
 import qs from 'qs';
 // import { h } from 'vue';
 import { LoadingPlugin } from 'tdesign-vue-next';

+ 1 - 1
src/utils/tool.js

@@ -1,4 +1,4 @@
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 import { useUserStore } from '@/store';
 import { DialogPlugin } from 'tdesign-vue-next';
 

+ 1 - 1
src/views/my-workbenches/workbenches/notice/index.vue

@@ -59,7 +59,7 @@ import { reactive, computed, ref } from 'vue';
 import useFetchTable from '@/hooks/useFetchTable';
 import { getMyMessages, setMyMessagesRead } from '@/api/my-workbenches';
 import NoticeList from './notice-list.vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { dateFormat } from '@/utils/tool';
 import { useWorkStore } from '@/store';
 

+ 1 - 1
src/views/project-quality/project-quality-manage/issues-feedback/index.vue

@@ -96,7 +96,7 @@
 
 <script setup name="IssuesFeedback">
 import { computed, reactive, ref } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import QualityIssueDialog from '@/views/sop/sop-manage/quality-issue/quality-issue-dialog.vue';
 

+ 1 - 1
src/views/project-quality/project-quality-manage/issues-query/index.vue

@@ -48,7 +48,7 @@
 
 <script setup name="IssuesQuery">
 import { computed, reactive, ref } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 
 import { issuesFeedbackListApi } from '@/api/project-quality';
 import useFetchTable from '@/hooks/useFetchTable';

+ 1 - 1
src/views/report/quality-analysis/index.vue

@@ -173,7 +173,7 @@ import { FullscreenIcon } from 'tdesign-icons-vue-next';
 import { ISSUES_REASON_TYPE } from '@/config/constants';
 import InventoryDrillDialog from './inventory-drill-dialog.vue';
 import DegreeDrillDialog from './degree-drill-dialog.vue';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 const chart11 = ref();
 const chart12 = ref();
 const chart21 = ref();

+ 1 - 1
src/views/report/service-analysis/index.vue

@@ -225,7 +225,7 @@ import {
 } from '@/api/report';
 import SupplierDetailDrillDialog from './supplier-detail-drill-dialog.vue';
 import { FullscreenIcon } from 'tdesign-icons-vue-next';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 const chart8 = ref();
 
 const showSupplierDetailDrill = ref(false);

+ 1 - 1
src/views/resource-guard/device-guard/device-send/index.vue

@@ -194,7 +194,7 @@
 
 <script setup name="DeviceSend">
 import { ref, reactive, computed, onMounted } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import {

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

@@ -64,7 +64,7 @@
 
 <script setup name="RegistrationQuery">
 import { ref, reactive, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 
 import { registrationQueryListApi } from '@/api/resource-guard';
 import useFetchTable from '@/hooks/useFetchTable';

+ 1 - 1
src/views/resource-guard/person-guard/person-allocate/person-deploy-dialog.vue

@@ -146,7 +146,7 @@ import {
   personAllocateRoleDetailApi,
 } from '@/api/resource-guard';
 import { customerTypeFilter } from '@/utils/filter';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 
 const emit = defineEmits(['update:visible', 'success']);
 const props = defineProps({

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

@@ -165,7 +165,7 @@
 
 <script setup name="PersonFiles">
 import { ref, reactive, computed, onMounted } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import { ErrorCircleFilledIcon } from 'tdesign-icons-vue-next';

+ 1 - 1
src/views/service-unit/dispatch/dispatch-manage/allocation-dialog.vue

@@ -84,7 +84,7 @@ import {
   personAllocateRoleDetailApi,
 } from '@/api/resource-guard';
 import { customerTypeFilter } from '@/utils/filter';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 
 const emit = defineEmits(['update:visible', 'success']);
 const props = defineProps({

+ 59 - 59
src/views/service-unit/dispatch/dispatch-manage/create-sop-item.vue

@@ -2,7 +2,7 @@
   <my-dialog
     :visible="visible"
     :header="`${isEdit ? '编辑' : '新增'}sop`"
-    :width="600"
+    :width="800"
     :closeOnOverlayClick="false"
     attach="body"
     @close="emit('update:visible', false)"
@@ -30,26 +30,26 @@ const props = defineProps({
 const emit = defineEmits(['update:visible', 'confirm']);
 
 const rules = {
-  aaa: [{ required: true, message: '请填写科目名称' }],
-  bbb: [{ required: true, message: '请填写考生人数' }],
-  eee: [{ required: true, message: '请选择服务范围' }],
-  fff: [{ required: true, message: '请选择扫描开始时间' }],
-  ggg: [{ required: true, message: '请选择扫描结束时间' }],
-  hhh: [{ required: true, message: '请选择评卷开始时间' }],
-  iii: [{ required: true, message: '请选择评卷结束时间' }],
+  courseName: [{ required: true, message: '请填写科目名称' }],
+  examStudentCount: [{ required: true, message: '请填写考生人数' }],
+  serviceScope: [{ required: true, message: '请选择服务范围' }],
+  scanStartTime: [{ required: true, message: '请选择扫描开始时间' }],
+  scanEndTime: [{ required: true, message: '请选择扫描结束时间' }],
+  markPaperStartTime: [{ required: true, message: '请选择评卷开始时间' }],
+  markPaperEndTime: [{ required: true, message: '请选择评卷结束时间' }],
 };
 
 const { formData, isEdit } = useClearDialog(
   {
-    aaa: '',
-    bbb: '',
-    ccc: '',
-    ddd: '',
-    eee: '',
-    fff: '',
-    ggg: '',
-    hhh: '',
-    iii: '',
+    courseName: '',
+    scanStartTime: '',
+    examStudentCount: '',
+    scanEndTime: '',
+    contacts: '',
+    markPaperStartTime: '',
+    mobileNumber: '',
+    markPaperEndTime: '',
+    serviceScope: '',
   },
   props,
   null,
@@ -62,94 +62,94 @@ const { formData, isEdit } = useClearDialog(
 
 const fields = ref([
   {
-    prop: 'aaa',
+    prop: 'courseName',
     label: '科目名称',
-    labelWidth: 100,
-    colSpan: 24,
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
     },
   },
   {
-    prop: 'bbb',
-    label: '考生人数',
-    labelWidth: 100,
-    colSpan: 24,
+    prop: 'scanStartTime',
+    label: '扫描开始时间',
+    type: 'date',
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
+      valueType: 'time-stamp',
     },
   },
   {
-    prop: 'ccc',
-    label: '联系人',
-    labelWidth: 100,
-    colSpan: 24,
+    prop: 'examStudentCount',
+    label: '考生人数',
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
     },
   },
   {
-    prop: 'ddd',
-    label: '电话',
-    labelWidth: 100,
-    colSpan: 24,
+    prop: 'scanEndTime',
+    label: '扫描结束时间',
+    type: 'date',
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
+      valueType: 'time-stamp',
     },
   },
   {
-    prop: 'eee',
-    label: '服务范围',
-    type: 'select',
-    labelWidth: 100,
-    colSpan: 24,
-    options: dictToOptionList(SERVICE_RANGE),
+    prop: 'contacts',
+    label: '联系人',
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
     },
   },
   {
-    prop: 'fff',
-    label: '扫描开始时间',
+    prop: 'markPaperStartTime',
+    label: '评卷开始时间',
     type: 'date',
-    labelWidth: 100,
-    colSpan: 24,
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
       valueType: 'time-stamp',
     },
   },
   {
-    prop: 'ggg',
-    label: '扫描结束时间',
-    type: 'date',
-    labelWidth: 100,
-    colSpan: 24,
+    prop: 'mobileNumber',
+    label: '电话',
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
-      valueType: 'time-stamp',
     },
   },
   {
-    prop: 'hhh',
-    label: '评卷开始时间',
+    prop: 'markPaperEndTime',
+    label: '评卷结束时间',
     type: 'date',
-    labelWidth: 100,
-    colSpan: 24,
+    labelWidth: 120,
+    colSpan: 12,
     attrs: {
       clearable: true,
       valueType: 'time-stamp',
     },
   },
   {
-    prop: 'iii',
-    label: '评卷结束时间',
-    type: 'date',
-    labelWidth: 100,
-    colSpan: 24,
+    prop: 'serviceScope',
+    label: '服务范围',
+    type: 'select',
+    labelWidth: 120,
+    colSpan: 12,
+    options: dictToOptionList(SERVICE_RANGE),
     attrs: {
       clearable: true,
-      valueType: 'time-stamp',
     },
   },
 ]);
@@ -158,7 +158,7 @@ const createHandler = async () => {
   const valid = await formRef?.validate();
   if (valid !== true) return;
   emit('update:visible', false);
-  emit('confirm', { ...formData });
+  emit('confirm', { ...formData, status: 'UN_PUBLISH' });
 };
 </script>
 <style lang="less" scoped></style>

+ 196 - 29
src/views/service-unit/dispatch/dispatch-manage/create-sop.vue

@@ -9,6 +9,7 @@
     :closeOnOverlayClick="false"
     :close-btn="true"
     @close="visible = false"
+    @confirm="confirm"
   >
     <t-collapse class="sop-step-mid" defaultExpandAll>
       <t-collapse-panel disabled>
@@ -50,17 +51,59 @@
         </t-form>
       </t-collapse-panel>
     </t-collapse>
-    <div class="btn-box mt-10px">
-      <t-button @click="toCreateSop">创建sop</t-button>
+    <div class="pt-20px" style="border-top: 1px solid #f0f0f0">
+      <t-button @click="editProcessVar">编辑</t-button>
+      <t-button class="ml-10px" variant="outline" @click="saveProcessVar"
+        >保存</t-button
+      >
+    </div>
+    <div class="mt-10px">
+      <t-row :gutter="[0, 0]">
+        <t-col
+          :span="
+            fullWidthCodes.includes(config.code)
+              ? 12
+              : config.span < 6
+              ? 6
+              : config.span || 6
+          "
+          v-for="config in processVar"
+          :key="config.id"
+        >
+          <dynamic-form-item
+            v-if="config.visable"
+            :config="config"
+            @change="itemValueChange"
+          ></dynamic-form-item>
+        </t-col>
+      </t-row>
+    </div>
+    <div class="btn-box pt-20px" style="border-top: 1px solid #f0f0f0">
+      <t-button @click="toCreateSop">新增sop</t-button>
     </div>
     <div class="mt-10px">
       <t-table
         size="small"
         row-key="index"
         :columns="columns"
-        :data="sopList"
+        :data="tableData"
         bordered
       >
+        <template #serviceScope="{ row }">{{
+          SERVICE_RANGE[row.serviceScope]
+        }}</template>
+        <template #scanStartTime="{ row }">{{
+          dateFormat(row.scanStartTime, 'yyyy/MM/dd HH:mm')
+        }}</template>
+        <template #scanEndTime="{ row }">{{
+          dateFormat(row.scanEndTime, 'yyyy/MM/dd HH:mm')
+        }}</template>
+        <template #markPaperStartTime="{ row }">{{
+          dateFormat(row.markPaperStartTime, 'yyyy/MM/dd HH:mm')
+        }}</template>
+        <template #markPaperEndTime="{ row }">{{
+          dateFormat(row.markPaperEndTime, 'yyyy/MM/dd HH:mm')
+        }}</template>
         <template #operate="{ row }">
           <div class="table-operations" @click.stop>
             <t-link theme="primary" hover="color" @click="allocation(row)">
@@ -69,8 +112,17 @@
             <t-link theme="primary" hover="color" @click="editSopItem(row)">
               编辑
             </t-link>
-            <t-link theme="primary" hover="color"> 发布 </t-link>
-            <t-link theme="primary" hover="color"> 删除 </t-link>
+            <t-link
+              :theme="row.status === 'UN_PUBLISH' ? 'primary' : 'default'"
+              hover="color"
+              :disabled="row.status === 'PUBLISH'"
+              @click="publishSopItem(row)"
+            >
+              发布
+            </t-link>
+            <t-link theme="primary" hover="color" @click="deleteSopItem(row)">
+              删除
+            </t-link>
           </div>
         </template>
       </t-table>
@@ -90,10 +142,32 @@
 </template>
 
 <script lang="ts" name="CreateSop" setup>
-import { computed, ref } from 'vue';
+import { computed, ref, watch } from 'vue';
 import { useVModel } from '@vueuse/core';
 import CreateSopItem from './create-sop-item.vue';
 import AllocationDialog from './allocation-dialog.vue';
+import useFetchTable from '@/hooks/useFetchTable';
+import {
+  getDispatchInfoApi,
+  getSubSopListApi,
+  saveProcessVarApi,
+  saveSubSopListApi,
+  subSopPublishApi,
+  subSopDeleteApi,
+} from '@/api/service-unit';
+import { SERVICE_RANGE } from '@/config/constants';
+import { dateFormat } from '@/utils/tool';
+import DynamicFormItem from '../../../sop/components/dynamic-form-item/index.vue';
+import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
+import { cloneDeep } from 'lodash-es';
+const fullWidthCodes = ref([
+  'TABLE',
+  'FORM_GROUP_TITLE',
+  'TEXTAREA',
+  'ONLY_TITLE',
+  'DEVICE_OUT_TABLE',
+  'DEVICE_IN_TABLE',
+]);
 const showAllocationDialog = ref(false);
 const props = defineProps({
   modelValue: Boolean,
@@ -106,34 +180,22 @@ const props = defineProps({
   },
 });
 const emit = defineEmits(['update:modelValue', 'confirm']);
-const sopList = ref([
-  {
-    aaa: 'aaa',
-    bbb: 'bbb',
-    ccc: 'ccc',
-    ddd: 'ddd',
-    eee: 'eee',
-    fff: 1714492800000,
-    ggg: 1714586400000,
-    hhh: 1716231780000,
-    iii: 1717167600000,
-  },
-]);
+
 const visible = useVModel(props, 'modelValue', emit);
 const title = computed(() => {
   if (props.type === 'new') return '新增SOP';
   if (props.type === 'edit') return '编辑SOP';
 });
 const columns = [
-  { colKey: 'aaa', title: '科目名称' },
-  { colKey: 'bbb', title: '考生人数' },
-  { colKey: 'ccc', title: '联系人' },
-  { colKey: 'ddd', title: '电话' },
-  { colKey: 'eee', title: '服务范围' },
-  { colKey: 'fff', title: '扫描开始时间' },
-  { colKey: 'ggg', title: '扫描结束时间' },
-  { colKey: 'hhh', title: '评卷开始时间' },
-  { colKey: 'iii', title: '评卷结束时间' },
+  { colKey: 'courseName', title: '科目名称' },
+  { colKey: 'examStudentCount', title: '考生人数', width: 80 },
+  { colKey: 'contacts', title: '联系人', width: 100 },
+  { colKey: 'mobileNumber', title: '电话', width: 120 },
+  { colKey: 'serviceScope', title: '服务范围', width: 100 },
+  { colKey: 'scanStartTime', title: '扫描开始时间', width: 150 },
+  { colKey: 'scanEndTime', title: '扫描结束时间', width: 150 },
+  { colKey: 'markPaperStartTime', title: '评卷开始时间', width: 150 },
+  { colKey: 'markPaperEndTime', title: '评卷结束时间', width: 150 },
   {
     colKey: 'operate',
     title: '管理',
@@ -148,12 +210,46 @@ const toCreateSop = () => {
   showCreateDialog.value = true;
 };
 const addSopItem = (item) => {
-  sopList.value.push(item);
+  saveSubSopListApi({ ...item, crmNo: props.dispatchInfo.crmNo }).then(() => {
+    MessagePlugin.success(item.id ? '修改成功' : '新增成功');
+    fetchData();
+  });
 };
 const editSopItem = (row) => {
   curRow.value = row;
   showCreateDialog.value = true;
 };
+
+const publishSopItem = (row) => {
+  const confirmDia = DialogPlugin({
+    header: '发布SOP提示',
+    body: `您确定要发布当前派单的SOP吗?`,
+    confirmBtn: '确定',
+    cancelBtn: '取消',
+    onConfirm: async () => {
+      confirmDia.hide();
+      const res = await subSopPublishApi({ id: row.id }).catch(() => {});
+      if (!res) return;
+      MessagePlugin.success('发布成功');
+      fetchData();
+    },
+  });
+};
+const deleteSopItem = (row) => {
+  const confirmDia = DialogPlugin({
+    header: '删除SOP提示',
+    body: `您确定要删除当前派单的SOP吗?`,
+    confirmBtn: '确定',
+    cancelBtn: '取消',
+    onConfirm: async () => {
+      confirmDia.hide();
+      const res = await subSopDeleteApi({ id: row.id }).catch(() => {});
+      if (!res) return;
+      MessagePlugin.success('删除成功');
+      fetchData();
+    },
+  });
+};
 const allocation = (row) => {
   curRow.value = row;
   showAllocationDialog.value = true;
@@ -161,4 +257,75 @@ const allocation = (row) => {
 const stepConfirm = () => {
   emit('confirm');
 };
+
+const params = computed(() => ({ crmNo: props.dispatchInfo?.crmNo }));
+const {
+  loading: tableLoading,
+  pagination,
+  tableData,
+  search,
+  fetchData,
+  onChange,
+} = useFetchTable(
+  getSubSopListApi,
+  {
+    params,
+  },
+  false
+);
+const processVar = ref([]);
+const editProcessVar = () => {
+  processVar.value.forEach((item) => {
+    item.writable = true;
+  });
+};
+const saveProcessVar = () => {
+  let arr = cloneDeep(processVar.value);
+  arr.forEach((item) => {
+    item.writable = false;
+    item.value = JSON.stringify({
+      value: item.value || null,
+    });
+  });
+  saveProcessVarApi({
+    crmNo: props.dispatchInfo.crmNo,
+    processVar: JSON.stringify(arr),
+  }).then(() => {
+    MessagePlugin.success('保存成功');
+    processVar.value.forEach((item) => {
+      item.writable = false;
+    });
+  });
+};
+watch(visible, (val) => {
+  val && whenOpen();
+});
+const getInfo = () => {
+  getDispatchInfoApi({ crmNo: props.dispatchInfo.crmNo }).then((res) => {
+    if (res) {
+      try {
+        processVar.value = JSON.parse(res.processVar).map((item) => {
+          item.value = item.value ? JSON.parse(item.value).value : null;
+          return item;
+        });
+        console.log('processVar.value', processVar.value);
+      } catch (e) {
+        console.error('processVar不是JSON');
+      }
+    }
+  });
+};
+const whenOpen = () => {
+  fetchData();
+  getInfo();
+};
+
+const itemValueChange = ({ prop, value }) => {
+  let obj = processVar.value.find((item) => item.formId == prop);
+  obj.value = value;
+};
+const confirm = () => {
+  emit('confirm');
+  visible.value = false;
+};
 </script>

+ 1 - 1
src/views/service-unit/dispatch/dispatch-manage/index.vue

@@ -201,7 +201,7 @@
 
 <script setup name="DispatchManage">
 import { reactive, ref, computed, onMounted } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import { ErrorCircleFilledIcon, FactCheckIcon } from 'tdesign-icons-vue-next';
 import CreateSop from './create-sop.vue';

+ 1 - 1
src/views/service-unit/service-unit-manage/range-manage/add-range-dialog.vue

@@ -87,7 +87,7 @@
 
 <script setup name="AddRangeDialog">
 import { reactive, ref, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { MessagePlugin } from 'tdesign-vue-next';
 import { SaveIcon, CloseIcon } from 'tdesign-icons-vue-next';
 import { serviceScopeUnbindCrmQueryApi } from '@/api/service-unit';

+ 1 - 1
src/views/service-unit/service-unit-manage/unit-manage/index.vue

@@ -125,7 +125,7 @@
 
 <script setup name="UnitManage">
 import { ref, reactive, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import useFetchTable from '@/hooks/useFetchTable';
 import AddUnitDialog from './add-unit-dialog.vue';

+ 1 - 1
src/views/sop/components/dynamic-form-item/device-table/index.vue

@@ -72,7 +72,7 @@
 import { computed, ref, watch } from 'vue';
 import EditColumnDialog from './edit-column-dialog.vue';
 import { deviceCanOut } from '@/api/sop';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 
 const props = defineProps({
   config: { type: Object },

+ 1 - 1
src/views/sop/components/select-metadata.vue

@@ -41,7 +41,7 @@
 
 <script setup name="SelectMetadata">
 import { onMounted, ref, useAttrs, watch, computed } from 'vue';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 import { metadataListApi } from '@/api/sop';
 
 const emit = defineEmits(['update:modelValue', 'change']);

+ 1 - 1
src/views/sop/sop-manage/device-out-in/index.vue

@@ -98,7 +98,7 @@ import AddDeviceDialog from './add-device-dialog.vue';
 import RegistrationDetailDialog from '../../../resource-guard/device-guard/registration-query/registration-detail-dialog.vue';
 
 import { deviceOutInSearch } from '@/api/sop';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import {
   DEVICE_USAGE_TYPE,
   RUNNING_STATUS,

+ 1 - 1
src/views/sop/sop-manage/office-sop/index.vue

@@ -240,7 +240,7 @@ import AddViolationDialog from '../../sop-monitor/violation-registration/add-vio
 import MetadataContent from '../../components/metadata-content.vue';
 import { useAppStore } from '@/store';
 import usePermission from '@/hooks/usePermission';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 import { CUSTOMER_TYPE, FLOW_STATUS } from '@/config/constants';
 import { dictToOptionList } from '@/utils/tool';
 const { perm } = usePermission();

+ 1 - 1
src/views/sop/sop-manage/plan-change/index.vue

@@ -254,7 +254,7 @@ import {
   approvePlanChange,
   planChangeDetail,
 } from '@/api/sop';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { timestampFilter } from '@/utils/filter';
 import { timeNumberToText } from '@/utils/tool';
 

+ 1 - 1
src/views/sop/sop-manage/project-change-report/index.vue

@@ -75,7 +75,7 @@
 import { ref, reactive, computed } from 'vue';
 import useFetchTable from '@/hooks/useFetchTable';
 import { dictToOptionList } from '@/utils/tool';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { planChangeList } from '@/api/sop';
 import PlanChangeDialog from '../plan-change/plan-change-dialog.vue';
 import usePermission from '@/hooks/usePermission';

+ 77 - 31
src/views/sop/sop-manage/student-sop/index.vue

@@ -40,6 +40,10 @@
         <template #icon><svg-icon name="shrink" color="#262626" /></template>
         缩小</t-button
       >
+      <select-filter
+        :metadata="formWidgetMetadataViewList"
+        @confirm="filterConfirm"
+      ></select-filter>
     </div>
     <SearchForm :fields="fields" :params="params" :search="search">
       <template #service="{ item, params }">
@@ -51,14 +55,14 @@
           }"
         ></select-service-unit>
       </template>
+      <template #aaa="{ item, params }">
+        <select-type-user
+          v-model="params[item.prop]"
+          type="REGION_MANAGER"
+        ></select-type-user>
+      </template>
       <template #buttons>
-        <t-space :size="16">
-          <select-filter
-            :metadata="formWidgetMetadataViewList"
-            @confirm="filterConfirm"
-          ></select-filter>
-          <t-button theme="primary" @click="search">搜索</t-button>
-        </t-space>
+        <t-button theme="primary" @click="search">搜索</t-button>
       </template>
     </SearchForm>
 
@@ -82,27 +86,6 @@
         :selected-row-keys="selectedRowKeys"
         @select-change="selectChange"
       >
-        <!-- <template #sopNo="{ col, row }">
-          <more-content
-            :content="row[col.colKey]"
-            @action="editSopFlowHandle(row, 'view')"
-          ></more-content>
-        </template> -->
-        <!-- <template #beginTime="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #examStartTime="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #examEndTime="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #flowCreateTime="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template>
-        <template #flowUpdateTime="{ col, row }">
-          {{ timestampFilter(row[col.colKey]) }}
-        </template> -->
         <template
           v-for="field in formWidgetMetadataViewList"
           #[field.fieldId]="{ col, row }"
@@ -243,7 +226,7 @@ import MetadataContent from '../../components/metadata-content.vue';
 import { useAppStore } from '@/store';
 import usePermission from '@/hooks/usePermission';
 import SopSortPanel from '../../components/sop-sort-panel/index.vue';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'lodash-es';
 import { CUSTOMER_TYPE, FLOW_STATUS } from '@/config/constants';
 import { dictToOptionList } from '@/utils/tool';
 import DeviceManageNew from '@/components/common/device-manage-new';
@@ -380,10 +363,73 @@ const fields = ref([
     prop: 'serviceId',
     label: '服务单元',
     type: 'select',
-    labelWidth: 70,
-    colSpan: 5,
+    labelWidth: 75,
+    colSpan: 4,
     cell: 'service',
   },
+  {
+    prop: 'aaa',
+    label: '大区经理',
+    labelWidth: 75,
+    colSpan: 4,
+    cell: 'aaa',
+  },
+  {
+    prop: 'bbb',
+    label: '客户名称',
+    labelWidth: 75,
+    colSpan: 4,
+  },
+  {
+    prop: 'ccc',
+    label: '当前节点',
+    type: 'select',
+    labelWidth: 75,
+    colSpan: 4,
+    options: [],
+  },
+  {
+    prop: 'ddd',
+    label: '客户经理',
+    labelWidth: 75,
+    colSpan: 4,
+  },
+  {
+    prop: 'eee',
+    label: '打卡在时限内',
+    type: 'select',
+    labelWidth: 100,
+    colSpan: 4,
+    options: [],
+  },
+  {
+    prop: 'fff',
+    label: '项目名称',
+    labelWidth: 75,
+    colSpan: 4,
+  },
+  {
+    prop: 'ggg',
+    label: 'sop号',
+    labelWidth: 75,
+    colSpan: 4,
+  },
+  {
+    prop: 'hhh',
+    label: '快捷搜索',
+    type: 'select',
+    labelWidth: 75,
+    colSpan: 4,
+    options: [],
+  },
+  {
+    prop: 'iii',
+    label: '快捷显示',
+    type: 'select',
+    labelWidth: 75,
+    colSpan: 4,
+    options: [],
+  },
   {
     prop: 'buttons',
     colSpan: 4,

+ 1 - 1
src/views/sop/sop-monitor/delay-warning/index.vue

@@ -99,7 +99,7 @@ import { enumListByType } from '@/api/common';
 import useFetchTable from '@/hooks/useFetchTable';
 import { dictToOptionList } from '@/utils/tool';
 import { WARN_TYPE, WARN_FLOW_STATUS } from '@/config/constants';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import { warnTypeFilter, timestampFilter } from '@/utils/filter';
 import DelayWarnFlowDialog from './flow-dialog';

+ 1 - 1
src/views/sop/sop-monitor/violation-registration/index.vue

@@ -120,7 +120,7 @@ import { getViolationList, closeViolation, restartViolation } from '@/api/sop';
 import useFetchTable from '@/hooks/useFetchTable';
 import { dictToOptionList } from '@/utils/tool';
 import { VIOLATION_TYPE, VIOLATION_FLOW_STATUS } from '@/config/constants';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import { violationTypeFilter, timestampFilter } from '@/utils/filter';
 import ViolationFlowDialog from './flow-dialog.vue';

+ 1 - 1
src/views/system/config-manage/checkin-manage/edit-checkin-dialog.vue

@@ -139,7 +139,7 @@ import { ref, computed } from 'vue';
 import { MessagePlugin } from 'tdesign-vue-next';
 import useClearDialog from '@/hooks/useClearDialog';
 import { checkinEditApi } from '@/api/system';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { TRUE_OR_FALSE_TYPE } from '@/config/constants';
 const emit = defineEmits(['update:visible', 'success']);
 const formRef = ref(null);

+ 1 - 1
src/views/system/config-manage/checkin-manage/index.vue

@@ -126,7 +126,7 @@ import { checkinQueryApi, checkinDeleteApi } from '@/api/system';
 import { timestampFilter } from '@/utils/filter';
 import { SERVICE_UNIT_STATUS } from '@/config/constants';
 import { dictToOptionList } from '@/utils/tool';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import usePermission from '@/hooks/usePermission';
 const { perm } = usePermission();
 

+ 1 - 1
src/views/system/config-manage/device-manage/index.vue

@@ -161,7 +161,7 @@ import {
 import { dictToOptionList } from '@/utils/tool';
 import { ABLE_TYPE, RUNNING_STATUS, INOUT_TYPE } from '@/config/constants';
 import usePermission from '@/hooks/usePermission';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { downloadImportTemplate } from '@/api/common';
 const { perm } = usePermission();
 

+ 1 - 1
src/views/system/notice-log/log-manage/index.vue

@@ -35,7 +35,7 @@
 
 <script setup name="LogManage">
 import { ref, reactive, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { logListApi } from '@/api/system';
 import useFetchTable from '@/hooks/useFetchTable';
 import { timestampFilter } from '@/utils/filter';

+ 1 - 1
src/views/system/notice-log/notice-manage/index.vue

@@ -136,7 +136,7 @@
 <script setup name="NoticeManage">
 import { ref, reactive, computed } from 'vue';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import useFetchTable from '@/hooks/useFetchTable';
 import EditNoticeDialog from './edit-notice-dialog.vue';
 import NoticeMessageDialog from './notice-message-dialog.vue';

+ 1 - 1
src/views/user/org-struct-manage/struct-manage/index.vue

@@ -116,7 +116,7 @@ import { useRequest } from 'vue-request';
 import { getOrgStructList, toggleOrgNodeStatus } from '@/api/user';
 import AddNodeDialog from './add-node-dialog.vue';
 import { enableFilter } from '@/utils/filter';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import usePermission from '@/hooks/usePermission';
 import { ChevronRightIcon, ChevronDownIcon } from 'tdesign-icons-vue-next';
 const { perm } = usePermission();

+ 1 - 1
src/views/work-hours/work-hours-manage/abnormal-check/done-check.vue

@@ -66,7 +66,7 @@
 
 <script setup name="DoneCheck">
 import { reactive, ref, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 
 import useFetchTable from '@/hooks/useFetchTable';
 import { workHoursDoneCheckListApi } from '@/api/work-hours';

+ 1 - 1
src/views/work-hours/work-hours-manage/abnormal-check/wait-check.vue

@@ -107,7 +107,7 @@
 
 <script setup name="WaitCheck">
 import { reactive, ref, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import useFetchTable from '@/hooks/useFetchTable';

+ 1 - 1
src/views/work-hours/work-hours-manage/work-attendance-detail/index.vue

@@ -74,7 +74,7 @@
 
 <script setup name="WorkAttendanceDetail">
 import { reactive, ref, computed } from 'vue';
-import { omit } from 'lodash';
+import { omit } from 'lodash-es';
 import { ErrorCircleFilledIcon } from 'tdesign-icons-vue-next';
 
 import useFetchTable from '@/hooks/useFetchTable';