diff --git a/ds-wms-service/DS.WMS.Core/Op/Dtos/SeaExportRes.cs b/ds-wms-service/DS.WMS.Core/Op/Dtos/SeaExportRes.cs
index 3c3dc7f1..a732a449 100644
--- a/ds-wms-service/DS.WMS.Core/Op/Dtos/SeaExportRes.cs
+++ b/ds-wms-service/DS.WMS.Core/Op/Dtos/SeaExportRes.cs
@@ -1442,4 +1442,9 @@ public class SeaExportRes
/// 航线人员名称
///
public string Laner { get; set; }
+
+ ///
+ /// 拆票或合票标志 1-拆票 2-合票
+ ///
+ public int SplitOrMergeFlag { get; set; }
}
\ No newline at end of file
diff --git a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageBaseService.cs b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageBaseService.cs
index 1c671a0d..5cafbb5a 100644
--- a/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageBaseService.cs
+++ b/ds-wms-service/DS.WMS.Core/TaskPlat/Method/TaskManageBaseService.cs
@@ -1,7 +1,9 @@
using DS.Module.Core;
+using DS.Module.Core.Condition;
using DS.Module.Core.Data;
using DS.Module.SqlSugar;
using DS.Module.UserModule;
+using DS.WMS.Core.Op.Dtos;
using DS.WMS.Core.Op.Entity;
using DS.WMS.Core.TaskPlat.Dtos;
using DS.WMS.Core.TaskPlat.Entity;
@@ -9,6 +11,7 @@ using DS.WMS.Core.TaskPlat.Interface;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
using SqlSugar;
using System.Linq.Expressions;
using System.Runtime.InteropServices;
@@ -324,6 +327,21 @@ namespace DS.WMS.Core.TaskPlat.Method
/// 涉及当前登陆人的匹配结果
public async Task> MatchTask(List? taskIdList = null)
{
+ /*
+ *
+ * 测试库测试用Sql:
+ SELECT t.SplitOrMergeFlag,t.OperatorId,t.OperatorName,t.Doc,t.DocName,t.CustomerService,t.CustomerServiceName,t.ForeignCustomerService,t.ForeignCustomerServiceName,t.Sale,t.SaleId,t. *
+ FROM `op_sea_export` t
+ where Deleted=0 and id In(1816649497120477184,1816779333432381440,1780891904372772864)
+ order by id desc
+
+
+ SELECT t.SplitOrMergeFlag,t.OperatorId,t.OperatorName,t.Doc,t.DocName,t.CustomerService,t.CustomerServiceName,t.ForeignCustomerService,t.ForeignCustomerServiceName,t.Sale,t.SaleId,t. *
+ FROM `op_sea_export` t
+ where Deleted=0 and id In(1813475270208917504,1813509723408961536,1816277472539447296)
+ order by id desc
+ */
+
MatchTaskResultDto result = new MatchTaskResultDto();
var tenantDb = saasDbService.GetBizDbScopeById(user.TenantId);
@@ -335,50 +353,53 @@ namespace DS.WMS.Core.TaskPlat.Method
&& x.STATUS == TaskStatusEnum.Create.ToString()
&& !string.IsNullOrEmpty(x.MBL_NO))
.WhereIF(taskIdList != null && taskIdList.Count > 0, x => taskIdList!.Contains(x.Id))
+ //.Where(x => x.Id == 1813475270208917504 || x.Id == 1816277472539447296 || x.Id == 1813509723408961536)
.ToListAsync(x => new TaskBaseInfo
{
Id = x.Id,
MBL_NO = x.MBL_NO,
TASK_TYPE = x.TASK_TYPE,
TASK_TYPE_NAME = x.TASK_TYPE_NAME,
- CARRIER_ID = x.CARRIER_ID,
+ //CARRIER_ID = x.CARRIER_ID,
});
+ logger.LogInformation($"MatchTask共查询出{taskList.Count}条待匹配的记录,taskList:{string.Join(',', taskList.Select(x => x.Id))}");
+
+ var allotSetCache = await allocationService.Value.GetAllList();
- var allotSetList = await allocationService.Value.GetAllList();
+ if (!allotSetCache.Succeeded || allotSetCache.Data?.Any() != true)
+ {
+ return DataResult.Success("操作成功!", result, MultiLanguageConst.DataUpdateSuccess);
+ }
- if (!allotSetList.Succeeded || allotSetList.Data?.Any() != true)
+ var taskTypeStrList = taskList.Select(x => x.TASK_TYPE).Distinct().ToList();
+ var allotSetList = allotSetCache.Data.Where(x => taskTypeStrList.Contains(x.TaskTypeCode)).ToList();
+ if (allotSetList.Count == 0)
{
return DataResult.Success("操作成功!", result, MultiLanguageConst.DataUpdateSuccess);
}
// 需要查询的订单的提单号的集合,用于一次性将需要查询的订单查询出来;
- HashSet waitQuerySeaExportWithMblnoList = new();
// 后续如果需要查询舱位,可以再补充字段如List waitQuerySlotWithMblnoList = new();
+ HashSet waitQuerySeaExportWithMblnoList = new();
+ // 分配规则
+ Dictionary> allotTargetList = new();
- List<(TaskBaseInfo task, TaskAllocationtSetDto allotSet, List allotUserList)> allotData = new();
-
- foreach (var item in taskList)
+ foreach (var taskItem in taskList)
{
- // 查找配置规则
- var targetAllotSet = allotSetList.Data.Where(x => x.TaskTypeCode == item.TASK_TYPE && x.CarrierId == item.CARRIER_ID).OrderBy(x => x.Id).FirstOrDefault();
- if (targetAllotSet == null)
- {
- targetAllotSet = allotSetList.Data.Where(x => x.TaskTypeCode == item.TASK_TYPE).OrderBy(x => x.Id).FirstOrDefault();
-
- // 如果某种任务没有配置接收对象,则该任务跳过分配
- if (targetAllotSet == null) continue;
- }
+ List taskItemAllotSetList = allotSetList.Where(x => x.TaskTypeCode == taskItem.TASK_TYPE).ToList();
- allotData.Add((item, targetAllotSet!, new List()));
-
- // 如果配置的下面四种接收对象,则需要查询订单
- if (targetAllotSet.IsAllotCustomerService
- || targetAllotSet.IsAllotSale
- || targetAllotSet.IsAllotOperator
- || targetAllotSet.IsAllotVouchingClerk)
+ foreach (var allotSetItem in taskItemAllotSetList)
{
- waitQuerySeaExportWithMblnoList.Add(item.MBL_NO!);
+ // 这里先存下来,后面再统一查库,减少查询次数
+ // 如果配置的下面四种接收对象,则需要查询订单
+ if (allotSetItem.IsAllotCustomerService
+ || allotSetItem.IsAllotSale
+ || allotSetItem.IsAllotOperator
+ || allotSetItem.IsAllotVouchingClerk)
+ {
+ waitQuerySeaExportWithMblnoList.Add(taskItem.MBL_NO!);
+ }
}
}
@@ -388,95 +409,96 @@ namespace DS.WMS.Core.TaskPlat.Method
&& (
(x.SplitOrMergeFlag == 0 && waitQuerySeaExportWithMblnoList.Contains(x.MBLNO))
|| (x.SplitOrMergeFlag == 1 && waitQuerySeaExportWithMblnoList.Contains(x.BookingNo))
- )).Select(x => new
- {
- x.Id,
- x.MBLNO,
- x.OperatorId,
- x.OperatorName,
- x.Doc,
- x.DocName,
- x.SaleId,
- x.Sale,
- x.CustomerService,
- x.CustomerServiceName,
- x.ForeignCustomerService,
- x.ForeignCustomerServiceName
- }).ToListAsync();
-
- foreach (var item in allotData)
+ )).Select().ToListAsync();
+ List<(TaskBaseInfo, List)> allotData = new();
+ foreach (var taskItem in taskList)
{
- // 如果某条任务配置的接收目标为销售、操作、单证、客服中的一项,则需要查订单
- if (item.allotSet.IsAllotCustomerService
- || item.allotSet.IsAllotOperator
- || item.allotSet.IsAllotSale
- || item.allotSet.IsAllotVouchingClerk)
+ var recvUserList = new List();
+
+ List taskItemAllotSetList = allotSetList.Where(x => x.TaskTypeCode == taskItem.TASK_TYPE).ToList();
+
+ var taskItemAllotList = new List();
+ foreach (var allotSetItem in taskItemAllotSetList)
{
- var order = seaExportList.FirstOrDefault(x => x.MBLNO == item.task.MBL_NO);
- if (order == null)
+ // 验证条件
+ if (!string.IsNullOrEmpty(allotSetItem.Condition))
{
- continue;
+ var contitionContent = JsonConvert.DeserializeObject(allotSetItem.Condition!)!;
+
+ TaskFlowDataContext dataContext = new();
+
+ if (allotSetItem.IsAllotCustomerService
+ || allotSetItem.IsAllotSale
+ || allotSetItem.IsAllotOperator
+ || allotSetItem.IsAllotVouchingClerk)
+ {
+ var seaExport = seaExportList.FirstOrDefault(x => (x.SplitOrMergeFlag == 0 && taskItem.MBL_NO == x.MBLNO) || (x.SplitOrMergeFlag == 1 && taskItem.MBL_NO == x.BookingNo));
+
+ if (seaExport == null) continue; // 这里为了效率,设置为如果订单为空,则跳过;后面如果需要判断其他表,需要把这里注释掉
+
+ dataContext.Set(TaskFlowDataNameConst.Business, seaExport);
+ }
+
+ if (!ConditionHelper.IsPass(contitionContent, dataContext))
+ continue;
}
- /*
- * 操作Operator=订单里的:OperatorId+OperatorName
- * 单证VouchingClerk=订单里的:Doc+DocName
- * 销售Sale=订单里的:SaleId+Sale
- * 客服CustomerService=订单里的:CustomerService+CustomerServiceName / ForeignCustomerService+ForeignCustomerServiceName
- */
-
- if (item.allotSet.IsAllotCustomerService)
+
+ if (allotSetItem.IsAllotCustomerService
+ || allotSetItem.IsAllotSale
+ || allotSetItem.IsAllotOperator
+ || allotSetItem.IsAllotVouchingClerk)
{
- if (order.CustomerService != 0 && !string.IsNullOrEmpty(order.CustomerServiceName))
+ var order = seaExportList.FirstOrDefault(x => (x.SplitOrMergeFlag == 0 && taskItem.MBL_NO == x.MBLNO) || (x.SplitOrMergeFlag == 1 && taskItem.MBL_NO == x.BookingNo));
+ if (order == null)
{
- item.allotUserList.Add(new RecvUserInfo(order.CustomerService, order.CustomerServiceName));
+ continue;
}
- if (order.ForeignCustomerService != 0 && !string.IsNullOrEmpty(order.ForeignCustomerServiceName))
+ /*
+ * 操作Operator=订单里的:OperatorId+OperatorName
+ * 单证VouchingClerk=订单里的:Doc+DocName
+ * 销售Sale=订单里的:SaleId+Sale
+ * 客服CustomerService=订单里的:CustomerService+CustomerServiceName / ForeignCustomerService+ForeignCustomerServiceName
+ */
+
+ if (allotSetItem.IsAllotCustomerService)
{
- item.allotUserList.Add(new RecvUserInfo(order.ForeignCustomerService, order.ForeignCustomerServiceName));
+ if (order.CustomerService != 0 && !string.IsNullOrEmpty(order.CustomerServiceName))
+ {
+ recvUserList.Add(new RecvUserInfo(order.CustomerService, order.CustomerServiceName));
+ }
+ if (order.ForeignCustomerService != 0 && !string.IsNullOrEmpty(order.ForeignCustomerServiceName))
+ {
+ recvUserList.Add(new RecvUserInfo(order.ForeignCustomerService, order.ForeignCustomerServiceName));
+ }
+ }
+ if (allotSetItem.IsAllotOperator
+ && order.OperatorId != 0 && !string.IsNullOrEmpty(order.OperatorName))
+ {
+ recvUserList.Add(new RecvUserInfo(order.OperatorId, order.OperatorName));
+ }
+ if (allotSetItem.IsAllotSale
+ && order.SaleId != 0 && !string.IsNullOrEmpty(order.Sale))
+ {
+ recvUserList.Add(new RecvUserInfo(order.SaleId, order.Sale));
+ }
+ if (allotSetItem.IsAllotVouchingClerk
+ && order.Doc != 0 && !string.IsNullOrEmpty(order.DocName))
+ {
+ recvUserList.Add(new RecvUserInfo(order.Doc, order.DocName));
}
- }
- if (item.allotSet.IsAllotOperator
- && order.OperatorId != 0 && !string.IsNullOrEmpty(order.OperatorName))
- {
- item.allotUserList.Add(new RecvUserInfo(order.OperatorId, order.OperatorName));
- }
- if (item.allotSet.IsAllotSale
- && order.SaleId != 0 && !string.IsNullOrEmpty(order.Sale))
- {
- item.allotUserList.Add(new RecvUserInfo(order.SaleId, order.Sale));
- }
- if (item.allotSet.IsAllotVouchingClerk
- && order.Doc != 0 && !string.IsNullOrEmpty(order.DocName))
- {
- item.allotUserList.Add(new RecvUserInfo(order.Doc, order.DocName));
}
}
- // 拓展:如果某条任务配置的接收目标为...中的一项,则需要查...
- }
-
- allotData = allotData.Where(x => x.allotUserList.Any()).ToList();
+ if (recvUserList.Count != 0)
+ {
+ recvUserList = recvUserList.DistinctBy(x => x.RecvUserId).ToList();
- foreach (var item in allotData)
- {
- await SetTaskOwner([item.task.Id], item.allotUserList);
+ allotData.Add((taskItem, recvUserList));
+ await SetTaskOwner([taskItem.Id], recvUserList);
+ }
}
- var userId = long.Parse(user.UserId);
- var currentUserRelateTask = allotData.Where(x => x.allotUserList.Any(y => y.RecvUserId == userId))
- .Select(x => x.task).ToList();
-
- result.LoginUserMatchTaskIdList = currentUserRelateTask.Select(x => x.Id).ToList();
-
- result.LoginUserMatchTaskList = currentUserRelateTask.GroupBy(x => new { x.TASK_TYPE, x.TASK_TYPE_NAME })
- .Select(x => new MatchTaskClassifyDto()
- {
- TaskType = x.Key.TASK_TYPE,
- TaskTypeName = x.Key.TASK_TYPE_NAME!,
- Count = x.Count()
- }).ToList();
-
- return DataResult.Success(result, MultiLanguageConst.DataUpdateSuccess);
+ return DataResult.Success("操作成功!", result, MultiLanguageConst.DataUpdateSuccess);
}
}
}