wangxinhui
2024-12-28 39ee9078d88fd4787437360e7f69ed999aaf0b7b
更新代码
已删除4个文件
已修改14个文件
已添加8个文件
723 ■■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/144011e2-42f0-4bb3-91f4-4f3faf1287db.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/696c7cf1-015a-43ec-a8b3-783cb6f90bca.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/d9caedcd-b643-4a2a-bf28-68c2ccd0a7aa.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/82bf8887-9a08-48ab-8128-b1344527468e.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/96a8d11f-bc7e-4582-8a8c-6fccb3766db1.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/97e07ff0-7eb7-4d15-ab37-ca81ae8db322.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c0d350a6-e99f-4e34-9928-0112aed4569d.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/ca012d90-cc55-4b3b-b3e3-15e0df48c908.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/daf3b445-0601-416b-be78-d82e92277083.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/PurchaseOrderEnum.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/HttpMesHelper.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MESRoot.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/TestToolModel.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderDetailService.cs 121 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderService.cs 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfoDetail.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/144011e2-42f0-4bb3-91f4-4f3faf1287db.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/696c7cf1-015a-43ec-a8b3-783cb6f90bca.vsidx
Binary files differ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/FileContentIndex/d9caedcd-b643-4a2a-bf28-68c2ccd0a7aa.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/82bf8887-9a08-48ab-8128-b1344527468e.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/96a8d11f-bc7e-4582-8a8c-6fccb3766db1.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/97e07ff0-7eb7-4d15-ab37-ca81ae8db322.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/c0d350a6-e99f-4e34-9928-0112aed4569d.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/ca012d90-cc55-4b3b-b3e3-15e0df48c908.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/daf3b445-0601-416b-be78-d82e92277083.vsidx
Binary files differ
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/read.lock
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Common/OrderEnum/PurchaseOrderEnum.cs
@@ -33,9 +33,13 @@
        /// <summary>
        /// æœªæ”¶è´§
        /// </summary>
        [Description("未收货")]
        [Description("收货")]
        NotReceived = 0,
        /// <summary>
        /// æ”¶è´§ä¸­
        /// </summary>
        [Description("收货中")]
        Receiving = 1,
        /// <summary>
        /// æ”¶è´§å®Œæˆ
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Core/Helper/HttpMesHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http.Headers;
using WIDESEA_Core.LogHelper;
using System.Security.Cryptography;
namespace WIDESEA_Core.Helper
{
    public class HttpMesHelper
    {
        public static string Post(string serviceAddress, string requestJson = null, string contentType = "application/json", Dictionary<string, string>? headers = null)
        {
            string result = string.Empty;
            DateTime beginDate = DateTime.Now;
            try
            {
                using (HttpContent httpContent = new StringContent(requestJson))
                {
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    using HttpClient httpClient = new HttpClient();
                    httpClient.Timeout = new TimeSpan(0, 0, 60);
                    long currentTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                    string key = $"appkey=1830415116987195392&timestamp={currentTimestamp}";
                    string authorization = "Open " + GetStr(key);
                    headers = new Dictionary<string, string>
                    {
                        { "Appkey", "1830415116987195392" },
                        { "Authorization", authorization },
                        { "site_tenant_id", "ced19269-2b83-4577-be43-8cc2f700251e" }
                    };
                    if (headers != null)
                    {
                        foreach (var header in headers)
                            httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    HttpResponseMessage responseMessage = httpClient.PostAsync(serviceAddress, httpContent).Result;
                    result = responseMessage.Content.ReadAsStringAsync().Result;
                }
                return result;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                Logger.Add(serviceAddress, requestJson == null ? "" : requestJson, result, beginDate);
            }
        }
        public static string GetStr(string textToEncrypt)
        {
            string publicKey;
            string privateKey;
            GenerateRSAKeyPair(out publicKey, out privateKey);
            byte[] encryptedBytes = RSAEncrypt(textToEncrypt, publicKey);
            // å¯ä»¥å°†åŠ å¯†åŽçš„å­—èŠ‚æ•°ç»„è½¬æ¢ä¸ºBase64字符串方便后续处理,例如传输等
            string encryptedBase64 = Convert.ToBase64String(encryptedBytes);
            return encryptedBase64;
        }
        public static void GenerateRSAKeyPair(out string publicKey, out string privateKey)
        {
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
            {
                publicKey = rsa.ToXmlString(false);
                privateKey = rsa.ToXmlString(true);
            }
        }
        public static byte[] RSAEncrypt(string plainText, string publicKey)
        {
            byte[] encryptedData;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                rsa.FromXmlString(publicKey);
                // å°†æ–‡æœ¬è½¬æ¢ä¸ºUTF8编码的字节数组
                byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
                // ä½¿ç”¨SHA1哈希算法以及Pkcs1填充规则进行加密
                encryptedData = rsa.Encrypt(plainBytes, true);
            }
            return encryptedData;
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MESRoot.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core.Attributes;
namespace WIDESEA_DTO.MES
{
    public class MESRoot<T>
    {
        /// <summary>
        ///
        /// </summary>
        public string From { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string DateTime { get; set; }
        public T Content { get; set; }
    }
    /// <summary>
    ///测试架同步
    /// </summary>
    public class TestToolSynInfo
    {
        /// <summary>
        /// æµ‹è¯•架批次号
        /// </summary>
        public string ToolCode { get; set; }
        /// <summary>
        /// åˆå§‹å¯¿å‘½
        /// </summary>
        public int Life { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/TestToolModel.cs
@@ -56,19 +56,5 @@
        [PropertyValidate("测试架批次号", NotNullAndEmpty = true)]
        public string TestToolCode { get; set; }
    }
    /// <summary>
    ///测试架同步
    /// </summary>
    public class TestToolSynInfo
    {
        /// <summary>
        /// æµ‹è¯•架批次号
        /// </summary>
        public string ToolCode { get; set; }
        /// <summary>
        /// åˆå§‹å¯¿å‘½
        /// </summary>
        public int Life { get; set; }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_IInboundService/IInboundOrderService.cs
@@ -24,5 +24,7 @@
        WebResponseContent FeedbackInboundOrder(int id);
        WebResponseContent MaterielGroup(SaveModel saveModel);
        //入库完成上报
        WebResponseContent FeedbackInboundOrder(Dt_StockInfo stockInfo);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITaskService.cs
@@ -108,5 +108,6 @@
        /// <returns></returns>
        MesResponseContent TestScrap(TestToolScrap toolScrap);
        WebResponseContent IsRelocation(int taskNum, string locationCode);
        WebResponseContent TestSynStock(TestToolSynInfo toolSynInfo);
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -129,7 +129,7 @@
            return content;
        }
        /// <summary>
        /// å•个物料码组盘
        /// å•个物料码组盘 é€‚用测试架
        /// </summary>
        /// <param name="inboundOrderId"></param>
        /// <param name="palletCode"></param>
@@ -144,65 +144,76 @@
                {
                    return WebResponseContent.Instance.Error($"未找到入库单信息");
                }
                if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
                if (inboundOrder.OrderStatus>=InOrderStatusEnum.入库完成.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"入库单已结束");
                }
                if (inboundOrder.Details.Count <= 0)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单明细信息");
                }
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单");
                }
                if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                MatSerNumAnalysisModel model = new MatSerNumAnalysisModel() 
                { 
                    MaterielCode= "307000309",
                    LotNo= "20241216001",
                    ProductionDate= "2024-12-16",
                    EffectiveDate= "2025-12-16",
                    PurchaseOrderNo= "POHA02241216275",
                    MaterielCode = "504907335",
                    LotNo = "20241217001",
                    ProductionDate = "2024-12-17",
                    EffectiveDate = "2025-12-17",
                    PurchaseOrderNo = "POHA02241227285",
                    Quantity=1,
                    SerialNumber= "M:307000309,BS:20241216001,DM:2024-12-16,DE:2025-12-16,Q:4,PO:POHA02241216275"
                    SerialNumber = "M:504907335,BS:20241217001,DM:2024-12-17,DE:2025-12-17,Q:1,PO:POHA02241227285"
                };//测试
                //CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode);
                if (materielInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该物料的信息");
                }
                List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == model.MaterielCode).ToList();
                if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0)
                if (materielInfo.WarehouseId != inboundOrder.WarehouseId)
                {
                    return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息");
                    return WebResponseContent.Instance.Error($"该物料不属于本仓");
                }
                if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode) == null)
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单");
                }
                if (receiveOrder.Details.Count <= 0)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                if (!purchaseOrderNos.Contains(model.PurchaseOrderNo))
                {
                    return WebResponseContent.Instance.Error($"未找到对应收货单明细中采购单");
                }
                Dt_ReceiveOrderDetail? receiveOrderDetail = receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode);
                if (receiveOrderDetail == null)
                {
                    return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息");
                }
                if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
                Dt_InboundOrderDetail? inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode);
                if (inboundOrderDetail == null)
                {
                    return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单");
                    return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息");
                }
                Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity).FirstOrDefault();
                if (notGroupDetail == null)
                if (inboundOrderDetail.OrderDetailStatus>OrderDetailStatusEnum.GroupAndInbound.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
                    return WebResponseContent.Instance.Error($"对应入库单明细已结束");
                }
                float inboundDetailSum = inboundOrderDetail.OverInQuantity + inboundOrderDetail.ReceiptQuantity ;
                if (inboundDetailSum == inboundOrderDetail.OrderQuantity)
                {
                    return WebResponseContent.Instance.Error($"该物料入库单明细已全部组盘完成");
                }
                if (model.Quantity > receiveOrderDetail.ReceivedQuantity || (inboundDetailSum + model.Quantity) > receiveOrderDetail.ReceivedQuantity)
                {
                    return WebResponseContent.Instance.Error($"与该收货单明细收货数量不一致");
                }
                Dt_StockInfo oldStockinfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                if(oldStockinfo!=null)
                {
                    return WebResponseContent.Instance.Error($"托盘重复");
                }
                Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                {
                    BatchNo = model.LotNo,
@@ -215,7 +226,7 @@
                    Status = StockStatusEmun.组盘暂存.ObjToInt(),
                    ProductionDate = model.ProductionDate,
                    EffectiveDate = model.EffectiveDate,
                    InboundOrderRowNo = notGroupDetail.RowNo,
                    InboundOrderRowNo = inboundOrderDetail.RowNo,
                };
                Dt_StockInfo stockInfo = new Dt_StockInfo()
