wangxinhui
2025-02-17 a0beecb00c6c0c8247b0c9b29c440369f583eb40
退料,调拨优化等
已删除5个文件
已修改32个文件
已添加19个文件
1674 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/054489bd-234b-4089-9947-38a13fcde750.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/3e9cc858-6ac2-443f-971a-ce566dc6ef41.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9dd1bf7a-dee2-4f6e-8ac4-0b6e1e963918.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/fb1ebcba-9e21-4a69-97c4-99bc37244eb9.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/CTU_AGVController .cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/AGV_FLExtend.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/0f114663-dce3-4d0e-9b27-bfeaa6dfe2c7.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/1f069ca3-0197-4b08-8580-6ad491643add.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/5d432982-08c1-4c2c-9cb4-199bb27be3a0.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/637a2026-85ca-4ce6-92b0-9adf059b8fc4.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/78f8b249-7154-4dec-a3ca-180499c24279.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/8a5ddf5d-8657-4a5f-ac29-bc17a0fcefb0.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/InboundOrderMenu.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/OutboundOrderEnum.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/ReturnOrderEnum.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/CodeConfigEnum/RuleCodeEnum.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/ERP/ErpInOrderDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/ERP/ErpReturnOrderDTO.cs 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_External/ERPService/InvokeERPService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_External/IERPService/IInvokeERPService.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_External/Model/ERPReturnModel.cs 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundRepository/IInboundRepository.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundRepository/IReturnOrderDetailRepository.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundRepository/IReturnOrderRepository.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IReturnOrderDetailService.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IReturnOrderService.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundRepository/InboundRepository.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundRepository/ReturnOrderDetailRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundRepository/ReturnOrderRepository.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs 412 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReturnOrderDetailService.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReturnOrderService.cs 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/WIDESEA_InboundService.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_PurchaseOrderDetail.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_ReceiveOrderDetail.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_ReturnOrder.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_ReturnOrderDetail.cs 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrderDetail.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/StockInfoRepository.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ERP/ErpController.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/ReturnOrderController.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/淮安PDA/common/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/淮安PDA/uview-ui/libs/request/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/054489bd-234b-4089-9947-38a13fcde750.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/3e9cc858-6ac2-443f-971a-ce566dc6ef41.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/9dd1bf7a-dee2-4f6e-8ac4-0b6e1e963918.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/fb1ebcba-9e21-4a69-97c4-99bc37244eb9.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -35,6 +35,11 @@
        [Description("空箱出库")]
        OutEmpty = 140,
        /// <summary>
        /// è°ƒæ‹¨å‡ºåº“
        /// </summary>
        [Description("调拨出库")]
        OutAllocate = 150,
        /// <summary>
        /// MES出库
        /// </summary>
        [Description("MES出库")]
@@ -86,6 +91,12 @@
        MesMatReturn = 560,
        /// <summary>
        /// è°ƒæ‹¨å…¥åº“
        /// </summary>
        [Description("调拨入库")]
        InAllocate = 570,
        /// <summary>
        /// çº¿è¾¹ä»“入库
        /// </summary>
        [Description("线边仓入库")]
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGV/CTU_AGVController .cs
@@ -109,7 +109,7 @@
                if (agvUpdateModel.Method == "end")
                {
                    if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt()) PutFinish(task.NextAddress);
                    if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt()) PutFinish(task.NextAddress);
                    _taskService.TaskCompleted(task.TaskNum);
                }
                agvResponseContent.Code = "0";
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Program.cs
@@ -148,6 +148,6 @@
app.MapControllers();
BarcodeScanner.StartServer();
//BarcodeScanner.StartServer();
app.Run();
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸¨ÁϲÖ/AGV_FLExtend.cs
@@ -27,7 +27,7 @@
                {
                    try
                    {
                        if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt())
                        if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt())
                            task.CurrentAddress = GetAGVAddress(task.CurrentAddress);
                        else
                            task.NextAddress = GetAGVAddress(task.NextAddress);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/0f114663-dce3-4d0e-9b27-bfeaa6dfe2c7.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/1f069ca3-0197-4b08-8580-6ad491643add.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/5d432982-08c1-4c2c-9cb4-199bb27be3a0.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/637a2026-85ca-4ce6-92b0-9adf059b8fc4.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/78f8b249-7154-4dec-a3ca-180499c24279.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/8a5ddf5d-8657-4a5f-ac29-bc17a0fcefb0.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/InboundOrderMenu.cs
