shudonghui 1 年之前
父节点
当前提交
b4901d46dd

+ 84 - 0
src/components/common/select-url-user/index.vue

@@ -0,0 +1,84 @@
+<template>
+  <t-select
+    v-model="selected"
+    filterable
+    clearable
+    v-bind="attrs"
+    @change="onChange"
+  >
+    <t-option
+      v-for="item in optionList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.realName"
+    />
+  </t-select>
+</template>
+
+<script setup name="SelectUrlUser">
+import { onMounted, ref, useAttrs, watch, computed } from 'vue';
+import {request} from "@/utils/request";
+import {isEqual} from "@/utils/tool";
+
+let optionList = ref([]);
+let selected = ref('');
+
+const attrs = useAttrs();
+
+const emit = defineEmits(['update:modelValue', 'change']);
+const props = defineProps({
+  modelValue: { type: [Number, String, Array], default: '' },
+  url: { type: String, default: '' },
+  params: { type: Object, default: {} },
+});
+const isMultiple = computed(() => {
+  const multiple = attrs.multiple;
+  return multiple === '' || multiple;
+});
+
+const search = async () => {
+  if (!props.url) return;
+  optionList.value = [];
+
+  const res = await request({ url: props.url, params: props.params }).catch(() => {});
+  // const res = await getRoleUserList(props.type).catch(() => {});
+  if (!res) return;
+
+  optionList.value = res;
+};
+
+const onChange = () => {
+  const selectedData = isMultiple.value
+    ? optionList.value.filter(
+        (item) => selected.value && selected.value.includes(item.id)
+      )
+    : optionList.value.filter((item) => selected.value === item.id);
+  emit('update:modelValue', selected.value);
+  emit('change', isMultiple.value ? selectedData : selectedData[0]);
+};
+
+onMounted(() => {
+  search();
+});
+
+watch(
+  () => props.modelValue,
+  (val) => {
+    selected.value = val;
+  },
+  {
+    immediate: true,
+  }
+);
+watch(
+  () => props.params,
+  (val, oldval) => {
+    if (!isEqual(val ,oldval)) {
+      search();
+      emit('update:modelValue', null);
+      emit('change', isMultiple.value ? [] : null);
+    }
+  }
+);
+
+</script>

+ 48 - 0
src/utils/tool.js

@@ -461,3 +461,51 @@ export function timeNumberToText(timeNumber) {
 
   return [day, hour, minute, second].filter((item) => !!item).join('');
 }
+
+//判断两个对象是否相等
+export function isEqual(objA,objB){
+  //相等
+  if(objA === objB) return objA !== 0 || 1/objA === 1/objB;
+  //空判断
+  if(objA == null || objB == null) return objA === objB;
+  //类型判断
+  if(Object.prototype.toString.call(objA) !== Object.prototype.toString.call(objB)) return false;
+
+  switch(Object.prototype.toString.call(objA)){
+    case '[object RegExp]':
+    case '[object String]':
+      //字符串转换比较
+      return '' + objA ==='' + objB;
+    case '[object Number]':
+      //数字转换比较,判断是否为NaN
+      if(+objA !== +objA){
+        return +objB !== +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;
+      }
+      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;
+      }
+
+      keys = Object.keys(objB);
+      for(let i = 0; i < keys.length; i++){
+        if (!isEqual(objA[keys[i]],objB[keys[i]])) return false;
+      }
+
+      return true;
+    default :
+      return false;
+  }
+}

+ 11 - 5
src/views/sop/sop-monitor/violation-registration/add-violation-dialog.vue

@@ -61,11 +61,17 @@
           <t-row :gutter="[0, 20]">
             <t-col :span="5">
               <t-form-item label="节点负责人" name="userId">
-                <select-filter-user
-                  v-model="formData.userId"
-                  placeholder="输入关键词搜索选择"
-                  clearable
-                ></select-filter-user>
+<!--                <select-filter-user-->
+<!--                  v-model="formData.userId"-->
+<!--                  placeholder="输入关键词搜索选择"-->
+<!--                  clearable-->
+<!--                ></select-filter-user>-->
+                <select-url-user
+                    v-model="formData.userId"
+                    url="/api/admin/sop/user/list"
+                    :params="{sop_info_id:sop.id}"
+                    clearable
+                ></select-url-user>
               </t-form-item>
             </t-col>
             <t-col :span="5" :offset="1">