using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.App.IService; using JSMachine.WMS.Common; using JSMachine.WMS.Infrastructure; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.Job.Enum; using JSMachine.WMS.Job.JobAttributes; using JSMachine.WMS.RPC.ErpRPC.Dto.In; using JSMachine.WMS.RPC.ErpRPC.Dto.In.XRBusinessResult; using JSMachine.WMS.RPC.ErpRPC.Dto.Out.XRBusinessResult; using JSMachine.WMS.RPC.ErpRPC.IService; using Quartz; using SqlSugar; namespace JSMachine.WMS.Job.Job { [DisallowConcurrentExecution] [PersistJobDataAfterExecution] [Job(Name = nameof(XinRongErpJob) , Group = nameof(XinRongErpJob) + "_Group" , Description = "新荣Erp数据上传作业" , ScheduleType = ScheduleType.Simple , IntervalMilliSeconds = 2000 , RepeatCount = 0 , StartTimeStr = null)] public class XinRongErpJob : IJob { private static readonly IERPTaskService ErpTaskService = GlobalServericeProvidor.GetService(); private static readonly IAGVTaskService AGVTaskService = GlobalServericeProvidor.GetService(); private static readonly IPaperStorageService ErpService = GlobalServericeProvidor.GetService(); protected static readonly int erpUploadBefore = Global.AppSettings.ErpConfig.ErpUploadBefore; protected static readonly int retryNum = Global.AppSettings.ErpConfig.RetryNum; public async Task Execute(IJobExecutionContext context) { List agvTaskList = await AGVTaskService.GetListByExpression(p => p.CreationTime >= DateTime.Now.AddDays(erpUploadBefore) && (p.TaskType == TaskTypeEnum.PdaIn || p.TaskType == TaskTypeEnum.TransferStockIn || p.TaskType == TaskTypeEnum.SaleOut || p.TaskType == TaskTypeEnum.ProductionOut) && (p.ErpUploadStatus == ErpUploadStatusEnum.WaittingToUpload || p.ErpUploadStatus == ErpUploadStatusEnum.UploadFailed) && p.TaskStatus == TaskStatusEnum.Completed && p.RetryNum < retryNum); if (agvTaskList.Count <= 0) { return; } agvTaskList = agvTaskList.OrderBy(p => p.CreationTime).ToList(); foreach (AGVTaskDto agvTask in agvTaskList) { ERPTaskDto erpTask = await ErpTaskService.GetSingalByExpression(p => p.Id == agvTask.ErpTaskId); if (erpTask == null) { return; } //已上传给Erp的数量 var alreadyUploadNum = erpTask.AlreadyUploadNum; switch (agvTask.TaskType) { case TaskTypeEnum.MachineHandIn: break; case TaskTypeEnum.PdaIn: await UploadDataIn(agvTask, erpTask); break; case TaskTypeEnum.TransferStockIn: await UploadDataIn(agvTask, erpTask); break; case TaskTypeEnum.SaleOut: await UploadDataSaleOut(agvTask, erpTask, alreadyUploadNum); break; case TaskTypeEnum.ProductionOut: await UploadDataProductionOut(agvTask, erpTask, alreadyUploadNum); break; default: break; } } } /// /// 生产退库数据上传 /// /// /// /// /// private static async Task UploadDataProductionOut(AGVTaskDto agvTask, ERPTaskDto erpTask, int alreadyUploadNum) { //if (alreadyUploadNum < (erpTask.ErpOrderNum - erpTask.ErpCancelNum)) //{ // if (alreadyUploadNum + agvTask.MateriaNum <= (erpTask.ErpOrderNum - erpTask.ErpCancelNum)) // { // var param = new ErpProduceOutParam // { // produceReturnCode = erpTask.ProduceReturnCode, // barCode = erpTask.BarCode, // materiaName = erpTask.MateriaName, // materiaBatch = erpTask.MateriaBatch, // materiaCode = erpTask.MateriaCode, // num = agvTask.MateriaNum // }; // XRResultDto erpReulst = await ErpService.AddProduceOut(param); // await HandErpUploadResult(agvTask, erpTask, erpReulst, param.num); // } // else // { // var param = new ErpProduceOutParam // { // produceReturnCode = erpTask.ProduceReturnCode, // barCode = erpTask.BarCode, // materiaName = erpTask.MateriaName, // materiaBatch = erpTask.MateriaBatch, // materiaCode = erpTask.MateriaCode, // num = erpTask.ErpOrderNum - alreadyUploadNum // }; // XRResultDto erpReulst = await ErpService.AddProduceOut(param); // await HandErpUploadResult(agvTask, erpTask, erpReulst, param.num); // } //} //else //{ // agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadSuccess; // agvTask.LastModifiedTime = DateTime.Now; // agvTask.ErpReturnMsg = "已上传数量等于订单数"; // agvTask.RetryNum = retryNum; // await AGVTaskService.EditSingal(agvTask); // erpTask.AlreadyUploadNum = erpTask.ErpOrderNum; // erpTask.TaskStatus = TaskStatusEnum.Completed; // await ErpTaskService.EditSingal(erpTask); //} if (alreadyUploadNum < (erpTask.ErpOrderNum - erpTask.ErpCancelNum)) { var param = new ErpProduceOutParam { produceReturnCode = erpTask.ProduceReturnCode, barCode = agvTask.BarCode, materiaName = agvTask.MateriaName, materiaBatch = agvTask.MateriaBatch, materiaCode = agvTask.MateriaCode, num = agvTask.MateriaNum }; XRResultDto erpReulst = await ErpService.AddProduceOut(param); await HandErpUploadResult(agvTask, erpTask, erpReulst, param.num); } else { if (alreadyUploadNum > erpTask.ErpOrderNum - erpTask.ErpCancelNum) { agvTask.ErpReturnMsg = "请注意:已上传数量大于订单数"; } agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadSuccess; agvTask.LastModifiedTime = DateTime.Now; agvTask.RetryNum = retryNum; await AGVTaskService.EditSingal(agvTask); erpTask.AlreadyUploadNum = alreadyUploadNum; erpTask.TaskStatus = TaskStatusEnum.Completed; await ErpTaskService.EditSingal(erpTask); } } /// /// 销售出库数据上传 /// /// /// /// /// private static async Task UploadDataSaleOut(AGVTaskDto agvTask, ERPTaskDto erpTask, int alreadyUploadNum) { //if (alreadyUploadNum < (erpTask.ErpOrderNum - erpTask.ErpCancelNum)) //{ // if (alreadyUploadNum + agvTask.MateriaNum <= (erpTask.ErpOrderNum - erpTask.ErpCancelNum)) // { // var param = new ErpSaleOutParam // { // saleNo = erpTask.SaleNo, // barCode = agvTask.BarCode, // materiaCode = agvTask.MateriaCode, // materiaBatch = agvTask.MateriaBatch, // num = agvTask.MateriaNum // }; // XRResultDto erpReulst = await ErpService.AddSaleOut(param); // await HandErpUploadResult(agvTask, erpTask, erpReulst, param.num); // } // else // { // var param = new ErpSaleOutParam // { // saleNo = erpTask.SaleNo, // barCode = agvTask.BarCode, // materiaCode = agvTask.MateriaCode, // materiaBatch = agvTask.MateriaBatch, // num = erpTask.ErpOrderNum - alreadyUploadNum // }; // XRResultDto erpReulst = await ErpService.AddSaleOut(param); // await HandErpUploadResult(agvTask, erpTask, erpReulst, param.num); // } //} //else //{ // agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadSuccess; // agvTask.LastModifiedTime = DateTime.Now; // agvTask.ErpReturnMsg = "已上传数量等于订单数"; // agvTask.RetryNum = retryNum; // await AGVTaskService.EditSingal(agvTask); // erpTask.AlreadyUploadNum = erpTask.ErpOrderNum; // erpTask.TaskStatus = TaskStatusEnum.Completed; // await ErpTaskService.EditSingal(erpTask); //} if (alreadyUploadNum < (erpTask.ErpOrderNum - erpTask.ErpCancelNum)) { var param = new StockOutParam { saleNo = erpTask.SaleNo, barCode = agvTask.BarCode, materiaCode = agvTask.MateriaCode, materiaBatch = agvTask.MateriaBatch, num = agvTask.MateriaNum }; XRResultDto erpReulst = await ErpService.AddSaleOut(param); await HandErpUploadResult(agvTask, erpTask, erpReulst, param.num); } else { if (alreadyUploadNum > erpTask.ErpOrderNum - erpTask.ErpCancelNum) { agvTask.ErpReturnMsg = "请注意:已上传数量大于订单数"; } agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadSuccess; agvTask.LastModifiedTime = DateTime.Now; agvTask.RetryNum = retryNum; await AGVTaskService.EditSingal(agvTask); erpTask.AlreadyUploadNum = alreadyUploadNum; erpTask.TaskStatus = TaskStatusEnum.Completed; await ErpTaskService.EditSingal(erpTask); } } /// /// Pda入库数据上传 /// /// /// private static async Task UploadDataIn(AGVTaskDto agvTask, ERPTaskDto erpTask) { //入库:一个合格证号,只能成功上传一次Erp //var agvTaskList = await AGVTaskService.GetListByExpression(p => p.BarCode == agvTask.BarCode && p.ErpUploadStatus == ErpUploadStatusEnum.UploadSuccess); //if (!agvTaskList.IsNullOrEmpty()) //{ // LogHelper.Error($"合格证:{agvTask.BarCode},AgvTask任务Id:{agvTask.Id} 入库信息,已经上传到Erp,不能重复上传!"); //} //else { var param = new ErpProduceInParam { barCode = agvTask.BarCode, materiaName = agvTask.MateriaName, materiaBatch = agvTask.MateriaBatch, materiaCode = agvTask.MateriaCode, materiaNum = agvTask.MateriaNum }; XRResultDto erpReulst = await ErpService.AddProduceIn(param); await HandErpUploadResult(agvTask, erpTask, erpReulst, param.materiaNum); } } /// /// 处理调用Erp接口,后Wms后续业务 /// /// /// /// /// /// private static async Task HandErpUploadResult(AGVTaskDto agvTask, ERPTaskDto erpTask, XRResultDto erpReulst, int num) { if (erpReulst.success) { agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadSuccess; agvTask.LastModifiedTime = DateTime.Now; agvTask.ErpReturnMsg = erpReulst.message; agvTask.RetryNum += 1; bool bRet = await AGVTaskService.EditSingal(agvTask); if (!bRet) { agvTask.RetryNum++; LogHelper.Error($"更新ID为{agvTask.Id}的agvTask的Erp上传状态失败"); } else { erpTask.AlreadyUploadNum += num; erpTask.LastModifiedTime = DateTime.Now; await ErpTaskService.EditSingalWithSpecificCols(erpTask, ["AlreadyUploadNum", "LastModifiedTime"]); } } //处理网络不通或超时 else if (erpReulst == null) { agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadFailed; agvTask.LastModifiedTime = DateTime.Now; agvTask.ErpReturnMsg = "访问Erp连接超时"; agvTask.RetryNum = 0; bool bRet = await AGVTaskService.EditSingal(agvTask); if (!bRet) { LogHelper.Error($"更新ID为{agvTask.Id}的agvTask的Erp上传状态失败"); } } else { agvTask.ErpUploadStatus = ErpUploadStatusEnum.UploadFailed; agvTask.LastModifiedTime = DateTime.Now; agvTask.ErpReturnMsg = erpReulst.errors; agvTask.RetryNum += 1; bool bRet = await AGVTaskService.EditSingal(agvTask); if (!bRet) { agvTask.RetryNum++; LogHelper.Error($"更新ID为{agvTask.Id}的agvTask的Erp上传状态失败"); } } } } }