cjy 4 months ago
commit a447056332

@ -25,7 +25,6 @@
<ItemGroup> <ItemGroup>
<Folder Include="Finance\Dtos\" /> <Folder Include="Finance\Dtos\" />
<Folder Include="Finance\Entity\" /> <Folder Include="Finance\Entity\" />
<Folder Include="Op\Interface\Task\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -429,6 +429,9 @@ public class FlowInstanceService : IFlowInstanceService
/// <param name="instance">运行实例</param> /// <param name="instance">运行实例</param>
protected virtual async Task RunCallbackAsync(FlowInstance instance) protected virtual async Task RunCallbackAsync(FlowInstance instance)
{ {
if (instance.CallbackURL.IsNullOrEmpty())
return;
//请求参数设置 //请求参数设置
var callback = new FlowCallback var callback = new FlowCallback
{ {

@ -0,0 +1,10 @@
namespace DS.WMS.Core.Op.Interface.TaskInteraction
{
/// <summary>
/// 海运出口交互任务
/// </summary>
public interface ISeaExportTaskService : ITaskService
{
}
}

@ -0,0 +1,34 @@
using DS.Module.Core;
using DS.WMS.Core.Flow.Dtos;
using DS.WMS.Core.Op.Dtos.TaskInteraction;
namespace DS.WMS.Core.Op.Interface.TaskInteraction
{
/// <summary>
/// 交互任务
/// </summary>
public interface ITaskService
{
/// <summary>
/// 创建关联任务
/// </summary>
/// <param name="request"></param>
/// <param name="useTransaction">是否使用事务</param>
/// <returns></returns>
Task<DataResult> CreateTaskAsync(TaskCreationRequest request, bool useTransaction = true);
/// <summary>
/// 设置任务状态
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
Task<DataResult> SetTaskStatusAsync(TaskUpdateRequest request);
/// <summary>
/// 审批完成回调更新
/// </summary>
/// <param name="callback">回调信息</param>
/// <returns></returns>
Task UpdateBusinessAsync(FlowCallback callback);
}
}

@ -1477,6 +1477,7 @@ namespace DS.WMS.Core.Op.Method
TypeCode = fileTypeCode, TypeCode = fileTypeCode,
TypeName = fileTypeName, TypeName = fileTypeName,
LinkId = boookId, LinkId = boookId,
OrgId = long.Parse(user.OrgId)
}; };
await tenantDb.Insertable<OpFile>(newFile).ExecuteCommandAsync(); await tenantDb.Insertable<OpFile>(newFile).ExecuteCommandAsync();

@ -1,28 +1,28 @@
using DS.Module.Core; using DS.Module.Core;
using DS.Module.Core.Extensions; using DS.Module.Core.Extensions;
using DS.WMS.Core.Fee.Method; using DS.Module.DjyServiceStatus;
using DS.WMS.Core.Flow.Dtos; using DS.WMS.Core.Flow.Dtos;
using DS.WMS.Core.Flow.Entity; using DS.WMS.Core.Flow.Entity;
using DS.WMS.Core.Flow.Interface; using DS.WMS.Core.Flow.Interface;
using DS.WMS.Core.Op.Dtos.TaskInteraction; using DS.WMS.Core.Op.Dtos.TaskInteraction;
using DS.WMS.Core.Op.Entity; using DS.WMS.Core.Op.Entity;
using DS.WMS.Core.Op.Entity.TaskInteraction; using DS.WMS.Core.Op.Entity.TaskInteraction;
using DS.WMS.Core.Op.Interface.TaskInteraction;
using DS.WMS.Core.Sys.Entity; using DS.WMS.Core.Sys.Entity;
using DS.WMS.Core.TaskPlat.Dtos; using DS.WMS.Core.TaskPlat.Dtos;
using DS.WMS.Core.TaskPlat.Interface;
using Masuit.Tools.Systems; using Masuit.Tools.Systems;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using SqlSugar; using Newtonsoft.Json.Linq;
namespace DS.WMS.Core.Op.Method.TaskInteraction namespace DS.WMS.Core.Op.Method.TaskInteraction
{ {
/// <summary> /// <summary>
/// 海运出口任务服务 /// 海运出口任务交互服务
/// </summary> /// </summary>
public class SeaExportTaskService : FeeServiceBase public class SeaExportTaskService : TaskService, ISeaExportTaskService
{ {
ITaskManageService taskService; readonly Lazy<IDjyServiceStatusService> djyService;
Lazy<IClientFlowInstanceService> flowService; readonly Lazy<IClientFlowInstanceService> flowService;
/// <summary> /// <summary>
/// 初始化 /// 初始化
@ -30,198 +30,193 @@ namespace DS.WMS.Core.Op.Method.TaskInteraction
/// <param name="provider"></param> /// <param name="provider"></param>
public SeaExportTaskService(IServiceProvider provider) : base(provider) public SeaExportTaskService(IServiceProvider provider) : base(provider)
{ {
taskService = provider.GetRequiredService<ITaskManageService>(); djyService = new Lazy<IDjyServiceStatusService>(provider.GetRequiredService<IDjyServiceStatusService>());
flowService = new Lazy<IClientFlowInstanceService>(provider.GetRequiredService<IClientFlowInstanceService>()); flowService = new Lazy<IClientFlowInstanceService>(provider.GetRequiredService<IClientFlowInstanceService>());
} }
/// <summary> /// <summary>
/// 创建关联任务 /// 当任务创建时调用
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="task"></param>
/// <returns></returns> /// <returns></returns>
public async Task<DataResult> CreateTaskAsync(TaskCreationRequest request) protected override async Task<DataResult> OnTaskCreated(BusinessTask task)
{ {
var task = await GetTaskAsync(request.BusinessId, request.BusinessType, request.TaskType); if (task.TaskType == TaskBaseTypeEnum.WAIT_ORDER_AUDIT)
if (task != null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Task_Exists));
long tenatId = long.Parse(User.TenantId);
string tenatName = Db.Queryable<SysTenant>().Where(x => x.Id == tenatId).Select(x => x.Name).First();
var info = new TaskManageOrderMessageInfo
{ {
Head = new TaskManageOrderMessageHeadInfo //待审核,需创建工作流
var template = await FindTemplateAsync(AuditType.SeaExport);
if (template == null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.TemplateNotFound));
var result = flowService.Value.CreateFlowInstance(new CreateFlowInstanceReq
{ {
GID = Guid.NewGuid().ToString(), BusinessId = task.BusinessId,
BSNO = request.BusinessId, BusinessType = BusinessType.OceanShippingExport,
MessageType = "WORK_FLOW_TASK", TemplateId = template.Id
SenderId = "WorkFlow", });
SenderName = "工作流平台",
ReceiverId = "TaskManage", if (result.Succeeded)
ReceiverName = "任务管理平台",
Version = "1.0",
RequestDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
RequestAction = "Add"
},
Main = new TaskManageOrderMessageMainInfo
{ {
TaskType = request.TaskType, var instance = result.Data as FlowInstance;
TaskSource = TaskSourceEnum.WORK_FLOW, task.FlowId = instance.Id;
TaskTitle = request.TaskTitle, await TenantDb.Updateable(task).UpdateColumns(x => x.FlowId).ExecuteCommandAsync();
TaskDesp = request.TaskDescription,
TaskUserId = User.UserId,
TaskUserName = User.UserName,
RecvUserId = User.UserId,
RecvUserName = User.UserName,
TaskTenatId = tenatId,
TaskTenatName = tenatName
} }
}; }
return DataResult.Success;
}
/// <summary>
/// 创建关联子任务
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<DataResult> CreateSubTaskAsync(IEnumerable<TaskCreationRequest> request)
{
long userId = long.Parse(User.UserId);
long tenatId = long.Parse(User.TenantId);
string tenatName = Db.Queryable<SysTenant>().Where(x => x.Id == tenatId).Select(x => x.Name).First();
var dt = DateTime.Now;
var taskList = new List<BusinessTask>();
if (info.Main.TaskTitle.IsNullOrEmpty()) var first = request.FirstOrDefault();
var biz = await TenantDb.Queryable<SeaExport>().Select(x => new
{ {
var biz = await TenantDb.Queryable<SeaExport>().Select(x => new x.Id,
x.MBLNO,
x.Vessel,
x.Voyno,
x.ETD,
}).FirstAsync(x => x.Id == first.BusinessId);
foreach (var item in request)
{
var info = new TaskManageOrderMessageInfo
{ {
x.Id, Head = new TaskManageOrderMessageHeadInfo
x.MBLNO, {
x.Vessel, GID = Guid.NewGuid().ToString(),
x.Voyno, BSNO = item.BusinessId,
x.ETD, MessageType = "WORK_FLOW_TASK",
}).FirstAsync(); SenderId = "WorkFlow",
SenderName = "工作流平台",
info.Main.TaskDesp = info.Main.TaskTitle = $"{request.TaskType.GetDescription()} {biz.Vessel} {biz.Voyno} ETD:{biz.ETD?.ToString("yyyy-MM-dd")} BLNo:{biz.MBLNO}"; ReceiverId = "TaskManage",
} ReceiverName = "任务管理平台",
Version = "1.0",
RequestDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
RequestAction = "Add"
},
Main = new TaskManageOrderMessageMainInfo
{
TaskType = item.TaskType,
TaskSource = TaskSourceEnum.WORK_FLOW,
TaskUserId = User.UserId,
TaskUserName = User.UserName,
RecvUserInfoList = [new RecvUserInfo { RecvUserId = long.Parse(User.UserId), RecvUserName = User.UserName }],
TaskTenatId = tenatId,
TaskTenatName = tenatName
}
};
info.Main.TaskDesp = info.Main.TaskTitle = $"{item.TaskType.GetDescription()} {biz.Vessel} {biz.Voyno} ETD:{biz.ETD?.ToString("yyyy-MM-dd")} BLNo:{biz.MBLNO}";
await TenantDb.Ado.BeginTranAsync(); var result = await ManagerService.InitTaskJob(info);
try
{
var result = await taskService.InitTaskJob(info);
if (!result.Succeeded) if (!result.Succeeded)
return result; return result;
task = new BusinessTask var task = new BusinessTask
{ {
BusinessId = request.BusinessId, BusinessId = item.BusinessId,
BusinessType = request.BusinessType, BusinessType = item.BusinessType,
TaskType = request.TaskType, TaskType = item.TaskType,
TaskStatus = TaskStatusEnum.Create, TaskStatus = TaskStatusEnum.Create,
CreateBy = long.Parse(User.UserId), CreateBy = userId,
CreateTime = DateTime.Now CreateTime = dt
}; };
task.NextType = GetNextType(task); taskList.Add(task);
await TenantDb.Insertable(task).ExecuteCommandAsync();
if (request.TaskType == TaskBaseTypeEnum.WAIT_ORDER_AUDIT)
{
//待审核,需创建工作流
var template = await FindTemplateAsync(AuditType.SeaExport);
if (template == null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.TemplateNotFound));
result = flowService.Value.CreateFlowInstance(new CreateFlowInstanceReq
{
BusinessId = request.BusinessId,
BusinessType = BusinessType.OceanShippingExport,
TemplateId = template.Id
});
if (result.Succeeded)
{
var instance = result.Data as FlowInstance;
task.FlowId = instance.Id;
await TenantDb.Updateable(task).UpdateColumns(x => x.FlowId).ExecuteCommandAsync();
}
}
await TenantDb.Ado.CommitTranAsync();
return DataResult.Success;
}
catch (Exception ex)
{
await TenantDb.Ado.RollbackTranAsync();
await ex.LogAsync(Db);
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
} }
await TenantDb.Insertable(taskList).ExecuteCommandAsync();
return DataResult.Success;
} }
/// <summary> /// <summary>
/// 设置任务状态 /// 当任务状态发生变化时调用
/// </summary> /// </summary>
/// <param name="request"></param> /// <param name="request"></param>
/// <returns></returns> /// <returns></returns>
public async Task<DataResult> UpdateTaskStatusAsync(TaskUpdateRequest request) protected override async Task OnTaskStatusChanged(TaskUpdateRequest request)
{ {
await TenantDb.Ado.BeginTranAsync(); //放舱结束,根据业务所选服务,生成子任务
try if (request.TaskType == TaskBaseTypeEnum.WAIT_SPACE_RELEASE)
{ {
var result = await taskService.SetTaskStatus(request.BusinessId, request.TaskType, request.TaskStatus, DateTime.Now); var list = await GetSubRequestAsync(request.BusinessId, request.BusinessType);
if (!result.Succeeded) await CreateSubTaskAsync(list);
return result;
//更新当前任务状态
BusinessTask task = await GetTaskAsync(request.BusinessId, request.BusinessType, request.TaskType);
if (task == null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData));
task.TaskStatus = request.TaskStatus;
await TenantDb.Updateable(task).UpdateColumns(x => x.TaskStatus).ExecuteCommandAsync();
//若存在下一任务,则创建
if (task.NextType.HasValue)
{
var req = new TaskCreationRequest
{
BusinessId = request.BusinessId,
BusinessType = request.BusinessType,
TaskType = task.NextType.Value
};
await CreateTaskAsync(req);
}
//放舱结束,根据业务所选服务,生成子任务
if (request.TaskType == TaskBaseTypeEnum.WAIT_SPACE_RELEASE)
{
}
return DataResult.Success;
} }
catch (Exception ex) }
internal async Task<TaskCreationRequest[]> GetSubRequestAsync(long id, BusinessType businessType)
{
var svcList = await GetServicesAsync(id);
var list = new TaskCreationRequest[svcList.Length];
for (int i = 0; i < svcList.Length; i++)
{ {
await TenantDb.Ado.RollbackTranAsync(); var dto = new TaskCreationRequest { BusinessId = id, BusinessType = businessType };
await ex.LogAsync(Db); var svcName = svcList[i];
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
if (svcName == "报关")
dto.TaskType = TaskBaseTypeEnum.WAIT_BAOGUAN;
else if (svcName == "订舱")
dto.TaskType = TaskBaseTypeEnum.WAIT_CANGDAN;
else if (svcName.Equals("VGM", StringComparison.OrdinalIgnoreCase))
dto.TaskType = TaskBaseTypeEnum.WAIT_VGM;
else if (svcName.Equals("AFR", StringComparison.OrdinalIgnoreCase))
dto.TaskType = TaskBaseTypeEnum.WAIT_AFR;
else if (svcName.Equals("AMS", StringComparison.OrdinalIgnoreCase))
dto.TaskType = TaskBaseTypeEnum.WAIT_AMS;
else if (svcName.Equals("ISF", StringComparison.OrdinalIgnoreCase))
dto.TaskType = TaskBaseTypeEnum.WAIT_ISF;
else if (svcName == "熏蒸")
dto.TaskType = TaskBaseTypeEnum.WAIT_XUNZHENG;
else if (svcName == "商检")
dto.TaskType = TaskBaseTypeEnum.WAIT_SHANGJIAN;
else if (svcName.Equals("COA证书", StringComparison.OrdinalIgnoreCase))
dto.TaskType = TaskBaseTypeEnum.WAIT_COA;
else if (svcName == "产地证")
dto.TaskType = TaskBaseTypeEnum.WAIT_CHANDIZHENG;
list[i] = dto;
} }
return list;
} }
internal async Task<string[]> GetServicesAsync(long id)
{
var result = await djyService.Value.GetServiceProjectList(
new EmbedQueryServiceProjectWithStatus { BusinessId = id.ToString() });
if (!result.success)
return [];
internal async Task<BusinessTask> GetTaskAsync(long id, BusinessType businessType, TaskBaseTypeEnum taskType) if (((JObject)result.data)["ext"] is not JArray extArray || extArray.Count == 0)
{ return [];
return await TenantDb.Queryable<BusinessTask>().FirstAsync(x =>
x.BusinessId == id && x.BusinessType == businessType && x.TaskType == taskType);
}
internal async Task<BusinessTask> GetCurrentTaskAsync(long id, BusinessType businessType) return extArray.Select(x => x["projectName"]?.Value<string>() ?? string.Empty).ToArray();
{
return await TenantDb.Queryable<BusinessTask>().Where(x => x.BusinessId == id && x.BusinessType == businessType)
.OrderByDescending(x => x.CreateTime).Take(1).FirstAsync();
} }
/// <summary> /// <summary>
/// 获取给定任务的下一任务类型 /// 审批完成回调更新
/// </summary> /// </summary>
/// <param name="current">任务信息</param> /// <param name="callback">回调信息</param>
/// <returns></returns> /// <returns></returns>
internal static TaskBaseTypeEnum? GetNextType(BusinessTask current) public override async Task UpdateBusinessAsync(FlowCallback callback)
{ {
if (current.TaskType == TaskBaseTypeEnum.WAIT_CHECKOUT_BILL) await base.UpdateBusinessAsync(callback);
return null;
//todo:海运出口主表信息
int currentTypeVal = (int)current.TaskType;
if (currentTypeVal >= 300) //300开始的枚举值为可选服务项目不存在前后关联性
return null;
return (TaskBaseTypeEnum)currentTypeVal++;
} }
} }
} }