@@ -225,14 +236,25 @@
                    WarehouseId = inboundOrder.WarehouseId,
                    Details=new List<Dt_StockInfoDetail> { stockInfoDetail }
                };
                inboundOrderDetail.ReceiptQuantity += model.Quantity;
                _unitOfWorkManage.BeginTran();
                if (inboundOrderDetail.OrderDetailStatus==OrderDetailStatusEnum.New.ObjToInt())
                {
                    inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                {
                    inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                    BaseDal.UpdateData(inboundOrder);
                }
                _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
@@ -545,8 +567,22 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent FeedbackInboundOrder(Dt_StockInfo stockInfo)
        {
            WebResponseContent content=new WebResponseContent();
            try
            {
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// å…¥åº“完成回传到ERP
        /// å…¥åº“完成回传到ERP æµ‹è¯•
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderDetailService.cs
@@ -49,7 +49,7 @@
        {
            try
            {
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.QueryFirst(x => x.ReceiveOrderNo == orderNo);
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == orderNo).Includes(x=>x.Details).First();
                if (receiveOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该收货单");
@@ -67,53 +67,76 @@
                {
                    return WebResponseContent.Instance.Error($"未找到该物料的信息");
                }
                Dt_PurchaseOrder purchaseOrder = _inboundRepository.PurchaseOrderRepository.QueryFirst(x => x.PurchaseOrderNo == model.PurchaseOrderNo);
                //该收货单仓库是否有该物料
                if (materielInfo.WarehouseId!= receiveOrder.WarehouseId)
                {
                    return WebResponseContent.Instance.Error($"该物料不属于该仓库");
                }
                Dt_PurchaseOrder purchaseOrder = _inboundRepository.PurchaseOrderRepository.Db.Queryable<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == model.PurchaseOrderNo).Includes(x=>x.Details).First();
                if (purchaseOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该采购单");
                }
                if (purchaseOrder.Details.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到该采购单明细数据");
                }
                if (purchaseOrder.SupplierCode != receiveOrder.SuppliersId)
                {
                    return WebResponseContent.Instance.Error($"供应商不一致,请新建收货单");
                }
                if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该采购单收货已完成");
                }
                List<Dt_PurchaseOrderDetail> purchaseOrderDetails = _inboundRepository.PurchaseOrderDetailRepository.QueryData(x => x.PurchaseOrderId == purchaseOrder.Id);
                if (purchaseOrderDetails == null || purchaseOrderDetails.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到该采购单明细数据");
                }
                Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrderDetails.FirstOrDefault(x => x.PurchaseDetailQuantity == model.Quantity && x.MaterielCode == model.MaterielCode && x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt());
                Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt()));
                if (purchaseOrderDetail == null)
                {
                    if (purchaseOrderDetails.Count > 0)
                    if (purchaseOrder.Details.Count > 0)
                    {
                        return WebResponseContent.Instance.Error($"该明细收货已完成");
                    }
                    return WebResponseContent.Instance.Error($"未找到对应的采购单明细数据");
                }
                Dt_ReceiveOrderDetail detail = BaseDal.QueryFirst(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo);
                if (detail != null)
                //判断是否存在对应采购明细的收货明细
                Dt_ReceiveOrderDetail? detail = receiveOrder.Details.FirstOrDefault(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo);
                if (detail != null && detail.ReceivedQuantity == purchaseOrderDetail.PurchaseDetailQuantity)
                {
                    return WebResponseContent.Instance.Error($"该明细收货已完成");
                    return WebResponseContent.Instance.Error($"该明细已收货");
                }
                lock (_rowNoLocker)
                {
                    int rowNo = 0;
                    List<Dt_ReceiveOrderDetail> receiveOrderDetails = BaseDal.QueryData(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId);
                    if (receiveOrderDetails != null && receiveOrderDetails.Count > 0)
                    if (detail!=null)
                    {
                        rowNo = receiveOrderDetails.Max(x => x.RowNo);
                        //原有收货明细增加收货数量
                        detail.ReceivedQuantity += model.Quantity;
                        purchaseOrderDetail.PurchaseDetailReceiveQty = detail.ReceivedQuantity;
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
                    }
                        if(purchaseOrderDetail.PurchaseDetailReceiveQty ==purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
                        }
                        float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty) + model.Quantity;
                        _unitOfWorkManage.BeginTran();
                        if (purchaseOrder.OrderQuantity == sumQty)
                        {
                            purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
                            _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
                        }
                        BaseDal.UpdateData(detail);
                        _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
                        _unitOfWorkManage.CommitTran();
                    }
                    else
                    {
                        int rowNo = 0;
                        if (receiveOrder.Details.Count > 0)
                        {
                            rowNo = receiveOrder.Details.Max(x => x.RowNo);
                        }
                    Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
                    {
                        PurchaseOrderNo = model.PurchaseOrderNo,
@@ -129,30 +152,56 @@
                        RowNo = rowNo + 1,
                        Unit = purchaseOrderDetail.Unit
                    };
                    if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.NotStarted.ObjToInt())
                    {
                        receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt();
                    }
                        //判断采购明细数量
                        if (purchaseOrderDetail.PurchaseDetailQuantity<model.Quantity)
                        {
                            return WebResponseContent.Instance.Error($"请核对采购单该物料数量");
                        }
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty>0)
                        {
                            purchaseOrderDetail.PurchaseDetailReceiveQty += model.Quantity;
                        }
                        else
                        {
                            purchaseOrderDetail.PurchaseDetailReceiveQty = model.Quantity;
                        }
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty> purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
                        }
                        if (purchaseOrderDetail.PurchaseDetailQuantity == purchaseOrderDetail.PurchaseDetailReceiveQty)
                        {
                    purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
                        }
                        float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty) + model.Quantity;
                    _unitOfWorkManage.BeginTran();
                    BaseDal.AddData(receiveOrderDetail);
                        if (purchaseOrder.OrderQuantity == sumQty)
                        {
                            purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
                            _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
                        }
                    _inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder);
                    _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
                    if (materielInfo.IsCheck == WhetherEnum.True)
                    {
                        Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                        checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
                        checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                        checkOrder.ScrappedQuantity = 0;
                        checkOrder.ReturnQuantity = 0;
                        checkOrder.DefectedQuantity = 0;
                        _checkOrderRepository.AddData(checkOrder);
                        #region æ³¨é‡Š
                        //if (materielInfo.IsCheck == WhetherEnum.True)
                        //{
                        //    Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                        //    checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
                        //    checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                        //    checkOrder.ScrappedQuantity = 0;
                        //    checkOrder.ReturnQuantity = 0;
                        //    checkOrder.DefectedQuantity = 0;
                        //    _checkOrderRepository.AddData(checkOrder);
                        //}
                        #endregion
                        _unitOfWorkManage.CommitTran();
                    }
                    _unitOfWorkManage.CommitTran();
                    return WebResponseContent.Instance.OK();
                }
            }
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderService.cs
@@ -139,7 +139,7 @@
                    CustomerId = receiveOrder.CustomerId,
                    CreatorId = "TC20082",//测试 receiveOrder.Creater
                    EntDate = receiveOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"),
                    ReceiveDate = receiveOrder.ReceiveDate.ToString("yyyy-MM-dd HH:mm:ss"),
                    ReceiveDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    PlantsId = "HA02",
                    SuppliersId = receiveOrder.SuppliersId,
                    Type = Enum.GetName(typeof(ReceiveOrderTypeEnum),receiveOrder.ReceiveOrderType),
