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, 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; } /// /// 获取退料单 /// /// /// 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 returnOrders = new List(); if (string.IsNullOrEmpty(orderNo)) { returnOrders = Db.Queryable().Where(x => x.ReturnOrderStatus < ReturnOrderStatusEnum.Returning.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5); } else { returnOrders = Db.Queryable().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; } /// /// 获取接收退料单 /// 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); } } /// /// 新建退料单 /// 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 returnOrderDetails = new List(); foreach (var item in model.Issitem) { //判断发料单号 Dt_OutboundOrder outboundOrder = _outboundService.OutboundOrderService.Repository.Db.Queryable().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; } /// /// 修改退料单 /// public WebResponseContent UpdateReturnOrder(ErpReturnOrderDTO model) { WebResponseContent content = new WebResponseContent(); return content; } /// /// 删除退料单 /// public WebResponseContent DeleteReturnOrder(ErpReturnOrderDTO model) { WebResponseContent content = new WebResponseContent(); return content; } /// /// 确认退库根据退库单生成入库单 /// /// public WebResponseContent IsReturnCreateInOrder(int returnId) { WebResponseContent content = new WebResponseContent(); try { Dt_ReturnOrder returnOrder = Db.Queryable().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 inboundOrderDetails = new List(); 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; } } }