@@ -88,6 +88,11 @@
        /// å…¶ä»–入库单
        /// </summary>
        [Description("其他入库单")]
        Other = 130
        Other = 130,
        /// <summary>
        /// å®¢ä¾›å›žæ”¶
        /// </summary>
        [Description("客供回收")]
        CustomerRecovery=135
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/OutboundOrderEnum.cs
@@ -91,6 +91,12 @@
        /// å…¶ä»–出库单
        /// </summary>
        [Description("其他出库单")]
        Other = 235
        Other = 235,
        /// <summary>
        /// ç»´ä¿®å‘料单
        /// </summary>
        [Description("维修发料单")]
        MaintenanceIssue = 240,
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/ReturnOrderEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_Common.OrderEnum
{
    /// <summary>
    /// é€€æ–™çŠ¶æ€
    /// </summary>
    public enum ReturnOrderStatusEnum
    {
        /// <summary>
        /// æœªé€€æ–™
        /// </summary>
        [Description("未退料")]
        NotReturn = 0,
        /// <summary>
        /// é€€æ–™ä¸­
        /// </summary>
        [Description("退料中")]
        Returning = 1,
        /// <summary>
        /// é€€æ–™å®Œæˆ
        /// </summary>
        [Description("退料完成")]
        Returned = 2
    }
    /// <summary>
    /// é€€æ–™ç±»åž‹
    /// </summary>
    public enum ReturnOrderTypeEnum
    {
        /// <summary>
        /// æ ‡å‡†é€€æ–™
        /// </summary>
        [Description("标准退料")]
        StandardReturn = 1,
        /// <summary>
        /// Bom退料
        /// </summary>
        [Description("Bom退料")]
        BomReturn = 2
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/TaskEnum/TaskTypeEnum.cs
@@ -37,6 +37,12 @@
        OutEmpty = 140,
        /// <summary>
        /// è°ƒæ‹¨å‡ºåº“
        /// </summary>
        [Description("调拨出库")]
        OutAllocate = 150,
        /// <summary>
        /// MES出库
        /// </summary>
        [Description("MES出库")]
@@ -88,6 +94,12 @@
        MesMatReturn = 560,
        /// <summary>
        /// è°ƒæ‹¨å…¥åº“
        /// </summary>
        [Description("调拨入库")]
        InAllocate = 570,
        /// <summary>
        /// ç©ºç®±å…¥åº“
        /// </summary>
        [Description("空箱入库")]
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/CodeConfigEnum/RuleCodeEnum.cs
@@ -44,6 +44,11 @@
        /// å…¥æ–™å•号编码规则
        /// </summary>
        [Description("入料单号编码规则")]
        RLCodeRule
        RLCodeRule,
        /// <summary>
        /// é€€æ–™å•号编码规则
        /// </summary>
        [Description("退料单号编码规则")]
        TLCodeRule,
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/ERP/ErpInOrderDTO.cs
@@ -78,7 +78,7 @@
        /// å¤‡æ³¨
        /// </summary>
        [PropertyValidate("备注")]
        public string Node { get; set; }
        public string Note { get; set; }
        /// <summary>
        /// å›žæ”¶ç±»åž‹
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/ERP/ErpReturnOrderDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.ERP
{
    /// <summary>
    /// æ ‡å‡†/bom退料
    /// </summary>
    [ModelValidate]
    public class ErpReturnOrderDTO
    {
        /// <summary>
        /// æ“ä½œç±»åž‹<br/>
        /// 1:新增<br/>
        /// 2:修改<br/>
        /// 3:删除(删除只要明细行号和领料单号)
        /// </summary>
        [PropertyValidate("操作类型", NotNullAndEmpty = true, Check = new object[] { 1, 2, 3 })]
        public int Way { get; set; }
        /// <summary>
        /// é€€æ–™è®¢å•号
        /// </summary>
        [PropertyValidate("退料订单号", NotNullAndEmpty = true)]
        public string OrderNo { get; set; }
        /// <summary>
        /// ä»“库编号
        /// </summary>
        [PropertyValidate("仓库编号", NotNullAndEmpty = true)]
        public string WaCode { get; set; }
        /// <summary>
        /// å•据备注
        /// </summary>
        public string? Note { get; set; }
        /// <summary>
        /// è®¢å•类型<br/>
        /// 1:标准退料<br/>
        /// 2:bom退料<br/>
        /// </summary>
        [PropertyValidate("订单类型", NotNullAndEmpty = true, Check = new object[] { 1, 2 })]
        public int OrderType { get; set; }
        /// <summary>
        /// æ˜¯å¦ç ”发
        /// 0:否
        /// 1:是
        /// </summary>
        [PropertyValidate("是否研发", NotNullAndEmpty = true, Check = new object[] { 0, 1 })]
        public int IsDev { get; set; }
        /// <summary>
        /// åˆ—表
        /// </summary>
        [PropertyValidate("列表", NotNullAndEmpty = true)]
        public List<ReturnDetail> Issitem { get; set; }
    }
    /// <summary>
    /// é€€æ–™æ˜Žç»†
    /// </summary>
    [ModelValidate]
    public class ReturnDetail
    {
        /// <summary>
        /// ç”³è¯·å•号(发料单)
        /// </summary>
        [PropertyValidate("申请单号", NotNullAndEmpty = true)]
        public string PickCode { get; set; }
        /// <summary>
        /// ç”³è¯·å•号行号(发料单明细行号)
        /// </summary>
        [PropertyValidate("申请单号行号", NotNullAndEmpty = false)]
        public int? ApplyRow { get; set; }
        /// <summary>
        /// é€€æ–™è¡Œå·
        /// </summary>
        [PropertyValidate("退料行号", NotNullAndEmpty = true)]
        public int RowId { get; set; }
        /// <summary>
        /// é€€æ–™ä¿¡æ¯
        /// </summary>
        [PropertyValidate("退料信息", NotNullAndEmpty = true)]
        public List<ReturnInfo> PickList { get; set; }
    }
    /// <summary>
    /// é€€æ–™ä¿¡æ¯
    /// </summary>
    [ModelValidate]
    public class ReturnInfo
    {
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        [PropertyValidate("物料编码", NotNullAndEmpty = true)]
        public string MCode { get; set; }
        /// <summary>
        /// å¯é€€æ•°é‡
        /// </summary>
        [PropertyValidate("可退数量", NotNullAndEmpty = true)]
        public float Qty { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [PropertyValidate("单位", NotNullAndEmpty = true)]
        public string Unit { get; set; }
        /// <summary>
        /// é€€å›žæ•°é‡
        /// </summary>
        [PropertyValidate("退回数量", NotNullAndEmpty = true)]
        public float ReturnQty { get; set; }
        public string? Code { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_External/ERPService/InvokeERPService.cs
@@ -108,6 +108,23 @@
            return response;
        }
        /// <summary>
        /// ERP退料上报接口调用
        /// </summary>
        public string InvokeReturnApi(ERPReturnModel returnModel)
        {
            Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.InvokeErpApi.ToString());
            ERPBaseModel<ERPReturnModel> model = new ERPBaseModel<ERPReturnModel>()
            {
                Data = returnModel,
                Desc = "材料退库",
                Type = "importMaterialsIssueNoteWMS",
                SecurityCode = "TeChuang"
            };
            string request = JsonConvert.SerializeObject(model, settings).Replace("issitem", "Issitem");
            string response = HttpHelper.Post(apiInfo.ApiAddress, request);
            return response;
        }
        /// <summary>
        /// ERP物料出库接口调用
        /// </summary>
        /// <param name="outboundModel"></param>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_External/IERPService/IInvokeERPService.cs
@@ -36,9 +36,10 @@
        /// <summary>
        /// ERP物料出库接口调用
        /// </summary>
        /// <param name="outboundModel"></param>
        /// <returns></returns>
        //string InvokeOutboundOrderApi(ERPOutboundModel outboundModel);
        string InvokeOutStandardsApi(ERPIssueModel issueModel);
        /// <summary>
        /// ERP退料上报接口调用
        /// </summary>
        string InvokeReturnApi(ERPReturnModel returnModel);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_External/Model/ERPReturnModel.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_External.Model
{
    /// <summary>
    /// é€€æ–™å•回传ERP
    /// </summary>
    public class ERPReturnModel
    {
        /// <summary>
        /// æ“ä½œå€¼
        /// </summary>
        public int Way { get; set; }
        /// <summary>
        /// ä¸»é”®å€¼
        /// </summary>
        public string UniqueTag { get; set; }
        /// <summary>
        /// é€€æ–™å•号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// ä»“库编码
        /// </summary>
        public string WarehouseCode { get; set; }
        /// <summary>
        /// å•据备注
        /// </summary>
        public string Docremark { get; set; }
        /// <summary>
        /// é€€æ–™æ—¶é—´
        /// </summary>
        public string Createtime { get; set; }
        /// <summary>
        /// é€€æ–™äººå‘˜
        /// </summary>
        public string Createuser { get; set; }
        /// <summary>
        /// æ˜¯å¦ç ”发
        /// </summary>
        public int IsDev { get; set; }
        /// <summary>
        ///
        /// </summary>
        public List<ReturnItem> Issitem { get; set; }
    }
    public class ReturnItem
    {
        /// <summary>
        /// é€€æ–™ç”³è¯·å•号
        /// </summary>
        public string Pickcode { get; set; }
        /// <summary>
        /// é€€æ–™è¡Œå·
        /// </summary>
        public int Rowindex { get; set; }
        /// <summary>
        /// é€€æ–™ä¿¡æ¯
        /// </summary>
        public List<ReturnPickItem> PickList { get; set; }
    }
    public class ReturnPickItem
    {
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        public string Material { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡æ•°é‡æ€»å’Œ
        /// </summary>
        public float Qty { get; set; }
        /// <summary>
        ///
        /// </summary>
        public List<ReturnDataItem> Dataitem { get; set; }
    }
    public class ReturnDataItem
    {
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        public string Lotno { get; set; }
        /// <summary>
        /// é€€å›žæ•°é‡
        /// </summary>
        public float Qty { get; set; }
        /// <summary>
        /// å‚¨åŒº
        /// </summary>
        public string Location { get; set; }
        /// <summary>
        /// åˆ¶é€ éƒ¨ä»¶
        /// </summary>
        public string Msfpart { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundRepository/IInboundRepository.cs
@@ -20,5 +20,7 @@
        IPurchaseOrderDetailRepository PurchaseOrderDetailRepository { get; }
        IPurchaseOrderRepository PurchaseOrderRepository { get; }
        IReturnOrderRepository ReturnOrderRepository { get; }
        IReturnOrderDetailRepository ReturnOrderDetailRepository { get; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundRepository/IReturnOrderDetailRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundRepository
{
    /// <summary>
    /// é€€æ–™å•明细仓储接口层
    /// </summary>
    public interface IReturnOrderDetailRepository : IRepository<Dt_ReturnOrderDetail>
    {
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundRepository/IReturnOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundRepository
{
    /// <summary>
    /// é€€æ–™å•仓储接口层
    /// </summary>
    public interface IReturnOrderRepository : IRepository<Dt_ReturnOrder>
    {
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs
@@ -6,6 +6,7 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.Inbound;
using WIDESEA_External.Model;
using WIDESEA_IInboundRepository;
@@ -33,12 +34,18 @@
        /// <returns></returns>
        WebResponseContent FeedbackInboundOrder(Dt_InboundOrder inboundOrder);
        /// <summary>
        ///
        /// é€€æ–™å®Œæˆä¸ŠæŠ¥è‡³ERP
        /// </summary>
        /// <param name="warehouse"></param>
        /// <param name="palletCode"></param>
        /// <param name="materielInfo"></param>
        public WebResponseContent FeedbackReturnOrder(Dt_InboundOrder inboundOrder,Dt_ReturnOrder returnOrder);
        /// <summary>
        /// æ ¹æ®ä»“库和托盘号获取托盘类型
        /// </summary>
        /// <returns></returns>
        int GetPalletType(Dt_Warehouse warehouse, string palletCode);
        /// <summary>
        /// å…¶ä»–入库单接收(调拔入仓,客供回收,物料销售退货)
        /// </summary>
        /// <returns></returns>
        WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO model);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IReturnOrderDetailService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundService
{
    public interface IReturnOrderDetailService : IService<Dt_ReturnOrderDetail>
    {
        IReturnOrderDetailRepository Repository { get; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IReturnOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_DTO.ERP;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_IInboundService
{
    public interface IReturnOrderService : IService<Dt_ReturnOrder>
    {
        IReturnOrderRepository Repository { get; }
        /// <summary>
        /// èŽ·å–æŽ¥æ”¶é€€æ–™å•
        /// </summary>
        WebResponseContent ReturnOrder(ErpReturnOrderDTO model);
        /// <summary>
        /// èŽ·å–é€€æ–™å•
        /// </summary>
        WebResponseContent GetReturnOrders(SaveModel saveModel);
        /// <summary>
        /// ç¡®è®¤é€€åº“根据退库单生成入库单
        /// </summary>
        /// <returns></returns>
        WebResponseContent IsReturnCreateInOrder(int returnId);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundRepository/InboundRepository.cs
@@ -20,8 +20,10 @@
        public IPurchaseOrderDetailRepository PurchaseOrderDetailRepository { get; }
        public IPurchaseOrderRepository PurchaseOrderRepository { get; }
        public IReturnOrderRepository ReturnOrderRepository { get; }
        public IReturnOrderDetailRepository ReturnOrderDetailRepository { get; }
        public InboundRepository(IInboundOrderDetailRepository inboundOrderDetailRepository, IInboundOrderRepository inboundOrderRepository, IReceiveOrderDetailRepository receiveOrderDetailRepository, IReceiveOrderRepository receiveOrderRepository, IPurchaseOrderDetailRepository purchaseOrderDetailRepository, IPurchaseOrderRepository purchaseOrderRepository)
        public InboundRepository(IInboundOrderDetailRepository inboundOrderDetailRepository, IInboundOrderRepository inboundOrderRepository, IReceiveOrderDetailRepository receiveOrderDetailRepository, IReceiveOrderRepository receiveOrderRepository, IPurchaseOrderDetailRepository purchaseOrderDetailRepository, IPurchaseOrderRepository purchaseOrderRepository, IReturnOrderRepository returnOrderRepository, IReturnOrderDetailRepository returnOrderDetailRepository)
        {
            InboundOrderDetailRepository = inboundOrderDetailRepository;
            InboundOrderRepository = inboundOrderRepository;
@@ -29,6 +31,8 @@
            ReceiveOrderRepository = receiveOrderRepository;
            PurchaseOrderDetailRepository = purchaseOrderDetailRepository;
            PurchaseOrderRepository = purchaseOrderRepository;
            ReturnOrderRepository = returnOrderRepository;
            ReturnOrderDetailRepository = returnOrderDetailRepository;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundRepository/ReturnOrderDetailRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundRepository
{
    public class ReturnOrderDetailRepository : RepositoryBase<Dt_ReturnOrderDetail>, IReturnOrderDetailRepository
    {
        public ReturnOrderDetailRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundRepository/ReturnOrderRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundRepository
{
    public class ReturnOrderRepository : RepositoryBase<Dt_ReturnOrder>, IReturnOrderRepository
    {
        public ReturnOrderRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -71,43 +71,158 @@
            _palletTypeInfoRepository = palletTypeInfoRepository;
        }
        /// <summary>
        /// å…¶ä»–入库单创建
        /// å…¶ä»–入库单接收(调拔入仓,客供回收,物料销售退货)
        /// </summary>
        /// <returns></returns>
        public WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO erpInOrder)
        public WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO model)
        {
            try
            {
                return model.Way switch
                {
                    1 => AddSingOrder(model),
                    2 => UpdateSingOrder(model),
                    3 => DeleteSingOrder(model),
                    _ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{model.Way}"),
                };
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// æ–°å¢žå•据
        /// </summary>
        public WebResponseContent AddSingOrder(ErpInOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取仓库信息
                Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseCode == erpInOrder.WaId);
                //获取物料信息
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode==model.MCode);
                if (materielInfo==null)
                {
                    return content.Error($"物料{model.MCode}不存在!");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.WaId);
                if (warehouse == null)
                {
                    return content.Error("未找到仓库信息");
                    return content.Error($"未找到仓库信息");
                }
                //获取是否存在订单
                Dt_InboundOrder inboundOrder = BaseDal.QueryFirst(x => x.InboundOrderNo == erpInOrder.OrderNo);
                if (erpInOrder.Way == 1)
                Dt_InboundOrder inboundOrderOld = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).Includes(x=>x.Details).First();
                if (inboundOrderOld!=null)
                {
                    if (inboundOrder != null)
                    if (inboundOrderOld.OrderStatus!= OrderDetailStatusEnum.New.ObjToInt())
                    {
                        return content.Error($"{model.OrderNo}单据已开始!");
                    }
                }
                else if (erpInOrder.Way == 2)
                {
                    Dt_InboundOrderDetail? inboundOrderDetailOld = inboundOrderOld.Details?.FirstOrDefault(x => x.RowNo == model.RowNo.ObjToInt() && x.MaterielCode == model.MCode);
                    if (inboundOrderDetailOld!=null)
                    {
                        inboundOrderDetailOld.OrderQuantity += model.Qty;
                        _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetailOld);
                    }
                    else
                    {
                        Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
                        {
                            OrderId= inboundOrderOld.Id,
                            MaterielCode = model.MCode,
                            BatchNo = "",
                            OrderQuantity = model.Qty,
                            ReceiptQuantity = 0,
                            OverInQuantity = 0,
                            OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
                            Unit = materielInfo.MaterielUnit,
                            RowNo = model.RowNo.ObjToInt(),
                            MaterielName = materielInfo.MaterielName,
                            MaterielSpec = materielInfo.MaterielSpec
                        };
                        _inboundRepository.InboundOrderDetailRepository.AddData(orderDetail);
                    }
                }
                else
                {
                    Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
                    {
                        MaterielCode = model.MCode,
                        BatchNo = "",
                        OrderQuantity = model.Qty,
                        ReceiptQuantity = 0,
                        OverInQuantity = 0,
                        OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
                        Unit = materielInfo.MaterielUnit,
                        RowNo = model.RowNo.ObjToInt(),
                        MaterielName = materielInfo.MaterielName,
                        MaterielSpec = materielInfo.MaterielSpec
                    };
                    Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
                    {
                        UpperOrderNo = model.OrderNo,
                        WarehouseId = warehouse.WarehouseId,
                        SupplierId = "",
                        OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
                        CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                        Remark = model.Note,
                        Details = new List<Dt_InboundOrderDetail> { orderDetail }
                    };
                    switch (model.OType)
                    {
                        case 1:
                            inboundOrder.OrderType = InOrderTypeEnum.Allocat.ObjToInt();
                            break;
                        case 3:
                            inboundOrder.OrderType = InOrderTypeEnum.CustomerRecovery.ObjToInt();
                            break;
                        case 6:
                            inboundOrder.OrderType = InOrderTypeEnum.SaleReturn.ObjToInt();
                            break;
                        default:
                            break;
                    };
                    Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand();
                }
                return content.OK();
                return content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ä¿®æ”¹å•据
        /// </summary>
        public WebResponseContent UpdateSingOrder(ErpInOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取单据信息
                Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).First();
                if (inboundOrder == null)
                {
                    return content.Error($"单据{model.OrderNo}不存在!");
                }
                if (inboundOrder.OrderStatus>=InOrderStatusEnum.入库中.ObjToInt())
                {
                    return content.Error($"单据{model.OrderNo}入库中或已完成");
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// åˆ é™¤å•据
        /// </summary>
        public WebResponseContent DeleteSingOrder(ErpInOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            return content;
        }
        public WebResponseContent GetInboundOrders(SaveModel saveModel)
@@ -289,16 +404,16 @@
                int oldCount = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                if (receiveOrder == null && inboundOrder.OrderType==InOrderTypeEnum.Purchase.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单");
                }
                if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0)
                if ((receiveOrder?.Details == null || receiveOrder?.Details.Count <= 0) && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                List<string> purchaseOrderNos = receiveOrder?.Details.Select(x => x.PurchaseOrderNo).ToList();
                List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums);
@@ -325,7 +440,7 @@
                    if (!inboundOrderDetails.Any(x => x.BatchNo == model.LotNo))
                        return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料批次【{model.LotNo}】");
                }
                if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null)
                if (receiveOrder?.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息");
                }
@@ -342,9 +457,10 @@
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                List<int> detailKeys = new List<int>();
                Dt_ReturnOrder? returnOrder = null;
                foreach (var model in models)
                {
                    if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
                    if (purchaseOrderNos?.FirstOrDefault(x => x == model.PurchaseOrderNo) == null && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt())
                    {
                        return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单");
                    }
@@ -392,6 +508,21 @@
                if (inboundOrder.Details.Count == oldCount)
                {
                    inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt();
                    //判断是否为退料入库单
                    if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                    {
                        returnOrder = _inboundRepository.ReturnOrderRepository.Db.Queryable<Dt_ReturnOrder>().Where(x => x.OrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                        returnOrder.ReturnOrderStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
                        foreach (var item in inboundOrder.Details)
                        {
                            Dt_ReturnOrderDetail returnOrderDetail = returnOrder.Details?.FirstOrDefault(x => x.MCode == item.MaterielCode);
                            if (returnOrderDetail != null)
                            {
                                returnOrderDetail.OverReturnQty = item.OverInQuantity;
                                returnOrderDetail.OrderDetailStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
                            }
                        }
                    }
                }
                else
                    inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
@@ -408,12 +539,26 @@
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                if (returnOrder != null)
                {
                    _inboundRepository.ReturnOrderRepository.UpdateData(returnOrder);
                    _inboundRepository.ReturnOrderDetailRepository.UpdateData(returnOrder.Details);
                }
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.Inbound);
                _unitOfWorkManage.CommitTran();
                #region å…¥åº“完成上报ERP
                if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                    FeedbackInboundOrder(inboundOrder);
                if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType != InOrderTypeEnum.Allocat.ObjToInt())
                {
                    if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                    {
                        FeedbackReturnOrder(inboundOrder, returnOrder);
                    }
                    else
                    {
                        FeedbackInboundOrder(inboundOrder);
                    }
                }
                #endregion
                content.OK();
            }
@@ -541,7 +686,12 @@
                {
                    return WebResponseContent.Instance.Error($"未找到入库单明细信息");
                }
                List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums);
                //除采购入库单以外其他入库单组盘数据处理
                if (inboundOrder.OrderType != InOrderTypeEnum.Purchase.ObjToInt())
                {
                    return OtherInGroup(inboundOrder, palletCode, Initiallife, warehouse, models);
                }
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
@@ -553,8 +703,6 @@
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums);
                if (models.Select(x => x.MaterielCode).Distinct().Count() > 1)
                {
@@ -637,10 +785,10 @@
                {
                    if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
                    {
                        return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单");
                        return WebResponseContent.Instance.Error($"未在采购单明细中找到该采购单");
                    }
                    Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus < OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode==model.MaterielCode && x.BatchNo==model.LotNo && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
                    Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode==model.MaterielCode && x.BatchNo==model.LotNo && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
                    if (notGroupDetail == null)
                    {
@@ -704,7 +852,149 @@
            }
            return content;
        }
        public WebResponseContent OtherInGroup(Dt_InboundOrder inboundOrder,string? palletCode,int Initiallife,Dt_Warehouse warehouse,List<MatSerNumAnalysisModel> models)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (models.Select(x => x.MaterielCode).Distinct().Count() > 1)
                {
                    return content.Error($"物料不可混放");
                }
                string materielCode = models.FirstOrDefault()?.MaterielCode ?? "";
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
                if (materielInfo == null)
                {
                    return content.Error($"未找到该物料的信息");
                }
                List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList();
                if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0)
                {
                    return content.Error($"未在入库单明细中找到该物料信息");
                }
                float beforeQuantity = 0;
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    stockInfo = new Dt_StockInfo()
                    {
                        PalletCode = palletCode,
                        StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                        WarehouseId = inboundOrder.WarehouseId,
                        PalletType = GetPalletType(warehouse, palletCode),
                        Details = new List<Dt_StockInfoDetail>()
                    };
                }
                else
                {
                    if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt())
                    {
                        return content.Error($"托盘号重复");
                    }
                    beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
                }
                if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
                {
                    stockInfo.Remark = Initiallife.ToString();
                    string batchNo = models.FirstOrDefault()?.LotNo ?? "";
                    Dt_StockInfoDetail existDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == batchNo);
                    if (existDetail != null)
                    {
                        return content.Error($"{batchNo}测试架已存在");
                    }
                    if (models.Count >= 2)
                    {
                        return content.Error($"组盘明细不唯一");
                    }
                    if (palletCode.Substring(0, 1) == "6")
                    {
                        stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt();
                    }
                    else
                    {
                        stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt();
                    }
                }
                else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ToString())
                {
                    if (models.Count >= 2)
                    {
                        return content.Error($"组盘明细不唯一");
                    }
                }
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                foreach (var model in models)
                {
                    Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault();
                    if (notGroupDetail == null)
                    {
                        return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
                    }
                    Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                    {
                        BatchNo = model.LotNo,
                        MaterielCode = materielInfo.MaterielCode,
                        MaterielName = materielInfo.MaterielName,
                        MaterielSpec = materielInfo.MaterielSpec,
                        OrderNo = inboundOrder.InboundOrderNo,
                        SerialNumber = model.SerialNumber,
                        StockQuantity = model.Quantity,
                        OutboundQuantity = 0,
                        Unit = materielInfo.MaterielUnit,
                        Status = StockStatusEmun.组盘暂存.ObjToInt(),
                        ProductionDate = model.ProductionDate,
                        EffectiveDate = model.EffectiveDate,
                        InboundOrderRowNo = notGroupDetail.RowNo,
                    };
                    if (stockInfo.Id > 0)
                    {
                        stockInfoDetail.StockId = stockInfo.Id;
                    }
                    stockInfo.Details.Add(stockInfoDetail);
                    stockInfoDetails.Add(stockInfoDetail);
                    notGroupDetail.ReceiptQuantity += model.Quantity;
                    if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                    {
                        notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
                    }
                }
                float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
                inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                _unitOfWorkManage.BeginTran();
                if (stockInfo.Id == 0)
                {
                    _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
                }
                else
                {
                    _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand();
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent MaterielGroup(string palletCode, int Initiallife, int warehouseId, List<string> serNums)
        {
@@ -909,6 +1199,70 @@
            }
            return content;
        }
        /// <summary>
        /// é€€æ–™å®Œæˆä¸ŠæŠ¥è‡³ERP
        /// </summary>
        public WebResponseContent FeedbackReturnOrder(Dt_InboundOrder inboundOrder,Dt_ReturnOrder returnOrder)
        {
            WebResponseContent content= new WebResponseContent();
            try
            {
                if (returnOrder==null)
                {
                    return content.OK();
                }
                //获取仓库编码
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==inboundOrder.WarehouseId);
                var groupedDetails = returnOrder.Details.GroupBy(d => new { d.PickCode, d.RowId })
                    .Select(g => new
                    {
                        PickCode = returnOrder.OrderNo,
                        RowIndex = g.Key.RowId,
                        Details = g.ToList()
                    })
                    .ToList();
                // æž„建嵌套结构
                var issitems = groupedDetails.Select(g => new ReturnItem
                {
                    Pickcode = g.PickCode,
                    Rowindex = g.RowIndex,
                    PickList = g.Details
                        .GroupBy(d => d.MCode)
                        .Select(mg => new ReturnPickItem
                        {
                            Material = mg.Key,
                            Qty = mg.Sum(x => x.Qty),
                            Dataitem = mg.Select(d => new ReturnDataItem
                            {
                                Lotno = d.BatchNo,
                                Qty = d.Qty,
                                Location = warehouse.WarehouseCode,
                                Msfpart = d.Code
                            }).ToList()
                        }).ToList()
                }).ToList();
                //获取对应退料单
                ERPReturnModel returnModel = new ERPReturnModel()
                {
                    Way = 1,
                    UniqueTag = returnOrder.Id.ToString(),
                    Code = CreateCodeByRule(nameof(RuleCodeEnum.TLCodeRule)),
                    WarehouseCode = warehouse.WarehouseCode,
                    Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    Createuser=inboundOrder.Creater,
                    IsDev=returnOrder.IsDev,
                    Issitem= issitems
                };
                _invokeERPService.InvokeReturnApi(returnModel);
                return content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        static object lock_code = new object();
        public string CreateCodeByRule(string ruleCode)
        {
@@ -968,7 +1322,7 @@
                return code;
            }
        }
        #region å¼ƒç”¨
        /// <summary>
        /// å…¥åº“完成回传到ERP
        /// </summary>
@@ -1051,7 +1405,7 @@
        //        return WebResponseContent.Instance.Error(ex.Message);
        //    }
        //}
        #endregion
        public int GetPalletType(Dt_Warehouse warehouse, string palletCode)
        {
            if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReturnOrderDetailService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundService
{
    public class ReturnOrderDetailService : ServiceBase<Dt_ReturnOrderDetail, IReturnOrderDetailRepository>, IReturnOrderDetailService
    {
        public IReturnOrderDetailRepository Repository => BaseDal;
        public ReturnOrderDetailService(IReturnOrderDetailRepository BaseDal) : base(BaseDal)
        {
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReturnOrderService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,235 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
using WIDESEA_DTO.ERP;
using WIDESEA_Core.BaseRepository;
using WIDESEA_IBasicRepository;
using WIDESEA_IOutboundService;
using WIDESEA_Common.OrderEnum;
using SqlSugar.Extensions;
using WIDESEA_Common.CommonEnum;
namespace WIDESEA_InboundService
{
    public class ReturnOrderService : ServiceBase<Dt_ReturnOrder, IReturnOrderRepository>, IReturnOrderService
    {
        public IReturnOrderRepository Repository => BaseDal;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IBasicRepository _basicRepository;
        private readonly IOutboundService _outboundService;
        public ReturnOrderService(IReturnOrderRepository BaseDal,IUnitOfWorkManage unitOfWorkManage,IBasicRepository basicRepository,
        IOutboundService outboundService) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _basicRepository = basicRepository;
            _outboundService = outboundService;
        }
        /// <summary>
        /// èŽ·å–é€€æ–™å•
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public WebResponseContent GetReturnOrders(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                int pageNo = saveModel.MainData["pageNo"].ObjToInt();
                string? orderNo = saveModel.MainData["orderNo"].ToString();
                int warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
                List<Dt_ReturnOrder> returnOrders = new List<Dt_ReturnOrder>();
                if (string.IsNullOrEmpty(orderNo))
                {
                    returnOrders = Db.Queryable<Dt_ReturnOrder>().Where(x => x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5);
                }
                else
                {
                    returnOrders = Db.Queryable<Dt_ReturnOrder>().Where(x => (x.OrderNo.Contains(orderNo)) && x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5);
                }
                content.OK(data: returnOrders);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// èŽ·å–æŽ¥æ”¶é€€æ–™å•
        /// </summary>
        public WebResponseContent ReturnOrder(ErpReturnOrderDTO model)
        {
            try
            {
                return model.Way switch
                {
                    1 => AddReturnOrder(model),
                    2 => UpdateReturnOrder(model),
                    3 => DeleteReturnOrder(model),
                    _ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{model.Way}"),
                };
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// æ–°å»ºé€€æ–™å•
        /// </summary>
        public WebResponseContent AddReturnOrder(ErpReturnOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (BaseDal.QueryFirst(x => x.OrderNo == model.OrderNo) != null)
                {
                    return content.Error($"退料单号{model.OrderNo}已存在!");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.WaCode);
                if (warehouse == null)
                {
                    return content.Error($"未找到仓库信息");
                }
                List<Dt_ReturnOrderDetail> returnOrderDetails = new List<Dt_ReturnOrderDetail>();
                foreach (var item in model.Issitem)
                {
                    //判断发料单号
                    Dt_OutboundOrder outboundOrder = _outboundService.OutboundOrderService.Repository.Db.Queryable<Dt_OutboundOrder>().Where(x=>x.UpFLOrderNo==item.PickCode).Includes(x=>x.Details).First() ?? throw new Exception($"申请单号(发料单){item.PickCode}不存在");
                    foreach (var pickitem in item.PickList)
                    {
                        Dt_OutboundOrderDetail outboundOrderDetail = outboundOrder.Details.Find(x => x.MaterielCode == pickitem.MCode) ?? throw new Exception($"{item.PickCode}申请单号中物料{pickitem.MCode}不存在");
                        //获取对应出库单详情
                        Dt_OutStockLockInfo outStockLockInfo = _outboundService.OutboundStockLockInfoService.Repository.QueryFirst(x => x.OrderDetailId == outboundOrderDetail.Id);
                        Dt_ReturnOrderDetail returnOrderDetail = new Dt_ReturnOrderDetail()
                        {
                            PickCode = item.PickCode,
                            ApplyRow = item.ApplyRow ?? 0,
                            RowId = item.RowId,
                            OrderDetailStatus = ReturnOrderStatusEnum.NotReturn.ObjToInt(),
                            MCode = pickitem.MCode,
                            MaterielName = outboundOrderDetail.MaterielName,
                            MaterielSpec = outboundOrderDetail.MaterielSpec ?? "",
                            BatchNo = outStockLockInfo.BatchNo,
                            Qty = pickitem.Qty,
                            ReturnQty = pickitem.ReturnQty,
                            OverReturnQty = 0,
                            Unit = pickitem.Unit,
                            Code = pickitem.Code
                        };
                        returnOrderDetails.Add(returnOrderDetail);
                    }
                }
                Dt_ReturnOrder returnOrder = new Dt_ReturnOrder()
                {
                    OrderNo=model.OrderNo,
                    WarehouseId=warehouse.WarehouseId,
                    ReturnOrderType=model.OrderType,
                    ReturnOrderStatus=ReturnOrderStatusEnum.NotReturn.ObjToInt(),
                    UploadStatus= WhetherEnum.False.ObjToInt(),
                    IsDev=model.IsDev,
                    Remark=model.Note,
                    Details= returnOrderDetails
                };
                Db.InsertNav(returnOrder).Include(x => x.Details).ExecuteCommand();
                content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ä¿®æ”¹é€€æ–™å•
        /// </summary>
        public WebResponseContent UpdateReturnOrder(ErpReturnOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            return content;
        }
        /// <summary>
        /// åˆ é™¤é€€æ–™å•
        /// </summary>
        public WebResponseContent DeleteReturnOrder(ErpReturnOrderDTO model)
        {
            WebResponseContent content = new WebResponseContent();
            return content;
        }
        /// <summary>
        /// ç¡®è®¤é€€åº“根据退库单生成入库单
        /// </summary>
        /// <returns></returns>
        public WebResponseContent IsReturnCreateInOrder(int returnId)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_ReturnOrder returnOrder = Db.Queryable<Dt_ReturnOrder>().Where(x => x.Id == returnId).Includes(x => x.Details).First();
                if (returnOrder==null)
                {
                    return content.Error("未找到退料该信息");
                }
                if (returnOrder.Details==null || returnOrder.Details.Count<=0)
                {
                    return content.Error("未找到该退料单信息");
                }
                if (returnOrder.ReturnOrderStatus!=ReturnOrderStatusEnum.NotReturn.ObjToInt())
                {
                    return content.Error("该退料单已完成或退料中");
                }
                List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
                foreach (var item in returnOrder.Details)
                {
                    Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail()
                    {
                        MaterielCode=item.MCode,
                        BatchNo=item.BatchNo,
                        OrderQuantity=item.ReturnQty,
                        ReceiptQuantity=0,
                        OverInQuantity=0,
                        OrderDetailStatus= OrderDetailStatusEnum.New.ObjToInt(),
                        Unit=item.Unit,
                        RowNo=item.RowId,
                        MaterielName=item.MaterielName,
                        MaterielSpec=item.MaterielSpec,
                    };
                    inboundOrderDetails.Add(orderDetail);
                }
                Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
                {
                    WarehouseId=returnOrder.WarehouseId,
                    UpperOrderNo=returnOrder.OrderNo,
                    SupplierId="",
                    OrderType= InOrderTypeEnum.Return.ObjToInt(),
                    OrderStatus= InOrderStatusEnum.未开始.ObjToInt(),
                    CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                    Remark=returnOrder.Remark,
                    Details= inboundOrderDetails
                };
                returnOrder.ReturnOrderStatus=ReturnOrderStatusEnum.Returning.ObjToInt();
                _unitOfWorkManage.BeginTran();
                BaseDal.UpdateData(returnOrder);
                Db.InsertNav(inboundOrder).Include(x=>x.Details).ExecuteCommand();
                _unitOfWorkManage.CommitTran();
                return content.OK("成功");
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/WIDESEA_InboundService.csproj
@@ -11,6 +11,7 @@
    <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" />
    <ProjectReference Include="..\WIDESEA_ICheckRepository\WIDESEA_ICheckRepository.csproj" />
    <ProjectReference Include="..\WIDESEA_IInboundService\WIDESEA_IInboundService.csproj" />
    <ProjectReference Include="..\WIDESEA_IOutboundService\WIDESEA_IOutboundService.csproj" />
    <ProjectReference Include="..\WIDESEA_IRecordService\WIDESEA_IRecordService.csproj" />
    <ProjectReference Include="..\WIDESEA_IStockService\WIDESEA_IStockService.csproj" />
    <ProjectReference Include="..\WIDESEA_ITaskInfoRepository\WIDESEA_ITaskInfoRepository.csproj" />
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_InboundOrderDetail.cs
@@ -35,7 +35,7 @@
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "物料名称")]
        [SugarColumn(IsNullable = false, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        /// <summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_PurchaseOrderDetail.cs
@@ -77,7 +77,7 @@
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 100, ColumnDescription = "物料名称")]
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_ReceiveOrderDetail.cs
@@ -101,7 +101,7 @@
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 100, ColumnDescription = "物料名称")]
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        /// <summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_ReturnOrder.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// é€€æ–™å•
    /// </summary>
    [SugarTable(nameof(Dt_ReturnOrder), "退料单")]
    public class Dt_ReturnOrder : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// é€€æ–™å•号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "退料单号")]
        public string OrderNo { get; set; }
        /// <summary>
        /// ä»“库主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        public int WarehouseId { get; set; }
        /// <summary>
        /// è®¢å•类型<br/>
        /// 1:标准退料<br/>
        /// 2:bom退料<br/>
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "订单类型")]
        public int ReturnOrderType { get; set; }
        /// <summary>
        /// è®¢å•状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "订单状态")]
        public int ReturnOrderStatus { get; set; }
        /// <summary>
        /// ä¸Šä¼ çŠ¶æ€
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "上传状态")]
        public int UploadStatus { get; set; }
        /// <summary>
        /// æ˜¯å¦ç ”发
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "是否研发")]
        public int IsDev { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 500, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// é€€æ–™å•明细
        /// </summary>
        [PropertyValidate("退料单明细", NotNullAndEmpty = true), Navigate(NavigateType.OneToMany, nameof(Dt_ReturnOrderDetail.ReturnId), nameof(Id))]
        public List<Dt_ReturnOrderDetail> Details { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Inbound/Dt_ReturnOrderDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.DB.Models;
namespace WIDESEA_Model.Models
{
    /// <summary>
    /// é€€æ–™å•明细
    /// </summary>
    [SugarTable(nameof(Dt_ReturnOrderDetail), "退料单明细")]
    public class Dt_ReturnOrderDetail : BaseEntity
    {
        /// <summary>
        /// ä¸»é”®
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主键")]
        public int Id { get; set; }
        /// <summary>
        /// é€€æ–™å•主键
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料单主键")]
        public int ReturnId { get; set; }
        /// <summary>
        /// ç”³è¯·å•号(发料单)
        /// </summary>
        [SugarColumn(IsNullable = false,Length =50, ColumnDescription = "申请单号(发料单)")]
        public string PickCode { get; set; }
        /// <summary>
        /// ç”³è¯·å•号行号(发料单明细行号)
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "申请单号行号(发料单明细行号)")]
        public int ApplyRow { get; set; }
        /// <summary>
        /// é€€æ–™è¡Œå·
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退料行号")]
        public int RowId { get; set; }
        /// <summary>
        /// æ˜Žç»†å•状态
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "明细单状态")]
        public int OrderDetailStatus { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–码
        /// </summary>
        [SugarColumn(IsNullable = false,Length =50, ColumnDescription = "物料编码")]
        public string MCode { get; set; }
        /// <summary>
        /// ç‰©æ–™åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料名称")]
        public string MaterielName { get; set; }
        /// <summary>
        /// ç‰©æ–™è§„æ ¼
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料规格")]
        public string MaterielSpec { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "批次号")]
        public string BatchNo { get; set; }
        /// <summary>
        /// å¯é€€æ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "可退数量")]
        public float Qty { get; set; }
        /// <summary>
        /// é€€å›žæ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "退回数量")]
        public float ReturnQty { get; set; }
        /// <summary>
        /// å·²é€€å›žæ•°é‡
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "已退回数量")]
        public float OverReturnQty { get; set; }
        /// <summary>
        /// å•位
        /// </summary>
        [SugarColumn(IsNullable = false,Length =20, ColumnDescription = "单位")]
        public string Unit { get; set; }
        /// <summary>
        /// åˆ¶é€ éƒ¨ä»¶code
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "制造部件code")]
        public string Code { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs
@@ -42,6 +42,12 @@
        public string UpperOrderNo { get; set; }
        /// <summary>
        /// å‘料推送单据编号
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "发料推送单据编号")]
        public string UpFLOrderNo { get; set; }
        /// <summary>
        /// å•据类型
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "单据类型", IsOnlyIgnoreUpdate = true)]
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrderDetail.cs
@@ -39,6 +39,12 @@
        public string MaterielName { get; set; }
        /// <summary>
        /// ç‰©æ–™è§„æ ¼
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "物料规格")]
        public string MaterielSpec { get; set; }
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "批次号")]
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs
@@ -210,7 +210,8 @@
                _unitOfWorkManage.CommitTran();
                #region å‡ºåº“完成上报ERP
                if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                //生产领料,研发领料,标准领料,推送ERP出库
                if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt() && outboundOrder.OrderType==OutOrderTypeEnum.Issue.ObjToInt())
                    _invokeERPService.InvokeOutStandardsApi(GetERPIssueModel(outboundOrder, warehouse.WarehouseCode));
                #endregion
                content.OK();
