dengjunjie
2025-10-23 56827df8730c172c6c654fb78fed073ef8d694cb
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs
@@ -55,17 +55,308 @@
        /// </summary>
        /// <param name = "searchDate" ></ param >
        /// < returns ></ returns >
        //public WebResponseContent GetUpstreamOutOrder()
        //{
        //    var responseContent = new WebResponseContent();
        //    try
        //    {
        //        var url = "http://121.37.118.63:80/GYZ2/95fck/outOrder";
        //        //var url = "http://127.0.0.1:4523/m1/5660322-5340849-default/GYZ2/95fck/outOrder";
        //        if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        //        //// è¯·æ±‚参数
        //        var requestData = new
        //        {
        //            searchDate = SearchDate
        //            //searchDate = "2022-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<UpstramOutOrderInfo>>(result);
        //        if (response.resultCode != "0")
        //        {
        //            SendErrorToUpstream(3, "", response.resultMsg ?? "上游接口返回失败", "");
        //            return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
        //        }
        //        if (response.data == null || !response.data.Any())
        //        {
        //            return responseContent.OK("无新出库单数据");
        //        }
        //        // å·²å­˜åœ¨å‡ºåº“单号
        //        var existingOutOrderNos = BaseDal.Db.Queryable<Dt_DeliveryOrder>()
        //            .Select(x => x.Out_no)
        //            .ToList();
        //        // æ–°å‡ºåº“单
        //        var newOutOrders = response.data
        //            .Where(outorder => !existingOutOrderNos.Contains(outorder.order_no))
        //            .ToList();
        //        List<string> order_no = newOutOrders.Select(x => x.order_no).ToList();
        //        if (!newOutOrders.Any())
        //        {
        //            return responseContent.OK("所有出库单已存在,无需新增");
        //        }
        //        Db.Ado.BeginTran();
        //        try
        //        {
        //            List<Dt_DeliveryOrder> _DeliveryOrders = new List<Dt_DeliveryOrder>();
        //            List<string> orderNos = new List<string>();
        //            foreach (var outorder in newOutOrders)
        //            {
        //                bool skipOrder = false; // æ ‡è®°æ˜¯å¦è·³è¿‡è¯¥å‡ºåº“单
        //                // å¦‚果这个出库单类型不等于1,属于出库退货(要入货上游传过来的数量为负数)
        //                if (outorder.order_type != "1")
        //                {
        //                    // åˆ›å»ºå‡ºåº“退货单 - è¿™é‡Œéœ€è¦æ ¹æ®ä¸šåŠ¡é€»è¾‘å®žçŽ°
        //                    // æš‚时跳过或实现退货逻辑
        //                    continue;
        //                }
        //                else if (outorder.order_type == "1") // æ­£å¸¸å‡ºåº“单
        //                {
        //                    // æŽ’除特殊药品,特殊药品直接插入
        //                    if (outorder.warehouse_no != "001" && (outorder.warehouse_no == "010" || outorder.warehouse_no == "003" || outorder.warehouse_no == "017"))
        //                    {
        //                        var entityOrder = new Dt_DeliveryOrder
        //                        {
        //                            Out_no = outorder.order_no,
        //                            Out_type = outorder.order_type,
        //                            Client_no = outorder.client_no,
        //                            Client_name = outorder.client_name,
        //                            Account_time = outorder.account_time,
        //                            Warehouse_no = outorder.warehouse_no,
        //                            OutStatus = "新建",
        //                            Details = outorder.details.Select(d => new Dt_DeliveryOrderDetail
        //                            {
        //                                Goods_no = d.goods_no,
        //                                Order_qty = Math.Abs(d.order_qty), // å‡ºåº“数量转为正数
        //                                Batch_num = d.batch_num,
        //                                Exp_date = d.exp_date,
        //                                OotDetailStatus = "新建",
        //                                Status = 2, // pad平库,无需同步
        //                            }).ToList()
        //                        };
        //                        _DeliveryOrders.Add(entityOrder);
        //                    }
        //                    else  // å¸¸è§„药品001房给立库,要是有整箱就给平库
        //                    {
        //                        var entityOrder = new Dt_DeliveryOrder
        //                        {
        //                            Out_no = outorder.order_no,
        //                            Out_type = outorder.order_type,
        //                            Client_no = outorder.client_no,
        //                            Client_name = outorder.client_name,
        //                            Account_time = outorder.account_time,
        //                            Warehouse_no = outorder.warehouse_no,
        //                            OutStatus = "新建",
        //                            Details = new List<Dt_DeliveryOrderDetail>()
        //                        };
        //                        // éåŽ†å‡ºåº“æ˜Žç»†
        //                        foreach (var item in outorder.details)
        //                        {
        //                            // å°†ä¸Šæ¸¸å‡ºåº“数量转为正数
        //                            decimal orderQty = Math.Abs((decimal)item.order_qty);
        //                            #region æ ¹æ®ç‰©æ–™ç¼–码查询物料信息
        //                            var medication = BaseDal.Db.Queryable<Dt_MaterielInfo>()
        //                                .Where(m => m.MaterielCode == item.goods_no)
        //                                .First();
        //                            // å¦‚果物料信息不存在,跳过整个出库单
        //                            if (medication == null)
        //                            {
        //                                skipOrder = true;
        //                                Console.WriteLine($"跳出处库单 {outorder.order_no},原因:未找到商品 [{item.goods_no}] çš„物料信息。");
        //                                break;
        //                            }
        //                            // è‹¥ç‰©æ–™ä¸å­˜åœ¨æˆ– MaterielSourceType ä¸ºç©ºï¼Œåˆ™è·³è¿‡æ•´ä¸ªå‡ºåº“单
        //                            if (medication == null || !Enum.IsDefined(typeof(MaterielSourceTypeEnum), medication.MaterielSourceType))
        //                            {
        //                                skipOrder = true;
        //                                break;
        //                            }
        //                            #endregion
        //                            /// æ ¹æ®ç‰©æ–™ä¿¡æ¯å¤§å°ä»¶å±žæ€§åŒºåˆ†æ˜¯å¦ä»Žç«‹åº“出库 // å¤§ä»¶ä»Žå¹³åº“出库
        //                            if (medication.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart) // å¦‚果物料是大件
        //                            {
        //                                var orderDetail = new Dt_DeliveryOrderDetail()
        //                                {
        //                                    Reservoirarea = outorder.warehouse_no,
        //                                    Goods_no = item.goods_no,
        //                                    Order_qty = orderQty,
        //                                    Batch_num = item.batch_num,
        //                                    Exp_date = item.exp_date,
        //                                    OotDetailStatus = "新建",
        //                                    Status = 2 // å¹³åº“,无需同步
        //                                };
        //                                entityOrder.Details.Add(orderDetail);
        //                            }
        //                            else
        //                            {
        //                                Dt_DeliveryOrderDetail orderDetail = null;
        //                                // è®¡ç®—整箱和散件数量
        //                                var ys = orderQty % medication.BoxQty; // ä¸èƒ½æ•´é™¤ç®±è§„的散件数
        //                                var xs = (int)(orderQty / medication.BoxQty); // æ•´ç®±æ•°é‡ï¼ˆä¿ç•™æ•´æ•°ï¼‰
        //                                #region ä»Žç«‹åº“出库散件
        //                                #region åˆ¤æ–­æ˜¯å¦æœ‰æ•£ä»¶
        //                                if (ys > 0 && medication.Business_qty >= ys)
        //                                {
        //                                    orderDetail = new Dt_DeliveryOrderDetail()
        //                                    {
        //                                        Reservoirarea = outorder.warehouse_no,
        //                                        Goods_no = item.goods_no,
        //                                        Order_qty = ys,
        //                                        Batch_num = item.batch_num,
        //                                        Exp_date = item.exp_date,
        //                                        OotDetailStatus = "新建",
        //                                        Status = 0 // ç«‹åº“,需要同步给WCS
        //                                    };
        //                                    medication.Business_qty -= ys;
        //                                }
        //                                else
        //                                {
        //                                    // ç«‹åº“库存不足,散件也从平库出
        //                                    orderDetail = new Dt_DeliveryOrderDetail()
        //                                    {
        //                                        Reservoirarea = outorder.warehouse_no,
        //                                        Goods_no = item.goods_no,
        //                                        Order_qty = ys,
        //                                        Batch_num = item.batch_num,
        //                                        Exp_date = item.exp_date,
        //                                        OotDetailStatus = "新建",
        //                                        Status = 2 // å¹³åº“
        //                                    };
        //                                }
        //                                #endregion
        //                                #region åˆ¤æ–­ç«‹åº“库存是否足够出整箱
        //                                while (medication.Business_qty >= medication.BoxQty && xs > 0)
        //                                {
        //                                    xs--;
        //                                    if (orderDetail == null)
        //                                    {
        //                                        orderDetail = new Dt_DeliveryOrderDetail()
        //                                        {
        //                                            Reservoirarea = outorder.warehouse_no,
        //                                            Goods_no = item.goods_no,
        //                                            Order_qty = medication.BoxQty,
        //                                            Batch_num = item.batch_num,
        //                                            Exp_date = item.exp_date,
        //                                            OotDetailStatus = "新建",
        //                                            Status = 0 // ç«‹åº“
        //                                        };
        //                                        medication.Business_qty -= medication.BoxQty;
        //                                    }
        //                                    else
        //                                    {
        //                                        orderDetail.Order_qty += medication.BoxQty;
        //                                        medication.Business_qty -= medication.BoxQty;
        //                                    }
        //                                }
        //                                if (orderDetail != null)
        //                                    entityOrder.Details.Add(orderDetail);
        //                                #endregion
        //                                #endregion
        //                                #region å‰©ä½™æ•´ä»¶ä»Žå¹³åº“出库
        //                                if (xs > 0)
        //                                {
        //                                    orderDetail = new Dt_DeliveryOrderDetail()
        //                                    {
        //                                        Reservoirarea = outorder.warehouse_no,
        //                                        Goods_no = item.goods_no,
        //                                        Order_qty = medication.BoxQty * xs,
        //                                        Batch_num = item.batch_num,
        //                                        Exp_date = item.exp_date,
        //                                        OotDetailStatus = "新建",
        //                                        Status = 2 // å¹³åº“
        //                                    };
        //                                    entityOrder.Details.Add(orderDetail);
        //                                }
        //                                #endregion
        //                            }
        //                            // æ›´æ–°ç‰©æ–™ä¿¡æ¯
        //                            _basicService.MaterielInfoService.Repository.UpdateData(medication);
        //                        }
        //                        // å¦‚果跳过该单,则直接continue,不保存
        //                        if (skipOrder)
        //                        {
        //                            Console.WriteLine($"跳出处库单 {outorder.order_no},因为存在未定义物料属性的商品。");
        //                            continue;
        //                        }
        //                        // ç¡®ä¿å‡ºåº“单有明细才添加
        //                        if (entityOrder.Details.Any())
        //                        {
        //                            _DeliveryOrders.Add(entityOrder);
        //                            orderNos.Add(outorder.order_no);
        //                        }
        //                    }
        //                }
        //            }
        //            // æ‰¹é‡æ’入出库单和明细
        //            if (_DeliveryOrders.Any())
        //            {
        //                BaseDal.Db.InsertNav(_DeliveryOrders).Include(x => x.Details).ExecuteCommand();
        //            }
        //            Db.Ado.CommitTran();
        //           var  tex=  CreateSupplyTask(order_no);
        //            if (!tex)
        //            {
        //                return responseContent.Error("创建供应任务失败");
        //            }
        //            return responseContent.OK($"同步出库单成功,共{_DeliveryOrders.Count}条");
        //        }
        //        catch (Exception ex)
        //        {
        //            Db.Ado.RollbackTran();
        //            SendErrorToUpstream(3, "", ex.Message, "");
        //            return responseContent.Error("同步失败: " + ex.Message);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        SendErrorToUpstream(3, "", ex.Message, "");
        //        return responseContent.Error("同步失败: " + ex.Message);
        //    }
        //}
        public WebResponseContent GetUpstreamOutOrder()
        {
            var responseContent = new WebResponseContent();
            try
            {
                //var url = "http://121.37.118.63:80/GYZ2/95fck/outOrder";
                var url = "http://127.0.0.1:4523/m1/5660322-5340849-default/GYZ2/95fck/outOrder";
                var url = "http://121.37.118.63:80/GYZ2/95fck/outOrder";
                //var url = "http://127.0.0.1:4523/m1/5660322-5340849-default/GYZ2/95fck/outOrder";
                if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = "2022-10-10 20:45:16"
                    searchDate = SearchDate
                    //searchDate = "2022-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<UpstramOutOrderInfo>>(result);
@@ -118,7 +409,7 @@
                        else if (outorder.order_type == "1") // æ­£å¸¸å‡ºåº“单
                        {
                            // æŽ’除特殊药品,特殊药品直接插入
                            if (outorder.warehouse_no != "001" && outorder.warehouse_no != "大件平库")
                            if (outorder.warehouse_no != "001" && (outorder.warehouse_no == "010" || outorder.warehouse_no == "003" || outorder.warehouse_no == "017"))
                            {
                                var entityOrder = new Dt_DeliveryOrder
                                {
@@ -202,7 +493,7 @@
                                        Dt_DeliveryOrderDetail orderDetail = null;
                                        // è®¡ç®—整箱和散件数量
                                        var ys = orderQty % medication.BoxQty; // ä¸èƒ½æ•´é™¤ç®±è§„的散件数
                                        var ys = orderQty % medication.BoxQty; // ä¸èƒ½æ•´é™¤ç®±è§„的散件数
                                        var xs = (int)(orderQty / medication.BoxQty); // æ•´ç®±æ•°é‡ï¼ˆä¿ç•™æ•´æ•°ï¼‰
                                        #region ä»Žç«‹åº“出库散件
@@ -221,20 +512,6 @@
                                                Status = 0 // ç«‹åº“,需要同步给WCS
                                            };
                                            medication.Business_qty -= ys;
                                        }
                                        else
                                        {
                                            // ç«‹åº“库存不足,散件也从平库出
                                            orderDetail = new Dt_DeliveryOrderDetail()
                                            {
                                                Reservoirarea = outorder.warehouse_no,
                                                Goods_no = item.goods_no,
                                                Order_qty = ys,
                                                Batch_num = item.batch_num,
                                                Exp_date = item.exp_date,
                                                OotDetailStatus = "新建",
                                                Status = 2 // å¹³åº“
                                            };
                                        }
                                        #endregion
@@ -314,9 +591,11 @@
                    {
                        BaseDal.Db.InsertNav(_DeliveryOrders).Include(x => x.Details).ExecuteCommand();
                    }
                    //下发出库单任务给wcs
                    Db.Ado.CommitTran();
                   var  tex=  CreateSupplyTask(order_no);
                    var tex = CreateSupplyTask(order_no);
                    if (!tex)
                    {
                        return responseContent.Error("创建供应任务失败");
@@ -339,52 +618,10 @@
        /// <summary>
        /// åˆ›å»ºä¾›åº”任务
        /// ç”Ÿæˆå‡ºåº“单任务
        /// </summary>
        /// <param name="outorder">出库单信息</param>
        /// <param name="item">出库明细项</param>
        /// <param name="medication">物料信息</param>
        /// <param name="quantity">任务数量</param>
        /// <param name="taskType">任务类型(0:出库,1:入库,2:盘点等)</param>
        /// <param name="remark">备注</param>
        /// <returns>任务对象</returns>
        //private bool CreateSupplyTask(List<string> order_no)
        //{
        //    // å…ˆèŽ·å–ç¬¦åˆæ¡ä»¶çš„ä¸»è¡¨ID
        //    var mainOrderIds = BaseDal.Db.Queryable<Dt_DeliveryOrder>()
        //        .Where(x => order_no.Contains(x.Out_no))
        //        .Select(x => x.Id)
        //        .ToList();
        //    // ç›´æŽ¥æŸ¥è¯¢å­è¡¨æ•°æ®
        //    List<Dt_DeliveryOrderDetail> filteredDetails = BaseDal.Db.Queryable<Dt_DeliveryOrderDetail>()
        //        .Where(d => mainOrderIds.Contains(d.DeliveryOrderId) && d.OotDetailStatus == "新建")
        //        .ToList();
        //    foreach (var item in filteredDetails)
        //    {
        //        new Dt_SupplyTask
        //        {
        //            TaskNum = GetNextTaskNum(), // éœ€è¦å®žçŽ°èŽ·å–ä¸‹ä¸€ä¸ªä»»åŠ¡ç¼–å·çš„æ–¹æ³•
        //            PalletCode = null, // æ ¹æ®ä¸šåŠ¡é€»è¾‘è®¾ç½®æ‰˜ç›˜ç¼–å·
        //            BatchNo = item.Batch_num,
        //            MaterielCode = item.Goods_no,
        //            MaterielName = medication?.MaterielName, // ä»Žç‰©æ–™ä¿¡æ¯èŽ·å–
        //            MaterielSpec = medication?.MaterielSpec, // ä»Žç‰©æ–™ä¿¡æ¯èŽ·å–
        //            TaskType = 0, // 0-出库任务
        //            TaskStatus = item.Status ==0 ? 0:1, // 0-新建
        //            WarehouseCode = outorder.warehouse_no,
        //            LocationCode = "立库", // ç«‹åº“任务的货位编号固定为"立库"
        //            StockQuantity = quantity,
        //            SupplyQuantity = 0, // åˆå§‹ç›˜ç‚¹æ•°ä¸º0
        //            OrderNo = outorder.order_no, // å…³è”出库单号
        //            Dispatchertime = DateTime.Now,
        //            Remark = remark
        //        };
        //    }
        //}
        /// <param name="order_no">出库单号</param>
        /// <returns></returns>
        private bool CreateSupplyTask(List<string> order_no)
        {
            try
@@ -423,6 +660,13 @@
                    if (mainOrder == null) continue;
                    var location = Db.Queryable<Dt_InventoryInfo>()
                    .Where(x => x.MaterielCode == ""//materielCode
                             && x.BatchNo == ""//batchNo
                             && x.StockQuantity > 0)
                    .OrderBy(x => x.InDate) // æŒ‰å…¥åº“时间排序
                    .First();
                    var supplyTask = new Dt_SupplyTask
                    {
@@ -479,56 +723,6 @@
            return randomNum;
        }
        /// <summary>
        /// åˆ›å»ºä¾›åº”任务
        /// </summary>
        /// <param name="outorder">出库单信息</param>
        /// <param name="item">出库明细项</param>
        /// <param name="medication">物料信息</param>
        /// <param name="quantity">任务数量</param>
        /// <param name="taskType">任务类型(0:出库,1:入库,2:盘点等)</param>
        /// <param name="remark">备注</param>
        /// <returns>任务对象</returns>
        //private Dt_SupplyTask CreateSupplyTask(UpstramOutOrderInfo outorder, dynamic item, Dt_MaterielInfo medication, decimal quantity, int taskType, string remark)
        //{
        //    return new Dt_SupplyTask
        //    {
        //        TaskNum = GetNextTaskNum(), // éœ€è¦å®žçŽ°èŽ·å–ä¸‹ä¸€ä¸ªä»»åŠ¡ç¼–å·çš„æ–¹æ³•
        //        PalletCode = null, // æ ¹æ®ä¸šåŠ¡é€»è¾‘è®¾ç½®æ‰˜ç›˜ç¼–å·
        //        BatchNo = item.batch_num,
        //        MaterielCode = item.goods_no,
        //        MaterielName = medication?.MaterielName, // ä»Žç‰©æ–™ä¿¡æ¯èŽ·å–
        //        MaterielSpec = medication?.MaterielSpec, // ä»Žç‰©æ–™ä¿¡æ¯èŽ·å–
        //        TaskType = taskType, // 0-出库任务
        //        TaskStatus = 0, // 0-新建
        //        WarehouseCode = outorder.warehouse_no,
        //        LocationCode = "立库", // ç«‹åº“任务的货位编号固定为"立库"
        //        StockQuantity = quantity,
        //        SupplyQuantity = 0, // åˆå§‹ç›˜ç‚¹æ•°ä¸º0
        //        OrderNo = outorder.order_no, // å…³è”出库单号
        //        Dispatchertime = DateTime.Now,
        //        Remark = remark
        //    };
        //}
        /// <summary>
        /// èŽ·å–ä¸‹ä¸€ä¸ªä»»åŠ¡ç¼–å·
        /// </summary>
        /// <returns>任务编号</returns>
        private int GetNextTaskNum()
        {
            // è¿™é‡Œéœ€è¦æ ¹æ®æ‚¨çš„序列生成逻辑来实现
            // å‡è®¾ä½¿ç”¨æ•°æ®åº“序列
            return BaseDal.Db.Ado.GetInt("SELECT NEXT VALUE FOR SeqTaskNum");
            // æˆ–者如果是自增ID,可以插入后获取
        }
        /// <summary>
        /// å‡ºåº“单推送给 WCS
@@ -575,7 +769,7 @@
                            customerCode = "905",
                            materialCode = materialCode,
                            externalOrderNo = order.Out_no,
                            outOrderType = order.Out_type == "1" ? "10" : order.Out_type == "2" ? "20" : "30",
                            outOrderType = order.Out_type == "1" ? "10" : order.Out_type == "3" ? "20" : "30",//出库单类型是1就是正常的,3就是盘点
                            priority = 1,
                            Is_cancel = 0,
                            details = order.Details.Select(d => new TowcsDto.ToeOutdiInDetail
@@ -595,8 +789,8 @@
                        };
                        // 4. è°ƒç”¨æŽ¥å£
                        //var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                        var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363076920";
                        var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                        //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363076920";
                        var result = HttpHelper.Post(url, ediDto.ToJsonString());
                        var resp = JsonConvert.DeserializeObject<TowcsDto.TowcsResponse<object>>(result);
@@ -611,7 +805,7 @@
                            // æ›´æ–°æ˜Žç»†çŠ¶æ€
                            BaseDal.Db.Updateable<Dt_DeliveryOrderDetail>()
                              .SetColumns(d => new Dt_DeliveryOrderDetail { Status = 1, OotDetailStatus = "已完成" })
                              .SetColumns(d => new Dt_DeliveryOrderDetail { Status = 1, OotDetailStatus = "开始" })
                              .Where(d => d.DeliveryOrderId == order.Id && d.Status == 0)
                              .ExecuteCommand();
                            Console.WriteLine($"订单 {order.Out_no} æŽ¨é€æˆåŠŸ");