Files

345 lines
15 KiB
C#
Raw Permalink Normal View History

2026-09-02 16:31:50 +08:00
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上传状态失败");
}
}
}
}
}