haveyou 1 рік тому
батько
коміт
c6d68c2b1c

+ 50 - 62
src/components/CommonPage/SimpleForm.vue

@@ -1,93 +1,81 @@
 <!-- 编辑弹窗 -->
 <template>
-  <pro-form
-    class="simple-form"
-    v-bind="$attrs"
-    ref="proFormRef"
-    :model="form"
-    :items="items"
-    :grid="{ span: grid }"
-    @updateValue="setFieldValue"
-    @submit="submitForm"
-    @reset="resetForm"
-  >
-    <template
-      v-for="(val, key) in slotArray"
-      v-slot:[key]="{ item, model, updateValue }"
-    >
-      <slot
-        :name="key"
-        :item="item"
-        :model="model"
-        :updateValue="updateValue"
-      ></slot>
-    </template>
-  </pro-form>
+    <pro-form class="simple-form" v-bind="$attrs" ref="proFormRef" :model="form" :items="items" :grid="{ span: grid }"
+        @updateValue="setFieldValue" @submit="submitForm" @reset="resetForm">
+        <template v-for="(val, key) in slotArray" v-slot:[key]="{ item, model, updateValue }">
+            <slot :name="key" :item="item" :model="model" :updateValue="updateValue"></slot>
+        </template>
+    </pro-form>
 </template>
 
 <script setup>
-  import { ref, useSlots } from 'vue';
-  import { useFormData } from '@/utils/use-form-data';
-  import ProForm from '@/components/ProForm/index.vue';
-  const slotArray = useSlots();
+import { ref, useSlots } from 'vue';
+import { useFormData } from '@/utils/use-form-data';
+import ProForm from '@/components/ProForm/index.vue';
+const slotArray = useSlots();
 
-  const emit = defineEmits(['submit', 'reset']);
-  const proFormRef = ref(null);
-  const props = defineProps({
+const emit = defineEmits(['submit', 'reset']);
+const proFormRef = ref(null);
+const props = defineProps({
     items: {
-      type: Array,
-      default: () => []
+        type: Array,
+        default: () => []
     },
     grid: {
-      type: Number,
-      default: 24
+        type: Number,
+        default: 24
     }
-  });
-  let initKeys = [];
-  watch(
+});
+let initKeys = [];
+watch(
     () => props.items,
     (values) => {
-      initKeys = values.map((item) => item.prop);
+        initKeys = values.map((item) => item.prop);
     },
     { deep: true, immediate: true }
-  );
+);
 
-  const [form, resetFields, assignFields, setFieldValue] = useFormData();
-  /** 提交表单 */
-  const submitForm = (model) => {
+const [form, resetFields, assignFields, setFieldValue] = useFormData();
+/** 提交表单 */
+const submitForm = (model) => {
     return new Promise((resolve, reject) => {
-      proFormRef.value?.validate?.((valid) => {
-        if (valid) {
-          resolve(form);
-          emit('submit', model);
-        } else {
-          reject('表单验证失败');
-        }
-      });
+        proFormRef.value?.validate?.((valid) => {
+            if (valid) {
+                resolve(form);
+                emit('submit', model);
+            } else {
+                reject('表单验证失败');
+            }
+        });
     });
-  };
+};
 
-  /** 重置表单 */
-  const resetForm = () => {
+/** 重置表单 */
+const resetForm = () => {
     resetFields();
     nextTick(() => {
-      proFormRef.value?.clearValidate?.();
+        proFormRef.value?.clearValidate?.();
     });
-  };
+};
 
-  function setData(data) {
+function setData(data) {
     Object.keys(data).forEach((key) => {
-      if (initKeys.includes(key)) {
-        setFieldValue(key, data[key]);
-      }
+        if (initKeys.includes(key)) {
+            setFieldValue(key, data[key]);
+        }
     });
-  }
+    // 延迟清空表单验证,防止表单验证不生效
+    setTimeout(() => {
+        proFormRef.value?.clearValidate?.();
+        
+    }, 50);
+}
 
-  defineExpose({
+defineExpose({
     resetFields,
     assignFields,
     setData,
     submitForm,
     resetForm
-  });
+});
 </script>

+ 5 - 1
src/components/CommonPage/SimpleFormModal.vue

@@ -59,6 +59,8 @@
     labelWidth: { type: String, default: '90px' },
     formProps: { type: Object, default: () => ({}) },
     baseUrl: { type: Object, default: () => ({}) },
