1
yanjinhui
2025-09-29 18ef8c37e6290ba6f47cbd5bbd26e56a682d767e
´úÂë¹ÜÀí/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/DeliveryOrderServices.cs
@@ -14,6 +14,8 @@
using WIDESEA_Model.Models;
using WIDESEA_SquareCabinRepository;
using static WIDESEA_DTO.SquareCabin.OrderDto;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
namespace WIDESEA_SquareCabinServices
{
@@ -23,90 +25,191 @@
        {
        }
        static string SearchDate = "";
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸å‡ºåº“å• 0成功1失败
        /// </summary>
        /// <param name="searchDate"></param>
        /// <returns></returns>
        public WebResponseContent GetUpstreamOutOrder(DateTime searchDate)
        public WebResponseContent GetUpstreamOutOrder()
        {
            var responseContent = new WebResponseContent();
            try
            {
                //请求地址
                var url = "http:/127.0.0.1:9000/GYZ2/95fck/outOrder";
                //请求参数
                var requestDate = new
                {
                    searchDate = searchDate.ToString("yyyy-MM-dd:mm:ss")
                };
                // è¯·æ±‚地址
                var url = "http://127.0.0.1:9000/GYZ2/95fck/outOrder";
                //发起请求
                var reslu = HttpHelper.Post(url, requestDate.ToJsonString());
                //反序列化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstramOutOrderInfo>>(reslu);
                if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = SearchDate
                };
                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(1, "", response.resultMsg ?? "上游接口返回失败", "");
                    SendErrorToUpstream(3, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
                if (response.data == null || !response.data.Any())
                {
                    return responseContent.OK("无新入库单数据");
                    return responseContent.OK("无新出库单数据");
                }
                //开启事务
                Db.Ado.BeginTran();
                foreach (var outorder in response.data)
                {
                    try
                    {
                        //插入出库单
                        var OutOders = new Dt_DeliveryOrder
                        // æ’入出库单
                        var entityOrder = new Dt_DeliveryOrder
                        {
                            Out_no = outorder.out_no,
                            Out_type = outorder.out_type,
                            Client_no=outorder.client_no,
                            Client_no = outorder.client_no,
                            Account_time = outorder.account_time,
                            OutStatus= "未完成",
                        };
                        var outorderId = Db.Insertable(outorder).ExecuteReturnIdentity();//返回主键id
                        var outorderId = Db.Insertable(entityOrder).ExecuteReturnIdentity();
                        //插入出库单明细
                        var OutOrderDetails = outorder.details.Select(d => new Dt_DeliveryOrderDetail
                        // æ’入出库单明细
                        var detailEntities = outorder.details.Select(d => new Dt_DeliveryOrderDetail
                        {
                            DeliveryOrderId = outorderId,
                            Goods_no = d.goods_no,
                            Order_qty = d.out_qty,
                            Batch_num = d.batch_num,
                            Exp_date = d.exp_date
                            Exp_date = d.exp_date,
                            OotDetailStatus="新建"
                        }).ToList();
                        Db.Insertable(OutOrderDetails).ExecuteCommand();
                        Db.Insertable(detailEntities).ExecuteCommand();
                    }
                    catch (Exception ex)
                    {
                        // é’ˆå¯¹æŸæ¡è®¢å•报错时,推送异常给上游
                        SendErrorToUpstream(3, outorder.out_no, ex.Message, "");
                        throw; // æŠ›å‡ºå¼‚常,让外层捕获回滚
                        throw; // è®©å¤–层捕获并回滚
                    }
                }
                Db.Ado.CommitTran();
                return responseContent.OK("同步入库单成功");
                return responseContent.OK("同步出库单成功");
            }
            catch (Exception ex)
            {
                // å…¨å±€å¼‚常时,也推送异常给上游
                SendErrorToUpstream(3, "", ex.Message, "");
                Db.Ado.RollbackTran();
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
        /// <summary>
        /// å‡ºåº“单推送给 WCS
        /// </summary>
        /// <returns></returns>
        public WebResponseContent EdiOut()
        {
            var responseContent = new WebResponseContent();
            try
            {
                // 1. æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„订单(表头=新建 && åŒ…含有效明细)
                var outOrders = Db.Queryable<Dt_DeliveryOrder>()
                    .Where(o => o.OutStatus == "新建")
                    .Includes(o => o.Details, d => d.MedicineGoods)
                    .ToList();
                // 2. å†è¿‡æ»¤æŽ‰ä¸ç¬¦åˆæ¡ä»¶çš„æ˜Žç»†ï¼ˆåªä¿ç•™ Status=0 ï¼‰
                foreach (var order in outOrders)
                {
                    order.Details = order.Details.Where(d => d.Status == 0).ToList();
                }
                if (outOrders == null || !outOrders.Any())
                {
                    Console.WriteLine("没有符合条件的订单需要推送");
                    return responseContent.Error("没有符合条件的订单需要推送");
                }
                foreach (var order in outOrders)
                {
                    try
                    {
                        // 3. ç»„装 DTO
                        var ediDto = new TowcsDto.ToediOutInfo
                        {
                            customerCode = "905",
                            materialCode = "YY",
                            externalOrderNo = order.Out_no,
                            outOrderType = order.Out_type == "1" ? "10" : order.Out_type == "2" ? "20" : "30",
                            priority = 1,
                            Is_cancel = 0,
                            details = order.Details.Select(d => new TowcsDto.ToeOutdiInDetail
                            {
                                batchNo = d.Batch_num,
                                productCode = d.Goods_no,
                                productName = d.MedicineGoods?.Goods_spm,
                                productSpecifications = d.MedicineGoods?.Model,
                                quantity = (int)d.Order_qty,
                                //stocktakingDetails = order.Out_type == "3"
                                //    ? new List<ToOutediInStock>
                                //      {
                                //  new ToOutediInStock { palletCode = "FC00001", quantity = d.Order_qty.ToString() }
                                //      }
                                //    : null
                            }).ToList()
                        };
                        // 4. è°ƒç”¨æŽ¥å£
                        var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                        var result = HttpHelper.Post(url, ediDto.ToJsonString());
                        var resp = JsonConvert.DeserializeObject<TowcsDto.TowcsResponse<object>>(result);
                        if (resp != null && resp.code == "0")
                        {
                            // æ›´æ–°è¡¨å¤´çŠ¶æ€
                            Db.Updateable<Dt_DeliveryOrder>()
                              .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "开始" })
                              .Where(o => o.Id == order.Id)
                              .ExecuteCommand();
                            // æ›´æ–°æ˜Žç»†çŠ¶æ€
                            Db.Updateable<Dt_DeliveryOrderDetail>()
                              .SetColumns(d => new Dt_DeliveryOrderDetail { Status = 1,OotDetailStatus="已完成" })
                              .Where(d => d.DeliveryOrderId == order.Id && d.Status == 0)
                              .ExecuteCommand();
                            Console.WriteLine($"订单 {order.Out_no} æŽ¨é€æˆåŠŸ");
                        }
                        else
                        {
                            SendErrorToUpstream(3, order.Out_no, resp?.msg ?? "WCS æŽ¨é€å¤±è´¥", "");
                            Console.WriteLine($"订单 {order.Out_no} æŽ¨é€å¤±è´¥ï¼š{resp?.msg}");
                        }
                        //删除全部状为已完成的明细和表头,移入历史表
                    }
                    catch (Exception ex)
                    {
                        SendErrorToUpstream(3, order.Out_no, ex.Message, "");
                        Console.WriteLine($"订单 {order.Out_no} æŽ¨é€å¼‚常:{ex.Message}");
                    }
                }
                return responseContent.OK("出库订单推送完成");
            }
            catch (Exception ex)
            {
                Console.WriteLine("EdiOut å¼‚常:" + ex.Message);
                return responseContent.Error("出库订单推送失败:" + ex.Message);
            }
        }
@@ -133,6 +236,23 @@
                    SendErrorToUpstream(4, "", "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
                //先查头表
                var outOerd=Db.Queryable<Dt_DeliveryOrder>()
                    .Where(o => o.Out_no == out_no)
                    .First();
                if (outOerd == null)
                {
                    return responseContent.Error($"没有找到该出库单号{out_no}");
                }
                //查找所有明细表是否都已完成
                var incompleteDetails = Db.Queryable<Dt_DeliveryOrderDetail>()
                    .Where(d => d.DeliveryOrderId == outOerd.Id && d.OotDetailStatus == "已完成")
                    .ToList();
                // æ›´æ–°å‡ºåº“单状态
                Db.Updateable<Dt_DeliveryOrder>()
                  .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "已完成" })
                  .Where(o => o.Out_no == out_no)
                  .ExecuteCommand();
                return responseContent.OK("操作成功");
            }
@@ -170,5 +290,7 @@
                Console.WriteLine("异常接口推送失败:" + e.Message);
            }
        }
    }
}