yangg 1 ヶ月 前
コミット
7bff7a9ecf

+ 53 - 0
src/views/system/Inventorycount/InventoryDetailDialog/index.vue

@@ -0,0 +1,53 @@
+<template>
+	<el-dialog v-model="visible" title="盘点详情" width="900px" @close="onClose">
+		<el-descriptions :column="3" border style="margin-bottom: 16px">
+			<el-descriptions-item label="盘点编号">{{ detail.check_no }}</el-descriptions-item>
+			<el-descriptions-item label="状态">{{ detail.status_display }}</el-descriptions-item>
+			<!-- <el-descriptions-item label="用时">{{ detail.duration_display }}</el-descriptions-item> -->
+			<el-descriptions-item label="开始时间">{{ detail.start_time_display || detail.start_time }}</el-descriptions-item>
+			<el-descriptions-item label="结束时间">{{ detail.end_time_display || detail.end_time }}</el-descriptions-item>
+			<el-descriptions-item label="盘点人">{{ detail.checker_name }}</el-descriptions-item>
+			<!-- <el-descriptions-item label="发起人">{{ detail.creator_name }}</el-descriptions-item>
+			<el-descriptions-item label="备注">{{ detail.remark }}</el-descriptions-item>
+			<el-descriptions-item label="设备总数">{{ detail.devices_count }}</el-descriptions-item>
+			<el-descriptions-item label="已盘点">{{ detail.scanned_devices_count }}</el-descriptions-item>
+			<el-descriptions-item label="差异数">{{ detail.difference_devices_count }}</el-descriptions-item> -->
+		</el-descriptions>
+
+		<el-table :data="detail.details || []" height="420px">
+			<el-table-column type="index" label="序号" width="60" />
+			<el-table-column prop="device_code" label="设备编号" min-width="140" />
+			<el-table-column prop="device_name" label="设备名称" min-width="140" />
+			<el-table-column prop="device_category" label="分类" min-width="120" />
+			<el-table-column prop="device_unit" label="单位" width="80" />
+			<el-table-column prop="original_quantity" label="原数量" width="90" />
+			<el-table-column prop="scanned_quantity" label="实盘数量" width="100" />
+			<el-table-column prop="difference" label="差异" width="80" />
+			<el-table-column prop="difference_type" label="差异类型" min-width="120" />
+			<el-table-column prop="last_scan_time_display" label="最后扫描时间" min-width="160" />
+		</el-table>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue';
+
+const visible = ref(false);
+const detail = ref<any>({});
+
+const openWithData = (data: any) => {
+	detail.value = data || {};
+	visible.value = true;
+};
+
+const onClose = () => {
+	detail.value = {};
+};
+
+defineExpose({ visible, openWithData });
+</script>
+
+<style scoped>
+</style>
+
+

+ 65 - 37
src/views/system/Inventorycount/InventoryDialog/index.vue

@@ -1,25 +1,27 @@
 <template>
 <template>
     <el-dialog v-model="visible" title="开始盘点" width="800px" @open="onOpen" @close="onClose">
     <el-dialog v-model="visible" title="开始盘点" width="800px" @open="onOpen" @close="onClose">
-      <div class="form-row">
-        <el-input v-model="device_code" placeholder="设备编号" @keyup.enter="handleAdd" />
-        <el-input v-model="check_no" placeholder="盘点编号" @keyup.enter="handleAdd" />
-        <el-button type="primary" @click="handleAdd">添加</el-button>
+      <div>
+        <div class="form-row">
+          <el-input v-model="device_code" placeholder="设备编号" @keyup.enter="handleAdd" :disabled="loading" />
+          <el-input v-model="check_no" placeholder="盘点编号" @keyup.enter="handleAdd" :disabled="loading" />
+          <el-button type="primary" @click="handleAdd" :loading="loading">添加</el-button>
+        </div>
+    
+        <el-table :data="deviceList"  v-loading="loading" style="margin-top: 20px">
+          <el-table-column type="index" label="序号" width="60" />
+          <!-- <el-table-column prop="id" label="盘点id" width="60" /> -->
+          <el-table-column prop="device_code" label="设备编号" />
+          <el-table-column prop="check_no" label="盘点编号" />
+          <el-table-column prop="status_display" label="状态" />
+          <!-- <el-table-column prop="productName" label="商品名称" /> -->
+        </el-table>
       </div>
       </div>