@@ -268,6 +269,9 @@
                    Createuser = string.IsNullOrEmpty(Createuser) ? Createuser : "admin",
                    Issitem = new List<ERPIssueItemModel>() { issueItemModel },
                };
                //更新发料单号
                outboundOrder.UpFLOrderNo = issueModel.Code;
                BaseDal.UpdateData(outboundOrder);
            }
            catch (Exception ex)
            {
@@ -313,6 +317,7 @@
                                BatchNo = model.MLot,
                                MaterielCode = model.MCode,
                                MaterielName = materielInfo.MaterielName,
                                MaterielSpec=materielInfo.MaterielSpec,
                                OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
                                OrderQuantity = model.Qty,
                                OrderId = oldOutboundOrder.Id
@@ -327,6 +332,7 @@
                            RowNo = Convert.ToInt32(model.RowNo),
                            BatchNo = model.MLot,
                            MaterielCode = model.MCode,
                            MaterielSpec = materielInfo.MaterielSpec,
                            MaterielName = materielInfo.MaterielName,
                            OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
                            OrderQuantity = model.Qty,
@@ -343,7 +349,16 @@
                            DepartmentName = model.DepartmentName,
                            Details = new List<Dt_OutboundOrderDetail> { outboundOrderDetail },
                            Remark = model.Node
                        };
                        outboundOrder.OrderType = model.OType switch
                        {
                            1 or 2 or 3=> OutOrderTypeEnum.Issue.ObjToInt(),
                            4=>OutOrderTypeEnum.Quality.ObjToInt(),
                            5=>OutOrderTypeEnum.Allocate.ObjToInt(),
                            6=>OutOrderTypeEnum.MaintenanceIssue.ObjToInt(),
                            7=>OutOrderTypeEnum.SaleOut.ObjToInt(),
                            8=>OutOrderTypeEnum.Rework.ObjToInt(),
                            _=>0
                        };
                        Db.InsertNav(outboundOrder).Include(x => x.Details).ExecuteCommand();
                    }
