345 lines
15 KiB
C#
345 lines
15 KiB
C#
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上传状态失败");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|