+    //是否需要合并打开时传入的参数
+    isMerge: { type: Boolean, default: false },
     formatData: {
       type: Function,
       default: (data) => data
@@ -75,12 +77,13 @@
   };
 
   const form = ref({});
+  const mergeData = ref({});
   /** 弹窗打开事件 */
   const handleOpen = async (data) => {
     visible.value = true;
     nextTick(() => {
       formRef.value?.resetForm();
-
+      mergeData.value = data;
       if (!props.baseUrl.detail) {
         form.value = data;
         formRef.value?.setData(data);
@@ -115,6 +118,7 @@
 
       data.id = form.value?.id;
       let url = data.id ? props.baseUrl.update : props.baseUrl.add;
+      data = props.isMerge ? { ...mergeData.value, ...data } : data;
       let format = props.formatData(data);
       proxy.$http.post(url, format).then((res) => {
         if (res.data.code !== 200) return EleMessage.error(res.data.msg);

+ 70 - 0
src/views/system/user/components/set-warehouse.vue

@@ -0,0 +1,70 @@
+<!-- 搜索表单 -->
+<template>
+    <simple-form-modal title="设置仓库" :items="formItems" ref="editRef" :baseUrl="baseUrl" isMerge></simple-form-modal>
+</template>
+
+<script setup>
+import { reactive, ref, defineEmits, getCurrentInstance } from 'vue';
+import SimpleFormModal from '@/components/CommonPage/SimpleFormModal.vue';
+const { proxy } = getCurrentInstance();
+
+const emit = defineEmits(['success']);
+
+const formItems = computed(() => {
+    return [
+        {
+            type: 'select',
+            label: '默认仓库',
+            prop: 'godownIds',
+            required: true,
+            props: {
+                multiple: true,
+                filterable: true,
+            },
+            options: godownList.value
+                .filter((v) => v.useStatus == 1)
+                .map((d) => {
+                    return { label: d.godownName, value: d.id };
+                })
+        },
+    ];
+});
+
+const godownList = ref([]);
+async function getGodownList() {
+    return proxy.$http.post('/baseinfo/godown/searchGodown?name=');
+}
+
+//默认值
+const baseUrl = reactive({
+    add: '/baseinfo/godown/setSysUserGodown',
+});
+const formData = ref({
+    godownIds: '',
+    sysUserId: ''
+});
+//获取用户已经设置的仓库
+async function getUserGodown(userId) {
+    return proxy.$http.get('/baseinfo/godown/getSysUserGodown?userId=' + userId);
+}
+
+const editRef = ref(null);
+
+async function handleOpen(data) {
+    formData.value.sysUserId = data.userId;
+    let res = await getUserGodown(data.userId);
+    if (res.data.code == 200) {
+        let item = res.data.data;
+        formData.value.godownIds = item && item.length > 0 ? item.map((v) => v.id) : '';
+    }
+    editRef.value?.handleOpen(formData.value);
+
+    getGodownList().then((res) => {
+        if (res.data.code == 200) {
+            godownList.value = res.data.data;
+        }
+    });
+}
+
+defineExpose({ handleOpen });
+</script>

+ 9 - 0
src/views/system/user/components/user-list.vue

@@ -103,6 +103,8 @@
   <user-import v-model="showImport" @done="reload" />
   <!-- 分配角色弹窗 -->
   <user-role v-model="showRole" :data="current" />
+  <!-- 设置仓库 -->
+  <set-warehouse ref="setWarehouseRef" />
 </template>
 
 <script setup>
@@ -122,6 +124,7 @@
   import UserEdit from './user-edit.vue';
   import UserImport from './user-import.vue';
   import UserRole from './user-role.vue';
+  import setWarehouse from './set-warehouse.vue'
   import {
     pageUsers,
     removeUsers,
@@ -237,6 +240,9 @@
   /** 操作列更多下拉菜单 */
   const moreItems = computed(() => {
     const items = [];
+    if (hasPermission('system:user:setWarehouse')) {
+      items.push({ title: '设置仓库', command: 'setWarehouse' });
+    }
     if (hasPermission('system:user:resetPwd')) {
       items.push({ title: '重置密码', command: 'password' });
     }
@@ -311,6 +317,7 @@
       });
   };
 
+  const setWarehouseRef = ref(null);
   /** 下拉菜单点击事件 */
   const dropClick = (key, row) => {
     if (key === 'password') {
@@ -333,6 +340,8 @@
     } else if (key === 'role') {
       current.value = row ?? null;
       showRole.value = true;
+    } else if (key === 'setWarehouse') {
+      setWarehouseRef.value?.handleOpen(row);
     }
   };