|  |  |  | 
|---|
|  |  |  | using WIDESEA_Common.CommonEnum; | 
|---|
|  |  |  | using WIDESEA_Core.Helper; | 
|---|
|  |  |  | using Microsoft.AspNetCore.Mvc.RazorPages; | 
|---|
|  |  |  | using WIDESEA_External.ERPService; | 
|---|
|  |  |  | using WIDESEA_InboundRepository; | 
|---|
|  |  |  | using WIDESEA_IStockRepository; | 
|---|
|  |  |  | using WIDESEA_Common.StockEnum; | 
|---|
|  |  |  | using WIDESEA_Core.Enums; | 
|---|
|  |  |  | using WIDESEA_External.Model; | 
|---|
|  |  |  | using SqlSugar; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | namespace WIDESEA_InboundService | 
|---|
|  |  |  | { | 
|---|
|  |  |  | 
|---|
|  |  |  | public ITakeStockOrderRepository Repository => BaseDal; | 
|---|
|  |  |  | private readonly IUnitOfWorkManage _unitOfWorkManage; | 
|---|
|  |  |  | private readonly IBasicRepository _basicRepository; | 
|---|
|  |  |  | public TakeStockOrderService(ITakeStockOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository) : base(BaseDal) | 
|---|
|  |  |  | private readonly IInvokeERPService _invokeERPService; | 
|---|
|  |  |  | private readonly ITakeStockOrderDetailRepository _takeStockOrderDetailRepository; | 
|---|
|  |  |  | private readonly IStockInfoRepository _stockInfoRepository; | 
|---|
|  |  |  | private readonly IStockInfoDetailRepository _stockInfoDetailRepository; | 
|---|
|  |  |  | public TakeStockOrderService(ITakeStockOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository,IInvokeERPService invokeERPService,ITakeStockOrderDetailRepository takeStockOrderDetailRepository,IStockInfoRepository stockInfoRepository,IStockInfoDetailRepository stockInfoDetailRepository) : base(BaseDal) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | _unitOfWorkManage = unitOfWorkManage; | 
|---|
|  |  |  | _basicRepository = basicRepository; | 
|---|
|  |  |  | _invokeERPService = invokeERPService; | 
|---|
|  |  |  | _takeStockOrderDetailRepository= takeStockOrderDetailRepository; | 
|---|
|  |  |  | _stockInfoRepository= stockInfoRepository; | 
|---|
|  |  |  | _stockInfoDetailRepository= stockInfoDetailRepository; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /// <summary> | 
|---|
|  |  |  | /// æ°å¢ | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return content; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /// <summary> | 
|---|
|  |  |  | /// éè¿çç¹åå·+æ¡å·è·åçç¹ä¿¡æ¯è¯¦æ | 
|---|
|  |  |  | /// </summary> | 
|---|
|  |  |  | /// <param name="saveModel"></param> | 
|---|
|  |  |  | /// <returns></returns> | 
|---|
|  |  |  | public WebResponseContent GetTakeDetailInfo(SaveModel saveModel) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | WebResponseContent content = new WebResponseContent(); | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  | string? orderNo = saveModel.MainData["orderNo"].ToString(); | 
|---|
|  |  |  | string? takePalletCode = saveModel.MainData["takePalletCode"].ToString(); | 
|---|
|  |  |  | Dt_TakeStockOrderDetail takeStockOrderDetail=new Dt_TakeStockOrderDetail(); | 
|---|
|  |  |  | if (!string.IsNullOrEmpty(orderNo) && !string.IsNullOrEmpty(takePalletCode)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | //è·åçç¹æç» | 
|---|
|  |  |  | takeStockOrderDetail = BaseDal.Db.Queryable<Dt_TakeStockOrder, Dt_TakeStockOrderDetail>((master, detail) => master.Id == detail.TakeStockId) | 
|---|
|  |  |  | .Where((master, detail) => master.OrderNo == orderNo && detail.TakePalletCode== takePalletCode) | 
|---|
|  |  |  | .Select((master, detail) => detail).First(); | 
|---|
|  |  |  | if (takeStockOrderDetail==null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error($"çç¹å{orderNo}䏿ªæ¾å°{takePalletCode}çç¹æç»"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (takeStockOrderDetail.TakeDetalStatus != TakeStockDetailStatusEnum.çç¹åºåºå®æ.ObjToInt()) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error($"çç¹å{orderNo}䏿ªæ¾å°{takePalletCode}å¯çç¶æ"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x=>x.PalletCode== takePalletCode && x.StockStatus==StockStatusEmun.çç¹åºåºå®æ.ObjToInt()).Includes(x=>x.Details).First(); | 
|---|
|  |  |  | if (stockInfo == null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error($"æªæ¾å°{takePalletCode}çç¹åºåç¶æ"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | content.OK(data: takeStockOrderDetail); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error("请æ±ä¿¡æ¯ä¸ºç©º"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | catch (Exception ex) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | content.Error(ex.Message); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return content; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /// <summary> | 
|---|
|  |  |  | /// çç¹æä½ | 
|---|
|  |  |  | /// </summary> | 
|---|
|  |  |  | /// <param name="saveModel"></param> | 
|---|
|  |  |  | /// <returns></returns> | 
|---|
|  |  |  | public WebResponseContent MatPicking(SaveModel saveModel) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | WebResponseContent content = new WebResponseContent(); | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int id = saveModel.MainData["id"].ObjToInt(); | 
|---|
|  |  |  | decimal stockNum =saveModel.MainData["num"].ObjToDecimal(); | 
|---|
|  |  |  | if (stockNum<0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error("çäºä¸è½ä¸ºè´"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (id>0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | //è·åçç¹è¯¦æ | 
|---|
|  |  |  | Dt_TakeStockOrderDetail takeStockOrderDetail = _takeStockOrderDetailRepository.QueryFirst(x=>x.Id== id); | 
|---|
|  |  |  | if (takeStockOrderDetail.TakeDetalStatus != TakeStockDetailStatusEnum.çç¹åºåºå®æ.ObjToInt()) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error("éå¯çç¹ç¶æ"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Dt_TakeStockOrder takeStockOrder = BaseDal.Db.Queryable<Dt_TakeStockOrder>().Where(x => x.Id == takeStockOrderDetail.TakeStockId).Includes(x => x.Details).First(); | 
|---|
|  |  |  | if (takeStockOrder.TakeStockStatus != TakeStockStatusEnum.çç¹ä¸.ObjToInt()) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error("éå¯çç¹ç¶æ"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //è·ååºå | 
|---|
|  |  |  | Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == takeStockOrderDetail.TakePalletCode && x.StockStatus == StockStatusEmun.çç¹åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); | 
|---|
|  |  |  | List<Dt_StockInfoDetail> addStockDetails = new List<Dt_StockInfoDetail>(); | 
|---|
|  |  |  | List<Dt_StockInfoDetail> delStockDetails = new List<Dt_StockInfoDetail>(); | 
|---|
|  |  |  | List<Dt_StockInfoDetail> updateStockDetails = new List<Dt_StockInfoDetail>(); | 
|---|
|  |  |  | if (stockInfo == null || stockInfo.Details.Count<=0 || stockInfo.Details==null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error("æªæ¾å°åºå"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | takeStockOrderDetail.Qty = (float)stockNum; | 
|---|
|  |  |  | takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.çç¹å®æ.ObjToInt(); | 
|---|
|  |  |  | int stockCount=stockInfo.Details.Count; | 
|---|
|  |  |  | //夿æ¯å¦çèµ¢è¿æ¯çäº | 
|---|
|  |  |  | if (takeStockOrderDetail.SysQty< takeStockOrderDetail.Qty) //çèµ¢ | 
|---|
|  |  |  | { | 
|---|
|  |  |  | //float stockMaxQty = stockInfo.Details.Max(x => x.StockQuantity); | 
|---|
|  |  |  | //float stockMinQty = stockInfo.Details.Min(x => x.StockQuantity); | 
|---|
|  |  |  | Dt_StockInfoDetail? addstockInfoDetail = stockInfo.Details?.FirstOrDefault(); | 
|---|
|  |  |  | addstockInfoDetail.Id = 0; | 
|---|
|  |  |  | addstockInfoDetail.StockQuantity = (takeStockOrderDetail.Qty - takeStockOrderDetail.SysQty); | 
|---|
|  |  |  | addStockDetails.Add(addstockInfoDetail); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else if (takeStockOrderDetail.Qty==0) //çäº | 
|---|
|  |  |  | { | 
|---|
|  |  |  | delStockDetails.AddRange(stockInfo.Details); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else if(takeStockOrderDetail.SysQty > takeStockOrderDetail.Qty) //çäº | 
|---|
|  |  |  | { | 
|---|
|  |  |  | decimal totalQty = (takeStockOrderDetail.SysQty - takeStockOrderDetail.Qty).ObjToDecimal(); | 
|---|
|  |  |  | while (totalQty>0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | Dt_StockInfoDetail addstockInfoDetail=stockInfo.Details.OrderByDescending(x => x.Id).FirstOrDefault(); | 
|---|
|  |  |  | decimal stockQty = addstockInfoDetail.StockQuantity.ObjToDecimal(); | 
|---|
|  |  |  | if (stockQty < totalQty) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | delStockDetails.Add(addstockInfoDetail); | 
|---|
|  |  |  | stockInfo.Details.Remove(addstockInfoDetail); | 
|---|
|  |  |  | totalQty -= stockQty; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else if (stockQty >= totalQty) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | stockQty-=totalQty; | 
|---|
|  |  |  | if (stockQty==0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | delStockDetails.Add(addstockInfoDetail); | 
|---|
|  |  |  | stockInfo.Details.Remove(addstockInfoDetail); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | addstockInfoDetail.StockQuantity = (float)stockQty; | 
|---|
|  |  |  | updateStockDetails.Add(addstockInfoDetail); | 
|---|
|  |  |  | stockInfo.Details.Remove(addstockInfoDetail); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | totalQty = 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Dt_TakeStockOrderDetail> takeStockOrderDetails=new List<Dt_TakeStockOrderDetail>(); | 
|---|
|  |  |  | Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==takeStockOrder.WarehouseId); | 
|---|
|  |  |  | List<Dt_TakeStockOrderDetail> overTakeStockOrderDetails = takeStockOrder.Details.Where(x => x.TakeDetalStatus == TakeStockDetailStatusEnum.çç¹å®æ.ObjToInt()).ToList(); | 
|---|
|  |  |  | if ((overTakeStockOrderDetails.Count + 1) == takeStockOrder.Details.Count) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | takeStockOrder.TakeStockStatus = TakeStockStatusEnum.çç¹å®æ.ObjToInt(); | 
|---|
|  |  |  | takeStockOrderDetails.AddRange(overTakeStockOrderDetails); | 
|---|
|  |  |  | takeStockOrderDetails.Add(takeStockOrderDetail); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //æ°æ®æä½ | 
|---|
|  |  |  | _unitOfWorkManage.BeginTran(); | 
|---|
|  |  |  | if (stockCount== delStockDetails.Count) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | _stockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | stockInfo.StockStatus = StockStatusEmun.çç¹åºå宿.ObjToInt(); | 
|---|
|  |  |  | _stockInfoRepository.UpdateData(stockInfo); | 
|---|
|  |  |  | if (stockInfo.Details!=null && stockInfo.Details.Count>0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | stockInfo.Details.ForEach(x => | 
|---|
|  |  |  | { | 
|---|
|  |  |  | x.Status = StockStatusEmun.çç¹åºå宿.ObjToInt(); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (delStockDetails.Count>0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | _stockInfoDetailRepository.DeleteAndMoveIntoHty(delStockDetails, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (addStockDetails.Count>0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | addStockDetails.ForEach(x => | 
|---|
|  |  |  | { | 
|---|
|  |  |  | x.Status = StockStatusEmun.çç¹åºå宿.ObjToInt(); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | _stockInfoDetailRepository.AddData(addStockDetails); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (updateStockDetails.Count>0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | updateStockDetails.ForEach(x => | 
|---|
|  |  |  | { | 
|---|
|  |  |  | x.Status = StockStatusEmun.çç¹åºå宿.ObjToInt(); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | _stockInfoDetailRepository.UpdateData(updateStockDetails); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | _takeStockOrderDetailRepository.UpdateData(takeStockOrderDetail); | 
|---|
|  |  |  | BaseDal.UpdateData(takeStockOrder); | 
|---|
|  |  |  | //æäº¤ERPé»è¾ | 
|---|
|  |  |  | //if (takeStockOrder.TakeStockStatus== TakeStockStatusEnum.çç¹å®æ.ObjToInt()) | 
|---|
|  |  |  | //{ | 
|---|
|  |  |  | //    ERPTakeStockModel eRPTakeStock = new ERPTakeStockModel() | 
|---|
|  |  |  | //    { | 
|---|
|  |  |  | //        Way = 1, | 
|---|
|  |  |  | //        UniqueTag = takeStockOrder.Id.ToString(), | 
|---|
|  |  |  | //        Code = takeStockOrder.OrderNo, | 
|---|
|  |  |  | //        FiscalPeriotime = takeStockOrder.CreateDate.ToString("yyyy-MM-dd"), | 
|---|
|  |  |  | //        Name=takeStockOrder.OrderNo, | 
|---|
|  |  |  | //        WarehouseCode= warehouse.WarehouseCode, | 
|---|
|  |  |  | //        Createuser=takeStockOrder.Creater, | 
|---|
|  |  |  | //        Createtime= takeStockOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), | 
|---|
|  |  |  | //        Details=new List<TakeDetailsItem>() | 
|---|
|  |  |  | //    }; | 
|---|
|  |  |  | //    foreach (var item in takeStockOrderDetails) | 
|---|
|  |  |  | //    { | 
|---|
|  |  |  | //        TakeDetailsItem takeDetailsItem = new TakeDetailsItem() | 
|---|
|  |  |  | //        { | 
|---|
|  |  |  | //            MaterialsCode=item.MaterielCode, | 
|---|
|  |  |  | //            LocationCode=item.LocationCode, | 
|---|
|  |  |  | //            Lotno=item.BatchNo, | 
|---|
|  |  |  | //            Sysqty=item.SysQty.ObjToDecimal(), | 
|---|
|  |  |  | //            Qty=item.Qty.ObjToDecimal() | 
|---|
|  |  |  | //        }; | 
|---|
|  |  |  | //        eRPTakeStock.Details.Add(takeDetailsItem); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  | //    string response = _invokeERPService.InvokeTakeStockApi(eRPTakeStock); | 
|---|
|  |  |  | //    ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>(); | 
|---|
|  |  |  | //    if (erpRequestContent.res != 1) | 
|---|
|  |  |  | //    { | 
|---|
|  |  |  | //        throw new Exception("忥ERP失败,é误信æ¯:" + erpRequestContent.Data); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  | //} | 
|---|
|  |  |  | _unitOfWorkManage.CommitTran(); | 
|---|
|  |  |  | content.OK("çç¹æå"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return content.Error("请æ±ä¿¡æ¯ä¸ºç©º"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | catch (Exception ex) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | _unitOfWorkManage.RollbackTran(); | 
|---|
|  |  |  | content.Error(ex.Message); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return content; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public WebResponseContent DisEnableTakeOrder(int id) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | WebResponseContent content = new WebResponseContent(); | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  | //è·åçç¹å | 
|---|
|  |  |  | Dt_TakeStockOrder takeStockOrder = BaseDal.QueryFirst(x=>x.Id==id); | 
|---|
|  |  |  | if (takeStockOrder!=null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | takeStockOrder.TakeStockStatus = TakeStockStatusEnum.çç¹å
³é.ObjToInt(); | 
|---|
|  |  |  | BaseDal.UpdateData(takeStockOrder); | 
|---|
|  |  |  | content.OK("å
³éçç¹æå!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | catch (Exception ex) | 
|---|
|  |  |  | { | 
|---|