1
dengjunjie
2025-10-17 36226b8adcbfb46fe71fc9526134a54886b3312c
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs
@@ -32,7 +32,6 @@
{
    public class CabinOrderServices : ServiceBase<Dt_CabinOrder, IRepository<Dt_CabinOrder>>, ICabinOrderServices
    {
        static string SearchDate = "";
        private readonly IBasicService _basicService;
        private readonly IMedicineGoodsServices _medicineGoodsServices;
@@ -54,104 +53,8 @@
            _supplyTaskService = supplyTaskService;
        }
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸ç³»ç»Ÿçš„å…¥åº“å•
        /// </summary>
        /// <param name="searchDate"></param>
        /// <returns></returns>
        //public WebResponseContent GetUpstreamOrder(DateTime searchDate)
        //{
        //    var responseContent = new WebResponseContent();
        //    try
        //    {
        //        // è¯·æ±‚地址
        //        var url = "http://127.0.0.1:9090/GYZ2/95fck/inOrder";
        //        //// è¯·æ±‚参数
        //        var requestData = new
        //        {
        //            searchDate = searchDate.ToString("yyyy-MM-dd HH:mm:ss")
        //        };
        //        // å‘起请求
        //        var result = HttpHelper.Post(url, requestData.ToJsonString());
        //        // ååºåˆ—化
        //        var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
        //        if (response.resultCode != "0")
        //        {
        //            // è°ƒç”¨å¼‚常接口
        //            SendErrorToUpstream(1, "", response.resultMsg ?? "上游接口返回失败", "");
        //            return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
        //        }
        //        if (response.data == null || !response.data.Any())
        //        {
        //            return responseContent.OK("无新入库单数据");
        //        }
        //        Db.Ado.BeginTran();
        //        List<Dt_CabinOrder> _CabinOrders = new List<Dt_CabinOrder>();
        //        foreach (var order in response.data)
        //        {
        //            try
        //            {
        //                // æ’入入库单表
        //                var entityOrder = new Dt_CabinOrder
        //                {
        //                    Order_no = order.order_no,
        //                    Order_type = order.order_type,
        //                    Supplier_no = order.supplier_no,
        //                    Account_tiem = order.account_time,
        //                    OdrderStatus = "新建",
        //                };
        //                //var orderId = Db.Insertable(entityOrder).ExecuteReturnIdentity(); //就是返回主键ID。
        //                // æ’入入库明细表
        //                var detailEntities = order.details.Select(d => new Dt_CabinOrderDetail
        //                {
        //                    //OrderId= orderId,
        //                    Goods_no = d.goods_no,
        //                    Order_qty = d.order_qty,
        //                    Batch_num = d.batch_num,
        //                    Exp_date = d.exp_date,
        //                    Warehouse_no = d.warehouse_no,
        //                    Status = 0,
        //                }).ToList();
        //                entityOrder.Details.AddRange(detailEntities); //建立主对象与子对象的关联关系
        //                _CabinOrders.Add(entityOrder);
        //                //自己
        //                /// Db.Insertable(detailEntities).ExecuteCommand();
        //                //这里要调用一个接口将上面的信息传给wcs,然后改变状态
        //            }
        //            catch (Exception innerEx)
        //            {
        //                // é’ˆå¯¹æŸæ¡è®¢å•报错时,推送异常给上游
        //                SendErrorToUpstream(1, order.order_no, innerEx.Message, "");
        //                throw; // æŠ›å‡ºå¼‚常,让外层捕获回滚
        //            }
        //        }
        //        // æ‰¹é‡æ’入(SqlSugar自动处理主外键关系)
        //        Db.Insertable(_CabinOrders).ExecuteCommand();
        //        Db.Ado.CommitTran();
        //        //如果EdiIn完成那么就调用CompleteOrder接口
        //        return responseContent.OK("同步入库单成功");
        //    }
        //    catch (Exception ex)
        //    {
        //        // å…¨å±€å¼‚常时,也推送异常给上游
        //        SendErrorToUpstream(1, "", ex.Message, "");
        //        Db.Ado.RollbackTran();
        //        return responseContent.Error("同步失败: " + ex.Message);
        //    }
        //}
        public WebResponseContent GetCabinOrders(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
@@ -333,6 +236,12 @@
            return content;
        }
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸ç³»ç»Ÿçš„å…¥åº“å•
        /// </summary>
        /// <param name="searchDate"></param>
        /// <returns></returns>
        public WebResponseContent GetUpstreamOrder()
        {
            var responseContent = new WebResponseContent();
@@ -389,6 +298,7 @@
                    foreach (var order in newOrders)
                    {
                        bool skipOrder = false;//标记是否跳过该入库单
                        var entityOrder = new Dt_CabinOrder
                        {
                            Order_no = order.order_no,
@@ -417,8 +327,22 @@
                            // å°†ä¸Šæ¸¸å…¥åº“数量转为正数
                            item.order_qty = Math.Abs(item.order_qty);
                            #region æ ¹æ®ç‰©æ–™ç¼–码查询物料信息
                            //Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == item.goods_no);
                            Dt_MedicineGoods materielInfo = BaseDal.Db.Queryable<Dt_MedicineGoods>().Where(x => x.Goods_no == item.goods_no).First();
                            Dt_MaterielInfo materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == item.goods_no);
                            //如果物料信息不存在,跳过整个入库单
                            if (materielInfo == null)
                            {
                                skipOrder = true;
                                Console.WriteLine($"跳过入库单 {order.order_no},原因:未找到商品 [{item.goods_no}] çš„物料信息。");
                                break;
                            }
                            //  è‹¥ç‰©æ–™ä¸å­˜åœ¨æˆ– MaterielSourceType ä¸ºç©ºï¼Œåˆ™è·³è¿‡æ•´ä¸ªå…¥åº“单
                            if (materielInfo == null || !Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
                            {
                                skipOrder = true;
                                break;
                            }
                            //Dt_MedicineGoods materielInfo = BaseDal.Db.Queryable<Dt_MedicineGoods>().Where(x => x.Goods_no == item.goods_no).First();
                            ///根据物料信息大小件属性区分是否入立库 //大件入平库
                            if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart)
                            {
@@ -504,9 +428,15 @@
                                }
                                #endregion
                            }
                            //_basicService.MaterielInfoService.Repository.UpdateData(materielInfo);
                            _medicineGoodsServices.Db.Updateable(materielInfo).ExecuteCommand();
                            _basicService.MaterielInfoService.Repository.UpdateData(materielInfo);
                            //_medicineGoodsServices.Db.Updateable(materielInfo).ExecuteCommand();
                            #endregion
                        }
                        // â—如果跳过该单,则直接continue,不保存
                        if (skipOrder)
                        {
                            Console.WriteLine($"跳过入库单 {order.order_no},因为存在未定义物料属性的商品。");
                            continue;
                        }
                        _CabinOrders.Add(entityOrder);
                        orderNos.Add(order.order_no);
@@ -529,6 +459,214 @@
            catch (Exception ex)
            {
                // å…¨å±€å¼‚常时,也推送异常给上游
                SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
        /// <summary>
        /// å¯¹æ²¡æœ‰è¿›è¡Œç»´æŠ¤å•†å“ä¿¡æ¯è¡¨çš„入库单进行过滤处理
        /// </summary>
        /// <returns></returns>
        public WebResponseContent GetUpstreamOrder2()
        {
            var responseContent = new WebResponseContent();
            try
            {
                // è¯·æ±‚地址
                var url = "http://121.37.118.63:80/GYZ2/95fck/inOrder";
                //if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// è¯·æ±‚参数
                var requestData = new
                {
                    //searchDate = SearchDate
                    searchDate = "2020-10-10 20:45:16"  // æ­£ç¡®çš„æ ¼å¼
                };
                //SearchDate = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd HH:mm:ss");
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
                if (response.resultCode != "0")
                {
                    SendErrorToUpstream(1, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
                if (response.data == null || !response.data.Any())
                    return responseContent.OK("无新入库单数据");
                var existingOrderNos = BaseDal.Db.Queryable<Dt_CabinOrder>()
                    .Select(x => x.Order_no)
                    .ToList();
                var newOrders = response.data
                    .Where(order => !existingOrderNos.Contains(order.order_no))
                    .ToList();
                if (!newOrders.Any())
                    return responseContent.OK("所有入库单已存在,无需新增");
                Db.Ado.BeginTran();
                try
                {
                    List<Dt_CabinOrder> _CabinOrders = new();
                    List<string> orderNos = new();
                    foreach (var order in newOrders)
                    {
                        bool skipOrder = false; // æ ‡è®°æ˜¯å¦è·³è¿‡è¯¥å…¥åº“单
                        var entityOrder = new Dt_CabinOrder
                        {
                            Order_no = order.order_no,
                            Order_type = order.order_type,
                            Supplier_no = order.supplier_no,
                            Account_tiem = order.account_time,
                            OdrderStatus = "新建",
                            Supplier_name = order.supplier_name,
                            Warehouse_no = order.warehouse_no,
                            Details = new List<Dt_CabinOrderDetail>()
                        };
                        foreach (var item in order.details)
                        {
                            item.order_qty = Math.Abs(item.order_qty);
                            // æŸ¥è¯¢ç‰©æ–™ä¿¡æ¯
                            var materielInfo = BaseDal.Db.Queryable<Dt_MedicineGoods>()
                                .Where(x => x.Goods_no == item.goods_no)
                                .First();
                            //如果物料信息不存在,跳过整个入库单
                            if (materielInfo == null)
                            {
                                skipOrder = true;
                                Console.WriteLine($"跳过入库单 {order.order_no},原因:未找到商品 [{item.goods_no}] çš„物料信息。");
                                break;
                            }
                            //  è‹¥ç‰©æ–™ä¸å­˜åœ¨æˆ– MaterielSourceType ä¸ºç©ºï¼Œåˆ™è·³è¿‡æ•´ä¸ªå…¥åº“单
                            if (materielInfo == null || !Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType))
                            {
                                skipOrder = true;
                                break;
                            }
                            // åŒºåˆ†å¤§ä»¶/小件
                            if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart)
                            {
                                var detail = new Dt_CabinOrderDetail
                                {
                                    Reservoirarea = order.warehouse_no,
                                    Goods_no = item.goods_no,
                                    Order_qty = item.order_qty,
                                    Batch_num = item.batch_num,
                                    Exp_date = item.exp_date,
                                    OrderDetailStatus = "新建",
                                    Status = 2
                                };
                                entityOrder.Details.Add(detail);
                            }
                            else
                            {
                                Dt_CabinOrderDetail orderDetail = null;
                                var ys = item.order_qty % materielInfo.BoxQty; // ä¸èƒ½æ•´é™¤çš„æ•£ä»¶
                                var xs = item.order_qty / materielInfo.BoxQty; // æ•´ç®±æ•°é‡
                                // æœ‰æ•£ä»¶
                                if (ys > 0)
                                {
                                    orderDetail = new Dt_CabinOrderDetail
                                    {
                                        Reservoirarea = order.warehouse_no,
                                        Goods_no = item.goods_no,
                                        Order_qty = ys,
                                        Batch_num = item.batch_num,
                                        Exp_date = item.exp_date,
                                        OrderDetailStatus = "新建",
                                        Status = 0
                                    };
                                    materielInfo.Business_qty += ys;
                                }
                                // ä¸è¶³æœ€ä½Žåº“存时补入立库
                                while (materielInfo.Business_qty < materielInfo.MinQty && xs > 0)
                                {
                                    xs--;
                                    if (orderDetail == null)
                                    {
                                        orderDetail = new Dt_CabinOrderDetail
                                        {
                                            Reservoirarea = order.warehouse_no,
                                            Goods_no = item.goods_no,
                                            Order_qty = materielInfo.BoxQty,
                                            Batch_num = item.batch_num,
                                            Exp_date = item.exp_date,
                                            OrderDetailStatus = "新建",
                                            Status = 0
                                        };
                                    }
                                    else
                                    {
                                        orderDetail.Order_qty += materielInfo.BoxQty;
                                    }
                                    materielInfo.Business_qty += materielInfo.BoxQty;
                                }
                                if (orderDetail != null) entityOrder.Details.Add(orderDetail);
                                // å‰©ä½™æ•´ç®±å…¥å¹³åº“
                                if (xs > 0)
                                {
                                    entityOrder.Details.Add(new Dt_CabinOrderDetail
                                    {
                                        Reservoirarea = order.warehouse_no,
                                        Goods_no = item.goods_no,
                                        Order_qty = materielInfo.BoxQty * xs,
                                        Batch_num = item.batch_num,
                                        Exp_date = item.exp_date,
                                        OrderDetailStatus = "新建",
                                        Status = 2
                                    });
                                }
                            }
                            _medicineGoodsServices.Db.Updateable(materielInfo).ExecuteCommand();
                        }
                        // â—如果跳过该单,则直接continue,不保存
                        if (skipOrder)
                        {
                            Console.WriteLine($"跳过入库单 {order.order_no},因为存在未定义物料属性的商品。");
                            continue;
                        }
                        _CabinOrders.Add(entityOrder);
                        orderNos.Add(order.order_no);
                    }
                    if (_CabinOrders.Any())
                    {
                        BaseDal.Db.InsertNav(_CabinOrders).Include(x => x.Details).ExecuteCommand();
                        Db.Ado.CommitTran();
                        return responseContent.OK($"成功同步 {_CabinOrders.Count} æ¡å…¥åº“单");
                    }
                    else
                    {
                        Db.Ado.RollbackTran();
                        return responseContent.OK("无可处理的入库单(商品属性未定义或未找到)");
                    }
                }
                catch (Exception ex)
                {
                    Db.Ado.RollbackTran();
                    SendErrorToUpstream(1, "", ex.Message, "");
                    return responseContent.Error("同步失败: " + ex.Message);
                }
            }
            catch (Exception ex)
            {
                SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
@@ -571,10 +709,10 @@
                    string materialCode = "YY";//默认值
                    //获取当前订单的第一个明细项
                    var firstDetail = order.Details.FirstOrDefault();
                    if (firstDetail?.MedicineGoods != null && !string.IsNullOrEmpty(firstDetail.MedicineGoods.MaterialCode))
                    if (firstDetail?.MedicineGoods != null && !string.IsNullOrEmpty(firstDetail.MedicineGoods.MaterielErpType))
                    {
                        //如果条件满足,将物料代码设置为第一个明细项对应的药品物料代码
                        materialCode = firstDetail.MedicineGoods.MaterialCode;
                        materialCode = firstDetail.MedicineGoods.MaterielErpType;
                    }
                    var ediDto = new ToediInInfo
@@ -599,9 +737,9 @@
                            //产品
                            productCode = d.Goods_no,
                            //sku名称
                            productName = d.MedicineGoods?.Goods_spm,
                            productName = d.MedicineGoods?.MaterielName,
                            //sku规格
                            productSpecifications = d.MedicineGoods?.Model,
                            productSpecifications = d.MedicineGoods?.MaterielSpec,
                            //数量
                            quantity = (int)d.Order_qty,
                            //效期