@ -0,0 +1,249 @@
using DS.Module.Core;
using DS.Module.Core.Extensions;
using DS.WMS.Core.Fee.Method;
using DS.WMS.Core.Flow.Dtos;
using DS.WMS.Core.Op.Dtos.TaskInteraction;
using DS.WMS.Core.Op.Entity;
using DS.WMS.Core.Op.Entity.TaskInteraction;
using DS.WMS.Core.Op.Interface.TaskInteraction;
using DS.WMS.Core.Sys.Entity;
using DS.WMS.Core.TaskPlat.Dtos;
using DS.WMS.Core.TaskPlat.Interface;
using Masuit.Tools.Systems;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
namespace DS.WMS.Core.Op.Method.TaskInteraction
{
/// <summary>
/// 任务交互服务
/// </summary>
public class TaskService : FeeServiceBase, ITaskService
{
/// <summary>
/// 任务管理服务
/// </summary>
protected ITaskManageService ManagerService { get; private set; }
/// <summary>
/// 初始化
/// </summary>
/// <param name="provider"></param>
protected TaskService(IServiceProvider provider) : base(provider)
{
ManagerService = provider.GetRequiredService<ITaskManageService>();
}
/// <summary>
/// 创建关联任务
/// </summary>
/// <param name="request"></param>
/// <param name="useTransaction">是否使用事务</param>
/// <returns></returns>
public async Task<DataResult> CreateTaskAsync(TaskCreationRequest request, bool useTransaction = true)
{
var task = await GetTaskAsync(request.BusinessId, request.BusinessType, request.TaskType);
if (task != null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Task_Exists));
long tenatId = long.Parse(User.TenantId);
string tenatName = Db.Queryable<SysTenant>().Where(x => x.Id == tenatId).Select(x => x.Name).First();
var info = new TaskManageOrderMessageInfo
{
Head = new TaskManageOrderMessageHeadInfo
{
GID = Guid.NewGuid().ToString(),
BSNO = request.BusinessId,
MessageType = "WORK_FLOW_TASK",
SenderId = "WorkFlow",
SenderName = "工作流平台",
ReceiverId = "TaskManage",
ReceiverName = "任务管理平台",
Version = "1.0",
RequestDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
RequestAction = "Add"
},
Main = new TaskManageOrderMessageMainInfo
{
TaskType = request.TaskType,
TaskSource = TaskSourceEnum.WORK_FLOW,
TaskTitle = request.TaskTitle,
TaskDesp = request.TaskDescription,
TaskUserId = User.UserId,
TaskUserName = User.UserName,
RecvUserId = User.UserId,
RecvUserName = User.UserName,
TaskTenatId = tenatId,
TaskTenatName = tenatName
}
};
if (info.Main.TaskTitle.IsNullOrEmpty())
{
var biz = await TenantDb.Queryable<SeaExport>().Select(x => new
{
x.Id,
x.MBLNO,
x.Vessel,
x.Voyno,
x.ETD,
}).FirstAsync(x => x.Id == request.BusinessId);
info.Main.TaskDesp = info.Main.TaskTitle = $"{request.TaskType.GetDescription()} {biz.Vessel} {biz.Voyno} ETD:{biz.ETD?.ToString("yyyy-MM-dd")} BLNo:{biz.MBLNO}";
}
if (useTransaction)
await TenantDb.Ado.BeginTranAsync();
try
{
var result = await ManagerService.InitTaskJob(info);
if (!result.Succeeded)
return result;
task = new BusinessTask
{
BusinessId = request.BusinessId,
BusinessType = request.BusinessType,
TaskType = request.TaskType,
TaskStatus = TaskStatusEnum.Create,
CreateBy = long.Parse(User.UserId),
CreateTime = DateTime.Now
};
task.NextType = GetNextType(task);
await TenantDb.Insertable(task).ExecuteCommandAsync();
result = await OnTaskCreated(task);
if (!result.Succeeded)
return result;
if (useTransaction)
await TenantDb.Ado.CommitTranAsync();
return result;
}
catch (Exception ex)
{
if (useTransaction)
await TenantDb.Ado.RollbackTranAsync();
await ex.LogAsync(Db);
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
}
}
/// <summary>
/// 当任务创建时调用
/// </summary>
/// <param name="task"></param>
/// <returns></returns>
protected virtual Task<DataResult> OnTaskCreated(BusinessTask task)
{
return Task.FromResult(DataResult.Success);
}
/// <summary>
/// 设置任务状态
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<DataResult> SetTaskStatusAsync(TaskUpdateRequest request)
{
await TenantDb.Ado.BeginTranAsync();
try
{
var result = await ManagerService.SetTaskStatus(request.BusinessId, request.TaskType, request.TaskStatus, DateTime.Now);
if (!result.Succeeded)
return result;
//更新当前任务状态
BusinessTask task = await GetTaskAsync(request.BusinessId, request.BusinessType, request.TaskType);
if (task == null)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData));
if (task.TaskStatus!= request.TaskStatus)
await OnTaskStatusChanged(request);
task.TaskStatus = request.TaskStatus;
await TenantDb.Updateable(task).UpdateColumns(x => x.TaskStatus).ExecuteCommandAsync();
if (task.TaskStatus == TaskStatusEnum.Complete)
{
//若存在下一任务,则继续创建
if (task.NextType.HasValue)
{
var req = new TaskCreationRequest
{
BusinessId = request.BusinessId,
BusinessType = request.BusinessType,
TaskType = task.NextType.Value
};
await CreateTaskAsync(req, false);
}
}
await TenantDb.Ado.CommitTranAsync();
return DataResult.Success;
}
catch (Exception ex)
{
await TenantDb.Ado.RollbackTranAsync();
await ex.LogAsync(Db);
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
}
}
/// <summary>
/// 当任务状态发生变化时调用
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
protected virtual Task OnTaskStatusChanged(TaskUpdateRequest request)
{
return Task.CompletedTask;
}
/// <summary>
/// 审批完成回调更新
/// </summary>
/// <param name="callback">回调信息</param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"><paramref name="callback"/>为null时引发</exception>
public virtual async Task UpdateBusinessAsync(FlowCallback callback)
{
ArgumentNullException.ThrowIfNull(callback, nameof(callback));
//更新任务状态为完成
await SetTaskStatusAsync(new TaskUpdateRequest
{
BusinessId = callback.BusinessId,
BusinessType = callback.BusinessType.GetValueOrDefault(),
TaskType = TaskBaseTypeEnum.WAIT_ORDER_AUDIT,
TaskStatus = TaskStatusEnum.Complete
});
}
protected internal async Task<BusinessTask> GetTaskAsync(long id, BusinessType businessType, TaskBaseTypeEnum taskType)
{
return await TenantDb.Queryable<BusinessTask>().FirstAsync(x =>
x.BusinessId == id && x.BusinessType == businessType && x.TaskType == taskType);
}
/// <summary>
/// 获取给定任务的下一任务类型
/// </summary>
/// <param name="current">任务信息</param>
/// <returns></returns>
public static TaskBaseTypeEnum? GetNextType(BusinessTask current)
{
if (current.TaskType == TaskBaseTypeEnum.WAIT_CHECKOUT_BILL) //流程的最后一步
return null;
int currentTypeVal = (int)current.TaskType;
if (currentTypeVal >= 300) //300开始的枚举值为可选服务项目不存在前后关联性
return null;
return (TaskBaseTypeEnum)currentTypeVal++;
}
}
}

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using NLog; using NLog;
using NPOI.HPSF;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using SqlSugar; using SqlSugar;
using System; using System;
@ -133,6 +134,10 @@ namespace DS.WMS.Core.Sys.Method
string fileRoot = AppSetting.app(new string[] { "FileSettings", "BasePath" }); string fileRoot = AppSetting.app(new string[] { "FileSettings", "BasePath" });
string relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" }); string relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" });
/*
if (string.IsNullOrWhiteSpace(fileRoot))
fileRoot = _environment.WebRootPath;
if (!string.IsNullOrWhiteSpace(attachFileType)) if (!string.IsNullOrWhiteSpace(attachFileType))
relativePath += $"\\{attachFileType}"; relativePath += $"\\{attachFileType}";
@ -150,31 +155,54 @@ namespace DS.WMS.Core.Sys.Method
relativePath = relativePath.Replace("\\", "/"); relativePath = relativePath.Replace("\\", "/");
filePath = filePath.Replace("\\", "/"); filePath = filePath.Replace("\\", "/");
fileFullName = fileFullName.Replace("\\", "/"); fileFullName = fileFullName.Replace("\\", "/");
}*/
var dirAbs = string.Empty;
var fileRelaPath = string.Empty;
var fileAbsPath = string.Empty;
if (string.IsNullOrEmpty(fileRoot))
{
dirAbs = Path.Combine(_environment.WebRootPath ?? "", relativePath);
}
else
{
dirAbs = Path.Combine(fileRoot, relativePath);
} }
Logger.Log(NLog.LogLevel.Info, "批次={no} 生成文件保存路径完成 路由={filePath} 服务器系统={system}", batchNo, filePath, if (!Directory.Exists(dirAbs))
Directory.CreateDirectory(dirAbs);
// 先存库获取Id
var id = SnowFlakeSingle.Instance.NextId();
var fileSuffix = Path.GetExtension(fileName).ToLower(); // 文件后缀
var fileSaveName = $"{id}{fileSuffix}".ToLower();
fileRelaPath = Path.Combine(relativePath, fileSaveName).ToLower();
fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower();
Logger.Log(NLog.LogLevel.Info, "批次={no} 生成文件保存路径完成 路由={filePath} 服务器系统={system}", batchNo, fileAbsPath,
RuntimeInformation.OSDescription); RuntimeInformation.OSDescription);
//预先创建目录 //预先创建目录
if (!Directory.Exists(filePath)) if (!Directory.Exists(dirAbs))
{ {
Directory.CreateDirectory(filePath); Directory.CreateDirectory(dirAbs);
} }
await File.WriteAllBytesAsync(fileFullName, fileBytes); await File.WriteAllBytesAsync(fileAbsPath, fileBytes);
string bookFilePath = string.Empty; //string bookFilePath = string.Empty;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) //if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{ //{
bookFilePath = System.Text.RegularExpressions.Regex.Match(fileFullName, relativePath.Replace("/", "\\/") + ".*").Value; // bookFilePath = System.Text.RegularExpressions.Regex.Match(dirAbs, relativePath.Replace("/", "\\/") + ".*").Value;
} //}
else //else
{ //{
bookFilePath = System.Text.RegularExpressions.Regex.Match(fileFullName, relativePath.Replace("\\", "\\\\") + ".*").Value; // bookFilePath = System.Text.RegularExpressions.Regex.Match(dirAbs, relativePath.Replace("\\", "\\\\") + ".*").Value;
} //}
return DataResult<string>.Success(bookFilePath); return DataResult<string>.Success(fileSaveName);
} }
#region 转移文件 #region 转移文件
@ -195,6 +223,10 @@ namespace DS.WMS.Core.Sys.Method
string relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" }); string relativePath = AppSetting.app(new string[] { "FileSettings", "RelativePath" });
/*
if (string.IsNullOrWhiteSpace(fileRoot))
fileRoot = _environment.WebRootPath;
if (!string.IsNullOrWhiteSpace(attachFileType)) if (!string.IsNullOrWhiteSpace(attachFileType))
relativePath += $"\\{attachFileType}"; relativePath += $"\\{attachFileType}";
@ -213,14 +245,37 @@ namespace DS.WMS.Core.Sys.Method
filePath = filePath.Replace("\\", "/"); filePath = filePath.Replace("\\", "/");
fileFullName = fileFullName.Replace("\\", "/"); fileFullName = fileFullName.Replace("\\", "/");
} }
*/
Logger.Log(NLog.LogLevel.Info, $"批次={batchNo} 生成文件保存路径完成 路由={filePath} 服务器系统={RuntimeInformation.OSDescription}"); var dirAbs = string.Empty;
var fileRelaPath = string.Empty;
//预先创建目录 var fileAbsPath = string.Empty;
if (!Directory.Exists(filePath)) if (string.IsNullOrEmpty(fileRoot))
{ {
Directory.CreateDirectory(filePath); dirAbs = Path.Combine(_environment.WebRootPath ?? "", relativePath);
} }
else
{
dirAbs = Path.Combine(fileRoot, relativePath);
}
if (!Directory.Exists(dirAbs))
Directory.CreateDirectory(dirAbs);
// 先存库获取Id
var id = SnowFlakeSingle.Instance.NextId();
var fileSuffix = Path.GetExtension(sourceFilePath).ToLower(); // 文件后缀
var fileSaveName = $"{id}{fileSuffix}".ToLower();
fileRelaPath = Path.Combine(relativePath, fileSaveName).ToLower();
fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower();
Logger.Log(NLog.LogLevel.Info, $"批次={batchNo} 生成文件保存路径完成 路由={fileAbsPath} 服务器系统={RuntimeInformation.OSDescription}");
////预先创建目录
//if (!Directory.Exists(filePath))
//{
// Directory.CreateDirectory(filePath);
//}
if (sourceFilePath.StartsWith("http", StringComparison.OrdinalIgnoreCase) || if (sourceFilePath.StartsWith("http", StringComparison.OrdinalIgnoreCase) ||
sourceFilePath.StartsWith("https", StringComparison.OrdinalIgnoreCase)) sourceFilePath.StartsWith("https", StringComparison.OrdinalIgnoreCase))
@ -236,7 +291,7 @@ namespace DS.WMS.Core.Sys.Method
{ {
System.IO.FileStream file = new System.IO.FileStream(sourceFilePath, FileMode.Open, FileAccess.Read); System.IO.FileStream file = new System.IO.FileStream(sourceFilePath, FileMode.Open, FileAccess.Read);
using (var fileStream = File.Create(fileFullName)) using (var fileStream = File.Create(fileAbsPath))
{ {
await file.CopyToAsync(fileStream); await file.CopyToAsync(fileStream);
} }
@ -254,24 +309,24 @@ namespace DS.WMS.Core.Sys.Method
} }
catch (Exception delEx) catch (Exception delEx)
{ {
Logger.Log(NLog.LogLevel.Info, $"批次={batchNo} 删除文件异常 filepath={fileFullName} ex={delEx.Message}"); Logger.Log(NLog.LogLevel.Info, $"批次={batchNo} 删除文件异常 filepath={sourceFilePath} ex={delEx.Message}");
} }
} }
Logger.Log(NLog.LogLevel.Info, $"批次={batchNo} 完成文件保存 filepath={fileFullName}"); Logger.Log(NLog.LogLevel.Info, $"批次={batchNo} 完成文件保存 filepath={sourceFilePath}");
string bookFilePath = string.Empty; string bookFilePath = string.Empty;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) //if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{ //{
bookFilePath = System.Text.RegularExpressions.Regex.Match(fileFullName, relativePath.Replace("/", "\\/") + ".*").Value; // bookFilePath = System.Text.RegularExpressions.Regex.Match(fileFullName, relativePath.Replace("/", "\\/") + ".*").Value;
} //}
else //else
{ //{
bookFilePath = System.Text.RegularExpressions.Regex.Match(fileFullName, relativePath.Replace("\\", "\\\\") + ".*").Value; // bookFilePath = System.Text.RegularExpressions.Regex.Match(fileFullName, relativePath.Replace("\\", "\\\\") + ".*").Value;
} //}
return DataResult<string>.Success(bookFilePath); return DataResult<string>.Success(fileSaveName);
} }
#endregion #endregion
} }

