647556386
2026-01-19 8d99d2006c3f91bb97dbec7b5d9f0b599a9ecd42
问题点优化
已修改17个文件
139 ■■■■ 文件已修改
项目代码/WIDESEA_WMSClient/config/buttons.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/inbound/extend/OrderStockTake.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/extension/outbound/extend/outOrderDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/inbound/takeStockOrderDetail.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/outbound/outPicking.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEA_WMSClient/src/views/outbound/recheckOutPicking.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_CheckService/ReCheckOrderService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundQueryService.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderController.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEA_WMSClient/config/buttons.js
@@ -284,7 +284,7 @@
    onClick: function () {
    }
},{
    name: "单 æ® ç›˜ äº æ“ ä½œ",
    name: "单据盘点与回库操作",
    icon: '',
    class: '',
    value: 'OrderStockTake',
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/inbound/extend/OrderStockTake.vue
@@ -5,7 +5,7 @@
      :lazy="true"
      :width="isMobile ? '95%' : '70%'"
      :padding="24"
      title="库存盘点操作"
      title="库存盘点操作(条码盘盈不需要进行盘点完成操作)"
      class="custom-vol-box"
    >
      <div class="stock-take-container">
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/outbound/extend/outOrderDetail.vue
@@ -41,7 +41,7 @@
              <el-link
                type="primary"
                size="small"
                v-if="isBatch === 0"
                v-if="isBatch === 0 && mainBusinessType != '30'"
                style="float: right; height: 20px; margin-right: 10px"
                @click="outbound"
                >直接出库</el-link
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/allocateinboundOrder.vue
@@ -184,7 +184,7 @@
        field: "returnToMESStatus",
        title: "回传MES状态",
        width: 120,
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" }] },
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" },{ key: 5, value: "无需回传" }] },
      },
      {
        field: "creater",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue
@@ -169,7 +169,7 @@
        field: "returnToMESStatus",
        title: "回传MES状态",
        width: 120,
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" }] },
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" },{ key: 5, value: "无需回传" }] },
      },
      {
        field: "factoryArea",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/inbound/takeStockOrderDetail.vue
@@ -170,24 +170,6 @@
            edit: { type: "decimal" }
          },
          {
            field: "qty",
            title: "实盘数量",
            type: "decimal",
            width: 90,
            align: "left",
            required: true,
            edit: { type: "decimal" }
          },
          {
            field: "differenceQty",
            title: "待平账数量",
            type: "decimal",
            width: 90,
            align: "left",
            required: true,
            edit: { type: "decimal" }
          },
          {
            field: "unit",
            title: "单位",
            type: "string",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/allocateoutboundOrder.vue
@@ -194,7 +194,7 @@
        field: "returnToMESStatus",
        title: "回传MES状态",
        width: 120,
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" }] },
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" },{ key: 5, value: "无需回传" }] },
      },
      {
        field: "departmentCode",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/outPicking.vue
@@ -505,6 +505,7 @@
                        if (response.data.outStockLockInfos.length > 0) {
                            this.unpickedData = response.data.outStockLockInfos;
                            this.matMixed = response.data.isMatMixed;
                            this.orderOver = response.data.orderOver;
                            this.calculateUnpickedStats()
                            // æ£€æŸ¥æ˜¯å¦éœ€è¦æ•´å‡ºç¡®è®¤
                            this.$nextTick(() => {
@@ -882,7 +883,7 @@
        // æ£€æŸ¥æ˜¯å¦åŒ…含整出
        hasWholeOut() {
            return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && !this.matMixed
            return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && !this.matMixed && !this.orderOver
        },
        // è®¡ç®—剩余库存
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue
@@ -196,7 +196,7 @@
        field: "returnToMESStatus",
        title: "回传MES状态",
        width: 120,
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" }] },
        bind: { key: "createType", data: [{ key: 0, value: "未回传" }, { key: 1, value: "已回传成功" }, { key: 2, value: "回传失败" },{ key: 3, value: "部分回传成功" },{ key: 4, value: "部分回传失败" },{ key: 5, value: "无需回传" }] },
      },
      {
        field: "factoryArea",
@@ -315,6 +315,24 @@
          required: true,
        },
        {
          field: "unit",
          title: "库存单位",
          type: "string",
          width: 90,
          align: "left",
          edit: { type: "string" },
          required: true,
        },
        {
          field: "barcodeUnit",
          title: "出库单位",
          type: "string",
          width: 90,
          align: "left",
          edit: { type: "string" },
          required: true,
        },
        {
          field: "lineNo",
          title: "行号",
          type: "string",
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/recheckOutPicking.vue
@@ -22,10 +22,9 @@
        <!-- æ‰«ç æ“ä½œåŒºåŸŸ -->
        <el-card class="scan-section-card" shadow="never">
            <div class="scan-section">
                <el-alert title="请先扫描托盘码,再扫描物料条码进行拣选" type="info" :closable="false" show-icon class="scan-alert">
                <el-alert title="扫描托盘码可进行回库,扫描物料条码进行拣选" type="info" :closable="false" show-icon class="scan-alert">
                    <template #default>
                        <div>
                            <div>1. æ‰«ææ‰˜ç›˜ç  â†’ 2. æ‰«æç‰©æ–™æ¡ç è‡ªåŠ¨æ‹£é€‰</div>
                            <div style="margin-top: 8px; font-size: 13px; color: #666;">
                                <i class="el-icon-info" style="color: #409EFF;"></i>
                                æ‰«ææ¡ç åŽä¼šè‡ªåŠ¨è¯·æ±‚æ‹£é€‰æŽ¥å£ï¼Œæ— éœ€æ‰‹åŠ¨ç‚¹å‡»ç¡®è®¤
@@ -195,7 +194,9 @@
            globalLoading: false,
            loadingInstance: null,
            pickLoading: false,
            returnLoading: false
            returnLoading: false,
            // æ‰˜ç›˜ç æ­£åˆ™è¡¨è¾¾å¼
            palletCodeRegex: /^[A-Z]\d{9}$/
        }
    },
    computed: {
@@ -255,11 +256,30 @@
        },
        async handlePalletScan() {
            if (this.scanForm.palletCode) {
                this.scanForm.materialBarcode = ''
            } else {
            if (!this.scanForm.palletCode) {
                this.$message.warning('请输入托盘码')
                return
            }
            // éªŒè¯æ‰˜ç›˜ç æ ¼å¼
            if (!this.palletCodeRegex.test(this.scanForm.palletCode)) {
                this.$message.error('托盘码格式错误!正确格式应为:大写字母开头 + 9位数字(如A123456789)')
                // éªŒè¯å¤±è´¥ï¼šæ¸…空托盘码输入框并保持聚焦,方便连续扫描
                this.scanForm.palletCode = ''
                this.$nextTick(() => {
                    this.$refs.palletInput.focus()
                })
                return
            }
            // éªŒè¯é€šè¿‡ï¼šæ¸…空物料条码并聚焦到物料条码输入框
            this.scanForm.materialBarcode = ''
            this.$nextTick(() => {
                if (this.$refs.materialInput) {
                    this.$refs.materialInput.focus()
                }
            })
            this.$message.success('托盘码验证通过,请扫描物料条码')
        },
        async handleMaterialScan() {
@@ -363,6 +383,16 @@
                return
            }
            // é¢å¤–验证:回库操作前也验证托盘码格式
            if (!this.palletCodeRegex.test(this.scanForm.palletCode)) {
                this.$message.error('托盘码格式错误!正确格式应为:大写字母开头 + 9位数字(如A123456789)')
                this.scanForm.palletCode = ''
                this.$nextTick(() => {
                    this.$refs.palletInput.focus()
                })
                return
            }
            this.confirmMessage = `确定要将托盘 ${this.scanForm.palletCode} å›žåº“吗?`
            this.currentAction = 'returnToWarehouse'
            this.confirmDialogVisible = true
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs
@@ -7,6 +7,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
@@ -51,7 +52,10 @@
                {
                    return webResponse = WebResponseContent.Instance.Error($"未找到对应的出库单信息");
                }
                if(outboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt() || outboundOrder.CreateType == OrderCreateTypeEnum.CreateInSystem.ObjToInt())
                {
                    return webResponse = WebResponseContent.Instance.OK($"该单据无需回传MES");
                }
                List<Dt_MesReturnRecord> returnRecords = BaseDal.QueryData(x => x.OrderNo == orderNo && x.OrderId == outboundOrder.Id && x.ReturnStatus == 2);
                foreach (var item in returnRecords)
@@ -163,7 +167,7 @@
                        return webResponse = WebResponseContent.Instance.OK($"该单据没有需要回传明细,失败数据回传{returnRecords.Count()}条,回传成功{returnRecords.Count(x => x.ReturnStatus == 1)}条,回传失败{returnRecords.Count(x => x.ReturnStatus == 2)}条");
                    }
                    string apiUrl = AppSettings.GetValue("AllocationFeedbackUrl"); ;
                    string apiUrl = AppSettings.GetValue("AllocationFeedbackUrl");
                    returnDTO.ReqCode = reqCode;
                    returnDTO.ReqTime = reqTime;
                    JsonSerializerSettings settings = new JsonSerializerSettings
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_CheckService/ReCheckOrderService.cs
@@ -253,6 +253,7 @@
                Remark = "",
                DepartmentCode = "",
                DepartmentName = "",
                ReturnToMESStatus = 5,
                Details = new List<Dt_OutboundOrderDetail>()
            };
            outboundOrder.Details.Add(
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundQueryService.cs
@@ -4,6 +4,7 @@
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using SqlSugar.Extensions;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_DTO.CalcOut;
@@ -70,13 +71,28 @@
                    .QueryData(x => x.PalletCode == palletCode && x.OrderNo == orderNo);
                bool isMatMixed = false;
                bool orderOver = false;
                decimal sumQty = 0;
                if (stockInfo != null && stockInfo.Details != null && stockInfo.Details.Any())
                {
                    if (outStockLockInfos.FirstOrDefault() != null)
                    {
                        bool includeBatchNo = !string.IsNullOrEmpty(outStockLockInfos.FirstOrDefault().BatchNo);
                        bool includeSupplyCode = !string.IsNullOrEmpty(outStockLockInfos.FirstOrDefault().SupplyCode);
                        var orderId = outStockLockInfos.FirstOrDefault().OrderDetailIds.Split(",");
                        foreach (var item in orderId)
                        {
                            Dt_OutboundOrderDetail outboundOrderDetail = _outboundRepository.Db.Queryable<Dt_OutboundOrderDetail>().Where(x=>x.Id == item.ObjToInt()).First();
                            if(outboundOrderDetail == null)
                            {
                                return WebResponseContent.Instance.Error("该托盘的出库明细未找到");
                            }
                            sumQty += (outboundOrderDetail.OrderQuantity - outboundOrderDetail.OverOutQuantity - outboundOrderDetail.MoveQty);
                        }
                        if(sumQty < outStockLockInfos.FirstOrDefault().AssignQuantity)
                        {
                            orderOver = true;
                        }
                        if (includeBatchNo && includeSupplyCode)
                        {
                            isMatMixed = stockInfo.Details.GroupBy(x => new
@@ -131,7 +147,7 @@
                
                return WebResponseContent.Instance.OK(data: new { outStockLockInfos, stockInfo, isMatMixed });
                return WebResponseContent.Instance.OK(data: new { outStockLockInfos, stockInfo, isMatMixed, orderOver });
            }
            catch (Exception ex)
            {
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs
@@ -768,6 +768,10 @@
                Dt_OutboundOrder outboundOrder = _outboundRepository.QueryFirst(x => x.OrderNo == orderNo);
                if (outboundOrder == null) return false;
                outboundOrder.OrderStatus = status;
                if(outboundOrder.CreateType == OrderCreateTypeEnum.CreateInSystem.ObjToInt())
                {
                    outboundOrder.ReturnToMESStatus = 5;
                }
                _outboundRepository.UpdateData(outboundOrder);
                return true;
            }
@@ -1572,12 +1576,11 @@
                    {
                        UpdateOutboundOrderStatus(request.OrderNo, OutOrderStatusEnum.出库完成.ObjToInt());
                        if (outboundOrder.OrderType != OutOrderTypeEnum.InternalAllocat.ObjToInt())
                        if (outboundOrder.OrderType != OutOrderTypeEnum.InternalAllocat.ObjToInt() && outboundOrder.CreateType!=OrderCreateTypeEnum.CreateInSystem.ObjToInt())
                        {
                            _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo);
                        }
                    }
                }
                catch (Exception ex)
                {
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Allocate/AllocateOrderController.cs
@@ -5,6 +5,7 @@
using System.Diagnostics.Eventing.Reader;
using System.Threading.Tasks;
using WIDESEA_Common.AllocateEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.BaseController;
@@ -45,7 +46,7 @@
                BusinessType = model.BusinessType,
                FactoryArea = model.FactoryArea,
                IsBatch = model.IsBatch,
                CreateType = model.OperationType,
                CreateType =(int)OrderCreateTypeEnum.UpperSystemPush,
                FromWarehouse = model.fromWarehouse,
                ToWarehouse = model.toWarehouse,
                Details = new List<Dt_AllocateOrderDetail>()
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/InboundOrderController.cs
@@ -5,6 +5,7 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using SqlSugar;
using SqlSugar.Extensions;
using System.Net;
using System.Threading.Tasks;
using WIDESEA_BasicService;
@@ -200,6 +201,7 @@
                dt_InboundOrder.BusinessType = item.business_type;
                dt_InboundOrder.IsBatch = item.isBatch;
                dt_InboundOrder.FactoryArea = item.factoryArea;
                dt_InboundOrder.CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt();
                inboundOrders.Add(dt_InboundOrder);
            }
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Outbound/OutboundOrderController.cs
@@ -4,10 +4,12 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System.Threading.Tasks;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.BaseController;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
using WIDESEA_IOutboundService;
@@ -61,6 +63,7 @@
            dt_OutboundOrder.BusinessType = model.business_type;
            dt_OutboundOrder.IsBatch = model.isBatch;
            dt_OutboundOrder.FactoryArea = model.factoryArea;
            dt_OutboundOrder.CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt();
            var content =await Service.ReceiveOutboundOrder(dt_OutboundOrder, model.operationType);