From 68628c6cc163cddfcc745c225a9f3f34767261ef Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期六, 22 十一月 2025 20:44:40 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs | 21
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs | 9
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs | 63
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs | 6
项目代码/WIDESEA_WMSClient/src/router/viewGird.js | 11
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs | 15
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm | 0
项目代码/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue | 397 +++
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs | 3
项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue | 588 +++++
项目代码/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue | 443 ++++
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs | 11
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterielToMesService.cs | 3
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs | 127 +
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielToMes.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs | 2
项目代码/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue | 4
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs | 56
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielToMesService.cs | 53
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs | 203 ++
项目代码/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue | 17
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs | 2670 ++++++++++++++-----------
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj | 1
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs | 38
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs | 14
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm | 0
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs | 12
项目代码/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js | 1
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs | 72
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs | 209 -
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs | 6
项目代码/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js | 456 ++++
项目代码/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js | 374 +++
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs | 5
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs | 41
40 files changed, 4,448 insertions(+), 1,495 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js"
new file mode 100644
index 0000000..0ec3d7d
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/allocateinboundOrder.js"
@@ -0,0 +1,456 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import http from '@/api/http.js'
+import { h,createVNode, render,reactive,ref } from 'vue';
+import { ElDialog , ElForm, ElFormItem, ElInput, ElButton, ElMessage ,ElSelect ,ElOption } from 'element-plus'; // 寮曞叆ElMessage锛岃В鍐虫彁绀烘棤鍙嶅簲
+
+let extension = {
+ components: {
+ //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+ gridHeader: '',
+ gridBody: '',
+ gridFooter: '',
+ //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+ modelHeader: '',
+ modelBody: '',
+ modelFooter: ''
+ },
+ tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+ buttons: { view: [
+ {
+ name: '缁勭洏',
+ type: 'primary',
+ value: '缁勭洏',
+ onClick: function () { // 淇1锛氱Щ闄ゆ棤鐢╮ow鍙傛暟锛屽姞鏃ュ織璋冭瘯
+ console.log('缁勭洏鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
+ const selectedRows = this.$refs.table.getSelected();
+
+ // 鏍¢獙1锛氭槸鍚﹂�変腑琛�
+ if (selectedRows.length === 0) {
+ console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
+ ElMessage.warning('璇烽�夋嫨涓�鏉″崟鎹�');
+ return;
+ }
+ // 鏍¢獙2锛氭槸鍚﹂�変腑鍗曡
+ if (selectedRows.length > 1) {
+ console.log('鏍¢獙涓嶉�氳繃锛氶�変腑澶氳鍗曟嵁');
+ ElMessage.warning('鍙兘閫夋嫨涓�鏉″崟鎹�');
+ return;
+ }
+
+ const targetRow = selectedRows[0];
+
+ this.$emit('openPalletDialog', targetRow.inboundOrderNo);
+ }
+ },
+ {
+ name: '鎾ら攢缁勭洏',
+ type: 'primary',
+ value: '鎾ら攢缁勭洏',
+ onClick: function () {
+ console.log('鎾ら攢缁勭洏鎸夐挳琚偣鍑�');
+ const mountNode = document.createElement('div');
+ document.body.appendChild(mountNode);
+
+ // 鍝嶅簲寮忚〃鍗曟暟鎹細鎵樼洏鍙凤紙蹇呭~锛�
+ const formData = reactive({
+ palletCode: '' // 鎵樼洏鍙疯緭鍏ユ
+ });
+
+ // 鎻愪氦琛ㄥ崟鐨勭粺涓�閫昏緫
+ const submitForm = async () => {
+ const formRef = vnode.component.refs.cancelPalletForm;
+ try {
+ // 鎵ц琛ㄥ崟鏍¢獙锛堟墭鐩樺彿蹇呭~锛�
+ await formRef.validate();
+ } catch (err) {
+ ElMessage.warning('璇疯緭鍏ユ湁鏁堢殑鎵樼洏鍙�');
+ return;
+ }
+
+ // 鍙戣捣鎾ら攢缁勭洏璇锋眰
+ try {
+ //console.log('鍙戣捣鎾ら攢缁勭洏璇锋眰锛屾墭鐩樺彿锛�', formData.palletCode.trim());
+ const response = await http.post('/api/InboundOrder/CancelPalletGroup', {
+ palletCode: formData.palletCode.trim()
+ });
+
+ const { status, message, data } = response;
+ if (status) {
+ ElMessage.success(`鎾ら攢缁勭洏鎴愬姛锛屾墭鐩樺彿锛�${formData.palletCode.trim()}`);
+ this.refresh(); // 鎴愬姛鍚庡埛鏂板垪琛�
+ // 鍏抽棴瀵硅瘽妗�
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ } else {
+ console.log('鎾ら攢缁勭洏澶辫触锛屽悗绔彁绀猴細', message);
+ ElMessage.error(message || data?.message || '鎾ら攢缁勭洏澶辫触');
+ selectPalletCodeInput(); // 閫変腑杈撳叆妗嗘柟渚块噸鏂拌緭鍏�
+ }
+ } catch (error) {
+ console.error('鎾ら攢缁勭洏璇锋眰寮傚父锛�', error);
+ ElMessage.error('缃戠粶寮傚父鎴栨帴鍙i敊璇紝璇风◢鍚庨噸璇�');
+ selectPalletCodeInput();
+ }
+ };
+
+ // 閫変腑杈撳叆妗嗘枃鏈紙鏂逛究閲嶆柊杈撳叆锛�
+ const selectPalletCodeInput = () => {
+ setTimeout(() => {
+ const inputRef = vnode.component.refs.palletCodeInput;
+ if (inputRef) {
+ const targetInput = inputRef.$el?.querySelector('input') || inputRef;
+ targetInput?.focus();
+ targetInput?.select();
+ }
+ }, 100);
+ };
+
+ // 鍒涘缓瀵硅瘽妗哣Node
+ const vnode = createVNode(ElDialog, {
+ title: '鎾ら攢缁勭洏',
+ width: '400px',
+ modelValue: true,
+ appendToBody: true,
+ onOpened: () => {
+ // 瀵硅瘽妗嗘墦寮�鍚庤嚜鍔ㄨ仛鐒﹁緭鍏ユ
+ setTimeout(() => {
+ const inputRef = vnode.component.refs.palletCodeInput;
+ inputRef?.focus();
+ }, 100);
+ },
+ 'onUpdate:modelValue': (isVisible) => {
+ if (!isVisible) {
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ }
+ }
+ }, {
+ default: () => h(ElForm, {
+ model: formData,
+ rules: {
+ palletCode: [
+ { required: true, message: '璇疯緭鍏ユ墭鐩樺彿', trigger: ['blur', 'enter'] },
+ { min: 1, max: 50, message: '鎵樼洏鍙烽暱搴︿笉鑳借秴杩�50涓瓧绗�', trigger: ['blur', 'input'] }
+ ]
+ },
+ ref: 'cancelPalletForm'
+ }, [
+ // 鎵樼洏鍙疯緭鍏ラ」
+ h(ElFormItem, { label: '鎵樼洏鍙�', prop: 'palletCode', required: true }, [
+ h(ElInput, {
+ type: 'text',
+ modelValue: formData.palletCode,
+ 'onUpdate:modelValue': (val) => {
+ formData.palletCode = val;
+ },
+ ref: 'palletCodeInput',
+ placeholder: '鎵爜杈撳叆鎴栨墜鍔ㄨ緭鍏ユ墭鐩樺彿',
+ maxLength: 50,
+ // 鐩戝惉鍥炶溅浜嬩欢锛堟壂鐮佹灙榛樿浼氬彂閫佸洖杞︼級
+ onKeydown: (e) => {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ submitForm();
+ }
+ }
+ })
+ ]),
+ // 搴曢儴鎸夐挳鍖�
+ h('div', { style: { textAlign: 'right', marginTop: '16px' } }, [
+ h(ElButton, {
+ type: 'text',
+ onClick: () => {
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ ElMessage.info('鍙栨秷鎾ら攢缁勭洏');
+ }
+ }, '鍙栨秷'),
+ h(ElButton, {
+ type: 'primary',
+ onClick: submitForm.bind(this) // 缁戝畾this涓婁笅鏂�
+ }, '纭鎾ら攢')
+ ])
+ ])
+ });
+
+ vnode.appContext = this.$.appContext;
+ render(vnode, mountNode);
+ }
+ },
+ {
+ name: '鍒嗘壒鍏ュ簱',
+ type: 'primary',
+ value: '鍒嗘壒鍏ュ簱',
+ onClick: async function () {
+ console.log('鍒嗘壒鍏ュ簱鎸夐挳琚偣鍑伙紝寮�濮嬫牎楠�');
+ const selectedRows = this.$refs.table.getSelected();
+
+ // 鏍¢獙1锛氭槸鍚﹂�変腑琛岋紙鑷冲皯閫夋嫨涓�鏉★級
+ if (selectedRows.length === 0) {
+ console.log('鏍¢獙涓嶉�氳繃锛氭湭閫変腑浠讳綍鍗曟嵁');
+ ElMessage.warning('璇烽�夋嫨鑷冲皯涓�鏉″崟鎹�');
+ return;
+ }
+
+ // 鏀堕泦鎵�鏈夐�変腑鍗曟嵁鐨勭紪鍙凤紙杩囨护鏃犲崟鎹彿鐨勫紓甯歌锛�
+ const inboundOrderNos = selectedRows
+ .filter(row => row.inboundOrderNo)
+ .map(row => row.inboundOrderNo);
+
+ // 鏍¢獙2锛氭槸鍚︽湁鏈夋晥鍗曟嵁鍙�
+ if (inboundOrderNos.length === 0) {
+ console.log('鏍¢獙涓嶉�氳繃锛氶�変腑鍗曟嵁鏃犳湁鏁堢紪鍙�');
+ ElMessage.warning('閫変腑鐨勫崟鎹腑鏃犳湁鏁堢紪鍙凤紝璇烽噸鏂伴�夋嫨');
+ return;
+ }
+
+ try {
+ console.log('鍙戣捣鍒嗘壒鍏ュ簱璇锋眰锛屽弬鏁帮細', { inboundOrderNos});
+ const response = await http.post('/api/InboundOrder/BatchOrderFeedbackToMes', {
+ orderNos: inboundOrderNos,
+ inout:1
+ });
+
+ const { status, message, data } = response;
+ if (status) {
+ console.log('鍒嗘壒鍏ュ簱鎴愬姛锛屽悗绔繑鍥烇細', data);
+ ElMessage.success(`鍒嗘壒鍏ュ簱鎴愬姛锛佸叡澶勭悊${inboundOrderNos.length}鏉″崟鎹甡);
+ this.refresh(); // 鍏ュ簱鎴愬姛鍚庡埛鏂板垪琛紙澶嶇敤鍘熸湁閫昏緫锛�
+ } else {
+ console.log('鍒嗘壒鍏ュ簱澶辫触锛屽悗绔彁绀猴細', message);
+ ElMessage.error(message || data?.message || '鍒嗘壒鍏ュ簱澶辫触');
+ }
+ } catch (error) {
+ console.error('鍒嗘壒鍏ュ簱璇锋眰寮傚父锛�', error);
+ ElMessage.error('缃戠粶寮傚父鎴栨帴鍙i敊璇紝璇风◢鍚庨噸璇�');
+ }
+ }
+},
+ {
+ name: '绌烘墭鐩樺叆搴�',
+ type: 'primary',
+ value: '绌烘墭鐩樺叆搴�',
+
+ onClick: function () {
+ const mountNode = document.createElement('div');
+ document.body.appendChild(mountNode);
+
+ // 鍝嶅簲寮忚〃鍗曟暟鎹細鏂欑鐮侊紙蹇呭~锛屾壂鐮佹灙/鎵嬪姩杈撳叆锛�
+ const formData = reactive({
+ boxCode: '',
+ warehouseCode:''
+ });
+
+ const warehouses = ref([]);
+ const isLoadingWarehouses = ref(false);
+
+ const getWarehouseList = async () => {
+ isLoadingWarehouses.value = true;
+ try {
+ const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes');
+ if (status && Array.isArray(data)) {
+ // 鏍煎紡鍖栦粨搴撻�夐」锛氶�傞厤ElSelect鐨刲abel-value鏍煎紡
+ warehouses.value = data.map(item => ({
+ label: item.locationTypeDesc,
+ value: item.locationType
+ }));
+ } else {
+ ElMessage.error('鑾峰彇鍖哄煙鍒楄〃澶辫触');
+ warehouses.value = [];
+ }
+ } catch (err) {
+ ElMessage.error('鍖哄煙鏁版嵁璇锋眰寮傚父锛岃绋嶅悗閲嶈瘯');
+ warehouses.value = [];
+ } finally {
+ isLoadingWarehouses.value = false;
+ }
+ };
+
+ // 鎻愪氦琛ㄥ崟鐨勭粺涓�閫昏緫锛堜緵鍥炶溅瑙﹀彂鍜屾寜閽偣鍑诲叡鐢級
+ const submitForm = async () => {
+ const formRef = vnode.component.refs.batchInForm;
+ try {
+ // 鎵ц琛ㄥ崟鏍¢獙锛堟枡绠辩爜蹇呭~锛�
+ await formRef.validate();
+ } catch (err) {
+ ElMessage.warning('璇疯緭鍏ユ湁鏁堢殑鏂欑鐮�');
+ return;
+ }
+
+
+ http.post('/api/InboundOrder/EmptyMaterielGroup', {
+ palletCode: formData.boxCode.trim(),
+ warehouseCode:formData.warehouseCode
+ }).then(({ data, status, message }) => {
+ if (status) {
+ ElMessage.success(`鍏ュ簱鎴愬姛锛屾枡绠辩爜锛�${formData.boxCode.trim()}`);
+ this.refresh();
+ formData.boxCode = '';
+
+ setTimeout(() => {
+ const inputRef = vnode.component.refs.boxCodeInput;
+ inputRef?.focus();
+ }, 100);
+ } else {
+ ElMessage.error(message || data?.message || '鍏ュ簱澶辫触');
+ selectBoxCodeInput();
+ }
+ }).catch(() => {
+ ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
+ selectBoxCodeInput();
+ });
+ };
+
+ const selectBoxCodeInput = () => {
+ setTimeout(() => {
+ const inputRef = vnode.component.refs.boxCodeInput;
+ if (inputRef) {
+ const targetInput = inputRef.$el?.querySelector('input') || inputRef;
+ targetInput?.focus();
+ targetInput?.select();
+ }
+ }, 100);
+}
+ const vnode = createVNode(ElDialog, {
+ title: '绌烘墭鐩樺叆搴�',
+ width: '400px',
+ modelValue: true,
+ appendToBody: true,
+
+ onOpened: async () => {
+ await getWarehouseList();
+ const inputRef = vnode.component.refs.boxCodeInput;
+ inputRef?.focus();
+ },
+ 'onUpdate:modelValue': (isVisible) => {
+ if (!isVisible) {
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ }
+ }
+ }, {
+ default: () => h(ElForm, {
+ model: formData,
+ rules: {
+ boxCode: [
+ { required: true, message: '璇疯緭鍏ユ枡绠辩爜', trigger: ['blur', 'enter'] }
+ ],
+ warehouseCode:[
+ { required: true, message: '璇烽�夋嫨鍖哄煙', trigger: ['change', 'blur'] }
+ ]
+ },
+ ref: 'batchInForm'
+ }, [
+ //浠撳簱鏁版嵁
+ h(ElFormItem, { label: '鍖哄煙', prop: 'warehouseCode', required: true }, [
+ h(ElSelect, {
+ modelValue: formData.warehouseCode,
+ 'onUpdate:modelValue': (val) => {
+ formData.warehouseCode = val;
+ },
+ placeholder: '璇烽�夋嫨鍏ュ簱鍖哄煙',
+ filterable: true, // 鏀寔鎼滅储浠撳簱
+ loading: isLoadingWarehouses.value, // 鍔犺浇鐘舵��
+ style: { width: '100%' }
+ }, [
+ // 娓叉煋浠撳簱涓嬫媺閫夐」
+ warehouses.value.map(item => h(ElOption, {
+ label: item.label,
+ value: item.value
+ }))
+ ])
+ ]),
+ // 鏂欑鐮佽緭鍏ラ」锛堟敮鎸佽仛鐒︺�佸洖杞︽彁浜わ級
+ h(ElFormItem, { label: '鏂欑鐮�', prop: 'boxCode', required: true }, [
+ h(ElInput, {
+ type: 'text',
+ modelValue: formData.boxCode,
+ 'onUpdate:modelValue': (val) => {
+ formData.boxCode = val;
+ },
+ ref: 'boxCodeInput',
+ placeholder: '鎵爜杈撳叆鎴栨墜鍔ㄨ緭鍏ユ枡绠辩爜',
+ // 鐩戝惉鍥炶溅浜嬩欢锛堟壂鐮佹灙榛樿浼氬彂閫佸洖杞︼級
+ onKeydown: (e) => {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ submitForm();
+ }
+ }
+ })
+ ]),
+ // 搴曢儴鎸夐挳鍖�
+ h('div', { style: { textAlign: 'right', marginTop: '16px' } }, [
+ h(ElButton, {
+ type: 'text',
+ onClick: () => {
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ ElMessage.info('鍙栨秷鍏ュ簱浠诲姟');
+ }
+ }, '鍙栨秷'),
+ h(ElButton, {
+ type: 'primary',
+ onClick: submitForm
+ }, '纭畾')
+ ])
+ ])
+ });
+
+ vnode.appContext = this.$.appContext;
+ render(vnode, mountNode);
+ }
+}
+ ], box: [], detail: [] },
+ methods: {
+ //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+ onInit() {
+ },
+ onInited() {
+
+ //妗嗘灦鍒濆鍖栭厤缃悗
+ //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+ //this.detailOptions.columns.forEach(column=>{ });
+ },
+ searchBefore(param) {
+ //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+ //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+ let wheres = [{
+ 'name': 'orderType',
+ 'value': '115',
+ 'displayType': 'text'}];
+
+
+ param.wheres.push(...wheres);
+ // this.searchFormFields.orderType=[115]
+ return true;
+ },
+ searchAfter(result) {
+ //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+ return true;
+ },
+ addBefore(formData) {
+ //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+ return true;
+ },
+ updateBefore(formData) {
+ //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+ return true;
+ },
+ rowClick({ row, column, event }) {
+ //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+ this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+ },
+ modelOpenAfter(row) {
+ //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+ //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+ //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+ //(3)this.editFormFields.瀛楁='xxx';
+ //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+ //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+ }
+ }
+ };
+ export default extension;
+
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
index 19960e4..c6578d5 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js"
@@ -416,6 +416,7 @@
searchBefore(param) {
//鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
//杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+ this.searchFormFields.orderType=[0]
return true;
},
searchAfter(result) {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
new file mode 100644
index 0000000..487648b
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/allocateoutboundOrder.js"
@@ -0,0 +1,374 @@
+
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import http from '@/api/http.js'
+import { h,createVNode, render,reactive ,ref } from 'vue';
+import { ElDialog , ElForm, ElFormItem, ElInput, ElButton, ElMessage ,ElSelect, ElOption} from 'element-plus';
+
+import gridBody from './extend/outOrderDetail.vue'
+let extension = {
+ components: {
+ //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+ gridHeader: '',
+ gridBody: gridBody,
+ gridFooter: '',
+ //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+ modelHeader: '',
+ modelBody: '',
+ modelFooter: ''
+ },
+ tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+ buttons: { view: [
+ /* {
+ name: '鍑哄簱',
+ type: 'primary',
+ value: '鍑哄簱',
+ onClick: function () { // 淇锛氱敤ElMessage鏇夸唬this.$message
+ const selectedRows = this.$refs.table.getSelected();
+ if (selectedRows.length === 0) {
+ ElMessage.warning('璇峰厛閫夋嫨瑕佺敓鎴愪换鍔$殑琛�');
+ return;
+ }
+ if (selectedRows.length > 1) {
+ ElMessage.warning('鍙兘閫夋嫨涓�琛�');
+ return;
+ }
+
+
+ // 鎵�鏈夋牎楠岄�氳繃锛岃Е鍙戜富缁勪欢鎵撳紑鍑哄簱寮圭獥
+ console.log('鎵�鏈夋牎楠岄�氳繃锛岃Е鍙憃penOutboundDialog浜嬩欢锛屽崟鎹暟鎹細', selectedRows[0]);
+
+ this.$emit('openOutboundDialog', {
+ transNo: selectedRows[0].transNo, // 鍑哄簱鍗曠紪鍙�
+ createDate: selectedRows[0].createDate || new Date().toLocaleDateString() // 鍑哄簱鏃ユ湡
+ });
+ }
+ }, */
+ {
+ name: '绌烘墭鐩樺嚭搴�',
+ type: 'primary',
+ value: '绌烘墭鐩樺嚭搴�',
+ onClick: function () {
+
+
+ const platformOptions = Array.from({ length: 1 }, (_, i) => {
+ const num = 1;
+ return { label: `绔欏彴${num}`, value: `1-2` };
+ });
+
+ const quantityOptions = Array.from({ length: 6 }, (_, i) => ({
+ label: (i + 1).toString(),
+ value: i + 1
+ }));
+
+ const warehouseOptions = ref([]);
+ const isLoadingWarehouses = ref(false);
+
+ const getWarehouseList = async () => {
+ isLoadingWarehouses.value = true;
+ try {
+ const { data, status } = await http.post('/api/LocationInfo/GetLocationTypes');
+ if (status && Array.isArray(data)) {
+ // 鏍煎紡鍖栦粨搴撻�夐」锛氶�傞厤ElSelect鐨刲abel-value鏍煎紡
+ warehouseOptions.value = data.map(item => ({
+ label: item.locationTypeDesc,
+ value: item.locationType
+ }));
+ } else {
+ ElMessage.error('鑾峰彇鍖哄煙鍒楄〃澶辫触');
+ warehouseOptions.value = [];
+ }
+ } catch (err) {
+ ElMessage.error('鍖哄煙鏁版嵁璇锋眰寮傚父锛岃绋嶅悗閲嶈瘯');
+ warehouseOptions.value = [];
+ } finally {
+ isLoadingWarehouses.value = false;
+ }
+ };
+
+ const mountNode = document.createElement('div');
+ document.body.appendChild(mountNode);
+
+
+ const formData = reactive({
+ warehouseCode:'',
+ palletCode: '',
+ selectedPlatform: platformOptions[0].value,
+ quantity:1
+ });
+
+ const vnode = createVNode(ElDialog, {
+ title: '绌烘墭鐩樺嚭搴�',
+ width: '500px',
+ modelValue: true,
+ appendToBody: true,
+ onOpened: async () => {
+ await getWarehouseList();
+ const inputRef = vnode.component.refs.boxCodeInput;
+ inputRef?.focus();
+ },
+ 'onUpdate:modelValue': (isVisible) => {
+ if (!isVisible) {
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ }
+ },
+ style: {
+ padding: '20px 0',
+ borderRadius: '8px'
+ }
+ }, {
+ default: () => h(ElForm, {
+ model: formData,
+ rules: {
+ warehouseCode:[
+ { required: true, message: '璇烽�夋嫨鍖哄煙', trigger: ['change', 'blur'] }
+ ],
+ palletCode: [
+ { type: 'string', message: '鏂欑鍙峰繀椤讳负瀛楃涓�', trigger: 'blur' }
+ ],
+ selectedPlatform: [
+ { required: true, message: '璇烽�夋嫨鍑哄簱绔欏彴', trigger: 'change' }
+ ],
+ quantity:[
+ { required: true, message: '璇烽�夋嫨绌虹鏁伴噺', trigger: 'change'}
+ ]
+ },
+ ref: 'batchOutForm',
+ labelWidth: '100px',
+ style: {
+ padding: '0 30px',
+ }
+ },
+ [
+ // h(ElFormItem, {
+ // label: '浠撳簱鍖哄煙',
+ // prop: 'warehouseCode',
+ // style: {
+ // marginBottom: '24px'
+ // }
+ // }, [
+ // h(ElSelect, {
+ // placeholder: '璇烽�夋嫨浠撳簱鍖哄煙',
+ // modelValue: formData.warehouseCode,
+ // 'onUpdate:modelValue': (val) => {
+ // formData.warehouseCode = val;
+ // },
+ // style: {
+ // width: '100%',
+ // height: '40px',
+ // borderRadius: '4px',
+ // borderColor: '#dcdfe6'
+ // }
+ // }, warehouseOptions.value.map(platform =>
+ // h(ElOption, { label: platform.label, value: platform.value })
+ // ))
+ // ]),
+ h(ElFormItem, {
+ label: '鍑哄簱绔欏彴',
+ prop: 'selectedPlatform',
+ style: {
+ marginBottom: '24px'
+ }
+ }, [
+ h(ElSelect, {
+ placeholder: '璇烽�夋嫨鍑哄簱绔欏彴',
+ modelValue: formData.selectedPlatform,
+ 'onUpdate:modelValue': (val) => {
+ formData.selectedPlatform = val;
+ },
+ style: {
+ width: '100%',
+ height: '40px',
+ borderRadius: '4px',
+ borderColor: '#dcdfe6'
+ }
+ }, platformOptions.map(platform =>
+ h(ElOption, { label: platform.label, value: platform.value })
+ ))
+ ]),
+ // h(ElFormItem,{
+ // label:'鍑哄簱鏁伴噺',
+ // prop:'quantity',
+ // style:{
+ // marginBottom:'24px'
+ // }
+ // },[h(ElSelect,{
+ // placeholder:'璇烽�夋嫨绌虹鏁伴噺',
+ // modelValue:formData.quantity,
+ // 'onUpdate:modelValue':(val)=>{
+ // formData.quantity=val;
+ // },
+ // style:{
+ // width:'100%',
+ // height:'40px',
+ // borderRadius:'4px',
+ // borderColor:'#dcdfe6'
+ // },
+ // filterable:false
+ // },
+ // quantityOptions.map(option=>
+ // h(ElOption,{
+ // label:option.label,
+ // value:option.value
+ // })
+ // )
+ // )]),
+ h(ElFormItem, {
+ label: '鏂欑鍙�',
+ prop: 'palletCode',
+ style: {
+ marginBottom: '16px'
+ }
+ }, [
+ h(ElInput, {
+ type: 'text',
+ placeholder: '鍙�夎緭鍏ユ枡绠卞彿锛屼笉濉垯鑷姩鍒嗛厤绌烘枡绠�',
+ modelValue: formData.palletCode,
+ 'onUpdate:modelValue': (val) => {
+ formData.palletCode = val;
+ },
+ style: {
+ width: '100%',
+ height: '40px',
+ borderRadius: '4px',
+ borderColor: '#dcdfe6'
+ },
+ attrs: {
+ placeholderStyle: 'color: #909399;'
+ }
+ })
+ ]),
+
+ h('div', {
+ style: {
+ textAlign: 'right',
+ marginTop: '8px',
+ paddingRight: '4px'
+ }
+ }, [
+ h(ElButton, {
+ type: 'text',
+ onClick: () => {
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ ElMessage.info('鍙栨秷鍑哄簱鎿嶄綔');
+ },
+ style: {
+ marginRight: '8px',
+ color: '#606266'
+ }
+ }, '鍙栨秷'),
+ h(ElButton, {
+ type: 'primary',
+ onClick: async () => {
+ const formRef = vnode.component.refs.batchOutForm;
+ try {
+ await formRef.validate();
+ } catch (err) {
+ return;
+ }
+
+ http.post('/api/Task/PalletOutboundTask?palletCode='+formData.palletCode+'&endStation='+formData.selectedPlatform, {
+
+ }).then(({ data, status, message }) => {
+ if (status) {
+
+ ElMessage.success(`鍑哄簱鎴愬姛`);
+ this.refresh();
+ render(null, mountNode);
+ document.body.removeChild(mountNode);
+ } else {
+ ElMessage.error(message || data?.message || '鍑哄簱澶辫触');
+ }
+ }).catch(() => {
+ ElMessage.error('璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯');
+ });
+ },
+ style: {
+ borderRadius: '4px',
+ padding: '8px 20px'
+ }
+ }, '纭畾')
+ ])
+ ])
+ });
+
+ vnode.appContext = this.$.appContext;
+ render(vnode, mountNode);
+ }
+}
+ ], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+ methods: {
+ //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+ onInit() {
+ //鎵╁睍椤甸潰鍒濆鍖栨搷浣�
+ this.columns.push({
+ field: '鎿嶄綔',
+ title: '鎿嶄綔',
+ width: 90,
+ fixed: 'right',
+ align: 'center',
+ formatter: (row) => {
+ return (
+ '<i style="cursor: pointer;color: #2d8cf0;"class="el-icon-view">鏌ョ湅鏄庣粏</i>'
+ );
+ },
+ click: (row) => {
+ const table = this.$refs.table.$refs.table;
+ if(table){
+ table.clearSelection();
+ table.toggleRowSelection(row,true);
+ }
+ const rowId =row.id;
+ console.log(rowId);
+ this.$refs.gridBody.open(row);
+ }
+ });
+ },
+ onInited() {
+ //妗嗘灦鍒濆鍖栭厤缃悗
+ //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+ //this.detailOptions.columns.forEach(column=>{ });
+ },
+ searchBefore(param) {
+ //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+ //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+ // this.searchFormFields.orderType=[215]
+
+ let wheres = [{
+ 'name': 'orderType',
+ 'value': '215',
+ 'displayType': 'text'}];
+
+
+ param.wheres.push(...wheres);
+ return true;
+ },
+ searchAfter(result) {
+ //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+ return true;
+ },
+ addBefore(formData) {
+ //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+ return true;
+ },
+ updateBefore(formData) {
+ //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+ return true;
+ },
+ rowClick({ row, column, event }) {
+ //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+ this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+ },
+ modelOpenAfter(row) {
+ //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+ //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+ //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+ //(3)this.editFormFields.瀛楁='xxx';
+ //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+ //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+ }
+ }
+ };
+ export default extension;
+
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue"
new file mode 100644
index 0000000..055e360
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue"
@@ -0,0 +1,588 @@
+<template>
+ <div>
+ <vol-box v-model="showDetialBox" :lazy="true" width="500px" :padding="15" title="">
+ <!-- 鎵撳嵃涓撶敤瀹瑰櫒 -->
+ <div id="printContainer" style="position: absolute; left: -9999px;">
+ <div class="print-page" v-for="(item, index) in printData" :key="index">
+ <div class="material-card">
+ <!-- <div class="header">鍗撳姏鑳界墿鏂欐爣璇嗗崱(灏忓寘)</div> -->
+ <div class="dual-column preview-card-header-qrcode">
+ <div class="preview-card-header">鐗╂枡鍗� {{ idx + 1 }}</div>
+ <VueQrcode :value="generateQr(item)" :size="20" id="qrcode" />
+ </div>
+ <div class="content">
+ <!-- 浜岀淮鐮佹斁鍦ㄥ彸涓婅 -->
+ <!-- <div class="qr-section"> -->
+ <!-- <VueQrcode :value="generateQr(item)" id="qrcode" /> -->
+ <!-- </div> -->
+ <div class="row dual-column">
+ <div class="column">
+ <span class="label">鏂欏彿</span>
+ <span class="value code-value">{{ item.materialCode }}</span>
+ </div>
+ <div class="column">
+ <span class="label">渚涘簲鍟嗙紪鐮�</span>
+ <span class="value">{{ item.supplierCode }}</span>
+ </div>
+ </div>
+
+ <div class="row dual-column">
+ <div class="column">
+ <span class="label">鍝佸悕</span>
+ <span class="value">{{ item.materialName }}</span>
+ </div>
+ <div class="column">
+ <span class="label">閲囪喘鍗曞彿</span>
+ <span class="value">{{ item.purchaseOrderNo }}</span>
+ </div>
+ </div>
+
+ <div class="row dual-column">
+ <div class="column">
+ <span class="label">瑙勬牸</span>
+ <span class="value full-width">{{ item.specification }}</span>
+ </div>
+ <div class="column">
+ <span class="label">鏁伴噺/鎬绘暟</span>
+ <span class="value">{{ item.quantityTotal }}</span>
+ </div>
+ </div>
+
+ <div class="row dual-column">
+ <div class="column">
+ <span class="label">鎵瑰彿</span>
+ <span class="value">{{ item.batchNumber }}</span>
+ </div>
+ <div class="column">
+ <span class="label">鎵规</span>
+ <span class="value">{{ item.batch }}</span>
+ </div>
+ </div>
+
+ <div class="row dual-column">
+ <div class="column">
+ <span class="label">鍘傚尯</span>
+ <span class="value">{{ item.factory }}</span>
+ </div>
+ <div class="column">
+ <span class="label">鏃ユ湡</span>
+ <span class="value">{{ item.date }}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <!-- 棰勮鍖哄煙 -->
+ <div id="previewContent" class="preview-container">
+ <div class="preview-header">鍗撳姏鑳界墿鏂欐爣璇嗗崱(灏忓寘) - 棰勮 (鍏眥{ printData.length }}涓�)</div>
+ <div class="preview-scroll">
+ <div v-for="(item, idx) in printData" :key="idx" class="preview-card">
+ <div class="dual-column preview-card-header-qrcode">
+ <div class="preview-card-header">鐗╂枡鍗� {{ idx + 1 }}</div>
+ <VueQrcode :value="generateQr(item)" :size="20" id="qrcode" />
+ </div>
+ <div class="preview-wrapper">
+ <div class="content-preview">
+ <div class="row-preview dual-column">
+ <div class="column-preview">
+ <span class="label-preview">鏂欏彿</span>
+ <span class="value-preview code-value">{{ item.materialCode }}</span>
+ </div>
+ <div class="column-preview">
+ <span class="label-preview">渚涘簲鍟嗙紪鐮�</span>
+ <span class="value-preview">{{ item.supplierCode }}</span>
+ </div>
+ </div>
+
+ <div class="row-preview dual-column">
+ <div class="column-preview">
+ <span class="label-preview">鍝佸悕</span>
+ <span class="value-preview">{{ item.materialName }}</span>
+ </div>
+ <div class="column-preview">
+ <span class="label-preview">閲囪喘鍗曞彿</span>
+ <span class="value-preview">{{ item.purchaseOrderNo }}</span>
+ </div>
+ </div>
+
+ <div class="row-preview dual-column">
+ <div class="column-preview">
+ <span class="label-preview">瑙勬牸</span>
+ <span class="value-preview full-width">{{ item.specification }}</span>
+ </div>
+ <div class="column-preview">
+ <span class="label-preview">鏁伴噺/鎬绘暟</span>
+ <span class="value-preview">{{ item.quantityTotal }}</span>
+ </div>
+ </div>
+
+ <div class="row-preview dual-column">
+ <div class="column-preview">
+ <span class="label-preview">鎵瑰彿</span>
+ <span class="value-preview">{{ item.batchNumber }}</span>
+ </div>
+ <div class="column-preview">
+ <span class="label-preview">鎵规</span>
+ <span class="value-preview">{{ item.batch }}</span>
+ </div>
+ </div>
+
+ <div class="row-preview dual-column">
+ <div class="column-preview">
+ <span class="label-preview">鍘傚尯</span>
+ <span class="value-preview">{{ item.factory }}</span>
+ </div>
+ <div class="column-preview">
+ <span class="label-preview">鏃ユ湡</span>
+ <span class="value-preview">{{ item.date }}</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <template #footer>
+ <div class="footer-actions">
+ <span class="print-count">鍏� {{ printData.length }} 涓墿鏂欏崱寰呮墦鍗�</span>
+ <div>
+ <el-button type="primary" size="small" @click="print">鎵撳嵃鍏ㄩ儴</el-button>
+ <el-button type="danger" size="small" @click="showDetialBox = false">鍏抽棴</el-button>
+ </div>
+ </div>
+ </template>
+ </vol-box>
+ </div>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+import VueQrcode from "vue-qrcode";
+
+export default {
+ components: { VolBox, VueQrcode },
+ data() {
+ return {
+ showDetialBox: false,
+ printData: [], // 瀛樺偍鎵撳嵃鏁版嵁闆嗗悎
+ };
+ },
+ methods: {
+ generateQr(item) {
+ return `${item.materialCode}_${item.supplierCode}_${item.purchaseOrderNo}_${item.materialName}_${item.batch}_${item.batchNumber}_${item.factory}_${item.date}`;
+ },
+
+ open(rows) {
+ this.showDetialBox = true;
+ this.printData = Array.isArray(rows) ? rows : [rows];
+ console.log('鎵撳嵃鏁版嵁:', this.printData);
+ },
+
+ async print() {
+ if (this.printData.length === 0) {
+ this.$message.warning('娌℃湁鍙墦鍗扮殑鏁版嵁');
+ return;
+ }
+
+ this.$nextTick(() => {
+ try {
+ const printContent = document.getElementById("printContainer").innerHTML;
+ const printWindow = window.open("", "_blank", "width=800,height=600,scrollbars=yes");
+
+ if (!printWindow) {
+ this.$message.error('鏃犳硶鎵撳紑鎵撳嵃绐楀彛锛岃妫�鏌ユ祻瑙堝櫒寮圭獥璁剧疆');
+ return;
+ }
+
+ printWindow.document.write(`
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <meta charset="UTF-8">
+ <title>鐗╂枡鏍囪瘑鍗℃墦鍗� - 鍏�${this.printData.length}涓�</title>
+ <style>
+ /* 閲嶇疆鎵�鏈夋牱寮� */
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ body {
+ font-family: SimSun, "瀹嬩綋", sans-serif;
+ -webkit-print-color-adjust: exact !important;
+ print-color-adjust: exact !important;
+ color-adjust: exact !important;
+ }
+ #qrcode {
+ width: 60px;
+ height: 60px;
+ display: block;
+ margin: 0, 15px
+ }
+ @media print {
+ @page {
+ size: 80mm 60mm;
+ margin: 0;
+ padding: 0;
+ }
+
+ body {
+ margin: 0 !important;
+ padding: 0 !important;
+ width: 80mm !important;
+ background: white !important;
+ }
+
+ .print-page {
+ width: 80mm !important;
+ height: 60mm !important;
+ page-break-after: always !important;
+ break-after: page !important;
+ margin: 0 !important;
+ padding: 2mm !important;
+ display: block !important;
+ }
+
+ .print-page:last-child {
+ page-break-after: auto !important;
+ }
+
+ .material-card {
+ width: 80mm !important;
+ height: 56mm !important;
+ border: 0.3mm solid #000 !important;
+ padding: 1mm !important;
+ box-sizing: border-box !important;
+ position: relative !important;
+ background: white !important;
+ }
+
+ .header {
+ font-size: 3.5mm !important;
+ font-weight: bold !important;
+ text-align: center !important;
+ margin-bottom: 1mm !important;
+ padding-bottom: 0.5mm !important;
+ border-bottom: 0.2mm solid #000 !important;
+ }
+
+ .content {
+ height: calc(100% - 6mm) !important;
+ position: relative !important;
+ }
+
+ .row {
+ display: flex !important;
+ margin-bottom: 0.8mm !important;
+ min-height: 6mm !important;
+ }
+
+ .dual-column {
+ display: flex !important;
+ justify-content: space-between !important;
+ }
+
+ .column {
+ flex: 1 !important;
+ display: flex !important;
+ align-items: center !important;
+ }
+
+ .column:first-child {
+ margin-right: 2mm !important;
+ }
+
+ .label {
+ font-weight: bold !important;
+ flex: 0 0 15mm !important;
+ white-space: nowrap !important;
+ font-size: 2.2mm !important;
+ }
+
+ .value {
+ flex: 1 !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+ border-bottom: 0.1mm dashed #666 !important;
+ padding-bottom: 0.2mm !important;
+ min-height: 2.5mm !important;
+ font-size: 2.2mm !important;
+ }
+
+ .code-value {
+ font-weight: bold !important;
+ }
+
+ .full-width {
+ white-space: normal !important;
+ word-break: break-all !important;
+ line-height: 1.2 !important;
+ }
+
+ /* 浜岀淮鐮佹牱寮� */
+ .qr-section {
+ width: 10mm !important;
+ height: 12mm !important;
+ font-siz:10px;
+ }
+
+ .qr-section canvas {
+ width: 10mm !important;
+ height: 10mm !important;
+ max-width: 100% !important;
+ max-height: 100% !important;
+ }
+ }
+
+ /* 灞忓箷棰勮鏍峰紡 */
+ @media screen {
+ body {
+ background: #f5f5f5;
+ padding: 10px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .print-page {
+ width: 80mm;
+ height: 60mm;
+ margin: 10px 0;
+ padding: 2mm;
+ background: white;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+ border: 1px dashed #ccc;
+ }
+
+ .material-card {
+ width: 80mm;
+ height: 60mm;
+ border: 0.3mm solid #000;
+ padding: 1.5mm;
+ background: white;
+ position: relative;
+ }
+
+ .qr-section {
+ position: absolute;
+ top: 4mm;
+ right: 2mm;
+ width: 12mm;
+ height: 12mm;
+ border: 0.2mm solid #ccc;
+ padding: 0.5mm;
+ background: white;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .qr-section canvas {
+ width: 10mm !important;
+ height: 10mm !important;
+ }
+ }
+ </style>
+ </head>
+ <body>
+ ${printContent}
+ <script>
+ window.onload = function() {
+ console.log('鎵撳嵃椤甸潰鍔犺浇瀹屾垚锛屽叡${this.printData.length}涓墿鏂欏崱');
+ // 绛夊緟浜岀淮鐮佹覆鏌撳畬鎴�
+ setTimeout(() => {
+ // 寮哄埗璁剧疆浜岀淮鐮乧anvas灏哄
+ const canvases = document.querySelectorAll('canvas');
+ canvases.forEach(canvas => {
+ canvas.style.width = '10mm !important';
+ canvas.style.height = '10mm !important';
+ });
+ window.print();
+ }, 800);
+ };
+
+ window.onafterprint = function() {
+ setTimeout(() => {
+ window.close();
+ }, 500);
+ };
+ <\/script>
+ </body>
+ </html>
+ `);
+
+ printWindow.document.close();
+
+ } catch (error) {
+ console.error('鎵撳嵃閿欒:', error);
+ this.$message.error('鎵撳嵃澶辫触: ' + error.message);
+ }
+ });
+ }
+ }
+};
+</script>
+
+<style scoped>
+#qrcode {
+ width: 60px;
+ height: 60px;
+ display: block;
+ margin: 0, 15px
+}
+
+.preview-container {
+ max-height: 500px;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+}
+
+.preview-header {
+ text-align: center;
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 10px;
+ padding: 8px;
+ background: #f0f0f0;
+ border-radius: 4px;
+}
+
+.preview-scroll {
+ max-height: 400px;
+ overflow-y: auto;
+ padding: 10px;
+ border: 1px solid #e0e0e0;
+ border-radius: 4px;
+ background: #f9f9f9;
+}
+
+.preview-card {
+ width: 320px;
+ height: 240px;
+ margin: 0 auto 15px auto;
+ padding: 8px;
+ border: 1px solid #ccc;
+ font-family: SimSun;
+ box-sizing: border-box;
+ border: 2px solid #000;
+ background: white;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+ position: relative;
+}
+
+.preview-card:last-child {
+ margin-bottom: 0;
+}
+
+.preview-card-header {
+ text-align: center;
+ font-size: 14px;
+ /* font-weight: bold;
+ margin-bottom: 8px;
+ padding-bottom: 4px;
+ border-bottom: 1px solid #000;
+ background: #f5f5f5;
+ padding: 4px; */
+ height: 60px;
+ width: 60px;
+}
+
+.preview-wrapper {
+ position: relative;
+ height: calc(100% - 40px);
+}
+
+.content-preview {
+ width: 100%;
+ height: 100%;
+}
+
+.row-preview {
+ /* margin-bottom: px; */
+ min-height: 32px;
+}
+
+.dual-column {
+ display: flex;
+ justify-content: space-between;
+}
+
+.column-preview {
+ flex: 1;
+ display: flex;
+ align-items: center;
+}
+
+.column-preview:first-child {
+ margin-right: 10px;
+}
+
+.label-preview {
+ font-weight: bold;
+ flex: 0 0 60px;
+ white-space: nowrap;
+ font-size: 12px;
+}
+
+.value-preview {
+ flex: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-size: 12px;
+ border-bottom: 1px dashed #666;
+ padding-bottom: 2px;
+}
+
+.code-value {
+ font-weight: bold;
+}
+
+.full-width {
+ display: block;
+ margin-top: 2px;
+ white-space: normal;
+ word-break: break-all;
+ line-height: 1.2;
+ font-size: 12px;
+}
+
+/* 棰勮鍖哄煙浜岀淮鐮佹牱寮� */
+.qr-section-preview {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ width: 150px;
+ height: 175px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid #ddd;
+ background: white;
+ padding: 2px;
+}
+
+.qr-section-preview canvas {
+ width: 56px !important;
+ height: 56px !important;
+}
+
+.footer-actions {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+}
+
+.print-count {
+ font-size: 14px;
+ color: #409EFF;
+ font-weight: bold;
+}
+</style>
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
index 854c4d1..5ee8694 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/router/viewGird.js"
@@ -191,7 +191,16 @@
path: '/materielToMes',
name: 'Dt_MaterielToMes',
component: () => import('@/views/inbound/Dt_MaterielToMes.vue')
- },
+ }, {
+ path:'/allocateinboundOrder',
+ name: 'allocateinboundOrder',
+ component: () => import('@/views/inbound/allocateinboundOrder.vue')
+
+ },{
+ path:'allocateoutboundOrder',
+ name: 'allocateoutboundOrder',
+ component: () => import('@/views/outbound/allocateoutboundOrder.vue')
+ },
{
path: '/allocateOrder',
name: 'Dt_AllocateOrder',
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue"
new file mode 100644
index 0000000..8fbef36
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue"
@@ -0,0 +1,397 @@
+
+<template>
+ <view-grid
+ ref="grid"
+ @openPalletDialog="handleOpenPalletDialog"
+ :columns="columns"
+ :detail="detail"
+ :editFormFields="editFormFields"
+ :editFormOptions="editFormOptions"
+ :searchFormFields="searchFormFields"
+ :searchFormOptions="searchFormOptions"
+ :table="table"
+ :extend="extend"
+ >
+ </view-grid>
+ <!-- 2. 缁勭洏寮圭獥锛氱‘淇漰rops鍜屼簨浠剁粦瀹氭纭� -->
+ <PalletDialog
+ v-model:visible="palletVisible"
+ :docNo="currentPalletDocNo"
+ @back-success="handlePalletBackSuccess"
+ ></PalletDialog>
+
+</template>
+ <script>
+import extend from "@/extension/inbound/allocateinboundOrder.js";
+import ViewGrid from '@/components/basic/ViewGrid/ViewGrid.vue';
+import { ref, defineComponent } from "vue";
+import PalletDialog from "@/extension/inbound/extend/Pallet.vue";
+export default defineComponent({
+ components: {
+ // 鍏抽敭淇2锛氱粍浠舵敞鍐屽悕涓庢ā鏉挎爣绛惧悕閫傞厤锛坘ebab-case瀵瑰簲view-grid锛�
+ viewGrid: ViewGrid, // 娉ㄥ唽涓簁ebab-case锛屾ā鏉跨敤<view-grid>
+ PalletDialog // 娉ㄥ唽缁勭洏寮圭獥
+
+ },
+ setup() {
+ const table = ref({
+ key: "id",
+ footer: "Foots",
+ cnName: "璋冩嫧鍗�(鏅轰粨璋冨閮ㄤ粨搴�)",
+ name: "inboundOrder",
+ url: "/InboundOrder/",
+ sortName: "id",
+ });
+ const editFormFields = ref({
+ orderType: "",
+ inboundOrderNo: "",
+ upperOrderNo: "",
+ remark: "",
+ });
+ const editFormOptions = ref([
+ [
+ {
+ title: "鍗曟嵁绫诲瀷",
+ required: true,
+ field: "orderType",
+ type: "select",
+ dataKey: "inOrderType",
+ data: [],
+ },
+ {
+ field: "inboundOrderNo",
+ title: "鍗曟嵁缂栧彿",
+ type: "string",
+ },
+ {
+ title: "涓婃父鍗曟嵁缂栧彿",
+ field: "upperOrderNo",
+ type: "string",
+ },
+ {
+ title: "澶囨敞",
+ field: "remark",
+ type: "textarea",
+ },
+ ],
+ ]);
+ const searchFormFields = ref({
+ inboundOrderNo: "",
+ upperOrderNo: "",
+ orderType: "115",
+ orderStatus: "",
+ createType: "",
+ creater: "",
+ createDate: "",
+ });
+ const searchFormOptions = ref([
+ [
+ { title: "鍗曟嵁缂栧彿", field: "inboundOrderNo", type: "like" },
+ { title: "涓婃父鍗曟嵁缂栧彿", field: "upperOrderNo", type: "like" },
+ {
+ title: "鍗曟嵁绫诲瀷",
+ field: "orderType",
+ type: "select",
+ dataKey: "inOrderType",
+ data: [],
+ },
+ {
+ title: "鍗曟嵁鐘舵��",
+ field: "orderStatus",
+ type: "select",
+ dataKey: "inboundState",
+ data: [],
+ },
+ ],
+ [
+ {
+ title: "鍒涘缓鏂瑰紡",
+ field: "createType",
+ type: "select",
+ dataKey: "createType",
+ data: [],
+ },
+ { title: "鍒涘缓鑰�", field: "creater", type: "like" },
+ { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+ ],
+ ]);
+ const columns = ref([
+ {
+ field: "id",
+ title: "Id",
+ type: "int",
+ width: 90,
+ hidden: true,
+ readonly: true,
+ require: true,
+ align: "left",
+ },
+ {
+ field: "inboundOrderNo",
+ title: "鍗曟嵁缂栧彿",
+ type: "string",
+ width: 120,
+ align: "left",
+ link: true,
+ },
+ {
+ field: "upperOrderNo",
+ title: "涓婃父鍗曟嵁缂栧彿",
+ type: "string",
+ width: 150,
+ align: "left",
+ },
+ {
+ field: "orderType",
+ title: "鍗曟嵁绫诲瀷",
+ type: "string",
+ width: 150,
+ align: "left",
+ bind: { key: "inOrderType", data: [] },
+ },
+ {
+ field: "businessType",
+ title: "涓氬姟绫诲瀷",
+ type: "string",
+ width: 150,
+ align: "left",
+ bind: { key: "businessType", data: [] },
+ },
+ {
+ field: "orderStatus",
+ title: "鍗曟嵁鐘舵��",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ bind: { key: "inboundState", data: [] },
+ },
+ {
+ field: "createType",
+ title: "鍒涘缓鏂瑰紡",
+ type: "string",
+ width: 120,
+ align: "left",
+ bind: { key: "createType", data: [] },
+ },
+ {
+ field: "factoryArea",
+ title: "鍘傚尯",
+ type: "string",
+ width: 120,
+ align: "left"
+ },
+ {
+ field: "creater",
+ title: "鍒涘缓浜�",
+ type: "string",
+ width: 90,
+ align: "left",
+ },
+ {
+ field: "createDate",
+ title: "鍒涘缓鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "modifier",
+ title: "淇敼浜�",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ {
+ field: "modifyDate",
+ title: "淇敼鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "remark",
+ title: "澶囨敞",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ ]);
+ const detail = ref({
+ cnName: "璋冩嫧鍗曟槑缁�",
+ table: "InboundOrderDetail",
+ columns: [
+ {
+ field: "id",
+ title: "Id",
+ type: "int",
+ width: 90,
+ hidden: true,
+ readonly: true,
+ require: true,
+ align: "left",
+ },
+ {
+ field: "orderId",
+ title: "璋冩嫧鍗曚富閿�",
+ type: "string",
+ width: 90,
+ align: "left",
+ hidden: true,
+ },
+ {
+ field: "materielCode",
+ title: "鐗╂枡缂栧彿",
+ type: "select",
+ width: 150,
+ align: "left",
+ edit: { type: "" },
+ required: true,
+ },
+ {
+ field: "materielCode",
+ title: "鐗╂枡鍚嶇О",
+ type: "string",
+ width: 100,
+ align: "left",
+ bind: { key: "MaterielNames", data: [] },
+ },
+ {
+ field: "batchNo",
+ title: "鎵规鍙�",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ edit: { type: "" },
+ required: true,
+ },
+ {
+ field: "supplyCode",
+ title: "渚涘簲鍟嗙紪鍙�",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ edit: { type: "" },
+ required: true,
+ },
+ {
+ field: "warehouseCode",
+ title: "浠撳簱鍙�",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ required: true
+ },
+ {
+ field: "barcode",
+ title: "鏉$爜",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ edit: { type: "" },
+ required: true,
+ },
+ {
+ field: "orderQuantity",
+ title: "鍗曟嵁鏁伴噺",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ edit: { type: "number" },
+ required: true,
+ },
+ {
+ field: "receiptQuantity",
+ title: "缁勭洏鏁伴噺",
+ type: "int",
+ width: 120,
+ align: "left",
+ },
+ {
+ field: "overInQuantity",
+ title: "涓婃灦鏁伴噺",
+ type: "string",
+ width: 200,
+ align: "left",
+ },
+ {
+ field: "orderDetailStatus",
+ title: "璁㈠崟鏄庣粏鐘舵��",
+ type: "string",
+ width: 180,
+ align: "left",
+ bind: { key: "orderDetailStatusEnum", data: [] },
+ },
+ {
+ field: "creater",
+ title: "鍒涘缓浜�",
+ type: "string",
+ width: 90,
+ align: "left",
+ },
+ {
+ field: "createDate",
+ title: "鍒涘缓鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "modifier",
+ title: "淇敼浜�",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ {
+ field: "modifyDate",
+ title: "淇敼鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "remark",
+ title: "澶囨敞",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ ],
+ sortName: "id",
+ key: "id",
+ });
+ // 6. 缁勭洏寮圭獥鑱斿姩锛堟墍鏈夊彉閲忓繀椤昏繑鍥烇級
+ const palletVisible = ref(false);
+ const currentPalletDocNo = ref("");
+
+ const handleOpenPalletDialog = (docNo) => {
+ console.log('涓荤粍浠舵敹鍒扮粍鐩樹簨浠讹紝鍗曟嵁鍙凤細', docNo);
+ currentPalletDocNo.value = docNo;
+ palletVisible.value = true;
+ };
+
+ const handlePalletBackSuccess = () => {
+ console.log('缁勭洏鍥炰紶鎴愬姛锛屽埛鏂拌〃鏍�');
+ grid.value?.refresh(); // 姝ゆ椂gridRef宸叉寕杞斤紝鍙皟鐢ㄦ柟娉�
+ };
+
+ return {
+ table,
+ extend,
+ editFormFields,
+ editFormOptions,
+ searchFormFields,
+ searchFormOptions,
+ columns,
+ detail,
+ // 缁勭洏寮圭獥鐩稿叧
+ PalletDialog, // 寮圭獥缁勪欢锛堟棤闇�杩斿洖锛屾敞鍐屽嵆鍙紝浣嗗彉閲忛渶杩斿洖锛�
+ palletVisible,
+ currentPalletDocNo,
+ handleOpenPalletDialog,
+ handlePalletBackSuccess
+ };
+ },
+});
+</script>
+
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
index 8dfd2f1..e4defc7 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue"
@@ -78,7 +78,7 @@
const searchFormFields = ref({
inboundOrderNo: "",
upperOrderNo: "",
- orderType: "",
+ orderType: "0",
orderStatus: "",
createType: "",
creater: "",
@@ -93,7 +93,7 @@
field: "orderType",
type: "select",
dataKey: "inOrderType",
- data: [],
+ data: [0],
},
{
title: "鍗曟嵁鐘舵��",
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue"
index 6170a18..96cbf3e 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/PickingConfirm.vue"
@@ -26,8 +26,8 @@
@keyup.enter.native="onBarcodeScan">
</el-input>
<el-button type="success" @click="confirmPicking">纭鎷i��</el-button>
- <el-button type="warning" @click="openSplitDialog">鎷嗗寘</el-button>
- <el-button type="info" @click="openRevertSplitDialog">鎾ら攢鎷嗗寘</el-button>
+ <!-- <el-button type="warning" @click="openSplitDialog">鎷嗗寘</el-button>
+ <el-button type="info" @click="openRevertSplitDialog">鎾ら攢鎷嗗寘</el-button> -->
<el-button type="primary" @click="openBatchReturnDialog">鍥炲簱</el-button>
<!-- <el-button type="danger" @click="handleDirectOutbound">鐩存帴鍑哄簱</el-button> -->
@@ -291,6 +291,7 @@
</div>
</div>
</div>
+ <print-view ref="childs" @parentcall="parentcall"></print-view>
</template>
<script>
@@ -298,12 +299,11 @@
import { ref, defineComponent } from "vue";
import { ElMessage } from 'element-plus'
import { useRoute } from 'vue-router'
+import printView from "@/extension/outbound/extend/printView.vue"
export default defineComponent({
name: 'PickingConfirm',
- components: {
-
- },
+ components: {printView},
props: {
orderNo: {
type: String,
@@ -844,7 +844,12 @@
this.$message.success('鎷i�夌‘璁ゆ垚鍔�');
this.scanData.barcode = ''; // 娓呯┖鐗╂枡鏉$爜
this.loadData();
-
+ console.log(res.data.splitResults)
+ if(res.data && res.data.splitResults.length>0){
+ // 璋冪敤瀛愮粍浠舵墦鍗版柟娉�
+ this.$refs.childs.open(res.data.splitResults);
+ //this.$refs.childs.printSplitLabel(res.data.splitResults);
+ }
// 鎴愬姛鍚庣户缁仛鐒﹀埌鐗╂枡鏉$爜杈撳叆妗嗭紝鍑嗗涓嬩竴涓壂鐮�
this.$nextTick(() => {
this.$refs.barcodeInput.focus();
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue"
new file mode 100644
index 0000000..46ae5a5
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue"
@@ -0,0 +1,443 @@
+
+<template>
+ <view-grid
+ ref="grid"
+ @openOutboundDialog="handleOpenOutboundDialog"
+ :columns="columns"
+ :detail="detail"
+ :editFormFields="editFormFields"
+ :editFormOptions="editFormOptions"
+ :searchFormFields="searchFormFields"
+ :searchFormOptions="searchFormOptions"
+ :table="table"
+ :extend="extend"
+ >
+ </view-grid>
+ <!-- 鍑哄簱鎿嶄綔寮圭獥 -->
+ <OutboundDialog
+ v-model:visible="outboundVisible"
+ :selected-document="selectedOutboundDocument"
+ @outbound-success="handleOutboundSuccess"
+ ></OutboundDialog>
+</template>
+ <script>
+import extend from "@/extension/outbound/allocateoutboundOrder.js";
+import ViewGrid from '@/components/basic/ViewGrid/ViewGrid.vue';
+import { ref, defineComponent } from "vue";
+import { ElMessage } from "element-plus";
+import OutboundDialog from "@/extension/outbound/extend/OutBound.vue"; // 寮曞叆鍑哄簱寮圭獥缁勪欢
+
+
+export default defineComponent({
+ components: {
+ // 鍏抽敭淇2锛氱粍浠舵敞鍐屽悕涓庢ā鏉挎爣绛惧悕閫傞厤锛坘ebab-case瀵瑰簲view-grid锛�
+ viewGrid: ViewGrid, // 娉ㄥ唽涓簁ebab-case锛屾ā鏉跨敤<view-grid>
+ OutboundDialog // 娉ㄥ唽鍑哄簱寮圭獥缁勪欢
+ },
+ setup() {
+ const table = ref({
+ key: "id",
+ footer: "Foots",
+ cnName: "璋冩嫧鍗�(澶栭儴浠撳簱璋冩櫤浠�)",
+ name: "outboundOrder",
+ url: "/OutboundOrder/",
+ sortName: "id",
+ });
+ const editFormFields = ref({
+ orderType: "",
+ orderNo:"",
+ upperOrderNo: "",
+ orderStatus: "",
+ remark: "",
+ warehouseId:""
+ });
+ const editFormOptions = ref([
+ [
+ {
+ title: "鍗曟嵁绫诲瀷",
+ required: true,
+ field: "orderType",
+ type: "select",
+ dataKey: "outOrderType",
+ data: [],
+ },
+ {
+ field: "orderNo",
+ title: "鍗曟嵁缂栧彿",
+ type: "string",
+ readonly:true
+ },
+ {
+ title: "涓婃父鍗曟嵁缂栧彿",
+ field: "upperOrderNo",
+ type: "string",
+ },
+ {
+ title: "鍗曟嵁鐘舵��",
+ field: "orderStatus",
+ type: "select",
+ dataKey: "inboundState",
+ data: [],
+ readonly: true,
+ },
+ {
+ title: "浠撳簱",
+ field: "warehouseId",
+ type: "select",
+ dataKey: "warehouses",
+ data: [],
+ required: true,
+ },
+ {
+ title: "澶囨敞",
+ field: "remark",
+ type: "textarea",
+ },
+ ],
+ ]);
+ const searchFormFields = ref({
+ orderNo: "",
+ upperOrderNo: "",
+ orderType: "215",
+ orderStatus: "",
+ createType: "",
+ creater: "",
+ createDate: "",
+ });
+ const searchFormOptions = ref([
+ [
+ { title: "鍗曟嵁缂栧彿", field: "orderNo", type: "like" },
+ { title: "涓婃父鍗曟嵁缂栧彿", field: "upperOrderNo", type: "like" },
+ {
+ title: "鍗曟嵁绫诲瀷",
+ field: "orderType",
+ type: "select",
+ dataKey: "outOrderType",
+ data: [],
+ },
+ {
+ title: "鍗曟嵁鐘舵��",
+ field: "orderStatus",
+ type: "select",
+ dataKey: "outboundStatusEnum",
+ data: [],
+ },
+ ],
+ [
+ {
+ title: "鍒涘缓鏂瑰紡",
+ field: "createType",
+ type: "select",
+ dataKey: "createType",
+ data: [],
+ },
+ { title: "鍒涘缓鑰�", field: "creater", type: "like" },
+ { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+ ],
+ ]);
+ const columns = ref([
+ {
+ field: "id",
+ title: "Id",
+ type: "int",
+ width: 90,
+ hidden: true,
+ readonly: true,
+ require: true,
+ align: "left",
+ },
+ {
+ field: "orderNo",
+ title: "鍗曟嵁缂栧彿",
+ type: "string",
+ width: 160,
+ align: "left",
+ // link: true,
+ },
+ {
+ field: "upperOrderNo",
+ title: "涓婃父鍗曟嵁缂栧彿",
+ type: "string",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "orderType",
+ title: "鍗曟嵁绫诲瀷",
+ type: "string",
+ width: 150,
+ align: "left",
+ bind: { key: "outOrderType", data: [] },
+ },
+ {
+ field: "businessType",
+ title: "涓氬姟绫诲瀷",
+ type: "string",
+ width: 150,
+ align: "left",
+ bind: { key: "businessType", data: [] },
+ },
+ {
+ field: "orderStatus",
+ title: "鍗曟嵁鐘舵��",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ bind: { key: "outboundStatusEnum", data: [] },
+ },
+ {
+ field: "createType",
+ title: "鍒涘缓鏂瑰紡",
+ type: "string",
+ width: 120,
+ align: "left",
+ bind: { key: "createType", data: [] },
+ },
+ {
+ field: "factoryArea",
+ title: "鍘傚尯",
+ type: "string",
+ width: 120,
+ align: "left"
+ },
+ {
+ field: "departmentCode",
+ title: "淇敼鏃堕棿",
+ type: "string",
+ width: 120,
+ align: "left",
+ hidden:true
+ },
+ {
+ field: "departmentName",
+ title: "閮ㄩ棬鍚嶇О",
+ type: "string",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "creater",
+ title: "鍒涘缓浜�",
+ type: "string",
+ width: 90,
+ align: "left",
+ },
+ {
+ field: "createDate",
+ title: "鍒涘缓鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "modifier",
+ title: "淇敼浜�",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ {
+ field: "modifyDate",
+ title: "淇敼鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "remark",
+ title: "澶囨敞",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ ]);
+ const detail = ref({
+ cnName: "璋冩嫧鏄庣粏鍗�",
+ table: "OnboundOrderDetail",
+ columns: [
+ {
+ field: "id",
+ title: "Id",
+ type: "int",
+ width: 90,
+ hidden: true,
+ readonly: true,
+ require: true,
+ align: "left",
+ },
+ {
+ field: "orderId",
+ title: "璋冩嫧鍗曚富閿�",
+ type: "string",
+ width: 90,
+ align: "left",
+ hidden: true,
+ },
+ {
+ field: "materielCode",
+ title: "鐗╂枡缂栧彿",
+ type: "string",
+ width: 150,
+ align: "left",
+ edit: { type: "string" },
+ required: true,
+ },
+ {
+ field: "materielName",
+ title: "鐗╂枡鍚嶇О",
+ type: "string",
+ width: 150,
+ align: "left",
+ edit: { type: "string" },
+ },
+ {
+ field: "batchNo",
+ title: "鎵规鍙�",
+ type: "decimal",
+ width: 90,
+ align: "left",
+ edit: { type: "string" },
+ required: true,
+ },
+ {
+ field: "supplyCode",
+ title: "渚涘簲鍟嗙紪鍙�",
+ type: "string",
+ width: 90,
+ align: "left",
+ edit: { type: "string" },
+ required: true,
+ },
+ {
+ field: "orderQuantity",
+ title: "鍗曟嵁鏁伴噺",
+ type: "string",
+ width: 90,
+ align: "left",
+ edit: { type: "number" },
+ required: true,
+ },
+ {
+ field: "rowNo",
+ title: "琛屽彿",
+ type: "string",
+ width: 90,
+ align: "left",
+ edit: { type: "number" },
+ required: true,
+ },
+ {
+ field: "lockQuantity",
+ title: "閿佸畾鏁伴噺",
+ type: "int",
+ width: 120,
+ align: "left",
+ },
+ {
+ field: "overOutQuantity",
+ title: "宸插嚭鏁伴噺",
+ type: "string",
+ width: 200,
+ align: "left",
+ },
+ {
+ field: "orderDetailStatus",
+ title: "璁㈠崟鏄庣粏鐘舵��",
+ type: "string",
+ width: 180,
+ align: "left",
+ bind: { key: "orderDetailStatusEnum", data: [] },
+ },
+ {
+ field: "creater",
+ title: "鍒涘缓浜�",
+ type: "string",
+ width: 90,
+ align: "left",
+ },
+ {
+ field: "createDate",
+ title: "鍒涘缓鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "modifier",
+ title: "淇敼浜�",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ {
+ field: "modifyDate",
+ title: "淇敼鏃堕棿",
+ type: "datetime",
+ width: 160,
+ align: "left",
+ },
+ {
+ field: "remark",
+ title: "澶囨敞",
+ type: "string",
+ width: 100,
+ align: "left",
+ },
+ ],
+ sortName: "id",
+ key: "id",
+ });
+ // 璋冩嫧寮圭獥鐩稿叧
+ const outboundVisible = ref(false);
+ const selectedOutboundDocument = ref({}); // 瀛樺偍閫変腑鐨勮皟鎷ㄥ崟鏁版嵁
+
+ // 鎵撳紑璋冩嫧寮圭獥锛堜粠鎵╁睍閰嶇疆鐨勬寜閽簨浠惰Е鍙戯級
+ const handleOpenOutboundDialog = (docData) => {
+ selectedOutboundDocument.value = docData; // 淇濆瓨閫変腑鐨勫崟鎹暟鎹�
+ outboundVisible.value = true; // 鏄剧ず寮圭獥
+ };
+
+ // 璋冩嫧鎴愬姛鍚庣殑鍥炶皟
+ const handleOutboundSuccess = (docNo) => {
+ ElMessage.success(`鍗曟嵁 ${docNo} 璋冩嫧鎴愬姛`);
+ gridRef.value?.refresh(); // 鍒锋柊琛ㄦ牸鏁版嵁
+ };
+
+ // 鍒濆鍖栨墿灞曢厤缃細涓鸿皟鎷ㄦ寜閽坊鍔犱簨浠惰Е鍙戦�昏緫
+ const initExtension = () => {
+ // 鎵惧埌"璋冩嫧"鎸夐挳骞剁粦瀹氭墦寮�寮圭獥鐨勯�昏緫
+ const outboundBtn = extend.buttons.view.find(btn => btn.name === '鍑哄簱');
+ if (outboundBtn) {
+ const originalOnClick = outboundBtn.onClick;
+ outboundBtn.onClick = function() {
+ // 鍏堟墽琛屽師鏈夋牎楠岄�昏緫
+ const selectedRows = this.$refs.table.getSelected();
+ if (selectedRows.length === 1) {
+ // 鏍¢獙閫氳繃鍚庯紝瑙﹀彂涓荤粍浠剁殑鍑哄簱寮圭獥浜嬩欢
+ this.$emit('openOutboundDialog', selectedRows[0]);
+ } else {
+ // 鍘熸湁閫昏緫宸插鐞嗘彁绀猴紝鏃犻渶閲嶅
+ originalOnClick.call(this);
+ }
+ };
+ }
+ };
+ return {
+ table,
+ extend,
+ editFormFields,
+ editFormOptions,
+ searchFormFields,
+ searchFormOptions,
+ columns,
+ detail,
+ // 鍑哄簱鐩稿叧
+ outboundVisible,
+ selectedOutboundDocument,
+ handleOpenOutboundDialog,
+ handleOutboundSuccess
+ };
+ },
+});
+</script>
+
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm"
index 184b599..281e03c 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/CodeChunks.db-shm"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm"
index 890e021..5c3038d 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.878.3237/SemanticSymbols.db-shm"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs"
index 328c761..9d98d85 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs"
@@ -12,6 +12,7 @@
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
+using WIDESEA_DTO.Allocate;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
@@ -41,6 +42,12 @@
_inboundOrderRepository = inboundOrderRepository;
}
+ /// <summary>
+ /// 鍏ュ簱鍙嶉
+ /// </summary>
+ /// <param name="model"></param>
+ /// <returns></returns>
+ /// <exception cref="HttpRequestException"></exception>
public async Task<ResponseModel> FeedbackInbound(FeedbackInboundRequestModel model)
{
string json =JsonConvert.SerializeObject(model, new JsonSerializerSettings
@@ -63,7 +70,13 @@
return JsonConvert.DeserializeObject<ResponseModel>(body);
}
-
+
+ /// <summary>
+ /// 鍑哄簱鍙嶉
+ /// </summary>
+ /// <param name="model"></param>
+ /// <returns></returns>
+ /// <exception cref="HttpRequestException"></exception>
public async Task<ResponseModel> FeedbackOutbound(FeedbackOutboundRequestModel model)
{
string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
@@ -86,6 +99,29 @@
throw new HttpRequestException(body);
}
+
+ return JsonConvert.DeserializeObject<ResponseModel>(body);
+ }
+
+ public async Task<ResponseModel> FeedbackAllocate(AllocateDto model)
+ {
+ string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
+ {
+ ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
+ });
+ var content = new StringContent(json, Encoding.UTF8, "application/json");
+ var _client = _httpClientFactory.CreateClient("MESUrl");
+ _client.DefaultRequestHeaders.Clear();
+ _client.DefaultRequestHeaders.Add("Accept", "application/json");
+ _logger.LogInformation("InvokeMESService FeedbackAllocate : " + json);
+ var response = await _client.PostAsync("AldAllocationOperation/AllocationOperation", content);
+ string body = await response.Content.ReadAsStringAsync();
+ _logger.LogInformation("InvokeMESService FeedbackAllocate body: " + body);
+ if (!response.IsSuccessStatusCode)
+ {
+
+ throw new HttpRequestException(body);
+ }
return JsonConvert.DeserializeObject<ResponseModel>(body);
}
@@ -116,10 +152,11 @@
var content = new StringContent(json, Encoding.UTF8, "application/json");
- _logger.LogInformation("InvokeMESService FeedbackInbound : " + json);
+ _logger.LogInformation("InvokeMESService NewMaterielToMes : " + json);
using var response = await client.PostAsync("AldBarcodeInformation/BarcodeInformation", content);
var responseText = await response.Content.ReadAsStringAsync();
+ _logger.LogInformation("InvokeMESService NewMaterielToMes body: " + responseText);
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(responseText);
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs"
index 82bbeeb..48640ac 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs"
@@ -140,7 +140,7 @@
List<string> lockLocationCodes = locationCaches.Select(x => x.LocationCode).ToList();
- Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
+ Dictionary<string, SqlSugar.OrderByType> orderBy = new Dictionary<string, OrderByType>()
{
{ nameof(Dt_LocationInfo.RoadwayNo),OrderByType.Asc },
{ nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
@@ -153,7 +153,11 @@
if (first != null)
{
locationCaches.Add(new LocationCache { LocationCode = first?.LocationCode, DateTime = DateTime.Now });
- }
+ Db.Updateable<Dt_LocationInfo>().SetColumns(x => new Dt_LocationInfo
+ {
+ LocationStatus = (int)LocationStatusEnum.InStockLock,
+ }).Where(x => x.Id == first.Id).ExecuteCommand();
+ }
return first;
}
@@ -182,8 +186,10 @@
};
var first = BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode), orderBy);//鏌ヨ绌鸿揣浣嶄俊鎭苟鎺掗櫎5鍒嗛挓鍐呭垎閰嶇殑璐т綅,鏍规嵁灞傘�佸垪銆佹繁搴︺�佽鎺掑簭
-
- locationCaches.Add(new LocationCache { LocationCode = first.LocationCode, DateTime = DateTime.Now });
+ if (first != null)
+ {
+ locationCaches.Add(new LocationCache { LocationCode = first.LocationCode, DateTime = DateTime.Now });
+ }
return first;
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielToMesService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielToMesService.cs"
index 9aa41ab..ea0a8d1 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielToMesService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MaterielToMesService.cs"
@@ -1,4 +1,6 @@
-锘縰sing Newtonsoft.Json;
+锘縰sing Dm.filter;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
@@ -9,6 +11,7 @@
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
+using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Outbound;
using WIDESEA_IBasicService;
using WIDESEA_Model.Models;
@@ -19,10 +22,11 @@
internal class MaterielToMesService : ServiceBase<Dt_MaterielToMes, IRepository<Dt_MaterielToMes>>, IMaterielToMesService
{
private readonly IInvokeMESService _invokeMESService;
-
- public MaterielToMesService(IRepository<Dt_MaterielToMes> BaseDal, IInvokeMESService invokeMESService) : base(BaseDal)
+ private readonly ILogger<MaterielToMesService> _logger;
+ public MaterielToMesService(IRepository<Dt_MaterielToMes> BaseDal, IInvokeMESService invokeMESService, ILogger<MaterielToMesService> logger) : base(BaseDal)
{
_invokeMESService = invokeMESService;
+ _logger = logger;
}
// 鍒涘缓涓�涓娇鐢ㄥ皬椹煎嘲鍛藉悕娉曠殑搴忓垪鍖栬缃�
JsonSerializerSettings settings = new JsonSerializerSettings
@@ -31,29 +35,50 @@
};
public IRepository<Dt_MaterielToMes> Repository => BaseDal;
- public override WebResponseContent AddData(Dt_MaterielToMes saveModel)
+ public async Task<WebResponseContent> AddMaterielToMes(Dt_MaterielToMes saveModel,int operationtype)
{
-
- WebResponseContent content = base.AddData(saveModel);
- if (content.Status)
+ try
{
-
+ base.AddData(saveModel);
- string request = JsonConvert.SerializeObject(saveModel, settings);
-
+ MaterielToMesDTO dto = new MaterielToMesDTO
+ {
+ batchNo = saveModel.BatchNo,
+ factoryArea = saveModel.factoryArea,
+ materialCode = saveModel.MaterielCode,
+ newmaterialCode = saveModel.NewMaterialBarCode,
+ oldmaterialCode = saveModel.OldMaterialBarCode,
+ operationType = 1,
+ qty = saveModel.Qty,
+ supplyCode = saveModel.supplyCode,
+ unit = saveModel.Unit,
+ warehouseCode = saveModel.warehouseCode,
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
+ };
+
+ var result = await _invokeMESService.NewMaterielToMes(dto);
+
+ if (result != null && result.code == 200)
+ {
+ await Db.Updateable<Dt_MaterielToMes>()
+ .SetColumns(it => it.ReturnToMESStatus ==1)
+ .Where(it => it.Id == saveModel.Id)
+ .ExecuteCommandAsync();
+ }
return WebResponseContent.Instance.OK();
}
- else
+ catch (Exception ex)
{
- return content;
+ _logger.LogError("MaterielToMesService add Dt_MaterielToMes: " + ex.Message);
+ return WebResponseContent.Instance.Error(ex.Message);
}
-
}
-
+
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs"
index eca1209..2cc1115 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/OutLockStockStatusEnum.cs"
@@ -21,7 +21,7 @@
宸叉媶鍖� = 1,
宸叉挙閿� = 2,
宸叉嫞閫� = 3,
- 宸插洖搴� = 4
+ 宸插洖搴� = 4,
}
public enum OutLockStockStatusEnum
{
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs"
index 5321f46..d10b600 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/StockStatusEmun.cs"
@@ -58,7 +58,7 @@
[Description("鍏ュ簱纭")]
鍏ュ簱纭 = 3,
-
+
[Description("鍏ュ簱瀹屾垚")]
鍏ュ簱瀹屾垚 = 6,
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs"
index d81c4d1..e823023 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Allocate/AllocateDto.cs"
@@ -25,7 +25,7 @@
/// 璇锋眰鏃堕棿
/// </summary>
[JsonProperty("reqTime")]
- public DateTime ReqTime { get; set; }
+ public string ReqTime { get; set; }
/// <summary>
/// 璁㈠崟缂栧彿
@@ -39,6 +39,10 @@
[JsonProperty("business_type")]
public string BusinessType { get; set; }
+ public string fromWarehouse { get; set; }
+
+ public string toWarehouse { get; set; }
+
/// <summary>
/// 鏄惁鍒嗘壒
/// </summary>
@@ -51,6 +55,9 @@
[JsonProperty("factoryArea")]
public string FactoryArea { get; set; }
+ [JsonProperty("operator")]
+ public string Operator { get; set; }
+
/// <summary>
/// 鎿嶄綔绫诲瀷
/// </summary>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs"
index b39c856..8381ea6 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_DTO/Outbound/OutboundOrderGetDTO.cs"
@@ -52,7 +52,7 @@
public class SummaryPickingDto
{
- public string PalletCode { get; set; }
+ public string PalletCode { get; set; }
public string MaterielCode { get; set; }
public int UnpickedCount { get; set; }
public decimal UnpickedQuantity { get; set; }
@@ -180,7 +180,7 @@
public string OrderNo { get; set; } = string.Empty; // 鍑哄簱鍗曞彿
}
-
+
public class PickingConfirmReq
{
@@ -189,7 +189,7 @@
public string MaterielBarcode { get; set; } = string.Empty; // 鐗╂枡鏉$爜
}
-
+
public class SplitPackageReq
{
@@ -198,7 +198,7 @@
public decimal SplitQty { get; set; } // 鏂版潯鐮佸垎閰嶆暟閲�
}
-
+
public class StockReturnReq
{
@@ -206,14 +206,14 @@
public string TaskNum { get; set; } = string.Empty; // 浠诲姟鍙凤紙鍙�夛級
}
-
+
public class OutStockLockDetailReq
{
public long OutStockLockId { get; set; } // 鍑哄簱璇︽儏ID
}
-
+
public class MaterielBarcodeValidateResp
{
@@ -222,7 +222,7 @@
public decimal PackageQty { get; set; } // 鏁村寘鏁伴噺锛堝垎閰嶆暟閲忥級
public string Message { get; set; } = string.Empty;
}
-
+
public class OutStockLockDetailResp
{
@@ -230,7 +230,7 @@
public decimal AssignQuantity { get; set; }
}
-
+
public class OutStockLockListResp
{
@@ -244,7 +244,7 @@
public bool IsSplitted { get; set; }
}
-
+
public class PickedRecordListResp
{
@@ -278,9 +278,21 @@
// 鎷嗗寘缁撴灉绫�
public class SplitResult
{
- public string OriginalBarcode { get; set; }
- public string NewBarcode { get; set; }
- public decimal SplitQuantity { get; set; }
- public decimal RemainQuantity { get; set; }
+ public string materialCode { get; set; }
+ public string supplierCode { get; set; }
+
+ public string quantityTotal { get; set; }
+
+ public string batchNumber { get; set; }
+
+ public string batch { get; set; }
+ public string factory { get; set; }
+
+ public string date { get; set; }
+
+ // public string OriginalBarcode { get; set; }
+ // public string NewBarcode { get; set; }
+ //public decimal SplitQuantity { get; set; }
+ //public decimal RemainQuantity { get; set; }
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs"
index ddbb348..e52066e 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IInvokeMESService.cs"
@@ -4,6 +4,7 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
+using WIDESEA_DTO.Allocate;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
@@ -16,6 +17,7 @@
Task<ResponseModel> FeedbackOutbound(FeedbackOutboundRequestModel model);
+ Task<ResponseModel> FeedbackAllocate(AllocateDto model);
Task<string> GetToken(String username, string password);
Task<ResponseModel> NewMaterielToMes(MaterielToMesDTO model);
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterielToMesService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterielToMesService.cs"
index d5aff9e..bc1e9f4 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterielToMesService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IBasicService/IMaterielToMesService.cs"
@@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Model.Models;
@@ -13,5 +14,7 @@
public interface IMaterielToMesService : IService<Dt_MaterielToMes>
{
IRepository<Dt_MaterielToMes> Repository { get; }
+
+ Task<WebResponseContent> AddMaterielToMes(Dt_MaterielToMes saveModel, int operationtype);
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
index 2aa1ffd..a97e67f 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutStockLockInfoService.cs"
@@ -27,6 +27,8 @@
Task<LockInfoDetailDto> GetLockInfoDetail(int lockInfoId);
Dt_OutStockLockInfo GetOutStockLockInfo(Dt_OutboundOrder outboundOrder,Dt_OutboundOrderDetail outboundOrderDetail,Dt_StockInfo outStock, decimal assignQuantity, string barcode = null);
+
+ List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, List<Dt_StockInfo> outStocks, int? taskNum = null);
Task<List<Dt_OutStockLockInfo>> GetPalletLockInfos(string palletCode);
Task<WebResponseContent> UpdateLockInfoBarcode(int lockInfoId, string newBarcode);
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs"
index 6ff92b0..3525497 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundOrderDetailService.cs"
@@ -21,7 +21,7 @@
public (List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(List<Dt_OutboundOrderDetail> outboundOrderDetails);
WebResponseContent LockOutboundStockDataUpdate(List<Dt_StockInfo> stockInfos, List<Dt_OutboundOrderDetail> outboundOrderDetails, List<Dt_OutStockLockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null);
-
+ (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews);
//List<Dt_OutboundOrderDetail> GetOutboundStockDataById(int id);
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
index affec24..860e955 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IOutboundService/IOutboundPickingService.cs"
@@ -15,17 +15,14 @@
{
IRepository<Dt_PickingRecord> Repository { get; }
- Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode);
- Task<bool> CheckPalletNeedReturn(string orderNo, string palletCode);
- Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode);
- Task<WebResponseContent> DirectOutbound(DirectOutboundRequest request);
- Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo);
- Task<WebResponseContent> GetPalletOutboundStatus(string palletCode);
- Task<List<Dt_OutStockLockInfo>> GetPickedList(string orderNo, string palletCode);
- Task<List<Dt_PickingRecord>> GetPickingHistory(int orderId);
Task<object> GetPickingSummary(ConfirmPickingDto dto);
+
Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode);
+
+ Task<List<Dt_OutStockLockInfo>> GetPickedList(string orderNo, string palletCode);
+
+ Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode);
+ Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode);
Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason);
- Task<WebResponseContent> ValidateBarcode(string barcode);
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
index 0af78c6..34899a9 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs"
@@ -9,7 +9,7 @@
{
IRepository<Dt_StockInfo> Repository { get; }
Dt_StockInfo? GetStockByPalletCode(string palletCode);
-
+ List<Dt_StockInfo> GetStockInfosByPalletCodes(List<string> palletCodes);
List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, string supplyCode, List<string> locationCodes);
List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo,string supplyCode);
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs"
index 1d84bf7..43c9e48 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs"
@@ -45,6 +45,9 @@
Task<WebResponseContent> TaskCompleted(string taskNum);
Task<WebResponseContent> GenerateOutboundTasksAsync(int[] keys, string outStation);
-
+
+ WebResponseContent GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews);
+
+
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs"
index c89c12a..0d63ad2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs"
@@ -37,10 +37,11 @@
private readonly IRepository<Dt_StockInfoDetail> _stockDetailRepository;
private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
private readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository;
+ private readonly IRepository<Dt_LocationType> _locationTypeRepository;
private readonly IRepository<Dt_StockInfo> _stockRepository;
public IRepository<Dt_InboundOrder> Repository => BaseDal;
- public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository,IRepository<Dt_StockInfo> stockRepository) : base(BaseDal)
+ public InboundOrderService(IRepository<Dt_InboundOrder> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_Task> taskRepository, IStockService stockService, IInboundOrderDetailService inboundOrderDetailService, IMaterialUnitService materialUnitService, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_StockInfo> stockRepository, IRepository<Dt_LocationType> locationTypeRepository) : base(BaseDal)
{
_mapper = mapper;
_unitOfWorkManage = unitOfWorkManage;
@@ -53,6 +54,7 @@
_inboundOrderRepository = inboundOrderRepository;
_warehouseAreaRepository = warehouseAreaRepository;
_stockRepository = stockRepository;
+ _locationTypeRepository = locationTypeRepository;
}
public async Task<WebResponseContent> ReceiveInboundOrder(List<Dt_InboundOrder> models, int operateType)
@@ -431,10 +433,10 @@
(bool, string, object?) result2 = ModelValidate.ValidateModelData(materielGroupDTO);
if (!result2.Item1) return content = WebResponseContent.Instance.Error(result2.Item2);
- bool code = _warehouseAreaRepository.Db.Queryable<Dt_WarehouseArea>().Where(x => x.Id == materielGroupDTO.WarehouseCode).Any();
+ bool code = _locationTypeRepository.Db.Queryable<Dt_LocationType>().Where(x => x.LocationType == materielGroupDTO.WarehouseCode).Any();
if (!code)
{
- return content = WebResponseContent.Instance.Error($"浠撳簱涓病鏈夎{materielGroupDTO.WarehouseCode}缂栧彿銆�");
+ return content = WebResponseContent.Instance.Error($"鍖哄煙涓病鏈夎{materielGroupDTO.WarehouseCode}缂栧彿銆�");
}
if(_stockRepository.QueryFirst(x=>x.PalletCode == materielGroupDTO.PalletCode)!=null){
@@ -637,7 +639,7 @@
{
return WebResponseContent.Instance.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
}
- var stock= _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(o=>o.Details).First(x => x.PalletCode == palletCode && x.StockStatus==3);
+ var stock= _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(o=>o.Details).First(x => x.PalletCode == palletCode );
if (stock == null)
{
return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩樺彿{palletCode}瀵瑰簲鐨勫簱瀛樿褰�");
@@ -652,7 +654,6 @@
var barcodes = stock.Details.Select(d => d.Barcode).ToList();
-
// 鍖归厤搴撳瓨鏉$爜瀵瑰簲鐨勫叆搴撳崟鏄庣粏
var matchedInboundDetails = inboundOrders.Details
?.Where(d => barcodes.Contains(d.Barcode))
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielToMes.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielToMes.cs"
index 1bc54da..3ea82c3 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielToMes.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Basic/Dt_MaterielToMes.cs"
@@ -87,7 +87,7 @@
public string MaterielCode { get; set; } = null!;
-
+ public int ReturnToMESStatus { get; set; }
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs"
index 29b6b66..02db493 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundLockInfo.cs"
@@ -128,6 +128,9 @@
public int? ParentLockId { get; set; }
+ [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎿嶄綔鑰�")]
+ public string Operator { get; set; }
+
[Navigate(NavigateType.OneToOne, nameof(StockInfo))]//涓�瀵逛竴 SchoolId鏄疭tudentA绫婚噷闈㈢殑
public Dt_StockInfo StockInfo { get; set; } //涓嶈兘璧嬪�煎彧鑳芥槸null
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs"
index 0e84c80..489eb5a 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutStockLockInfoService.cs"
@@ -57,20 +57,22 @@
// 纭畾鏉$爜
string targetBarcode;
+ var firstAvailableDetail=new Dt_StockInfoDetail();
if (!string.IsNullOrEmpty(barcode))
{
// 楠岃瘉鎸囧畾鐨勬潯鐮佹槸鍚﹀瓨鍦�
- var specifiedBarcodeDetail = stockDetails.FirstOrDefault(x => x.Barcode == barcode);
- if (specifiedBarcodeDetail == null)
+ firstAvailableDetail = stockDetails.FirstOrDefault(x => x.Barcode == barcode);
+ if (firstAvailableDetail == null)
{
throw new Exception($"鎸囧畾鐨勬潯鐮乕{barcode}]鍦ㄥ簱瀛樹腑涓嶅瓨鍦�");
}
+
targetBarcode = barcode;
}
else
{
// 浣跨敤绗竴涓彲鐢ㄦ潯鐮�
- var firstAvailableDetail = stockDetails
+ firstAvailableDetail = stockDetails
.Where(x => x.StockQuantity > x.OutboundQuantity)
.OrderBy(x => x.CreateDate)
.FirstOrDefault();
@@ -83,13 +85,9 @@
}
return new Dt_OutStockLockInfo()
- {
- lineNo= outboundOrderDetail.lineNo,
-
+ {
PalletCode = outStock.PalletCode,
- AssignQuantity = assignQuantity,
- MaterielCode = outboundOrderDetail.MaterielCode,
- BatchNo = outboundOrderDetail.BatchNo ?? outStock.Details.FirstOrDefault()?.BatchNo,
+ AssignQuantity = assignQuantity,
LocationCode = outStock.LocationCode,
MaterielName = outboundOrderDetail.MaterielName,
OrderDetailId = outboundOrderDetail.Id,
@@ -99,18 +97,53 @@
.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode)
.Sum(x => x.StockQuantity),
Status = (int)OutLockStockStatusEnum.宸插垎閰�,
- StockId = outStock.Id,
- Unit = outboundOrderDetail.Unit,
- FactoryArea = outboundOrder.FactoryArea,
+ StockId = outStock.Id,
OrderType=outboundOrder.OrderType,
- SupplyCode = outboundOrderDetail.SupplyCode,
- WarehouseCode = outboundOrderDetail.WarehouseCode,
+ SupplyCode = firstAvailableDetail.SupplyCode,
+ WarehouseCode = firstAvailableDetail.WarehouseCode,
// 鏂板瀛楁
CurrentBarcode = targetBarcode,
OriginalLockQuantity = assignQuantity,
- IsSplitted = 0
+ IsSplitted = 0,
+ MaterielCode = outboundOrderDetail.MaterielCode,
+ BatchNo = firstAvailableDetail.BatchNo,
+ Unit = firstAvailableDetail.Unit,
+ FactoryArea = firstAvailableDetail.FactoryArea,
+ lineNo = outboundOrderDetail.lineNo,
};
}
+
+
+ public List<Dt_OutStockLockInfo> GetOutStockLockInfos(Dt_OutboundOrder outboundOrder, Dt_OutboundOrderDetail outboundOrderDetail, List<Dt_StockInfo> outStocks, int? taskNum = null)
+ {
+ List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
+
+ foreach (var item in outStocks)
+ {
+ Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo()
+ {
+ PalletCode = item.PalletCode,
+ AssignQuantity = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).Sum(x => x.OutboundQuantity),
+ MaterielCode = outboundOrderDetail.MaterielCode,
+ BatchNo = outboundOrderDetail.BatchNo,
+ LocationCode = item.LocationCode,
+ MaterielName = outboundOrderDetail.MaterielName,
+ OrderDetailId = outboundOrderDetail.Id,
+ OrderNo = outboundOrder.OrderNo,
+ OrderType = outboundOrder.OrderType,
+ OriginalQuantity = item.Details.Where(x => x.MaterielCode == outboundOrderDetail.MaterielCode).Sum(x => x.StockQuantity),
+ Status = taskNum == null ? OutLockStockStatusEnum.宸插垎閰�.ObjToInt() : OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt(),
+ StockId = item.Id,
+ TaskNum = taskNum,
+
+
+ };
+ outStockLockInfos.Add(outStockLockInfo);
+ }
+
+ return outStockLockInfos;
+ }
+
/// <summary>
/// 鏍规嵁璁㈠崟鏄庣粏ID鑾峰彇鍑哄簱閿佸畾淇℃伅
/// </summary>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs"
index 3fa61d7..954e8fc 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs"
@@ -1,6 +1,7 @@
锘縰sing Microsoft.Extensions.Logging;
using SqlSugar;
using WIDESEA_Common.LocationEnum;
+using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
@@ -22,6 +23,7 @@
private readonly IStockService _stockService;
+
private readonly IOutStockLockInfoService _outStockLockInfoService;
private readonly ILocationInfoService _locationInfoService;
private readonly IBasicService _basicService;
@@ -40,6 +42,7 @@
_locationStatusChangeRecordService = locationStatusChangeRecordService;
_outboundOrderService = outboundOrderService;
_logger = logger;
+
}
@@ -153,7 +156,7 @@
if (remainingAllocate <= 0) break;
// 璁$畻杩欎釜鏄庣粏杩橀渶瑕佸垎閰嶇殑鏁伴噺
- var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity;
+ var detailNeed = detail.OrderQuantity - detail.OverOutQuantity - detail.LockQuantity-detail.MoveQty;
if (detailNeed <= 0) continue;
// 鍒嗛厤鏁伴噺
@@ -289,5 +292,72 @@
return new PageGridData<Dt_OutboundOrderDetail> ();
}
+
+ public (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignStockOutbound(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
+ {
+ (bool, string) checkResult = CheckSelectStockDeital(outboundOrderDetail, stockSelectViews);
+ if (!checkResult.Item1) throw new Exception(checkResult.Item2);
+
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
+ var originalNeedQuantity = outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity;
+
+ var needQuantity = originalNeedQuantity;
+
+ List<Dt_StockInfo> outStocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList());
+ var assignQuantity =0m;
+ outStocks.ForEach(x =>
+ {
+ x.Details.ForEach(v =>
+ {
+ assignQuantity += v.StockQuantity - v.OutboundQuantity;
+ });
+ });
+
+ outboundOrderDetail.LockQuantity += assignQuantity;
+ outStocks.ForEach(x =>
+ {
+ x.Details.ForEach(v =>
+ {
+ v.OutboundQuantity = v.StockQuantity;
+ });
+ });
+ needQuantity -= assignQuantity;
+ if (outboundOrderDetail.OrderQuantity > outboundOrderDetail.LockQuantity)
+ {
+ List<Dt_StockInfo> stockInfos = _stockService.StockInfoService.GetUseableStocks(outboundOrderDetail.MaterielCode, outboundOrderDetail.BatchNo,"");
+ stockInfos = stockInfos.Where(x => !stockSelectViews.Select(v => v.PalletCode).Contains(x.PalletCode)).ToList();
+ var (autoAssignStocks, stockAllocations) = _stockService.StockInfoService.GetOutboundStocks(stockInfos, outboundOrderDetail.MaterielCode, needQuantity, out decimal residueQuantity);
+ outboundOrderDetail.LockQuantity += needQuantity - residueQuantity;
+ outStocks.AddRange(autoAssignStocks);
+ outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt();
+ if (residueQuantity > 0)
+ {
+ outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.AssignOverPartial.ObjToInt();
+ }
+ }
+
+ List<Dt_OutStockLockInfo> outStockLockInfos = _outStockLockInfoService.GetOutStockLockInfos(outboundOrder, outboundOrderDetail, outStocks);
+
+ List<Dt_LocationInfo> locationInfos = _locationInfoService.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList());
+
+ return (outStocks, outboundOrderDetail, outStockLockInfos, locationInfos);
+ }
+ private (bool, string) CheckSelectStockDeital(Dt_OutboundOrderDetail outboundOrderDetail, List<StockSelectViewDTO> stockSelectViews)
+ {
+ if (outboundOrderDetail == null)
+ {
+ return (false, "鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+ }
+ if (outboundOrderDetail.OrderDetailStatus != OrderDetailStatusEnum.New.ObjToInt() && outboundOrderDetail.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt())
+ {
+ return (false, "璇ユ槑缁嗕笉鍙搷浣�");
+ }
+ if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity)
+ {
+ return (false, "閫夋嫨鏁伴噺瓒呭嚭鍗曟嵁鏁伴噺");
+ }
+ return (true, "鎴愬姛");
+ }
+
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
index 6d672b9..eddd986 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs"
@@ -1,6 +1,7 @@
锘縰sing Dm.filter;
using MailKit.Search;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SqlSugar;
using System;
@@ -84,1030 +85,6 @@
_dailySequenceService = dailySequenceService;
}
-
- #region 鏌ヨ鍑哄簱璇︽儏鍒楄〃
- public async Task<List<OutStockLockListResp>> GetOutStockLockListAsync(string orderNo)
- {
- var locks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(t => t.OrderNo == orderNo)
- .ToListAsync();
-
- return locks.Select(t => new OutStockLockListResp
- {
- Id = t.Id,
- // TaskNum = t.TaskNum,
- PalletCode = t.PalletCode,
- CurrentBarcode = t.CurrentBarcode,
- AssignQuantity = t.AssignQuantity,
- PickedQty = t.PickedQty,
- Status = t.Status,
- // IsSplitted = t.IsSplitted
- }).ToList();
- }
- #endregion
- public async Task<WebResponseContent> ValidateBarcode(string barcode)
- {
- try
- {
- if (string.IsNullOrEmpty(barcode))
- {
- return WebResponseContent.Instance.Error("鏉$爜涓嶈兘涓虹┖");
- }
-
- // 鏍规嵁鏉$爜鏌ヨ搴撳瓨鏄庣粏
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Includes(x => x.StockInfo)
- .Where(x => x.Barcode == barcode)
- .FirstAsync();
-
- if (stockDetail == null)
- {
- return WebResponseContent.Instance.Error("鏉$爜涓嶅瓨鍦�");
- }
-
-
-
- var result = new
- {
- Barcode = barcode,
- MaterielCode = stockDetail.MaterielCode,
-
- BatchNo = stockDetail.BatchNo,
- AvailableQuantity = stockDetail.StockQuantity - stockDetail.OutboundQuantity,
- LocationCode = stockDetail.StockInfo?.LocationCode,
- PalletCode = stockDetail.StockInfo?.PalletCode
- };
-
- return WebResponseContent.Instance.OK(null, result);
- }
- catch (Exception ex)
- {
- return WebResponseContent.Instance.Error($"鏉$爜楠岃瘉澶辫触: {ex.Message}");
- }
- }
-
- // 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
- private async Task CheckAndUpdateOrderStatus(string orderNo)
- {
-
- var orderDetails = _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id) // 鍏宠仈鏉′欢锛氱埗琛� Id = 瀛愯〃 OrderId
- .Where((o, item) => item.OrderNo == orderNo) // 杩囨护鐖惰〃 OrderNo
- .Select((o, item) => o) // 鍙繑鍥炲瓙琛ㄦ暟鎹�
- .ToList();
-
- //var orderDetails = await _stockInfoDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- // .Where(x => x.OrderId == orderNo.ObjToInt())
- // .ToListAsync();
-
- bool allCompleted = true;
- foreach (var detail in orderDetails)
- {
- if (detail.OverOutQuantity < detail.NeedOutQuantity)
- {
- allCompleted = false;
- break;
- }
- }
-
- if (allCompleted)
- {
- try
- {
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => x.OrderStatus == 2) // 宸插畬鎴�
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
-
- var outboundOrder = _stockInfoService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == orderNo);
-
-
- if (outboundOrder != null && outboundOrder.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
- {
-
- if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt().ObjToInt())//璋冩嫧鍑哄簱
- {
-
- }
- else if (outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt()) //閲嶆鍑哄簱
- {
-
- }
- else
- {
- var feedmodel = new FeedbackOutboundRequestModel
- {
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString(),
- business_type = outboundOrder.BusinessType,
- factoryArea = outboundOrder.FactoryArea,
- operationType = 1,
- Operator = outboundOrder.Operator,
- orderNo = outboundOrder.UpperOrderNo,
- status = outboundOrder.OrderStatus,
- details = new List<FeedbackOutboundDetailsModel>()
-
- };
- var lists = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.OrderNo == orderNo).ToList();
-
- var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
- .Select(group => new FeedbackOutboundDetailsModel
- {
- materialCode = group.Key.MaterielCode,
- lineNo = group.Key.lineNo,
- warehouseCode = group.Key.WarehouseCode,
- currentDeliveryQty = group.Sum(x => x.OrderQuantity),
- // warehouseCode= "1072",
- unit = group.Key.Unit,
- barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
- {
- barcode = row.CurrentBarcode,
- supplyCode = row.SupplyCode,
- batchNo = row.BatchNo,
- unit = row.Unit,
- qty = row.AssignQuantity
- }).ToList()
- }).ToList();
- feedmodel.details = groupedData;
-
- _invokeMESService.FeedbackOutbound(feedmodel);
- }
- }
- }
- catch (Exception ex)
- {
- _logger.LogError(" OutboundPickingService FeedbackOutbound : " + ex.Message);
- }
-
- }
- }
-
- public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
- {
- try
- {
- _unitOfWorkManage.BeginTran();
-
- // 1. 鏌ユ壘鍑哄簱閿佸畾淇℃伅
- var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == orderNo &&
- it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
- it.PalletCode == palletCode &&
- it.CurrentBarcode == barcode)
- .FirstAsync();
-
- if (lockInfo == null)
- {
- lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.CurrentBarcode == barcode &&
- it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
- .FirstAsync();
-
- if (lockInfo == null)
- throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}鎴栦笉瀛樺湪寰呭垎鎷h褰�");
- }
-
- if (lockInfo.PalletCode != palletCode)
- throw new Exception($"鏉$爜{barcode}涓嶅睘浜庢墭鐩榹palletCode}");
-
- var outorderdetail = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().First(x => x.Id == lockInfo.OrderDetailId);
- if (outorderdetail != null && lockInfo.AssignQuantity > outorderdetail.OrderQuantity)
- {
- throw new Exception($"鏉$爜{barcode}鐨勫嚭搴撴暟閲忓ぇ浜庤鍗曠殑鏁伴噺");
- }
-
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId)
- .FirstAsync();
-
- if (stockDetail == null)
- return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
-
- decimal actualQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
- decimal stockQuantity = stockDetail.StockQuantity;
-
- List<SplitResult> splitResults = new List<SplitResult>();
-
- if (actualQty < stockQuantity)
- {
- // 鎯呭喌1: 鍒嗛厤鏁伴噺灏忎簬搴撳瓨鏁伴噺锛岄渶瑕佽嚜鍔ㄦ媶鍖�
- // 璁$畻鍓╀綑搴撳瓨鏁伴噺
- decimal remainingStockQty = stockQuantity - actualQty;
-
- // 鏇存柊鍘熸潯鐮佸簱瀛樹负鍓╀綑鏁伴噺
- stockDetail.StockQuantity = remainingStockQty;
- stockDetail.OutboundQuantity = remainingStockQty;
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
- // 鐢熸垚鏂版潯鐮佺敤浜庤褰曟嫞閫夋暟閲忥紙浣嗕笉鍒涘缓搴撳瓨璁板綍锛�
- var seq = await _dailySequenceService.GetNextSequenceAsync();
- string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
-
- // 涓烘柊鏉$爜鍒涘缓鍑哄簱閿佸畾淇℃伅锛堢敤浜庤褰曟嫞閫夛級
- var newLockInfo = new Dt_OutStockLockInfo
- {
- OrderNo = lockInfo.OrderNo,
- OrderDetailId = lockInfo.OrderDetailId,
- BatchNo = lockInfo.BatchNo,
- MaterielCode = lockInfo.MaterielCode,
- MaterielName = lockInfo.MaterielName,
- StockId = lockInfo.StockId,
- OrderQuantity = actualQty,
- OriginalQuantity = actualQty,
- AssignQuantity = actualQty,
- PickedQty = actualQty,
- LocationCode = lockInfo.LocationCode,
- PalletCode = lockInfo.PalletCode,
- TaskNum = lockInfo.TaskNum,
- Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
- Unit = lockInfo.Unit,
- SupplyCode = lockInfo.SupplyCode,
- OrderType = lockInfo.OrderType,
- CurrentBarcode = newBarcode,
- OriginalLockQuantity = actualQty,
- IsSplitted = 1,
- ParentLockId = lockInfo.Id
- };
- await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
-
- // 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
- var splitHistory = new Dt_SplitPackageRecord
- {
- FactoryArea = lockInfo.FactoryArea,
- TaskNum = lockInfo.TaskNum,
- OutStockLockInfoId = lockInfo.Id,
- StockId = stockDetail.StockId,
- Operator = App.User.UserName,
- IsReverted = false,
- OriginalBarcode = barcode,
- NewBarcode = newBarcode,
- SplitQty = actualQty,
- RemainQuantity = remainingStockQty,
- MaterielCode = lockInfo.MaterielCode,
- SplitTime = DateTime.Now,
- OrderNo = lockInfo.OrderNo,
- PalletCode = lockInfo.PalletCode,
- Status = (int)SplitPackageStatusEnum.宸叉嫞閫�
- };
- await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync();
-
- // 鏇存柊鍘熼攣瀹氫俊鎭负鍓╀綑搴撳瓨鏁伴噺
- lockInfo.AssignQuantity = remainingStockQty;
- lockInfo.PickedQty = 0;
-
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- splitResults.Add(new SplitResult
- {
- OriginalBarcode = barcode,
- NewBarcode = newBarcode,
- SplitQuantity = actualQty,
- RemainQuantity = remainingStockQty
- });
-
- // 鏇存柊鎷i�夎褰曚腑鐨勬潯鐮佷负鏂版潯鐮�
- barcode = newBarcode;
- lockInfo = newLockInfo;
- }
- else if (actualQty == stockQuantity)
- {
- // 鎯呭喌2: 鍒嗛厤鏁伴噺绛変簬搴撳瓨鏁伴噺锛屾暣鍖呭嚭搴�
- stockDetail.StockQuantity = 0;
- stockDetail.OutboundQuantity = 0;
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
- lockInfo.PickedQty += actualQty;
- lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
- }
- else
- {
- // 鎯呭喌3: 鍒嗛厤鏁伴噺澶т簬搴撳瓨鏁伴噺锛屽簱瀛樻暣鍖呭嚭搴�
- // 鏁村寘鍑哄簱褰撳墠搴撳瓨
- decimal stockOutQty = stockQuantity;
- stockDetail.StockQuantity = 0;
- stockDetail.OutboundQuantity = 0;
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
- // 璁$畻鍓╀綑鍒嗛厤鏁伴噺
- decimal remainingAssignQty = actualQty - stockQuantity;
-
- // 鏇存柊閿佸畾淇℃伅锛堝彧瀹屾垚搴撳瓨閮ㄥ垎锛�
- lockInfo.PickedQty += stockOutQty;
- lockInfo.AssignQuantity = remainingAssignQty;
-
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- var _relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode)
- .Where(it => !it.IsReverted)
- .ToListAsync();
-
- foreach (var record in _relatedSplitRecords)
- {
- record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
- await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
- }
- }
-
-
-
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => it.PickedQty == it.PickedQty + actualQty)
- .Where(it => it.Id == lockInfo.OrderDetailId)
- .ExecuteCommandAsync();
-
- await CheckAndUpdateOrderStatus(orderNo);
-
- // 鏌ヨ浠诲姟琛�
- var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
-
- // 璁板綍鎷i�夊巻鍙�
- var pickingHistory = new Dt_PickingRecord
- {
- FactoryArea = lockInfo.FactoryArea,
- TaskNo = task?.TaskNum ?? 0,
- LocationCode = task?.SourceAddress ?? "",
- StockId = stockDetail.Id,
- OrderNo = orderNo,
- OrderDetailId = lockInfo.OrderDetailId,
- PalletCode = palletCode,
- Barcode = barcode,
- MaterielCode = lockInfo.MaterielCode,
- PickQuantity = actualQty,
- PickTime = DateTime.Now,
- Operator = App.User.UserName,
- OutStockLockId = lockInfo.Id
- };
- await Db.Insertable(pickingHistory).ExecuteCommandAsync();
-
- _unitOfWorkManage.CommitTran();
-
- // 濡傛灉鏈夋媶鍖呯粨鏋滐紝杩斿洖鎷嗗寘淇℃伅
- if (splitResults.Any())
- {
- return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", new { SplitResults = splitResults });
- }
-
- return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
-
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
- }
- }
-
- /// <summary>
- /// 鍥炲簱鎿嶄綔
- /// </summary>
-
- public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason)
- {
- try
- {
- _unitOfWorkManage.BeginTran();
-
- // 鑾峰彇鎵�鏈夋湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰曪紝鍖呮嫭鎷嗗寘浜х敓鐨勮褰�
- var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == orderNo && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
- .ToListAsync();
-
- var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode);
-
- var tasks = new List<Dt_Task>();
-
- // 鏌ヨ浠诲姟琛�
- var task = remainingLocks.Any()
- ? _taskRepository.QueryData(x => x.TaskNum == remainingLocks.First().TaskNum).FirstOrDefault()
- : _taskRepository.QueryData(x => x.PalletCode == palletCode).FirstOrDefault();
-
- if (task == null)
- {
- return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
- }
-
- // 妫�鏌ユ墭鐩樹笂鏄惁鏈夊叾浠栭潪鍑哄簱璐х墿锛堝簱瀛樿揣鐗╋級
- var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.StockId == stockinfo.Id &&
- (it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
- it.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() ||
- it.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()))
- .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity) // 鏈畬鍏ㄥ嚭搴撶殑
- .ToListAsync();
-
- // 妫�鏌ユ媶鍖呰褰曪紝鎵惧嚭闇�瑕佸洖搴撶殑鏉$爜
- var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted)
- .ToListAsync();
-
- // 璁$畻闇�瑕佸洖搴撶殑鎷嗗寘鏉$爜
- var splitBarcodesToReturn = new List<string>();
- foreach (var splitRecord in splitRecords)
- {
- // 妫�鏌ュ師鏉$爜鏄惁杩樻湁搴撳瓨闇�瑕佸洖搴�
- var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockinfo.Id)
- .FirstAsync();
-
- if (originalStock != null && originalStock.StockQuantity > 0)
- {
- splitBarcodesToReturn.Add(splitRecord.OriginalBarcode);
- }
-
- // 妫�鏌ユ柊鏉$爜鏄惁杩樻湁搴撳瓨闇�瑕佸洖搴�
- var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockinfo.Id)
- .FirstAsync();
-
- if (newStock != null && newStock.StockQuantity > 0)
- {
- splitBarcodesToReturn.Add(splitRecord.NewBarcode);
- }
- }
-
- // 濡傛灉娌℃湁闇�瑕佸洖搴撶殑璐х墿锛堟棦鏃犳湭鍒嗘嫞鍑哄簱璐х墿锛屼篃鏃犲叾浠栧簱瀛樿揣鐗╋紝涔熸棤鎷嗗寘鍓╀綑璐х墿锛�
- if (!remainingLocks.Any() && !palletStockGoods.Any() && !splitBarcodesToReturn.Any())
- {
- // 妫�鏌ユ槸鍚︽墍鏈夎揣鐗╅兘宸叉嫞閫夊畬鎴�
- var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode)
- .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�);
-
- if (allPicked)
- {
- return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
- }
- else
- {
- return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
- }
- }
-
- var firstlocation = _locationInfoService.Db.Queryable<Dt_LocationInfo>().First(x => x.LocationCode == task.SourceAddress);
- decimal totalReturnQty = 0;
-
- // 鎯呭喌1锛氬鐞嗘湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
- if (remainingLocks.Any(x => x.PalletCode == palletCode))
- {
- var palletLocks = remainingLocks.Where(x => x.PalletCode == palletCode).ToList();
- totalReturnQty = palletLocks.Sum(x => x.AssignQuantity - x.PickedQty);
-
- if (totalReturnQty > 0)
- {
- // 鍒嗛厤鏂拌揣浣�
- var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
-
- // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵��
- var lockIds = palletLocks.Select(x => x.Id).ToList();
- await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
- .SetColumns(it => new Dt_OutStockLockInfo { Status = (int)OutLockStockStatusEnum.鍥炲簱涓� })
- .Where(it => lockIds.Contains(it.Id))
- .ExecuteCommandAsync();
-
-
-
- // 澶勭悊搴撳瓨璁板綍
- foreach (var lockInfo in palletLocks)
- {
- decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
-
- // 妫�鏌ュ簱瀛樿褰曟槸鍚﹀瓨鍦�
- var existingStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
- .FirstAsync();
-
- if (existingStock != null)
- {
- // 搴撳瓨璁板綍瀛樺湪锛屾仮澶嶉攣瀹氭暟閲�
- existingStock.OutboundQuantity = 0;
-
- await _stockInfoDetailService.Db.Updateable(existingStock).ExecuteCommandAsync();
- }
- else
- {
- // 搴撳瓨璁板綍涓嶅瓨鍦紙鍙兘鏄媶鍖呬骇鐢熺殑鏂版潯鐮侊級锛屽垱寤烘柊鐨勫簱瀛樿褰�
- var newStockDetail = new Dt_StockInfoDetail
- {
- StockId = lockInfo.StockId,
- MaterielCode = lockInfo.MaterielCode,
- MaterielName = lockInfo.MaterielName,
- OrderNo = lockInfo.OrderNo,
- BatchNo = lockInfo.BatchNo,
- StockQuantity = returnQty,
- OutboundQuantity = 0,
- Barcode = lockInfo.CurrentBarcode,
- InboundOrderRowNo = "",
- Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt(),
- SupplyCode = lockInfo.SupplyCode,
- WarehouseCode = lockInfo.WarehouseCode,
- Unit = lockInfo.Unit
- };
- await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
- }
- }
-
- // 鍒涘缓鍥炲簱浠诲姟
- CreateReturnTask(tasks, task, palletCode, newLocation);
- }
- }
-
- // 鎯呭喌2锛氬鐞嗘媶鍖呭墿浣欑殑搴撳瓨璐х墿
- if (splitBarcodesToReturn.Any())
- {
- decimal splitReturnQty = 0;
-
- foreach (var barcode in splitBarcodesToReturn)
- {
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == barcode && it.StockId == stockinfo.Id)
- .FirstAsync();
-
- if (stockDetail != null && stockDetail.StockQuantity > 0)
- {
- splitReturnQty += stockDetail.StockQuantity;
-
- // 鎭㈠搴撳瓨鐘舵�佷负鍏ュ簱瀹屾垚
- stockDetail.OutboundQuantity = 0;
-
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
- }
- }
-
- totalReturnQty += splitReturnQty;
-
- // 濡傛灉娌℃湁鍒涘缓浠诲姟锛屽垱寤哄洖搴撲换鍔�
- if (!tasks.Any())
- {
- var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
- CreateReturnTask(tasks, task, palletCode, newLocation);
- }
- }
-
- // 鎯呭喌3锛氬嚭搴撹揣鐗╁凡鍒嗘嫞瀹岋紝浣嗘墭鐩樹笂杩樻湁鍏朵粬搴撳瓨璐х墿闇�瑕佸洖搴�
- if (palletStockGoods.Any() && !remainingLocks.Any(x => x.PalletCode == palletCode))
- {
- decimal otherReturnQty = palletStockGoods.Sum(x => x.StockQuantity - x.OutboundQuantity);
- totalReturnQty += otherReturnQty;
- // 鏇存柊杩欎簺搴撳瓨璐х墿鐨勭姸鎬�
- foreach (var stockGood in palletStockGoods)
- {
- stockGood.OutboundQuantity = 0;
-
- await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync();
- }
- // 濡傛灉娌℃湁鍒涘缓浠诲姟锛屽垱寤哄洖搴撲换鍔�
- if (!tasks.Any())
- {
- var newLocation = _locationInfoService.AssignLocation(firstlocation.LocationType);
- CreateReturnTask(tasks, task, palletCode, newLocation);
- }
-
-
- }
-
- var allSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted)
- .ToListAsync();
-
- foreach (var record in allSplitRecords)
- {
- record.Status = (int)SplitPackageStatusEnum.宸插洖搴�;
- await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
- }
- // 淇濆瓨浠诲姟 缁橢SS涓嬪彂浠诲姟
- if (tasks.Any())
- {
- try
- {
- await _taskRepository.Db.Insertable(tasks).ExecuteCommandAsync();
- var targetAddress = task.TargetAddress;
- _taskRepository.DeleteData(task);
-
- // 缁� ESS 娴佸姩淇″彿鍜屽垱寤轰换鍔�
- try
- {
- var result = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest
- {
- slotCode = movestations[targetAddress],
- containerCode = palletCode
- });
-
- if (result)
- {
- TaskModel esstask = new TaskModel()
- {
- taskType = "putaway",
- taskGroupCode = "",
- groupPriority = 0,
- tasks = new List<TasksType>
- {
- new()
- {
- taskCode = tasks.First().TaskNum.ToString(),
- taskPriority = 0,
- taskDescribe = new TaskDescribeType {
- containerCode = palletCode,
- containerType = "CT_KUBOT_STANDARD",
- fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
- toStationCode = "",
- toLocationCode = tasks.First().TargetAddress,
- deadline = 0, storageTag = ""
- }
- }
- }
- };
-
- var resulttask = await _eSSApiService.CreateTaskAsync(esstask);
- _logger.LogInformation("ReturnRemaining 鍒涘缓浠诲姟杩斿洖: " + resulttask);
- }
- }
- catch (Exception ex)
- {
- _logger.LogInformation("ReturnRemaining 鍒涘缓浠诲姟杩斿洖 catch err: " + ex.Message);
- }
-
- _unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK($"鍥炲簱鎿嶄綔鎴愬姛锛屽叡鍥炲簱鏁伴噺锛歿totalReturnQty}");
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鍒涘缓鍥炲簱浠诲姟澶辫触: {ex.Message}");
- }
- }
-
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error("鏈垱寤轰换浣曞洖搴撲换鍔�");
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鍥炲簱鎿嶄綔澶辫触: {ex.Message}");
- }
- }
-
-
- /// <summary>
- /// 鍒涘缓鍥炲簱浠诲姟
- /// </summary>
- private void CreateReturnTask(List<Dt_Task> tasks, Dt_Task originalTask, string palletCode, Dt_LocationInfo newLocation)
- {
- Dt_Task newTask = new()
- {
- CurrentAddress = stations[originalTask.TargetAddress],
- Grade = 0,
- PalletCode = palletCode,
- NextAddress = "",
- OrderNo = originalTask.OrderNo,
- Roadway = newLocation.RoadwayNo,
- SourceAddress = stations[originalTask.TargetAddress],
- TargetAddress = newLocation.LocationCode,
- TaskStatus = TaskStatusEnum.New.ObjToInt(),
- TaskType = TaskTypeEnum.InPick.ObjToInt(),
- PalletType = originalTask.PalletType,
- WarehouseId = originalTask.WarehouseId,
-
- };
- tasks.Add(newTask);
- }
-
- /// <summary>
- /// 妫�鏌ユ墭鐩樻槸鍚﹂渶瑕佸洖搴撶殑杈呭姪鏂规硶
- /// </summary>
- public async Task<bool> CheckPalletNeedReturn(string orderNo, string palletCode)
- {
- // 1. 妫�鏌ユ槸鍚︽湁鏈垎鎷g殑鍑哄簱璁板綍
- var hasUnpickedLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && it.Status == 1)
- .AnyAsync();
-
- if (hasUnpickedLocks)
- return true;
-
- // 2. 妫�鏌ュ嚭搴撴槸鍚﹀凡瀹屾垚浣嗘墭鐩樿繕鏈夊簱瀛樿揣鐗�
- var outboundFinished = !await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.PalletCode == palletCode && it.Status == 1)
- .AnyAsync();
-
- var stockinfo = _stockInfoService.Db.Queryable<Dt_StockInfo>().First(x => x.PalletCode == palletCode);
-
-
- var hasRemainingGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.StockId == stockinfo.Id && it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt())
- .Where(it => it.OutboundQuantity == 0 || it.OutboundQuantity < it.StockQuantity)
- .AnyAsync();
-
- return outboundFinished && hasRemainingGoods;
- }
-
- // 鍙栨秷鎷i�夊姛鑳�
- public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode)
- {
- try
- {
- _unitOfWorkManage.BeginTran();
-
- //鏌ユ壘鎷i�夎褰�
- var pickingRecord = await Db.Queryable<Dt_PickingRecord>()
- .Where(it => it.OrderNo == orderNo &&
- it.PalletCode == palletCode &&
- it.Barcode == barcode)
- .OrderByDescending(it => it.PickTime)
- .FirstAsync();
-
- if (pickingRecord == null)
- return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�夎褰�");
-
- // 鏌ユ壘鍑哄簱閿佸畾淇℃伅
- var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.Id == pickingRecord.OutStockLockId)
- .FirstAsync();
-
- if (lockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鍑哄簱閿佸畾淇℃伅");
-
- //妫�鏌ユ槸鍚﹀彲浠ュ彇娑堬紙鐘舵�佸繀椤绘槸鎷i�夊畬鎴愶級
- if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
- return WebResponseContent.Instance.Error("褰撳墠鐘舵�佷笉鍏佽鍙栨秷鍒嗘嫞");
-
- decimal cancelQty = pickingRecord.PickQuantity;
-
- // 妫�鏌ユ媶鍖呴摼鍏崇郴
- var splitChain = await GetSplitChain(barcode);
-
- if (splitChain.Any())
- {
- // 鎯呭喌A锛氬鐞嗘媶鍖呴摼鐨勫彇娑堬紙澶氭鎵嬪姩鎷嗗寘锛�
- await HandleSplitChainCancel(orderNo, palletCode, barcode, cancelQty, lockInfo, pickingRecord, splitChain);
- }
- else
- {
- // 鎯呭喌B锛氬鐞嗘櫘閫氭潯鐮佺殑鍙栨秷
- await HandleNormalBarcodeCancel(orderNo, palletCode, barcode, cancelQty, lockInfo, pickingRecord);
- }
-
- _unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK($"鍙栨秷鍒嗘嫞鎴愬姛锛屾仮澶嶆暟閲忥細{cancelQty}");
- }
- catch (Exception ex)
- {
- _unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鍙栨秷鍒嗘嫞澶辫触锛歿ex.Message}");
- }
- }
-
- /// <summary>
- /// 鑾峰彇鎷嗗寘閾撅紙浠庡綋鍓嶆潯鐮佽拷婧埌鍘熷鏉$爜锛�
- /// </summary>
- // 鍦� GetSplitChain 鏂规硶涓坊鍔犳洿涓ユ牸鐨勯獙璇�
- private async Task<List<SplitChainItem>> GetSplitChain(string currentBarcode)
- {
- var chain = new List<SplitChainItem>();
- var visited = new HashSet<string>();
-
- string current = currentBarcode;
- int maxDepth = 10; // 闃叉鏃犻檺寰幆
-
- while (!string.IsNullOrEmpty(current) && maxDepth > 0)
- {
- maxDepth--;
-
- if (visited.Contains(current))
- {
- _logger.LogWarning($"妫�娴嬪埌寰幆寮曠敤鍦ㄦ媶鍖呴摼涓�: {current}");
- break;
- }
-
- visited.Add(current);
-
- var splitRecord = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.NewBarcode == current && !it.IsReverted)
- .FirstAsync();
-
- if (splitRecord == null)
- break;
-
- // 楠岃瘉鎷嗗寘璁板綍鐨勫畬鏁存��
- if (string.IsNullOrEmpty(splitRecord.OriginalBarcode))
- {
- _logger.LogError($"鎷嗗寘璁板綍 {splitRecord.Id} 缂哄皯鍘熷鏉$爜");
- break;
- }
-
- var item = new SplitChainItem
- {
- SplitRecord = splitRecord,
- OriginalBarcode = splitRecord.OriginalBarcode,
- NewBarcode = splitRecord.NewBarcode,
- SplitQuantity = splitRecord.SplitQty
- };
-
- chain.Add(item);
-
- current = splitRecord.OriginalBarcode;
- }
-
- if (maxDepth <= 0)
- {
- _logger.LogWarning($"鎷嗗寘閾捐拷婧揪鍒版渶澶ф繁搴�: {currentBarcode}");
- }
-
- chain.Reverse();
- return chain;
- }
- /// <summary>
- /// 澶勭悊鎷嗗寘閾剧殑鍙栨秷鍒嗘嫞
- /// </summary>
- private async Task HandleSplitChainCancel(string orderNo, string palletCode, string barcode,
- decimal cancelQty, Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, List<SplitChainItem> splitChain)
- {
- if (!splitChain.Any())
- return;
-
- // 鎵惧埌鍘熷鏉$爜锛堥摼鐨勭涓�涓級
- var originalSplitItem = splitChain.First();
- var originalBarcode = originalSplitItem.OriginalBarcode;
-
- // 鏌ユ壘鍘熷鏉$爜鐨勯攣瀹氫俊鎭拰搴撳瓨
- var originalLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.CurrentBarcode == originalBarcode && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
- .FirstAsync();
-
- var originalStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == originalBarcode && it.StockId == originalLockInfo.StockId)
- .FirstAsync();
-
- if (originalLockInfo == null || originalStockDetail == null)
- throw new Exception("鏈壘鍒板師濮嬫潯鐮佺殑閿佸畾淇℃伅鎴栧簱瀛樹俊鎭�");
-
- // 鎭㈠鍘熷鏉$爜搴撳瓨锛堝皢鍙栨秷鐨勬暟閲忓姞鍥炲幓锛�
- originalStockDetail.StockQuantity += cancelQty;
- originalStockDetail.OutboundQuantity += cancelQty;
- await _stockInfoDetailService.Db.Updateable(originalStockDetail).ExecuteCommandAsync();
-
- // 鎭㈠鍘熷鏉$爜閿佸畾淇℃伅
- originalLockInfo.AssignQuantity += cancelQty;
- await _outStockLockInfoService.Db.Updateable(originalLockInfo).ExecuteCommandAsync();
-
- // 鍒犻櫎鎷嗗寘閾句腑鎵�鏈夋柊鏉$爜鐨勯攣瀹氫俊鎭拰搴撳瓨璁板綍
- var allNewBarcodes = splitChain.Select(x => x.NewBarcode).ToList();
-
- // 鍒犻櫎閿佸畾淇℃伅
- await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
- .Where(it => allNewBarcodes.Contains(it.CurrentBarcode))
- .ExecuteCommandAsync();
-
- // 鍒犻櫎搴撳瓨璁板綍锛堝彧鍒犻櫎鎷嗗寘浜х敓鐨勬柊鏉$爜搴撳瓨锛屼繚鐣欏師濮嬫潯鐮侊級
- await _stockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
- .Where(it => allNewBarcodes.Contains(it.Barcode) && it.Barcode != originalBarcode)
- .ExecuteCommandAsync();
-
- // 鏇存柊鎷嗗寘閾句腑鎵�鏈夋媶鍖呰褰曠姸鎬佷负宸叉媶鍖�
- foreach (var chainItem in splitChain)
- {
- chainItem.SplitRecord.Status = (int)SplitPackageStatusEnum.宸叉媶鍖�;
- await _splitPackageService.Db.Updateable(chainItem.SplitRecord).ExecuteCommandAsync();
- }
-
- // 鎭㈠璁㈠崟鏄庣粏鎷i�夋暟閲忥紙浣跨敤鍘熷閿佸畾淇℃伅鐨勮鍗曟槑缁咺D锛�
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty)
- .Where(it => it.Id == originalLockInfo.OrderDetailId)
- .ExecuteCommandAsync();
-
- // 鎭㈠璁㈠崟鐘舵��
- await CheckAndRevertOrderStatus(orderNo);
-
- // 鍒犻櫎鎷i�夎褰�
- await Db.Deleteable<Dt_PickingRecord>()
- .Where(it => it.Id == pickingRecord.Id)
- .ExecuteCommandAsync();
-
- //// 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
- //await RecordCancelHistory(orderNo, palletCode, barcode, cancelQty, pickingRecord.Id,
- // lockInfo.MaterielCode, "鍙栨秷鎷嗗寘閾惧垎鎷�");
- }
-
- /// <summary>
- /// 澶勭悊鏅�氭潯鐮佺殑鍙栨秷鍒嗘嫞
- /// </summary>
- private async Task HandleNormalBarcodeCancel(string orderNo, string palletCode, string barcode,
- decimal cancelQty, Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord)
- {
- // 1. 鏌ユ壘搴撳瓨淇℃伅
- var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(it => it.Barcode == barcode && it.StockId == lockInfo.StockId)
- .FirstAsync();
-
- if (stockDetail == null)
- throw new Exception("鏈壘鍒板搴旂殑搴撳瓨淇℃伅");
-
- // 2. 鎭㈠搴撳瓨鏁伴噺
- if (stockDetail.StockQuantity == 0)
- {
- // 鏁村寘鍑哄簱鐨勬儏鍐�
- stockDetail.StockQuantity = cancelQty;
- stockDetail.OutboundQuantity = cancelQty;
- }
- else
- {
- // 閮ㄥ垎鍑哄簱鐨勬儏鍐�
- stockDetail.StockQuantity += cancelQty;
- stockDetail.OutboundQuantity += cancelQty;
- }
- await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
-
- // 3. 鎭㈠閿佸畾淇℃伅鐘舵��
- lockInfo.AssignQuantity += cancelQty;
- lockInfo.PickedQty -= cancelQty;
-
- if (lockInfo.PickedQty == 0)
- {
- lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
- }
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- // 4. 澶勭悊鐩稿叧鐨勬媶鍖呰褰曠姸鎬佹仮澶�
- var relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(it => it.OriginalBarcode == barcode &&
- it.Status == (int)SplitPackageStatusEnum.宸叉嫞閫�)
- .ToListAsync();
-
- foreach (var record in relatedSplitRecords)
- {
- record.Status = (int)SplitPackageStatusEnum.宸叉媶鍖�;
- await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
- }
-
- // 5. 鎭㈠璁㈠崟鏄庣粏鐨勬嫞閫夋暟閲�
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => it.PickedQty == it.PickedQty - cancelQty)
- .Where(it => it.Id == lockInfo.OrderDetailId)
- .ExecuteCommandAsync();
-
- // 6. 鎭㈠璁㈠崟鐘舵��
- await CheckAndRevertOrderStatus(orderNo);
-
- // 7. 鍒犻櫎鎷i�夎褰�
- await Db.Deleteable<Dt_PickingRecord>().Where(it => it.Id == pickingRecord.Id).ExecuteCommandAsync();
-
- //// 8. 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
- //await RecordCancelHistory(orderNo, palletCode, barcode, cancelQty, pickingRecord.Id,
- // lockInfo.MaterielCode, "鍙栨秷鍒嗘嫞");
- }
-
- /// <summary>
- /// 妫�鏌ュ苟鎭㈠璁㈠崟鐘舵��
- /// </summary>
- private async Task CheckAndRevertOrderStatus(string orderNo)
- {
- var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
- .Where(x => x.OrderNo == orderNo)
- .FirstAsync();
-
- if (order != null && order.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt())
- {
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => x.OrderStatus == OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
- }
- }
-
- /// <summary>
- /// 璁板綍鍙栨秷鎿嶄綔鍘嗗彶
- /// </summary>
- private async Task RecordCancelHistory(string orderNo, string palletCode, string barcode,
- decimal cancelQty, int pickingRecordId, string materielCode, string reason)
- {
-
- //var cancelHistory = new Dt_PickingCancelRecord
- //{
- // OrderNo = orderNo,
- // PalletCode = palletCode,
- // Barcode = barcode,
- // CancelQuantity = cancelQty,
- // CancelTime = DateTime.Now,
- // Operator = App.User.UserName,
- // OriginalPickingRecordId = pickingRecordId,
- // MaterielCode = materielCode,
- // Reason = reason
- //};
- //await Db.Insertable(cancelHistory).ExecuteCommandAsync();
- }
-
- /// <summary>
- /// 鎷嗗寘閾鹃」
- /// </summary>
- public class SplitChainItem
- {
- public Dt_SplitPackageRecord SplitRecord { get; set; }
- public string OriginalBarcode { get; set; }
- public string NewBarcode { get; set; }
- public decimal SplitQuantity { get; set; }
- }
// 鑾峰彇鏈嫞閫夊垪琛�
public async Task<List<Dt_OutStockLockInfo>> GetUnpickedList(string orderNo, string palletCode)
{
@@ -1169,186 +146,1525 @@
return summary;
}
+
+ #region 鏍稿績涓氬姟娴佺▼
/// <summary>
- /// 鑾峰彇鎷i�夊巻鍙�
+ /// 鎷i��
/// </summary>
- public async Task<List<Dt_PickingRecord>> GetPickingHistory(int orderId)
+ /// <param name="orderNo"></param>
+ /// <param name="palletCode"></param>
+ /// <param name="barcode"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> ConfirmPicking(string orderNo, string palletCode, string barcode)
{
- // 閫氳繃鍑哄簱鍗旾D鏌ヨ鐩稿叧鐨勬嫞閫夊巻鍙�
- // 娉ㄦ剰锛欴t_PickingRecord 涓病鏈夌洿鎺ュ瓨鍌∣rderId锛岄渶瑕侀�氳繃鍑哄簱鍗曟槑缁嗗叧鑱�
- var detailIds = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .Where(d => d.OrderId == orderId)
- .Select(d => d.Id)
- .ToListAsync();
-
- return await Db.Queryable<Dt_PickingRecord>()
- .Where(p => detailIds.Contains(p.OrderDetailId))
- .OrderByDescending(p => p.PickTime)
- .ToListAsync();
- }
-
-
- /// <summary>
- /// 鑾峰彇鎵樼洏鐨勫嚭搴撶姸鎬佷俊鎭�
- /// </summary>
- public async Task<WebResponseContent> GetPalletOutboundStatus(string palletCode)
- {
- // 鑾峰彇鎵樼洏鐨勯攣瀹氫俊鎭�
- var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.PalletCode == palletCode)
- .ToListAsync();
-
- // 鑾峰彇鎵樼洏搴撳瓨淇℃伅
- var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
- .Includes(x => x.Details)
- .Where(x => x.PalletCode == palletCode)
- .FirstAsync();
-
- if (stockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒版墭鐩樹俊鎭�");
-
- // 璁$畻鍚勭鏁伴噺
- var totalStockQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
- var totalOutboundQuantity = stockInfo.Details.Sum(x => x.OutboundQuantity);
- var totalLockedQuantity = lockInfos.Where(x => x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
- .Sum(x => x.AssignQuantity - x.PickedQty);
- var totalPickedQuantity = lockInfos.Sum(x => x.PickedQty);
-
- var result = new
+ try
{
- PalletCode = palletCode,
- LocationCode = stockInfo.LocationCode,
- StockStatus = stockInfo.StockStatus,
- TotalStockQuantity = totalStockQuantity,
- TotalOutboundQuantity = totalOutboundQuantity,
- TotalLockedQuantity = totalLockedQuantity,
- TotalPickedQuantity = totalPickedQuantity,
- AvailableQuantity = totalStockQuantity - totalOutboundQuantity,
- LockInfos = lockInfos.Select(x => new
- {
- x.Id,
- x.MaterielCode,
- x.OrderDetailId,
- x.AssignQuantity,
- x.PickedQty,
- x.Status,
- x.CurrentBarcode,
- x.IsSplitted
- }).ToList(),
- StockDetails = stockInfo.Details.Select(x => new
- {
- x.Barcode,
- x.MaterielCode,
- StockQuantity = x.StockQuantity,
- OutboundQuantity = x.OutboundQuantity,
- AvailableQuantity = x.StockQuantity - x.OutboundQuantity
- }).ToList()
- };
+ _unitOfWorkManage.BeginTran();
+
+ var validationResult = await ValidatePickingRequest(orderNo, palletCode, barcode);
+ if (!validationResult.IsValid)
+ return WebResponseContent.Instance.Error(validationResult.ErrorMessage);
- return WebResponseContent.Instance.OK(null, result);
+ var (lockInfo, orderDetail, stockDetail) = validationResult.Data;
+
+ // 璁$畻瀹為檯鎷i�夋暟閲�
+ var quantityResult = await CalculateActualPickingQuantity(lockInfo, orderDetail, stockDetail);
+ if (!quantityResult.IsValid)
+ return WebResponseContent.Instance.Error(quantityResult.ErrorMessage);
+
+ var (actualQty, adjustedReason) = quantityResult.Data;
+
+ var overPickingValidation = await ValidateOverPicking(orderDetail.Id, actualQty);
+ if (!overPickingValidation.IsValid)
+ {
+ return WebResponseContent.Instance.Error(overPickingValidation.ErrorMessage);
+ }
+
+ // 鎵ц鍒嗘嫞閫昏緫
+ var pickingResult = await ExecutePickingLogic(lockInfo, orderDetail, stockDetail, orderNo, palletCode, barcode, actualQty);
+
+ // 鏇存柊鐩稿叧鏁版嵁
+ await UpdateOrderRelatedData(orderDetail.Id, pickingResult.ActualPickedQty, orderNo);
+
+ // 璁板綍鎿嶄綔鍘嗗彶
+ await RecordPickingHistory(pickingResult, orderNo, palletCode);
+
+ _unitOfWorkManage.CommitTran();
+
+ return CreatePickingResponse(pickingResult, adjustedReason);
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError($"ConfirmPicking澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Barcode: {barcode}, Error: {ex.Message}");
+ return WebResponseContent.Instance.Error($"鎷i�夌‘璁ゅけ璐ワ細{ex.Message}");
+ }
}
-
/// <summary>
- /// 鐩存帴鍑哄簱 - 鏁翠釜鎵樼洏鍑哄簱锛屾竻绌哄簱瀛�
+ /// 鍙栨秷鎷i��
/// </summary>
- public async Task<WebResponseContent> DirectOutbound(DirectOutboundRequest request)
+ /// <param name="orderNo"></param>
+ /// <param name="palletCode"></param>
+ /// <param name="barcode"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> CancelPicking(string orderNo, string palletCode, string barcode)
+ {
+ try
+ {
+ if (await IsPalletReturned(palletCode))
+ {
+ return WebResponseContent.Instance.Error($"鎵樼洏{palletCode}宸茬粡鍥炲簱锛屼笉鑳藉彇娑堝垎鎷�");
+ }
+ _unitOfWorkManage.BeginTran();
+
+ // 1. 鍓嶇疆楠岃瘉
+ var validationResult = await ValidateCancelRequest(orderNo, palletCode, barcode);
+ if (!validationResult.IsValid)
+ return WebResponseContent.Instance.Error(validationResult.ErrorMessage);
+
+ var (pickingRecord, lockInfo, orderDetail) = validationResult.Data;
+
+ // 2. 鎵ц鍙栨秷閫昏緫
+ await ExecuteCancelLogic(lockInfo, pickingRecord, orderDetail, orderNo);
+
+ _unitOfWorkManage.CommitTran();
+
+ return WebResponseContent.Instance.OK($"鍙栨秷鍒嗘嫞鎴愬姛锛屾仮澶嶆暟閲忥細{pickingRecord.PickQuantity}");
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError($"CancelPicking澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Barcode: {barcode}, Error: {ex.Message}");
+ return WebResponseContent.Instance.Error($"鍙栨秷鍒嗘嫞澶辫触锛歿ex.Message}");
+ }
+ }
+ /// <summary>
+ /// 鍥炲簱
+ /// </summary>
+ /// <param name="orderNo"></param>
+ /// <param name="palletCode"></param>
+ /// <param name="reason"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> ReturnRemaining(string orderNo, string palletCode, string reason)
{
try
{
_unitOfWorkManage.BeginTran();
- var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
- .Includes(x => x.Details)
- .Where(x => x.PalletCode == request.PalletCode).FirstAsync();
+ // 1. 鍩虹楠岃瘉
+ if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode))
+ return WebResponseContent.Instance.Error("璁㈠崟鍙峰拰鎵樼洏鐮佷笉鑳戒负绌�");
+
+ // 2. 鑾峰彇搴撳瓨鍜屼换鍔′俊鎭�
+ var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>().FirstAsync(x => x.PalletCode == palletCode);
if (stockInfo == null)
- return WebResponseContent.Instance.Error("鏈壘鍒版墭鐩樺簱瀛樹俊鎭�");
+ return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩� {palletCode} 瀵瑰簲鐨勫簱瀛樹俊鎭�");
+ var task = await GetCurrentTask(orderNo, palletCode);
+ if (task == null)
+ return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
- var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == request.OrderNo && x.PalletCode == request.PalletCode)
- .ToListAsync();
+ // 3. 鍒嗘瀽闇�瑕佸洖搴撶殑璐х墿
+ var returnAnalysis = await AnalyzeReturnItems(orderNo, palletCode, stockInfo.Id);
+ if (!returnAnalysis.HasItemsToReturn)
+ return await HandleNoReturnItems(orderNo, palletCode,task);
+ // 4. 鎵ц鍥炲簱鎿嶄綔
+ await ExecuteReturnOperations(orderNo, palletCode, stockInfo, task, returnAnalysis);
- foreach (var lockInfo in lockInfos)
- {
- if (lockInfo.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
- {
- lockInfo.PickedQty = lockInfo.AssignQuantity;
- }
- lockInfo.Status = (int)OutLockStockStatusEnum.宸插嚭搴�;
- await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .Where(x => x.Id == lockInfo.OrderDetailId)
- .FirstAsync();
- if (orderDetail != null)
- {
- orderDetail.OverOutQuantity += lockInfo.PickedQty;
- orderDetail.LockQuantity -= lockInfo.PickedQty;
- orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
- orderDetail.LockQuantity = 0;
- await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
- }
- }
- var groupDetails = lockInfos.GroupBy(x => x.OrderDetailId).Select(x => new
- {
- OrderDetailId = x.Key,
- TotalQuantity = x.Sum(o => o.PickedQty)
- }).ToList();
- foreach (var item in groupDetails)
- {
- var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.Id == item.OrderDetailId).FirstAsync();
- if (orderDetail != null)
- {
- orderDetail.OverOutQuantity = item.TotalQuantity;
- orderDetail.LockQuantity = 0;
- orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
- await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
- }
- }
-
- await CheckAndUpdateOrderStatus(request.OrderNo);
-
- var lockInfoIds = lockInfos.Select(x => x.Id).ToList();
- var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
- .Where(x => lockInfoIds.Contains(x.OutStockLockInfoId) &&
- x.Status == (int)SplitPackageStatusEnum.宸叉媶鍖�)
- .ToListAsync();
-
- foreach (var record in splitRecords)
- {
- record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
- await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
- }
-
-
- var location = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
- .Where(x => x.LocationCode == stockInfo.LocationCode)
- .FirstAsync();
- if (location != null)
- {
- location.LocationStatus = (int)LocationStatusEnum.Free;
- await _locationInfoService.Db.Updateable(location).ExecuteCommandAsync();
- }
-
- foreach (var detail in stockInfo.Details)
- {
- await _stockInfoDetailService.Db.Deleteable(detail).ExecuteCommandAsync();
- }
- await _stockInfoService.Db.Deleteable(stockInfo).ExecuteCommandAsync();
-
-
+ // 5. 鍒涘缓鍥炲簱浠诲姟
+ await CreateReturnTaskAndHandleESS(orderNo, palletCode, task, returnAnalysis);
_unitOfWorkManage.CommitTran();
- return WebResponseContent.Instance.OK("鐩存帴鍑哄簱鎴愬姛");
+
+ // 6. 鏇存柊璁㈠崟鐘舵�侊紙涓嶈Е鍙慚ES鍥炰紶锛�
+ await UpdateOrderStatusForReturn(orderNo);
+
+ return WebResponseContent.Instance.OK($"鍥炲簱鎿嶄綔鎴愬姛锛屽叡鍥炲簱鏁伴噺锛歿returnAnalysis.TotalReturnQty}");
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
- return WebResponseContent.Instance.Error($"鐩存帴鍑哄簱澶辫触: {ex.Message}");
+ _logger.LogError($"ReturnRemaining澶辫触 - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}");
+ return WebResponseContent.Instance.Error($"鍥炲簱鎿嶄綔澶辫触: {ex.Message}");
}
+ }
+
+ #endregion
+
+ #region 鍒嗘嫞纭绉佹湁鏂规硶
+
+ private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>> ValidatePickingRequest(string orderNo, string palletCode, string barcode)
+ {
+ // 1. 鍩虹鍙傛暟楠岃瘉
+ if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode) || string.IsNullOrEmpty(barcode))
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error("璁㈠崟鍙枫�佹墭鐩樼爜鍜屾潯鐮佷笉鑳戒负绌�");
+
+ // 2. 鏌ユ壘鏈夋晥鐨勯攣瀹氫俊鎭�
+ var lockInfo = await FindValidLockInfo(orderNo, palletCode, barcode);
+ if (lockInfo == null)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏈壘鍒版湁鏁堢殑閿佸畾淇℃伅");
+
+ // 3. 妫�鏌ヨ鍗曠姸鎬�
+ var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ .Where(x => x.OrderNo == orderNo)
+ .FirstAsync();
+
+ if (order?.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"璁㈠崟{orderNo}宸插畬鎴愶紝涓嶈兘缁х画鍒嗘嫞");
+
+ // 4. 鑾峰彇璁㈠崟鏄庣粏
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == lockInfo.OrderDetailId);
+
+ if (orderDetail == null)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏈壘鍒拌鍗曟槑缁�");
+
+ // 5. 妫�鏌ヨ鍗曟槑缁嗘暟閲�
+ if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"璁㈠崟鏄庣粏闇�姹傛暟閲忓凡婊¤冻");
+
+ // 6. 鑾峰彇搴撳瓨鏄庣粏
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId &&
+ x.Status != StockStatusEmun.鍏ュ簱纭.ObjToInt())
+ .FirstAsync();
+
+ if (stockDetail == null)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
+
+ // 7. 妫�鏌ュ簱瀛樼姸鎬佸拰鏁伴噺
+ if (stockDetail.StockQuantity <= 0)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}搴撳瓨涓嶈冻");
+
+ if (stockDetail.Status != StockStatusEmun.鍑哄簱閿佸畾.ObjToInt())
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}鐘舵�佷笉姝g‘锛屾棤娉曞垎鎷�");
+
+ // 8. 妫�鏌ユ槸鍚﹂噸澶嶅垎鎷�
+ var existingPicking = await Db.Queryable<Dt_PickingRecord>()
+ .Where(x => x.Barcode == barcode && x.OrderNo == orderNo && x.PalletCode == palletCode && x.OutStockLockId == lockInfo.Id)
+ .FirstAsync();
+
+ if (existingPicking != null)
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"鏉$爜{barcode}宸茬粡鍒嗘嫞杩�");
+
+ return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Success((lockInfo, orderDetail, stockDetail));
+ }
+
+ private async Task<Dt_OutStockLockInfo> FindValidLockInfo(string orderNo, string palletCode, string barcode)
+ {
+ // 浼樺厛鏌ユ壘绮剧‘鍖归厤鐨勮褰�
+ var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == orderNo &&
+ it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
+ it.PalletCode == palletCode &&
+ it.CurrentBarcode == barcode &&
+ it.AssignQuantity > it.PickedQty).FirstAsync();
+
+ if (lockInfo == null)
+ {
+ // 鏌ユ壘鍚屼竴璁㈠崟涓嬬殑璁板綍
+ lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == orderNo && it.CurrentBarcode == barcode && it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� && it.AssignQuantity > it.PickedQty).FirstAsync();
+
+ if (lockInfo == null)
+ {
+ // 妫�鏌ユ槸鍚﹀凡缁忓畬鎴愬垎鎷�
+ var completedLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.CurrentBarcode == barcode &&
+ (it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� ||
+ it.PickedQty >= it.AssignQuantity)).FirstAsync();
+
+ if (completedLockInfo != null)
+ throw new Exception($"鏉$爜{barcode}宸茬粡瀹屾垚鍒嗘嫞锛屼笉鑳介噸澶嶅垎鎷�");
+ else
+ return null;
+ }
+ }
+
+ return lockInfo;
+ }
+
+ private async Task<ValidationResult<(decimal, string)>> CalculateActualPickingQuantity(
+ Dt_OutStockLockInfo lockInfo, Dt_OutboundOrderDetail orderDetail, Dt_StockInfoDetail stockDetail)
+ {
+ decimal plannedQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
+ decimal remainingOrderQty = orderDetail.NeedOutQuantity - orderDetail.OverOutQuantity;
+ decimal stockQuantity = stockDetail.StockQuantity;
+
+ if (plannedQty <= 0)
+ {
+ return ValidationResult<(decimal, string)>.Error($"璁″垝鎷i�夋暟閲忓繀椤诲ぇ浜�0锛屽綋鍓�: {plannedQty}");
+ }
+
+ if (remainingOrderQty <= 0)
+ {
+ return ValidationResult<(decimal, string)>.Error($"璁㈠崟鍓╀綑闇�姹傛暟閲忓繀椤诲ぇ浜�0锛屽綋鍓�: {remainingOrderQty}");
+ }
+
+ if (stockQuantity <= 0)
+ {
+ return ValidationResult<(decimal, string)>.Error($"搴撳瓨鏁伴噺蹇呴』澶т簬0锛屽綋鍓�: {stockQuantity}");
+ }
+ // 涓夐噸妫�鏌ワ細鍙栨渶灏忓��
+ decimal actualQty = plannedQty;
+ string adjustedReason = null;
+
+ if (plannedQty > remainingOrderQty)
+ {
+ actualQty = remainingOrderQty;
+ adjustedReason = $"璁㈠崟鏁伴噺闄愬埗锛氫粠{plannedQty}璋冩暣涓簕actualQty}";
+ }
+ if (actualQty > stockQuantity)
+ {
+ actualQty = stockQuantity;
+ adjustedReason = adjustedReason != null
+ ? $"{adjustedReason}锛屽簱瀛樻暟閲忛檺鍒讹細杩涗竴姝ヨ皟鏁翠负{actualQty}"
+ : $"搴撳瓨鏁伴噺闄愬埗锛氫粠{plannedQty}璋冩暣涓簕actualQty}";
+ }
+ if (actualQty <= 0)
+ {
+ return ValidationResult<(decimal, string)>.Error($"鏃犳硶鍒嗘嫞锛氳绠楀悗鐨勫疄闄呮暟閲忎负{actualQty}");
+ }
+ decimal projectedOverOut = orderDetail.OverOutQuantity + actualQty;
+ if (projectedOverOut > orderDetail.NeedOutQuantity)
+ {
+ // 濡傛灉浼氳秴鎷o紝璋冩暣涓哄垰濂芥弧瓒抽渶姹傜殑鏁伴噺
+ actualQty = orderDetail.NeedOutQuantity - orderDetail.OverOutQuantity;
+ adjustedReason = adjustedReason != null
+ ? $"{adjustedReason}锛岄槻瓒呮嫞闄愬埗锛氭渶缁堣皟鏁翠负{actualQty}"
+ : $"闃茶秴鎷i檺鍒讹細浠巤plannedQty}璋冩暣涓簕actualQty}";
+ }
+
+ if (adjustedReason != null)
+ {
+ _logger.LogWarning($"鍒嗘嫞鏁伴噺璋冩暣锛歿adjustedReason}锛岃鍗晎orderDetail.NeedOutQuantity}锛屽凡鍑哄簱{orderDetail.OverOutQuantity}锛屽簱瀛榹stockQuantity}");
+ }
+
+ return ValidationResult<(decimal, string)>.Success((actualQty, adjustedReason));
+ }
+
+ /// <summary>
+ /// 涓撻棬楠岃瘉鏄惁浼氬彂鐢熻秴鎷�
+ /// </summary>
+ private async Task<ValidationResult<bool>> ValidateOverPicking(int orderDetailId, decimal pickingQty)
+ {
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == orderDetailId);
+
+ if (orderDetail == null)
+ return ValidationResult<bool>.Error("鏈壘鍒拌鍗曟槑缁�");
+
+ decimal projectedOverOut = orderDetail.OverOutQuantity + pickingQty;
+
+ if (projectedOverOut > orderDetail.NeedOutQuantity)
+ {
+ return ValidationResult<bool>.Error(
+ $"鍒嗘嫞鍚庡皢瀵艰嚧瓒呮嫞锛氬綋鍓嶅凡鍑哄簱{orderDetail.OverOutQuantity}锛屾湰娆″垎鎷pickingQty}锛屽悎璁projectedOverOut}锛岃秴杩囬渶姹倇orderDetail.NeedOutQuantity}");
+ }
+
+ return ValidationResult<bool>.Success(true);
+ }
+ private async Task<PickingResult> ExecutePickingLogic(
+ Dt_OutStockLockInfo lockInfo, Dt_OutboundOrderDetail orderDetail, Dt_StockInfoDetail stockDetail,
+ string orderNo, string palletCode, string barcode, decimal actualQty)
+ {
+ decimal stockQuantity = stockDetail.StockQuantity;
+ var result = new PickingResult
+ {
+ FinalLockInfo = lockInfo,
+ FinalBarcode = barcode,
+ FinalStockId = stockDetail.Id,
+ ActualPickedQty = actualQty
+ };
+
+ if (actualQty < stockQuantity)
+ {
+ await HandleSplitPacking(lockInfo, stockDetail, actualQty, stockQuantity, result);
+ }
+ else if (actualQty == stockQuantity)
+ {
+ await HandleFullPicking(lockInfo, stockDetail, actualQty, result);
+ }
+ else
+ {
+ await HandlePartialPicking(lockInfo, stockDetail, actualQty, stockQuantity, result);
+ }
+
+ return result;
+ }
+
+ private async Task HandleSplitPacking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+ decimal actualQty, decimal stockQuantity, PickingResult result)
+ {
+ decimal remainingStockQty = stockQuantity - actualQty;
+
+ // 1. 鏇存柊鍘熸潯鐮佸簱瀛�
+ stockDetail.StockQuantity = remainingStockQty;
+ stockDetail.OutboundQuantity = remainingStockQty;
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ // 2. 鐢熸垚鏂版潯鐮�
+ string newBarcode = await GenerateNewBarcode();
+
+ // 3. 鍒涘缓鏂伴攣瀹氫俊鎭�
+ var newLockInfo = await CreateSplitLockInfo(lockInfo, actualQty, newBarcode);
+
+ // 4. 璁板綍鎷嗗寘鍘嗗彶
+ await RecordSplitHistory(lockInfo, stockDetail, actualQty, remainingStockQty, newBarcode);
+
+ // 5. 鏇存柊鍘熼攣瀹氫俊鎭�
+ lockInfo.AssignQuantity = remainingStockQty;
+ lockInfo.PickedQty = 0;
+ lockInfo.Operator = App.User.UserName;
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ // 6. 璁剧疆缁撴灉
+ result.FinalLockInfo = newLockInfo;
+ result.FinalBarcode = newBarcode;
+ result.SplitResults.AddRange(CreateSplitResults(lockInfo, actualQty, remainingStockQty, newBarcode, stockDetail.Barcode));
+ }
+
+ private async Task HandleFullPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+ decimal actualQty, PickingResult result)
+ {
+ // 1. 鏇存柊搴撳瓨
+ stockDetail.StockQuantity = 0;
+ stockDetail.OutboundQuantity = 0;
+ stockDetail.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ // 2. 鏇存柊閿佸畾淇℃伅
+ lockInfo.PickedQty += actualQty;
+ lockInfo.Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�;
+ lockInfo.Operator = App.User.UserName;
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+ }
+
+ private async Task HandlePartialPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+ decimal actualQty, decimal stockQuantity, PickingResult result)
+ {
+ decimal stockOutQty = stockQuantity;
+ decimal remainingAssignQty = actualQty - stockQuantity;
+
+ // 1. 鏇存柊搴撳瓨
+ stockDetail.StockQuantity = 0;
+ stockDetail.OutboundQuantity = 0;
+ stockDetail.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+
+ // 2. 鏇存柊閿佸畾淇℃伅
+ lockInfo.PickedQty += stockOutQty;
+ lockInfo.AssignQuantity = remainingAssignQty;
+ lockInfo.Operator = App.User.UserName;
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ // 3. 鏇存柊鎷嗗寘璁板綍鐘舵��
+ await UpdateSplitRecordsStatus(stockDetail.Barcode);
+
+ result.ActualPickedQty = stockOutQty;
+ }
+
+ private async Task UpdateOrderRelatedData(int orderDetailId, decimal pickedQty, string orderNo)
+ {
+ // 鑾峰彇鏈�鏂扮殑璁㈠崟鏄庣粏鏁版嵁
+ var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == orderDetailId);
+
+ decimal newOverOutQuantity = currentOrderDetail.OverOutQuantity + pickedQty;
+ decimal newPickedQty = currentOrderDetail.PickedQty + pickedQty;
+
+ if (newOverOutQuantity > currentOrderDetail.NeedOutQuantity)
+ {
+
+ _logger.LogError($"闃茶秴鎷f鏌ュけ璐� - OrderDetailId: {orderDetailId}, 宸插嚭搴�: {newOverOutQuantity}, 闇�姹�: {currentOrderDetail.NeedOutQuantity}, 鏈鍒嗘嫞: {pickedQty}");
+
+
+ decimal adjustedQty = currentOrderDetail.NeedOutQuantity - currentOrderDetail.OverOutQuantity;
+
+ if (adjustedQty > 0)
+ {
+ _logger.LogWarning($"鑷姩璋冩暣鍒嗘嫞鏁伴噺闃叉瓒呮嫞锛氫粠{pickedQty}璋冩暣涓簕adjustedQty}");
+ newOverOutQuantity = currentOrderDetail.NeedOutQuantity;
+ newPickedQty = currentOrderDetail.PickedQty + adjustedQty;
+ }
+ else
+ {
+ throw new Exception($"鍒嗘嫞鍚庡皢瀵艰嚧宸插嚭搴撴暟閲�({newOverOutQuantity})瓒呰繃璁㈠崟闇�姹傛暟閲�({currentOrderDetail.NeedOutQuantity})锛屼笖鏃犳硶鑷姩璋冩暣");
+ }
+ }
+
+ // 鏇存柊璁㈠崟鏄庣粏
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ PickedQty = newPickedQty,
+ OverOutQuantity = newOverOutQuantity,
+ })
+ .Where(it => it.Id == orderDetailId)
+ .ExecuteCommandAsync();
+
+ // 妫�鏌ュ苟鏇存柊璁㈠崟鐘舵��
+ await CheckAndUpdateOrderStatus(orderNo);
+ }
+
+ private async Task RecordPickingHistory(PickingResult result, string orderNo, string palletCode)
+ {
+ var task = await _taskRepository.Db.Queryable<Dt_Task>()
+ .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode)
+ .FirstAsync();
+
+ if (result.FinalLockInfo.Id <= 0)
+ {
+ throw new Exception($"閿佸畾淇℃伅ID鏃犳晥: {result.FinalLockInfo.Id}锛屾棤娉曡褰曟嫞閫夊巻鍙�");
+ }
+
+ var pickingHistory = new Dt_PickingRecord
+ {
+ FactoryArea = result.FinalLockInfo.FactoryArea,
+ TaskNo = task?.TaskNum ?? 0,
+ LocationCode = task?.SourceAddress ?? "",
+ StockId = result.FinalStockId,
+ OrderNo = orderNo,
+ OrderDetailId = result.FinalLockInfo.OrderDetailId,
+ PalletCode = palletCode,
+ Barcode = result.FinalBarcode,
+ MaterielCode = result.FinalLockInfo.MaterielCode,
+ PickQuantity = result.ActualPickedQty,
+ PickTime = DateTime.Now,
+ Operator = App.User.UserName,
+ OutStockLockId = result.FinalLockInfo.Id
+ };
+
+ await Db.Insertable(pickingHistory).ExecuteCommandAsync();
+ }
+
+ #endregion
+
+ #region 鍙栨秷鍒嗘嫞绉佹湁鏂规硶
+
+ private async Task<ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>> ValidateCancelRequest(string orderNo, string palletCode, string barcode)
+ {
+ // 鍩虹鍙傛暟楠岃瘉
+ if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode) || string.IsNullOrEmpty(barcode))
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("璁㈠崟鍙枫�佹墭鐩樼爜鍜屾潯鐮佷笉鑳戒负绌�");
+
+ // 鏌ユ壘鎷i�夎褰�
+ var pickingRecord = await Db.Queryable<Dt_PickingRecord>()
+ .Where(it => it.OrderNo == orderNo &&
+ it.PalletCode == palletCode &&
+ it.Barcode == barcode)
+ .OrderByDescending(it => it.PickTime)
+ .FirstAsync();
+
+ if (pickingRecord == null)
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("鏈壘鍒板搴旂殑鎷i�夎褰�");
+
+ if (pickingRecord.PickQuantity <= 0)
+ {
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鎷i�夎褰曟暟閲忔棤鏁�: {pickingRecord.PickQuantity}");
+ }
+ // 鏌ユ壘閿佸畾淇℃伅
+ var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.Id == pickingRecord.OutStockLockId)
+ .FirstAsync();
+
+ if (lockInfo == null)
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("鏈壘鍒板搴旂殑鍑哄簱閿佸畾淇℃伅");
+
+ if (lockInfo.PickedQty < pickingRecord.PickQuantity)
+ {
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error(
+ $"鍙栨秷鏁伴噺({pickingRecord.PickQuantity})瓒呰繃閿佸畾淇℃伅鐨勫凡鎷i�夋暟閲�({lockInfo.PickedQty})");
+ }
+ // 妫�鏌ョ姸鎬佹槸鍚﹀厑璁稿彇娑�
+ if (lockInfo.Status != (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("褰撳墠鐘舵�佷笉鍏佽鍙栨秷鍒嗘嫞");
+
+ var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().FirstAsync(x => x.OrderNo == orderNo);
+
+ if (order?.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error("璁㈠崟宸插嚭搴撳畬鎴愶紝涓嶅厑璁稿彇娑堝垎鎷�");
+
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().FirstAsync(x => x.Id == pickingRecord.OrderDetailId);
+
+ if (orderDetail == null)
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鏈壘鍒拌鍗曟槑缁嗭紝ID: {pickingRecord.OrderDetailId}");
+
+ // 妫�鏌ヨ鍗曟槑缁嗙殑宸叉嫞閫夋暟閲忔槸鍚﹁冻澶熷彇娑�
+ if (orderDetail.PickedQty < pickingRecord.PickQuantity)
+ {
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鍙栨秷鏁伴噺({pickingRecord.PickQuantity})瓒呰繃璁㈠崟鏄庣粏鐨勫凡鎷i�夋暟閲�({orderDetail.PickedQty})");
+ }
+
+ // 妫�鏌ヨ鍗曟槑缁嗙殑宸插嚭搴撴暟閲忔槸鍚﹁冻澶熷彇娑�
+ if (orderDetail.OverOutQuantity < pickingRecord.PickQuantity)
+ {
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鍙栨秷鏁伴噺({pickingRecord.PickQuantity})瓒呰繃璁㈠崟鏄庣粏鐨勫凡鍑哄簱鏁伴噺({orderDetail.OverOutQuantity})");
+ }
+
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>().FirstAsync(it => it.Barcode == barcode && it.StockId == pickingRecord.StockId);
+
+ if (stockDetail != null)
+ {
+ // 妫�鏌ュ簱瀛樼姸鎬� - 濡傛灉鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
+ if (stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ {
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Error($"鏉$爜{barcode}宸茬粡鍥炲簱锛屼笉鑳藉彇娑堝垎鎷�");
+ }
+ }
+
+ return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Success((pickingRecord, lockInfo, orderDetail));
+ }
+ /// <summary>
+ /// 妫�鏌ユ潯鐮佹槸鍚﹀凡缁忓洖搴�
+ /// </summary>
+ private async Task<bool> IsBarcodeReturned(string barcode, int stockId)
+ {
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == barcode && it.StockId == stockId)
+ .FirstAsync();
+
+ if (stockDetail == null)
+ return false;
+
+ // 濡傛灉鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
+ return stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+
+ /// <summary>
+ /// 妫�鏌ラ攣瀹氫俊鎭搴旂殑鏉$爜鏄惁宸茬粡鍥炲簱
+ /// </summary>
+ private async Task<bool> IsLockInfoReturned(Dt_OutStockLockInfo lockInfo)
+ {
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
+ .FirstAsync();
+
+ if (stockDetail == null)
+ return false;
+
+ return stockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ stockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+ private async Task ExecuteCancelLogic(Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord,
+ Dt_OutboundOrderDetail orderDetail, string orderNo)
+ {
+ decimal cancelQty = pickingRecord.PickQuantity;
+
+ var currentStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == pickingRecord.Barcode && it.StockId == pickingRecord.StockId)
+ .FirstAsync();
+
+ if (currentStockDetail != null &&
+ (currentStockDetail.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ currentStockDetail.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()))
+ {
+ throw new Exception($"鏉$爜{pickingRecord.Barcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堝垎鎷�");
+ }
+ // 妫�鏌ュ彇娑堝悗鏁伴噺涓嶄細涓鸿礋鏁�
+ decimal newOverOutQuantity = orderDetail.OverOutQuantity - cancelQty;
+ decimal newPickedQty = orderDetail.PickedQty - cancelQty;
+
+ if (newOverOutQuantity < 0 || newPickedQty < 0)
+ {
+ throw new Exception($"鍙栨秷鍒嗘嫞灏嗗鑷存暟鎹紓甯革細宸插嚭搴搟newOverOutQuantity}锛屽凡鎷i�墈newPickedQty}");
+ }
+
+ // 澶勭悊涓嶅悓绫诲瀷鐨勫彇娑�
+ if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
+ {
+ await HandleSplitBarcodeCancel(lockInfo, pickingRecord, cancelQty);
+ }
+ else
+ {
+ await HandleNormalBarcodeCancel(lockInfo, pickingRecord, cancelQty);
+ }
+
+ // 鏇存柊璁㈠崟鏄庣粏
+ await UpdateOrderDetailOnCancel(pickingRecord.OrderDetailId, cancelQty);
+
+ // 鍒犻櫎鎷i�夎褰�
+ await Db.Deleteable<Dt_PickingRecord>()
+ .Where(x => x.Id == pickingRecord.Id)
+ .ExecuteCommandAsync();
+
+ // 閲嶆柊妫�鏌ヨ鍗曠姸鎬�
+ await UpdateOrderStatusForReturn(orderNo);
+ }
+
+ private async Task HandleSplitBarcodeCancel(Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, decimal cancelQty)
+ {
+ // 鏌ユ壘鐖堕攣瀹氫俊鎭�
+ var parentLockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.Id == lockInfo.ParentLockId.Value)
+ .FirstAsync();
+
+ if (parentLockInfo == null)
+ throw new Exception("鏈壘鍒扮埗閿佸畾淇℃伅锛屾棤娉曞彇娑堟媶鍖呭垎鎷�");
+
+ if (await IsLockInfoReturned(parentLockInfo))
+ {
+ throw new Exception($"鐖舵潯鐮亄parentLockInfo.CurrentBarcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堟媶鍖呭垎鎷�");
+ }
+ if (await IsLockInfoReturned(lockInfo))
+ {
+ throw new Exception($"鎷嗗寘鏉$爜{lockInfo.CurrentBarcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堟媶鍖呭垎鎷�");
+ }
+ // 鎭㈠鐖堕攣瀹氫俊鎭殑鍒嗛厤鏁伴噺
+ parentLockInfo.AssignQuantity += cancelQty;
+ await _outStockLockInfoService.Db.Updateable(parentLockInfo).ExecuteCommandAsync();
+
+ // 鎭㈠搴撳瓨
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == parentLockInfo.CurrentBarcode && x.StockId == parentLockInfo.StockId)
+ .FirstAsync();
+
+ if (stockDetail != null)
+ {
+ stockDetail.StockQuantity += cancelQty;
+ stockDetail.OutboundQuantity = stockDetail.StockQuantity;
+ stockDetail.Status = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+ }
+
+ // 鏇存柊鎷嗗寘璁板綍鐘舵��
+ await _splitPackageService.Db.Updateable<Dt_SplitPackageRecord>()
+ .SetColumns(x => new Dt_SplitPackageRecord
+ {
+ Status = (int)SplitPackageStatusEnum.宸叉挙閿�,
+ IsReverted = true,
+ })
+ .Where(x => x.NewBarcode == lockInfo.CurrentBarcode && !x.IsReverted)
+ .ExecuteCommandAsync();
+
+ // 鍒犻櫎鎷嗗寘浜х敓鐨勯攣瀹氫俊鎭�
+ await _outStockLockInfoService.Db.Deleteable<Dt_OutStockLockInfo>()
+ .Where(x => x.Id == lockInfo.Id)
+ .ExecuteCommandAsync();
+ }
+
+ private async Task HandleNormalBarcodeCancel(Dt_OutStockLockInfo lockInfo, Dt_PickingRecord pickingRecord, decimal cancelQty)
+ {
+ if (await IsLockInfoReturned(lockInfo))
+ {
+ throw new Exception($"鏉$爜{lockInfo.CurrentBarcode}宸茬粡鍥炲簱锛屾棤娉曞彇娑堝垎鎷�");
+ }
+ // 鎭㈠閿佸畾淇℃伅
+ lockInfo.PickedQty -= cancelQty;
+ if (lockInfo.PickedQty < 0) lockInfo.PickedQty = 0;
+
+ lockInfo.Status = (int)OutLockStockStatusEnum.鍑哄簱涓�;
+ await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
+
+ // 鎭㈠搴撳瓨
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.Barcode == pickingRecord.Barcode && x.StockId == pickingRecord.StockId)
+ .FirstAsync();
+
+ if (stockDetail != null)
+ {
+ stockDetail.StockQuantity += cancelQty;
+ stockDetail.OutboundQuantity = stockDetail.StockQuantity;
+ stockDetail.Status = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+ }
+ }
+
+ private async Task UpdateOrderDetailOnCancel(int orderDetailId, decimal cancelQty)
+ {
+ // 鑾峰彇鏈�鏂扮殑璁㈠崟鏄庣粏鏁版嵁
+ var currentOrderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == orderDetailId);
+
+ decimal newOverOutQuantity = currentOrderDetail.OverOutQuantity - cancelQty;
+ decimal newPickedQty = currentOrderDetail.PickedQty - cancelQty;
+
+ // 妫�鏌ュ彇娑堝悗鏁伴噺涓嶄細涓鸿礋鏁�
+ if (newOverOutQuantity < 0 || newPickedQty < 0)
+ {
+ throw new Exception($"鍙栨秷鍒嗘嫞灏嗗鑷村凡鍑哄簱鏁伴噺({newOverOutQuantity})鎴栧凡鎷i�夋暟閲�({newPickedQty})涓鸿礋鏁�");
+ }
+
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ PickedQty = newPickedQty,
+ OverOutQuantity = newOverOutQuantity,
+ })
+ .Where(it => it.Id == orderDetailId)
+ .ExecuteCommandAsync();
+ }
+
+ #endregion
+
+ #region 鍥炲簱鎿嶄綔绉佹湁鏂规硶
+
+ private async Task<Dt_StockInfo> GetStockInfo(string palletCode)
+ {
+ return await _stockInfoService.Db.Queryable<Dt_StockInfo>()
+ .FirstAsync(x => x.PalletCode == palletCode);
+ }
+ /// <summary>
+ /// 妫�鏌ユ暣涓墭鐩樻槸鍚﹀凡缁忓洖搴�
+ /// </summary>
+ private async Task<bool> IsPalletReturned(string palletCode)
+ {
+ var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
+ .Where(x => x.PalletCode == palletCode)
+ .FirstAsync();
+
+ if (stockInfo == null)
+ return false;
+
+ // 濡傛灉鎵樼洏鐘舵�佹槸鍏ュ簱纭鎴栧叆搴撳畬鎴愶紝璇存槑宸茬粡鍥炲簱
+ return stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ stockInfo.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+ private async Task<Dt_Task> GetCurrentTask(string orderNo, string palletCode)
+ {
+ // 鍏堝皾璇曢�氳繃璁㈠崟鍙峰拰鎵樼洏鍙锋煡鎵句换鍔�
+ var task = await _taskRepository.Db.Queryable<Dt_Task>()
+ .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode)
+ .FirstAsync();
+
+ if (task == null)
+ {
+ // 濡傛灉鎵句笉鍒帮紝鍐嶉�氳繃鎵樼洏鍙锋煡鎵�
+ task = await _taskRepository.Db.Queryable<Dt_Task>()
+ .Where(x => x.PalletCode == palletCode)
+ .FirstAsync();
+ }
+
+ return task;
+ }
+
+ private async Task<ReturnAnalysisResult> AnalyzeReturnItems(string orderNo, string palletCode, int stockId)
+ {
+ var result = new ReturnAnalysisResult();
+
+ // 鎯呭喌1锛氳幏鍙栨湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
+ var remainingLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == orderNo &&
+ it.PalletCode == palletCode &&
+ it.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ .ToListAsync();
+
+ if (remainingLocks.Any())
+ {
+ result.HasRemainingLocks = true;
+ result.RemainingLocks = remainingLocks;
+ result.RemainingLocksReturnQty = remainingLocks.Sum(x => x.AssignQuantity - x.PickedQty);
+ }
+
+ // 鎯呭喌2锛氭鏌ユ墭鐩樹笂鏄惁鏈夊叾浠栧簱瀛樿揣鐗�
+ var palletStockGoods = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.StockId == stockId &&
+ (it.Status == StockStatusEmun.鍏ュ簱纭.ObjToInt() ||
+ it.Status == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() ||
+ it.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()))
+ .Where(it => it.StockQuantity > 0)
+ .ToListAsync();
+
+ if (palletStockGoods.Any())
+ {
+ result.HasPalletStockGoods = true;
+ result.PalletStockGoods = palletStockGoods;
+ result.PalletStockReturnQty = palletStockGoods.Sum(x => x.StockQuantity);
+ }
+
+ // 鎯呭喌3锛氭鏌ユ媶鍖呰褰�
+ var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode && !it.IsReverted && it.Status != (int)SplitPackageStatusEnum.宸插洖搴�)
+ .ToListAsync();
+
+ if (splitRecords.Any())
+ {
+ result.HasSplitRecords = true;
+ result.SplitRecords = splitRecords;
+ result.SplitReturnQty = await CalculateSplitReturnQuantity(splitRecords, stockId);
+ }
+
+ result.TotalReturnQty = result.RemainingLocksReturnQty + result.PalletStockReturnQty + result.SplitReturnQty;
+ result.HasItemsToReturn = result.TotalReturnQty > 0;
+
+ return result;
+ }
+
+ private async Task<decimal> CalculateSplitReturnQuantity(List<Dt_SplitPackageRecord> splitRecords, int stockId)
+ {
+ decimal totalQty = 0;
+ var processedBarcodes = new HashSet<string>();
+
+ foreach (var splitRecord in splitRecords)
+ {
+ // 妫�鏌ュ師鏉$爜
+ if (!processedBarcodes.Contains(splitRecord.OriginalBarcode))
+ {
+ var originalStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == splitRecord.OriginalBarcode && it.StockId == stockId)
+ .FirstAsync();
+
+ if (originalStock != null && originalStock.StockQuantity > 0)
+ {
+ totalQty += originalStock.StockQuantity;
+ processedBarcodes.Add(splitRecord.OriginalBarcode);
+ }
+ }
+
+ // 妫�鏌ユ柊鏉$爜
+ if (!processedBarcodes.Contains(splitRecord.NewBarcode))
+ {
+ var newStock = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == splitRecord.NewBarcode && it.StockId == stockId)
+ .FirstAsync();
+
+ if (newStock != null && newStock.StockQuantity > 0)
+ {
+ totalQty += newStock.StockQuantity;
+ processedBarcodes.Add(splitRecord.NewBarcode);
+ }
+ }
+ }
+
+ return totalQty;
+ }
+
+ private async Task<WebResponseContent> HandleNoReturnItems(string orderNo, string palletCode,Dt_Task originalTask)
+ {
+ // 妫�鏌ユ槸鍚︽墍鏈夎揣鐗╅兘宸叉嫞閫夊畬鎴�
+ var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode)
+ .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�);
+
+ if (allPicked)
+ {
+ // 鍒犻櫎鍘熷鍑哄簱浠诲姟
+ await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+ return WebResponseContent.Instance.OK("鎵�鏈夎揣鐗╁凡鎷i�夊畬鎴愶紝鎵樼洏涓虹┖");
+ }
+ else
+ {
+ // 鍒犻櫎鍘熷鍑哄簱浠诲姟
+ await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+ return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖搴撶殑鍓╀綑璐х墿");
+ }
+ //绌烘墭鐩樺浣曞鐞� 杩樻湁涓�涓嚭搴撲换鍔¤澶勭悊銆�
+
+ }
+
+ private async Task ExecuteReturnOperations(string orderNo, string palletCode, Dt_StockInfo stockInfo,
+ Dt_Task task, ReturnAnalysisResult analysis)
+ {
+ // 鎯呭喌1锛氬鐞嗘湭鍒嗘嫞鐨勫嚭搴撻攣瀹氳褰�
+ if (analysis.HasRemainingLocks)
+ {
+ await HandleRemainingLocksReturn(analysis.RemainingLocks, stockInfo.Id);
+
+ // 鍏抽敭锛氭洿鏂拌鍗曟槑缁嗙殑宸叉嫞閫夋暟閲�
+ await UpdateOrderDetailsOnReturn(analysis.RemainingLocks);
+ }
+
+ // 澶勭悊鎵樼洏涓婂叾浠栧簱瀛樿揣鐗�
+ if (analysis.HasPalletStockGoods)
+ {
+ await HandlePalletStockGoodsReturn(analysis.PalletStockGoods);
+ }
+
+ // 澶勭悊鎷嗗寘璁板綍
+ if (analysis.HasSplitRecords)
+ {
+ await HandleSplitRecordsReturn(analysis.SplitRecords, orderNo, palletCode);
+ }
+
+ // 鏇存柊搴撳瓨涓昏〃鐘舵��
+ await UpdateStockInfoStatus(stockInfo);
+ }
+
+ private async Task HandleRemainingLocksReturn(List<Dt_OutStockLockInfo> remainingLocks, int stockId)
+ {
+ var lockIds = remainingLocks.Select(x => x.Id).ToList();
+
+ // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵�佷负鍥炲簱涓�
+ await _outStockLockInfoService.Db.Updateable<Dt_OutStockLockInfo>()
+ .SetColumns(it => new Dt_OutStockLockInfo
+ {
+ Status = (int)OutLockStockStatusEnum.鍥炲簱涓�,
+ })
+ .Where(it => lockIds.Contains(it.Id))
+ .ExecuteCommandAsync();
+
+ // 澶勭悊搴撳瓨璁板綍
+ foreach (var lockInfo in remainingLocks)
+ {
+ decimal returnQty = lockInfo.AssignQuantity - lockInfo.PickedQty;
+
+ // 鏌ユ壘瀵瑰簲鐨勫簱瀛樻槑缁�
+ var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(it => it.Barcode == lockInfo.CurrentBarcode && it.StockId == lockInfo.StockId)
+ .FirstAsync();
+
+ if (stockDetail != null)
+ {
+ // 鎭㈠搴撳瓨鐘舵��
+ stockDetail.OutboundQuantity = Math.Max(0, stockDetail.OutboundQuantity - returnQty);
+ stockDetail.Status = StockStatusEmun.鍏ュ簱纭.ObjToInt();
+ await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync();
+ }
+ else
+ {
+ // 鍒涘缓鏂扮殑搴撳瓨璁板綍
+ var newStockDetail = new Dt_StockInfoDetail
+ {
+ StockId = lockInfo.StockId,
+ MaterielCode = lockInfo.MaterielCode,
+ MaterielName = lockInfo.MaterielName,
+ OrderNo = lockInfo.OrderNo,
+ BatchNo = lockInfo.BatchNo,
+ StockQuantity = returnQty,
+ OutboundQuantity = 0,
+ Barcode = lockInfo.CurrentBarcode,
+ InboundOrderRowNo = "",
+ Status = StockStatusEmun.鍏ュ簱纭.ObjToInt(),
+ SupplyCode = lockInfo.SupplyCode,
+ WarehouseCode = lockInfo.WarehouseCode,
+ Unit = lockInfo.Unit,
+ };
+ await _stockInfoDetailService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
+ }
+ }
+ }
+
+ private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks)
+ {
+ // 鎸夎鍗曟槑缁嗗垎缁�
+ var orderDetailGroups = remainingLocks.GroupBy(x => x.OrderDetailId);
+
+ foreach (var group in orderDetailGroups)
+ {
+ var orderDetailId = group.Key;
+ var totalReturnQty = group.Sum(x => x.AssignQuantity - x.PickedQty);
+
+ // 鑾峰彇褰撳墠璁㈠崟鏄庣粏
+ var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .FirstAsync(x => x.Id == orderDetailId);
+
+ if (orderDetail != null)
+ {
+ // 璋冩暣宸叉嫞閫夋暟閲忓拰宸插嚭搴撴暟閲�
+ decimal newPickedQty = Math.Max(0, orderDetail.PickedQty - totalReturnQty);
+ decimal newOverOutQuantity = Math.Max(0, orderDetail.OverOutQuantity - totalReturnQty);
+
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ PickedQty = newPickedQty,
+ OverOutQuantity = newOverOutQuantity,
+ })
+ .Where(it => it.Id == orderDetailId)
+ .ExecuteCommandAsync();
+ }
+ }
+ }
+
+ private async Task HandlePalletStockGoodsReturn(List<Dt_StockInfoDetail> palletStockGoods)
+ {
+ _logger.LogInformation($"鍥炲簱鎿嶄綔锛氬彂鐜皗palletStockGoods.Count}涓簱瀛樻槑缁嗛渶瑕佸洖搴擄紝绛夊緟AGV鎼繍");
+ foreach (var stockGood in palletStockGoods)
+ {
+ _logger.LogInformation($"寰呭洖搴撹揣鐗� - 鏉$爜: {stockGood.Barcode}, 鏁伴噺: {stockGood.StockQuantity}, 褰撳墠鐘舵��: {stockGood.Status}");
+
+ // 鎭㈠搴撳瓨鐘舵��
+ stockGood.OutboundQuantity = 0;
+ stockGood.Status = StockStatusEmun.鍏ュ簱纭.ObjToInt();
+
+ await _stockInfoDetailService.Db.Updateable(stockGood).ExecuteCommandAsync();
+ }
+ }
+
+ private async Task HandleSplitRecordsReturn(List<Dt_SplitPackageRecord> splitRecords, string orderNo, string palletCode)
+ {
+ // 鏇存柊鎷嗗寘璁板綍鐘舵��
+ await _splitPackageService.Db.Updateable<Dt_SplitPackageRecord>()
+ .SetColumns(x => new Dt_SplitPackageRecord
+ {
+ Status = (int)SplitPackageStatusEnum.宸插洖搴�,
+ })
+ .Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode && !x.IsReverted)
+ .ExecuteCommandAsync();
+ }
+
+ private async Task UpdateStockInfoStatus(Dt_StockInfo stockInfo)
+ {
+ _logger.LogInformation($"鍥炲簱鎿嶄綔锛氭墭鐩榹stockInfo.PalletCode}绛夊緟AGV鍥炲簱鎼繍");
+ // 鏇存柊搴撳瓨涓昏〃鐘舵��
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱纭.ObjToInt();
+ await _stockInfoService.Db.Updateable(stockInfo).ExecuteCommandAsync();
+ }
+ /// <summary>
+ /// 鍒涘缓鍥炲簱浠诲姟
+ /// </summary>
+ /// <param name="orderNo"></param>
+ /// <param name="palletCode"></param>
+ /// <param name="originalTask"></param>
+ /// <param name="analysis"></param>
+ /// <returns></returns>
+ private async Task CreateReturnTaskAndHandleESS(string orderNo, string palletCode, Dt_Task originalTask, ReturnAnalysisResult analysis)
+ {
+ var firstLocation = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
+ .FirstAsync(x => x.LocationCode == originalTask.SourceAddress);
+
+ // 鍒嗛厤鏂拌揣浣�
+ var newLocation = _locationInfoService.AssignLocation(firstLocation.LocationType);
+
+ Dt_Task returnTask = new()
+ {
+ CurrentAddress = stations[originalTask.TargetAddress],
+ Grade = 0,
+ PalletCode = palletCode,
+ NextAddress = "",
+ OrderNo = originalTask.OrderNo,
+ Roadway = newLocation.RoadwayNo,
+ SourceAddress = stations[originalTask.TargetAddress],
+ TargetAddress = newLocation.LocationCode,
+ TaskStatus = TaskStatusEnum.New.ObjToInt(),
+ TaskType = TaskTypeEnum.InPick.ObjToInt(),
+ PalletType = originalTask.PalletType,
+ WarehouseId = originalTask.WarehouseId
+
+ };
+ // 淇濆瓨鍥炲簱浠诲姟
+ await _taskRepository.Db.Insertable(returnTask).ExecuteCommandAsync();
+ var targetAddress = originalTask.TargetAddress;
+
+ // 鍒犻櫎鍘熷鍑哄簱浠诲姟
+ await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync();
+
+ // 缁� ESS 鍙戦�佹祦鍔ㄤ俊鍙峰拰鍒涘缓浠诲姟
+ await SendESSCommands(palletCode, targetAddress, returnTask);
+ }
+ /// <summary>
+ /// 缁橢SS涓嬩换鍔�
+ /// </summary>
+ /// <param name="palletCode"></param>
+ /// <param name="targetAddress"></param>
+ /// <param name="returnTask"></param>
+ /// <returns></returns>
+ /// <exception cref="Exception"></exception>
+ private async Task SendESSCommands(string palletCode, string targetAddress, Dt_Task returnTask)
+ {
+ try
+ {
+ // 1. 鍙戦�佹祦鍔ㄤ俊鍙�
+ var moveResult = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest
+ {
+ slotCode = movestations[targetAddress],
+ containerCode = palletCode
+ });
+
+ if (moveResult)
+ {
+ // 2. 鍒涘缓鍥炲簱浠诲姟
+ var essTask = new TaskModel()
+ {
+ taskType = "putaway",
+ taskGroupCode = "",
+ groupPriority = 0,
+ tasks = new List<TasksType>
+ {
+ new()
+ {
+ taskCode = returnTask.TaskNum.ToString(),
+ taskPriority = 0,
+ taskDescribe = new TaskDescribeType
+ {
+ containerCode = palletCode,
+ containerType = "CT_KUBOT_STANDARD",
+ fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "",
+ toStationCode = "",
+ toLocationCode = returnTask.TargetAddress,
+ deadline = 0,
+ storageTag = ""
+ }
+ }
+ }
+ };
+
+ var resultTask = await _eSSApiService.CreateTaskAsync(essTask);
+ _logger.LogInformation($"ReturnRemaining 鍒涘缓浠诲姟鎴愬姛: {resultTask}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"ReturnRemaining ESS鍛戒护鍙戦�佸け璐�: {ex.Message}");
+ throw new Exception($"ESS绯荤粺閫氫俊澶辫触: {ex.Message}");
+ }
+ }
+
+ #endregion
+
+ #region 璁㈠崟鐘舵�佺鐞�
+
+ private async Task CheckAndUpdateOrderStatus(string orderNo)
+ {
+ try
+ {
+ var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+ .Where((o, item) => item.OrderNo == orderNo)
+ .Select((o, item) => o)
+ .ToListAsync();
+
+ bool allCompleted = true;
+ foreach (var detail in orderDetails)
+ {
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ allCompleted = false;
+ break;
+ }
+ }
+
+ var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ .FirstAsync(x => x.OrderNo == orderNo);
+
+ if (outboundOrder == null) return;
+
+ int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+
+ if (outboundOrder.OrderStatus != newStatus)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.OrderStatus == newStatus)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+
+ // 鍙湁姝e父鍒嗘嫞瀹屾垚鏃舵墠鍚慚ES鍙嶉
+ if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ {
+ await HandleOrderCompletion(outboundOrder, orderNo);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"CheckAndUpdateOrderStatus澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+ }
+ }
+
+ private async Task UpdateOrderStatusForReturn(string orderNo)
+ {
+ try
+ {
+ var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+ .Where((o, item) => item.OrderNo == orderNo)
+ .Select((o, item) => o)
+ .ToListAsync();
+
+ bool allCompleted = true;
+ foreach (var detail in orderDetails)
+ {
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ allCompleted = false;
+ break;
+ }
+ }
+
+ var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ .FirstAsync(x => x.OrderNo == orderNo);
+
+ if (outboundOrder == null) return;
+
+ int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+
+ if (outboundOrder.OrderStatus != newStatus)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.OrderStatus == newStatus)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+
+ _logger.LogInformation($"鍥炲簱鎿嶄綔鏇存柊璁㈠崟鐘舵�� - OrderNo: {orderNo}, 鏂扮姸鎬�: {newStatus}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"UpdateOrderStatusForReturn澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+ }
+ }
+
+ private async Task HandleOrderCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
+ {
+ // 璋冩嫧鍑哄簱鍜岄噸妫�鍑哄簱涓嶉渶瑕佸弽棣圡ES
+ if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt() ||
+ outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt())
+ {
+ return;
+ }
+
+ try
+ {
+ var feedmodel = new FeedbackOutboundRequestModel
+ {
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+ business_type = outboundOrder.BusinessType,
+ factoryArea = outboundOrder.FactoryArea,
+ operationType = 1,
+ Operator = App.User.UserName,
+ orderNo = outboundOrder.UpperOrderNo,
+ status = outboundOrder.OrderStatus,
+ details = new List<FeedbackOutboundDetailsModel>()
+ };
+
+ // 鍙幏鍙栧凡鎷i�夊畬鎴愮殑閿佸畾璁板綍
+ var lists = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+ .ToListAsync();
+
+ var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.Unit, item.WarehouseCode })
+ .Select(group => new FeedbackOutboundDetailsModel
+ {
+ materialCode = group.Key.MaterielCode,
+ lineNo = group.Key.lineNo,
+ warehouseCode = group.Key.WarehouseCode,
+ qty = group.Sum(x => x.PickedQty),
+ currentDeliveryQty = group.Sum(x => x.PickedQty),
+ unit = group.Key.Unit,
+ barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = row.CurrentBarcode,
+ supplyCode = row.SupplyCode,
+ batchNo = row.BatchNo,
+ unit = row.Unit,
+ qty = row.PickedQty
+ }).ToList()
+ }).ToList();
+
+ feedmodel.details = groupedData;
+
+ var result = await _invokeMESService.FeedbackOutbound(feedmodel);
+ if (result != null && result.code == 200)
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderId == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"FeedbackOutbound澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+ }
+ }
+
+ #endregion
+
+ #region 杈呭姪鏂规硶
+
+ private async Task<string> GenerateNewBarcode()
+ {
+ var seq = await _dailySequenceService.GetNextSequenceAsync();
+ return "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
+ }
+
+ private async Task<Dt_OutStockLockInfo> CreateSplitLockInfo(Dt_OutStockLockInfo originalLock, decimal quantity, string newBarcode)
+ {
+ var newLockInfo = new Dt_OutStockLockInfo
+ {
+ OrderNo = originalLock.OrderNo,
+ OrderDetailId = originalLock.OrderDetailId,
+ BatchNo = originalLock.BatchNo,
+ MaterielCode = originalLock.MaterielCode,
+ MaterielName = originalLock.MaterielName,
+ StockId = originalLock.StockId,
+ OrderQuantity = quantity,
+ OriginalQuantity = quantity,
+ AssignQuantity = quantity,
+ PickedQty = quantity,
+ LocationCode = originalLock.LocationCode,
+ PalletCode = originalLock.PalletCode,
+ TaskNum = originalLock.TaskNum,
+ Status = (int)OutLockStockStatusEnum.鎷i�夊畬鎴�,
+ Unit = originalLock.Unit,
+ SupplyCode = originalLock.SupplyCode,
+ OrderType = originalLock.OrderType,
+ CurrentBarcode = newBarcode,
+ OriginalLockQuantity = quantity,
+ IsSplitted = 1,
+ ParentLockId = originalLock.Id,
+ Operator= App.User.UserName,
+ FactoryArea=originalLock.FactoryArea,
+ lineNo=originalLock.lineNo,
+ WarehouseCode=originalLock.WarehouseCode,
+
+ };
+
+ var newLockId = await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteReturnIdentityAsync();
+ newLockInfo.Id = newLockId;
+ return newLockInfo;
+ }
+
+ private async Task RecordSplitHistory(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail,
+ decimal splitQty, decimal remainQty, string newBarcode)
+ {
+ var splitHistory = new Dt_SplitPackageRecord
+ {
+ FactoryArea = lockInfo.FactoryArea,
+ TaskNum = lockInfo.TaskNum,
+ OutStockLockInfoId = lockInfo.Id,
+ StockId = stockDetail.StockId,
+ Operator = App.User.UserName,
+ IsReverted = false,
+ OriginalBarcode = stockDetail.Barcode,
+ NewBarcode = newBarcode,
+ SplitQty = splitQty,
+ RemainQuantity = remainQty,
+ MaterielCode = lockInfo.MaterielCode,
+ SplitTime = DateTime.Now,
+ OrderNo = lockInfo.OrderNo,
+ PalletCode = lockInfo.PalletCode,
+ Status = (int)SplitPackageStatusEnum.宸叉嫞閫�
+ };
+
+ await _splitPackageService.Db.Insertable(splitHistory).ExecuteCommandAsync();
+ }
+
+ private List<SplitResult> CreateSplitResults(Dt_OutStockLockInfo lockInfo, decimal splitQty, decimal remainQty, string newBarcode, string originalBarcode)
+ {
+ return new List<SplitResult>
+ {
+ new SplitResult
+ {
+ materialCode = lockInfo.MaterielCode,
+ supplierCode = lockInfo.SupplyCode,
+ quantityTotal = splitQty.ToString("F2"),
+ batchNumber = newBarcode,
+ batch = lockInfo.BatchNo,
+ factory = lockInfo.FactoryArea,
+ date = DateTime.Now.ToString("yyyy-MM-dd"),
+ },
+ new SplitResult
+ {
+ materialCode = lockInfo.MaterielCode,
+ supplierCode = lockInfo.SupplyCode,
+ quantityTotal = remainQty.ToString("F2"),
+ batchNumber = originalBarcode,
+ batch = lockInfo.BatchNo,
+ factory = lockInfo.FactoryArea,
+ date = DateTime.Now.ToString("yyyy-MM-dd"),
+ }
+ };
+ }
+
+ private async Task UpdateSplitRecordsStatus(string barcode)
+ {
+ var relatedSplitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
+ .Where(it => it.OriginalBarcode == barcode || it.NewBarcode == barcode)
+ .Where(it => !it.IsReverted)
+ .ToListAsync();
+
+ foreach (var record in relatedSplitRecords)
+ {
+ record.Status = (int)SplitPackageStatusEnum.宸叉嫞閫�;
+ await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
+ }
+ }
+
+ private async Task<int> GenerateTaskNumber()
+ {
+ return await _dailySequenceService.GetNextSequenceAsync();
+ }
+
+ private WebResponseContent CreatePickingResponse(PickingResult result, string adjustedReason)
+ {
+ //if (result.SplitResults.Any())
+ //{
+ // var responseData = new { SplitResults = result.SplitResults, AdjustedReason = "" };
+ // if (!string.IsNullOrEmpty(adjustedReason))
+ // {
+ // responseData = new { SplitResults = result.SplitResults, AdjustedReason = adjustedReason };
+ // }
+ // return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", responseData);
+ //}
+
+ //if (!string.IsNullOrEmpty(adjustedReason))
+ //{
+ // return WebResponseContent.Instance.OK($"鎷i�夌‘璁ゆ垚鍔燂紙{adjustedReason}锛�");
+ //}
+
+ //return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�");
+
+ if (result.SplitResults.Any())
+ {
+ return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔燂紝宸茶嚜鍔ㄦ媶鍖�", new { SplitResults = result.SplitResults });
+ }
+ return WebResponseContent.Instance.OK("鎷i�夌‘璁ゆ垚鍔�", new { SplitResults = new List<SplitResult>() });
+ }
+
+ #endregion
+ }
+
+ #region 鏀寔绫诲畾涔�
+
+ public class ValidationResult<T>
+ {
+ public bool IsValid { get; set; }
+ public T Data { get; set; }
+ public string ErrorMessage { get; set; }
+
+ public static ValidationResult<T> Success(T data)
+ {
+ return new ValidationResult<T>
+ {
+ IsValid = true,
+ Data = data
+ };
+ }
+
+ public static ValidationResult<T> Error(string message)
+ {
+ return new ValidationResult<T>
+ {
+ IsValid = false,
+ ErrorMessage = message
+ };
}
}
+ public class PickingResult
+ {
+ public Dt_OutStockLockInfo FinalLockInfo { get; set; }
+ public string FinalBarcode { get; set; }
+ public int FinalStockId { get; set; }
+ public decimal ActualPickedQty { get; set; }
+ public List<SplitResult> SplitResults { get; set; } = new List<SplitResult>();
+ }
+
+ public class ReturnAnalysisResult
+ {
+ public bool HasItemsToReturn { get; set; }
+ public bool HasRemainingLocks { get; set; }
+ public bool HasPalletStockGoods { get; set; }
+ public bool HasSplitRecords { get; set; }
+ public decimal RemainingLocksReturnQty { get; set; }
+ public decimal PalletStockReturnQty { get; set; }
+ public decimal SplitReturnQty { get; set; }
+ public decimal TotalReturnQty { get; set; }
+ public List<Dt_OutStockLockInfo> RemainingLocks { get; set; } = new List<Dt_OutStockLockInfo>();
+ public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>();
+ public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>();
+ }
+
+ #endregion
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs"
index 34b8f2b..3c4b50b 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_OutboundService/SplitPackageService.cs"
@@ -17,6 +17,7 @@
using WIDESEA_IOutboundService;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
+using WIDESEA_Model.Models.Basic;
namespace WIDESEA_OutboundService
{
@@ -30,9 +31,9 @@
private readonly IOutStockLockInfoService _outStockLockInfoService;
private readonly IDailySequenceService _dailySequenceService;
private readonly IInvokeMESService _invokeMESService;
-
+ private readonly IMaterielToMesService _materielToMesService;
private readonly ILogger<SplitPackageService> _logger;
- public SplitPackageService(IRepository<Dt_SplitPackageRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, IDailySequenceService dailySequenceService, IInvokeMESService invokeMESService, ILogger<SplitPackageService> logger) : base(BaseDal)
+ public SplitPackageService(IRepository<Dt_SplitPackageRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, IDailySequenceService dailySequenceService, IInvokeMESService invokeMESService, ILogger<SplitPackageService> logger, IMaterielToMesService materielToMesService) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_stockInfoService = stockInfoService;
@@ -41,172 +42,8 @@
_dailySequenceService = dailySequenceService;
_invokeMESService = invokeMESService;
_logger = logger;
+ _materielToMesService = materielToMesService;
}
-
- /// <summary>
- /// 鎷嗗寘鎷嗙鎿嶄綔
- /// </summary>
- //public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
- //{
- // try
- // {
- // _unitOfWorkManage.BeginTran();
-
- // // 1. 楠岃瘉鍑哄簱閿佸畾淇℃伅
- // var lockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- // .Where(x => x.OrderNo == request.OrderNo &&
- // x.PalletCode == request.PalletCode &&
- // x.CurrentBarcode == request.OriginalBarcode &&
- // x.Status == 1)
- // .FirstAsync();
-
- // if (lockInfo == null)
- // return WebResponseContent.Instance.Error("鏈壘鍒版湁鏁堢殑鍑哄簱閿佸畾淇℃伅");
-
- // // 2. 妫�鏌ュ墿浣欓攣瀹氭暟閲�
- // decimal remainingLockQuantity = lockInfo.OriginalQuantity - lockInfo.PickedQty;
- // if (request.SplitQuantity > remainingLockQuantity)
- // return WebResponseContent.Instance.Error($"鎷嗗寘鏁伴噺涓嶈兘澶т簬鍓╀綑閿佸畾鏁伴噺锛屽墿浣欙細{remainingLockQuantity}");
-
- // var baseStockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- // .Where(x => x.Barcode == request.OriginalBarcode && x.StockId == lockInfo.StockId)
- // .FirstAsync();
- // if (baseStockDetail == null)
- // throw new Exception($"鏈壘鍒版潯鐮亄request.OriginalBarcode}瀵瑰簲鐨勫簱瀛樿褰�");
-
-
- // // 4. 璁$畻鎷嗗垎鍚庣殑鏁伴噺
- // decimal remainingQty = baseStockDetail.StockQuantity - request.SplitQuantity;
-
- // // 鏇存柊鍩虹鏉$爜鐨勫簱瀛樻暟閲忎负鍓╀綑鏁伴噺
- // baseStockDetail.StockQuantity = remainingQty;
- // baseStockDetail.OutboundQuantity = remainingQty;
- // await _stockInfoDetailService.Db.Updateable(baseStockDetail).ExecuteCommandAsync();
-
-
- // var seq = await _dailySequenceService.GetNextSequenceAsync();
- // // 3. 鐢熸垚鏂版潯鐮�
- // string newBarcode = "WSLOT" + DateTime.Now.ToString("yyyyMMdd") + seq.ToString()?.PadLeft(5, '0');
-
-
- // // 涓烘媶鍖呬骇鐢熺殑鏂版潯鐮佸垱寤哄簱瀛樿褰�
- // var newStockDetail = new Dt_StockInfoDetail
- // {
- // SupplyCode = baseStockDetail.SupplyCode,
- // WarehouseCode = baseStockDetail.WarehouseCode,
- // BarcodeQty = baseStockDetail.BarcodeQty,
- // BarcodeUnit = baseStockDetail.BarcodeUnit,
- // BusinessType = baseStockDetail.BusinessType,
- // Unit = baseStockDetail.Unit,
- // StockId = lockInfo.StockId,
- // MaterielCode = baseStockDetail.MaterielCode,
- // OrderNo = baseStockDetail.OrderNo,
- // BatchNo = baseStockDetail.BatchNo,
- // StockQuantity = request.SplitQuantity, // 鏂版潯鐮佽幏寰楁媶鍒嗘暟閲�
- // OutboundQuantity = request.SplitQuantity,
- // Barcode = newBarcode,
- // InboundOrderRowNo = baseStockDetail.InboundOrderRowNo,
-
- // };
- // await _outStockLockInfoService.Db.Insertable(newStockDetail).ExecuteCommandAsync();
-
- // // 4. 鍒涘缓鏂扮殑鍑哄簱閿佸畾淇℃伅锛堟柊鏉$爜锛�
- // var newLockInfo = new Dt_OutStockLockInfo
- // {
-
- // OrderNo = lockInfo.OrderNo,
- // OrderDetailId = lockInfo.OrderDetailId,
- // BatchNo = lockInfo.BatchNo,
- // MaterielCode = lockInfo.MaterielCode,
- // MaterielName = lockInfo.MaterielName,
- // StockId = lockInfo.StockId,
- // OrderQuantity = request.SplitQuantity,
- // OriginalQuantity = request.SplitQuantity,
- // AssignQuantity = request.SplitQuantity, // 鏂版潯鐮佸垎閰嶆暟閲�
- // PickedQty = 0, // 鏂版潯鐮佹湭鎷i��
- // LocationCode = lockInfo.LocationCode,
- // PalletCode = lockInfo.PalletCode,
- // TaskNum = lockInfo.TaskNum,
- // Status = (int)OutLockStockStatusEnum.鍑哄簱涓�,
- // Unit = lockInfo.Unit,
- // SupplyCode = lockInfo.SupplyCode,
- // OrderType = lockInfo.OrderType,
- // CurrentBarcode = newBarcode, // 鏂版潯鐮�
- // OriginalLockQuantity = request.SplitQuantity,
- // IsSplitted = 1,
- // ParentLockId = lockInfo.Id // 璁板綍鐖剁骇閿佸畾ID
- // };
- // await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
-
- // lockInfo.AssignQuantity = remainingQty;
- // lockInfo.IsSplitted = 1; // 鏍囪涓哄凡鎷嗗寘
- // await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
-
- // var previousSplitRecord = await Db.Queryable<Dt_SplitPackageRecord>()
- // .Where(x => x.OriginalBarcode == request.OriginalBarcode && !x.IsReverted)
- // .OrderByDescending(x => x.SplitTime)
- // .FirstAsync();
-
- // // 6. 璁板綍鎷嗗寘鍘嗗彶锛堢敤浜庤拷韪級
- // var splitHistory = new Dt_SplitPackageRecord
- // {
- // FactoryArea = lockInfo.FactoryArea,
- // TaskNum = lockInfo.TaskNum,
- // OutStockLockInfoId = lockInfo.Id,
- // StockId = baseStockDetail.StockId,
- // Operator = App.User.UserName,
- // IsReverted = false,
- // OriginalBarcode = request.OriginalBarcode,
- // NewBarcode = newBarcode,
- // SplitQty = request.SplitQuantity,
- // RemainQuantity = remainingQty, // 璁板綍鎷嗗垎鍚庣殑鍓╀綑鏁伴噺
- // MaterielCode = lockInfo.MaterielCode,
- // SplitTime = DateTime.Now,
- // OrderNo = request.OrderNo,
- // PalletCode = request.PalletCode,
- // Status = (int)SplitPackageStatusEnum.宸叉媶鍖�,
- // PreviousSplitRecordId = previousSplitRecord?.Id??0 // 璁板綍鍓嶄竴娆℃媶鍖匢D锛屽缓绔嬫媶鍖呴摼
- // };
- // await Db.Insertable(splitHistory).ExecuteCommandAsync();
-
- // _unitOfWorkManage.CommitTran();
-
- // try
- // {
- // MaterielToMesDTO dto = new MaterielToMesDTO
- // {
- // batchNo = baseStockDetail.BatchNo,
- // factoryArea = baseStockDetail.FactoryArea,
- // materialCode = baseStockDetail.MaterielCode,
- // newmaterialCode = newBarcode,
- // oldmaterialCode = request.OriginalBarcode,
- // operationType = 1,
- // qty = remainingQty,
- // supplyCode = baseStockDetail.SupplyCode,
- // unit = baseStockDetail.BarcodeUnit,
- // warehouseCode = baseStockDetail.WarehouseCode,
- // reqCode = Guid.NewGuid().ToString(),
- // reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
- // };
- // _invokeMESService.NewMaterielToMes(dto);
- // }
- // catch(Exception ex)
- // {
- // _logger.LogError("SplitPackage 鍥炰紶MES: " + ex.Message);
- // }
- // return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new
- // {
- // NewBarcode = newBarcode,
- // NewLockInfoId = newLockInfo.Id
- // });
- // }
- // catch (Exception ex)
- // {
- // _unitOfWorkManage.RollbackTran();
- // return WebResponseContent.Instance.Error($"鎷嗗寘澶辫触: {ex.Message}");
- // }
- //}
- // 鑾峰彇鏉$爜鐨勬媶鍖呭巻鍙查摼
public async Task<WebResponseContent> SplitPackage(SplitPackageDto request)
{
@@ -297,7 +134,11 @@
CurrentBarcode = newBarcode,
OriginalLockQuantity = request.SplitQuantity,
IsSplitted = 1,
- ParentLockId = lockInfo.Id
+ ParentLockId = lockInfo.Id,
+ Operator = App.User.UserName,
+ FactoryArea = lockInfo.FactoryArea,
+ lineNo = lockInfo.lineNo,
+ WarehouseCode = lockInfo.WarehouseCode,
};
await _outStockLockInfoService.Db.Insertable(newLockInfo).ExecuteCommandAsync();
@@ -330,6 +171,30 @@
await Db.Insertable(splitHistory).ExecuteCommandAsync();
_unitOfWorkManage.CommitTran();
+
+ try
+ {
+
+ var dt_MaterielToMes = new Dt_MaterielToMes
+ {
+ OldMaterialBarCode = request.OriginalBarcode,
+ NewMaterialBarCode = newBarcode,
+ Unit = baseStockDetail.BarcodeUnit,
+ factoryArea = baseStockDetail.FactoryArea,
+ Qty = remainingQty,
+ supplyCode = baseStockDetail.SupplyCode,
+ warehouseCode = baseStockDetail.WarehouseCode,
+ BatchNo = baseStockDetail.BatchNo,
+ MaterielCode = baseStockDetail.MaterielCode,
+
+ };
+ _materielToMesService.AddData(dt_MaterielToMes);
+
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError("SplitPackage 鍥炰紶MES: " + ex.Message);
+ }
return WebResponseContent.Instance.OK("鎷嗗寘鎴愬姛", new SplitPackageChainDto
{
@@ -418,7 +283,7 @@
{
record.IsReverted = true;
record.RevertTime = DateTime.Now;
-
+
record.Status = (int)SplitPackageStatusEnum.宸叉挙閿�;
}
await Db.Updateable(splitRecords).ExecuteCommandAsync();
@@ -526,14 +391,14 @@
// 鑾峰彇鍙挙閿�鐨勬媶鍖呰褰曞垪琛�
public Dt_SplitPackageRecord GetRevertableSplitRecords(string originalBarcode)
{
- var revertableRecords = Db.Queryable<Dt_SplitPackageRecord>()
+ var revertableRecords = Db.Queryable<Dt_SplitPackageRecord>()
.Where(x => x.OriginalBarcode == originalBarcode && !x.IsReverted)
.OrderBy(x => x.SplitTime)
.First();
- return revertableRecords ;
+ return revertableRecords;
}
-
+
// 鑾峰彇鎷嗗寘淇℃伅
public async Task<WebResponseContent> GetSplitPackageInfo(string orderNo, string palletCode, string barcode)
{
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index f5ce2dd..5ff38f2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -225,6 +225,12 @@
return Db.Queryable<Dt_StockInfo>().Where(x => x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt() && SqlFunc.Subqueryable<Dt_LocationInfo>().Where(v => v.LocationCode == x.LocationCode && v.LocationType == locationType && v.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (v.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || EnableStatusEnum.Normal.ObjToInt() == v.EnableStatus)).Any()).OrderBy(x => x.ModifyDate).First();
}
+ public List<Dt_StockInfo> GetStockInfosByPalletCodes(List<string> palletCodes)
+ {
+ return Db.Queryable<Dt_StockInfo>().Where(x => palletCodes.Contains(x.PalletCode)).Includes(x => x.Details).ToList();
+ }
+
+
/// <summary>
///
/// </summary>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
index c2f09f0..8682865 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
@@ -38,9 +38,11 @@
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
+using WIDESEA_DTO.Allocate;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Task;
+using WIDESEA_IAllocateService;
using WIDESEA_IBasicService;
using WIDESEA_IInboundService;
using WIDESEA_IOutboundService;
@@ -69,7 +71,7 @@
private readonly IESSApiService _eSSApiService;
private readonly IStockService _stockService;
private readonly IRecordService _recordService;
-
+ private readonly IAllocateService _allocateService;
private readonly IInvokeMESService _invokeMESService;
public IRepository<Dt_Task> Repository => BaseDal;
@@ -90,7 +92,7 @@
public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
- public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService, IOutStockLockInfoService outStockLockInfoService) : base(BaseDal)
+ public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService, IOutStockLockInfoService outStockLockInfoService, IAllocateService allocateService) : base(BaseDal)
{
_mapper = mapper;
_unitOfWorkManage = unitOfWorkManage;
@@ -107,6 +109,7 @@
_outboundOrderDetailService = outboundOrderDetailService;
_invokeMESService = invokeMESService;
_outStockLockInfoService = outStockLockInfoService;
+ _allocateService = allocateService;
}
@@ -250,7 +253,53 @@
{
if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt())//璋冩嫧鍏ュ簱
{
+ if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+ {
+ var allocate = _allocateService.Repository.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo).First();
+ var feedmodel = new AllocateDto
+ {
+ ReqCode = Guid.NewGuid().ToString(),
+ ReqTime = DateTime.Now.ToString(),
+ BusinessType = "2",
+ FactoryArea = inboundOrder.FactoryArea,
+ OperationType = 1,
+ Operator = inboundOrder.Operator,
+ OrderNo = inboundOrder.UpperOrderNo,
+ fromWarehouse = allocate?.FromWarehouse??"",
+ toWarehouse = allocate?.ToWarehouse??"",
+ Details = new List<AllocateDtoDetail>()
+ };
+
+ var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ .Select(group => new AllocateDtoDetail
+ {
+ MaterialCode = group.Key.MaterielCode,
+ LineNo = group.Key.lineNo,
+ WarehouseCode = group.Key.WarehouseCode,
+ Qty = group.Sum(x => x.BarcodeQty),
+ // warehouseCode= "1072",
+ Unit = group.Key.BarcodeUnit,
+ Barcodes = group.Select(row => new BarcodeInfo
+ {
+ Barcode = row.Barcode,
+ Qty = row.BarcodeQty,
+ BatchNo = row.BatchNo,
+ SupplyCode = row.SupplyCode,
+ Unit = row.Unit
+ }).ToList()
+ }).ToList();
+ feedmodel.Details = groupedData;
+
+ var result = await _invokeMESService.FeedbackAllocate(feedmodel);
+ if (result != null && result.code == 200)
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+ }
}
else if (inboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt()) //閲嶆鍏ュ簱
{
@@ -405,7 +454,7 @@
}
}
- public WebResponseContent InPickTaskCompleted(Dt_Task task)
+ public async Task<WebResponseContent> InPickTaskCompleted(Dt_Task task)
{
_logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum}");
//鏌ュ簱瀛�
@@ -418,7 +467,12 @@
{
return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
}
-
+ //鏌ヨ揣浣�
+ Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+ if (locationInfo == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
+ }
// 鑾峰彇鎵�鏈夊洖搴撲腑鐨勫嚭搴撻攣瀹氳褰�
var returnLocks = _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(it => it.OrderNo == task.OrderNo && it.PalletCode == task.PalletCode && it.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
@@ -430,12 +484,8 @@
}
_outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommand();
- //鏌ヨ揣浣�
- Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
- if (locationInfo == null)
- {
- return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
- }
+ await DeleteZeroQuantityStockDetails(stockInfo.Id);
+
stockInfo.LocationCode = task.TargetAddress;
stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
stockInfo.Details.ForEach(x =>
@@ -444,6 +494,9 @@
});
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
_stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
+ await ProcessStockDetailsForReturn(task, stockInfo.Id);
+
+
if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
{
@@ -462,6 +515,60 @@
return WebResponseContent.Instance.OK();
}
+ /// <summary>
+ /// 鍒犻櫎搴撳瓨鏁颁负0鐨勫簱瀛樻槑缁嗚褰�
+ /// </summary>
+ private async Task DeleteZeroQuantityStockDetails(int stockId)
+ {
+ try
+ {
+ // 鍒犻櫎搴撳瓨鏁伴噺涓�0鐨勮褰�
+ var deleteCount = await _stockService.StockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
+ .Where(x => x.StockId == stockId &&
+ x.StockQuantity == 0 &&
+ (x.Status==StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt()|| x.Status==
+ StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())) // 鍙垹闄ゅ凡瀹屾垚鐘舵�佺殑闆跺簱瀛�
+ .ExecuteCommandAsync();
+
+ if (deleteCount > 0)
+ {
+ _logger.LogInformation($"鍒犻櫎{deleteCount}鏉¢浂搴撳瓨鏄庣粏璁板綍 - StockId: {stockId}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogWarning($"鍒犻櫎闆跺簱瀛樿褰曞け璐� - StockId: {stockId}, Error: {ex.Message}");
+ // 娉ㄦ剰锛氬垹闄ゅけ璐ヤ笉搴旇褰卞搷涓绘祦绋嬶紝璁板綍鏃ュ織鍚庣户缁�
+ }
+ }
+ /// <summary>
+ /// 澶勭悊鍥炲簱鐩稿叧鐨勬墍鏈夊簱瀛樻槑缁嗙姸鎬佸彉鏇�
+ /// </summary>
+ private async Task ProcessStockDetailsForReturn(Dt_Task returnTask, int stockId)
+ {
+ // 鑾峰彇璇ユ墭鐩樹笅鎵�鏈夐渶瑕佸洖搴撶殑搴撳瓨鏄庣粏
+ var stockDetails = await _stockService.StockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.StockId == stockId &&
+ x.StockQuantity > 0 &&
+ ( x.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()|| x.Status==
+ StockStatusEmun.鍏ュ簱纭.ObjToInt())) // 鍖呮嫭鍑哄簱閿佸畾鍜屽叆搴撶‘璁ょ殑
+ .ToListAsync();
+
+ foreach (var detail in stockDetails)
+ {
+
+ detail.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ detail.OutboundQuantity = 0; // 娓呯┖鍑哄簱鏁伴噺
+
+ _logger.LogInformation($"鏇存柊搴撳瓨鏄庣粏鐘舵�� - 鏉$爜: {detail.Barcode}, 鏁伴噺: {detail.StockQuantity}");
+ }
+
+ if (stockDetails.Any())
+ {
+ await _stockService.StockInfoDetailService.Db.Updateable(stockDetails).ExecuteCommandAsync();
+ _logger.LogInformation($"鍏辨洿鏂皗stockDetails.Count}涓簱瀛樻槑缁嗙姸鎬佷负鍏ュ簱瀹屾垚");
+ }
+ }
public async Task<WebResponseContent> OutEmptyTaskCompleted(Dt_Task task)
{
WebResponseContent content = new WebResponseContent();
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs"
index 58c97a7..c2f08d2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs"
@@ -206,7 +206,7 @@
if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
{
stockInfos.ForEach(x =>
- {
+ {
x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
});
outboundOrderDetails.ForEach(x =>
@@ -218,6 +218,8 @@
{
_outboundOrderService.Repository.UpdateData(outboundOrder);
}
+ outboundOrder.Operator = App.User.UserName;
+ _outboundOrderService.Repository.UpdateData(outboundOrder);
WebResponseContent content = _outboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
if (!content.Status)
@@ -335,6 +337,51 @@
return tasks;
}
+ public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos, TaskTypeEnum taskType)
+ {
+ List<Dt_Task> tasks = new List<Dt_Task>();
+ List<Dt_LocationInfo> locationInfos = _locationInfoService.Repository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
+ for (int i = 0; i < stockInfos.Count; i++)
+ {
+ Dt_StockInfo stockInfo = stockInfos[i];
+
+ if (stockInfo != null)
+ {
+ Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
+ if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
+ {
+ Dt_Task task = new()
+ {
+ CurrentAddress = stockInfo.LocationCode,
+ Grade = 0,
+ PalletCode = stockInfo.PalletCode,
+ NextAddress = "",
+ Roadway = locationInfo.RoadwayNo,
+ SourceAddress = stockInfo.LocationCode,
+ TargetAddress = "",
+ TaskStatus = TaskStatusEnum.New.ObjToInt(),
+ TaskType = taskType.ObjToInt(),
+ //TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
+ PalletType = stockInfo.PalletType,
+ WarehouseId = stockInfo.WarehouseId,
+
+ };
+ //if (taskType != TaskTypeEnum.OutEmpty)
+ //{
+ // task.MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode;
+ // task.Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity);
+ // task.BatchNo = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.BatchNo;
+ //}
+ //if (stockInfo.StockLength > 0)
+ //{
+ // task.TaskLength = stockInfo.StockLength;
+ //}
+ tasks.Add(task);
+ }
+ }
+ }
+ return tasks;
+ }
/// <summary>
/// 鐢熸垚鍑哄簱浠诲姟
@@ -385,5 +432,159 @@
}
+ /// <summary>
+ /// 鐢熸垚鍑哄簱浠诲姟
+ /// </summary>
+ /// <param name="orderDetailId"></param>
+ /// <param name="stockSelectViews"></param>
+ /// <returns></returns>
+ public WebResponseContent GenerateOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
+ {
+ try
+ {
+ (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) result = OutboundTaskDataHandle(orderDetailId, stockSelectViews);
+
+ WebResponseContent content = GenerateOutboundTaskDataUpdate(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5);
+
+ return content;
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
+
+ /// <summary>
+ /// 鍑哄簱浠诲姟鏁版嵁澶勭悊
+ /// </summary>
+ /// <param name="orderDetailId"></param>
+ /// <param name="stockSelectViews"></param>
+ /// <returns></returns>
+ /// <exception cref="Exception"></exception>
+ public (List<Dt_Task>, List<Dt_StockInfo>?, List<Dt_OutboundOrderDetail>?, List<Dt_OutStockLockInfo>?, List<Dt_LocationInfo>?) OutboundTaskDataHandle(int orderDetailId, List<StockSelectViewDTO> stockSelectViews)
+ {
+ List<Dt_Task> tasks = new List<Dt_Task>();
+ Dt_OutboundOrderDetail outboundOrderDetail = _outboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId);
+
+ if (outboundOrderDetail == null)
+ {
+ throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅");
+ }
+
+ if (stockSelectViews.Sum(x => x.UseableQuantity) > outboundOrderDetail.OrderQuantity - outboundOrderDetail.LockQuantity)
+ {
+ throw new Exception("閫夋嫨鏁伴噺瓒呭嚭鍗曟嵁鏁伴噺");
+ }
+ List<Dt_StockInfo>? stockInfos = null;
+ Dt_OutboundOrderDetail? orderDetail = null;
+ List<Dt_OutStockLockInfo>? outStockLockInfos = null;
+ List<Dt_LocationInfo>? locationInfos = null;
+ if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
+ {
+ (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews);
+ if (result.Item1 != null && result.Item1.Count > 0)
+ {
+ Dt_OutboundOrder outboundOrder = _outboundOrderService .Repository.QueryFirst(x => x.Id == outboundOrderDetail.OrderId);
+ TaskTypeEnum typeEnum = outboundOrder.OrderType switch
+ {
+ (int)OutOrderTypeEnum.Issue => TaskTypeEnum.Outbound,
+ (int)OutOrderTypeEnum.Allocate => TaskTypeEnum.OutAllocate,
+ (int)OutOrderTypeEnum.Quality => TaskTypeEnum.OutQuality,
+ _ => new TaskTypeEnum()
+ };
+ tasks = GetTasks(result.Item1, typeEnum);
+ result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+ result.Item3.ForEach(x =>
+ {
+ x.Status = OutLockStockStatusEnum.鍑哄簱涓�.ObjToInt();
+ });
+
+ stockInfos = result.Item1;
+ orderDetail = result.Item2;
+ outStockLockInfos = result.Item3;
+ locationInfos = result.Item4;
+ }
+ else
+ {
+ throw new Exception("鏃犲簱瀛�");
+ }
+ }
+ else
+ {
+ List<Dt_OutStockLockInfo> stockLockInfos = _outStockLockInfoService.GetByOrderDetailId(outboundOrderDetail.OrderId, OutLockStockStatusEnum.宸插垎閰�);
+ if (stockLockInfos != null && stockLockInfos.Count > 0)
+ {
+ List<Dt_StockInfo> stocks = _stockService.StockInfoService.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList());
+ tasks = GetTasks(stocks, TaskTypeEnum.Outbound);
+ }
+ }
+
+ return (tasks, stockInfos, orderDetail == null ? null : new List<Dt_OutboundOrderDetail> { orderDetail }, outStockLockInfos, locationInfos);
+ }
+
+ /// <summary>
+ /// 鐢熸垚鍑哄簱浠诲姟鍚庢暟鎹洿鏂板埌鏁版嵁搴�
+ /// </summary>
+ /// <param name="tasks"></param>
+ /// <param name="stockInfos"></param>
+ /// <param name="outboundOrderDetails"></param>
+ /// <param name="outStockLockInfos"></param>
+ /// <param name="locationInfos"></param>
+ /// <returns></returns>
+ public WebResponseContent GenerateOutboundTaskDataUpdate(List<Dt_Task> tasks, List<Dt_StockInfo>? stockInfos = null, List<Dt_OutboundOrderDetail>? outboundOrderDetails = null, List<Dt_OutStockLockInfo>? outStockLockInfos = null, List<Dt_LocationInfo>? locationInfos = null)
+ {
+ try
+ {
+ _unitOfWorkManage.BeginTran();
+
+ BaseDal.AddData(tasks);
+ if (stockInfos != null && stockInfos.Count > 0 && outboundOrderDetails != null && outboundOrderDetails.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
+ {
+ stockInfos.ForEach(x =>
+ {
+ x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+ });
+ outboundOrderDetails.ForEach(x =>
+ {
+ x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+ });
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
+ if (outboundOrder.OrderStatus != OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
+ {
+ _outboundOrderService.Repository.UpdateData(outboundOrder);
+ }
+ WebResponseContent content = _outboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
+
+ if (!content.Status)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return content;
+ }
+ }
+ else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0)
+ {
+ outboundOrderDetails.ForEach(x =>
+ {
+ x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
+ });
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId);
+ if (outboundOrder.OrderStatus != OutOrderStatusEnum.鍑哄簱涓�.ObjToInt())
+ {
+ _outboundOrderService.Repository.UpdateData(outboundOrder);
+ }
+ _outboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
+ }
+ _unitOfWorkManage.CommitTran();
+ //PushTasksToWCS(tasks);
+ return WebResponseContent.Instance.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+
+ }
+
}
}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj"
index 5272e9b..51b297d 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj"
@@ -7,6 +7,7 @@
</PropertyGroup>
<ItemGroup>
+ <ProjectReference Include="..\WIDESEA_IAllocateService\WIDESEA_IAllocateService.csproj" />
<ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" />
<ProjectReference Include="..\WIDESEA_IInboundService\WIDESEA_IInboundService.csproj" />
<ProjectReference Include="..\WIDESEA_IOutboundService\WIDESEA_IOutboundService.csproj" />
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs"
index 3a4607a..31f6001 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs"
@@ -3,6 +3,7 @@
using System.Data.Common;
using System.Diagnostics.Eventing.Reader;
using System.Threading.Tasks;
+using WIDESEA_Common.AllocateEnum;
using WIDESEA_Core;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.BaseController;
@@ -36,15 +37,23 @@
{
OrderNo = model.OrderNo,
UpperOrderNo = model.OrderNo,
- BusinessType=model.BusinessType,
- FactoryArea=model.FactoryArea,
- IsBatch=model.IsBatch,
+ BusinessType = model.BusinessType,
+ FactoryArea = model.FactoryArea,
+ IsBatch = model.IsBatch,
CreateType = model.OperationType,
- Details = new List<Dt_AllocateOrderDetail>()
+ FromWarehouse=model.fromWarehouse,
+ ToWarehouse=model.toWarehouse,
+ Details = new List<Dt_AllocateOrderDetail>()
};
+ Enum.TryParse<BusinessTypeEnum>(allocateOrder.BusinessType, out var businessType);
+
foreach (var detailDto in model.Details)
{
+ if (businessType == BusinessTypeEnum.鏅轰粨璋冨閮ㄤ粨搴� && (detailDto.Barcodes == null || !detailDto.Barcodes.Any()))
+ {
+ return WebResponseContent.Instance.Error($"鏉$爜涓嶈兘涓虹┖");
+ }
if (detailDto.Barcodes != null && detailDto.Barcodes.Any())
{
foreach (var barcodeDto in detailDto.Barcodes)
@@ -55,7 +64,7 @@
MaterielCode = detailDto.MaterialCode,
LineNo = detailDto.LineNo,
OrderQuantity = detailDto.Qty,
- SupplyCode= barcodeDto.SupplyCode,
+ SupplyCode = barcodeDto.SupplyCode,
Unit = detailDto.Unit,
Barcode = barcodeDto.Barcode,
BatchNo = barcodeDto.BatchNo,
@@ -79,7 +88,7 @@
}
allocateOrder.Details.AddRange(allocateOrder.Details);
}
- var content =await Service.ReceiveAllocateOrder(allocateOrder, model.OperationType);
+ var content = await Service.ReceiveAllocateOrder(allocateOrder, model.OperationType);
if (content.Status) return WebResponseContent.Instance.OK(200);
else return WebResponseContent.Instance.Error(content.Message);
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs"
index e98db31..3ba7403 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs"
@@ -181,6 +181,12 @@
return content;
}
+
+ [HttpPost, Route("UndoPalletGroup"), AllowAnonymous, MethodParamsValidate]
+ public WebResponseContent UndoPalletGroup(string palletCode)
+ {
+ return Service.UndoPalletGroup(palletCode);
+ }
/// <summary>
///
/// </summary>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
index 0acdabf..dd51866 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundPickingController.cs"
@@ -21,14 +21,7 @@
_splitPackageService = splitPackageService;
_outStockLockInfoService = outStockLockInfoService;
}
- /// <summary>
- /// 鑾峰彇鎵樼洏鐨勫嚭搴撶姸鎬�
- /// </summary>
- [HttpPost("GetPalletOutboundStatus")]
- public async Task<WebResponseContent> GetPalletOutboundStatus(string palletCode)
- {
- return await Service.GetPalletOutboundStatus(palletCode);
- }
+
/// <summary>
/// 鑾峰彇鎵樼洏鐨勯攣瀹氫俊鎭�
@@ -98,50 +91,13 @@
return await Service.ReturnRemaining(dto.OrderNo, dto.PalletCode, "");
}
- [HttpPost("direct-outbound")]
- public async Task<WebResponseContent> DirectOutbound([FromBody] DirectOutboundRequest dto)
- {
- return await Service.DirectOutbound(dto);
-
- }
-
- ///// <summary>
- ///// 鎷i�夌‘璁�
- ///// </summary>
- //[HttpPost("ConfirmPicking")]
- //public async Task<WebResponseContent> ConfirmPicking([FromBody] PickingConfirmRequest request)
+ //[HttpPost("direct-outbound")]
+ //public async Task<WebResponseContent> DirectOutbound([FromBody] DirectOutboundRequest dto)
//{
- // return await Service.ConfirmPicking(request);
- //}
- /// <summary>
- /// 楠岃瘉鏉$爜骞惰幏鍙栫墿鏂欎俊鎭�
- /// </summary>
- [HttpGet("ValidateBarcode")]
- public async Task<WebResponseContent> ValidateBarcode(string barcode)
- {
- return await Service.ValidateBarcode(barcode);
- }
+ // return await Service.DirectOutbound(dto);
-
- ///// <summary>
- ///// 鐩存帴鍑哄簱
- ///// </summary>
- //[HttpPost("DirectOutbound")]
- //public async Task<WebResponseContent> DirectOutbound([FromBody] DirectOutboundRequest request)
- //{
- // return await Service.DirectOutbound(request);
- //}
-
- /// <summary>
- /// 鑾峰彇鎷i�夊巻鍙�
- /// </summary>
- [HttpGet("GetPickingHistory")]
- public async Task<WebResponseContent> GetPickingHistory(int orderId)
- {
- var history = await Service.GetPickingHistory(orderId);
- return WebResponseContent.Instance.OK(null, history);
- }
-
+ //}
+
/// <summary>
/// 鎾ら攢鎷i��
/// </summary>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
index 4612fbc..adfa518 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs"
@@ -47,5 +47,17 @@
return await Service.GenerateOutboundTasksAsync(data.taskIds,data.outboundPlatform);
}
+ /// <summary>
+ /// 鐢熸垚鍑哄簱浠诲姟
+ /// </summary>
+ /// <param name="orderDetailId"></param>
+ /// <param name="stockSelectViews"></param>
+ /// <returns></returns>
+ [HttpPost, HttpGet, Route("GenerateOutboundTask"), AllowAnonymous]
+ public WebResponseContent GenerateOutboundTask(int orderDetailId, [FromBody] List<StockSelectViewDTO> stockSelectViews)
+ {
+ return Service.GenerateOutboundTask(orderDetailId, stockSelectViews);
+ }
+
}
}
--
Gitblit v1.9.3