#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEA_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using MailKit.Search; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Net.Http.Headers; using System.Reflection; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEA_BasicRepository; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Core.Log; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.Stock; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IInboundService; using WIDESEA_IOutboundRepository; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_ISystemService; using WIDESEA_ITaskInfoRepository; using WIDESEA_ITaskInfoService; using WIDESEA_Model; using WIDESEA_Model.Models; using WIDESEA_TaskInfoRepository; using OrderByType = SqlSugar.OrderByType; namespace WIDESEA_TaskInfoService { public partial class TaskService : ServiceBase, ITaskService { private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IBasicService _basicService; private readonly IOutboundService _outboundService; private readonly IInboundService _inboundService; private readonly IRecordService _recordService; private readonly IStockService _stockService; private readonly ITask_HtyService _taskHtyService; private readonly ILocationInfoService _locationInfoService; private readonly ISys_JobService _sys_JobService; private readonly ILabelMasterRepository _labelMasterRepository; private readonly IOutStockLockInfoRepository _outStockLockInfoRepository; private readonly IOutboundOrderRepository _outboundOrderRepository; private readonly IOutboundOrderDetailRepository _outboundOrderDetailRepository; private readonly IOutboundOrder_HtyRepository _outboundOrder_HtyRepository; private readonly IOutboundOrderDetail_HtyRepository _outboundOrderDetail_HtyRepository; private readonly IOutBoundOrderBYDRepository _outBoundOrderBYDRepository; private readonly IOutboundOrderDetailBYDRepository _outboundOrderDetailByDRepository; public ITaskRepository Repository => BaseDal; private Dictionary _OutLockOrderBy = new Dictionary() { { nameof(Dt_OutStockLockInfo.CreateDate), OrderByType.Desc }, }; public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IBasicService basicService, IOutboundService outboundService, IInboundService inboundService, IRecordService recordService, IStockService stockService, ITask_HtyService taskHtyService, ILocationInfoService locationInfoService, ISys_JobService sys_JobService, ILabelMasterRepository labelMasterRepository, IOutStockLockInfoRepository outStockLockInfoRepository, IOutboundOrderDetailRepository outboundOrderDetailRepository, IOutBoundOrderBYDRepository outBoundOrderBYDRepository, IOutboundOrderDetailBYDRepository outboundOrderDetailByDRepository, IOutboundOrderRepository outboundOrderRepository, IOutboundOrder_HtyRepository outboundOrder_HtyRepository, IOutboundOrderDetail_HtyRepository outboundOrderDetail_HtyRepository) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _basicService = basicService; _outboundService = outboundService; _inboundService = inboundService; _recordService = recordService; _stockService = stockService; _taskHtyService = taskHtyService; _locationInfoService = locationInfoService; _sys_JobService = sys_JobService; _labelMasterRepository = labelMasterRepository; _outStockLockInfoRepository = outStockLockInfoRepository; _outboundOrderDetailRepository = outboundOrderDetailRepository; _outBoundOrderBYDRepository = outBoundOrderBYDRepository; _outboundOrderDetailByDRepository = outboundOrderDetailByDRepository; _outboundOrderRepository = outboundOrderRepository; _outboundOrder_HtyRepository = outboundOrder_HtyRepository; _outboundOrderDetail_HtyRepository = outboundOrderDetail_HtyRepository; } /// /// 任务完成 /// /// 任务号 /// 返回处理结果 public WebResponseContent TaskCompleted(int taskNum) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) { return WebResponseContent.Instance.Error("未找到任务信息"); } _unitOfWorkManage.BeginTran(); MethodInfo? methodInfo = GetType().GetMethod(((TaskTypeEnum)task.TaskType) + "TaskCompleted"); if (methodInfo != null) { WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { task }); if (responseContent != null) { //if (App.User.UserId > 0) //{ // var response = HttpHelper.Post(url + "StackCraneTaskCompleted?taskNum=" + task.TaskNum, "", "任务完成"); // if (!response.Status) // { // _unitOfWorkManage.RollbackTran(); // return WebResponseContent.Instance.Error(response.Message); // } // _unitOfWorkManage.CommitTran(); // return content = responseContent; //} _unitOfWorkManage.CommitTran(); return content = responseContent; } } return content = WebResponseContent.Instance.Error("未找到任务类型对应业务处理逻辑"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content = WebResponseContent.Instance.Error(ex.Message); } finally { WriteLog.GetLog("任务完成").Write($"操作人:{(App.User.UserId>0? App.User.UserName: "System")}{ Environment.NewLine}任务号:{taskNum}{Environment.NewLine}{ JsonConvert.SerializeObject(content)}", "任务完成"); } } public WebResponseContent TaskCancel(int taskNum) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) { return content=WebResponseContent.Instance.Error("未找到任务信息"); } _unitOfWorkManage.BeginTran(); MethodInfo? methodInfo = GetType().GetMethod(((TaskTypeEnum)task.TaskType) + "TaskCancel"); if (methodInfo != null) { WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { task }); if (responseContent != null) { if (responseContent != null) { if (App.User.UserId > 0) { var response = HttpHelper.Post(url + "TaskCancel?taskNum=" + task.TaskNum, "", "任务取消"); if (!response.Status) { _unitOfWorkManage.RollbackTran(); return content=WebResponseContent.Instance.Error(response.Message); } _unitOfWorkManage.CommitTran(); return content=responseContent; } _unitOfWorkManage.CommitTran(); return content=responseContent; } } } return content=WebResponseContent.Instance.Error("未找到任务类型对应业务处理逻辑"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content=WebResponseContent.Instance.Error(ex.Message); } finally { WriteLog.GetLog("任务取消").Write($"操作人:{(App.User.UserId > 0 ? App.User.UserName : "System")}{Environment.NewLine}任务号:{taskNum}{Environment.NewLine}{JsonConvert.SerializeObject(content)}", "任务取消"); } } public WebResponseContent UpdateTaskStatus(int taskNum) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) { return WebResponseContent.Instance.Error("未找到任务信息"); } if (task.TaskStatus == 100 || task.TaskStatus == 200)//如果是新建任务状态改为执行中 { if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.PalletOutbound.ObjToInt()) { task.TaskStatus = OutTaskStatusEnum.SC_OutExecuting.ObjToInt(); } else if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt() || task.TaskType == TaskTypeEnum.PalletInbound.ObjToInt() || task.TaskType == TaskTypeEnum.PalletReturnInbound.ObjToInt()) { task.TaskStatus = InTaskStatusEnum.SC_InExecuting.ObjToInt(); } //else if (task.TaskType == TaskTypeEnum.Relocation.ObjToInt()) //{ // task.TaskStatus = InTaskStatusEnum.RelocationExecuting.ObjToInt(); //} else { throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{task.TaskNum}】,任务类型:【{task.TaskType}】"); } } else { if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.PalletOutbound.ObjToInt()) { task.TaskStatus = OutTaskStatusEnum.SC_OutFinish.ObjToInt(); } else if (task.TaskType == TaskTypeEnum.Inbound.ObjToInt() || task.TaskType == TaskTypeEnum.PalletInbound.ObjToInt() || task.TaskType == TaskTypeEnum.PalletReturnInbound.ObjToInt()) { task.TaskStatus = InTaskStatusEnum.SC_InFinish.ObjToInt(); } //else if (task.TaskType == TaskTypeEnum.Relocation.ObjToInt()) //{ // task.TaskStatus = InTaskStatusEnum.RelocationExecuting.ObjToInt(); //} else { throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{task.TaskNum}】,任务类型:【{task.TaskType}】"); } } _unitOfWorkManage.BeginTran(); task.Dispatchertime = DateTime.Now; task.ModifyDate = DateTime.Now; task.Modifier = App.User.UserId > 0 ? App.User.UserName : "System"; BaseDal.UpdateData(task); _unitOfWorkManage.CommitTran(); return content = WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent InboundTaskCompleted(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); decimal beforeQuantity = 0; Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); CheckCompleted(stockInfo, locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.Inbound,task.TaskNum); _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } //原料入库完成后,需要将组盘信息调用上游WMS原料上架结果接口 #region 回传逻辑处理 try { PutAwayRequest request = new PutAwayRequest(); List itemData = new List(); request.ITEMDATA = itemData; request.WERKS = AppSettings.Configuration["WERKS"]; request.WH_NUMBER = AppSettings.Configuration["WERKS"]; request.IZLID = request.WERKS + request.WH_NUMBER+ DateTime.Now.ToString("yyyyMMdd") + task.TaskNum.ToString(); request.CREATE_DATE = task.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"); request.PSTNG_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); request.INBOUND_NO = "";//todo:单号要从条码主数据中获取,不然回传会提示:该条码无进仓单数据! request.RECEIPT_NO = "";//todo:单号要从条码主数据中,不然回传会提示:该条码无进仓单数据! Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); foreach (Dt_StockInfoDetail detail in stockInfo.Details) { Dt_LabelMaster labMaster = _labelMasterRepository.QueryFirst(x => x.LABEL_NO == detail.SerialNumber); if (labMaster != null) { if (request.INBOUND_NO == "") { request.INBOUND_NO = labMaster.INBOUND_NO; } if (request.RECEIPT_NO == "") { request.RECEIPT_NO = labMaster.RECEIPT_NO; } PutAway putAway = new PutAway(); putAway.MATNR = labMaster.MATNR; putAway.BATCH = labMaster.BATCH; putAway.LIFNR = labMaster.LIFNR; putAway.LIKTX = labMaster.LIKTX; putAway.RECEIPT_QTY = labMaster.BOX_QTY; putAway.UNIT = labMaster.UNIT; putAway.LABEL_NO = labMaster.LABEL_NO; putAway.PACK_LABEL_NO = labMaster.Pack_LABEL_No; putAway.PALLET_LABEL_NO = labMaster.Pallet_label_no; putAway.TPNUM = task.PalletCode; putAway.FLAG = "0"; putAway.TKTXT = ""; putAway.PO_NO = labMaster.PO_NO; putAway.PO_ITEM_NO = labMaster.PO_ITEM_NO; putAway.SOBKZ = labMaster.SOBKZ; putAway.RECEIPT_ITEM_NO = labMaster.RECEIPT_ITEM_NO; putAway.INBOUND_NO = task.TaskNum.ToString(); //LABEL _STATUS 条码状态 02已收料(无需质检)03 待进仓(已质检),并且,QC RESULT CODE质检状态为“02” 才允计上架 if (labMaster.QC_RESULT_CODE=="02"&&(labMaster.LABEL_STATUS=="02"|| labMaster.LABEL_STATUS == "03")) { itemData.Add(putAway); } } } if (itemData.Count > 0) { _sys_JobService.CallPutAway(request); } } catch(Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } #endregion return WebResponseContent.Instance.OK(); } /// /// 空托盘入库完成处理 /// /// 任务实体对象 /// 返回处理结果 public WebResponseContent PalletInboundTaskCompleted(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = task.PalletCode, LocationCode = task.TargetAddress, StockStatus = StockStatusEmun.已入库.ObjToInt(), Creater = App.User.UserId > 0 ? App.User.UserName : "System", CreateDate = DateTime.Now, }; Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); CheckCompleted(stockInfo, locationInfo); _stockService.StockInfoService.Repository.AddData(stockInfo); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 余料退库完成处理 /// /// 任务实体对象 /// 返回处理结果 public WebResponseContent PalletReturnInboundTaskCompleted(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); decimal beforeQuantity = 0; Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); CheckCompleted(stockInfo, locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.Inbound, task.TaskNum); _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } //余料入库完成后,需要将组盘信息调用上游WMS原料上架结果接口 #region 回传逻辑处理 //try //{ // PutAwayRequest request = new PutAwayRequest(); // List itemData = new List(); // request.ITEMDATA = itemData; // request.WERKS = AppSettings.Configuration["WERKS"]; // request.WH_NUMBER = AppSettings.Configuration["WERKS"]; // request.IZLID = request.WERKS + request.WH_NUMBER + DateTime.Now.ToString("yyyyMMdd") + task.TaskNum.ToString(); // request.CREATE_DATE = task.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"); // request.PSTNG_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // request.INBOUND_NO = "";//todo:单号要从条码主数据中获取,不然回传会提示:该条码无进仓单数据! // request.RECEIPT_NO = "";//todo:单号要从条码主数据中,不然回传会提示:该条码无进仓单数据! // Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); // foreach (Dt_StockInfoDetail detail in stockInfo.Details) // { // Dt_LabelMaster labMaster = _labelMasterRepository.QueryFirst(x => x.LABEL_NO == detail.SerialNumber); // if (labMaster != null) // { // if (request.INBOUND_NO == "") // { // request.INBOUND_NO = labMaster.INBOUND_NO; // } // if (request.RECEIPT_NO == "") // { // request.RECEIPT_NO = labMaster.RECEIPT_NO; // } // PutAway putAway = new PutAway(); // putAway.MATNR = labMaster.MATNR; // putAway.BATCH = labMaster.BATCH; // putAway.LIFNR = labMaster.LIFNR; // putAway.LIKTX = labMaster.LIKTX; // putAway.RECEIPT_QTY = labMaster.BOX_QTY; // putAway.UNIT = labMaster.UNIT; // putAway.LABEL_NO = labMaster.LABEL_NO; // putAway.PACK_LABEL_NO = labMaster.Pack_LABEL_No; // putAway.PALLET_LABEL_NO = labMaster.Pallet_label_no; // putAway.TPNUM = task.PalletCode; // putAway.FLAG = "0"; // putAway.TKTXT = ""; // putAway.PO_NO = labMaster.PO_NO; // putAway.PO_ITEM_NO = labMaster.PO_ITEM_NO; // putAway.SOBKZ = labMaster.SOBKZ; // putAway.RECEIPT_ITEM_NO = labMaster.RECEIPT_ITEM_NO; // putAway.INBOUND_NO = task.TaskNum.ToString(); // //LABEL _STATUS 条码状态 02已收料(无需质检)03 待进仓(已质检),并且,QC RESULT CODE质检状态为“02” 才允计上架 // if (labMaster.QC_RESULT_CODE == "02" && (labMaster.LABEL_STATUS == "02" || labMaster.LABEL_STATUS == "03")) // { // itemData.Add(putAway); // } // } // } // if (itemData.Count > 0) // { // _sys_JobService.CallPutAway(request); // } //} //catch (Exception ex) //{ // return WebResponseContent.Instance.Error(ex.Message); //} #endregion return WebResponseContent.Instance.OK(); } /// /// 验证数据 /// /// /// /// private (bool, string) CheckCompleted(Dt_StockInfo stockInfo, Dt_LocationInfo locationInfo, bool isCheckStockDetail = true) { if (stockInfo == null) { return (false, "未找到组盘信息"); } if (locationInfo == null) { return (false, "未找到货位信息"); } if (isCheckStockDetail && (stockInfo.Details == null || stockInfo.Details.Count == 0)) { return (false, "未找到组盘明细信息"); } return (true, "成功"); } public WebResponseContent OutboundTaskCompleted(Dt_Task task) { Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_StockInfo stockInfoCatch = stockInfo;//先缓存起来,供后面的回传接口调用 try { _unitOfWorkManage.BeginTran(); decimal beforeQuantity = 0; //Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); //Dt_StockInfo stockInfoCatch = stockInfo;//先缓存起来,供后面的回传接口调用 Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); int beforeStatus = locationInfo.LocationStatus; if (locationInfo.Depth == 2) { if (DepthTask(locationInfo) == false) { _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); } } locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = OutTaskStatusEnum.OutFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) - beforeQuantity, StockChangeType.Outbound, task.TaskNum); _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } //原料出库完成后,调用上游系统WMS出库完成信息接口 #region 回传逻辑处理 try { PickAndPostRequest request = new PickAndPostRequest(); List itemData = new List(); request.ITEMDATA = itemData; request.WH_NUMBER = AppSettings.Configuration["WERKS"]; request.SYSNOD = AppSettings.Configuration["SYSNO"]; request.WERKS = AppSettings.Configuration["WERKS"]; //暂时根据托盘号查出库锁定表中Dt_OutStockLockInfo中的状态为1的最新一条,因为先锁定,才有任务,所以没有关联任务号 //Dt_OutStockLockInfo outStockLockInfo= _outStockLockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode && x.Status == 1, _OutLockOrderBy); Dt_OutboundOrderDetail_Hty detail = _outboundOrderDetail_HtyRepository.QueryFirst(x => x.SourceId.ToString() == task.Remark);// task.Remark存需求明细ID if (detail != null) { Dt_OutboundOrder_Hty outboundOrder = _outboundOrder_HtyRepository.QueryFirst(x => x.SourceId == detail.OrderId); if (outboundOrder != null) { Dt_OutBoundOrderBYD outboundOrderBYD = _outBoundOrderBYDRepository.QueryFirst(x => x.REQUIREMENT_NO == outboundOrder.OrderNo); if (outboundOrderBYD != null) { Dt_OutboundOrderDetailBYD outboundOrderDetailBYD = _outboundOrderDetailByDRepository.QueryFirst(x => x.REQUIREMENT_NO == outboundOrderBYD.REQUIREMENT_NO && x.REQUIREMENT_ITEM_NO == detail.Remark);//detail.Remark 存需求行 //根据托盘号查立库的条码和批次进行回传 foreach (var item in stockInfoCatch.Details) { PickAndPost pickpost = new PickAndPost(); pickpost.REQUIREMENT_NO = outboundOrderDetailBYD.REQUIREMENT_NO; pickpost.REQUIREMENT_ITEM_NO = outboundOrderDetailBYD.REQUIREMENT_ITEM_NO; pickpost.WERKS = outboundOrderBYD.WRKS; pickpost.SYSNOD = outboundOrderBYD.SYSNOD; pickpost.MATNR = outboundOrderDetailBYD.MATNR; pickpost.LIFNR = "";//没有返回,暂时转空 pickpost.QTY = outboundOrderDetailBYD.QTY; pickpost.BATCH = item.BatchNo;//取立库入库库存的条码 pickpost.LGORT = outboundOrderBYD.LGORT; pickpost.BUSINESS_CODE = outboundOrderBYD.BUSINESS_CODE; pickpost.BUSINESS_NAME = outboundOrderBYD.BUSINESS_NAME; pickpost.STATION = outboundOrderBYD.STATION; pickpost.SPLIT = outboundOrderBYD.SPLIT; pickpost.LABEL_NO = item.SerialNumber;//取立库入库库存的条码 pickpost.CREATE_DATE = outboundOrderBYD.CREATE_DATE; pickpost.UPDATE_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); pickpost.STATUS = outboundOrderBYD.STATUS; itemData.Add(pickpost); } _sys_JobService.CallPickAndPost(request);//回传 } } } } catch(Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } #endregion return WebResponseContent.Instance.OK(); } public WebResponseContent PalletOutboundTaskCompleted(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationInfo); int beforeStatus = locationInfo.LocationStatus; if (locationInfo.Depth == 2) { if (DepthTask(locationInfo) == false) { _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); } } locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = OutTaskStatusEnum.OutFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent RelocationTaskCompleted(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); Dt_LocationInfo locationStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationEnd); stockInfo.LocationCode = locationEnd.LocationCode; stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); if (locationStart.Depth == 1) { if (DepthTask(locationStart) == false) { locationStart.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.RelocationFree(locationEnd, task.TaskNum); _basicService.LocationInfoService.Repository.UpdateData(locationStart); } else { locationStart.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.Repository.UpdateData(locationStart); } } _basicService.LocationInfoService.RelocationFree(locationEnd, task.TaskNum); task.TaskStatus = InTaskStatusEnum.RelocationFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent InboundTaskCancel(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); decimal beforeQuantity = 0; Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); CheckCompleted(stockInfo, locationInfo); stockInfo.StockStatus = StockStatusEmun.组盘暂存.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); if (locationInfo.Depth == 2) { _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); } _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InCancel.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent PalletInboundTaskCancel(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); if (locationInfo.Depth == 2) { _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); } _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InCancel.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent OutboundTaskCancel(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); decimal beforeQuantity = 0; Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_StockInfoDetail stockInfoDetail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == stockInfo.Id); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); stockInfoDetail.OutboundQuantity = beforeQuantity; _stockService.StockInfoService.Repository.UpdateData(stockInfo); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetail); int beforeStatus = locationInfo.LocationStatus; if (locationInfo.Depth == 2) { if (DepthTask(locationInfo) == false) { _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), true); } } locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = OutTaskStatusEnum.OutCancel.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) - beforeQuantity, StockChangeType.Outbound, task.TaskNum); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent PalletOutboundTaskCancel(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationInfo); int beforeStatus = locationInfo.LocationStatus; if (locationInfo.Depth == 2) { if (DepthTask(locationInfo) == false) { _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), true); } } locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt(); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); task.TaskStatus = OutTaskStatusEnum.OutCancel.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent RelocationTaskCancel(Dt_Task task) { try { _unitOfWorkManage.BeginTran(); Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); Dt_LocationInfo locationStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); locationEnd.LocationStatus= LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.RelocationFree(locationStart, task.TaskNum); _basicService.LocationInfoService.Repository.UpdateData(locationEnd); task.TaskStatus = InTaskStatusEnum.RelocationCancel.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public bool DepthTask(Dt_LocationInfo location) { if (location != null ) { Dt_LocationInfo locations = _locationInfoService.Repository.QueryFirst(x => x.RoadwayNo == location.RoadwayNo && x.Column == location.Column && x.Layer == location.Layer && x.Depth != location.Depth && x.Row != location.Row && (SqlFunc.Abs(x.Row - location.Row) == 1)); if (locations != null) { Dt_Task tasks = BaseDal.QueryFirst(x => x.SourceAddress == locations.LocationCode); return tasks != null ? true : false; } } return false; } public WebResponseContent GetTaskInfo() { WebResponseContent content = new WebResponseContent(); try { Expression> expression = x => true; if (!App.User.IsSuperAdmin) { expression = x => x.Creater == App.User.UserName; } var task = BaseDal.Db.Queryable().OrderByDescending(x => x.CreateDate).Take(10).Select(x => new Dt_Task { TaskNum = x.TaskNum, PalletCode=x.PalletCode, TaskType=x.TaskType,SourceAddress=x.SourceAddress,TargetAddress=x.TargetAddress }).ToList(); content = WebResponseContent.Instance.OK(data: task); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } } }