|  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.vincent.rsf.framework.common.Cools; | 
 |  |  | import com.vincent.rsf.framework.exception.CoolException; | 
 |  |  | import com.vincent.rsf.server.common.constant.Constants; | 
 |  |  | 
 |  |  | import com.vincent.rsf.server.manager.constant.StaGroupConstant; | 
 |  |  | import com.vincent.rsf.server.manager.controller.params.LocToTaskParams; | 
 |  |  | import com.vincent.rsf.server.manager.entity.*; | 
 |  |  | import com.vincent.rsf.server.manager.enums.*; | 
 |  |  | import com.vincent.rsf.server.manager.enums.LocStsType; | 
 |  |  | import com.vincent.rsf.server.manager.enums.TaskResouceType; | 
 |  |  | import com.vincent.rsf.server.manager.enums.TaskStsType; | 
 |  |  | import com.vincent.rsf.server.manager.enums.TaskType; | 
 |  |  | import com.vincent.rsf.server.manager.service.*; | 
 |  |  | import com.vincent.rsf.server.manager.service.impl.BasStationServiceImpl; | 
 |  |  | import com.vincent.rsf.server.system.constant.SerialRuleCode; | 
 |  |  | import com.vincent.rsf.server.system.constant.GlobalConfigCode; | 
 |  |  | import com.vincent.rsf.server.system.entity.Config; | 
 |  |  | import com.vincent.rsf.server.system.service.ConfigService; | 
 |  |  | import com.vincent.rsf.server.system.utils.SerialRuleUtils; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.commons.lang3.StringUtils; | 
 |  |  | import org.springframework.beans.BeanUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.scheduling.annotation.Scheduled; | 
 |  |  | 
 |  |  |      * @description: 自动完成盘点功能 | 
 |  |  |      * @version 1.0 | 
 |  |  |      */ | 
 |  |  |     @Scheduled(cron = "0/35 * * * * ?") | 
 |  |  |     @Scheduled(cron = "0/25 * * * * ?") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public void autoCheckComplete() { | 
 |  |  | //        Boolean autoRunArea = configService.getVal("AUTO_RUN_CHECK_ORDERS", Boolean.class); | 
 |  |  | //        if (!autoRunArea) { | 
 |  |  | //            return; | 
 |  |  | //        } | 
 |  |  |         //获取任务列表中,为盘点出库的任务 | 
 |  |  |         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() | 
 |  |  |                 .in(Task::getTaskType, Arrays.asList(TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_CHECK_IN.type))); | 
 |  |  |                 .in(Task::getTaskType, Arrays.asList(TaskType.TASK_TYPE_CHECK_OUT.type, | 
 |  |  |                         TaskType.TASK_TYPE_PICK_IN.type, | 
 |  |  |                         TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, | 
 |  |  |                         TaskType.TASK_TYPE_CHECK_IN.type))); | 
 |  |  |  | 
 |  |  |         if (!tasks.isEmpty()) { | 
 |  |  |             tasks.forEach(task -> { | 
 |  |  | 
 |  |  |                     if (task.getTaskStatus().equals(TaskStsType.WAVE_SEED.id)) { | 
 |  |  |                         if (!stationService.update(new LambdaUpdateWrapper<BasStation>() | 
 |  |  |                                 .eq(BasStation::getStationName, task.getTargSite()) | 
 |  |  |                                 .set(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_F.type))) { | 
 |  |  |                                 .set(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_R.type))) { | 
 |  |  |                             log.error("站点状态修改完成失败,当前任务状态:", task.getTaskStatus()); | 
 |  |  | //                            throw new CoolException("站点状态修改失败!!"); | 
 |  |  | //                                throw new CoolException("站点状态修改失败!!"); | 
 |  |  |                         } | 
 |  |  |                         try { | 
 |  |  |                             taskService.pickOrCheckTask(task.getId(), Constants.TASK_TYPE_OUT_CHECK); | 
 |  |  |                             taskService.pickOrCheckTask(task.getId(), task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) ? Constants.TASK_TYPE_OUT_CHECK : ""); | 
 |  |  |  | 
 |  |  |                             if (!stationService.update(new LambdaUpdateWrapper<BasStation>() | 
 |  |  |                                     .eq(BasStation::getStationName, task.getTargSite()) | 
 |  |  |                                     .set(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_R.type))) { | 
 |  |  |                                 log.error("站点状态修改完成失败,当前任务状态:", task.getTaskStatus()); | 
 |  |  | //                                throw new CoolException("站点状态修改失败!!"); | 
 |  |  |                             } | 
 |  |  |                         } catch (Exception e) { | 
 |  |  |                             log.error("error====>", e); | 
 |  |  |                         } | 
 |  |  | 
 |  |  |      * @description: 自动生成任务 | 
 |  |  |      * @version 1.0 | 
 |  |  |      */ | 
 |  |  |     @Scheduled(cron = "0/25 * * * * ?") | 
 |  |  | //    @Scheduled(cron = "0 0/05 * * * ?  ") | 
 |  |  |     @Scheduled(cron = "0/15 * * * * ?") | 
 |  |  |     public void genRun() { | 
 |  |  |         Boolean flagAuto = configService.getVal("AUTO_RUN_CHECK_ORDERS", Boolean.class); | 
 |  |  |         if (!flagAuto) { | 
 |  |  |         Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_CHECK_ORDERS)); | 
 |  |  |         if (!Boolean.parseBoolean(config.getVal())) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Integer maxThread = 30; | 
 |  |  |         Config confNum = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_MOVE_THEAD_MAX)); | 
 |  |  |         if (!Objects.isNull(confNum)) { | 
 |  |  |             maxThread = Integer.valueOf(confNum.getVal()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         //获取任务列表中,为盘点出库的任务 | 
 |  |  |         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() | 
 |  |  |                 .in(Task::getTaskType, Arrays.asList(TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_CHECK_IN.type))); | 
 |  |  |         if (tasks.size() >= 6) { | 
 |  |  |         if (tasks.size() >= maxThread) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         String autoRunArea = configService.getVal("AUTO_RUN_AREA", String.class); | 
 |  |  |         if (Cools.isEmpty(autoRunArea)) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         List<Integer> array = new ArrayList<>(); | 
 |  |  |         List<String> list = new ArrayList<>(); | 
 |  |  |         for (char c : autoRunArea.toCharArray()) { | 
 |  |  |             switch (c) { | 
 |  |  |                 case '1': | 
 |  |  |                     this.autoRun(LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST, StaGroupConstant.FAR_RIGHT_STA_ROW_LIST); | 
 |  |  |                     array.addAll(LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.FAR_RIGHT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '2': | 
 |  |  |                     this.autoRun(LocGroupConstant.RIGHT_LOC_ROW_LIST, StaGroupConstant.RIGHT_STA_ROW_LIST); | 
 |  |  |                     array.addAll(LocGroupConstant.RIGHT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.RIGHT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '3': | 
 |  |  |                     this.autoRun(LocGroupConstant.MIDDLE_LOC_ROW_LIST, StaGroupConstant.MIDDLE_STA_ROW_LIST); | 
 |  |  |                     array.addAll(LocGroupConstant.MIDDLE_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.MIDDLE_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '4': | 
 |  |  |                     this.autoRun(LocGroupConstant.LEFT_LOC_ROW_LIST, StaGroupConstant.LEFT_STA_ROW_LIST); | 
 |  |  |                     array.addAll(LocGroupConstant.LEFT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.LEFT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '5': | 
 |  |  |                     this.autoRun(LocGroupConstant.FAR_LEFT_LOC_ROW_LIST, StaGroupConstant.FAR_LEFT_STA_ROW_LIST); | 
 |  |  |                     array.addAll(LocGroupConstant.FAR_LEFT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.FAR_LEFT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         this.autoRun(array, list); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void autoRun(List<Integer> locGroupList, List<String> staGroupList) { | 
 |  |  | 
 |  |  |                 } | 
 |  |  |                 DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() | 
 |  |  |                         .in(DeviceSite::getSite, stationNames) | 
 |  |  |                         .eq(DeviceSite::getType, TaskType.TASK_TYPE_CHECK_OUT.type), false); | 
 |  |  |                         .eq(DeviceSite::getType, TaskType.TASK_TYPE_CHECK_OUT.type).last("limit 1")); | 
 |  |  |                 if (Cools.isEmpty(deviceSite)) { | 
 |  |  |                     throw new CoolException("无可用路径!!"); | 
 |  |  |                 } | 
 |  |  | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 try { | 
 |  |  |                     //生成盘点出库任务,站点预约 | 
 |  |  |                     if (!stationService.update(new LambdaUpdateWrapper<BasStation>() | 
 |  |  |                             .eq(BasStation::getStationName, deviceSite.getSite()) | 
 |  |  |                             .set(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_S.type))) { | 
 |  |  |                         throw new CoolException("站点状态更新失败!!"); | 
 |  |  |                     } | 
 |  |  |                     locItemService.generateTask(TaskResouceType.TASK_RESOUCE_CHECK_TYPE.val, locToTaskParams, getLoginUserId()); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     throw new CoolException(e.getMessage()); | 
 |  |  | 
 |  |  |  | 
 |  |  | //        // 出库,需要校验工作档是否存在,存在就说明站点处于忙碌状态 | 
 |  |  | //        this.runLocToSta(locGroupList, staGroupList, staTaskMemo); | 
 |  |  | //        // 移库 | 
 |  |  | //        // 移库locGroupList | 
 |  |  | //        this.runLocToLoc(locGroupList, staTaskMemo); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生成移库任务 | 
 |  |  |      * | 
 |  |  |      * @param | 
 |  |  |      * @param | 
 |  |  |      */ | 
 |  |  |     // 移库 | 
 |  |  |     private void runLocToLoc(List<Integer> locGroupList, String staTaskMemo) { | 
 |  |  |     @Scheduled(cron = "0/23 * * * * ?") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public void runLocToLoc() { | 
 |  |  |         Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_CHECK_ORDERS)); | 
 |  |  |         if (!Boolean.parseBoolean(config.getVal())) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         String autoRunArea = configService.getVal("AUTO_RUN_AREA", String.class); | 
 |  |  |         if (Cools.isEmpty(autoRunArea)) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         List<Integer> array = new ArrayList<>(); | 
 |  |  |         List<String> list = new ArrayList<>(); | 
 |  |  |         for (char c : autoRunArea.toCharArray()) { | 
 |  |  |             switch (c) { | 
 |  |  |                 case '1': | 
 |  |  |                     array.addAll(LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.FAR_RIGHT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '2': | 
 |  |  |                     array.addAll(LocGroupConstant.RIGHT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.RIGHT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '3': | 
 |  |  |                     array.addAll(LocGroupConstant.MIDDLE_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.MIDDLE_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '4': | 
 |  |  |                     array.addAll(LocGroupConstant.LEFT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.LEFT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 case '5': | 
 |  |  |                     array.addAll(LocGroupConstant.FAR_LEFT_LOC_ROW_LIST); | 
 |  |  |                     list.addAll(StaGroupConstant.FAR_LEFT_STA_ROW_LIST); | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         xx(array); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void xx(List<Integer> locGroupList) { | 
 |  |  |         Integer startRow = Collections.min(locGroupList); | 
 |  |  |         Integer endRow = Collections.max(locGroupList); | 
 |  |  |  | 
 |  |  |         String memo = "DEMO_LOC_" + startRow + "-" + endRow; | 
 |  |  |  | 
 |  |  |         Integer maxThread = 30; | 
 |  |  |         Config confNum = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_MOVE_THEAD_MAX)); | 
 |  |  |         if (!Objects.isNull(confNum)) { | 
 |  |  |             maxThread = Integer.valueOf(confNum.getVal()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>() | 
 |  |  |                 .eq(Task::getMemo,memo)); | 
 |  |  |         if (!tasks.isEmpty() && tasks.size() >= maxThread) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // STOCK | 
 |  |  |         LambdaQueryWrapper<Loc> stockWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type); | 
 |  |  | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.info("生成出库任务失败", e); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static List<String> getStaPrefixes(List<String> staGroupList) { |