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上传状态失败");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|