@@ -155,12 +155,10 @@
                {
                    return WebResponseContent.Instance.Error(erpRequest.Data);
                }
                //更新收货单信息
                receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Completed.ObjToInt();
                receiveOrder.UploadStatus = WhetherEnum.True.ObjToInt();
                //更新收货单信息
                _unitOfWorkManage.BeginTran();
                BaseDal.UpdateData(receiveOrder);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -217,21 +215,22 @@
                {
                    return WebResponseContent.Instance.Error($"该收货单未完成");
                }
                #region æ³¨é‡Š
                //List<Dt_CheckOrder> checkOrders = _checkOrderRepository.QueryData(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo);
                //if (checkOrders.FirstOrDefault(x => x.CheckOrderStatus == CheckOrderStatusEnum.NotCheck.ObjToInt()) != null)
                //{
                //    return WebResponseContent.Instance.Error($"该收货单未质检完成");
                //}
                List<Dt_CheckOrder> checkOrders = _checkOrderRepository.QueryData(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo);
                if (checkOrders.FirstOrDefault(x => x.CheckOrderStatus == CheckOrderStatusEnum.NotCheck.ObjToInt()) != null)
                {
                    return WebResponseContent.Instance.Error($"该收货单未质检完成");
                }
                if (checkOrders.FirstOrDefault(x => x.AuditStatus != AuditStatusEnum.Agree.ObjToInt()) != null)
                {
                    return WebResponseContent.Instance.Error($"该收货单质检结果审批未完成");
                }
                //if (checkOrders.FirstOrDefault(x => x.AuditStatus != AuditStatusEnum.Agree.ObjToInt()) != null)
                //{
                //    return WebResponseContent.Instance.Error($"该收货单质检结果审批未完成");
                //}
                #endregion
                Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
                {
                    InboundOrderNo="TestInboundNo1",//测试
                    InboundOrderNo="TestInboundNo21",//测试
                    UpperOrderNo = receiveOrder.ReceiveOrderNo,
                    CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                    OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
@@ -244,15 +243,17 @@
                foreach (var item in receiveOrder.Details)
                {
                    float quantity = item.ReceivedQuantity;
                    if (item.IfInspection == WhetherEnum.True.ObjToInt())
                    {
                        Dt_CheckOrder? checkOrder = checkOrders.FirstOrDefault(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo && x.ReceiveDetailRowNo == item.RowNo);
                        if (checkOrder == null)
                        {
                            return WebResponseContent.Instance.Error($"质检单数据错误");
                        }
                        quantity = checkOrder.QualifiedQuantity.GetValueOrDefault() + checkOrder.DefectedQuantity.GetValueOrDefault();
                    }
                    #region æ³¨é‡Š
                    //if (item.IfInspection == WhetherEnum.True.ObjToInt())
                    //{
                    //    Dt_CheckOrder? checkOrder = checkOrders.FirstOrDefault(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo && x.ReceiveDetailRowNo == item.RowNo);
                    //    if (checkOrder == null)
                    //    {
                    //        return WebResponseContent.Instance.Error($"质检单数据错误");
                    //    }
                    //    quantity = checkOrder.QualifiedQuantity.GetValueOrDefault() + checkOrder.DefectedQuantity.GetValueOrDefault();
                    //}
                    #endregion
                    Dt_InboundOrderDetail detail = new Dt_InboundOrderDetail()
                    {
                        MaterielCode = item.MaterielCode,
@@ -286,7 +287,7 @@
                {
                    return WebResponseContent.Instance.Error($"未找到该采购单");
                }
                if (purchaseOrder.Details == null || purchaseOrder.Details.Count == 0)
                if (purchaseOrder.Details.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到采购单明细信息");
                }
@@ -333,24 +334,25 @@
                        };
                        rowNo += 1;
                        receiveOrderDetails.Add(receiveOrderDetail);
                        if (materielInfo.IsCheck == WhetherEnum.True)
                        {
                            Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                            checkOrder.CheckOrderNo = "TestCheckNo11";//测试
                            checkOrder.ReceiveOrderNo = "";
                            checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                            checkOrder.ScrappedQuantity = 0;
                            checkOrder.ReturnQuantity = 0;
                            checkOrder.DefectedQuantity = 0;
                            checkOrder.ReceiveDetailRowNo = rowNo;
                            checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt();
                            checkOrders.Add(checkOrder);
                        }
                        #region æ³¨é‡Š
                        //if (materielInfo.IsCheck == WhetherEnum.True)
                        //{
                        //    Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                        //    checkOrder.CheckOrderNo = "TestCheckNo21";//测试
                        //    checkOrder.ReceiveOrderNo = "";
                        //    checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                        //    checkOrder.ScrappedQuantity = 0;
                        //    checkOrder.ReturnQuantity = 0;
                        //    checkOrder.DefectedQuantity = 0;
                        //    checkOrder.ReceiveDetailRowNo = rowNo;
                        //    checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt();
                        //    checkOrders.Add(checkOrder);
                        //}
                        #endregion
                    }
                    receiveOrder = new Dt_ReceiveOrder()
                    {
                        ReceiveOrderNo= "TestReceiveOrderNo11",//测试
                        ReceiveOrderNo= "TestReceiveOrderNo21",//测试
                        ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt(),
                        CustomerId = "",
                        DeliveryCode = "/",
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Outbound/Dt_OutboundOrder.cs
@@ -58,13 +58,24 @@
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "创建方式", IsOnlyIgnoreUpdate = true)]
        public int CreateType { get; set; }
        /// <summary>
        /// éƒ¨é—¨ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "部门编号")]
        public string DepartmentCode { get; set; }
        /// <summary>
        /// éƒ¨é—¨åç§°
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "部门名称")]
        public string DepartmentName { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 200, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// å‡ºåº“单明细
        /// </summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfoDetail.cs
@@ -47,7 +47,7 @@
        /// <summary>
        /// æ‰¹æ¬¡å·
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 20, ColumnDescription = "批次号")]
        [SugarColumn(IsNullable = true, Length = 100, ColumnDescription = "批次号")]
        public string BatchNo { get; set; }
        /// <summary>
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundOrderService.cs
@@ -99,30 +99,7 @@
                                OrderQuantity = model.Qty,
                                OrderId = oldOutboundOrder.Id
                            };
                            List<Dt_StockInfo>? stockInfos = new List<Dt_StockInfo>();
                            //ERP上传测试仓领料单更新对应库存状态
                            if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
                            {
                                WebResponseContent responseContent = TestOutStocksUpdate(warehouse, model);
                                if (!responseContent.Status)
                                {
                                    return responseContent;
                                }
                                stockInfos = responseContent.Data as List<Dt_StockInfo>;
                            }
                            _unitOfWorkManage.BeginTran();
                            if (stockInfos.Count>0)
                            {
                                _stockInfoRepository.UpdateData(stockInfos);
                                //测试架库给ERP上报出库完成
                                if (!TestOutBack(stockInfos, warehouse, model).Status)
                                {
                                    _unitOfWorkManage.RollbackTran();
                                    return WebResponseContent.Instance.Error($"测试架出库上报失败");
                                }
                            }
                            _outboundOrderDetailRepository.AddData(outboundOrderDetail);
                            _unitOfWorkManage.CommitTran();
                        }
                    }
                    else