-  
-      <el-table :data="deviceList" style="margin-top: 20px">
-        <el-table-column type="index" label="序号" width="60" />
-        <!-- <el-table-column prop="id" label="盘点id" width="60" /> -->
-        <el-table-column prop="device_code" label="设备编号" />
-        <el-table-column prop="check_no" label="盘点编号" />
-        <el-table-column prop="status_display" label="状态" />
-        <!-- <el-table-column prop="productName" label="商品名称" /> -->
-        <el-table-column label="操作" width="180">
-          <template #default="{ row }">
-            <el-button type="success" size="small" @click="completeScan(row)" >完成盘点</el-button>
-            <el-button type="danger" size="small" @click="cancelScan(row)" >取消盘点</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
+      <template #footer v-if="deviceList.length > 0">
+        <div class="dialog-footer">
+          <el-button @click="onCancelAll" :disabled="!currentRecordId">取消盘点</el-button>
+          <el-button type="primary" @click="onCompleteAll" :disabled="!check_no">完成盘点</el-button>
+        </div>
+      </template>
     </el-dialog>
     </el-dialog>
   </template>
   </template>
   
   
@@ -27,11 +29,14 @@
   import { ref } from 'vue';
   import { ref } from 'vue';
   import * as api from '../api';
   import * as api from '../api';
   import { ElMessage } from 'element-plus';
   import { ElMessage } from 'element-plus';
+  const emit = defineEmits(['completed']);
 
 
   const visible = ref(false);
   const visible = ref(false);
   const device_code = ref('');
   const device_code = ref('');
   const check_no = ref('');
   const check_no = ref('');
   const deviceList = ref<any[]>([]);
   const deviceList = ref<any[]>([]);
+  const currentRecordId = ref<number | null>(null);
+  const loading = ref(false);
 //   const btflag=ref(true);
 //   const btflag=ref(true);
   
   
   const setCheckNo = (val: string) => {
   const setCheckNo = (val: string) => {
@@ -42,6 +47,7 @@
     device_code.value = '';
     device_code.value = '';
     // check_no.value = '';
     // check_no.value = '';
     deviceList.value = [];
     deviceList.value = [];
+    currentRecordId.value = null;
   };
   };
   
   
   const findCheckRecord = (checkNo: string, list: any[]) => {
   const findCheckRecord = (checkNo: string, list: any[]) => {
@@ -59,24 +65,46 @@
         device_code: device_code.value,
         device_code: device_code.value,
         check_no: check_no.value,
         check_no: check_no.value,
     };
     };
-  
-    const res = await api.ScanDevice(payload);
+    
+    loading.value = true;
+    try {
+      const res = await api.ScanDevice(payload);
+      if (res?.code===2000) {
+          const reslist=await api.GetPermission();
+          if (reslist?.code===2000) {
+              const record = findCheckRecord(check_no.value, reslist.data);
+              deviceList.value.push({
+                  ...payload,
+                  productName: res.data?.productName || '未知商品',
+                  id: record?.id||0,
+                  status_display:record?.status_display||'',
+              });
+              device_code.value = '';
+              currentRecordId.value = record?.id ?? null;
+          }
+      }
+    } finally {
+      loading.value = false;
+    }
+  };
+
+  const onCompleteAll = async () => {
+    if (!check_no.value) return;
+    const res=await api.CompleteScan({ check_no: check_no.value });
+    if (res?.code===2000) {
+        ElMessage.success('完成盘点!');
+        visible.value = false;
+        emit('completed');
+    }
+  };
+
+  const onCancelAll = async () => {
+    if (!currentRecordId.value) return;
+    const res=await api.CancelScan(currentRecordId.value);
     if (res?.code===2000) {
     if (res?.code===2000) {
-        const reslist=await api.GetPermission();
-        if (reslist?.code===2000) {
-            const record = findCheckRecord(check_no.value, reslist.data);
-            // console.log("reslist::::",res.data.id)
-            // console.log("record::::",record)
-            deviceList.value.push({
-                ...payload,
-                productName: res.data?.productName || '未知商品',
-                id: record?.id||0,
-                status_display:record?.status_display||'',
-                // record,
-            });
-            device_code.value = '';
-        //   check_no.value = '';
-        }
+        ElMessage.success('取消盘点成功!');
+        visible.value = false;
+        emit('completed');
     }
     }
   };
   };
   
   
@@ -98,7 +126,7 @@
         // });
         // });
         // btflag.value=false;
         // btflag.value=false;
         ElMessage.success('完成盘点!');
         ElMessage.success('完成盘点!');
-        visible.value = false
+       /*  visible.value = false */
     }
     }
   };
   };
   
   

+ 9 - 0
src/views/system/Inventorycount/api.ts

@@ -56,6 +56,15 @@ export function StartScan(obj: object) {
 	});
 	});
 }
 }
 
 
