zhangjie 1 năm trước cách đây
mục cha
commit
5433f6887f

+ 9 - 1
src/api/common.js

@@ -14,9 +14,17 @@ export const uploadFiles = (formData, md5) => {
 };
 
 export const downloadImportTemplate = (type) => {
-  request({
+  return request({
     url: '/api/admin/common/download_import_template',
     params: { type },
     download: true,
   });
 };
+
+export const enumListByType = (enumList) => {
+  // https://doc.qmth.com.cn/pages/viewpage.action?pageId=47550217#id-质控平台SOP系统_系统接口文档-查询枚举接口
+  return request({
+    url: '/api/admin/common/query_enum',
+    params: { enumList },
+  });
+};

+ 5 - 1
src/components/common/select-type-user/index.vue

@@ -60,7 +60,11 @@ onMounted(() => {
 watch(
   () => props.modelValue,
   (val) => {
-    selected.value = val;
+    if (optionList.value.filter((item) => val === item.id).length !== 0) {
+      selected.value = val;
+    } else {
+      selected.value = null;
+    }
   },
   {
     immediate: true,

+ 2 - 2
src/utils/filter.js

@@ -55,8 +55,8 @@ export function timestampFilter(val, fmt = 'mm') {
   // fmt: dd or yyyy-MM-dd
   const formats = {
     dd: 'yyyy-MM-dd',
-    mm: 'yyyy/MM/dd hh:mm',
-    ss: 'yyyy/MM/dd hh:mm:ss',
+    mm: 'yyyy/MM/dd HH:mm',
+    ss: 'yyyy/MM/dd HH:mm:ss',
   };
   return val ? dateFormat(val, formats[fmt] || fmt) : DEFAULT_FIELD;
 }

+ 21 - 17
src/utils/tool.js

@@ -174,7 +174,7 @@ export const generateId = function () {
 /* 日期格式化 */
 export const dateFormat = (
   date,
-  fmt = 'yyyy-MM-dd hh:mm:ss',
+  fmt = 'yyyy-MM-dd HH:mm:ss',
   isDefault = '-'
 ) => {
   if (!date) {
@@ -191,7 +191,7 @@ export const dateFormat = (
   const o = {
     'M+': date.getMonth() + 1, // 月份
     'd+': date.getDate(), // 日
-    'h+': date.getHours(), // 小时
+    'H+': date.getHours(), // 小时
     'm+': date.getMinutes(), // 分
     's+': date.getSeconds(), // 秒
     'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
@@ -463,49 +463,53 @@ export function timeNumberToText(timeNumber) {
 }
 
 //判断两个对象是否相等
-export function isEqual(objA,objB){
+export function isEqual(objA, objB) {
   //相等
-  if(objA === objB) return objA !== 0 || 1/objA === 1/objB;
+  if (objA === objB) return objA !== 0 || 1 / objA === 1 / objB;
   //空判断
-  if(objA == null || objB == null) return objA === objB;
+  if (objA == null || objB == null) return objA === objB;
   //类型判断
-  if(Object.prototype.toString.call(objA) !== Object.prototype.toString.call(objB)) return false;
+  if (
+    Object.prototype.toString.call(objA) !==
+    Object.prototype.toString.call(objB)
+  )
+    return false;
 
-  switch(Object.prototype.toString.call(objA)){
+  switch (Object.prototype.toString.call(objA)) {
     case '[object RegExp]':
     case '[object String]':
       //字符串转换比较
-      return '' + objA ==='' + objB;
+      return '' + objA === '' + objB;
     case '[object Number]':
       //数字转换比较,判断是否为NaN
-      if(+objA !== +objA){
+      if (+objA !== +objA) {
         return +objB !== +objB;
       }
 
-      return +objA === 0?1/ +objA === 1/objB : +objA === +objB;
+      return +objA === 0 ? 1 / +objA === 1 / objB : +objA === +objB;
     case '[object Date]':
     case '[object Boolean]':
       return +objA === +objB;
     case '[object Array]':
       //判断数组
-      for(let i = 0; i < objA.length; i++){
-        if (!isEqual(objA[i],objB[i])) return false;
+      for (let i = 0; i < objA.length; i++) {
+        if (!isEqual(objA[i], objB[i])) return false;
       }
       return true;
     case '[object Object]':
       //判断对象
       let keys = Object.keys(objA);
-      for(let i = 0; i < keys.length; i++){
-        if (!isEqual(objA[keys[i]],objB[keys[i]])) return false;
+      for (let i = 0; i < keys.length; i++) {
+        if (!isEqual(objA[keys[i]], objB[keys[i]])) return false;
       }
 
       keys = Object.keys(objB);
-      for(let i = 0; i < keys.length; i++){
-        if (!isEqual(objA[keys[i]],objB[keys[i]])) return false;
+      for (let i = 0; i < keys.length; i++) {
+        if (!isEqual(objA[keys[i]], objB[keys[i]])) return false;
       }
 
       return true;
-    default :
+    default:
       return false;
   }
 }

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

@@ -82,6 +82,21 @@
         <template #roles="{ row }">
           {{ rolesFilter(row) }}
         </template>
+        <template #crmStatus="{ col, row }">
+          {{ crmStatusFilter(row[col.colKey]) }}
+        </template>
+        <template #publishTime="{ col, row }">
+          <span v-if="row.crmStatus === 'PUBLISH'">
+            {{ timestampFilter(row[col.colKey]) }}
+          </span>
+          <span v-else>--</span>
+        </template>
+        <template #publishUserName="{ col, row }">
+          <span v-if="row.crmStatus === 'PUBLISH'">
+            {{ row[col.colKey] }}
+          </span>
+          <span v-else>--</span>
+        </template>
         <template #operate="{ row }">
           <div class="table-operations">
             <template v-if="perm.LINK_Allocate">
@@ -147,7 +162,11 @@ import {
   personAllocateSubmitSopApi,
   personAllocateCancelSubmitSopApi,
 } from '@/api/resource-guard';
-import { customerTypeFilter } from '@/utils/filter';
+import {
+  crmStatusFilter,
+  customerTypeFilter,
+  timestampFilter,
+} from '@/utils/filter';
 import PersonDeployDialog from './person-deploy-dialog.vue';
 import DeployDetailDialog from './deploy-detail-dialog.vue';
 import usePermission from '@/hooks/usePermission';
@@ -250,6 +269,9 @@ const columns = [
   { colKey: 'quota', title: '配额(人)', width: 120 },
   { colKey: 'distributed', title: '已分配(人)', width: 120 },
   { colKey: 'unDistributed', title: '分配差额(人)', width: 140 },
+  { colKey: 'crmStatus', title: 'SOP发布', width: 140 },
+  { colKey: 'publishTime', title: '发布时间', width: 170 },
+  { colKey: 'publishUserName', title: '发布人', width: 140 },
   {
     title: '管理',
     colKey: 'operate',

+ 3 - 3
src/views/resource-guard/person-guard/person-files/add-person-file-dialog.vue

@@ -103,7 +103,7 @@
               v-model="formData.archivesTime"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
             />
           </t-form-item>
@@ -126,7 +126,7 @@
               v-model="formData.authenticationTime"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
               :disable-date="{ after: formData.examEndTime || undefined }"
             />
@@ -150,7 +150,7 @@
               v-model="formData.authenticationValidTime"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
               :disable-date="{
                 before: formData.authenticationTime || undefined,

+ 3 - 3
src/views/service-unit/dispatch/dispatch-manage/add-dispatch-dialog.vue

@@ -25,7 +25,7 @@
               v-model="formData.beginTime"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
             />
           </t-form-item>
@@ -66,7 +66,7 @@
               :disable-date="{ after: formData.examEndTime || undefined }"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
             />
           </t-form-item>
@@ -78,7 +78,7 @@
               :disable-date="{ before: formData.examStartTime || undefined }"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
             />
           </t-form-item>

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

@@ -27,7 +27,7 @@
           :disable-date="{ after: formData.endTime || undefined }"
           value-type="time-stamp"
           enable-time-picker
-          format="YYYY-MM-DD hh:mm"
+          format="YYYY-MM-DD HH:mm"
           :time-picker-props="{ format: 'HH:mm' }"
         />
       </t-form-item>
@@ -37,7 +37,7 @@
           :disable-date="{ before: formData.startTime || undefined }"
           value-type="time-stamp"
           enable-time-picker
-          format="YYYY-MM-DD hh:mm"
+          format="YYYY-MM-DD HH:mm"
           :time-picker-props="{ format: 'HH:mm' }"
         />
       </t-form-item>

+ 1 - 1
src/views/sop/components/dynamic-form-item/DATE.vue

@@ -5,7 +5,7 @@
     :disabled="!config.writable"
     style="width: 100%"
     enable-time-picker
-    format="YYYY-MM-DD hh:mm"
+    format="YYYY-MM-DD HH:mm"
     :time-picker-props="{ format: 'HH:mm' }"
     @change="emitChange"
   />

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

@@ -67,13 +67,10 @@ onMounted(() => {
 const allChange = () => {
   if (all.value) {
     selected.value = optionList.value.map((item) => item.fieldId);
-    emit('update:modelValue', selected.value);
-    emit('change', optionList.value);
   } else {
     selected.value = [];
-    emit('update:modelValue', selected.value);
-    emit('change', []);
   }
+  onChange();
 };
 
 const onChange = () => {

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

@@ -23,7 +23,7 @@
               style="width: 100%"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
             />
           </t-form-item>

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

@@ -39,7 +39,12 @@
         </template>
         <template #operate="{ row }">
           <div v-if="perm.LINK_Finish" class="table-operations">
-            <t-link theme="primary" hover="color" @click="handleApply(row)">
+            <t-link
+              v-if="row.projectExchangeFlowStatus === 'UN_APPROVE'"
+              theme="primary"
+              hover="color"
+              @click="handleApply(row)"
+            >
               处理申请
             </t-link>
           </div>
@@ -63,7 +68,6 @@ import { ref, reactive, computed } from 'vue';
 import useFetchTable from '@/hooks/useFetchTable';
 import { dictToOptionList } from '@/utils/tool';
 import { omit } from 'lodash';
-import { useRouter } from 'vue-router';
 import { planChangeList } from '@/api/sop';
 import PlanChangeDialog from '../plan-change/plan-change-dialog.vue';
 import usePermission from '@/hooks/usePermission';
@@ -76,14 +80,13 @@ import {
 } from '@/config/constants';
 import { timestampFilter } from '@/utils/filter';
 
-const router = useRouter();
 const selectedRowKeys = ref([]);
 const selectChange = (value) => {
   selectedRowKeys.value = value;
 };
 
 const columns = [
-  { colKey: 'id', title: '变更申请编号', width: 200 },
+  { colKey: 'code', title: '变更申请编号', width: 200 },
   { colKey: 'serviceName', title: '服务单元', width: 140 },
   { colKey: 'customTypeStr', title: '客户类型', width: 120 },
   { colKey: 'customName', title: '客户名称', width: 140 },
@@ -134,6 +137,9 @@ const fields = ref([
     labelWidth: 100,
     colSpan: 4.5,
     options: dictToOptionList(PLAN_CHANGE_TYPE),
+    attrs: {
+      clearable: true,
+    },
   },
   {
     prop: 'customType',
@@ -142,6 +148,9 @@ const fields = ref([
     labelWidth: 100,
     colSpan: 4.5,
     options: dictToOptionList(CUSTOMER_TYPE),
+    attrs: {
+      clearable: true,
+    },
   },
   {
     prop: 'flowStatus',
@@ -150,6 +159,9 @@ const fields = ref([
     labelWidth: 100,
     colSpan: 4.5,
     options: dictToOptionList(FLOW_CHECK_STATUS),
+    attrs: {
+      clearable: true,
+    },
   },
   {
     type: 'buttons',
@@ -169,12 +181,18 @@ const fields = ref([
     label: '客户名称',
     labelWidth: 100,
     colSpan: 4.5,
+    attrs: {
+      clearable: true,
+    },
   },
   {
     prop: 'exchangeNo',
     label: '变更申请编号',
     labelWidth: 100,
     colSpan: 4.5,
+    attrs: {
+      clearable: true,
+    },
   },
   {
     prop: 'time',

+ 0 - 3
src/views/sop/sop-manage/quality-issue/index.vue

@@ -87,9 +87,6 @@
             <t-button theme="primary" @click="submitHandle('START')"
               >提交</t-button
             >
-            <t-button theme="default" @click="submitHandle('DRAFT')"
-              >保存草稿</t-button
-            >
           </template>
         </t-space>
       </t-tab-panel>

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

@@ -40,6 +40,9 @@
         <template #warnTime="{ col, row }">
           {{ timestampFilter(row[col.colKey]) }}
         </template>
+        <template #fieldObj="{ col, row }">
+          {{ enumFilter(row[col.colKey]) }}
+        </template>
         <template #operate="{ row }">
           <div class="table-operations">
             <template v-if="perm.LINK_Follow">
@@ -89,8 +92,9 @@
 </template>
 
 <script setup name="DelayWarning">
-import { reactive, ref, computed } from 'vue';
+import { reactive, ref, computed, onMounted } from 'vue';
 import { getDelayWarnList, closeDelayWarn, restartDelayWarn } from '@/api/sop';
+import { enumListByType } from '@/api/common';
 import useFetchTable from '@/hooks/useFetchTable';
 import { dictToOptionList } from '@/utils/tool';
 import { WARN_TYPE, WARN_FLOW_STATUS } from '@/config/constants';
@@ -105,6 +109,15 @@ const showDelayWarnFlowDialog = ref(false);
 const curRow = ref({});
 const viewType = ref('');
 
+const enumData = ref({});
+const getEnumData = async () => {
+  enumData.value = await enumListByType('PROCESS_LIMITED_ENUM');
+};
+
+const enumFilter = (type) => {
+  return enumData.value[type.toUpperCase()] || '--';
+};
+
 const handleFollow = (row) => {
   viewType.value = 'new';
   curRow.value = row;
@@ -271,7 +284,20 @@ const {
   onChange,
   fetchData,
   search,
-} = useFetchTable(getDelayWarnList, {
-  params: transParams,
+} = useFetchTable(
+  getDelayWarnList,
+  {
+    params: transParams,
+  },
+  false
+);
+
+const initData = async () => {
+  await getEnumData();
+  await search();
+};
+
+onMounted(() => {
+  initData();
 });
 </script>

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

@@ -250,7 +250,7 @@ const fields = ref([
   },
   {
     prop: 'time',
-    label: '预警时间',
+    label: '登记时间',
     type: 'daterange',
     labelWidth: 100,
     colSpan: 9,

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

@@ -45,7 +45,7 @@
               mode="date"
               value-type="time-stamp"
               enable-time-picker
-              format="YYYY-MM-DD hh:mm"
+              format="YYYY-MM-DD HH:mm"
               :time-picker-props="{ format: 'HH:mm' }"
             />
           </t-form-item>