@@ -136,7 +113,6 @@
                            OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
                            OrderQuantity = model.Qty,
                        };
                        Dt_OutboundOrder outboundOrder = new Dt_OutboundOrder()
                        {
                            OrderNo=model.OrderNo,
@@ -145,33 +121,11 @@
                            OrderType = OutOrderTypeEnum.Issue.ObjToInt(),
                            CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
                            WarehouseId = warehouse.WarehouseId,
                            DepartmentCode = model.DepartmentCode,
                            DepartmentName = model.DepartmentName,
                            Details = new List<Dt_OutboundOrderDetail> { outboundOrderDetail }
                        };
                        List<Dt_StockInfo>? stockInfos = new List<Dt_StockInfo>();
                        //ERP上传测试仓领料单更新对应库存状态
                        if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString())
                        {
                            WebResponseContent responseContent = TestOutStocksUpdate(warehouse, model);
                            if (!responseContent.Status)
                            {
                                return responseContent;
                            }
                            stockInfos = responseContent.Data as List<Dt_StockInfo>;
                        }
                        _unitOfWorkManage.BeginTran();
                        if (stockInfos.Count > 0)
                        {
                            _stockInfoRepository.UpdateData(stockInfos);
                            //测试架库给ERP上报出库完成
                            if (!TestOutBack(stockInfos, warehouse, model).Status)
                            {
                                _unitOfWorkManage.RollbackTran();
                                return WebResponseContent.Instance.Error($"测试架出库上报失败");
                            }
                        }
                        Db.InsertNav(outboundOrder).Include(x => x.Details).ExecuteCommand();
                        _unitOfWorkManage.CommitTran();
                    }
                }
                else if (model.Way == 2)
