| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Core.BaseServices; | 
| using WIDESEA_Core; | 
| using WIDESEA_IInboundRepository; | 
| using WIDESEA_IInboundService; | 
| using WIDESEA_Model.Models; | 
| using WIDESEA_DTO.ERP; | 
| using WIDESEA_Core.BaseRepository; | 
| using WIDESEA_IBasicRepository; | 
| using WIDESEA_IOutboundService; | 
| using WIDESEA_Common.OrderEnum; | 
| using SqlSugar.Extensions; | 
| using WIDESEA_Common.CommonEnum; | 
|   | 
| namespace WIDESEA_InboundService | 
| { | 
|     public class ReturnOrderService : ServiceBase<Dt_ReturnOrder, IReturnOrderRepository>, IReturnOrderService | 
|     { | 
|         public IReturnOrderRepository Repository => BaseDal; | 
|         private readonly IUnitOfWorkManage _unitOfWorkManage; | 
|         private readonly IBasicRepository _basicRepository; | 
|         private readonly IOutboundService _outboundService; | 
|         private readonly IInboundRepository _inboundRepository; | 
|         public ReturnOrderService(IReturnOrderRepository BaseDal,IUnitOfWorkManage unitOfWorkManage,IBasicRepository basicRepository, | 
|         IOutboundService outboundService,IInboundRepository inboundRepository) : base(BaseDal) | 
|         { | 
|             _unitOfWorkManage = unitOfWorkManage; | 
|             _basicRepository = basicRepository; | 
|             _outboundService = outboundService; | 
|             _inboundRepository = inboundRepository; | 
|         } | 
|         /// <summary> | 
|         /// 获取退料单 | 
|         /// </summary> | 
|         /// <param name="saveModel"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent GetReturnOrders(SaveModel saveModel) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 int pageNo = saveModel.MainData["pageNo"].ObjToInt(); | 
|                 string? orderNo = saveModel.MainData["orderNo"].ToString(); | 
|                 int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); | 
|                 List<Dt_ReturnOrder> returnOrders = new List<Dt_ReturnOrder>(); | 
|                 if (string.IsNullOrEmpty(orderNo)) | 
|                 { | 
|                     returnOrders = Db.Queryable<Dt_ReturnOrder>().Where(x => x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5); | 
|                 } | 
|                 else | 
|                 { | 
|                     returnOrders = Db.Queryable<Dt_ReturnOrder>().Where(x => (x.OrderNo.Contains(orderNo)) && x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5); | 
|                 } | 
|   | 
|                 content.OK(data: returnOrders); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|         /// <summary> | 
|         /// 获取接收退料单 | 
|         /// </summary> | 
|         public WebResponseContent ReturnOrder(ErpReturnOrderDTO model) | 
|         { | 
|             try | 
|             { | 
|                 return model.Way switch | 
|                 { | 
|                     1 => AddReturnOrder(model), | 
|                     2 => UpdateReturnOrder(model), | 
|                     3 => DeleteReturnOrder(model), | 
|                     _ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{model.Way}"), | 
|                 }; | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|         /// <summary> | 
|         /// 新建退料单 | 
|         /// </summary> | 
|         public WebResponseContent AddReturnOrder(ErpReturnOrderDTO model) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 if (BaseDal.QueryFirst(x => x.OrderNo == model.OrderNo) != null)  | 
|                 { | 
|                     return content.Error($"退料单号{model.OrderNo}已存在!"); | 
|                 } | 
|                 Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.WaCode); | 
|                 if (warehouse == null) | 
|                 { | 
|                     return content.Error($"未找到仓库信息"); | 
|                 } | 
|                 List<Dt_ReturnOrderDetail> returnOrderDetails = new List<Dt_ReturnOrderDetail>(); | 
|                 foreach (var item in model.Issitem) | 
|                 { | 
|                     //判断发料单号 | 
|                     Dt_OutboundOrder outboundOrder = _outboundService.OutboundOrderService.Repository.Db.Queryable<Dt_OutboundOrder>().Where(x=>x.UpFLOrderNo==item.PickCode).Includes(x=>x.Details).First() ?? throw new Exception($"申请单号(发料单){item.PickCode}不存在"); | 
|                      | 
|                     foreach (var pickitem in item.PickList) | 
|                     { | 
|                         Dt_OutboundOrderDetail outboundOrderDetail = outboundOrder.Details.Find(x => x.MaterielCode == pickitem.MCode) ?? throw new Exception($"{item.PickCode}申请单号中物料{pickitem.MCode}不存在"); | 
|                         //获取对应出库单详情 | 
|                         Dt_OutStockLockInfo outStockLockInfo = _outboundService.OutboundStockLockInfoService.Repository.QueryFirst(x => x.OrderDetailId == outboundOrderDetail.Id); | 
|                          | 
|                         Dt_ReturnOrderDetail returnOrderDetail = new Dt_ReturnOrderDetail() | 
|                         { | 
|                             PickCode = item.PickCode, | 
|                             ApplyRow = item.ApplyRow ?? 0, | 
|                             RowId = item.RowId, | 
|                             OrderDetailStatus = ReturnOrderStatusEnum.NotReturn.ObjToInt(), | 
|                             MCode = pickitem.MCode, | 
|                             MaterielName = outboundOrderDetail.MaterielName, | 
|                             MaterielSpec = outboundOrderDetail.MaterielSpec ?? "", | 
|                             BatchNo = outStockLockInfo.BatchNo, | 
|                             Qty = pickitem.Qty, | 
|                             ReturnQty = pickitem.ReturnQty, | 
|                             OverReturnQty = 0, | 
|                             Unit = pickitem.Unit, | 
|                             Code = pickitem.Code | 
|                         }; | 
|                         returnOrderDetails.Add(returnOrderDetail); | 
|                     } | 
|                 } | 
|                 Dt_ReturnOrder returnOrder = new Dt_ReturnOrder() | 
|                 { | 
|                     OrderNo=model.OrderNo, | 
|                     WarehouseId=warehouse.WarehouseId, | 
|                     ReturnOrderType=model.OrderType, | 
|                     ReturnOrderStatus=ReturnOrderStatusEnum.NotReturn.ObjToInt(), | 
|                     UploadStatus= WhetherEnum.False.ObjToInt(), | 
|                     IsDev=model.IsDev, | 
|                     Remark=model.Note, | 
|                     Details= returnOrderDetails | 
|                 }; | 
|                 Db.InsertNav(returnOrder).Include(x => x.Details).ExecuteCommand(); | 
|   | 
|                 content.OK("成功"); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|         /// <summary> | 
|         /// 修改退料单 | 
|         /// </summary> | 
|         public WebResponseContent UpdateReturnOrder(ErpReturnOrderDTO model) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             return content; | 
|         } | 
|         /// <summary> | 
|         /// 删除退料单 | 
|         /// </summary> | 
|         public WebResponseContent DeleteReturnOrder(ErpReturnOrderDTO model) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             return content; | 
|         } | 
|         /// <summary> | 
|         /// 确认退库根据退库单生成入库单 | 
|         /// </summary> | 
|         /// <returns></returns> | 
|         public WebResponseContent IsReturnCreateInOrder(int returnId) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 Dt_ReturnOrder returnOrder = Db.Queryable<Dt_ReturnOrder>().Where(x => x.Id == returnId).Includes(x => x.Details).First(); | 
|                 if (returnOrder==null) | 
|                 { | 
|                     return content.Error("未找到退料该信息"); | 
|                 } | 
|                 if (returnOrder.Details==null || returnOrder.Details.Count<=0) | 
|                 { | 
|                     return content.Error("未找到该退料单信息"); | 
|                 } | 
|                 if (returnOrder.ReturnOrderStatus!=ReturnOrderStatusEnum.NotReturn.ObjToInt()) | 
|                 { | 
|                     return content.Error("该退料单已完成或退料中"); | 
|                 } | 
|                 //判断是否创建入库单 | 
|                 Dt_InboundOrder InboundOld = _inboundRepository.InboundOrderRepository.QueryFirst(x=>x.UpperOrderNo== returnOrder.OrderNo); | 
|                 if (InboundOld!=null) | 
|                 { | 
|                     return content.Error($"该退料单{returnOrder.OrderNo}已生成入库单号{InboundOld.InboundOrderNo}"); | 
|                 } | 
|                 List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>(); | 
|                 foreach (var item in returnOrder.Details) | 
|                 { | 
|                     Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail() | 
|                     { | 
|                         MaterielCode=item.MCode, | 
|                         BatchNo=item.BatchNo, | 
|                         OrderQuantity=item.ReturnQty, | 
|                         ReceiptQuantity=0, | 
|                         OverInQuantity=0, | 
|                         OrderDetailStatus= OrderDetailStatusEnum.New.ObjToInt(), | 
|                         Unit=item.Unit, | 
|                         RowNo=item.RowId, | 
|                         MaterielName=item.MaterielName, | 
|                         MaterielSpec=item.MaterielSpec, | 
|                     }; | 
|                     inboundOrderDetails.Add(orderDetail); | 
|                 } | 
|                 Dt_InboundOrder inboundOrder = new Dt_InboundOrder() | 
|                 { | 
|                     WarehouseId=returnOrder.WarehouseId, | 
|                     UpperOrderNo=returnOrder.OrderNo, | 
|                     SupplierId="", | 
|                     OrderType= InOrderTypeEnum.Return.ObjToInt(), | 
|                     OrderStatus= InOrderStatusEnum.未开始.ObjToInt(), | 
|                     CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), | 
|                     Remark=returnOrder.Remark, | 
|                     Details= inboundOrderDetails | 
|                 }; | 
|                 returnOrder.ReturnOrderStatus=ReturnOrderStatusEnum.Returning.ObjToInt(); | 
|                 _unitOfWorkManage.BeginTran(); | 
|                 BaseDal.UpdateData(returnOrder); | 
|                 Db.InsertNav(inboundOrder).Include(x=>x.Details).ExecuteCommand(); | 
|                 _unitOfWorkManage.CommitTran(); | 
|                 return content.OK("成功"); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|     } | 
| } |