@@ -368,6 +383,7 @@
                        RowNo = Convert.ToInt32(model.RowNo),
                        BatchNo = model.MLot,
                        MaterielCode = model.MCode,
                        MaterielSpec = materielInfo.MaterielSpec,
                        MaterielName = materielInfo.MaterielName,
                        OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
                        OrderQuantity = model.Qty,
@@ -382,6 +398,10 @@
                    {
                        return WebResponseContent.Instance.Error($"未找到该出库单");
                    }
                    _unitOfWorkManage.BeginTran();
                    BaseDal.DeleteData(oldOutboundOrder);
                    _outboundOrderDetailRepository.DeleteData(oldOutboundOrder.Details);
                    _unitOfWorkManage.CommitTran();
                }
                return WebResponseContent.Instance.OK();
@@ -463,6 +483,9 @@
                        Createuser = outboundOrder.Creater,
                        Issitem = new List<ERPIssueItemModel>() { issueItemModel },
                    };
                    //更新发料单号
                    outboundOrder.UpFLOrderNo = issueModel.Code;
                    BaseDal.UpdateData(outboundOrder);
                    _invokeERPService.InvokeOutStandardsApi(issueModel);
                }
                else
@@ -524,21 +547,20 @@
                    //    Issitem = new List<ERPIssueItemModel>() { issueItemModel },
                    //};
                    #endregion
                }
                if (stockInfos.Count > 0)
                {
                    _stockService.StockInfoService.Repository.UpdateData(stockInfos);
                }
                else
                {
                    _outStockLockInfoService.Repository.UpdateData(_OutStockLockInfos);
                }
                //出库完成上报ERP æµ‹è¯•注释
                if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    issueModel = GetERPIssueModel(outboundOrder, warehouse.WarehouseCode);
                    _invokeERPService.InvokeOutStandardsApi(issueModel);
                    if (stockInfos.Count > 0)
                    {
                        _stockService.StockInfoService.Repository.UpdateData(stockInfos);
                    }
                    else
                    {
                        _outStockLockInfoService.Repository.UpdateData(_OutStockLockInfos);
                    }
                    //出库完成上报ERP æµ‹è¯•注释
                    if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                    {
                        issueModel = GetERPIssueModel(outboundOrder, warehouse.WarehouseCode);
                        _invokeERPService.InvokeOutStandardsApi(issueModel);
                    }
                }
                return WebResponseContent.Instance.OK();
            }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockRepository/StockInfoRepository.cs
