From 2e2a7ef054629f9c25b2af83f6de5bed6c071eed Mon Sep 17 00:00:00 2001 From: liweidong-hj Date: Wed, 3 Jun 2026 14:06:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=88=86=E6=B4=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TaskAutomaticDispatchingProcessor.java | 29 +++ .../desk/dashboard/feign/IPartClient.java | 7 + .../pojo/entity/DsDispatchPointerEntity.java | 62 +++++++ .../desk/basic/mapper/PlatingMapper.java | 3 +- .../desk/basic/mapper/PlatingMapper.xml | 5 +- .../desk/basic/service/IPlatingService.java | 7 +- .../service/impl/PlatingServiceImpl.java | 4 +- .../controller/DsTaskingController.java | 4 +- .../desk/dashboard/feign/PartClient.java | 5 + .../mapper/DispatchPointerMapper.xml | 10 ++ .../mapper/DsDispatchPointerMapper.java | 42 +++++ .../dashboard/mapper/DsTaskingMapper.java | 3 + .../desk/dashboard/mapper/TaskingMapper.xml | 6 + .../service/IDsDispatchPointerService.java | 46 +++++ .../dashboard/service/IDsTaskingService.java | 4 +- .../impl/DsDispatchPointerServiceImpl.java | 69 +++++++ .../service/impl/DsTaskingServiceImpl.java | 168 +++++++++++++++--- 17 files changed, 437 insertions(+), 37 deletions(-) create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/dashboard/TaskAutomaticDispatchingProcessor.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsDispatchPointerEntity.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DispatchPointerMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsDispatchPointerMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsDispatchPointerService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsDispatchPointerServiceImpl.java diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/dashboard/TaskAutomaticDispatchingProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/dashboard/TaskAutomaticDispatchingProcessor.java new file mode 100644 index 000000000..ccc167f7c --- /dev/null +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/dashboard/TaskAutomaticDispatchingProcessor.java @@ -0,0 +1,29 @@ +package org.springblade.job.processor.dashboard; + +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springblade.desk.dashboard.feign.IPartClient; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +/** + * 工艺模块-返工任务 + * @author liweidong + */ +@Component +@Data +@Slf4j +public class TaskAutomaticDispatchingProcessor implements BasicProcessor { + + @Resource + private IPartClient client; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + client.automaticDispatching(); + return new ProcessResult(true); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/feign/IPartClient.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/feign/IPartClient.java index 30cd1baca..e47044345 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/feign/IPartClient.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/feign/IPartClient.java @@ -26,6 +26,7 @@ public interface IPartClient { String BATCH_PARTS = API_PREFIX + "/batchParts"; String REWORK_TASK = API_PREFIX + "/reworkTask"; String SYNC_TASKING = API_PREFIX + "/syncTasking"; + String AUTOMATIC_DISPATCHING = API_PREFIX + "/automaticDispatching"; /** * 获取零件信息 @@ -70,4 +71,10 @@ public interface IPartClient { */ @GetMapping(SYNC_TASKING) void syncTasking(); + + /** + * 任务分派 + */ + @GetMapping(AUTOMATIC_DISPATCHING) + void automaticDispatching(); } \ No newline at end of file diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsDispatchPointerEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsDispatchPointerEntity.java new file mode 100644 index 000000000..697f5743a --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/dashboard/pojo/entity/DsDispatchPointerEntity.java @@ -0,0 +1,62 @@ +package org.springblade.desk.dashboard.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; + +/** + * 任务分派轮循指针表 实体类 + * + * @author BladeX + * @since 2025-12-03 + */ +@Data +@TableName("DS_DISPATCH_POINTER") +@Schema(description = "DsDispatchPointer对象") +@EqualsAndHashCode(callSuper = true) +public class DsDispatchPointerEntity extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 镀种分类ID + */ + @Schema(description = "镀种分类ID") + private Long platingAssortmentId; + + /** + * 指针类型:NORMAL-普通任务,NEW_DRAWING-新图任务 + */ + @Schema(description = "指针类型:NORMAL-普通任务,NEW_DRAWING-新图任务") + private String pointerType; + + /** + * 上次分派的人员队列下标,-1表示未开始 + */ + @Schema(description = "上次分派的人员队列下标,-1表示未开始") + private Integer lastIndex; + + /** + * 乐观锁版本号 + */ + @Schema(description = "乐观锁版本号") + private Integer version; + + /** + * 备注 + */ + @Schema(description = "备注") + private String remarks; + + /** + * 状态:1-正常,0-禁用 + */ + @Schema(description = "状态:1-正常,0-禁用") + private Integer status; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.java index f302df03e..ae7a47626 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.java @@ -39,5 +39,6 @@ public interface PlatingMapper extends BaseMapper { */ List exportPlating(@Param("ew") Wrapper queryWrapper); - Plating selectBsPlatingByPlating(@Param("plating") String plating); + List selectBsPlatingByConfigNo(@Param("configCode") String configCode); + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.xml index 41abb08eb..cd9226c0e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/PlatingMapper.xml @@ -28,8 +28,9 @@ - + SELECT * FROM BS_PLATING WHERE is_deleted = 0 and CONFIG_NO = #{configCode} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlatingService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlatingService.java index c1074b1a2..af0b4e4e0 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlatingService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IPlatingService.java @@ -44,9 +44,10 @@ public interface IPlatingService extends BaseService { void setVOValue(PlatingVO vo); /** - * 根据镀种查询 - * @param plate + * 根据配置码查询 + * @param configCode * @return */ - Plating selectBsPlatingByPlating(String plate); + + List selectBsPlatingByConfigNo(String configCode); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlatingServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlatingServiceImpl.java index 5f2317107..e4f5d2be1 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlatingServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/PlatingServiceImpl.java @@ -61,7 +61,7 @@ public class PlatingServiceImpl extends BaseServiceImpl } @Override - public Plating selectBsPlatingByPlating(String plating) { - return baseMapper.selectBsPlatingByPlating(plating); + public List selectBsPlatingByConfigNo(String configCode) { + return baseMapper.selectBsPlatingByConfigNo(configCode); } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/controller/DsTaskingController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/controller/DsTaskingController.java index 2a94af5ec..6f337912a 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/controller/DsTaskingController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/controller/DsTaskingController.java @@ -405,8 +405,8 @@ public class DsTaskingController extends BladeController { @GetMapping("/automaticDispatching") @ApiOperationSupport(order = 1) @Operation(summary = "工艺任务-自动分派", description = "taskingId") - public R automaticDispatching(@RequestParam String taskingId) { - boolean b = dsTaskingService.automaticDispatching(taskingId); + public R automaticDispatching() { + boolean b = dsTaskingService.automaticDispatching(); return R.data(b); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/feign/PartClient.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/feign/PartClient.java index 3711f56c7..c8dfc6fef 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/feign/PartClient.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/feign/PartClient.java @@ -50,5 +50,10 @@ public class PartClient implements IPartClient { public void syncTasking() { taskingService.syncTasking(); } + + @Override + public void automaticDispatching() { + taskingService.automaticDispatching(); + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DispatchPointerMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DispatchPointerMapper.xml new file mode 100644 index 000000000..f72fadea9 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DispatchPointerMapper.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsDispatchPointerMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsDispatchPointerMapper.java new file mode 100644 index 000000000..bf2535f89 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsDispatchPointerMapper.java @@ -0,0 +1,42 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.desk.dashboard.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.springblade.desk.dashboard.pojo.entity.DsDispatchPointerEntity; + +/** + * 工艺能力表 Mapper 接口 + * + * @author BladeX + * @since 2025-11-12 + */ +public interface DsDispatchPointerMapper extends BaseMapper { + + + DsDispatchPointerEntity getOrCreatePointer(@Param("platingAssortmentId") Long platingAssortmentId, @Param("pointerType")String pointerType); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsTaskingMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsTaskingMapper.java index f158ea387..4a88e507d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsTaskingMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/DsTaskingMapper.java @@ -144,4 +144,7 @@ public interface DsTaskingMapper extends BaseMapper { List selectTaskingByPartCode(@Param("partCode") String partCode, @Param("taskStatus") Integer taskStatus, @Param("taskType")String taskType); + + + List selectTaskingByTaskStatus(@Param("taskTatus") Integer taskTatus); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml index 53d232693..79f213f13 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml @@ -165,4 +165,10 @@ AND TASK_TYPE = #{taskType} + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsDispatchPointerService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsDispatchPointerService.java new file mode 100644 index 000000000..75962e865 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsDispatchPointerService.java @@ -0,0 +1,46 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.desk.dashboard.service; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.dashboard.pojo.entity.DsDispatchPointerEntity; + +/** + * 自动分派 服务类 + * + * @author BladeX + * @since 2025-11-12 + */ +public interface IDsDispatchPointerService extends BaseService { + + /** + * 根据镀种分类ID和任务类型查询 + * @param platingAssortmentId + * @param pointerType + * @return + */ + DsDispatchPointerEntity getOrCreatePointer(Long platingAssortmentId, String pointerType); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsTaskingService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsTaskingService.java index 1040b17d9..afa547c1a 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsTaskingService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/IDsTaskingService.java @@ -247,8 +247,8 @@ public interface IDsTaskingService extends BaseService { /** * 自动分派 - * @param taskingId + * @param * @return */ - boolean automaticDispatching(String taskingId); + boolean automaticDispatching(); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsDispatchPointerServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsDispatchPointerServiceImpl.java new file mode 100644 index 000000000..ceaca5b84 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsDispatchPointerServiceImpl.java @@ -0,0 +1,69 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.desk.dashboard.service.impl; + +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.dashboard.mapper.DsDispatchPointerMapper; +import org.springblade.desk.dashboard.pojo.entity.DsDispatchPointerEntity; +import org.springblade.desk.dashboard.service.IDsDispatchPointerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * 自动分派 服务实现类 + * + * @author BladeX + * @since 2025-11-12 + */ +@Service +public class DsDispatchPointerServiceImpl extends BaseServiceImpl implements IDsDispatchPointerService { + + @Autowired + DsDispatchPointerMapper dispatchPointerMapper; + + @Override + public DsDispatchPointerEntity getOrCreatePointer(Long platingAssortmentId, String pointerType) { + DsDispatchPointerEntity pointer = dispatchPointerMapper.getOrCreatePointer(platingAssortmentId, pointerType); + // 2. 不存在则创建 + if (pointer == null) { + pointer = new DsDispatchPointerEntity(); + pointer.setPlatingAssortmentId(platingAssortmentId); + pointer.setPointerType(pointerType); + pointer.setLastIndex(-1); + pointer.setVersion(0); + pointer.setStatus(1); + pointer.setIsDeleted(0); + pointer.setCreateTime(new Date()); + + // 保存到数据库 + save(pointer); + } + + return pointer; + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsTaskingServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsTaskingServiceImpl.java index b2eb83aab..967da8ac2 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsTaskingServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsTaskingServiceImpl.java @@ -27,6 +27,7 @@ package org.springblade.desk.dashboard.service.impl; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; @@ -39,10 +40,8 @@ import org.springblade.core.tool.utils.SpringUtil; import org.springblade.desk.basic.pojo.entity.BasicClazz; import org.springblade.desk.basic.pojo.entity.LocallyPlatedPart; import org.springblade.desk.basic.pojo.entity.Plating; -import org.springblade.desk.basic.service.IBasicClazzService; -import org.springblade.desk.basic.service.ICraftAbilityService; -import org.springblade.desk.basic.service.ILocallyPlatedPartService; -import org.springblade.desk.basic.service.IPlatingService; +import org.springblade.desk.basic.pojo.entity.PlatingAssortment; +import org.springblade.desk.basic.service.*; import org.springblade.desk.common.constant.BizTypeConstant; import org.springblade.desk.common.service.IMesNotifyMessageService; import org.springblade.desk.dashboard.constant.DsPartConstant; @@ -187,8 +186,10 @@ public class DsTaskingServiceImpl extends BaseServiceImpl selectAssignList(IPage page, DsTaskingVO dsTasking) { @@ -1859,29 +1860,146 @@ public class DsTaskingServiceImpl extends BaseServiceImpl dsTaskingList = taskingMapper.selectTaskingByTaskStatus(TaskingConstant.TASK_STATUS_WAIT); + if(!CollectionUtils.isEmpty(dsTaskingList)){ + for (DsTaskingEntity tasking : dsTaskingList) { + + // 根据零件配置码查询镀种分类 + List dsPartEntityList = partService.selectDsPartByPatCode(tasking.getPartCode()); + if (CollectionUtils.isEmpty(dsPartEntityList)) { + continue; + } + DsPartEntity part = dsPartEntityList.get(0); + String configCode = part.getConfigCode(); + if(StringUtils.isEmpty(configCode)){ + continue; + } + List platingList = platingService.selectBsPlatingByConfigNo(configCode); + if(CollectionUtils.isEmpty(platingList)){ + log.warn("未找到镀种分类,零件配置码: {}", configCode); + continue; + } + Plating plating = platingList.get(0); + if ( plating.getPlatingAssortmentId() == null) { + log.warn("未找到镀种分类,镀种: {}", tasking.getPlate()); + continue; + } + + PlatingAssortment platingAssortment = platingAssortmentService.getById(plating.getPlatingAssortmentId()); + if (platingAssortment == null) { + log.warn("镀种分类不存在: {}", plating.getPlatingAssortmentId()); + continue; + } + + // 获取镀种分类对应的人员 + String teamId = platingAssortment.getTeamMemberId(); + List userList = new ArrayList<>(); + if (!StringUtils.isEmpty(teamId)) { + userList = userClient.userListByIds(teamId); + userList.sort(Comparator.comparing(User::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder()))); + } + + if (userList.isEmpty()) { + log.warn("镀种分类[{}]下没有可分配的人员", platingAssortment.getName()); + continue; + } + + // 判断指针类型(烧结新图任务使用独立指针) + String pointerType = "NORMAL"; + if (isSinteringNewDrawingTask(tasking,part)) { + pointerType = "NEW_DRAWING"; + } + + // 获取或创建指针 + DsDispatchPointerEntity pointer = dsDispatchPointerService.getOrCreatePointer( + platingAssortment.getId(), pointerType); + + // 边界处理:如果上次下标超出当前列表长度 + int lastIndex = pointer.getLastIndex(); + if (lastIndex >= userList.size()) { + lastIndex = userList.size() - 1; + pointer.setLastIndex(lastIndex); + dsDispatchPointerService.updateById(pointer); + } + + // ========== 带重试的分派逻辑 ========== + int maxRetries = userList.size(); + int currentIndex = (lastIndex + 1) % userList.size(); + User assignedUser = null; + int successIndex = -1; + boolean assignedSuccess = false; + + for (int retryCount = 0; retryCount < maxRetries; retryCount++) { + User candidate = userList.get(currentIndex); + + try { + if (this.assignTechnician(tasking.getId().toString(), candidate.getId().toString(), null)) { + assignedSuccess = true; + assignedUser = candidate; + successIndex = currentIndex; + break; + } + } catch (Exception e) { + log.error("分派任务给员工[{}]异常", candidate.getId(), e); + } + + log.warn("分派任务[{}]给人员[{}]失败,尝试下一个人", tasking.getId(), candidate.getName()); + currentIndex = (currentIndex + 1) % userList.size(); + } + + if (!assignedSuccess) { + log.error("任务[{}]分派失败,所有可分配人员都无法接收", tasking.getId()); + continue; + } + // ========== 重试逻辑结束 ========== + + // 更新指针(带乐观锁重试3次) + boolean updateSuccess = false; + for (int retryCount = 0; retryCount < 3; retryCount++) { + DsDispatchPointerEntity latestPointer = dsDispatchPointerService.getById(pointer.getId()); + + boolean success = dsDispatchPointerService.lambdaUpdate() + .eq(DsDispatchPointerEntity::getId, pointer.getId()) + .eq(DsDispatchPointerEntity::getVersion, latestPointer.getVersion()) + .set(DsDispatchPointerEntity::getLastIndex, successIndex) + .set(DsDispatchPointerEntity::getVersion, latestPointer.getVersion() + 1) + .set(DsDispatchPointerEntity::getUpdateTime, new Date()) + .update(); + + if (success) { + updateSuccess = true; + break; + } + + log.warn("更新分派指针失败,第{}次重试", retryCount + 1); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + if (!updateSuccess) { + log.warn("更新分派指针失败,但任务已分派给[{}],下次分派可能重复", assignedUser.getName()); + } + + log.info("任务[{}]自动分派成功,工艺员:{},类型:{},镀种分类:{}", + tasking.getId(), assignedUser.getName(), pointerType, platingAssortment.getName()); + + } } - //根据镀种查询镀种分类 -// Plating plating = platingService.selectBsPlatingByPlating(tasking.getPlate()); -// if(plating == null && plating.getBcId() == null){ -// return false; -// } -// -// BasicClazz basicClazz = basicClazzService.getById(plating.getBcId()); -// if(basicClazz == null){ -// return false; -// } - //获取镀种分类对应的人员 + return true; + } - return false; + /** + * 判断是否为烧结新图任务 + */ + private boolean isSinteringNewDrawingTask(DsTaskingEntity tasking,DsPartEntity part) { + return TaskingConstant.IS_SINTERING.equals(part.getIsSintering()) + && TaskingConstant.NEW_MAP_TASKS.equals(tasking.getTaskType()); } /**