dengjunjie
3 天以前 8efaf9f620920921bbaa6440ea34063c89f53d7a
н¨Îļþ¼Ð/WIDESEA_WMSServer/WIDESEA_SquareCabinServices/Business.cs
@@ -41,259 +41,6 @@
            _materielInfoService = materielInfoService;
            _messageInfoService = messageInfoService;
        }
        #region èŽ·å–ERP入库单
        static string SearchInDate = "2025-10-30 00:00:00";
        /// <summary>
        /// èŽ·å–ä¸Šæ¸¸ç³»ç»Ÿçš„å…¥åº“å•
        /// </summary>
        /// <param name="SearchInDate"></param>
        /// <returns></returns>
        public WebResponseContent GetUpstreamOrder()
        {
            var responseContent = new WebResponseContent();
            try
            {
                // è¯·æ±‚地址
                var url = "http://121.37.118.63:80/GYZ2/95fck/inOrder";
                //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363009261";
                if (string.IsNullOrEmpty(SearchInDate)) SearchInDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = SearchInDate
                    //searchDate = "2022-10-10 20:45:16"  // æ­£ç¡®çš„æ ¼å¼
                };
                SearchInDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                // å‘起请求
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                // ååºåˆ—化
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstreamOrderInfo>>(result);
                if (response == null || response.resultCode != "0")
                {
                    // è°ƒç”¨å¼‚常接口
                    //SendErrorToUpstream(1, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response.resultMsg ?? "上游接口返回失败");
                }
                if (response.data == null || !response.data.Any())
                {
                    return responseContent.OK("无新入库单数据");
                }
                var ordernos = response.data.Select(x => x.order_no).ToList();
                // èŽ·å–æ‰€æœ‰å·²å­˜åœ¨çš„å…¥åº“å•å·
                var existingOrderNos = _cabinOrderServices.Db.CopyNew().Queryable<Dt_CabinOrder>()
                    .Where(x => ordernos.Contains(x.Order_no))
                    .Select(x => x.Order_no)
                    .Distinct().ToList();
                // è¿‡æ»¤æŽ‰å·²å­˜åœ¨çš„入库单
                var newOrders = response.data
                    .Where(order => !existingOrderNos.Contains(order.order_no))
                    .ToList();
                if (newOrders.Count < 1)
                {
                    return responseContent.OK("所有入库单已存在,无需新增");
                }
                //存储入库单号
                List<string> orderNos = new List<string>();
                string name = string.Empty;
                MessageGroupByEnum messageGroupBy = MessageGroupByEnum.InOrderAlarm;
                MessageStatusEnum messageStatus = MessageStatusEnum.Emergency;
                foreach (var order in newOrders)
                {
                    try
                    {
                        if (order.order_type == "1") //正常入库
                        {
                            name = "创建正常入库单";
                            responseContent = _cabinOrderServices.CreateInboundOrder(order);
                            if (!responseContent.Status) throw new Exception(responseContent.Message);
                            List<Dt_CabinOrder>? dt_CabinOrders = responseContent.Data as List<Dt_CabinOrder>;
                            if (dt_CabinOrders != null)
                                _cabinOrderServices.Db.InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
                        }
                        else if (order.order_type == "3")//入库退料
                        {
                            messageGroupBy = MessageGroupByEnum.OutOrderAlarm;
                            name = "创建入库退货单";
                            //创建出库单
                            #region è½¬æ¢ä¸ºå‡ºåº“单
                            UpstramOutOrderInfo upstramOutOrderInfo = new UpstramOutOrderInfo()
                            {
                                order_no = order.order_no,
                                order_type = order.order_type,
                                warehouse_no = order.warehouse_no,
                                details = new List<UpstreamOutOrderDetail>()
                            };
                            foreach (var item in order.details)
                            {
                                UpstreamOutOrderDetail detail = new UpstreamOutOrderDetail()
                                {
                                    batch_num = item.batch_num,
                                    goods_no = item.goods_no,
                                    order_qty = item.order_qty,
                                    exp_date = item.exp_date,
                                };
                                upstramOutOrderInfo.details.Add(detail);
                            }
                            var content = _deliveryOrderServices.CreateOutboundOrder(upstramOutOrderInfo);
                            if (!content.Status) throw new Exception(content.Message);
                            #endregion
                        }
                        else if (order.order_type == "5")//报溢入库
                        {
                            name = "创建盘盈入库单";
                            messageStatus = MessageStatusEnum.Undisposed;
                            var content = _cabinOrderServices.CreateCheckInOrder(order);
                            if (!content.Status) throw new Exception(content.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        _messageInfoService.AddMessageInfo(messageGroupBy, name, ex.Message, messageStatus);
                        //SendErrorToUpstream(1, "", ex.Message, "");
                        //return responseContent.Error("同步失败: " + ex.Message);
                    }
                };
                return responseContent.OK("同步入库单成功");
            }
            catch (Exception ex)
            {
                // å…¨å±€å¼‚常时,也推送异常给上游
                //SendErrorToUpstream(1, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
        #endregion
        #region èŽ·å–ERP出库单
        static string SearchOutDate = "2025-10-30 00:00:00";
        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(SearchOutDate)) SearchOutDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //// è¯·æ±‚参数
                var requestData = new
                {
                    searchDate = SearchOutDate
                    //searchDate = "2022-10-10 20:45:16"  // æ­£ç¡®çš„æ ¼å¼
                };
                SearchOutDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                var response = JsonConvert.DeserializeObject<UpstreamResponse<UpstramOutOrderInfo>>(result);
                if (response == null || response.resultCode != "0")
                {
                    //SendErrorToUpstream(3, "", response.resultMsg ?? "上游接口返回失败", "");
                    return responseContent.Error(response?.resultMsg ?? "上游接口返回失败");
                }
                if (response.data == null || !response.data.Any())
                {
                    return responseContent.OK("无新出库单数据");
                }
                var ordernos = response.data.Select(x => x.order_no).ToList();
                // å·²å­˜åœ¨å‡ºåº“单号
                var existingOutOrderNos = _deliveryOrderServices.Db.CopyNew().Queryable<Dt_DeliveryOrder>()
                    .Where(x => ordernos.Contains(x.Out_no))
                    .Select(x => x.Out_no)
                    .Distinct().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.Count < 1)
                {
                    return responseContent.OK("所有出库单已存在,无需新增");
                }
                List<Dt_DeliveryOrder> _DeliveryOrders = new List<Dt_DeliveryOrder>();
                List<string> orderNos = new List<string>();
                string name = string.Empty;
                MessageGroupByEnum messageGroupBy = MessageGroupByEnum.OutOrderAlarm;
                MessageStatusEnum messageStatus = MessageStatusEnum.Emergency;
                foreach (var outorder in newOutOrders)
                {
                    try
                    {
                        if (outorder.order_type == "1") // æ­£å¸¸å‡ºåº“单
                        {
                            name = "创建正常出库单";
                            var content = _deliveryOrderServices.CreateOutboundOrder(outorder);
                            if (!content.Status) throw new Exception(content.Message);
                        }
                        else if (outorder.order_type == "2")//出库退货
                        {
                            name = "创建出库退货单";
                            messageGroupBy = MessageGroupByEnum.InOrderAlarm;
                            // åˆ›å»ºå‡ºåº“退货单 - è¿™é‡Œéœ€è¦æ ¹æ®ä¸šåŠ¡é€»è¾‘å®žçŽ°
                            // æš‚时跳过或实现退货逻辑
                            //continue;
                            #region è½¬æ¢æˆå…¥åº“单
                            UpstreamOrderInfo order = new UpstreamOrderInfo()
                            {
                                order_no = outorder.order_no,
                                order_type = outorder.order_type,
                                warehouse_no = outorder.warehouse_no,
                                details = new List<UpstreamOrderDetail>()
                            };
                            foreach (var item in outorder.details)
                            {
                                UpstreamOrderDetail detail = new UpstreamOrderDetail()
                                {
                                    batch_num = item.batch_num,
                                    goods_no = item.goods_no,
                                    order_qty = item.order_qty,
                                    exp_date = item.exp_date,
                                };
                                order.details.Add(detail);
                            }
                            responseContent = _cabinOrderServices.CreateInboundOrder(order);
                            if (!responseContent.Status) throw new Exception(responseContent.Message);
                            List<Dt_CabinOrder>? dt_CabinOrders = responseContent.Data as List<Dt_CabinOrder>;
                            if (dt_CabinOrders != null && dt_CabinOrders.Count > 0)
                                _cabinOrderServices.Db.CopyNew().InsertNav(dt_CabinOrders).Include(x => x.Details).ExecuteCommand();
                            #endregion
                        }
                        else if (outorder.order_type == "6")//报损出库
                        {
                            name = "创建盘损出库单";
                            messageStatus = MessageStatusEnum.Undisposed;
                            var content = _deliveryOrderServices.CreateCheckOutOrder(outorder);
                            if (!content.Status) throw new Exception(content.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        _messageInfoService.AddMessageInfo(messageGroupBy, name, ex.Message, messageStatus);
                        //SendErrorToUpstream(3, "", ex.Message, "");
                        //return responseContent.Error("同步失败: " + ex.Message);
                    }
                }
                return responseContent.OK($"同步出库单成功,共{_DeliveryOrders.Count}条");
            }
            catch (Exception ex)
            {
                //SendErrorToUpstream(3, "", ex.Message, "");
                return responseContent.Error("同步失败: " + ex.Message);
            }
        }
        #endregion
        #region ä¸‹å‘立库入库单
        public WebResponseContent EdiIn()
@@ -372,131 +119,6 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        #region MyRegion
        //public WebResponseContent EdiIn1()
        //{
        //    try
        //    {
        //        //2.查询符合条件的订单(表头 = æ–°å»º && åŒ…含有效明细)
        //        //var orders = BaseDal.Db.Queryable<Dt_CabinOrder>()
        //        //    .Where(o => o.OdrderStatus == "新建")
        //        //    .Includes(o => o.Details, d => d.MedicineGoods)
        //        //    .ToList();
        //        //查出包含全部的入库单,包含全部明细+一个明细对应一个商品
        //        var reslut = WarehouseEnum.立库.ObjToInt().ToString("000");
        //        var orders = _cabinOrderServices.Db.CopyNew()
        //        .Queryable<Dt_CabinOrder>()
        //        .Where(o => o.OdrderStatus == "新建" && o.Warehouse_no == reslut)
        //        .Includes(o => o.Details, d => d.MedicineGoods)
        //        .ToList();
        //        // 3. å†è¿‡æ»¤æŽ‰ä¸ç¬¦åˆæ¡ä»¶çš„æ˜Žç»†ï¼ˆåªä¿ç•™ Status=0)
        //        foreach (var order in orders)
        //        {
        //            //Console.WriteLine($"订单 {order.Order_no} åŽŸæ˜Žç»†æ•°ï¼š{order.Details.Count}");
        //            order.Details = order.Details.Where(d => d.Status == 0).ToList();
        //            //Console.WriteLine($"订单 {order.Order_no} è¿‡æ»¤åŽæ˜Žç»†æ•°ï¼š{order.Details.Count}");
        //        }
        //        if (orders.Count < 1)
        //        {
        //            //Console.WriteLine("没有符合条件的订单需要推送");
        //            return WebResponseContent.Instance.Error("没有符合条件的订单需要推送");
        //        }
        //        List<Dt_CabinOrderDetail> cabinOrderDetails = new List<Dt_CabinOrderDetail>();
        //        var url = "http://172.16.1.2:9357/file-admin/api/in/ediIn";
        //        // 4. éåŽ†è®¢å•ï¼Œç»„è£… DTO å¹¶æŽ¨é€
        //        foreach (var order in orders)
        //        {
        //            // ä»Žç¬¬ä¸€ä¸ªæœ‰ MedicineGoods çš„æ˜Žç»†ä¸­å–出 MaterielErpType
        //            string materialCode = order.Details
        //                .Select(d => d.MedicineGoods?.MaterielErpType)
        //                .FirstOrDefault(x => !string.IsNullOrEmpty(x)) ?? "YY"; // é»˜è®¤å€¼YY
        //            var ediDto = new ToediInInfo
        //            {
        //                //客户代码
        //                customerCode = "905",
        //                //物料类型
        //                materialCode = materialCode,
        //                //入库单号
        //                externalOrderNo = order.Order_no,
        //                //入库单类型
        //                inOrderType = order.Order_type == "5" ? "20" : "10",
        //                //优先级
        //                priority = 0,
        //                //是否取消
        //                Is_cancel = 0,
        //                details = order.Details.Select(d => new ToediInDetail
        //                {
        //                    //批号
        //                    batchNo = d.Batch_num,
        //                    //产品
        //                    productCode = d.Goods_no,
        //                    //sku名称
        //                    productName = d.MedicineGoods?.MaterielName,
        //                    //sku规格
        //                    productSpecifications = d.MedicineGoods?.MaterielSpec,
        //                    //数量
        //                    quantity = (int)d.Order_qty,
        //                    //效期
        //                    validityPeriod = d.Exp_date,
        //                    //生产厂家
        //                    manufacturer = d.MedicineGoods?.Factory,
        //                    //房号
        //                    libraryNo = order.Warehouse_no,
        //                }).ToList()
        //            };
        //            //var url = "http://127.0.0.1:4523/m2/5660322-5340849-default/363019549";
        //            var result = HttpHelper.Post(url, ediDto.ToJsonString());
        //            var resp = JsonConvert.DeserializeObject<TowcsResponse<object>>(result);
        //            if (resp != null && resp.code == "0")
        //            {
        //                order.OdrderStatus = "开始";
        //                foreach (var item in order.Details)
        //                {
        //                    item.Status = 1;
        //                    item.OrderDetailStatus = "开始";
        //                }
        //                cabinOrderDetails.AddRange(order.Details);
        //                // æ›´æ–°è¡¨å¤´çŠ¶æ€
        //                //_cabinOrderServices.Db.Updateable<Dt_CabinOrder>()
        //                //   .SetColumns(o => new Dt_CabinOrder { OdrderStatus = "开始" })
        //                //   .Where(o => o.Id == order.Id)
        //                //   .ExecuteCommand();
        //                // æ›´æ–°æ˜Žç»†çŠ¶æ€ä¸ºå·²åŒæ­¥  //这里要是将新建--》开始状态,在后端接口返回我们的时候在返回已完成
        //                //_cabinDetailServices.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
        //            {
        //                continue;
        //                //SendErrorToUpstream(3, order.Order_no, resp?.msg ?? "WCS æŽ¨é€å¤±è´¥", "");
        //                //Console.WriteLine($"订单 {order.Order_no} æŽ¨é€å¤±è´¥ï¼š{resp?.msg}");
        //                //return new WebResponseContent { Status = false, Message = "订单推送失败" };
        //            }
        //        }
        //        _cabinOrderServices.UpdateData(orders);
        //        _cabinDetailServices.UpdateData(cabinOrderDetails);
        //        return new WebResponseContent { Status = true, Message = "推送成功" };
        //    }
        //    catch (Exception ex)
        //    {
        //        Console.WriteLine("EdiIn å¼‚常:" + ex.Message);
        //        return new WebResponseContent { Status = false, Message = ex.Message };
        //    }
        //}
        #endregion
        #endregion
        #region ä¸‹å‘立库出库单
@@ -571,133 +193,6 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        #region MyRegion
        public WebResponseContent EdiOut1()
        {
            var responseContent = new WebResponseContent();
            var WarehouseLk = WarehouseEnum.立库.ObjToInt().ToString("000");
            try
            {
                // 1. æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„订单(表头=新建 && åŒ…含有效明细)
                var outOrders = _deliveryOrderServices.Db.CopyNew().Queryable<Dt_DeliveryOrder>()
                    .Where(o => o.OutStatus == "新建" && o.Warehouse_no == WarehouseLk)
                    .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.Count < 1)
                {
                    //Console.WriteLine("没有符合条件的订单需要推送");
                    return responseContent.Error("没有符合条件的订单需要推送");
                }
                List<Dt_DeliveryOrderDetail> deliveryOrderDetails = new List<Dt_DeliveryOrderDetail>();
                var url = "http://172.16.1.2:9357/file-admin/api/out/ediOut";
                foreach (var order in outOrders)
                {
                    try
                    {
                        string materialCode = "YY";//默认值
                                                   //获取当前订单的第一个明细项
                        var firstDetail = order.Details.FirstOrDefault();
                        if (firstDetail?.MedicineGoods != null && !string.IsNullOrEmpty(firstDetail.MedicineGoods.MaterielErpType))
                        {
                            //如果条件满足,将物料代码设置为第一个明细项对应的药品物料代码
                            materialCode = firstDetail.MedicineGoods.MaterielErpType;
                        }
                        switch (order.Out_type)
                        {
                            case "1"://正常出库
                            case "3"://入库退货
                                order.Out_type = "10";//一般交易出库单
                                break;
                            case "6"://盘亏出库
                                order.Out_type = "30";//盘亏出库单
                                break;
                        }
                        // 3. ç»„装 DTO
                        var ediDto = new TowcsDto.ToediOutInfo
                        {
                            customerCode = "905",
                            materialCode = materialCode,
                            externalOrderNo = order.Out_no,
                            outOrderType = order.Out_type,//20是盘点出库单
                            priority = 1,
                            Is_cancel = 0,
                            details = order.Details.Select(d => new TowcsDto.ToeOutdiInDetail
                            {
                                batchNo = d.Batch_num,
                                productCode = d.Goods_no,
                                productName = d.MedicineGoods?.MaterielName,
                                productSpecifications = d.MedicineGoods?.MaterielModel,
                                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://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);
                        if (resp != null && resp.code == "0")
                        {
                            order.OutStatus = "开始";
                            foreach (var item in order.Details)
                            {
                                item.Status = 1;
                                item.OotDetailStatus = "开始";
                            }
                            deliveryOrderDetails.AddRange(order.Details);
                            // æ›´æ–°è¡¨å¤´çŠ¶æ€
                            //_cabinDetailServices.Db.CopyNew().Updateable<Dt_DeliveryOrder>()
                            //  .SetColumns(o => new Dt_DeliveryOrder { OutStatus = "开始" })
                            //  .Where(o => o.Id == order.Id)
                            //  .ExecuteCommand();
                            // æ›´æ–°æ˜Žç»†çŠ¶æ€
                            //_deliveryOrderDetailServices.Db.CopyNew().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
                        {
                            continue;
                            //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}");
                    }
                }
                _deliveryOrderServices.UpdateData(outOrders);
                _deliveryOrderDetailServices.UpdateData(deliveryOrderDetails);
                return responseContent.OK("出库订单推送完成");
            }
            catch (Exception ex)
            {
                //Console.WriteLine("EdiOut å¼‚常:" + ex.Message);
                return responseContent.Error("出库订单推送失败:" + ex.Message);
            }
        }
        #endregion
        #endregion
        #region å…¥åº“完成上报ERP
@@ -829,35 +324,6 @@
            catch (Exception ex)
            {
                return responseContent.Error("批量处理失败:" + ex.Message);
            }
        }
        #endregion
        #region æŽ¨é€å¼‚常上报ERP
        /// <summary>
        /// æŽ¨é€å¼‚常信息给上游系统1.入库单接口;2.入库单报完成接口;3.出库单接口;4.出库报完成接口;5.药品基础信息同步接口;6.供应商信息接口;7.客户信息接口;8.库存
        /// </summary>
        public void SendErrorToUpstream(int type, string code, string message, string remark)
        {
            try
            {
                var url = "http://121.37.118.63:80/GYZ2/95fck/lexceptionLogog";
                var requestData = new
                {
                    type = type.ToString(),
                    code = code,
                    message = message,
                    remark = remark
                };
                var result = HttpHelper.Post(url, requestData.ToJsonString());
                // å¯ä»¥ååºåˆ—化检查 resultCode æ˜¯å¦ä¸º0
            }
            catch (Exception e)
            {
                // è¿™é‡Œä¸è¦å†æŠ›å¼‚常了,避免死循环
                Console.WriteLine("异常接口推送失败:" + e.Message);
            }
        }
        #endregion