@@ -217,7 +171,7 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        //上报出库完成
        //上报出库完成 æµ‹è¯•æž¶
        public WebResponseContent TestOutUpload(int id)
        {
            try
@@ -227,8 +181,8 @@
                //测试架库给ERP上报出库完成
                ERPPickItemModel eRPOutPick = new ERPPickItemModel()
                {
                    Lotno = "20241226001",
                    Qty = "5",
                    Lotno = "20241227001",
                    Qty = "1",
                    Location = warehouse.WarehouseCode
                };
                ERPPickModel pickModel = new ERPPickModel()
@@ -247,11 +201,11 @@
                ERPIssueModel issueModel = new ERPIssueModel()
                {
                    UniqueTag = id.ToString(),
                    Code = "FL20241226001",
                    Code = "FL20241227001",//测试
                    WarehouseCode = warehouse.WarehouseCode,
                    Docremark = "",
                    Deptno = "F2HAECZSQZ",
                    Deptname = "淮安二厂制三区阻焊",
                    Deptno = outboundOrder.DepartmentCode,
                    Deptname = outboundOrder.DepartmentName,
                    Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    Createuser = "TC20082",
                    Issitem = new List<ERPIssueItemModel>() { issueItemModel },
@@ -272,7 +226,6 @@
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// æ›´æ”¹å‡ºåº“单库存状态
@@ -285,7 +238,7 @@
            try
            {
                //获取出库单库存
                List<Dt_StockInfo> stockInfos = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).OrderBy(x => x.CreateDate).Includes(x => x.Details).Where(x => x.Details.Any(x => x.MaterielCode == model.MCode)).Take((int)(model.Qty)).ToList();
                List<Dt_StockInfo> stockInfos = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).ToList();
                if (model.Qty > stockInfos.Count)
                {
                    return WebResponseContent.Instance.Error($"物料:{model.MCode}库存不足");
@@ -303,53 +256,28 @@
            }
        }
        ///推送测试架出库
        public WebResponseContent TestOutBack(List<Dt_StockInfo> stockInfos,Dt_Warehouse warehouse, ErpOutOrderDTO model)
        {
            try
            {
                //测试架库给ERP上报出库完成
                List<ERPOutPickDetail> pickDetails = stockInfos.Select(x => new ERPOutPickDetail()
                {
                    Lotno = x.Details[0].BatchNo,
                    Qty = x.Details[0].StockQuantity.ObjToInt()
                }).ToList();
                ERPOutPick outPick = new ERPOutPick()
                {
                    Rowindex = model.RowNo,
                    Material = model.MCode,
                    Qty = model.Qty.ObjToInt(),
                    Dataitem = pickDetails
                };
                ERPOutboundModel inboundModel = new ERPOutboundModel()
                {
                    Way = 1,
                    UniqueTag = model.OrderNo,
                    Code = model.OrderNo,
                    WarehouseCode = warehouse.WarehouseCode,
                    Docremark = "",
                    Deptno = model.DepartmentCode,
                    DeptName = model.DepartmentName,
                    Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    Createuser = "WMS",
                    Picklist = new List<ERPOutPick>() { outPick },
                };
                string response = _invokeERPService.InvokeOutboundOrderApi(inboundModel);
                ErpRequestContent requestContent=response.DeserializeObject<ErpRequestContent>();
                if (requestContent.res==1)
                {
        //public WebResponseContent TestOutBack(int id,List<string> locationIds)
        //{
        //    try
        //    {
                    
                    return WebResponseContent.Instance.OK(requestContent.Data);
                }
                else
                {
                    return WebResponseContent.Instance.Error(requestContent.Data);
                }
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        //        string response = _invokeERPService.InvokeOutStandardsApi(issueModel);
        //        ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>();
        //        if (requestContent.res == 1)
        //        {
        //            return WebResponseContent.Instance.OK(requestContent.Data);
        //        }
        //        else
        //        {
        //            return WebResponseContent.Instance.Error(requestContent.Data);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        return WebResponseContent.Instance.Error(ex.Message);
        //    }
        //}
        //public WebResponseContent FeedbackOutbondIssue(List<Dt_OutStockLockInfo> outStockLockInfos)
        //{
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/MesTaskService.cs
@@ -1,4 +1,6 @@
using SqlSugar.Extensions;

using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -14,6 +16,7 @@
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.MES;
@@ -37,10 +40,10 @@
            {
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA64.ToString());
                //获取库存记录
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId && 
                  x.StockStatus==(int)StockStatusEmun.入库完成)
                .Includes(x => x.Details).Where(x => x.Details.Any(x => x.BatchNo == model.ToolCode)).First();
                  x.StockStatus==(int)StockStatusEmun.入库完成).Includes(x=>x.Details).ToList();
                Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x=>x.Details.Any(x=>x.BatchNo==model.ToolCode));
                if (stockInfo==null)
                {
                    return responseContent.Error($"测试架:{model.ToolCode}无可用库存");
@@ -62,7 +65,7 @@
                    NextAddress = "",
                    Roadway = locationInfo.RoadwayNo,
                    SourceAddress = stockInfo.LocationCode,
                    TargetAddress = "",
                    TargetAddress = model.TargetAddressCode,
                    TaskStatus = (int)TaskStatusEnum.New,
                    TaskType = (int)TaskTypeEnum.Outbound,
                    TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
@@ -108,10 +111,10 @@
                //获取测试架原库存信息
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
                //获取库存记录
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId &&
                  x.StockStatus == (int)StockStatusEmun.出库完成)
                .Includes(x => x.Details).Where(x => x.Details.Any(x => x.BatchNo == backModel.TestToolCode)).First();
                  x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList();
                Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == backModel.TestToolCode));
                if (stockInfo==null)
                {
                    return responseContent.Error($"{backModel.TestToolCode}库存信息不存在");
@@ -134,10 +137,9 @@
                };
                //更改库存状态
                stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                _unitOfWorkManage.BeginTran();
                //将任务推送到WCS
                PushTasksToWCS(new List<Dt_Task>() { taskIn }, "AGV");
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _unitOfWorkManage.CommitTran();
                responseContent.OK();
            }
            catch (Exception ex)