@@ -67,16 +67,19 @@
        public List<Dt_StockInfo> GetStockInfos(string materielCode, string lotNo, List<string> locationCodes)
        {
            List<Dt_StockInfo> stockInfos = null;
            if (!string.IsNullOrEmpty(lotNo))
            {
                return Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode)).Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode && v.BatchNo == lotNo)).ToList();
                var stockSort = Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode)).Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode && v.BatchNo == lotNo)).ToList();
                stockInfos = stockSort.OrderBy(x=>x.Details.FirstOrDefault()?.EffectiveDate).ToList();
            }
            else
            {
                return Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode)).Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)).ToList();
                var stockSort = Db.Queryable<Dt_StockInfo>().Where(x => locationCodes.Contains(x.LocationCode)).Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)).ToList();
                stockInfos = stockSort.OrderBy(x => x.Details.FirstOrDefault()?.EffectiveDate).ToList();
            }
            return stockInfos;
            //ISugarQueryable<Dt_LocationInfo> sugarQueryable = Db.Queryable<Dt_LocationInfo>().Where(x => locationCodes.Contains(x.LocationCode));
            //ISugarQueryable<Dt_StockInfo> sugarQueryable1 = Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode));
            //return sugarQueryable.InnerJoin(sugarQueryable1, (a, b) => a.LocationCode == b.LocationCode).Select((a, b) => b).OrderBy(a => a.CreateDate).Includes(a => a.Details).ToList();
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -7,6 +7,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
@@ -141,7 +142,7 @@
        {
            List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
            float stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x);
            stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
            //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
            if (stockTotalQuantity >= needQuantity)//库存够
            {
                int index = 0;
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -440,8 +440,8 @@
                    WarehouseId = warehouse.WarehouseId,
                    StockStatus = StockStatusEmun.MES退库.ObjToInt()
                };
                Dt_StockInfoDetail_Hty stockInfoDetail_Hty = _stockRepository.StockInfoDetail_HtyRepository.QueryFirst(x => x.BatchNo == model.MaterialLot && x.MaterielCode == model.MaterialCode);
                Dt_StockInfo_Hty stockInfo_Hty = _stockRepository.StockInfo_HtyRepository.QueryData(x=>x.PalletCode== model.CarrierCode).OrderByDescending(x=>x.SourceId).First();
                Dt_StockInfoDetail_Hty stockInfoDetail_Hty = _stockRepository.StockInfoDetail_HtyRepository.QueryFirst(x => x.StockId==stockInfo_Hty.SourceId);
                Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -199,7 +199,7 @@
                stockInfo.LocationCode = locationInfo.LocationCode;
                #region ç©ºç®±å…¥åº“/拣选回库/生产退料
                if (task.TaskType == TaskTypeEnum.InEmpty.ObjToInt() || task.TaskType == TaskTypeEnum.InPick.ObjToInt() || task.TaskType==TaskTypeEnum.ProductionReturn.ObjToInt())
                if (task.TaskType == TaskTypeEnum.InEmpty.ObjToInt() || task.TaskType == TaskTypeEnum.InPick.ObjToInt() || (task.TaskType==TaskTypeEnum.ProductionReturn.ObjToInt() && warehouse.WarehouseCode==WarehouseEnum.HA64.ToString()))
                {
                    stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                    task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
@@ -220,49 +220,50 @@
                Dt_InboundOrder? inboundOrder = _inboundRepository.InboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.InboundOrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
                Dt_InboundOrderDetail? inboundOrderDetail = null;
                Dt_ReturnOrder? returnOrder = null;
                //标准入库流程查找入库单据
                if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt())
                {
                    //查询原完成的入库明细数量
                    int overCount = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
                    if (stockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt())
                    inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.RowNo == stockInfo.Details.FirstOrDefault()?.InboundOrderRowNo);
                    foreach (var item in stockInfo.Details)
                    {
                        inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.RowNo == stockInfo.Details.FirstOrDefault()?.InboundOrderRowNo);
                        foreach (var item in stockInfo.Details)
                        if (inboundOrderDetail == null)
                        {
                            if (inboundOrderDetail == null)
                            {
                                continue;
                            }
                            ERPInboundDetailModel detailModel = new ERPInboundDetailModel()
                            {
                                ExpiryDate = item.EffectiveDate ?? "",
                                LocationCode = warehouse.WarehouseCode,
                                MaterialsCode = item.MaterielCode,
                                MfgDate = item.ProductionDate ?? "",
                                QtyCustoms = "0",
                                Quantity = item.StockQuantity.ToString(),
                                Rack = stockInfo.LocationCode,
                                ReceiptCode = inboundOrder.UpperOrderNo,
                                ReceiptSerNo = item.InboundOrderRowNo.ToString()
                            };
                            inboundOrderDetail.OverInQuantity += item.StockQuantity;
                            if (inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity)
                            {
                                inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                overCount += 1;
                            }
                            else if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                            {
                                inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
                            }
                            continue;
                        }
                        inboundOrderDetail.OverInQuantity += item.StockQuantity;
                        if (inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity)
                        {
                            inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                            overCount += 1;
                        }
                        else if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                        {
                            inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
                        }
                    }
                    if (inboundOrder.Details.Count == overCount)
                    {
                        inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt();
                        //判断是否为退料入库单
                        if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                        {
                            returnOrder = _inboundRepository.ReturnOrderRepository.Db.Queryable<Dt_ReturnOrder>().Where(x => x.OrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                            returnOrder.ReturnOrderStatus=ReturnOrderStatusEnum.Returned.ObjToInt();
                            foreach (var item in inboundOrder.Details)
                            {
                                Dt_ReturnOrderDetail returnOrderDetail = returnOrder.Details?.FirstOrDefault(x=>x.MCode==item.MaterielCode);
                                if (returnOrderDetail != null)
                                {
                                    returnOrderDetail.OverReturnQty = item.OverInQuantity;
                                    returnOrderDetail.OrderDetailStatus = ReturnOrderStatusEnum.Returned.ObjToInt();
                                }
                            }
                        }
                    }
                    if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                    else if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                    {
                        inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                    }
@@ -301,10 +302,24 @@
                    _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                    _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                }
                if (returnOrder!=null)
                {
                    _inboundRepository.ReturnOrderRepository.UpdateData(returnOrder);
                    _inboundRepository.ReturnOrderDetailRepository.UpdateData(returnOrder.Details);
                }
                _unitOfWorkManage.CommitTran();
                //存在入库单并状态为完成状态推送至ERP
                if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                    _inboundOrderService.FeedbackInboundOrder(inboundOrder);
                if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt() && inboundOrder.OrderType != InOrderTypeEnum.Allocat.ObjToInt())
                {
                    if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                    {
                        _inboundOrderService.FeedbackReturnOrder(inboundOrder, returnOrder);
                    }
                    else
                    {
                        _inboundOrderService.FeedbackInboundOrder(inboundOrder);
                    }
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -345,7 +360,7 @@
                List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
                List<Dt_MesOutboundOrder> mesOutboundOrders = new List<Dt_MesOutboundOrder>();
                if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && task.TaskType != TaskTypeEnum.OutEmpty.ObjToInt())
                if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && (task.TaskType != TaskTypeEnum.OutEmpty.ObjToInt()))
                {
                    return WebResponseContent.Instance.Error($"未找到出库详情信息");
                }
