From bb79260cbeeac88cfbadc9606eea57002e8945bc Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期四, 17 四月 2025 09:43:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/main'

---
 eims-ui/apps/web-antd/src/views/eims/spare-out/spare-out-drawer.vue |  122 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 118 insertions(+), 4 deletions(-)

diff --git a/eims-ui/apps/web-antd/src/views/eims/spare-out/spare-out-drawer.vue b/eims-ui/apps/web-antd/src/views/eims/spare-out/spare-out-drawer.vue
index ebd82a4..8d4219c 100644
--- a/eims-ui/apps/web-antd/src/views/eims/spare-out/spare-out-drawer.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/spare-out/spare-out-drawer.vue
@@ -1,18 +1,88 @@
 <script setup lang="ts">
+import type { VxeGridProps } from '#/adapter/vxe-table';
+
 import { computed, ref } from 'vue';
 
-import { useVbenDrawer } from '@vben/common-ui';
+import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
+import { DictEnum } from '@vben/constants';
 import { $t } from '@vben/locales';
 import { addFullName, cloneDeep, getPopupContainer } from '@vben/utils';
+
+import { message } from 'ant-design-vue';
 
 import { useVbenForm } from '#/adapter/form';
 import { addSpareInout, getSpareInout, updateSpareInout } from '#/api/eims/spare-inout';
 import { getDeptTree, userList } from '#/api/system/user';
+import { renderDict } from '#/utils/render';
+import CodeInput from '#/views/eims/components/code-input.vue';
+import spareModal from '#/views/eims/components/spare-modal.vue';
 
 import { drawerSchema } from './data';
-import CodeInput from '#/views/eims/components/code-input.vue';
+import SelectSpareTable from './select-spare-table.vue';
 
 const emit = defineEmits<{ reload: [] }>();
+
+/**
+ * 鍑哄簱鍗曢�夋嫨鐨勫浠舵暟鎹�
+ */
+const outSpareList = ref([]);
+const selectSpareTable = ref();
+
+const outCol: VxeGridProps['columns'] = [
+  {
+    field: 'action',
+    slots: { default: 'action' },
+    title: '鍒犻櫎',
+    width: 60
+  },
+  {
+    title: '澶囦欢鍚嶇О',
+    field: 'name',
+    width: 180
+  },
+  {
+    title: '澶囦欢缂栫爜',
+    field: 'code',
+    width: 120
+  },
+  {
+    title: '澶囦欢鍨嬪彿',
+    field: 'modelNo',
+    width: 100
+  },
+  {
+    title: '璁¢噺鍗曚綅',
+    field: 'unit',
+    slots: {
+      default: ({ row }) => {
+        if (!row.unit || row.unit === '') {
+          return '';
+        }
+        return renderDict(row.unit, DictEnum.EIMS_SPARE_UNIT);
+      }
+    },
+    width: 80
+  },
+
+  {
+    title: '瀹為檯搴撳瓨',
+    field: 'actualStock',
+    width: 100
+  },
+  {
+    title: '鏁伴噺',
+    field: 'quantity',
+    editRender: {
+      name: 'input'
+    },
+    width: 80
+  },
+  {
+    title: '鍙傝�冧环',
+    field: 'referPrice',
+    width: 90
+  }
+];
 
 const isUpdate = ref(false);
 const title = computed(() => {
@@ -42,12 +112,18 @@
     drawerApi.drawerLoading(true);
     const { id } = drawerApi.getData() as { id?: number | string };
     isUpdate.value = !!id;
+    outSpareList.value = [];
     // 鍒濆鍖�
     await setupDeptSelect();
     // 鏇存柊 && 璧嬪��
     if (isUpdate.value && id) {
       const record = await getSpareInout(id);
       await formApi.setValues(record);
+      // 鏇存柊鍑哄簱鍗曠殑澶囦欢鏄庣粏
+      outSpareList.value = record?.spareList;
+      if (isUpdate.value && record.chargeDept) {
+        await setupUserOptions(record.chargeDept);
+      }
     }
 
     drawerApi.drawerLoading(false);
@@ -104,7 +180,7 @@
           /** 鏍规嵁閮ㄩ棬ID鍔犺浇鐢ㄦ埛 */
           await setupUserOptions(deptId);
           /** 鍙樺寲鍚庨渶瑕侀噸鏂伴�夋嫨鐢ㄦ埛 */
-          formModel.operatorId = undefined;
+          formModel.chargeUser = undefined;
         },
         placeholder: '璇烽�夋嫨',
         showSearch: true,
@@ -120,6 +196,7 @@
     }
   ]);
 }
+
 async function handleConfirm() {
   try {
     drawerApi.drawerLoading(true);
@@ -127,7 +204,15 @@
     if (!valid) {
       return;
     }
+    const selectSpareList = selectSpareTable.value.tableData();
+    // 妫�娴嬫槸鍚﹁緭鍏ュ嚭搴撴暟閲�
+    const eList = selectSpareList.filter((item: any) => !item.quantity || item.quantity <= 0 || item.quantity > item.actualStock);
+    if (selectSpareList.length<= 0 ||eList.length > 0) {
+      message.error('鍑哄簱鏁伴噺涓虹┖鎴栧ぇ浜庡簱瀛橈紝璇锋鏌ワ紒');
+      return false;
+    }
     const data = cloneDeep(await formApi.getValues());
+    data.spareList = selectSpareList;
     await (isUpdate.value ? updateSpareInout(data) : addSpareInout(data));
     emit('reload');
     await handleCancel();
@@ -142,14 +227,43 @@
   drawerApi.close();
   await formApi.resetForm();
 }
+
+// 澶囦欢modal
+const [SpareModal, spareModalApi] = useVbenModal({
+  connectedComponent: spareModal,
+  draggable: true,
+  title: '閫夋嫨澶囦欢'
+});
+
+function handleSpareModal() {
+  spareModalApi.setData({});
+  spareModalApi.open();
+}
+
+/**
+ * 閫夋嫨鐨勫浠�
+ * @param spareList
+ */
+function selectSpare(spareList: any) {
+  outSpareList.value = spareList;
+}
 </script>
 
 <template>
-  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[600px]">
+  <BasicDrawer :close-on-click-modal="false" :title="title" class="w-[1000px]">
     <BasicForm>
       <template #orderCode="slotProps">
         <CodeInput v-bind="slotProps" :disabled="isUpdate" prefix="CK" />
       </template>
+
+      <template #openSpare="slotProps">
+        <a-button type="primary" v-bind="slotProps" :disabled="isUpdate" @click.stop="handleSpareModal">娣诲姞澶囦欢</a-button>
+      </template>
+
+      <template #outSpareList>
+        <SelectSpareTable ref="selectSpareTable" :columns="outCol" :data="outSpareList" :is-update="isUpdate" />
+      </template>
     </BasicForm>
+    <SpareModal class="w-[1200px]" @update-select="selectSpare" />
   </BasicDrawer>
 </template>

--
Gitblit v1.9.3