@@ -159,17 +161,18 @@
                //获取测试架批次号库存
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA64.ToString());
                //获取库存记录
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId && x.StockStatus==StockStatusEmun.出库完成.ObjToInt())
                .Includes(x => x.Details).Where(x => x.Details.Any(x => x.BatchNo == toolScrap.ToolCode)).First();
                //获取库存记录
                List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x =>
                  x.WarehouseId == warehouse.WarehouseId &&
                  x.StockStatus == (int)StockStatusEmun.出库完成).Includes(x => x.Details).ToList();
                Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(x => x.BatchNo == toolScrap.ToolCode));
                if (stockInfo == null)
                {
                    return responseContent.Error($"{toolScrap.ToolCode}库存信息不存在");
                }
                //清除库存信息
                _unitOfWorkManage.BeginTran();
                _stockRepository.StockInfoRepository.DeleteData(stockInfo);
                _stockRepository.StockInfoDetailRepository.DeleteData(stockInfo.Details);
                _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo,OperateTypeEnum.自动删除);
                _stockRepository.StockInfoDetailRepository.DeleteAndMoveIntoHty(stockInfo.Details, OperateTypeEnum.自动删除);
                _unitOfWorkManage.CommitTran();
@@ -192,13 +195,28 @@
            try
            {
                Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x=>x.ApiCode==APIEnum.WMS_MES_TestToolSync.ToString());
                Root<TestToolSynInfo> root = new Root<TestToolSynInfo>()
                MESRoot<TestToolSynInfo> root = new MESRoot<TestToolSynInfo>()
                {
                    From = "WMS",
                    DateTime = DateTime.Now.ToString(),
                    DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    Content=toolSynInfo
                };
                JsonSerializerSettings settings = new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                };
                string request = JsonConvert.SerializeObject(root, settings);
                string response = HttpMesHelper.Post(apiInfo.ApiAddress, request);
                MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>();
                //调用接口
                if (mesResponseContent.BSucc==true)
                {
                    content.OK(mesResponseContent.StrMsg);
                }
                else
                {
                    content.Error(mesResponseContent.StrMsg);
                }
            }
            catch (Exception ex)
            {
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -25,6 +25,7 @@
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
@@ -36,6 +37,7 @@
using WIDESEA_External.ERPService;
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
@@ -61,6 +63,7 @@
        private readonly IBasicRepository _basicRepository;
        private readonly IApiInfoRepository _apiInfoRepository;
        private readonly IInvokeERPService _invokeERPService;
        private readonly IInboundRepository _inboundRepository;
        public ITaskRepository Repository => BaseDal;
@@ -74,7 +77,7 @@
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IOutboundService outboundService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IOutboundService outboundService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IInboundRepository inboundRepository) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -86,6 +89,7 @@
            _basicRepository = basicRepository;
            _apiInfoRepository = apiInfoRepository;
            _invokeERPService = invokeERPService;
            _inboundRepository = inboundRepository;
        }
        /// <summary>