@@ -386,13 +401,13 @@
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                _unitOfWorkManage.BeginTran();
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandPickOutbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandOutbound.ObjToInt())
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt()|| task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandPickOutbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandOutbound.ObjToInt())
                {
                    //处理出库详情
                    if (outboundOrderDetails.Count > 0)
                    {
                        _outboundService.OutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
                    }
                    stockInfo.LocationCode = "";
                    stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                    _stockService.StockInfoService.Repository.UpdateData(stockInfo);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -7,6 +7,7 @@
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
@@ -48,7 +49,7 @@
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x=>x.PalletCode== palletCode).Includes(x=>x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
@@ -82,21 +83,43 @@
                        Roadway = "",
                        SourceAddress = stationCode,
                        TargetAddress = "",
                        TaskType = stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt() ? TaskTypeEnum.InPick.ObjToInt() : TaskTypeEnum.Inbound.ObjToInt(),
                        TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                        TaskStatus = TaskStatusEnum.New.ObjToInt(),
                        WarehouseId = stockInfo.WarehouseId,
                        PalletType = stockInfo.PalletType
                    };
                    //获取是否存在入库单
                    Dt_InboundOrder? inboundOrder =  null;
                    if (stockInfo!=null && stockInfo.Details.Count>0)
                    {
                        string? orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? "";
                        inboundOrder =_inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
                    }
                    if (inboundOrder != null)
                    {
                        if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
                        {
                            newTask.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
                        }
                        else if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                        {
                            newTask.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
                        }
                    }
                    if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                    {
                        stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
                    }
                    else if (stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt())
                    {
                        stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                        newTask.TaskType = TaskTypeEnum.InPick.ObjToInt();
                    }
                    else
                    {
                        stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                    }
                    _unitOfWorkManage.BeginTran();
                    int taskId = BaseDal.AddData(newTask);
                    newTask.TaskId = taskId;