+
+// 获取盘点记录详情
+export function GetDetail(id: number) {
+    return request({
+        url: `/api/system/inventory/check-records/${id}/`,
+        method: 'get',
+    });
+}
+
 export function ScanDevice(obj: object) {
 export function ScanDevice(obj: object) {
 	return request({
 	return request({
 		url: '/api/system/device/scan/',
 		url: '/api/system/device/scan/',

+ 15 - 2
src/views/system/Inventorycount/crud.tsx

@@ -7,7 +7,7 @@ import axios from 'axios';
 import { successMessage,warningMessage } from '/@/utils/message';
 import { successMessage,warningMessage } from '/@/utils/message';
 import { Session } from '/@/utils/storage';
 import { Session } from '/@/utils/storage';
 
 
-export const createCrudOptions = function ({ crudExpose , inventoryDialog}: CreateCrudOptionsProps& { inventoryDialog: Ref<any> }): CreateCrudOptionsRet {
+export const createCrudOptions = function ({ crudExpose , inventoryDialog, inventoryDetailDialog}: CreateCrudOptionsProps& { inventoryDialog: Ref<any>, inventoryDetailDialog: Ref<any> }): CreateCrudOptionsRet {
 	const pageRequest = async (query: UserPageQuery) => {
 	const pageRequest = async (query: UserPageQuery) => {
 		return await api.GetList(query);
 		return await api.GetList(query);
 	};
 	};
@@ -70,7 +70,20 @@ export const createCrudOptions = function ({ crudExpose , inventoryDialog}: Crea
 				width: 220,
 				width: 220,
 				buttons:{
 				buttons:{
 					view:{
 					view:{
-						show:true
+						show:true,
+						click: async ({ row }) => {
+							try {
+								const res = await api.GetDetail(row.id);
+								if (res?.code === 2000) {
+									inventoryDetailDialog.value.openWithData(res.data);
+									return;
+								}
+								warningMessage(res?.message || '获取详情失败');
+							} catch (e) {
+								console.error(e);
+								warningMessage('获取详情异常');
+							}
+						}
 					},
 					},
 					remove:{
 					remove:{
 						show:false,
 						show:false,

+ 6 - 3
src/views/system/Inventorycount/index.vue

@@ -1,7 +1,8 @@
 <template>
 <template>
 	<fs-page>
 	<fs-page>
-		<fs-crud ref="crudRef" v-bind="crudBinding"> </fs-crud>
-		<InventoryDialog ref="inventoryDialog" />
+    <fs-crud ref="crudRef" v-bind="crudBinding"> </fs-crud>
+    <InventoryDialog ref="inventoryDialog" @completed="crudExpose && crudExpose.doRefresh && crudExpose.doRefresh()" />
+		<InventoryDetailDialog ref="inventoryDetailDialog" />
 	</fs-page>
 	</fs-page>
 </template>
 </template>
 
 
@@ -12,11 +13,13 @@ import { GetPermission } from './api';
 import { createCrudOptions } from './crud';
 import { createCrudOptions } from './crud';
 import { handleColumnPermission } from '/@/utils/columnPermission';
 import { handleColumnPermission } from '/@/utils/columnPermission';
 import InventoryDialog from './InventoryDialog/index.vue';
 import InventoryDialog from './InventoryDialog/index.vue';
+import InventoryDetailDialog from './InventoryDetailDialog/index.vue';
 
 
 
 
 const inventoryDialog = ref();
 const inventoryDialog = ref();
+const inventoryDetailDialog = ref();
 const { crudBinding, crudRef, crudExpose, crudOptions, resetCrudOptions } = useFs({ 
 const { crudBinding, crudRef, crudExpose, crudOptions, resetCrudOptions } = useFs({ 
-		createCrudOptions: (ctx) => createCrudOptions({ ...ctx, inventoryDialog }) 
+		createCrudOptions: (ctx) => createCrudOptions({ ...ctx, inventoryDialog, inventoryDetailDialog }) 
 	});
 	});
 
 
 // 页面打开后获取列表数据
 // 页面打开后获取列表数据

+ 1 - 1
src/views/system/borrow/approval/curd.tsx

@@ -260,7 +260,7 @@ export const createCrudOptions = function ({ crudExpose ,context, showRejectDial
 						rules: [{ required: false, message: '请输入借用人' }],
 						rules: [{ required: false, message: '请输入借用人' }],
 					},
 					},
 				},
 				},
-				emergency_phone: {
+				"borrower_info.mobile": {
 					title: '联系方式',
 					title: '联系方式',
 					search: { show: false },
 					search: { show: false },
 					type: 'input',
 					type: 'input',

+ 1 - 1
src/views/system/borrow/crud.tsx

@@ -191,7 +191,7 @@ export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProp
 					 },
 					 },
 				}
 				}
 			},
 			},
-				emergency_phone: { 
+				"borrower_info.mobile": { 
 					title: '联系方式',	
 					title: '联系方式',	
 					search:{show:true}, column: { minWidth: 120 },  form:{
 					search:{show:true}, column: { minWidth: 120 },  form:{
 					component: { placeholder: '请输入联系方式' },
 					component: { placeholder: '请输入联系方式' },