1
yanjinhui
2025-09-29 18ef8c37e6290ba6f47cbd5bbd26e56a682d767e
´úÂë¹ÜÀí/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/CabinOrderServices.cs
@@ -6,15 +6,18 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.FangCang;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.SquareCabin;
using WIDESEA_ISquareCabinRepository;
using WIDESEA_ISquareCabinServices;
using WIDESEA_Model.Models;
using WIDESEA_SquareCabinRepository;
using static System.Net.WebRequestMethods;
using static WIDESEA_DTO.SquareCabin.OrderDto;
using static WIDESEA_DTO.SquareCabin.TowcsDto;
namespace WIDESEA_SquareCabinServices
{
@@ -23,13 +26,109 @@
        public CabinOrderServices(ICabinOrderRepository BaseDal) : base(BaseDal)
        {
        }
        static string SearchDate = "";
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸ç³»ç»Ÿçš„å…¥åº“å•
        /// </summary>
        /// <param name="searchDate"></param>
        /// <returns></returns>
        public WebResponseContent GetUpstreamOrder(DateTime searchDate)
        //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 GetUpstreamOrder()
        {
            var responseContent = new WebResponseContent();
@@ -37,17 +136,16 @@
            {
                // è¯·æ±‚地址
                var url = "http://127.0.0.1:9090/GYZ2/95fck/inOrder";
                // è¯·æ±‚参数
                if (string.IsNullOrEmpty(SearchDate)) SearchDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = searchDate.ToString("yyyy-MM-dd HH:mm:ss")
                    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<UpstreamOrderInfo>>(result);
@@ -64,56 +162,189 @@
                }
                Db.Ado.BeginTran();
                foreach (var order in response.data)
                try
                {
                    try
                    List<Dt_CabinOrder> _CabinOrders = new List<Dt_CabinOrder>();
                    //存储入库单号
                    List<string> orderNos = new List<string>();
                    foreach (var order in response.data)
                    {
                        // æ’入入库单表
                        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,
                            Account_tiem = order.account_time,
                            OdrderStatus = "新建",
                            Details = order.details.Select(d => new Dt_CabinOrderDetail
                            {
                                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,
                                OrderDetailStatus="新建",
                                Status = d.warehouse_no== "001" ? 0 : 2, //如果是001房那么就是未同步状态,如果不是001房那么就是无需同步状态
                            }).ToList()
                        };
                        _CabinOrders.Add(entityOrder);
                        orderNos.Add(order.order_no);
                    };
                    BaseDal.Db.InsertNav(_CabinOrders).Include(x => x.Details).ExecuteCommand();
                        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();
                        Db.Insertable(detailEntities).ExecuteCommand();
                    }
                    catch (Exception innerEx)
                    //在下发给wcs
                  var reslut=  EdiIn(); //发给下游
                                        //如果这个方法成功了,那么就调用CompleteOrder接口,然后改变
                    if (reslut.Status==true)
                    {
                        // é’ˆå¯¹æŸæ¡è®¢å•报错时,推送异常给上游
                        SendErrorToUpstream(1, order.order_no, innerEx.Message, "");
                        throw; // æŠ›å‡ºå¼‚常,让外层捕获回滚
                        //如果EdiIn完成那么就调用CompleteOrder接口,将状态改为UpOrderStatus == "已完成
                        foreach (var no in orderNos)
                        {
                            //CompleteOrder(no); // ä½¿ç”¨æ”¶é›†çš„单号
                            //Db.Updateable<Dt_CabinOrder>()
                            //  .SetColumns(o => o.UpOrderStatus == "已完成") // æ›´æ–°ä¸Šæ¸¸çŠ¶æ€
                            //  .Where(o => o.Order_no == no && o.OdrderStatus == "已完成")
                            //  .ExecuteCommand();
                        }
                    }
                    Db.Ado.CommitTran();
                    return responseContent.OK("同步入库单成功");
                }
                Db.Ado.CommitTran();
                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, "");
                Db.Ado.RollbackTran();
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
        /// <summary>
        /// ä¼ ç»™wcs
        /// </summary>
        public WebResponseContent EdiIn()
        {
            try
            {
                // 1. å…ˆæ‰¾å‡ºè‡³å°‘有一条符合条件的明细对应的订单ID
                //var validOrderIds = Db.Queryable<Dt_CabinOrderDetail>()
                //    .Where(d => d.Status == 0 || d.Status == 2)
                //    .Select(d => d.OrderId)
                //    .Distinct()
                //    .ToList();
                // 2. æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„订单(表头=新建 && åŒ…含有效明细)
                var orders = BaseDal.Db.Queryable<Dt_CabinOrder>()
                    .Where(o => o.OdrderStatus == "新建")
                    .Includes(o => o.Details, d => d.MedicineGoods)
                    .ToList();
                // 3. å†è¿‡æ»¤æŽ‰ä¸ç¬¦åˆæ¡ä»¶çš„æ˜Žç»†ï¼ˆåªä¿ç•™ Status=0)
                foreach (var order in orders)
                {
                    order.Details = order.Details.Where(d => d.Status == 0).ToList();
                }
                if (orders == null || !orders.Any())
                {
                    Console.WriteLine("没有符合条件的订单需要推送");
                    return WebResponseContent.Instance.Error("没有符合条件的订单需要推送");
                }
                // 4. éåŽ†è®¢å•ï¼Œç»„è£… DTO å¹¶æŽ¨é€
                foreach (var order in orders)
                {
                    var ediDto = new ToediInInfo
                    {
                        //客户代码
                        customerCode = "905",
                        //物料类型
                        materialCode = "YY",
                        //入库单号
                        externalOrderNo = order.Order_no,
                        //入库单类型
                        inOrderType = order.Order_type == "1" ? "10" : "20",
                        //优先级
                        priority = 0,
                        //是否取消
                        Is_cancel = 0,
                        details = order.Details.Select(d => new ToediInDetail
                        {
                            //批号
                            batchNo = d.Batch_num,
                            //产品
                            productCode = d.Goods_no,
                            //sku名称
                            productName = d.MedicineGoods?.Goods_spm,
                            //sku规格
                            productSpecifications = d.MedicineGoods?.Model,
                            //数量
                            quantity = (int)d.Order_qty,
                            //效期
                            validityPeriod = d.Exp_date,
                            //生产厂家
                            manufacturer = d.MedicineGoods?.Factory,
                            //房号
                            libraryNo = d.Warehouse_no,
                            //盘盈入库
                            //stocktakingDetails = new List<ToediInStock>()
                            //stocktakingDetails = new List<ToediInStock>()
                            //{
                            //    new ToediInStock
                            //    {
                            //         //料箱号
                            //        palletCode = "PDA001",
                            //        //数量
                            //        quantity = d.Order_qty.ToString()
                            //    }
                            // }
                        }).ToList()
                    };
                    var url = "http://172.16.1.2:9357/file-admin/api/in/ediIn";
                    var result = HttpHelper.Post(url, ediDto.ToJsonString());
                    var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
                    if (resp != null && resp.code == "0")
                    {
                        // æ›´æ–°è¡¨å¤´çŠ¶æ€
                        Db.Updateable<Dt_CabinOrder>()
                          .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" })
                          .Where(o => o.Id == order.Id)
                          .ExecuteCommand();
                        // æ›´æ–°æ˜Žç»†çŠ¶æ€ä¸ºå·²åŒæ­¥
                        Db.Updateable<Dt_CabinOrderDetail>()
                          .SetColumns(d => new Dt_CabinOrderDetail { Status = 1, OrderDetailStatus = "已完成" })
                          .Where(d => d.OrderId == order.Id && d.Status == 0)
                          .ExecuteCommand();
                        Console.WriteLine($"订单 {order.Order_no} æŽ¨é€æˆåŠŸ");
                    }
                    else
                    {
                        SendErrorToUpstream(3, order.Order_no, resp?.msg ?? "WCS æŽ¨é€å¤±è´¥", "");
                        Console.WriteLine($"订单 {order.Order_no} æŽ¨é€å¤±è´¥ï¼š{resp?.msg}");
                        return new WebResponseContent { Status = false, Message = "订单推送失败" };
                    }
                }
                return new WebResponseContent { Status = true, Message = "推送成功" };
            }
            catch (Exception ex)
            {
                Console.WriteLine("EdiIn å¼‚常:" + ex.Message);
                return new WebResponseContent { Status = false, Message = ex.Message };
            }
        }
        /// <summary>
        /// å…¥åº“报完成接口