@@ -254,7 +277,7 @@
                    return WebResponseContent.Instance.Error($"该站点已有未执行的任务");
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
@@ -289,7 +312,25 @@
                    PalletType = stockInfo.PalletType
                };
                //获取是否存在入库单
                Dt_InboundOrder? inboundOrder = null;
                if (stockInfo != null && stockInfo.Details.Count > 0)
                {
                    string? orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? "";
                    inboundOrder = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
                }
                if (inboundOrder != null)
                {
                    if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt())
                    {
                        newTask.TaskType = TaskTypeEnum.InAllocate.ObjToInt();
                    }
                    else if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt())
                    {
                        newTask.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt();
                    }
                }
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
@@ -300,13 +341,13 @@
                }
                else if (stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt())
                {
                    stockInfo.StockStatus = StockStatusEmun.拣选完成.ObjToInt();
                    newTask.TaskType = TaskTypeEnum.InPick.ObjToInt();
                }
                else
                {
                    stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                }
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -203,7 +203,15 @@
                (List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails);
                if (result.Item1 != null && result.Item1.Count > 0)
                {
                    tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound);
                    Dt_OutboundOrder outboundOrder =_outboundService.OutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().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.ForEach(x =>
                    {
                        x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
@@ -360,7 +368,7 @@
                #endregion
                #region ä¸ŠæŠ¥ERP
                if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                if (outboundOrder.OrderStatus == OutOrderStatusEnum.出库完成.ObjToInt() && outboundOrder.OrderType==OutOrderTypeEnum.Issue.ObjToInt())
                {
                    //List<ERPPickModel> eRPPickModels = new List<ERPPickModel>();
                    //outStockLockInfos.ForEach(x =>
@@ -427,6 +435,10 @@
                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();
                    });
                    WebResponseContent content = _outboundService.OutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks);
                    if (!content.Status)
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ERP/ErpController.cs
@@ -35,14 +35,16 @@
        private readonly IOutboundService _outboundService;
        private readonly IInboundService _inboundService;
        private readonly IInvokeERPService _invokeERPService;
        private readonly IReturnOrderService _returnOrderService;
        public ErpController(IBasicService basicService, IOutboundService outboundService, IInboundService inboundService,
            IInvokeERPService invokeERPService)
            IInvokeERPService invokeERPService, IReturnOrderService returnOrderService)
        {
            _basicService = basicService;
            _outboundService = outboundService;
            _inboundService = inboundService;
            _invokeERPService = invokeERPService;
            _returnOrderService = returnOrderService;
        }
        /// <summary>
