| | |
| | | using System; |
| | | using Newtonsoft.Json.Serialization; |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO; |
| | | using WIDESEA_DTO.MES; |
| | | using WIDESEA_IBasicRepository; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IOutboundRepository; |
| | | using WIDESEA_IOutboundService; |
| | | using WIDESEA_IRecordService; |
| | | using WIDESEA_IStockRepository; |
| | | using WIDESEA_IStockService; |
| | | using WIDESEA_Model.Models; |
| | | using WIDESEA_OutboundRepository; |
| | | using WIDESEA_Common.APIEnum; |
| | | using WIDESEA_Common.OrderEnum; |
| | | |
| | | namespace WIDESEA_OutboundService |
| | | { |
| | |
| | | private readonly IBasicService _basicService; |
| | | private readonly IRecordService _recordService; |
| | | private readonly IOutProStockInfoService _outProStockInfoService; |
| | | private readonly IStockRepository _stockRepository; |
| | | private readonly IOutProStockInfoRepository _outProStockInfoRepository; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IApiInfoRepository _apiInfoRepository; |
| | | |
| | | public IMesRworkOutboundOrderRepository Repository => BaseDal; |
| | | |
| | | public MesRworkOutboundOrderService(IMesRworkOutboundOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService, IOutProStockInfoService outProStockInfoService) : base(BaseDal) |
| | | public MesRworkOutboundOrderService(IMesRworkOutboundOrderRepository BaseDal, IBasicRepository basicRepository, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IBasicService basicService, IRecordService recordService, IOutProStockInfoService outProStockInfoService, IStockRepository stockRepository, IOutProStockInfoRepository outProStockInfoRepository,IUnitOfWorkManage unitOfWorkManage, IApiInfoRepository apiInfoRepository) : base(BaseDal) |
| | | { |
| | | _basicRepository = basicRepository; |
| | | _stockService = stockService; |
| | |
| | | _basicService = basicService; |
| | | _recordService = recordService; |
| | | _outProStockInfoService = outProStockInfoService; |
| | | _stockRepository = stockRepository; |
| | | _outProStockInfoRepository = outProStockInfoRepository; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _apiInfoRepository = apiInfoRepository; |
| | | } |
| | | /// <summary> |
| | | /// æåºä»»å¡åé
åºå |
| | |
| | | float assignQuantity = needQuantity - residueQuantity; |
| | | |
| | | float orderQuantity = mesRworkOutboundOrder.RequiredQuantity; |
| | | bool isCanDate = string.IsNullOrEmpty(mesRworkOutboundOrder.DateCode); |
| | | for (int j = 0; j < autoAssignStocks.Count; j++) |
| | | { |
| | | //åºåºè®¢åæç»å·²åé
æ°é |
| | | float detailAssignQuantity = outProStockInfos |
| | | .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder |
| | | && x.PCode == mesRworkOutboundOrder.ProductCode |
| | | && x.PVer == mesRworkOutboundOrder.ProductVersion) |
| | | && x.PVer == mesRworkOutboundOrder.ProductVersion |
| | | && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) |
| | | .Sum(x => x.AssignQuantity); |
| | | |
| | | //åºåºè¯¦æ
å·²åé
æ°é |
| | |
| | | .Where(x => x.SaleOrder == mesRworkOutboundOrder.SaleOrder |
| | | && x.PCode == mesRworkOutboundOrder.ProductCode |
| | | && x.PVer == mesRworkOutboundOrder.ProductVersion |
| | | && x.PalletCode == autoAssignStocks[j].PalletCode) |
| | | && x.PalletCode == autoAssignStocks[j].PalletCode |
| | | && (isCanDate ? isCanDate : x.DateCode == mesRworkOutboundOrder.DateCode)) |
| | | .Sum(x => x.AssignQuantity); |
| | | |
| | | float palletOutboundQuantity = autoAssignStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity); |
| | |
| | | } |
| | | locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(proStockInfos.Select(x => x.LocationCode).ToList())); |
| | | |
| | | return (proStockInfos, assignOutOrder, outProStockInfos, locationInfos); |
| | | return (proStockInfos, mesRworkOutboundOrder, outProStockInfos, locationInfos); |
| | | } |
| | | public WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> stockInfos, List<Dt_OutProStockInfo> outStockLockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null) |
| | | { |
| | |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æåMESæåºåºåºå®åä¸å
ä¸å
æ£é |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public WebResponseContent MesRworkOutPick(int OrderId,string InrPKCode,int Count=0) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | //è·åå½åçMesæåºå |
| | | Dt_MesRworkOutboundOrder rworkOutboundOrder = BaseDal.QueryFirst(x => x.Id == OrderId); |
| | | if (rworkOutboundOrder == null) |
| | | { |
| | | return content.Error("æªæ¾å°å½åMesæåºå"); |
| | | } |
| | | if (rworkOutboundOrder.OrderStatus>=OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | { |
| | | return content.Error("å½åMesæåºå已宿æå
³é"); |
| | | } |
| | | //æ ¹æ®æ«æå
å
å·è·ååºå |
| | | Dt_ProStockInfoDetail? proStockInfoDetail = _stockRepository.ProStockInfoDetailRepository.QueryFirst(x => x.BagNo == InrPKCode && x.ProOutDetailStatus == StockStatusEmun.åºåºå®æ.ObjToInt()); |
| | | if (proStockInfoDetail == null) |
| | | { |
| | | return content.Error($"æªæ¾å°å
å
{InrPKCode}ä¿¡æ¯"); |
| | | } |
| | | //è·ååºåä¿¡æ¯ |
| | | Dt_ProStockInfo? proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.Id == proStockInfoDetail.ProStockId).Includes(x => x.proStockInfoDetails).First(); |
| | | if (proStockInfo == null) |
| | | { |
| | | return content.Error($"æªæ¾å°å
å
{InrPKCode}åºåä¿¡æ¯"); |
| | | } |
| | | //æ¥è¯¢è¯¥æçæ¯å¦åå¨è¯¥åæ®çåºåºè¯¦æ
|
| | | Dt_OutProStockInfo outProStockInfo = _outProStockInfoRepository.QueryFirst(x => x.OrderNo == rworkOutboundOrder.TaskNo && x.PalletCode == proStockInfo.PalletCode); |
| | | if (outProStockInfo == null) |
| | | { |
| | | return content.Error($"å
å
{InrPKCode}éåæ®{rworkOutboundOrder.TaskNo}å
容"); |
| | | } |
| | | //夿æ¯å¦æ´å
æ°é |
| | | if (Count > 0) |
| | | { |
| | | if (Count> proStockInfoDetail.StockPcsQty) |
| | | { |
| | | return content.Error($"å
å
æ°é{(int)proStockInfoDetail.StockPcsQty}<åºåºæ°é{Count}"); |
| | | } |
| | | int setinterval = (int)proStockInfoDetail.StockPcsQty / (int)proStockInfoDetail.SETQty; |
| | | if (Count % setinterval!=0) |
| | | { |
| | | return content.Error($"è·åSETæ°é失败,1SET:{setinterval}PCS"); |
| | | } |
| | | proStockInfoDetail.OutSETQty = Count / setinterval; |
| | | proStockInfoDetail.OutboundQuantity = Count; |
| | | } |
| | | else |
| | | { |
| | | proStockInfoDetail.OutSETQty = proStockInfoDetail.SETQty; |
| | | proStockInfoDetail.OutboundQuantity = proStockInfoDetail.StockPcsQty; |
| | | } |
| | | rworkOutboundOrder.OverOutQuantity += proStockInfoDetail.OutboundQuantity; |
| | | if (rworkOutboundOrder.OverOutQuantity> rworkOutboundOrder.RequiredQuantity) |
| | | { |
| | | return content.Error($"åæ®{rworkOutboundOrder.TaskNo}溢åº{rworkOutboundOrder.OverOutQuantity - rworkOutboundOrder.RequiredQuantity}"); |
| | | } |
| | | if (rworkOutboundOrder.OverOutQuantity== rworkOutboundOrder.RequiredQuantity) |
| | | { |
| | | rworkOutboundOrder.OrderStatus = OutOrderStatusEnum.åºåºå®æ.ObjToInt(); |
| | | } |
| | | |
| | | int SetCount = (int)proStockInfoDetail.OutSETQty; |
| | | int EligiblePcsCount = (int)proStockInfoDetail.OutboundQuantity; |
| | | _unitOfWorkManage.BeginTran(); |
| | | if (proStockInfoDetail.SETQty == proStockInfoDetail.OutSETQty && proStockInfoDetail.StockPcsQty== proStockInfoDetail.OutboundQuantity) |
| | | { |
| | | proStockInfo.proStockInfoDetails.Remove(proStockInfoDetail); |
| | | if (proStockInfo.proStockInfoDetails.Count==0) |
| | | { |
| | | _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo, OperateTypeEnum.èªå¨å®æ); |
| | | } |
| | | _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetail, OperateTypeEnum.èªå¨å®æ); |
| | | } |
| | | else |
| | | { |
| | | proStockInfoDetail.SETQty -= proStockInfoDetail.OutSETQty; |
| | | proStockInfoDetail.StockPcsQty -= proStockInfoDetail.OutboundQuantity; |
| | | proStockInfoDetail.OutSETQty = 0; |
| | | proStockInfoDetail.OutboundQuantity = 0; |
| | | _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetail); |
| | | } |
| | | BaseDal.UpdateData(rworkOutboundOrder); |
| | | //MESæååºåæ¿åºåºåæ¥ |
| | | WebResponseContent responseContent = ProductOutBoundSync(MesProOutBound(rworkOutboundOrder, new List<Dt_ProStockInfoDetail> { proStockInfoDetail }, SetCount, EligiblePcsCount)); |
| | | if (responseContent.Status) |
| | | { |
| | | throw new Exception("忥MESåºåæ¿åºåºå¤±è´¥,é误:" + responseContent.Message); |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | if (rworkOutboundOrder.OrderStatus==OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | { |
| | | content.OK($"åå·{rworkOutboundOrder.TaskNo}已宿"); |
| | | } |
| | | else |
| | | { |
| | | content.OK($"åå·{rworkOutboundOrder.TaskNo},å©ä½:{rworkOutboundOrder.RequiredQuantity-rworkOutboundOrder.OverOutQuantity}PCS"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | content.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | /// <summary> |
| | | /// åºåæ¿æ°æ®è½¬æ¢ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public MesProductOutBound MesProOutBound(Dt_MesRworkOutboundOrder mesRworkOutboundOrder, List<Dt_ProStockInfoDetail> proStockInfoDetails,int SetCount,int EligiblePcsCount) |
| | | { |
| | | //è·åä»åºä¿¡æ¯ |
| | | Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == mesRworkOutboundOrder.WarehouseId); |
| | | List<MesInventoryInfo> inventoryInfos = new List<MesInventoryInfo>(); |
| | | foreach (var item in proStockInfoDetails) |
| | | { |
| | | MesInventoryInfo mesInventoryInfo = new MesInventoryInfo() |
| | | { |
| | | Warhouseno = warehouse.WarehouseCode, |
| | | InternalPackageNumber = item.BagNo, |
| | | SetCount = SetCount, |
| | | EligiblePcsCount = EligiblePcsCount |
| | | }; |
| | | inventoryInfos.Add(mesInventoryInfo); |
| | | } |
| | | MesProductOutBound mesProductOutBound = new MesProductOutBound() |
| | | { |
| | | TaskNo = mesRworkOutboundOrder.TaskNo, |
| | | ProductCode = mesRworkOutboundOrder.ProductCode, |
| | | ProductVersion = mesRworkOutboundOrder.ProductVersion, |
| | | DateCode = mesRworkOutboundOrder.DateCode, |
| | | SaleOrder = mesRworkOutboundOrder.SaleOrder, |
| | | InventoryInfo = inventoryInfos |
| | | }; |
| | | return mesProductOutBound; |
| | | } |
| | | /// <summary> |
| | | /// æååºåæ¿åæ¥æ¥å£ |
| | | /// </summary> |
| | | public WebResponseContent ProductOutBoundSync(MesProductOutBound model) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_ApiInfo apiInfo = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMS_MES_ProductOutBound.ToString()); |
| | | MESRoot<MesProductOutBound> root = new MESRoot<MesProductOutBound>() |
| | | { |
| | | From = "WMS", |
| | | DateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), |
| | | Content = model |
| | | }; |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | string request = JsonConvert.SerializeObject(root, settings); |
| | | string response = HttpMesHelper.Post(apiInfo.ApiAddress, request); |
| | | MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>(); |
| | | //è°ç¨æ¥å£ |
| | | if (mesResponseContent.BSucc == true) |
| | | { |
| | | content.OK(mesResponseContent.StrMsg); |
| | | } |
| | | else |
| | | { |
| | | content.Error(mesResponseContent.StrMsg); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | } |
| | | } |