diff --git a/ds-wms-service/DS.WMS.Core/DS.WMS.Core.csproj b/ds-wms-service/DS.WMS.Core/DS.WMS.Core.csproj
index 5249b636..29d62b37 100644
--- a/ds-wms-service/DS.WMS.Core/DS.WMS.Core.csproj
+++ b/ds-wms-service/DS.WMS.Core/DS.WMS.Core.csproj
@@ -25,7 +25,6 @@
-
diff --git a/ds-wms-service/DS.WMS.Core/Flow/Method/FlowInstanceService.cs b/ds-wms-service/DS.WMS.Core/Flow/Method/FlowInstanceService.cs
index eea7a61c..42448271 100644
--- a/ds-wms-service/DS.WMS.Core/Flow/Method/FlowInstanceService.cs
+++ b/ds-wms-service/DS.WMS.Core/Flow/Method/FlowInstanceService.cs
@@ -429,6 +429,9 @@ public class FlowInstanceService : IFlowInstanceService
/// 运行实例
protected virtual async Task RunCallbackAsync(FlowInstance instance)
{
+ if (instance.CallbackURL.IsNullOrEmpty())
+ return;
+
//请求参数设置
var callback = new FlowCallback
{
diff --git a/ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ISeaExportTaskService.cs b/ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ISeaExportTaskService.cs
new file mode 100644
index 00000000..24116fef
--- /dev/null
+++ b/ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ISeaExportTaskService.cs
@@ -0,0 +1,10 @@
+namespace DS.WMS.Core.Op.Interface.TaskInteraction
+{
+ ///
+ /// 海运出口交互任务
+ ///
+ public interface ISeaExportTaskService : ITaskService
+ {
+
+ }
+}
diff --git a/ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ITaskService.cs b/ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ITaskService.cs
new file mode 100644
index 00000000..c412c529
--- /dev/null
+++ b/ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ITaskService.cs
@@ -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
+{
+ ///
+ /// 交互任务
+ ///
+ public interface ITaskService
+ {
+ ///
+ /// 创建关联任务
+ ///
+ ///
+ /// 是否使用事务
+ ///
+ Task CreateTaskAsync(TaskCreationRequest request, bool useTransaction = true);
+
+ ///
+ /// 设置任务状态
+ ///
+ ///
+ ///
+ Task SetTaskStatusAsync(TaskUpdateRequest request);
+
+ ///
+ /// 审批完成回调更新
+ ///
+ /// 回调信息
+ ///
+ Task UpdateBusinessAsync(FlowCallback callback);
+ }
+}
diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/SeaExportTaskService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/SeaExportTaskService.cs
index 96ba3f12..eb05b84a 100644
--- a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/SeaExportTaskService.cs
+++ b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/SeaExportTaskService.cs
@@ -1,28 +1,28 @@
using DS.Module.Core;
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.Entity;
using DS.WMS.Core.Flow.Interface;
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;
+using Newtonsoft.Json.Linq;
namespace DS.WMS.Core.Op.Method.TaskInteraction
{
///
- /// 海运出口任务服务
+ /// 海运出口任务交互服务
///
- public class SeaExportTaskService : FeeServiceBase
+ public class SeaExportTaskService : TaskService, ISeaExportTaskService
{
- ITaskManageService taskService;
- Lazy flowService;
+ readonly Lazy djyService;
+ readonly Lazy flowService;
///
/// 初始化
@@ -30,198 +30,193 @@ namespace DS.WMS.Core.Op.Method.TaskInteraction
///
public SeaExportTaskService(IServiceProvider provider) : base(provider)
{
- taskService = provider.GetRequiredService();
+ djyService = new Lazy(provider.GetRequiredService());
flowService = new Lazy(provider.GetRequiredService());
}
///
- /// 创建关联任务
+ /// 当任务创建时调用
///
- ///
+ ///
///
- public async Task CreateTaskAsync(TaskCreationRequest request)
+ protected override async Task OnTaskCreated(BusinessTask task)
{
- 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().Where(x => x.Id == tenatId).Select(x => x.Name).First();
- var info = new TaskManageOrderMessageInfo
+ if (task.TaskType == TaskBaseTypeEnum.WAIT_ORDER_AUDIT)
{
- 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(),
- 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
+ BusinessId = task.BusinessId,
+ BusinessType = BusinessType.OceanShippingExport,
+ TemplateId = template.Id
+ });
+
+ if (result.Succeeded)
{
- 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
+ var instance = result.Data as FlowInstance;
+ task.FlowId = instance.Id;
+ await TenantDb.Updateable(task).UpdateColumns(x => x.FlowId).ExecuteCommandAsync();
}
- };
+ }
+
+ return DataResult.Success;
+ }
+
+ ///
+ /// 创建关联子任务
+ ///
+ ///
+ ///
+ public async Task CreateSubTaskAsync(IEnumerable request)
+ {
+ long userId = long.Parse(User.UserId);
+ long tenatId = long.Parse(User.TenantId);
+ string tenatName = Db.Queryable().Where(x => x.Id == tenatId).Select(x => x.Name).First();
+ var dt = DateTime.Now;
+ var taskList = new List();
- if (info.Main.TaskTitle.IsNullOrEmpty())
+ var first = request.FirstOrDefault();
+ var biz = await TenantDb.Queryable().Select(x => new
{
- var biz = await TenantDb.Queryable().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,
- x.MBLNO,
- x.Vessel,
- x.Voyno,
- x.ETD,
- }).FirstAsync();
-
- info.Main.TaskDesp = info.Main.TaskTitle = $"{request.TaskType.GetDescription()} {biz.Vessel} {biz.Voyno} ETD:{biz.ETD?.ToString("yyyy-MM-dd")} BLNo:{biz.MBLNO}";
- }
+ Head = new TaskManageOrderMessageHeadInfo
+ {
+ GID = Guid.NewGuid().ToString(),
+ BSNO = item.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 = 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();
- try
- {
- var result = await taskService.InitTaskJob(info);
+ var result = await ManagerService.InitTaskJob(info);
if (!result.Succeeded)
return result;
- task = new BusinessTask
+ var task = new BusinessTask
{
- BusinessId = request.BusinessId,
- BusinessType = request.BusinessType,
- TaskType = request.TaskType,
+ BusinessId = item.BusinessId,
+ BusinessType = item.BusinessType,
+ TaskType = item.TaskType,
TaskStatus = TaskStatusEnum.Create,
- CreateBy = long.Parse(User.UserId),
- CreateTime = DateTime.Now
+ CreateBy = userId,
+ CreateTime = dt
};
- task.NextType = GetNextType(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));
+ taskList.Add(task);
}
+
+ await TenantDb.Insertable(taskList).ExecuteCommandAsync();
+ return DataResult.Success;
}
///
- /// 设置任务状态
+ /// 当任务状态发生变化时调用
///
///
///
- public async Task 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);
- if (!result.Succeeded)
- 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;
+ var list = await GetSubRequestAsync(request.BusinessId, request.BusinessType);
+ await CreateSubTaskAsync(list);
}
- catch (Exception ex)
+ }
+
+ internal async Task 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();
- await ex.LogAsync(Db);
- return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
+ var dto = new TaskCreationRequest { BusinessId = id, BusinessType = businessType };
+ var svcName = svcList[i];
+
+ 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 GetServicesAsync(long id)
+ {
+ var result = await djyService.Value.GetServiceProjectList(
+ new EmbedQueryServiceProjectWithStatus { BusinessId = id.ToString() });
+ if (!result.success)
+ return [];
- internal async Task GetTaskAsync(long id, BusinessType businessType, TaskBaseTypeEnum taskType)
- {
- return await TenantDb.Queryable().FirstAsync(x =>
- x.BusinessId == id && x.BusinessType == businessType && x.TaskType == taskType);
- }
+ if (((JObject)result.data)["ext"] is not JArray extArray || extArray.Count == 0)
+ return [];
- internal async Task GetCurrentTaskAsync(long id, BusinessType businessType)
- {
- return await TenantDb.Queryable().Where(x => x.BusinessId == id && x.BusinessType == businessType)
- .OrderByDescending(x => x.CreateTime).Take(1).FirstAsync();
+ return extArray.Select(x => x["projectName"]?.Value() ?? string.Empty).ToArray();
}
///
- /// 获取给定任务的下一任务类型
+ /// 审批完成回调更新
///
- /// 任务信息
+ /// 回调信息
///
- internal static TaskBaseTypeEnum? GetNextType(BusinessTask current)
+ public override async Task UpdateBusinessAsync(FlowCallback callback)
{
- if (current.TaskType == TaskBaseTypeEnum.WAIT_CHECKOUT_BILL)
- return null;
+ await base.UpdateBusinessAsync(callback);
+
+ //todo:海运出口主表信息
- int currentTypeVal = (int)current.TaskType;
- if (currentTypeVal >= 300) //300开始的枚举值为可选服务项目,不存在前后关联性
- return null;
- return (TaskBaseTypeEnum)currentTypeVal++;
}
+
}
}
diff --git a/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs
new file mode 100644
index 00000000..bb73f3cb
--- /dev/null
+++ b/ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs
@@ -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
+{
+ ///
+ /// 任务交互服务
+ ///
+ public class TaskService : FeeServiceBase, ITaskService
+ {
+ ///
+ /// 任务管理服务
+ ///
+ protected ITaskManageService ManagerService { get; private set; }
+
+ ///
+ /// 初始化
+ ///
+ ///
+ protected TaskService(IServiceProvider provider) : base(provider)
+ {
+ ManagerService = provider.GetRequiredService();
+ }
+
+ ///
+ /// 创建关联任务
+ ///
+ ///
+ /// 是否使用事务
+ ///
+ public async Task 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().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().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));
+ }
+ }
+
+ ///
+ /// 当任务创建时调用
+ ///
+ ///
+ ///
+ protected virtual Task OnTaskCreated(BusinessTask task)
+ {
+ return Task.FromResult(DataResult.Success);
+ }
+
+ ///
+ /// 设置任务状态
+ ///
+ ///
+ ///
+ public async Task 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));
+ }
+ }
+
+ ///
+ /// 当任务状态发生变化时调用
+ ///
+ ///
+ ///
+ protected virtual Task OnTaskStatusChanged(TaskUpdateRequest request)
+ {
+ return Task.CompletedTask;
+ }
+
+ ///
+ /// 审批完成回调更新
+ ///
+ /// 回调信息
+ ///
+ /// 为null时引发
+ 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 GetTaskAsync(long id, BusinessType businessType, TaskBaseTypeEnum taskType)
+ {
+ return await TenantDb.Queryable().FirstAsync(x =>
+ x.BusinessId == id && x.BusinessType == businessType && x.TaskType == taskType);
+ }
+
+ ///
+ /// 获取给定任务的下一任务类型
+ ///
+ /// 任务信息
+ ///
+ 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++;
+ }
+ }
+}
diff --git a/ds-wms-service/DS.WMS.OpApi/Controllers/SeaExportTaskController.cs b/ds-wms-service/DS.WMS.OpApi/Controllers/SeaExportTaskController.cs
new file mode 100644
index 00000000..0e2da99d
--- /dev/null
+++ b/ds-wms-service/DS.WMS.OpApi/Controllers/SeaExportTaskController.cs
@@ -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
+{
+ ///
+ /// 海运出口任务API
+ ///
+ public class SeaExportTaskController : ApiController
+ {
+ readonly ISeaExportTaskService taskService;
+
+ ///
+ /// 构造函数
+ ///
+ ///
+ public SeaExportTaskController(ISeaExportTaskService service)
+ {
+ taskService = service;
+ }
+
+ ///
+ /// 创建关联任务
+ ///
+ ///
+ ///
+ [HttpPost, Route("CreateTask")]
+ public async Task CreateTaskAsync(TaskCreationRequest request)
+ {
+ return await taskService.CreateTaskAsync(request);
+ }
+
+ ///
+ /// 设置任务状态
+ ///
+ ///
+ ///
+ [HttpPost, Route("SetTaskStatus")]
+ public async Task SetTaskStatusAsync(TaskUpdateRequest request)
+ {
+ return await taskService.SetTaskStatusAsync(request);
+ }
+
+ ///
+ /// 审批完成回调更新(无需客户端手动调用)
+ ///
+ /// 回调信息
+ ///
+ [HttpPost, Route("UpdateBusiness")]
+ public async Task UpdateBusinessAsync(FlowCallback callback)
+ {
+ await taskService.UpdateBusinessAsync(callback);
+ return StatusCode((int)HttpStatusCode.NoContent);
+ }
+ }
+}
diff --git a/ds-wms-service/DS.WMS.OpApi/Logs/internal-nlog.txt b/ds-wms-service/DS.WMS.OpApi/Logs/internal-nlog.txt
index f75be20e..2d301b3f 100644
--- a/ds-wms-service/DS.WMS.OpApi/Logs/internal-nlog.txt
+++ b/ds-wms-service/DS.WMS.OpApi/Logs/internal-nlog.txt
@@ -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 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 17:43:01.5160 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-24 17:43:01.5361 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-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-24 17:43:01.5595 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-24 17:52:22.4155 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-24 17:52:22.4304 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-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-24 17:52:22.4592 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-24 18:18:28.4775 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-24 18:18:28.4932 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-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-24 18:18:28.5125 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-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.
+2024-07-25 09:55:08.3354 Info Registered target NLog.Targets.FileTarget(Name=allfile)
+2024-07-25 09:55:08.3354 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
+2024-07-25 09:55:08.3515 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
+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-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-25 09:55:08.3711 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
+2024-07-25 09:55:08.3711 Info Configuration initialized.
+2024-07-25 09:56:52.6865 Info Registered target NLog.Targets.FileTarget(Name=allfile)
+2024-07-25 09:56:52.7029 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
+2024-07-25 09:56:52.7029 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
+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-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-25 09:56:52.7280 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
+2024-07-25 09:56:52.7280 Info Configuration initialized.
+2024-07-25 10:04:30.5148 Info Registered target NLog.Targets.FileTarget(Name=allfile)
+2024-07-25 10:04:30.5293 Info Registered target NLog.Targets.FileTarget(Name=ownFile-web)
+2024-07-25 10:04:30.5293 Info Registered target NLog.Targets.ColoredConsoleTarget(Name=console)
+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-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-25 10:04:30.5557 Warn Unused target detected. Add a rule for this target to the configuration. TargetName: allfile
+2024-07-25 10:04:30.5557 Info Configuration initialized.