@ -0,0 +1,60 @@
using System.Net;
using DS.Module.Core;
using DS.WMS.Core.Flow.Dtos;
using DS.WMS.Core.Op.Dtos.TaskInteraction;
using DS.WMS.Core.Op.Interface.TaskInteraction;
using Microsoft.AspNetCore.Mvc;
namespace DS.WMS.OpApi.Controllers
{
/// <summary>
/// 海运出口任务API
/// </summary>
public class SeaExportTaskController : ApiController
{
readonly ISeaExportTaskService taskService;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="service"></param>
public SeaExportTaskController(ISeaExportTaskService service)
{
taskService = service;
}
/// <summary>
/// 创建关联任务
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost, Route("CreateTask")]
public async Task<DataResult> CreateTaskAsync(TaskCreationRequest request)
{
return await taskService.CreateTaskAsync(request);
}
/// <summary>
/// 设置任务状态
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost, Route("SetTaskStatus")]
public async Task<DataResult> SetTaskStatusAsync(TaskUpdateRequest request)
{
return await taskService.SetTaskStatusAsync(request);
}
/// <summary>
/// 审批完成回调更新(无需客户端手动调用)
/// </summary>
/// <param name="callback">回调信息</param>
/// <returns></returns>
[HttpPost, Route("UpdateBusiness")]
public async Task<IActionResult> UpdateBusinessAsync(FlowCallback callback)
{
await taskService.UpdateBusinessAsync(callback);
return StatusCode((int)HttpStatusCode.NoContent);
}
}
}