@@ -122,6 +124,28 @@
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
        /// <summary>
        /// æŽ¥æ”¶ERP退料单信息
        /// </summary>
        [HttpPost, Route("ReturnOrder"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReturnOrder([FromBody] Root<ErpReturnOrderDTO> model)
        {
            WebResponseContent content = _returnOrderService.ReturnOrder(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
        /// <summary>
        /// å…¶ä»–入库单接收(调拔入仓,客供回收,物料销售退货)
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("ReceiveWarehousingOrder"), AllowAnonymous, MethodParamsValidate]
        public ErpResponseContent ReceiveWarehousingOrder([FromBody] Root<ErpInOrderDTO> model)
        {
            WebResponseContent content = _inboundService.InbounOrderService.ReceiveWarehousingOrder(model.Content);
            if (content.Status) return Instance.OK();
            else return Instance.Error(content.Message);
        }
        /// <summary>
        /// æŽ¨é€ERP出库
        /// </summary>
@@ -149,5 +173,13 @@
        {
            return _invokeERPService.InvokeInboundOrderApi(inboundModel);
        }
        /// <summary>
        /// æŽ¨é€ERP退料上报
        /// </summary>
        [HttpPost, Route("InvokeReturnApi"), AllowAnonymous]
        public string InvokeReturnApi([FromBody] ERPReturnModel returnModel)
        {
            return _invokeERPService.InvokeReturnApi(returnModel);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Inbound/ReturnOrderController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_IInboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Inbound
{
    /// <summary>
    /// é€€æ–™å•
    /// </summary>
    [Route("api/ReturnOrder")]
    [ApiController]
    public class ReturnOrderController : ApiBaseController<IReturnOrderService, Dt_ReturnOrder>
    {
        public ReturnOrderController(IReturnOrderService service) : base(service)
        {
        }
        /// <summary>
        /// èŽ·å–é€€æ–™å•
        /// </summary>
        [HttpPost,Route("GetReturnOrders")]
        public WebResponseContent GetReturnOrders([FromBody] SaveModel saveModel)
        {
            return Service.GetReturnOrders(saveModel);
        }
        /// <summary>
        /// ç¡®è®¤é€€åº“根据退库单生成入库单
        /// </summary>
        /// <param name="returnId">退料单ID</param>
        /// <returns></returns>
        [HttpPost, Route("IsReturnCreateInOrder")]
        public WebResponseContent IsReturnCreateInOrder(int returnId)
        {
            return Service.IsReturnCreateInOrder(returnId);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -13,7 +13,7 @@
  //连接字符串
  //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
  //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //旧WMS数据库连接
  //"TeConnectionString": "Data Source=10.30.4.92;Initial Catalog=TeChuang;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
´úÂë¹ÜÀí/»´°²PDA/common/config.js
@@ -1,5 +1,5 @@
let config = {
    baseUrl: 'http://10.30.4.92:9283',
    baseUrl: 'http://127.0.0.1:9293',
    urls: [
        'http://10.30.4.92:9283',
        'http://10.30.4.92:9283'
´úÂë¹ÜÀí/»´°²PDA/uview-ui/libs/request/index.js
@@ -111,7 +111,7 @@
            responseType: 'text',
            showLoading: true, // æ˜¯å¦æ˜¾ç¤ºè¯·æ±‚中的loading
            loadingText: '请求中...',
            loadingTime: 800, // åœ¨æ­¤æ—¶é—´å†…,请求还没回来的话,就显示加载中动画,单位ms
            loadingTime: 1500, // åœ¨æ­¤æ—¶é—´å†…,请求还没回来的话,就显示加载中动画,单位ms
            timer: null, // å®šæ—¶å™¨
            originalData: false, // æ˜¯å¦åœ¨æ‹¦æˆªå™¨ä¸­è¿”回服务端的原始数据,见文档说明
            loadingMask: true, // å±•示loading的时候,是否给一个透明的蒙层,防止触摸穿透