From 68389acdc272b78f1cc4d80180d4650e6254edcf Mon Sep 17 00:00:00 2001
From: z8018 <1282578289@qq.com>
Date: 星期三, 17 十二月 2025 17:04:59 +0800
Subject: [PATCH] 1
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs | 205 ++++++
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/SemanticSymbols.db | 0
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Util/HttpResponseResult.cs | 5
项目代码/WMS无仓储版/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.1204.46620/CodeChunks.db | 0
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/ReturnMES/AllocationReturnDTO.cs | 92 +++
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/ReturnMES/FeedbackMesResult.cs | 15
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Util/HttpClientHelper.cs | 3
项目代码/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js | 33
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrderDetail.cs | 14
项目代码/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue | 94 +++
项目代码/WIDESEA_WMSClient/src/views/outbound/outPicking.vue | 277 +++++++++
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/BasicService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_DTO/Base/UnitConvertResultDTO.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_IBasicService/MESOperation/IFeedbackMesService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderDetailService.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundController.cs | 15
项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/printView.vue | 28
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundQueryService.cs | 13
项目代码/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue | 805 +++++++++++++++++++++++++++
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs | 42 +
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Seed/DBSeed.cs | 54
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_Core/Middlewares/ApiLogMiddleware.cs | 2
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Basic/MesFeedbackController.cs | 24
23 files changed, 1,622 insertions(+), 107 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue"
index 5b7a400..b0c3c09 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/basic/extend/printView.vue"
@@ -59,13 +59,97 @@
print() {
let printContent = document.getElementById("printContent");
let palletcode=document.getElementById("palletcode");
- var printWindow = window.open("", "");
- printWindow.document.write(printContent.innerHTML);
- printWindow.document.write(palletcode.innerHTML);
+ var printWindow = window.open("", "", "width=400,height=400");
+
+ // 鍒涘缓瀹屾暣鐨凥TML缁撴瀯浠ラ伩鍏嶇┖鐧介〉
+ printWindow.document.write(`
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <meta charset="UTF-8">
+ <title>鎵撳嵃</title>
+ <style>
+ @page {
+ size: auto;
+ margin: 0;
+ }
+
+ body {
+ margin: 0;
+ padding: 10px;
+ font-family: Arial, sans-serif;
+ background: white;
+ }
+
+ .print-container {
+ width: 100%;
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ page-break-after: avoid;
+ }
+
+ .qrcode-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-bottom: 20px;
+ }
+
+ .pallet-code {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 18px;
+ font-weight: bold;
+ }
+
+ canvas {
+ display: block !important;
+ margin: auto !important;
+ }
+
+ @media print {
+ body {
+ margin: 0;
+ padding: 5mm;
+ }
+
+ .print-container {
+ width: 100%;
+ height: 100vh;
+ page-break-after: avoid;
+ page-break-inside: avoid;
+ }
+ }
+ </style>
+ </head>
+ <body>
+ <div class="print-container">
+ <div class="qrcode-container">
+ ${printContent.innerHTML}
+ </div>
+ <div class="pallet-code">
+ ${palletcode.innerHTML}
+ </div>
+ </div>
+ <script>
+ window.onload = function() {
+ setTimeout(function() {
+ window.print();
+ window.close();
+ }, 500);
+ };
+ <\/script>
+ </body>
+ </html>
+ `);
+
printWindow.document.close();
printWindow.focus();
- printWindow.print();
- printWindow.close();
+
this.http
.post("api/palletCodeInfo/PrintStatusUp?printCode="+this.palletCode, null, "鏁版嵁澶勭悊涓�")
.then((x) => {
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"
index c7c216f..dbed23a 100644
--- "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"
@@ -192,6 +192,7 @@
return
}
+
printWindow.document.write(`
<!DOCTYPE html>
<html>
@@ -235,27 +236,40 @@
margin: 0 !important;
padding: 0 !important;
}
-
- body {
+
+ html {
+ height: auto !important;
width: 80mm !important;
- height: 60mm !important;
margin: 0 !important;
padding: 0 !important;
background: white !important;
}
-
+
+ body {
+ height: auto !important;
+ width: 80mm !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ background: white !important;
+ overflow: visible !important;
+ min-height: 0 !important;
+ max-height: none !important;
+ }
+
.print-page {
width: 80mm !important;
height: 60mm !important;
- page-break-after: always !important;
margin: 0 !important;
padding: 1mm !important;
display: block !important;
background: white !important;
+ page-break-inside: avoid !important;
+ position: relative !important;
+ page-break-after: always !important;
}
-
+
.print-page:last-child {
- page-break-after: avoid !important;
+ page-break-after: auto !important;
}
.material-card {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js"
index 8be26bc..f101fdc 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js"
@@ -340,18 +340,21 @@
if (!selectedRows || selectedRows.length === 0) {
return _this.$Message.warning('璇峰厛閫夋嫨闇�瑕佸鐞嗙殑鍗曟嵁');
}
- const requestParams = {
- orderNos: selectedRows.map(row => row.orderNo),
- inout: 2
- };
+ if (selectedRows.length > 1) {
+ return _this.$Message.warning('璇烽�夋嫨涓�鏉℃暟鎹�');
+ }
+ // const requestParams = {
+ // orderNos: selectedRows.map(row => row.orderNo),
+ // inout: 2
+ // };
_this.http
- .post("api/InboundOrder/BatchOrderFeedbackToMes", requestParams, "鏁版嵁澶勭悊涓�...")
+ .post(`api/MesFeedback/OutboundFeedback?orderNo=${selectedRows[0].orderNo}`, {}, "鏁版嵁澶勭悊涓�...")
.then((x) => {
if (x.status) {
_this.$Message.success('鍒嗘壒鍑哄簱鍥炶皟瀹屾垚');
_this.refresh();
} else {
- return _this.$Message.error( '鍒嗘壒鍑哄簱鍥炶皟澶辫触');
+ return _this.$Message.error('鍒嗘壒鍑哄簱鍥炶皟澶辫触');
}
})
.catch((error) => {
@@ -367,14 +370,14 @@
}
}
-
+
var EmptyTrayOutboundBtn = this.buttons.find(x => x.value == "EmptyTrayOutbound");
- if (EmptyTrayOutboundBtn != null) {
- EmptyTrayOutboundBtn.onClick = () => {
- this.$refs.gridFooter.open();
- }
+ if (EmptyTrayOutboundBtn != null) {
+ EmptyTrayOutboundBtn.onClick = () => {
+ this.$refs.gridFooter.open();
}
+ }
},
onInited() {
@@ -383,7 +386,7 @@
//this.detailOptions.columns.forEach(column=>{ });
},
searchBefore(param) {
-
+
//鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
//杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
return true;
@@ -406,9 +409,9 @@
},
modelOpenAfter(row) {
if (this.currentAction === 'Add') { // 鍒ゆ柇褰撳墠鏄柊寤烘搷浣�
- const currentUser = this.$store.state.userInfo?.userTrueName || 'system';
- this.editFormFields.operator = currentUser;
- }
+ const currentUser = this.$store.state.userInfo?.userTrueName || 'system';
+ this.editFormFields.operator = currentUser;
+ }
//鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
//(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
//(2)缁欏脊鍑烘璁剧疆榛樿鍊�
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue"
new file mode 100644
index 0000000..8a0384f
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/out copyPicking.vue"
@@ -0,0 +1,805 @@
+<template>
+ <div class="picking-container">
+ <!-- 椤堕儴璁㈠崟淇℃伅 -->
+ <el-card class="order-info-card" shadow="never">
+ <div class="order-header">
+ <div class="order-title">
+ <i class="el-icon-document"></i>
+ <span class="order-label">璁㈠崟鍙凤細</span>
+ <span class="order-value">{{ orderNo }}</span>
+ </div>
+ <div class="order-status" v-if="orderInfo">
+ <el-tag :type="getStatusType(orderInfo.status)" size="medium">
+ {{ orderInfo.statusName || '杩涜涓�' }}
+ </el-tag>
+ </div>
+ </div>
+ </el-card>
+
+ <!-- 鎵爜鎿嶄綔鍖哄煙 -->
+ <el-card class="scan-section-card" shadow="never">
+ <div class="scan-section">
+ <el-alert title="璇蜂娇鐢ㄦ壂鐮佹灙鎵弿锛屾敮鎸佸洖杞﹁嚜鍔ㄧ‘璁�" type="info" :closable="false" show-icon class="scan-alert">
+ <template #default>
+ <span>1. 璇峰厛鎵弿鎵樼洏鐮� 鈫� 2. 鍐嶆壂鎻忕墿鏂欐潯鐮�</span>
+ </template>
+ </el-alert>
+
+ <el-form :model="scanForm" :rules="scanRules" ref="scanFormRef" class="scan-form">
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="鎵樼洏鐮�" prop="palletCode">
+ <el-input ref="palletInput" v-model="scanForm.palletCode" placeholder="璇锋壂鎻忔墭鐩樼爜"
+ size="large" clearable @keyup.enter="handlePalletScan">
+ <template #prefix>
+ <i class="el-icon-box"></i>
+ </template>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="鐗╂枡鏉$爜" prop="materialBarcode">
+ <el-input ref="materialInput" v-model="scanForm.materialBarcode" placeholder="璇锋壂鎻忕墿鏂欐潯鐮�"
+ size="large" clearable :disabled="unpickedData.length <= 0"
+ @keyup.enter="handleMaterialScan">
+ <template #prefix>
+ <i class="el-icon-s-grid"></i>
+ </template>
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item class="button-form-item">
+ <div class="action-buttons">
+ <el-button type="primary" size="large" @click="handleConfirmPick"
+ :loading="confirmLoading" :disabled="!canConfirm">
+ <i class="el-icon-check"></i>
+ 纭鎷i��
+ </el-button>
+ <el-button type="warning" size="large" @click="handleEmptyBox"
+ :disabled="!scanForm.palletCode">
+ <i class="el-icon-delete"></i>
+ 鍙栫┖绠�
+ </el-button>
+ <el-button type="success" size="large" @click="handleReturnToWarehouse"
+ :disabled="!scanForm.palletCode">
+ <i class="el-icon-refresh-left"></i>
+ 鍥炲簱
+ </el-button>
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ </div>
+ </el-card>
+
+ <!-- 鏁版嵁鍒楄〃鍖哄煙 -->
+ <div class="tables-section">
+ <el-row :gutter="20">
+ <!-- 鏈嫞閫夊垪琛� -->
+ <el-col :span="12">
+ <el-card class="table-card" shadow="never">
+ <template #header>
+ <div class="card-header">
+ <span class="card-title">
+ <i class="el-icon-time"></i>
+ 鏈嫞閫夊垪琛�
+ </span>
+ <el-badge :value="unpickedCount" class="badge-item" type="warning">
+ <el-button size="small" @click="refreshUnpickedTable" icon="el-icon-refresh">
+ 鍒锋柊
+ </el-button>
+ </el-badge>
+ </div>
+ </template>
+
+ <el-table ref="unpickedTable" :data="unpickedData" height="400" stripe highlight-current-row>
+ <el-table-column type="index" label="搴忓彿" width="60" align="center" />
+ <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="120" show-overflow-tooltip />
+ <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" width="80" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵规鍙�" width="100" />
+ <el-table-column prop="assignQuantity" label="鍒嗘嫞鏁伴噺" width="80" align="right">
+ <template #default="scope">
+ <el-text type="danger">{{ scope.row.assignQuantity }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column prop="sortedQuantity" label="宸插垎鎷f暟閲�" width="120" align="right">
+ <template #default="scope">
+ <el-text type="danger">{{ scope.row.sortedQuantity }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column prop="unit" label="鍗曚綅" width="60" />
+ <el-table-column prop="locationCode" label="搴撲綅" />
+ <!-- <el-table-column label="鎿嶄綔" width="80" align="center">
+ <template #default="scope">
+ <el-button type="text" size="small" @click="quickPick(scope.row)"
+ :disabled="!scanForm.palletCode">
+ 鎷i��
+ </el-button>
+ </template>
+ </el-table-column> -->
+ </el-table>
+
+ <div class="table-footer">
+ <el-descriptions :column="2" size="small">
+ <el-descriptions-item label="鎬绘潯鏁�">
+ <el-text type="info">{{ unpickedTotal }}</el-text>
+ </el-descriptions-item>
+ <el-descriptions-item label="鎬绘暟閲�">
+ <el-text type="warning">{{ unpickedQuantity }}</el-text>
+ </el-descriptions-item>
+ </el-descriptions>
+ </div>
+ </el-card>
+ </el-col>
+
+ <!-- 宸叉嫞閫夊垪琛� -->
+ <el-col :span="12">
+ <el-card class="table-card" shadow="never">
+ <template #header>
+ <div class="card-header">
+ <span class="card-title">
+ <i class="el-icon-circle-check"></i>
+ 宸叉嫞閫夊垪琛�
+ </span>
+ <el-badge :value="pickedCount" class="badge-item" type="success">
+ <el-button size="small" @click="refreshPickedTable" icon="el-icon-refresh">
+ 鍒锋柊
+ </el-button>
+ </el-badge>
+ </div>
+ </template>
+
+ <el-table ref="pickedTable" :data="pickedData" height="400" stripe>
+ <el-table-column type="index" label="搴忓彿" width="60" align="center" />
+ <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="120" />
+ <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵规鍙�" width="100" />
+ <el-table-column prop="changeQuantity" label="鎷i�夋暟閲�" width="80" align="right">
+ <template #default="scope">
+ <el-text type="success">{{ 0 - scope.row.changeQuantity }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column prop="changeQuantity" label="鍘熷簱瀛橀噺" width="80" align="right">
+ <template #default="scope">
+ <el-text type="success">{{ scope.row.beforeQuantity }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column prop="changeQuantity" label="鎷i�夊悗搴撳瓨閲�" width="80" align="right">
+ <template #default="scope">
+ <el-text type="success">{{ scope.row.afterQuantity }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column prop="unit" label="鍗曚綅" width="60" />
+ <el-table-column prop="palletCode" label="鎵樼洏鐮�" width="100" />
+ <el-table-column prop="createDate" label="鎷i�夋椂闂�" width="160" />
+ <el-table-column prop="originalBarcode" label="鍘熺墿鏂欑爜" width="160" />
+ <el-table-column prop="newBarcode" label="鏂扮墿鏂欑爜" width="160" />
+ <!-- <el-table-column label="鎿嶄綔" width="80" align="center">
+ <template #default="scope">
+ <el-button type="text" size="small" @click="undoPick(scope.row)">
+ 鎾ら攢
+ </el-button>
+ </template>
+ </el-table-column> -->
+ </el-table>
+
+ <div class="table-footer">
+ <el-descriptions :column="2" size="small">
+ <el-descriptions-item label="鎬绘潯鏁�">
+ <el-text type="info">{{ pickedTotal }}</el-text>
+ </el-descriptions-item>
+ <el-descriptions-item label="鎬绘暟閲�">
+ <el-text type="success">{{ pickedQuantity }}</el-text>
+ </el-descriptions-item>
+ </el-descriptions>
+ </div>
+ </el-card>
+ </el-col>
+ </el-row>
+ </div>
+
+ <print-view ref="printView" @parentcall="parentcall"></print-view>
+
+ <!-- 纭瀵硅瘽妗� -->
+ <el-dialog v-model="confirmDialogVisible" title="鎿嶄綔纭" width="400px" :before-close="handleDialogClose">
+ <div class="confirm-content">
+ <p>{{ confirmMessage }}</p>
+ </div>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="confirmDialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="executeConfirm" :loading="executeLoading">
+ 纭畾
+ </el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script>
+
+import printView from "@/extension/outbound/extend/printView.vue"
+export default {
+ components: { printView },
+ name: 'OutPicking',
+ data() {
+ return {
+ orderNo: '',
+ orderInfo: null,
+ scanForm: {
+ palletCode: '',
+ materialBarcode: ''
+ },
+ scanRules: {
+ palletCode: [
+ { required: true, message: '璇锋壂鎻忔墭鐩樼爜', trigger: 'blur' }
+ ],
+ materialBarcode: [
+ { required: true, message: '璇锋壂鎻忕墿鏂欐潯鐮�', trigger: 'blur' }
+ ]
+ },
+ unpickedData: [],
+ pickedData: [],
+ unpickedCount: 0,
+ unpickedTotal: 0,
+ unpickedQuantity: 0,
+ pickedCount: 0,
+ pickedTotal: 0,
+ pickedQuantity: 0,
+ confirmLoading: false,
+ confirmDialogVisible: false,
+ confirmMessage: '',
+ currentAction: null,
+ executeLoading: false
+ }
+ },
+ computed: {
+ canConfirm() {
+ return this.scanForm.palletCode && this.scanForm.materialBarcode
+ }
+ },
+ mounted() {
+ this.initPage()
+ },
+ methods: {
+ initPage() {
+ // 浠庤矾鐢卞弬鏁拌幏鍙栬鍗曞彿
+ this.orderNo = this.$route.query.orderNo || ''
+ if (!this.orderNo) {
+ this.$message.error('璁㈠崟鍙蜂笉鑳戒负绌�')
+ this.$router.back()
+ return
+ }
+ // 鑷姩鑱氱劍鍒版墭鐩樼爜杈撳叆妗�
+ this.$nextTick(() => {
+ if (this.$refs.palletInput) {
+ this.$refs.palletInput.focus()
+ }
+ })
+ },
+
+ loadPalletData() {
+ if (!this.scanForm.palletCode) {
+ this.unpickedData = []
+ return
+ }
+
+ try {
+ this.loadUnpickedData();
+ this.loadPickedData();
+
+ } catch (error) {
+ console.error('鍔犺浇鎵樼洏鏁版嵁澶辫触:', error)
+ this.unpickedData = []
+ }
+ },
+ loadUnpickedData() {
+ try {
+ this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
+ if (response.status) {
+ if (response.data.length > 0) {
+ this.unpickedData = response.data
+ this.calculateUnpickedStats()
+
+ // 鑷姩鑱氱劍鍒扮墿鏂欐潯鐮佽緭鍏ユ
+ this.$nextTick(() => {
+ if (this.$refs.materialInput) {
+ this.$refs.materialInput.focus()
+ }
+ })
+ } else {
+ this.$message.warning('璇ユ墭鐩樻棤鏈嫞閫変换鍔�')
+ this.unpickedData = []
+ }
+ } else {
+ this.$message.error(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
+ this.unpickedData = []
+ }
+ }
+ )
+
+ } catch (error) {
+ console.error('鍔犺浇鏈嫞閫夋暟鎹け璐�:', error)
+ }
+ },
+
+ loadPickedData() {
+ try {
+ this.http.post(`/api/Outbound/QueryPickedList?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
+ if (response.status) {
+ if (response.data.length > 0) {
+ this.pickedData = response.data
+ this.calculatePickedStats()
+ } else {
+ this.pickedData = []
+ }
+ } else {
+ this.$message.error(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
+ this.pickedData = []
+ }
+ }
+ )
+
+ } catch (error) {
+ console.error('鍔犺浇宸叉嫞閫夋暟鎹け璐�:', error)
+ }
+ },
+
+ // 璁$畻鏈嫞閫�
+ calculateUnpickedStats() {
+ // 鏈嫞閫夋潯鐩暟閲�
+ this.unpickedCount = this.unpickedData.length
+
+ // 璁$畻鏈嫞閫夌殑鎬绘暟閲忥紙鍒嗘嫞鏁伴噺 - 宸插垎鎷f暟閲忥級
+ this.unpickedQuantity = this.unpickedData.reduce((sum, item) => {
+ const assignQty = item.assignQuantity || 0
+ const sortedQty = item.sortedQuantity || 0
+ const remainingQty = Math.max(0, assignQty - sortedQty)
+ return sum + remainingQty
+ }, 0)
+
+ // 鎬绘潯鐩暟锛堜笌鏉$洰鏁伴噺鐩稿悓锛岃繖閲屼繚鐣欏彉閲忎竴鑷存�э級
+ this.unpickedTotal = this.unpickedCount
+ },
+
+ // 璁$畻宸叉嫞閫�
+ calculatePickedStats() {
+ // 宸叉嫞閫夋潯鐩暟閲�
+ this.pickedCount = this.pickedData.length
+
+ // 璁$畻宸叉嫞閫夌殑鎬绘暟閲�
+ this.pickedQuantity = 0 - this.pickedData.reduce((sum, item) => {
+ return (sum + item.changeQuantity)
+ }, 0)
+
+ // 鎬绘潯鐩暟锛堜笌鏉$洰鏁伴噺鐩稿悓锛�
+ this.pickedTotal = this.pickedCount
+ },
+
+ handlePalletScan() {
+ if (this.scanForm.palletCode) {
+ // this.$message.success(`鎵樼洏鐮�: ${this.scanForm.palletCode}`)
+ this.loadPalletData()
+
+
+ }
+ },
+
+ handleMaterialScan() {
+ if (!this.scanForm.palletCode) {
+ this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�')
+ this.$refs.palletInput.focus()
+ return
+ }
+
+ if (!this.scanForm.materialBarcode) {
+ this.$message.warning('璇锋壂鎻忕墿鏂欐潯鐮�')
+ return
+ }
+
+ // 鑷姩鎵ц纭鎷i��
+ this.handleConfirmPick()
+ },
+
+ handleConfirmPick() {
+ if (!this.scanForm.palletCode || !this.scanForm.materialBarcode) {
+ this.$message.warning('璇峰厛鎵弿鎵樼洏鐮佸拰鐗╂枡鏉$爜')
+ return
+ }
+
+ this.confirmLoading = true
+
+ try {
+ this.http.post('/api/Outbound/CompleteOutboundWithBarcode', {
+ orderNo: this.orderNo,
+ palletCode: this.scanForm.palletCode,
+ barcode: this.scanForm.materialBarcode,
+ operator: this.getUserName()
+ }).then(response => {
+ if (response.status) {
+ if (response.data.scannedDetail.isUnpacked && response.data.scannedDetail.materialCodes.length > 0) {
+ this.$refs.printView.open(response.data.scannedDetail.materialCodes);
+ }
+ this.$message.success('鎷i�夌‘璁ゆ垚鍔�')
+ this.resetMaterialBarcode()
+ // this.loadUnpickedData()
+ // this.loadPickedData()
+ this.loadPalletData()
+ } else {
+ this.$message.error(response.message || '鎷i�夌‘璁ゅけ璐�')
+ }
+ })
+ } catch (error) {
+ console.error('鎷i�夌‘璁ゅけ璐�:', error)
+ this.$message.error('鎷i�夌‘璁ゅけ璐�')
+ } finally {
+ this.confirmLoading = false
+ }
+ },
+
+ handleEmptyBox() {
+ if (!this.scanForm.palletCode) {
+ this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�')
+ return
+ }
+
+ this.confirmMessage = `纭畾瑕佸彇绌烘墭鐩� ${this.scanForm.palletCode} 鍚楋紵`
+ this.currentAction = 'emptyBox'
+ this.confirmDialogVisible = true
+ },
+
+ handleReturnToWarehouse() {
+ if (!this.scanForm.palletCode) {
+ this.$message.warning('璇峰厛鎵弿鎵樼洏鐮�')
+ return
+ }
+
+ this.confirmMessage = `纭畾瑕佸皢鎵樼洏 ${this.scanForm.palletCode} 鍥炲簱鍚楋紵`
+ this.currentAction = 'returnToWarehouse'
+ this.confirmDialogVisible = true
+ },
+
+ executeConfirm() {
+ this.executeLoading = true
+
+ try {
+ let apiUrl = ''
+ let params = {
+ orderNo: this.orderNo,
+ palletCode: this.scanForm.palletCode
+ }
+
+ if (this.currentAction === 'emptyBox') {
+ apiUrl = '/api/Outbound/EmptyBox'
+ } else if (this.currentAction === 'returnToWarehouse') {
+ apiUrl = '/api/Outbound/ReturnToWarehouse'
+ }
+
+ this.http.post(apiUrl, params).then(response => {
+
+ if (response.status) {
+ this.$message.success('鎿嶄綔鎴愬姛')
+ this.confirmDialogVisible = false
+ this.resetForm()
+ // this.loadUnpickedData()
+ // this.loadPickedData()
+ } else {
+ this.$message.error(response.message || '鎿嶄綔澶辫触')
+ }
+ })
+ } catch (error) {
+ console.error('鎿嶄綔澶辫触:', error)
+ this.$message.error('鎿嶄綔澶辫触')
+ } finally {
+ this.executeLoading = false
+ }
+ },
+
+ handleDialogClose() {
+ if (!this.executeLoading) {
+ this.confirmDialogVisible = false
+ }
+ },
+
+ quickPick(row) {
+ this.scanForm.materialBarcode = row.materielCode
+ this.handleConfirmPick()
+ },
+
+ undoPick(row) {
+ try {
+ this.$confirm('纭畾瑕佹挙閿�杩欐潯鎷i�夎褰曞悧锛�', '鎻愮ず', {
+ type: 'warning'
+ })
+
+ const response = this.http.post('/api/Outbound/UndoPicking', {
+ id: row.id
+ }).then(response => {
+ if (response.status) {
+ this.$message.success('鎾ら攢鎴愬姛')
+ this.loadUnpickedData()
+ this.loadPickedData()
+ } else {
+ this.$message.error(response.message || '鎾ら攢澶辫触')
+ }
+ })
+ } catch (error) {
+ if (error !== 'cancel') {
+ console.error('鎾ら攢澶辫触:', error)
+ this.$message.error('鎾ら攢澶辫触')
+ }
+ }
+ },
+
+ // handleUnpickedRowClick(row) {
+ // // 鐐瑰嚮鏈嫞閫夎鏃惰嚜鍔ㄥ~鍏呯墿鏂欐潯鐮�
+ // this.scanForm.materialBarcode = row.materielCode
+ // },
+
+ refreshUnpickedTable() {
+ if (this.scanForm.palletCode) {
+ this.loadPalletData()
+ }
+ },
+
+ refreshPickedTable() {
+ this.loadPickedData()
+ },
+
+ resetMaterialBarcode() {
+ this.scanForm.materialBarcode = ''
+ this.$nextTick(() => {
+ if (this.$refs.materialInput) {
+ this.$refs.materialInput.focus()
+ }
+ })
+ },
+
+ resetForm() {
+ this.scanForm.palletCode = ''
+ this.scanForm.materialBarcode = ''
+ this.unpickedData = []
+ this.$nextTick(() => {
+ if (this.$refs.palletInput) {
+ this.$refs.palletInput.focus()
+ }
+ })
+ },
+
+ getUserName() {
+ // 灏濊瘯浠� Vuex store 鑾峰彇鐢ㄦ埛鍚�
+ if (this.$store && this.$store.state && this.$store.state.userInfo) {
+ return this.$store.state.userInfo.userName || this.$store.state.userInfo.username || '鏈櫥褰曠敤鎴�'
+ }
+
+ // 灏濊瘯浠� localStorage 鑾峰彇
+ try {
+ const userInfo = localStorage.getItem('user')
+ if (userInfo) {
+ const user = JSON.parse(userInfo)
+ return user.userName || user.username || '鏈櫥褰曠敤鎴�'
+ }
+ } catch (error) {
+ console.error('鑾峰彇鐢ㄦ埛淇℃伅澶辫触:', error)
+ }
+
+ return '鏈櫥褰曠敤鎴�'
+ },
+
+ getStatusType(status) {
+ const statusMap = {
+ 0: 'info', // 寰呭鐞�
+ 10: 'warning', // 杩涜涓�
+ 20: 'primary', // 鎷i�変腑
+ 30: 'success', // 宸插畬鎴�
+ 40: 'danger' // 寮傚父
+ }
+ return statusMap[status] || 'info'
+ }
+ }
+}
+</script>
+
+<style scoped>
+.picking-container {
+ padding: 20px;
+ background-color: #f5f5f5;
+ min-height: 100vh;
+}
+
+/* 璁㈠崟淇℃伅鍗$墖 */
+.order-info-card {
+ margin-bottom: 20px;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ color: white;
+}
+
+.order-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.order-title {
+ display: flex;
+ align-items: center;
+ font-size: 18px;
+ font-weight: bold;
+}
+
+.order-title i {
+ margin-right: 10px;
+ font-size: 24px;
+}
+
+.order-label {
+ margin-left: 10px;
+ opacity: 0.9;
+}
+
+.order-value {
+ font-size: 20px;
+ font-weight: bold;
+ letter-spacing: 1px;
+}
+
+/* 鎵爜鍖哄煙 */
+.scan-section-card {
+ margin-bottom: 20px;
+}
+
+.scan-section {
+ padding: 10px 0;
+}
+
+.scan-alert {
+ margin-bottom: 20px;
+}
+
+.scan-form {
+ margin-top: 20px;
+}
+
+.button-form-item {
+ margin-bottom: 0;
+}
+
+.button-form-item .el-form-item__content {
+ line-height: normal;
+}
+
+.action-buttons {
+ display: flex;
+ gap: 8px;
+ width: 100%;
+ height: 40px;
+}
+
+.action-buttons .el-button {
+ flex: 1;
+ height: 40px;
+ font-weight: bold;
+ border-radius: 6px;
+ margin: 0;
+}
+
+/* 琛ㄦ牸鍖哄煙 */
+.tables-section {
+ margin-top: 20px;
+}
+
+.table-card {
+ height: 600px;
+ display: flex;
+ flex-direction: column;
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.card-title {
+ display: flex;
+ align-items: center;
+ font-weight: bold;
+ font-size: 16px;
+}
+
+.card-title i {
+ margin-right: 8px;
+ color: #409EFF;
+}
+
+.badge-item {
+ margin-left: 10px;
+}
+
+.table-footer {
+ margin-top: 10px;
+ padding-top: 10px;
+ border-top: 1px solid #ebeef5;
+}
+
+/* 琛ㄦ牸琛屾牱寮� */
+.el-table tbody tr:hover>td {
+ background-color: #f0f9ff !important;
+}
+
+.el-table tbody tr.current-row>td {
+ background-color: #e1f3ff !important;
+}
+
+/* 瀵硅瘽妗嗘牱寮� */
+.confirm-content {
+ padding: 20px 0;
+ text-align: center;
+}
+
+.confirm-content p {
+ font-size: 16px;
+ color: #606266;
+}
+
+.dialog-footer {
+ text-align: center;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 1200px) {
+ .action-buttons .el-button {
+ font-size: 14px;
+ }
+}
+
+/* Element UI 缁勪欢鏍峰紡瑕嗙洊 */
+::v-deep .el-card__header {
+ padding: 18px 20px;
+ border-bottom: 1px solid #ebeef5;
+}
+
+::v-deep .el-input__inner {
+ border-radius: 6px;
+}
+
+::v-deep .el-button--primary {
+ background: linear-gradient(135deg, #409EFF 0%, #3a8ee6 100%);
+ border: none;
+}
+
+::v-deep .el-button--warning {
+ background: linear-gradient(135deg, #E6A23C 0%, #d9971a 100%);
+ border: none;
+}
+
+::v-deep .el-button--success {
+ background: linear-gradient(135deg, #67C23A 0%, #5daf34 100%);
+ border: none;
+}
+
+/* 鍥炬爣鏍峰紡 */
+.el-icon-document,
+.el-icon-box,
+.el-icon-s-grid,
+.el-icon-check,
+.el-icon-delete,
+.el-icon-refresh-left,
+.el-icon-time,
+.el-icon-circle-check {
+ font-size: 18px;
+}
+
+/* 鎻忚堪鍒楄〃鏍峰紡 */
+::v-deep .el-descriptions__label {
+ font-weight: bold;
+ color: #909399;
+}
+
+::v-deep .el-descriptions__content {
+ color: #606266;
+}
+</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/views/outbound/outPicking.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
index 8a0384f..16b62c5 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
@@ -21,7 +21,13 @@
<div class="scan-section">
<el-alert title="璇蜂娇鐢ㄦ壂鐮佹灙鎵弿锛屾敮鎸佸洖杞﹁嚜鍔ㄧ‘璁�" type="info" :closable="false" show-icon class="scan-alert">
<template #default>
- <span>1. 璇峰厛鎵弿鎵樼洏鐮� 鈫� 2. 鍐嶆壂鎻忕墿鏂欐潯鐮�</span>
+ <div>
+ <div>1. 璇峰厛鎵弿鎵樼洏鐮� 鈫� 2. 鍐嶆壂鎻忕墿鏂欐爣绛剧爜</div>
+ <div style="margin-top: 8px; font-size: 13px; color: #666;">
+ <i class="el-icon-info" style="color: #409EFF;"></i>
+ 鏀寔鎵墭鐩樼爜鏁寸鍑哄簱锛氭壂鎻忔墭鐩樼爜鍚庡彲鐩存帴杩涜鏁寸鐗╂枡鎷i�夛紝鏃犻渶鍐嶆壂鎻忕墿鏂欐爣绛剧爜銆�
+ </div>
+ </div>
</template>
</el-alert>
@@ -71,6 +77,41 @@
</el-col>
</el-row>
</el-form>
+
+ <!-- 鍒嗘嫞缁熻淇℃伅 -->
+ <div class="picking-stats" v-if="scanForm.palletCode && unpickedData.length > 0">
+ <el-divider content-position="left">
+ <span style="color: #409EFF; font-size: 14px;">
+ <i class="el-icon-data-analysis"></i> 鎵樼洏鍒嗘嫞缁熻
+ </span>
+ </el-divider>
+ <div class="stats-container">
+ <div class="stat-item">
+ <el-tag type="primary" size="medium" effect="dark">
+ <i class="el-icon-s-order"></i>
+ 鍒嗘嫞鎬绘暟锛�<b>{{ calculateTotalAssignQuantity() }}</b>
+ </el-tag>
+ </div>
+ <div class="stat-item">
+ <el-tag type="success" size="medium" effect="dark">
+ <i class="el-icon-circle-check"></i>
+ 宸插垎鎷o細<b>{{ calculateTotalSortedQuantity() }}</b>
+ </el-tag>
+ </div>
+ <div class="stat-item">
+ <el-tag type="warning" size="medium" effect="dark">
+ <i class="el-icon-time"></i>
+ 鏈垎鎷o細<b>{{ calculateTotalUnsortedQuantity() }}</b>
+ </el-tag>
+ </div>
+ <div class="stat-item">
+ <el-tag type="success" size="medium" effect="dark">
+ <i class="el-icon-box"></i>
+ 鏄惁鏁村嚭锛歿{ hasWholeOut() ? '鏄�' : '鍚�' }}
+ </el-tag>
+ </div>
+ </div>
+ </div>
</div>
</el-card>
@@ -198,6 +239,53 @@
</el-card>
</el-col>
</el-row>
+
+ <!-- 鎵樼洏鐗╂枡搴撳瓨淇℃伅 -->
+ <!-- <div class="pallet-inventory" v-if="scanForm.palletCode && unpickedData.length > 0">
+ <el-divider content-position="left">
+ <span style="color: #67C23A; font-size: 14px;">
+ <i class="el-icon-goods"></i> 鎵樼洏鐗╂枡搴撳瓨淇℃伅
+ </span>
+ </el-divider>
+ <div class="inventory-container">
+ <el-table :data="unpickedData" size="small" :show-header="true" :border="true" stripe
+ highlight-current-row max-height="200" class="inventory-table">
+ <el-table-column type="index" label="搴忓彿" width="50" align="center" />
+ <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="100" show-overflow-tooltip />
+ <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" width="120" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵规鍙�" width="90" />
+ <el-table-column label="褰撳墠搴撳瓨" width="80" align="right">
+ <template #default="scope">
+ <el-text type="primary" tag="b">{{ scope.row.currentStock || 0 }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒嗘嫞鏁伴噺" width="80" align="right">
+ <template #default="scope">
+ <el-text type="warning">{{ scope.row.assignQuantity }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column label="宸插垎鎷�" width="70" align="right">
+ <template #default="scope">
+ <el-text type="success">{{ scope.row.sortedQuantity || 0 }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍓╀綑搴撳瓨" width="80" align="right">
+ <template #default="scope">
+ <el-text type="info">{{ calculateRemainingStock(scope.row) }}</el-text>
+ </template>
+ </el-table-column>
+ <el-table-column prop="unit" label="鍗曚綅" width="100" align="center" />
+ <el-table-column prop="locationCode" label="搴撲綅" width="150" />
+ <el-table-column label="鐘舵��" width="80" align="center">
+ <template #default="scope">
+ <el-tag :type="getStockStatusType(scope.row)" size="mini">
+ {{ getStockStatusText(scope.row) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div> -->
</div>
<print-view ref="printView" @parentcall="parentcall"></print-view>
@@ -253,7 +341,8 @@
confirmDialogVisible: false,
confirmMessage: '',
currentAction: null,
- executeLoading: false
+ executeLoading: false,
+ matMixed: true
}
},
computed: {
@@ -300,8 +389,9 @@
try {
this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
if (response.status) {
- if (response.data.length > 0) {
- this.unpickedData = response.data
+ if (response.data.outStockLockInfos.length > 0) {
+ this.unpickedData = response.data.outStockLockInfos;
+ this.matMixed = response.data.isMatMixed;
this.calculateUnpickedStats()
// 鑷姩鑱氱劍鍒扮墿鏂欐潯鐮佽緭鍏ユ
@@ -589,6 +679,71 @@
return '鏈櫥褰曠敤鎴�'
},
+ // 璁$畻鍒嗘嫞鎬绘暟
+ calculateTotalAssignQuantity() {
+ return this.unpickedData.reduce((sum, item) => {
+ return sum + (item.assignQuantity || 0)
+ }, 0)
+ },
+
+ // 璁$畻宸插垎鎷f�绘暟
+ calculateTotalSortedQuantity() {
+ return this.unpickedData.reduce((sum, item) => {
+ return sum + (item.sortedQuantity || 0)
+ }, 0)
+ },
+
+ // 璁$畻鏈垎鎷f�绘暟
+ calculateTotalUnsortedQuantity() {
+ return this.unpickedData.reduce((sum, item) => {
+ const assignQty = item.assignQuantity || 0
+ const sortedQty = item.sortedQuantity || 0
+ return sum + Math.max(0, assignQty - sortedQty)
+ }, 0)
+ },
+
+ // 妫�鏌ユ槸鍚﹀寘鍚暣鍑�
+ hasWholeOut() {
+ return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && this.matMixed;
+ },
+
+ // 璁$畻鍓╀綑搴撳瓨
+ calculateRemainingStock(row) {
+ const currentStock = row.currentStock || 0
+ const assignQty = row.assignQuantity || 0
+ return Math.max(0, currentStock - assignQty)
+ },
+
+ // 鑾峰彇搴撳瓨鐘舵�佺被鍨�
+ getStockStatusType(row) {
+ const currentStock = row.currentStock || 0
+ const assignQty = row.assignQuantity || 0
+ const sortedQty = row.sortedQuantity || 0
+
+ if (sortedQty >= assignQty) {
+ return 'success' // 宸插畬鎴�
+ } else if (currentStock < assignQty) {
+ return 'danger' // 搴撳瓨涓嶈冻
+ } else {
+ return 'warning' // 杩涜涓�
+ }
+ },
+
+ // 鑾峰彇搴撳瓨鐘舵�佹枃鏈�
+ getStockStatusText(row) {
+ const currentStock = row.currentStock || 0
+ const assignQty = row.assignQuantity || 0
+ const sortedQty = row.sortedQuantity || 0
+
+ if (sortedQty >= assignQty) {
+ return '宸插畬鎴�'
+ } else if (currentStock < assignQty) {
+ return '搴撳瓨涓嶈冻'
+ } else {
+ return '鍒嗘嫞涓�'
+ }
+ },
+
getStatusType(status) {
const statusMap = {
0: 'info', // 寰呭鐞�
@@ -802,4 +957,118 @@
::v-deep .el-descriptions__content {
color: #606266;
}
+
+/* 琛ㄦ牸澧炲己鏍峰紡 */
+::v-deep .el-table th {
+ background-color: #fafafa;
+ font-weight: 600;
+ color: #303133;
+}
+
+::v-deep .el-table .el-text {
+ font-weight: 500;
+}
+
+/* 鏍囩鏍峰紡澧炲己 */
+::v-deep .el-tag--small {
+ font-weight: 500;
+}
+
+/* 鎻愮ず淇℃伅鏍峰紡澧炲己 */
+.scan-alert ::v-deep .el-alert__content {
+ width: 100%;
+}
+
+.scan-alert ::v-deep .el-alert__description {
+ margin-top: 8px;
+}
+
+/* 鍒嗘嫞缁熻淇℃伅鏍峰紡 */
+.picking-stats {
+ margin-top: 20px;
+ padding: 0 10px;
+}
+
+.stats-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ align-items: center;
+}
+
+.stat-item {
+ display: inline-flex;
+ align-items: center;
+}
+
+.stat-item .el-tag {
+ display: flex;
+ align-items: center;
+ padding: 6px 12px;
+ font-size: 13px;
+ border-radius: 20px;
+}
+
+.stat-item .el-tag i {
+ margin-right: 6px;
+ font-size: 14px;
+}
+
+.stat-item b {
+ margin-left: 4px;
+ font-size: 14px;
+}
+
+/* 鍒嗗壊绾挎牱寮� */
+::v-deep .el-divider__text {
+ background-color: #f5f5f5;
+ padding: 0 20px;
+}
+
+/* 鎵樼洏搴撳瓨淇℃伅鏍峰紡 */
+.pallet-inventory {
+ margin-top: 20px;
+ padding: 0 10px;
+}
+
+.inventory-container {
+ margin-top: 10px;
+}
+
+.inventory-table {
+ width: 100%;
+}
+
+.inventory-table ::v-deep .el-table__header {
+ background-color: #f0f9ff;
+}
+
+.inventory-table ::v-deep .el-table__header th {
+ background-color: #e1f3ff;
+ color: #1f2937;
+ font-weight: 600;
+ font-size: 12px;
+ padding: 8px 0;
+}
+
+.inventory-table ::v-deep .el-table__body td {
+ padding: 6px 0;
+ font-size: 12px;
+}
+
+.inventory-table ::v-deep .el-table__row {
+ cursor: pointer;
+}
+
+.inventory-table ::v-deep .el-table__row:hover {
+ background-color: #f0f9ff;
+}
+
+/* 搴撳瓨琛ㄦ牸涓殑鏍囩鏍峰紡 */
+.inventory-table ::v-deep .el-tag--mini {
+ font-size: 11px;
+ padding: 1px 6px;
+ height: 18px;
+ line-height: 16px;
+}
</style>
\ 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.1204.46620/CodeChunks.db" "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.1204.46620/CodeChunks.db"
index 2451278..f18394b 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.1204.46620/CodeChunks.db"
+++ "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.1204.46620/CodeChunks.db"
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.1204.46620/SemanticSymbols.db" "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.1204.46620/SemanticSymbols.db"
index 62c47dc..4bceba3 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.1204.46620/SemanticSymbols.db"
+++ "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.1204.46620/SemanticSymbols.db"
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/BasicService.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/BasicService.cs"
index d59f13f..269547c 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/BasicService.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/BasicService.cs"
@@ -109,7 +109,7 @@
throw new Exception($"杞崲鍚庡崟浣嶄笉鑳戒负绌�");
}
- decimal ratio = 0;
+ decimal ratio = 1;
if (fromUnit.Trim().ToLower() == toUnit.Trim().ToLower())
{
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/MESOperation/FeedbackMesService.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/MESOperation/FeedbackMesService.cs"
index c084617..412dba3 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/MESOperation/FeedbackMesService.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/MESOperation/FeedbackMesService.cs"
@@ -14,6 +14,7 @@
using WIDESEA_DTO.ReturnMES;
using WIDESEA_IBasicService;
using WIDESEA_Model.Models;
+using static HslCommunication.Profinet.Knx.KnxCode;
namespace WIDESEA_BasicService.MESOperation
{
@@ -23,27 +24,189 @@
private readonly HttpClientHelper _httpClientHelper;
private readonly IRepository<Dt_OutboundOrder> _outboundOrderRepository;
private readonly IBasicService _basicService;
+ private readonly IRepository<Dt_AllocateOrder> _allocateRepository;
- public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService) : base(BaseDal)
+ public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService, IRepository<Dt_AllocateOrder> allocateRepository) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
_httpClientHelper = httpClientHelper;
_outboundOrderRepository = outboundOrderRepository;
_basicService = basicService;
+ _allocateRepository = allocateRepository;
}
- public void MaterialOutboundFeedback(string orderNo)
+ public WebResponseContent OutboundFeedback(string orderNo)
{
try
{
Dt_OutboundOrder outboundOrder = _outboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).Includes(x => x.Details).First();
if (outboundOrder == null)
{
- // todo 璁板綍鏃ュ織锛氭湭鎵惧埌瀵瑰簲鐨勫嚭搴撳崟
-
- return;
+ return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑鍑哄簱鍗曚俊鎭�");
+ }
+ HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+ string reqCode = Guid.NewGuid().ToString();
+ string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string requestData = string.Empty;
+ List<string> lineNos = new List<string>();
+ if (outboundOrder.OrderType == 0)
+ {
+ MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
+ if (returnDTO == null)
+ {
+ return WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+ }
+ string apiUrl = "";
+ returnDTO.ReqCode = reqCode;
+ returnDTO.ReqTime = reqTime;
+ requestData = returnDTO.Serialize();
+ lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+ httpResponseResult.ApiUrl = apiUrl;
+ }
+ else
+ {
+ Dt_AllocateOrder allocateOrder = _allocateRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+ if (allocateOrder == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑璋冩嫧鍗�");
+ }
+ AllocationReturnDTO? returnDTO = BuildAllocationFeedbackData(outboundOrder, allocateOrder.FromWarehouse, allocateOrder.ToWarehouse);
+ if (returnDTO == null)
+ {
+ return WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+ }
+ string apiUrl = "";
+ returnDTO.ReqCode = reqCode;
+ returnDTO.ReqTime = reqTime;
+ requestData = returnDTO.Serialize();
+ lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+ httpResponseResult.ApiUrl = apiUrl;
}
+ bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data != null && httpResponseResult.Data.Code == "200";
+ string message = "鎴愬姛";
+ if (!isSuccess)
+ {
+ if (!httpResponseResult.IsSuccess)
+ {
+ message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+ }
+ else if (httpResponseResult.Data.Code != "200")
+ {
+ message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult.Data.Code}锛屼俊鎭細{httpResponseResult.Data.Message}";
+ }
+ }
+
+ Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+ {
+ ApiUrl = httpResponseResult.ApiUrl,
+ InterfaceType = 1,
+ OrderId = outboundOrder.Id,
+ OrderNo = outboundOrder.OrderNo,
+ OrderType = outboundOrder.OrderType,
+ RequestCode = reqCode,
+ RequestData = requestData,
+ FailureReason = message,
+ LastReturnTime = DateTime.Now,
+ HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+ ResponseData = httpResponseResult.Content,
+ ReturnType = 0,
+ ReturnCount = 1,
+ ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2,
+ SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
+ };
+
+ _unitOfWorkManage.BeginTran();
+ _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+ if (isSuccess)
+ {
+ List<Dt_OutboundOrderDetail> outboundOrderDetails = outboundOrder.Details.Where(x => lineNos.Contains(x.lineNo)).ToList();
+ outboundOrderDetails.ForEach(x =>
+ {
+ if (x.OverOutQuantity == x.OrderQuantity - x.MoveQty)
+ {
+ x.ReturnToMESStatus = isSuccess ? 1 : 2;
+ }
+ else
+ {
+ x.ReturnToMESStatus = isSuccess ? 3 : 4;
+ }
+ x.CurrentDeliveryQty = 0;
+ x.ReturnJsonData = "";
+ });
+
+ _outboundOrderRepository.Db.Updateable(outboundOrderDetails).ExecuteCommand();
+ }
+
+ _unitOfWorkManage.CommitTran();
+
+ WebResponseContent responseContent = new WebResponseContent();
+ responseContent.Status = isSuccess;
+ responseContent.Message = message;
+ return responseContent;
+ }
+ catch(Exception ex)
+ {
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
+
+ public AllocationReturnDTO? BuildAllocationFeedbackData(Dt_OutboundOrder outboundOrder, string fromWarehouse, string toWarehouse)
+ {
+ try
+ {
+ List<Dt_OutboundOrderDetail> details = outboundOrder.Details;
+
+ List<AllocationDetail> returnDetails = new List<AllocationDetail>();
+
+ foreach (var detail in details)
+ {
+ List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+ if (barcodes != null && barcodes.Any())
+ {
+ UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+ UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+ returnDetails.Add(new AllocationDetail
+ {
+ Barcodes = barcodes,
+ BatchNo = detail.BatchNo,
+ LineNo = detail.lineNo,
+ MaterialCode = detail.MaterielCode,
+ Qty = totalResult.ToQuantity,
+ WarehouseCode = detail.WarehouseCode,
+ Unit = detail.BarcodeUnit
+ });
+ }
+ }
+
+ AllocationReturnDTO outboundReturnDTO = new AllocationReturnDTO()
+ {
+ Business_type = outboundOrder.BusinessType,
+ Details = returnDetails,
+ FactoryArea = outboundOrder.FactoryArea,
+ OperationType = 1,
+ OrderNo = outboundOrder.OrderNo,
+ FromWarehouse = fromWarehouse,
+ ToWarehouse = toWarehouse
+ };
+
+ return outboundReturnDTO;
+
+ }
+ catch (Exception ex)
+ {
+ return null;
+ }
+ }
+
+ public void MaterialOutboundFeedback(Dt_OutboundOrder outboundOrder)
+ {
+ try
+ {
MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
if (returnDTO != null)
{
@@ -112,7 +275,6 @@
{
throw new Exception(ex.Message);
}
-
}
public MaterialOutboundReturnDTO? BuildOutboundFeedbackData(Dt_OutboundOrder outboundOrder)
@@ -125,22 +287,25 @@
foreach (var detail in details)
{
- List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
- if (barcodes != null && barcodes.Any())
+ if (!string.IsNullOrWhiteSpace(detail.ReturnJsonData))
{
- UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
- UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
-
- returnDetails.Add(new MaterialOutboundDetail
+ List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+ if (barcodes != null && barcodes.Any())
{
- Barcodes = barcodes,
- CurrentDeliveryQty = currentResult.ToQuantity,
- LineNo = detail.lineNo,
- MaterialCode = detail.MaterielCode,
- Qty = totalResult.ToQuantity,
- WarehouseCode = detail.WarehouseCode,
- Unit = detail.BarcodeUnit
- });
+ UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+ UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+ returnDetails.Add(new MaterialOutboundDetail
+ {
+ Barcodes = barcodes,
+ CurrentDeliveryQty = currentResult.ToQuantity,
+ LineNo = detail.lineNo,
+ MaterialCode = detail.MaterielCode,
+ Qty = totalResult.ToQuantity,
+ WarehouseCode = detail.WarehouseCode,
+ Unit = detail.BarcodeUnit
+ });
+ }
}
}
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_Core/Middlewares/ApiLogMiddleware.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_Core/Middlewares/ApiLogMiddleware.cs"
index d047780..921dfc3 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_Core/Middlewares/ApiLogMiddleware.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_Core/Middlewares/ApiLogMiddleware.cs"
@@ -93,7 +93,7 @@
ms.Position = 0;
await ms.CopyToAsync(originalBody);
- if (!ignoreUrls.Any(x => context.Request.Path.Value?.Contains(x) ?? false))
+ if (!ignoreUrls.Any(x => context.Request.Path.Value?.ToLower().Contains(x.ToLower()) ?? false))
{
Logger.Add(requestParam, responseParam);
}
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_Core/Seed/DBSeed.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_Core/Seed/DBSeed.cs"
index 4a92f35..a4577ea 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_Core/Seed/DBSeed.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_Core/Seed/DBSeed.cs"
@@ -138,33 +138,33 @@
}
#endregion
}
- else
- {
- List<string> columnNames = dbContext.Db.DbMaintenance.GetColumnInfosByTableName(t.Name, false).Select(x => x.DbColumnName).ToList();
- if (t.GetProperties().FirstOrDefault(x => !columnNames.Contains(x.Name)) != null)
- {
- bool isChange = true;
- List<PropertyInfo> propertyInfos = t.GetProperties().Where(x => !columnNames.Contains(x.Name)).ToList();
- for (int i = 0; i < propertyInfos.Count; i++)
- {
- PropertyInfo propertyInfo = propertyInfos[i];
- SugarColumn? sugarColumn = propertyInfo.GetCustomAttribute<SugarColumn>();
- if (sugarColumn != null)
- {
- if (!sugarColumn.IsIgnore)
- {
- if (!sugarColumn.IsNullable)
- {
- isChange = false;
- break;
- }
- }
- }
- }
- if (isChange)
- dbContext.Db.CodeFirst.InitTables(t);
- }
- }
+ //else
+ //{
+ // List<string> columnNames = dbContext.Db.DbMaintenance.GetColumnInfosByTableName(t.Name, false).Select(x => x.DbColumnName).ToList();
+ // if (t.GetProperties().FirstOrDefault(x => !columnNames.Contains(x.Name)) != null)
+ // {
+ // bool isChange = true;
+ // List<PropertyInfo> propertyInfos = t.GetProperties().Where(x => !columnNames.Contains(x.Name)).ToList();
+ // for (int i = 0; i < propertyInfos.Count; i++)
+ // {
+ // PropertyInfo propertyInfo = propertyInfos[i];
+ // SugarColumn? sugarColumn = propertyInfo.GetCustomAttribute<SugarColumn>();
+ // if (sugarColumn != null)
+ // {
+ // if (!sugarColumn.IsIgnore)
+ // {
+ // if (!sugarColumn.IsNullable)
+ // {
+ // isChange = false;
+ // break;
+ // }
+ // }
+ // }
+ // }
+ // if (isChange)
+ // dbContext.Db.CodeFirst.InitTables(t);
+ // }
+ //}
});
ConsoleHelper.WriteSuccessLine($"Tables Created Successfully!");
Console.WriteLine();
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_Core/Util/HttpClientHelper.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_Core/Util/HttpClientHelper.cs"
index ad490ce..cd7019e 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_Core/Util/HttpClientHelper.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_Core/Util/HttpClientHelper.cs"
@@ -39,7 +39,7 @@
SetRequestHeaders(request, config?.Headers);
return await client.SendAsync(request);
}, config, $"POST {url}").Result;
-
+ httpResponseResult.ApiUrl = url;
return httpResponseResult;
}
@@ -52,6 +52,7 @@
return await client.SendAsync(request);
}, config, $"GET {url}").Result;
+ httpResponseResult.ApiUrl = url;
return httpResponseResult;
}
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_Core/Util/HttpResponseResult.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_Core/Util/HttpResponseResult.cs"
index c95db38..da3a920 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_Core/Util/HttpResponseResult.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_Core/Util/HttpResponseResult.cs"
@@ -46,6 +46,11 @@
/// 寮傚父淇℃伅
/// </summary>
public Exception Exception { get; set; }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public string ApiUrl { 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_DTO/Base/UnitConvertResultDTO.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/Base/UnitConvertResultDTO.cs"
index b6d6873..ed738a7 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/Base/UnitConvertResultDTO.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/Base/UnitConvertResultDTO.cs"
@@ -39,7 +39,7 @@
/// <summary>
///
/// </summary>
- public decimal UnitRatio { get; set; }
+ public decimal UnitRatio { get; set; } = 1;
/// <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/ReturnMES/AllocationReturnDTO.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/ReturnMES/AllocationReturnDTO.cs"
new file mode 100644
index 0000000..4e1f69b
--- /dev/null
+++ "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/ReturnMES/AllocationReturnDTO.cs"
@@ -0,0 +1,92 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_DTO.ReturnMES
+{
+ /// <summary>
+ ///
+ /// </summary>
+ public class AllocationReturnDTO : BaseReturnDTO
+ {
+ /// <summary>
+ ///
+ /// </summary>
+ public string OrderNo { get; set; }
+
+ /// <summary>
+ /// 鍘傚尯
+ /// </summary>
+ public string FactoryArea { get; set; }
+
+ /// <summary>
+ /// 涓氬姟绫诲瀷
+ /// </summary>
+ public string Business_type { get; set; }
+
+ /// <summary>
+ /// 1鏂板2淇敼3鍒犻櫎
+ /// </summary>
+ public int OperationType { get; set; }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public string FromWarehouse { get; set; }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public string ToWarehouse { get; set; }
+
+ /// <summary>
+ /// 鏄庣粏
+ /// </summary>
+ public List<AllocationDetail> Details { get; set; }
+ }
+
+
+ /// <summary>
+ /// 鏄庣粏
+ /// </summary>
+ public class AllocationDetail
+ {
+ /// <summary>
+ /// 鐗╂枡缂栫爜
+ /// </summary>
+ public string MaterialCode { get; set; }
+
+ /// <summary>
+ /// 琛屽彿
+ /// </summary>
+ public string LineNo { get; set; }
+
+ /// <summary>
+ /// 鏁伴噺
+ /// </summary>
+ public decimal Qty { get; set; }
+
+ /// <summary>
+ ///
+ /// </summary>
+ public string BatchNo { get; set; }
+
+ /// <summary>
+ /// 浠撳簱
+ /// </summary>
+ public string WarehouseCode { get; set; }
+
+ /// <summary>
+ /// 鍗曚綅
+ /// </summary>
+ public string Unit { get; set; }
+
+ /// <summary>
+ /// 鏉$爜淇℃伅
+ /// </summary>
+ public List<Barcodes> Barcodes { 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_DTO/ReturnMES/FeedbackMesResult.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/ReturnMES/FeedbackMesResult.cs"
new file mode 100644
index 0000000..9d333d5
--- /dev/null
+++ "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/ReturnMES/FeedbackMesResult.cs"
@@ -0,0 +1,15 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEA_DTO.ReturnMES
+{
+ /// <summary>
+ ///
+ /// </summary>
+ public class FeedbackMesResult
+ {
+ }
+}
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/MESOperation/IFeedbackMesService.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/MESOperation/IFeedbackMesService.cs"
index d25a817..bd0825b 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/MESOperation/IFeedbackMesService.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/MESOperation/IFeedbackMesService.cs"
@@ -9,6 +9,6 @@
{
public interface IFeedbackMesService : IDependency
{
- void MaterialOutboundFeedback(string orderNo);
+ WebResponseContent OutboundFeedback(string orderNo);
}
}
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_OutboundOrderDetail.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_OutboundOrderDetail.cs"
index 47e75c2..d38c497 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_OutboundOrderDetail.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_OutboundOrderDetail.cs"
@@ -90,28 +90,28 @@
/// 鎸枡鏁伴噺
/// 榛樿鍊�:
///</summary>
- [SugarColumn(ColumnName = "MoveQty", ColumnDescription = "鎸枡鏁伴噺", IsNullable = true)]
+ [SugarColumn(ColumnDescription = "鎸枡鏁伴噺", IsNullable = true)]
public decimal MoveQty { get; set; }
/// <summary>
/// 渚涘簲鍟嗙紪鍙�
/// 榛樿鍊�:
///</summary>
- [SugarColumn(ColumnName = "supplyCode", ColumnDescription = "渚涘簲鍟嗙紪鍙�", IsNullable = true)]
+ [SugarColumn(ColumnDescription = "渚涘簲鍟嗙紪鍙�", IsNullable = true)]
public string? SupplyCode { get; set; }
/// <summary>
/// 鏁伴噺
/// 榛樿鍊�:
///</summary>
- [SugarColumn(ColumnName = "barcodeQty", ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
+ [SugarColumn(ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
public decimal BarcodeQty { get; set; }
/// <summary>
/// 鍗曚綅
/// 榛樿鍊�:
///</summary>
- [SugarColumn(ColumnName = "barcodeUnit", ColumnDescription = "鍗曚綅", IsNullable = true)]
+ [SugarColumn(ColumnDescription = "鍗曚綅", IsNullable = true)]
public string BarcodeUnit { get; set; } = null!;
@@ -119,13 +119,13 @@
///
/// 榛樿鍊�:
///</summary>
- [SugarColumn(ColumnName = "barcodemoveQty", ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
+ [SugarColumn(ColumnDescription = "鏁伴噺", DefaultValue = "0", IsNullable = true)]
public decimal BarcodeMoveQty { get; set; }
/// <summary>
/// 浠撳簱
/// 榛樿鍊�:
///</summary>
- [SugarColumn(ColumnName = "warehouseCode", ColumnDescription = "浠撳簱", IsNullable = true)]
+ [SugarColumn(ColumnDescription = "浠撳簱", IsNullable = true)]
public string? WarehouseCode { get; set; }
/// <summary>
@@ -142,7 +142,7 @@
[SugarColumn(IsIgnore = true)]
public decimal NeedOutQuantity => OrderQuantity - MoveQty;
- [SugarColumn(IsNullable = true, ColumnDescription = "")]
+ [SugarColumn(IsNullable = true, ColumnDescription = "", IsIgnore = true)]
public decimal PickedQty { get; set; }
[SugarColumn(IsNullable = true, ColumnDescription = "")]
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 5acca1f..250becf 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"
@@ -642,8 +642,6 @@
}
}
}
-
-
}
}
return new PageGridData<Dt_OutboundOrderDetail>();
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/OutboundQueryService.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/OutboundQueryService.cs"
index 1c71196..956e03f 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/OutboundQueryService.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/OutboundQueryService.cs"
@@ -18,8 +18,19 @@
{
try
{
+ Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
+
+ bool isMatMixed = stockInfo.Details.GroupBy(x => new
+ {
+ x.MaterielCode,
+ x.MaterielName,
+ x.BatchNo,
+ x.SupplyCode,
+ x.WarehouseCode
+ }).Count() > 1;
+
List<Dt_OutStockLockInfo> outStockLockInfos = _outboundLockInfoRepository.QueryData(x => x.PalletCode == palletCode && x.OrderNo == orderNo);
- return WebResponseContent.Instance.OK(data: outStockLockInfos);
+ return WebResponseContent.Instance.OK(data: new { outStockLockInfos, stockInfo, isMatMixed });
}
catch (Exception ex)
{
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/OutboundService.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/OutboundService.cs"
index aa37561..5554dbb 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/OutboundService.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/OutboundService.cs"
@@ -138,14 +138,18 @@
pickedDetails.AddRange(materielPickedDetails.PickedDetails);
+ decimal allallocatedQuantity = materielCalc.UnallocatedQuantity;
// 鏇存柊鍑哄簱鍗曟槑缁嗭紙澧炲姞閿佸畾鏁伴噺锛屼笉澧炲姞宸插嚭鏁伴噺锛�
foreach (var detail in materielCalc.Details)
{
+ if (allallocatedQuantity <= 0) break;
+
decimal lockQuantity = (detail.OrderQuantity - detail.OverOutQuantity);
if (lockQuantity < materielCalc.UnallocatedQuantity)
{
detail.LockQuantity += lockQuantity; // 澧炲姞閿佸畾鏁伴噺 涓嶆洿鏂� OverOutQuantity 鍜� OrderDetailStatus锛屽洜涓鸿繕娌℃湁瀹為檯鍑哄簱
outboundOrderDetails.Add(detail);
+ materielCalc.UnallocatedQuantity -= lockQuantity;
}
else
{
@@ -267,6 +271,18 @@
return result;
}
+ decimal inputQuantity = request.OutboundQuantity.Value;
+ List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
+ foreach (var item in selectedDetails)
+ {
+ inputQuantity -= (item.OrderQuantity - item.MoveQty - item.LockQuantity);
+ outboundOrderDetails.Add(item);
+ if (inputQuantity <= 0)
+ {
+ break;
+ }
+ }
+
result.MaterielCalculations = new List<MaterielOutboundCalculationDTO>()
{
new MaterielOutboundCalculationDTO
@@ -281,9 +297,11 @@
AssignedQuantity = lockQuantity,
UnallocatedQuantity = request.OutboundQuantity.Value,
MovedQuantity = moveQuantity,
- Details = selectedDetails
+ Details = outboundOrderDetails
}
};
+
+ outboundOrder.Details = outboundOrderDetails;
}
result.CanOutbound = true;
@@ -790,7 +808,7 @@
}
#endregion
-
+ #region 鎷i��
/// <summary>
/// 鍑哄簱瀹屾垚澶勭悊锛堟壂鎻忔潯鐮佹墸鍑忓簱瀛橈級
/// </summary>
@@ -885,12 +903,12 @@
return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽凡鍑哄簱锛歿totalAllocatedQuantity}锛屽垎閰嶉噺锛歿lockInfo.AssignQuantity}锛屾槑缁嗗墿浣欙細{detailRemainingQuantity}");
}
- if (actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity)
- {
- response.Success = false;
- response.Message = $"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}";
- return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}");
- }
+ //if (actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity)
+ //{
+ // response.Success = false;
+ // response.Message = $"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}";
+ // return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}");
+ //}
// 8. 鍒ゆ柇鏄惁闇�瑕佹媶鍖咃紙褰撳嚭搴撴暟閲忓皬浜庡簱瀛樻暟閲忔椂闇�瑕佹媶鍖咃級
bool isUnpacked = actualOutboundQuantity < stockDetail.StockQuantity;
@@ -930,6 +948,8 @@
// item.OverOutQuantity = item.OrderQuantity - item.MoveQty;
//}
+ decimal barcodeQuantity = allocatedQuantity;
+
if (item.LockQuantity - item.OverOutQuantity >= allocatedQuantity)
{
item.OverOutQuantity += allocatedQuantity;
@@ -938,6 +958,7 @@
}
else
{
+ barcodeQuantity = item.LockQuantity - item.OverOutQuantity;
allocatedQuantity -= (item.LockQuantity - item.OverOutQuantity);
item.OverOutQuantity = item.LockQuantity;
item.CurrentDeliveryQty = item.LockQuantity;
@@ -949,7 +970,7 @@
Barcodes barcodes = new Barcodes
{
Barcode = request.Barcode,
- Qty = actualOutboundQuantity,
+ Qty = barcodeQuantity,
SupplyCode = stockDetail?.SupplyCode ?? "",
BatchNo = stockDetail?.BatchNo ?? "",
Unit = stockDetail?.Unit ?? ""
@@ -1012,6 +1033,7 @@
if (CheckOutboundOrderCompleted(request.OrderNo))
{
UpdateOutboundOrderStatus(request.OrderNo, OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt());
+
//todo: 鍥炰紶MES
}
@@ -1325,5 +1347,7 @@
// 妫�鏌ユ墍鏈夋槑缁嗙殑宸插嚭鏁伴噺鏄惁閮界瓑浜庡崟鎹暟閲�
return details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty);
}
+
+ #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_WMSServer/Controllers/Basic/MesFeedbackController.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/Basic/MesFeedbackController.cs"
new file mode 100644
index 0000000..68826cb
--- /dev/null
+++ "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/Basic/MesFeedbackController.cs"
@@ -0,0 +1,24 @@
+锘縰sing Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
+using WIDESEA_IBasicService;
+
+namespace WIDESEA_WMSServer.Controllers.Basic
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class MesFeedbackController : ControllerBase
+ {
+ private readonly IFeedbackMesService _feedbackMesService;
+ public MesFeedbackController(IFeedbackMesService feedbackMesService)
+ {
+ _feedbackMesService = feedbackMesService;
+ }
+
+ [HttpPost, HttpGet, Route("OutboundFeedback")]
+ public WebResponseContent OutboundFeedback(string orderNo)
+ {
+ return _feedbackMesService.OutboundFeedback(orderNo);
+ }
+ }
+}
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/OutboundController.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/OutboundController.cs"
index dab5a3a..8535a25 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/OutboundController.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/OutboundController.cs"
@@ -40,17 +40,22 @@
}
}
+ object lockObj = new object();
+
[HttpPost, Route("CompleteOutboundWithBarcode"), AllowAnonymous]
public WebResponseContent CompleteOutboundWithBarcode([FromBody] OutboundCompleteRequestDTO request)
{
try
{
- if (!ModelState.IsValid)
- return WebResponseContent.Instance.Error(string.Join("; ", ModelState.Values
- .SelectMany(v => v.Errors)
- .Select(e => e.ErrorMessage)));
+ lock (lockObj)
+ {
+ if (!ModelState.IsValid)
+ return WebResponseContent.Instance.Error(string.Join("; ", ModelState.Values
+ .SelectMany(v => v.Errors)
+ .Select(e => e.ErrorMessage)));
- return _outboundService.CompleteOutboundWithBarcode(request);
+ return _outboundService.CompleteOutboundWithBarcode(request);
+ }
}
catch (Exception ex)
{
--
Gitblit v1.9.3