@@ -129,24 +360,54 @@
                {
                    return responseContent.Error("入库单号不可以为空");
                }
                var url = " http://127.0.0.1:9090/GYZ2/95fck/inOrderOk";
                var reslut=HttpHelper.Post(url, new {order_no }.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(reslut);
                var url = "http://127.0.0.1:9090/GYZ2/95fck/inOrderOk";
                var result = HttpHelper.Post(url, new { order_no }.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamOrderResponse>(result);
                if (response.resultCode != "0")
                {
                    SendErrorToUpstream(2, "", "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
               return  responseContent.OK("操作成功");
                // å…ˆæŸ¥è¡¨å¤´
                var order = Db.Queryable<Dt_CabinOrder>()
                              .First(o => o.Order_no == order_no);
                if (order == null)
                {
                    return responseContent.Error($"未找到入库单号: {order_no}");
                }
                // æŸ¥è¯¢æ‰€æœ‰æ˜Žç»†æ˜¯å¦éƒ½å·²å®Œæˆ
                var allDetailsCompleted = Db.Queryable<Dt_CabinOrderDetail>()
                    .Where(d => d.OrderId == order.Id&&d.OrderDetailStatus=="已完成")  // æ˜Žç»†è¡¨ç”¨ OrderId å…³è”主表
                     .Count();
                if (allDetailsCompleted>0)
                {
                    // æ›´æ–°è¡¨å¤´çŠ¶æ€ä¸ºå·²å®Œæˆ
                    Db.Updateable<Dt_CabinOrder>()
                      .SetColumns(o => o.OdrderStatus == "已完成")
                      .Where(o => o.Order_no == order_no)
                      .ExecuteCommand();
                    return responseContent.OK("操作成功,入库单及明细全部完成");
                }
                else
                {
                    return responseContent.OK("操作成功,但仍有未完成的明细");
                }
                //删除全部状为已完成的明细和表头,移入历史表
            }
            catch (Exception ex)
            {
                SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
        /// <summary>
        /// æŽ¨é€å¼‚常信息给上游系统1.入库单接口;2.入库单报完成接口;3.出库单接口;4.出库报完成接口;5.药品基础信息同步接口;6.供应商信息接口;7.客户信息接口;8.库存
@@ -179,5 +440,6 @@
      
    }
}