@@ -131,7 +135,7 @@
                    return WebResponseContent.Instance.Error($"任务类型错误");
                }
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.Details).First();
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId==task.WarehouseId).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息");
@@ -142,7 +146,7 @@
                    return WebResponseContent.Instance.Error($"该托盘已绑定货位");
                }
                if (stockInfo.Details == null || stockInfo.Details.Count == 0)
                if (stockInfo.Details.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到该托盘库存明细信息");
                }
@@ -160,27 +164,32 @@
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId== task.WarehouseId);
                //测试架入库库存状态
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt() && warehouse.WarehouseCode==WarehouseEnum.HA64.ToString())
                {
                    stockInfo.StockStatus = StockStatusEmun.入库完成未建出库单.ObjToInt();
                    stockInfo.Details.ForEach(x =>
                    {
                        x.Status = StockStatusEmun.入库完成.ObjToInt();
                    });
                }
                else
                {
                    stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
                }
                stockInfo.LocationCode = locationInfo.LocationCode;
                }
                stockInfo.Details.ForEach(x =>
                {
                    x.Status = StockStatusEmun.入库完成.ObjToInt();
                });
                stockInfo.LocationCode = locationInfo.LocationCode;
                //推送入库完成给Erp
                //获取入库单更新入库单
                //Dt_InboundOrder inboundOrder = _inboundRepository.InboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x=>x.InboundOrderNo);
                if (true)
                {
                }
                _unitOfWorkManage.BeginTran();
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, (PalletTypeEnum)stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationChangeType.InboundCompleted);
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MES/MesController.cs
@@ -11,6 +11,7 @@
using WIDESEA_TaskInfoService;
using WIDESEA_DTO.ERP;
using WIDESEA_DTO.MES;
using WIDESEA_Core.Helper;
namespace WIDESEA_WMSServer.Controllers.MES
{
@@ -64,5 +65,15 @@
        {
            return _taskService.TestScrap(model.Content);
        }
        [HttpPost, Route("TestSynStock"), AllowAnonymous]
        public WebResponseContent TestSynStock([FromBody]TestToolSynInfo toolSynInfo)
        {
            return _taskService.TestSynStock(toolSynInfo);
        }
        [HttpPost, Route("testHttp"), AllowAnonymous, MethodParamsValidate]
        public string TestScrap(string str)
        {
            return HttpMesHelper.GetStr(str);
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -12,7 +12,7 @@
  "MainDB": "DB_WIDESEA", //当前项目的主库,所对应的连接字符串的Enabled必须为true
  //连接字符串
  //"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=.;Initial Catalog=WIDESEAWMS_HUAIAN;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
  //跨域
  "Cors": {
    "PolicyName": "CorsIpAccess", //策略名称