@ -782,52 +782,24 @@
2024-07-24 14:14:41.8726 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config 2024-07-24 14:14:41.8726 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 14:14:41.8726 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile 2024-07-24 14:14:41.8726 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 14:14:41.8863 Info Configuration initialized. 2024-07-24 14:14:41.8863 Info Configuration initialized.
2024-07-24 17:43:01.5160 Info Registered target NLog.Targets.FileTarget(Name=allfile) 2024-07-25 09:55:08.3354 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 17:43:01.5361 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) 2024-07-25 09:55:08.3354 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 17:43:01.5361 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) 2024-07-25 09:55:08.3515 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 17:43:01.5528 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False 2024-07-25 09:55:08.3515 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 17:43:01.5595 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config 2024-07-25 09:55:08.3711 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 17:43:01.5595 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile 2024-07-25 09:55:08.3711 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 17:43:01.5595 Info Configuration initialized. 2024-07-25 09:55:08.3711 Info Configuration initialized.
2024-07-24 17:52:22.4155 Info Registered target NLog.Targets.FileTarget(Name=allfile) 2024-07-25 09:56:52.6865 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 17:52:22.4304 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) 2024-07-25 09:56:52.7029 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 17:52:22.4304 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) 2024-07-25 09:56:52.7029 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 17:52:22.4474 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False 2024-07-25 09:56:52.7214 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 17:52:22.4474 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config 2024-07-25 09:56:52.7280 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 17:52:22.4592 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile 2024-07-25 09:56:52.7280 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 17:52:22.4592 Info Configuration initialized. 2024-07-25 09:56:52.7280 Info Configuration initialized.
2024-07-24 18:18:28.4775 Info Registered target NLog.Targets.FileTarget(Name=allfile) 2024-07-25 10:04:30.5148 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 18:18:28.4775 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web) 2024-07-25 10:04:30.5293 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 18:18:28.4932 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console) 2024-07-25 10:04:30.5293 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 18:18:28.4932 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False 2024-07-25 10:04:30.5484 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 18:18:28.5125 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config 2024-07-25 10:04:30.5557 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=D:\Source\Repos\DS8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 18:18:28.5125 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile 2024-07-25 10:04:30.5557 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 18:18:28.5262 Info Configuration initialized. 2024-07-25 10:04:30.5557 Info Configuration initialized.
2024-07-24 18:26:06.2961 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 18:26:06.2961 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 18:26:06.3125 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 18:26:06.3125 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 18:26:06.3294 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 18:26:06.3294 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 18:26:06.3294 Info Configuration initialized.
2024-07-24 19:21:42.6540 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 19:21:42.6670 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 19:21:42.6670 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 19:21:42.6832 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 19:21:42.6832 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 19:21:42.6949 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 19:21:42.6949 Info Configuration initialized.
2024-07-24 19:22:50.9145 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 19:22:50.9296 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 19:22:50.9296 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 19:22:50.9498 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 19:22:50.9610 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 19:22:50.9610 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 19:22:50.9610 Info Configuration initialized.
2024-07-24 19:24:05.3244 Info Registered target NLog.Targets.FileTarget(Name=allfile)
2024-07-24 19:24:05.3762 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
2024-07-24 19:24:05.3816 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
2024-07-24 19:24:05.3816 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.2.8.2366. Product version: 5.2.8+f586f1341c46fa38aaaff4c641e7f0fa7e813943. GlobalAssemblyCache: False
2024-07-24 19:24:05.4053 Info Validating config: TargetNames=console, ownFile-web, ConfigItems=54, FilePath=E:\MyCode\Dongsheng8\ds-wms-service\DS.WMS.OpApi\bin\Debug\net8.0\nlog.config
2024-07-24 19:24:05.4053 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
2024-07-24 19:24:05.4155 Info Configuration initialized.

