From 0f0bc5a6c6a57472c42dd00bc3bd1ffbf326da7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B5=87=E6=96=87=E9=BE=99?= Date: Thu, 25 Jul 2024 15:34:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=B7=E8=BF=90=E5=87=BA=E5=8F=A3=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BA=A4=E4=BA=92=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ds-wms-service/DS.WMS.Core/DS.WMS.Core.csproj | 1 - .../Flow/Method/FlowInstanceService.cs | 3 + .../TaskInteraction/ISeaExportTaskService.cs | 10 + .../Interface/TaskInteraction/ITaskService.cs | 34 ++ .../TaskInteraction/SeaExportTaskService.cs | 301 +++++++++--------- .../Op/Method/TaskInteraction/TaskService.cs | 249 +++++++++++++++ .../Controllers/SeaExportTaskController.cs | 60 ++++ .../DS.WMS.OpApi/Logs/internal-nlog.txt | 70 ++-- 8 files changed, 525 insertions(+), 203 deletions(-) create mode 100644 ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ISeaExportTaskService.cs create mode 100644 ds-wms-service/DS.WMS.Core/Op/Interface/TaskInteraction/ITaskService.cs create mode 100644 ds-wms-service/DS.WMS.Core/Op/Method/TaskInteraction/TaskService.cs create mode 100644 ds-wms-service/DS.WMS.OpApi/Controllers/SeaExportTaskController.cs 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.