From a2d9fcb259621829bf4ec9680b5dbeac95ab5805 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 15 十月 2026 16:19:54 +0800
Subject: [PATCH] fix(crm): 销售目标达成分析默认查当前季度
---
src/views/mes/dv/spare/modules/records.vue | 65 ++++++++++++++++++++++++++++++++
1 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/src/views/mes/dv/spare/modules/records.vue b/src/views/mes/dv/spare/modules/records.vue
new file mode 100644
index 0000000..e8f0816
--- /dev/null
+++ b/src/views/mes/dv/spare/modules/records.vue
@@ -0,0 +1,65 @@
+<script setup lang="ts">
+import type { SpareMovement } from '#/api/mes/dv/spare';
+import { onMounted, reactive, ref, watch } from 'vue';
+import { useVbenModal } from '@vben/common-ui';
+import { Alert, Button, Form, Input, Select, Space, Table } from 'ant-design-vue';
+import { getSpareMovements, movementLabels } from '#/api/mes/dv/spare';
+import Action from './action.vue';
+const props=defineProps<{repairId?:number;sparePartId?:number;canIssue?:boolean;repairCode?:string}>();
+const rows=ref<SpareMovement[]>([]),loading=ref(false),error=ref('');
+const page=ref(1),size=ref(10),total=ref(0);
+const filters=reactive<{repairCode?:string;type?:number}>({type:3});
+let seq=0;
+const [ActionModal,actionApi]=useVbenModal({connectedComponent:Action,destroyOnClose:true});
+const columns=[
+ {title:'鎿嶄綔鏃堕棿',dataIndex:'createTime',key:'createTime',width:175},
+ {title:'绫诲瀷',dataIndex:'type',key:'type',width:95},
+ {title:'澶囦欢缂栫爜',dataIndex:'sparePartCode',width:135},
+ {title:'澶囦欢鍚嶇О',dataIndex:'sparePartName',width:150},
+ {title:'瑙勬牸鍨嬪彿',dataIndex:'specification',width:130},
+ {title:'鏁伴噺 / 鍗曚綅',key:'quantity',width:110},
+ {title:'宸查��鍥�',dataIndex:'returnedQuantity',width:90},
+ {title:'鍙��鍥�',dataIndex:'returnableQuantity',width:90},
+ {title:'缁翠慨鍗曞彿',dataIndex:'repairCode',width:145},
+ {title:'璁惧',dataIndex:'machineryName',width:150},
+ {title:'棰嗙敤浜�',dataIndex:'receiverName',width:110},
+ {title:'鎿嶄綔璇存槑',dataIndex:'remark',width:220},
+ {title:'鎿嶄綔',key:'action',width:90,fixed:'right' as const},
+];
+async function load(reset=false) {
+ if(reset)page.value=1;
+ const current=++seq;loading.value=true;error.value='';
+ try {const result=await getSpareMovements({pageNo:page.value,pageSize:size.value,...filters,repairId:props.repairId,sparePartId:props.sparePartId});
+ if(current===seq){rows.value=result.list;total.value=result.total;}}
+ catch {if(current===seq){rows.value=[];total.value=0;error.value='璁板綍鍔犺浇澶辫触锛岃鐐瑰嚮鏌ヨ閲嶈瘯';}}
+ finally {if(current===seq)loading.value=false;}
+}
+function changePage(p:{current?:number;pageSize?:number}){page.value=p.current||1;size.value=p.pageSize||10;void load();}
+function issue(){actionApi.setData({type:'issue',repairId:props.repairId,repairCode:props.repairCode}).open();}
+function returnPart(record:SpareMovement){actionApi.setData({type:'return',original:record}).open();}
+watch(()=>[props.repairId,props.sparePartId],()=>load(true));
+onMounted(()=>load());
+defineExpose({refresh:()=>load(true)});
+</script>
+<template>
+ <div class="mt-4">
+ <ActionModal @success="load(true)" />
+ <div class="mb-3 flex flex-wrap items-center justify-between gap-3"><h3 class="text-base font-semibold">澶囦欢棰嗙敤璁板綍</h3>
+ <Button v-if="canIssue" v-access:code="['mes:dv-spare:issue']" type="primary" @click="issue">棰嗙敤澶囦欢</Button>
+ </div>
+ <Form layout="inline" class="mb-4 flex flex-wrap gap-y-3">
+ <Form.Item v-if="!repairId" label="缁翠慨鍗曞彿"><Input v-model:value="filters.repairCode" allow-clear placeholder="瀹屾暣缁翠慨鍗曞彿" @press-enter="load(true)" /></Form.Item>
+ <Form.Item label="璁板綍绫诲瀷"><Select v-model:value="filters.type" allow-clear class="w-36" :options="Object.entries(movementLabels).map(([value,label])=>({label,value:Number(value)}))" /></Form.Item>
+ <Form.Item><Space><Button :loading="loading" @click="load(true)">鏌ヨ</Button><Button @click="filters.repairCode=undefined;filters.type=3;load(true)">閲嶇疆</Button></Space></Form.Item>
+ </Form>
+ <Alert v-if="error" type="error" :message="error" class="mb-3" />
+ <Table :columns="columns" :data-source="rows" :loading="loading" row-key="id" :scroll="{x:1790}" :pagination="{current:page,pageSize:size,total,showSizeChanger:true}" @change="changePage">
+ <template #bodyCell="{column,record}">
+ <template v-if="column.key==='type'">{{ movementLabels[record.type] }}</template>
+ <template v-else-if="column.key==='quantity'">{{ record.quantity }} {{ record.unit }}</template>
+ <template v-else-if="column.key==='action'"><Button v-if="record.type===3 && Number(record.returnableQuantity)>0" v-access:code="['mes:dv-spare:return']" type="link" @click="returnPart(record as SpareMovement)">閫�鍥�</Button><span v-else>鈥�</span></template>
+ </template>
+ </Table>
+ </div>
+</template>
+
--
Gitblit v1.9.3