@ -28,7 +28,7 @@ public class TaskManageController : ApiController
/// <returns>返回回执</returns> /// <returns>返回回执</returns>
[HttpPost("CreateTaskJob")] [HttpPost("CreateTaskJob")]
[ApiUser(ApiCode = "BCTaskManage"), AllowAnonymous] [ApiUser(ApiCode = "BCTaskManage"), AllowAnonymous]
public async Task<DataResult> CreateTaskJob(TaskManageOrderMessageInfo info) public async Task<DataResult<object>> CreateTaskJob(TaskManageOrderMessageInfo info)
{ {
var result = await taskManageService.InitTaskJob(info); var result = await taskManageService.InitTaskJob(info);
return result; return result;
@ -43,7 +43,7 @@ public class TaskManageController : ApiController
/// <returns>返回回执</returns> /// <returns>返回回执</returns>
[HttpPost("CreateBCTaskJob")] [HttpPost("CreateBCTaskJob")]
[ApiUser(ApiCode = "BCTaskManage"), AllowAnonymous] [ApiUser(ApiCode = "BCTaskManage"), AllowAnonymous]
public async Task<DataResult> CreateBCTaskJob(IFormFile file, IFormFile modifyFile, [FromForm] string jsonData) public async Task<DataResult<object>> CreateBCTaskJob(IFormFile file, IFormFile modifyFile, [FromForm] string jsonData)
{ {
TaskManageOrderMessageInfo? info = JsonConvert.DeserializeObject<TaskManageOrderMessageInfo>(jsonData); TaskManageOrderMessageInfo? info = JsonConvert.DeserializeObject<TaskManageOrderMessageInfo>(jsonData);
if (info == null) if (info == null)

Loading…
Cancel
Save