Files
ww-jst/wmsjst/JSMachine.WMS.Job/Job/XinRongErpJob.cs
T
2026-09-02 16:31:50 +08:00

345 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<IERPTaskService>();
private static readonly IAGVTaskService AGVTaskService = GlobalServericeProvidor.GetService<IAGVTaskService>();
private static readonly IPaperStorageService ErpService = GlobalServericeProvidor.GetService<IPaperStorageService>();
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<AGVTaskDto> 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;
}
}
}
/// <summary>
/// 生产退库数据上传
/// </summary>
/// <param name="agvTask"></param>
/// <param name="erpTask"></param>
/// <param name="alreadyUploadNum"></param>
/// <returns></returns>
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);
}
}
/// <summary>
/// 销售出库数据上传
/// </summary>
/// <param name="agvTask"></param>
/// <param name="erpTask"></param>
/// <param name="alreadyUploadNum"></param>
/// <returns></returns>
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);
}
}
/// <summary>
/// Pda入库数据上传
/// </summary>
/// <param name="agvTask"></param>
/// <returns></returns>
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);
}
}
/// <summary>
/// 处理调用Erp接口,后Wms后续业务
/// </summary>
/// <param name="agvTask"></param>
/// <param name="erpTask"></param>
/// <param name="erpReulst"></param>
/// <param name="num"></param>
/// <returns></returns>
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上传状态失败");
}
}
}
}
}