package com.whyc.schedule; import com.whyc.dto.Response; import com.whyc.dto.WmsPallet; import com.whyc.dto.WmsPalletDto; import com.whyc.dto.WmsResponse; import com.whyc.pojo.db_wms.BattWarehouse; import com.whyc.pojo.db_wms.Task; import com.whyc.service.BattWarehouseService; import com.whyc.service.TaskService; import com.whyc.service.WmsService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; /** * 仓储系统的智能活化任务 * 解释来源:任务的来源,在 发生 入库任务时,所入库的电池 就需要 活化. 以及在仓储库内的所有电池都需要活化.活化周期为每n月活化一次. * 实现思路: * 1.创建仓储库所有电池单体编号的库存表,写明入库时间和上次活化时间-数据的来源分为2部分,1-初始已在库的电池,2-测压入库的新入电池 * 2.对于没有活化的电池单体,下发活化任务. * 3.下发活化任务的选择: 每天早上9点,且没有正在进行的活化任务的时候. 对周期大于n月的单体进行任务下发 */ @EnableScheduling @Component @Slf4j public class WmsTaskSchedule { @Autowired private BattWarehouseService battWarehouseService; @Autowired private TaskService taskService; @Autowired private WmsService wmsService; /** * 仓储库所有电池的活化任务,任务之前还检查并加入 之前未放入仓储库表中的单体 * 活化周期: 在参数表里设置 * 每天早上9点执行一次 * */ //@Scheduled(cron= "0 0 9 * * ?") public void checkAndActivate() { //查询数据库记录的仓库内所有的电池 List listInDB = battWarehouseService.getAll(); List listNew = new ArrayList<>(); Date now = new Date(); List monIdListInDB = listInDB.stream().map(BattWarehouse::getMonId).collect(Collectors.toList()); //查询当前实际存在的仓库内的所有电池 Response palletList = wmsService.getPalletList(2, 4); WmsResponse data = (WmsResponse) palletList.getData(); if (palletList.getCode() == 1 && (data).getCode() == 0) { //查询到了所有库内电池 List palletsNow = (List) data.getData(); palletsNow.stream().forEach(item -> { //palletCode就是电池单体编号 if(!monIdListInDB.contains(Integer.valueOf(item.getPalletCode()))){ BattWarehouse battWarehouse = new BattWarehouse(); battWarehouse.setMonId(Integer.valueOf(item.getPalletCode())); battWarehouse.setStorageTime(now); battWarehouse.setOnPlan(0); battWarehouse.setChargeOnPlan(0); battWarehouse.setDischargeOnPlan(0); String volStr = item.getV().replace("v", ""); int vol = Integer.parseInt(volStr); battWarehouse.setVol(vol); listNew.add(battWarehouse); } }); } //不在数据库内的电池单体,保存 if(listNew.size() > 0){ battWarehouseService.addBatch(listNew); } //查询需要活化的电池列表 List list = battWarehouseService.getActivateList(); /*//通过电压进行分组list Map> mapToActivate = list.stream().filter(item->item.getVol() == 2).collect(Collectors.groupingBy(BattWarehouse::getVol)); Set volSet = mapToActivate.keySet(); //永远只对一类电压进行活化任务下发!!!因为连续下发活化,后续的会失败 Integer vol; String[] activateParameterStr = null; if (volSet.size()>0){ vol = volSet.iterator().next(); list = mapToActivate.get(vol); }else{ //本次终止 return; }*/ if(list.size() == 0){ //没有需要活化的电池 return; } int vol =2; String[] activateParameterStr = null; list = list.stream().filter(item -> item.getVol() == 2).collect(Collectors.toList()); //查询是否存在正在进行的任务 List ongoingList = taskService.getOngoingList(); if (ongoingList.size() == 0) { //没有正在进行的活化任务,则下发活化任务 WmsPalletDto wmsPalletDto = new WmsPalletDto(); wmsPalletDto.setDes(3); List pallets = list.stream().map(item -> String.valueOf(item.getMonId())).collect(Collectors.toList()); //pallets从List类型转LinkedList类型 LinkedList palletsLinked = new LinkedList<>(pallets); wmsPalletDto.setPallets(palletsLinked); //活化参数设置 //{ // num: 1, // 电池编号 // cap: 350, // 标称容量 // vol: 200, // 电池类型-不可改动 // dTime: 10, // 放电时间 900 // dCurrent: 10, // 放电电流0.1A-需要根据容量实际设置 (实际容量/10) // volLow: 1.8, // 组端电压下限0.001V // dCap: 10, // 预放容量0.1AH-需要根据容量实际设置 等于实际容量 // cTime: 10, // 充电时间 900 // cCurrent: 10, // 充电电流0.1A-需要根据容量实际设置(实际容量/10) // sCurrent: 5, // 截至电流0.1A-需要根据容量实际设置(实际容量/10/2) // volHigh: 2.35, // 充电电压上限0.001V // volFloat: 2.25, // 浮充电压0.001V // cCap: 10, // 预充容量0.1AH-需要根据容量实际设置 等于实际容量 // tTimes: 1, // 充放次数 // standTime: 1, // 静置时间 // startType: 1, // 测试起点-默认充电. 测试起点:0放电,1充电 //} if(vol == 2) { activateParameterStr = new String[]{ "1", "350", "200", "10", "350", "1800", "3500", "10", "350", "175", "2350", "2250", "3500", "1", "1", "1" }; } //暂不考虑6V和12V,只存在2V /*//6V待提供 else if(vol==6){ activateParameterStr = new String[]{ "1", "350", "200", "10", "350", "1800", "3500", "10", "350", "175", "2350", "2250", "3500", "1", "1", "1" }; } //12V待提供 else if(vol==12){ activateParameterStr = new String[]{ "1", "350", "200", "10", "350", "1800", "3500", "10", "350", "175", "2350", "2250", "3500", "1", "1", "1" }; }*/ List activateParameter = Arrays.asList(activateParameterStr); wmsPalletDto.setActivateParameter(activateParameter); Response response = wmsService.sendTask(wmsPalletDto); if (response.getCode() == 1) { WmsResponse responseInside = (WmsResponse) response.getData(); if(responseInside.getCode() == 0){//下发成功 LinkedList taskNoList = responseInside.getTask_no(); //进行标志位和任务编号的更新 for (int i = 0; i < taskNoList.size(); i++) { BattWarehouse item = list.get(i); item.setOnPlan(1); item.setTaskNo(taskNoList.get(i)); } //批量更新BattWarehouse battWarehouseService.updateActivateBatchById(list); } } } } /** * 仓储库所有电池的充电任务 * 充电周期:1个月 * 传入的活化参数:cTime=0,startType=1 * 每天早上10点执行一次 * */ //@Scheduled(cron= "0 0 10 * * ?") public void checkAndCharge() { //查询需要充电的电池列表 List list = battWarehouseService.getChargeList(); list = list.stream().filter(item -> item.getVol() == 2).collect(Collectors.toList()); if(list.size() == 0){ //没有需要充电的电池 return; } //查询是否存在正在进行的任务 List ongoingList = taskService.getOngoingList(); if (ongoingList.size() == 0) { //没有正在进行的活化任务,则下发活化任务 WmsPalletDto wmsPalletDto = new WmsPalletDto(); wmsPalletDto.setDes(3); List pallets = list.stream().map(item -> String.valueOf(item.getMonId())).collect(Collectors.toList()); //pallets从List类型转LinkedList类型 LinkedList palletsLinked = new LinkedList<>(pallets); wmsPalletDto.setPallets(palletsLinked); //活化参数设置 String[] activateParameterStr = new String[]{ "1", "350", "200", "10", "350", "1800", "3500", "10", "350", "175", "2350", "2250", "3500", "0", "1", "1" }; List activateParameter = Arrays.asList(activateParameterStr); wmsPalletDto.setActivateParameter(activateParameter); Response response = wmsService.sendTask(wmsPalletDto); if (response.getCode() == 1) { WmsResponse responseInside = (WmsResponse) response.getData(); if(responseInside.getCode() == 0){//下发成功 LinkedList taskNoList = responseInside.getTask_no(); //进行标志位和任务编号的更新 for (int i = 0; i < taskNoList.size(); i++) { BattWarehouse item = list.get(i); item.setChargeOnPlan(1); item.setChargeTaskNo(taskNoList.get(i)); } //批量更新BattWarehouse battWarehouseService.updateChargeBatchById(list); } } } } /** * 仓储库所有电池的放电任务 * 放电周期:2个月 * 传入的活化参数:cTime=0,startType=0 * 每天早上11点执行一次 * */ //@Scheduled(cron= "0 0 11 * * ?") public void checkAndDischarge() { //查询需要放电的电池列表 List list = battWarehouseService.getDischargeList(); list = list.stream().filter(item -> item.getVol() == 2).collect(Collectors.toList()); if(list.size() == 0){ //没有需要放电的电池 return; } //查询是否存在正在进行的任务 List ongoingList = taskService.getOngoingList(); if (ongoingList.size() == 0) { //没有正在进行的活化任务,则下发活化任务 WmsPalletDto wmsPalletDto = new WmsPalletDto(); wmsPalletDto.setDes(3); List pallets = list.stream().map(item -> String.valueOf(item.getMonId())).collect(Collectors.toList()); //pallets从List类型转LinkedList类型 LinkedList palletsLinked = new LinkedList<>(pallets); wmsPalletDto.setPallets(palletsLinked); //活化参数设置 String[] activateParameterStr = new String[]{ "1", "350", "200", "10", "350", "1800", "3500", "10", "350", "175", "2350", "2250", "3500", "0", "1", "0" }; List activateParameter = Arrays.asList(activateParameterStr); wmsPalletDto.setActivateParameter(activateParameter); Response response = wmsService.sendTask(wmsPalletDto); if (response.getCode() == 1) { WmsResponse responseInside = (WmsResponse) response.getData(); if(responseInside.getCode() == 0){//下发成功 LinkedList taskNoList = responseInside.getTask_no(); //进行标志位和任务编号的更新 for (int i = 0; i < taskNoList.size(); i++) { BattWarehouse item = list.get(i); item.setDischargeOnPlan(1); item.setDischargeTaskNo(taskNoList.get(i)); } //批量更新BattWarehouse battWarehouseService.updateDischargeBatchById(list); } } } } }