代码更新:

1. 修改发送任务逻辑
2. 优化导入
This commit is contained in:
梁州 2024-09-21 18:23:39 +08:00
parent fe2beacfc6
commit fc1d0ef3b4
14 changed files with 461 additions and 409 deletions

View File

@ -1,7 +1,9 @@
package com.wms.config; package com.wms.config;
import com.wms.entity.table.Config; import com.wms.entity.table.Config;
import com.wms.entity.table.Location;
import com.wms.service.ConfigService; import com.wms.service.ConfigService;
import com.wms.service.LocationService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -14,6 +16,7 @@ import org.springframework.stereotype.Component;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
@Component @Component
@Order(1) @Order(1)
@ -23,8 +26,13 @@ public class InitLocalConfig implements ApplicationRunner {
* 配置类 * 配置类
*/ */
private final ConfigService configService; private final ConfigService configService;
/**
* 库位服务
*/
private final LocationService locationService;
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); protected final Logger logger = LoggerFactory.getLogger(this.getClass());
public static Map<String, String> configMap = new HashMap<String, String>(); public static Map<String, String> configMap = new HashMap<String, String>();
public static Map<String, Location> instantLocationMap = new HashMap<>();
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
List<Config> configs = configService.selectConfigs(""); List<Config> configs = configService.selectConfigs("");
@ -34,5 +42,8 @@ public class InitLocalConfig implements ApplicationRunner {
logger.info("导入系统配置成功---{}{}", config.getConfigName(), config.getConfigValue()); logger.info("导入系统配置成功---{}{}", config.getConfigName(), config.getConfigValue());
} }
} }
// 生成库位Map
instantLocationMap = locationService.list().stream().collect(Collectors.toMap(Location::getLocationId, location -> location));
logger.info("生成库位Map成功");
} }
} }

View File

@ -10,6 +10,7 @@ public enum ConfigMapKeyEnum {
CREATE_WORK("CREATE_WORK"), CREATE_WORK("CREATE_WORK"),
START_WORK("START_WORK"), START_WORK("START_WORK"),
SEND_TASK("SEND_TASK"), SEND_TASK("SEND_TASK"),
SEND_PICK_OUT_TASK("SEND_PICK_OUT_TASK"),
MAX_VEHICLE_NUMS("MAX_VEHICLE_NUMS"), MAX_VEHICLE_NUMS("MAX_VEHICLE_NUMS"),
MAX_WCS_ACCEPT_NUMS("MAX_WCS_ACCEPT_NUMS"), MAX_WCS_ACCEPT_NUMS("MAX_WCS_ACCEPT_NUMS"),
SLOC_FILTER_STRING("SLOC_FILTER_STRING"), SLOC_FILTER_STRING("SLOC_FILTER_STRING"),

View File

@ -41,10 +41,8 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.*;
import java.util.Collections; import java.util.stream.Collectors;
import java.util.List;
import java.util.Objects;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI; import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.HttpUtils.getIpAddr; import static com.wms.utils.HttpUtils.getIpAddr;
@ -66,9 +64,7 @@ public class ExcelController {
private final LocationService locationService;// 库位服务 private final LocationService locationService;// 库位服务
private final UploadRecordService uploadRecordService;// 上传服务 private final UploadRecordService uploadRecordService;// 上传服务
private final KateDBSService kateDbsService;// Dbs服务 private final KateDBSService kateDbsService;// Dbs服务
private final KateDBSLastService kateDbsLastService;// Dbs上次记录服务
private final KateOrdersService kateOrdersService;// 工单服务 private final KateOrdersService kateOrdersService;// 工单服务
private final KateOrdersLastService kateOrdersLastService;// 工单上次服务
private final GoodsService goodsService;// 物料服务 private final GoodsService goodsService;// 物料服务
private final WorkStationConfigService workStationConfigService;// 工站配置服务 private final WorkStationConfigService workStationConfigService;// 工站配置服务
@ -167,14 +163,10 @@ public class ExcelController {
return convertJsonString(response); return convertJsonString(response);
} }
uploadFileHashStringList.add(fileVo.getHash()); uploadFileHashStringList.add(fileVo.getHash());
// 先移除之前last表中的内容 // 获取之前DBS表的内容
kateDbsLastService.remove(new LambdaQueryWrapper<>()); Map<String, KateDBS> kateDbsMap = kateDbsService.list().stream().collect(Collectors.toMap(KateDBS::getWorkOrder, kateDBS -> kateDBS));
// 将当前Dbs表的数据存进Last表
kateDbsLastService.saveBatch(BeanUtil.copyToList(kateDbsService.list(), KateDBSLast.class));
// 移库Dbs表中的内容
kateDbsService.remove(new LambdaQueryWrapper<>());
// 导入excel // 导入excel
EasyExcel.read(file.getInputStream(), KateDbsExcelVo.class, new UploadDbsListener(kateDbsService, kateDbsLastService, fileVo.getUserName())).sheet().headRowNumber(8).doRead(); EasyExcel.read(file.getInputStream(), KateDbsExcelVo.class, new UploadDbsListener(kateDbsService, kateDbsMap, fileVo.getUserName())).sheet().headRowNumber(8).doRead();
// 添加导入记录 // 添加导入记录
uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "DBS")); uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "DBS"));
uploadFileHashStringList.remove(fileVo.getHash()); uploadFileHashStringList.remove(fileVo.getHash());
@ -212,16 +204,10 @@ public class ExcelController {
return convertJsonString(response); return convertJsonString(response);
} }
uploadFileHashStringList.add(fileVo.getHash()); uploadFileHashStringList.add(fileVo.getHash());
// 先移除之前last表中的内容 // 获取之前工单表的内容
kateOrdersLastService.remove(new LambdaQueryWrapper<>()); Map<String, KateOrders> kateOrdersMap = kateOrdersService.list().stream().collect(Collectors.toMap(kateOrders -> kateOrders.getWorkOrder() + kateOrders.getGoodsId() + kateOrders.getSupplyArea(), kateOrders -> kateOrders));
// 将当前工单表的数据存进Last表
List<KateOrdersLast> kateOrdersLastList = BeanUtil.copyToList(kateOrdersService.list(), KateOrdersLast.class);
kateOrdersLastService.saveBatch(kateOrdersLastList);
// 移库工单表中的内容
kateOrdersService.remove(new LambdaQueryWrapper<>());
// 导入excel // 导入excel
// TODO EasyExcel.read(file.getInputStream(), KateOrdersExcelVo.class, new UploadKateOrdersListener(kateOrdersService, kateOrdersMap, fileVo.getUserName())).sheet().doRead();
EasyExcel.read(file.getInputStream(), KateOrdersExcelVo.class, new UploadKateOrdersListener(kateOrdersLastList, kateOrdersService, fileVo.getUserName())).sheet().doRead();
// 添加导入记录 // 添加导入记录
uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "ORDERS")); uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "ORDERS"));
uploadFileHashStringList.remove(fileVo.getHash()); uploadFileHashStringList.remove(fileVo.getHash());
@ -299,7 +285,8 @@ public class ExcelController {
} }
uploadFileHashStringList.add(fileVo.getHash()); uploadFileHashStringList.add(fileVo.getHash());
// 导入excel // 导入excel
EasyExcel.read(file.getInputStream(), StationConfigExcelVo.class, new UploadStationConfigListener(workStationConfigService, fileVo.getUserName())).sheet("工站配置").doRead(); Map<String, WorkStationConfig> oldWorkStationConfigMap = workStationConfigService.list().stream().collect(Collectors.toMap(WorkStationConfig::getSmallBox, workStationConfig -> workStationConfig));
EasyExcel.read(file.getInputStream(), StationConfigExcelVo.class, new UploadStationConfigListener(workStationConfigService, oldWorkStationConfigMap, fileVo.getUserName())).sheet("工站配置").doRead();
// 添加导入记录 // 添加导入记录
uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "STATION-CONFIG_")); uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "STATION-CONFIG_"));
uploadFileHashStringList.remove(fileVo.getHash()); uploadFileHashStringList.remove(fileVo.getHash());

View File

@ -63,6 +63,26 @@ public class JobComponent {
} }
} }
/**
* 向Wcs下发站台拣选出库任务
* 每2秒执行一次
*/
@Scheduled(fixedDelay = 2000)
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void sendPickOutTasks() {
String sendTask = configMap.get(ConfigMapKeyEnum.SEND_PICK_OUT_TASK.getConfigKey());
if (StringUtils.isEmpty(sendTask) || !sendTask.equals("1")) {
return;
}
try {
// 发送站台拣选出库任务
wmsJobService.sendPickOutTasks();
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
/** /**
* 拣选任务 * 拣选任务
* 每2秒执行一次 * 每2秒执行一次

View File

@ -605,6 +605,7 @@ public class TaskController {
.set(Task::getDestination, nextLocationId) .set(Task::getDestination, nextLocationId)
.set(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()) .set(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())
.eq(Task::getVehicleId, wcsVehicleInRequest.getVehicleNo()) .eq(Task::getVehicleId, wcsVehicleInRequest.getVehicleNo())
.eq(Task::getTaskType, TaskType.IN.getCode())
.eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode()); .eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode());
if (!taskService.update(lambdaUpdateWrapperOfTask)) { if (!taskService.update(lambdaUpdateWrapperOfTask)) {
// 回退库位锁定 // 回退库位锁定
@ -900,7 +901,7 @@ public class TaskController {
if (pickTask == null || StringUtils.isEmpty(pickTask.getVehicleId())) { if (pickTask == null || StringUtils.isEmpty(pickTask.getVehicleId())) {
logger.error("当前站台查不到正在拣选的箱子"); logger.error("当前站台查不到正在拣选的箱子");
response.setCode(ResponseCode.ERROR.getCode()); response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前站台查不到正在拣选的箱子"); response.setMessage("当前站台查不到正在拣选的箱子,请尝试拣选界面修改当前料箱状态。");
return convertJsonString(response); return convertJsonString(response);
} }
String vehicleId = pickTask.getVehicleId(); String vehicleId = pickTask.getVehicleId();
@ -912,7 +913,7 @@ public class TaskController {
if (stock == null || StringUtils.isEmpty(stock.getStockId()) || stock.getGoodsRelated() == null) { if (stock == null || StringUtils.isEmpty(stock.getStockId()) || stock.getGoodsRelated() == null) {
logger.error("请求料号:{}与正在拣选的箱子:{}无对应关系", workQuery.getGoodsId(), vehicleId); logger.error("请求料号:{}与正在拣选的箱子:{}无对应关系", workQuery.getGoodsId(), vehicleId);
response.setCode(ResponseCode.ERROR.getCode()); response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("请求料号:" + workQuery.getGoodsId() + "与正在拣选的箱子:" + vehicleId + "无对应关系"); response.setMessage("请求料号:" + workQuery.getGoodsId() + "与正在拣选的箱子:" + vehicleId + "无对应关系,请扫描其他料号或者按按钮。");
return convertJsonString(response); return convertJsonString(response);
} }
// 查一下物料信息 // 查一下物料信息
@ -930,7 +931,7 @@ public class TaskController {
if (workFlows == null || workFlows.isEmpty()) { if (workFlows == null || workFlows.isEmpty()) {
logger.error("当前站台当前物料查询不到对应的工作"); logger.error("当前站台当前物料查询不到对应的工作");
response.setCode(ResponseCode.ERROR.getCode()); response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前站台当前物料查询不到对应的工作"); response.setMessage("当前站台当前物料查询不到对应的工作,请扫描其他料号或者按按钮。");
return convertJsonString(response); return convertJsonString(response);
} }
// 亮灯 // 亮灯
@ -1027,26 +1028,8 @@ public class TaskController {
standPickVo.setPlanPickNum(originNum.subtract(realNum)); standPickVo.setPlanPickNum(originNum.subtract(realNum));
standPickVo.setRemainNumOrigin(realNum); standPickVo.setRemainNumOrigin(realNum);
standPickVo.setRemainNumReal(realNum); standPickVo.setRemainNumReal(realNum);
try { // 获取完成工作信息
// 获取当前站台已完成数量 getFinishedInfo(standId, standPickVo);
List<WorkFlow> allWorkFlows = workFlowService.list();
int finishingRows = 0;
BigDecimal finishedCounts = BigDecimal.ZERO;
BigDecimal allCounts = BigDecimal.ZERO;
for (WorkFlow workFlow : allWorkFlows) {
if (workFlow.getWorkStatus() == 2) {
finishingRows++;
}
finishedCounts = finishedCounts.add(workFlow.getPickedNum());
allCounts = allCounts.add(workFlow.getNeedNum());
}
standPickVo.setFinishedRows(finishingRows);
standPickVo.setTotalRows(allWorkFlows.size());
standPickVo.setFinishedCounts(finishedCounts);
standPickVo.setTotalCounts(allCounts);
} catch (Exception e) {
logger.error("获取已完成数据报表失败,可能存在类型转换错误");
}
standPickVo.setRemark(goodsInfo != null ? goodsInfo.getUnpackingType() : ""); standPickVo.setRemark(goodsInfo != null ? goodsInfo.getUnpackingType() : "");
// 返回成功 // 返回成功
response.setCode(ResponseCode.OK.getCode()); response.setCode(ResponseCode.OK.getCode());
@ -1103,6 +1086,8 @@ public class TaskController {
// 返回成功 // 返回成功
StandPickVo standPickVo = new StandPickVo(); StandPickVo standPickVo = new StandPickVo();
standPickVo.setTip(targetStand.getPickTip()); standPickVo.setTip(targetStand.getPickTip());
// 获取完成工作信息
getFinishedInfo(targetStand.getStandId(), standPickVo);
response.setCode(ResponseCode.OK.getCode()); response.setCode(ResponseCode.OK.getCode());
response.setMessage("当前物料拣货完成。"); response.setMessage("当前物料拣货完成。");
response.setReturnData(standPickVo); response.setReturnData(standPickVo);
@ -1139,6 +1124,33 @@ public class TaskController {
} }
} }
/**
* 获取已完成行数信息
* @param standPickVo 查询
*/
public void getFinishedInfo(String workStation, StandPickVo standPickVo) {
try {
// 获取当前站台所有的工作流信息
List<WorkFlow> allWorkFlows = workFlowService.list(new LambdaQueryWrapper<WorkFlow>().eq(WorkFlow::getWorkStation, workStation));
int finishingRows = 0;
BigDecimal finishedCounts = BigDecimal.ZERO;
BigDecimal allCounts = BigDecimal.ZERO;
for (WorkFlow workFlow : allWorkFlows) {
if (workFlow.getWorkStatus() == 2) {
finishingRows++;
}
finishedCounts = finishedCounts.add(workFlow.getPickedNum());
allCounts = allCounts.add(workFlow.getNeedNum());
}
standPickVo.setFinishedRows(finishingRows);
standPickVo.setTotalRows(allWorkFlows.size());
standPickVo.setFinishedCounts(finishedCounts);
standPickVo.setTotalCounts(allCounts);
} catch (Exception e) {
logger.error("获取已完成数据报表失败,可能存在类型转换错误");
}
}
/** /**
* 获取电子标签反馈 * 获取电子标签反馈
* *
@ -1192,11 +1204,12 @@ public class TaskController {
GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper<GoodsToStation>() GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper<GoodsToStation>()
.eq(GoodsToStation::getWorkStation, workFlow.getWorkStation()) .eq(GoodsToStation::getWorkStation, workFlow.getWorkStation())
.eq(GoodsToStation::getGoodsId, workFlow.getGoodsId()) .eq(GoodsToStation::getGoodsId, workFlow.getGoodsId())
.lt(GoodsToStation::getDistributeStatus, 2) // .lt(GoodsToStation::getDistributeStatus, 2)
.last("limit 1")); .last("limit 1"));
if (goodsToStation != null) { if (goodsToStation != null) {
// 更新站台要料数量 // 更新站台要料数量
goodsToStation.setDistributedNum(goodsToStation.getDistributedNum().subtract(BigDecimal.valueOf(diffNum))); BigDecimal newDistributeNum = goodsToStation.getDistributedNum().subtract(BigDecimal.valueOf(diffNum));
goodsToStation.setDistributedNum(newDistributeNum.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : newDistributeNum);
goodsToStation.setDistributeStatus(1); goodsToStation.setDistributeStatus(1);
goodsToStationService.updateById(goodsToStation); goodsToStationService.updateById(goodsToStation);
} }
@ -1842,17 +1855,19 @@ public class TaskController {
// 生成料箱出库任务 // 生成料箱出库任务
int needNum = callEmptyVehicleRequest.getNeedNum(); int needNum = callEmptyVehicleRequest.getNeedNum();
List<Task> vehicleOutTasks = new ArrayList<>(); List<Task> vehicleOutTasks = new ArrayList<>();// 任务列表
// TODO List<String> outVehicleIds = new ArrayList<>();// 料箱列表
while (needNum > 0) { // 查询出需求数量的空箱
// 先找空箱 List<Vehicle> emptyVehicles = vehicleService.list(new LambdaQueryWrapper<Vehicle>()
Vehicle emptyVehicle = vehicleService.getOne(new LambdaQueryWrapper<Vehicle>()
.eq(StringUtils.isNotEmpty(callEmptyVehicleRequest.getVehicleType1()), Vehicle::getVehicleType, callEmptyVehicleRequest.getVehicleType1()) .eq(StringUtils.isNotEmpty(callEmptyVehicleRequest.getVehicleType1()), Vehicle::getVehicleType, callEmptyVehicleRequest.getVehicleType1())
.eq(Vehicle::getIsEmpty, 1) .eq(Vehicle::getIsEmpty, 1)
.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()) .eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode())
.orderByAsc(Vehicle::getLastInTime) .orderByAsc(Vehicle::getLastInTime)
.last("limit 1")); .last("limit " + needNum));
if (emptyVehicle != null) {// 有可用的空箱 for (Vehicle emptyVehicle : emptyVehicles) {
if (needNum <= 0) {
break;
}
// 创建一个空箱出库任务 // 创建一个空箱出库任务
Task emptyVehicleTask = new Task(); Task emptyVehicleTask = new Task();
emptyVehicleTask.setTaskId(generateId("VCK_")); emptyVehicleTask.setTaskId(generateId("VCK_"));
@ -1869,22 +1884,23 @@ public class TaskController {
emptyVehicleTask.setUserName(callEmptyVehicleRequest.getUserName()); emptyVehicleTask.setUserName(callEmptyVehicleRequest.getUserName());
emptyVehicleTask.setIsPicking(0); emptyVehicleTask.setIsPicking(0);
vehicleOutTasks.add(emptyVehicleTask); vehicleOutTasks.add(emptyVehicleTask);
// 更新料箱信息 // 出库料箱表
emptyVehicle.setVehicleStatus(VehicleStatus.OUT.getCode()); outVehicleIds.add(emptyVehicle.getVehicleId());
vehicleService.updateById(emptyVehicle);
needNum--; needNum--;
} else {// 已经没有空箱可用了
// TODO 这里后续增加出不出带料箱子的配置
break;
}
} }
// 保存任务
taskService.saveBatch(vehicleOutTasks); taskService.saveBatch(vehicleOutTasks);
// 更新料箱表
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, outVehicleIds)
.ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()));
if (needNum <= 0) { if (needNum <= 0) {
response.setCode(ResponseCode.OK.getCode()); response.setCode(ResponseCode.OK.getCode());
response.setMessage("呼叫空箱成功,请等待箱子出库。"); response.setMessage("呼叫空箱成功,请等待箱子出库。");
} else if (needNum < callEmptyVehicleRequest.getNeedNum()) { } else if (needNum < callEmptyVehicleRequest.getNeedNum()) {
response.setCode(ResponseCode.OK.getCode()); response.setCode(ResponseCode.OK.getCode());
response.setMessage("已呼叫空箱,但库中空箱数量不足。需求" + callEmptyVehicleRequest.getNeedNum() + "个,实际呼叫" + (callEmptyVehicleRequest.getNeedNum() - needNum) + "个。"); response.setMessage("已呼叫空箱,但库中空箱数量不足。需求" + callEmptyVehicleRequest.getNeedNum() + "个,实际呼叫" + vehicleOutTasks.size() + "个。");
} else { } else {
response.setCode(ResponseCode.ERROR.getCode()); response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("库中没有空箱了。"); response.setMessage("库中没有空箱了。");
@ -2273,7 +2289,7 @@ public class TaskController {
} else { } else {
logger.info("没有可亮灯的数据。"); logger.info("没有可亮灯的数据。");
response.setCode(ResponseCode.ERROR.getCode()); response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("没有可亮灯的数据"); response.setMessage("没有可亮灯的数据,请按按钮");
} }
return convertJsonString(response); return convertJsonString(response);
} catch (Exception e) { } catch (Exception e) {
@ -2513,6 +2529,14 @@ public class TaskController {
response.setMessage("请求缺少必须参数,箱号、料号、数量不可缺少。"); response.setMessage("请求缺少必须参数,箱号、料号、数量不可缺少。");
return convertJsonString(response); return convertJsonString(response);
} }
// 验证载具号是否重复入库
if (vehicleService.exists(new LambdaQueryWrapper<Vehicle>().eq(Vehicle::getVehicleId, pickNumQuery.getVehicleId())
.and(wrapper -> wrapper.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode())))) {
logger.error("当前箱子{}已在库中,无法回库。", pickNumQuery.getVehicleId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前箱子" + pickNumQuery.getVehicleId() + "已在库中,无法回库。");
return convertJsonString(response);
}
// 更新库存 // 更新库存
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>() Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, pickNumQuery.getGoodsId()) .apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, pickNumQuery.getGoodsId())
@ -2522,10 +2546,23 @@ public class TaskController {
if (existStock != null && existStock.getGoodsRelated() != null) { if (existStock != null && existStock.getGoodsRelated() != null) {
Stock originStock = BeanUtil.copyProperties(existStock, Stock.class); Stock originStock = BeanUtil.copyProperties(existStock, Stock.class);
StockDetailInfo goodsDetail = existStock.getGoodsRelated(); StockDetailInfo goodsDetail = existStock.getGoodsRelated();
goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(pickNumQuery.getRealPickNum())); // 设置剩余库存
if (pickNumQuery.getRemainNum() != null) {
goodsDetail.setRemainNum(pickNumQuery.getRemainNum());
} else {
BigDecimal calRemainNum = goodsDetail.getRemainNum().subtract(pickNumQuery.getRealPickNum());
if (calRemainNum.compareTo(BigDecimal.ZERO) <= 0) {
logger.error("系统计算领料后库存为0请界面输入剩余数量后再确认回库。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("系统计算领料后库存为0请界面输入剩余数量后再确认回库。");
return convertJsonString(response);
} else {
goodsDetail.setRemainNum(calRemainNum);
}
}
existStock.setGoodsRelated(goodsDetail); existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock); stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "直接物料非计划领料确认回库", pickNumQuery.getUserName()); stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "直接物料非计划领料确认回库更新", pickNumQuery.getUserName());
} }
// 判断这个箱子是否还有拣选任务 // 判断这个箱子是否还有拣选任务
boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper<PickTask>() boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
@ -2537,14 +2574,6 @@ public class TaskController {
.eq(Task::getTaskType, TaskType.IN.getCode()) .eq(Task::getTaskType, TaskType.IN.getCode())
.likeRight(Task::getTaskId, "HK_")); .likeRight(Task::getTaskId, "HK_"));
if (!hasBackTask) { if (!hasBackTask) {
// 验证载具号是否重复入库
if (vehicleService.exists(new LambdaQueryWrapper<Vehicle>().eq(Vehicle::getVehicleId, pickNumQuery.getVehicleId())
.and(wrapper -> wrapper.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode())))) {
logger.error("当前箱子{}已在库中,无法回库。", pickNumQuery.getVehicleId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前箱子" + pickNumQuery.getVehicleId() + "已在库中,无法回库。");
return convertJsonString(response);
}
// 判断当前载具是否有入库任务 // 判断当前载具是否有入库任务
boolean hasInTask = taskService.exists(new LambdaQueryWrapper<Task>() boolean hasInTask = taskService.exists(new LambdaQueryWrapper<Task>()
.eq(Task::getVehicleId, pickNumQuery.getVehicleId()) .eq(Task::getVehicleId, pickNumQuery.getVehicleId())
@ -2552,64 +2581,19 @@ public class TaskController {
.eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode()) .eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode())
.likeRight(Task::getTaskId, "RK_")); .likeRight(Task::getTaskId, "RK_"));
if (!hasInTask) { if (!hasInTask) {
// 寻找库位
String nextLocationId = "";
for (int i = 0; i < locationService.count(new LambdaQueryWrapper<Location>().eq(Location::getLocationStatus, LocationStatus.EMPTY.getCode())); i++) {
Map<String, String> resultMap = locationService.getOneLocation("", "");
if (resultMap.isEmpty() || !resultMap.containsKey("nextLocationId")) {
logger.error("暂无可用库位");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("暂无可用库位!");
return convertJsonString(response);
} else {
Location nextLocation = locationService.getOne(new LambdaQueryWrapper<Location>().eq(Location::getLocationId, resultMap.get("nextLocationId")).last("limit 1"));
LambdaUpdateWrapper<Location> updateLocationWrapper = new LambdaUpdateWrapper<Location>()
.set(Location::getLocationStatus, LocationStatus.OCCUPY.getCode())
.set(Location::getVehicleId, pickNumQuery.getVehicleId())
.eq(Location::getLocationId, nextLocation.getLocationId())
.eq(Location::getLocationStatus, LocationStatus.EMPTY.getCode());
if (locationService.update(updateLocationWrapper)) {
nextLocationId = resultMap.get("nextLocationId");
break;
}
}
}
if (Objects.equals(nextLocationId, "")) {
logger.error("暂无可用库位");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("暂无可用库位!");
return convertJsonString(response);
}
// 生成回库任务 // 生成回库任务
Task backTask = new Task(); Task backTask = new Task();
backTask.setTaskId(generateId("HK_")); backTask.setTaskId(generateId("HK_"));
backTask.setTaskGroup(generateId("")); backTask.setTaskGroup(generateId(""));
backTask.setTaskType(TaskType.IN.getCode()); backTask.setTaskType(TaskType.IN.getCode());
backTask.setTaskStatus(WmsTaskStatus.NEW.getCode()); backTask.setTaskStatus(WmsTaskStatus.TEMP.getCode());
backTask.setVehicleId(pickNumQuery.getVehicleId()); backTask.setVehicleId(pickNumQuery.getVehicleId());
backTask.setDestination(nextLocationId);
backTask.setVehicleSize(1); backTask.setVehicleSize(1);
backTask.setWeight(BigDecimal.ZERO); backTask.setWeight(BigDecimal.ZERO);
backTask.setTaskPriority(1); backTask.setTaskPriority(1);
backTask.setUserName(pickNumQuery.getUserName()); backTask.setUserName(pickNumQuery.getUserName());
backTask.setCreateTime(LocalDateTime.now()); backTask.setCreateTime(LocalDateTime.now());
if (taskService.save(backTask)) { taskService.save(backTask);
// 设置库存状态为回库中
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.BACK.getCode())
.eq(Stock::getVehicleId, pickNumQuery.getVehicleId()));
} else {
// 回退库位锁定
locationService.update(new LambdaUpdateWrapper<Location>()
.set(Location::getLocationStatus, LocationStatus.EMPTY.getCode())
.set(Location::getVehicleId, "")
.eq(Location::getLocationId, nextLocationId)
.eq(Location::getLocationStatus, LocationStatus.OCCUPY.getCode()));
logger.error("生成回库任务失败,箱号:{}", pickNumQuery.getVehicleId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("生成回库任务失败。");
return convertJsonString(response);
}
} }
} }
logger.info("确认回库成功。"); logger.info("确认回库成功。");

View File

@ -27,4 +27,9 @@ public class PickNumQuery extends PageQuery{
*/ */
@JsonProperty("realPickNum") @JsonProperty("realPickNum")
private BigDecimal realPickNum; private BigDecimal realPickNum;
/**
* 剩余数量
*/
@JsonProperty("remainNum")
private BigDecimal remainNum;
} }

View File

@ -10,6 +10,12 @@ public interface IWmsJobService {
*/ */
void sendCommonTasks() throws Exception; void sendCommonTasks() throws Exception;
/**
* 下发拣选出库任务
* @throws Exception 异常
*/
void sendPickOutTasks() throws Exception;
/** /**
* 发送拣选任务 * 发送拣选任务
* @throws Exception 异常用于回滚事务 * @throws Exception 异常用于回滚事务

View File

@ -27,6 +27,7 @@ import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import static com.wms.config.InitLocalConfig.configMap; import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.config.InitLocalConfig.instantLocationMap;
import static com.wms.utils.StringUtils.convertJsonString; import static com.wms.utils.StringUtils.convertJsonString;
/** /**
@ -53,43 +54,16 @@ public class WmsJobServiceImplements implements IWmsJobService {
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()); .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode());
List<Task> allTasks = taskService.list(waitForDistributeTaskQuery); List<Task> allTasks = taskService.list(waitForDistributeTaskQuery);
if (!allTasks.isEmpty()) { if (!allTasks.isEmpty()) {
String max_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_VEHICLE_NUMS.getConfigKey());
String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey()); String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey());
if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums)) { if (StringUtils.isEmpty(max_wcs_accept_nums)) {
logger.error("配置未生成"); logger.error("配置未生成");
return; return;
} }
int maxVehicleNums = Integer.parseInt(max_vehicle_nums);
int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums); int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);
List<String> outsideVehicles = outsideVehiclesService.selectDistinctVehicles();
if (outsideVehicles == null || outsideVehicles.isEmpty()) {
outsideVehicles = Collections.emptyList();
}
int remainVehicleNums = maxVehicleNums - outsideVehicles.size();
// 需要发送给wcs的任务列表 // 需要发送给wcs的任务列表
List<WcsTaskRequest> request = new ArrayList<>(); List<WcsTaskRequest> request = new ArrayList<>();
// 已经下发的任务组列表 // 已经下发的任务组列表
List<String> taskGroupIds = new ArrayList<>(); List<String> taskGroupIds = new ArrayList<>();
// 本次生成的环线任务
List<String> pickVehicleIds = new ArrayList<>();
// 查找所有已经出库的站台拣选任务
List<PickTask> standPickTasks = pickTaskService.list();
// 生成一个Map计算每个站台已经出库的拣选任务
Map<String, Integer> outPickTaskMap = new HashMap<>();
// 轮询工作站台判断是否需要下发任务
List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
.eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
.eq(Stand::getStandType, 2));
for (Stand workStation : stands) {
outPickTaskMap.put(workStation.getStandId(), 0);
}
standPickTasks.forEach(pickTask -> {
if (!Objects.equals(pickTask.getPickStatus(), PickTaskStatusEnum.TEMP.getCode())) {
outPickTaskMap.put(pickTask.getStandId(),
outPickTaskMap.getOrDefault(pickTask.getStandId(), 0) + 1);
}
});
// 这里单独处理站台拣选出库以外的任务 // 这里单独处理站台拣选出库以外的任务
for (Task task : allTasks) { for (Task task : allTasks) {
if (taskGroupIds.size() >= maxWcsAcceptNums) { if (taskGroupIds.size() >= maxWcsAcceptNums) {
@ -128,91 +102,6 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 已经发送过的任务组 // 已经发送过的任务组
taskGroupIds.add(task.getTaskGroup()); taskGroupIds.add(task.getTaskGroup());
} }
// 处理站台拣选出库任务
while (taskGroupIds.size() < maxWcsAcceptNums && pickVehicleIds.size() < remainVehicleNums) {
// 先找出目前数量最少的站台
String standId = outPickTaskMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
List<String> vehicleIds;
if (StringUtils.isNotEmpty(standId)) {
// 查找这个站台未下发的料箱
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode()) && !pickVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
outPickTaskMap.remove(standId);
continue;
}
} else {
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode()) && !pickVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
break;
}
}
// 生成箱子-站台数量的Map
Map<String, Integer> vehicleStandsMap = new HashMap<>();
standPickTasks.forEach(pickTask -> {
if (vehicleIds.contains(pickTask.getVehicleId())) {
vehicleStandsMap.put(pickTask.getVehicleId(),
vehicleStandsMap.getOrDefault(pickTask.getVehicleId(), 0) + 1);
}
});
// 先找出目前数量最多的料箱
String vehicleId = vehicleStandsMap.entrySet().stream()
.max(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
if (StringUtils.isEmpty(vehicleId)) {
continue;
}
// 更新每个站台的拣选箱数量
List<String> standIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getVehicleId().equals(vehicleId))
.map(PickTask::getStandId)
.distinct()
.toList();
if (!standIds.isEmpty()) {
standIds.forEach(tempStandId -> outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1));
}
// 找到这个箱子的任务
List<Task> outPickTasks = allTasks.stream().filter(task ->
task.getVehicleId().equals(vehicleId) && Objects.equals(task.getTaskType(), TaskType.OUT.getCode())
&& task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
for (Task task : outPickTasks) {
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
continue;
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
tempTask.setTaskType(task.getTaskType());
tempTask.setOrigin(task.getOrigin());
tempTask.setDestination(task.getDestination());
tempTask.setVehicleNo(task.getVehicleId());
tempTask.setVehicleSize(task.getVehicleSize());
tempTask.setWeight(task.getWeight());
tempTask.setPriority(task.getTaskPriority());
request.add(tempTask);
// 已经发送过的任务组
taskGroupIds.add(task.getTaskGroup());
}
pickVehicleIds.add(vehicleId);
}
if (request.size() == 0) { if (request.size() == 0) {
// 没有新任务发送 // 没有新任务发送
return; return;
@ -236,12 +125,6 @@ public class WmsJobServiceImplements implements IWmsJobService {
.set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode()) .set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.in(Task::getTaskGroup, taskGroupIds) .in(Task::getTaskGroup, taskGroupIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())); .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// 流转载具状态变更
if (!pickVehicleIds.isEmpty()) {
outsideVehiclesService.update(new LambdaUpdateWrapper<OutsideVehicles>()
.set(OutsideVehicles::getOutStatus, 1)
.in(OutsideVehicles::getVehicleId, pickVehicleIds));
}
} else { } else {
// 判断returnData的数据 // 判断returnData的数据
if (result.getReturnData() != null) { if (result.getReturnData() != null) {
@ -268,6 +151,220 @@ public class WmsJobServiceImplements implements IWmsJobService {
} }
} }
@Override
public void sendPickOutTasks() throws Exception {
try {
// 检索任务表---新建未下发的任务
LambdaQueryWrapper<Task> waitForDistributeTaskQuery = new LambdaQueryWrapper<Task>()
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())
.eq(Task::getTaskType, TaskType.OUT.getCode());
List<Task> allTasks = taskService.list(waitForDistributeTaskQuery);
if (!allTasks.isEmpty()) {
// 需要发送给wcs的任务列表
List<WcsTaskRequest> request = new ArrayList<>();
// 已经下发的任务组列表
List<String> taskGroupIds = new ArrayList<>();
// 本次生成的环线任务
List<String> pickVehicleIds = new ArrayList<>();
// 查找所有站台拣选任务
List<PickTask> standPickTasks = pickTaskService.list();
// 生成一个Map计算每个站台已经出库的拣选任务
Map<String, Integer> outPickTaskMap = new HashMap<>();
// 轮询工作站台判断是否需要下发任务
List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
.eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
.eq(Stand::getStandType, 2));
for (Stand workStation : stands) {
outPickTaskMap.put(workStation.getStandId(), 0);
}
standPickTasks.forEach(pickTask -> {
if (!Objects.equals(pickTask.getPickStatus(), PickTaskStatusEnum.TEMP.getCode())) {
outPickTaskMap.put(pickTask.getStandId(),
outPickTaskMap.getOrDefault(pickTask.getStandId(), 0) + 1);
}
});
// 轮询堆垛机状态
List<Stand> stackerList = standService.list(new LambdaQueryWrapper<Stand>()
.eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
.eq(Stand::getStandType, 3));
List<Task> stackRunningTasks = taskService.list(new LambdaQueryWrapper<Task>()
.eq(Task::getTaskType, TaskType.OUT.getCode())
.eq(Task::getTaskStatus, WmsTaskStatus.RUN.getCode()));
Map<Integer, Integer> runningTaskNumToEquipmentMap = new HashMap<>();
Map<Integer, List<Task>> newTaskToEquipmentMap = new HashMap<>();
for (Stand stacker : stackerList) {
// 找这台堆垛机正在执行的拣选出库任务数量
runningTaskNumToEquipmentMap.put(stacker.getEquipmentId(), 0);
// 查询每台堆垛机还没有下发的任务
List<Task> stackNewTasks = allTasks.stream().filter(task ->
task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())
&& Objects.equals(stacker.getEquipmentId(), instantLocationMap.get(task.getOrigin()).getEquipmentId())
).toList();
newTaskToEquipmentMap.put(stacker.getEquipmentId(), stackNewTasks);
}
stackRunningTasks.forEach(task -> {
if (instantLocationMap.containsKey(task.getOrigin())) {
int key = instantLocationMap.get(task.getOrigin()).getEquipmentId();
runningTaskNumToEquipmentMap.put(key, runningTaskNumToEquipmentMap.get(key) + 1);
}
});
for (Stand stacker : stackerList) {
int availableTaskNum = 2 - runningTaskNumToEquipmentMap.get(stacker.getEquipmentId());
while (availableTaskNum > 0) {
// 可以继续发任务
List<Task> currentStackerTasks = newTaskToEquipmentMap.get(stacker.getEquipmentId());
// 从这些任务里面找到最适合的任务下发
if (!currentStackerTasks.isEmpty()) {
// 先找出目前数量最少的站台
String standId = outPickTaskMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
List<String> vehicleIds;
List<String> currentStackerVehicleIds = currentStackerTasks.stream().map(Task::getVehicleId).distinct().toList();
if (StringUtils.isNotEmpty(standId)) {
// 查找这个站台未下发的料箱
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& !pickVehicleIds.contains(pickTask.getVehicleId()) && currentStackerVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
outPickTaskMap.remove(standId);
continue;
}
} else {
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& !pickVehicleIds.contains(pickTask.getVehicleId()) && currentStackerVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
break;
}
}
// 生成箱子-站台数量的Map
Map<String, Integer> vehicleStandsMap = new HashMap<>();
standPickTasks.forEach(pickTask -> {
if (vehicleIds.contains(pickTask.getVehicleId())) {
vehicleStandsMap.put(pickTask.getVehicleId(),
vehicleStandsMap.getOrDefault(pickTask.getVehicleId(), 0) + 1);
}
});
// 先找出适合的料箱
String vehicleId = vehicleStandsMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
if (StringUtils.isEmpty(vehicleId)) {
continue;
}
// 更新每个站台的拣选箱数量
List<String> standIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getVehicleId().equals(vehicleId))
.map(PickTask::getStandId)
.distinct()
.toList();
if (!standIds.isEmpty()) {
standIds.forEach(tempStandId -> outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1));
}
// 找到这个箱子的任务
List<Task> outPickTasks = currentStackerTasks.stream().filter(task -> task.getVehicleId().equals(vehicleId)).toList();
for (Task task : outPickTasks) {
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
currentStackerTasks.remove(task);
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
continue;
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
tempTask.setTaskType(task.getTaskType());
tempTask.setOrigin(task.getOrigin());
tempTask.setDestination(task.getDestination());
tempTask.setVehicleNo(task.getVehicleId());
tempTask.setVehicleSize(task.getVehicleSize());
tempTask.setWeight(task.getWeight());
tempTask.setPriority(task.getTaskPriority());
request.add(tempTask);
// 已经发送过的任务组
taskGroupIds.add(task.getTaskGroup());
}
// 已经发送过的vehicleId
pickVehicleIds.add(vehicleId);
// 移除已经发送过的任务
currentStackerTasks.removeIf(task -> task.getVehicleId().equals(vehicleId));
newTaskToEquipmentMap.replace(stacker.getEquipmentId(), currentStackerTasks);
} else {
break;
}
// 可用数量-1
availableTaskNum--;
}
}
if (request.size() == 0) {
// 没有新任务发送
return;
}
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
if (url != null) {
logger.info("向WCS发送拣选出库任务地址{},请求详情:{}", url, convertJsonString(request));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误。");
}
if (result == null) {
logger.error("发送拣选出库任务异常。");
} else {
if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
logger.info("发送WCS拣选出库任务成功。");
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.in(Task::getTaskGroup, taskGroupIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// 流转载具状态变更
if (!pickVehicleIds.isEmpty()) {
outsideVehiclesService.update(new LambdaUpdateWrapper<OutsideVehicles>()
.set(OutsideVehicles::getOutStatus, 1)
.in(OutsideVehicles::getVehicleId, pickVehicleIds));
}
} else {
// 判断returnData的数据
if (result.getReturnData() != null) {
List<WcsTaskRequest> errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class);
if (!errorTasks.isEmpty()) {
List<String> failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList();
// 更新任务状态为异常
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode())
.in(Task::getTaskGroup, failedTaskIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
}
}
logger.error("发送拣选出库任务错误:{}", convertJsonString(result));
}
}
} else {
logger.error("WCS发送任务地址为空。");
}
}
} catch (Exception exception) {
logger.error("向WCS发送拣选出库任务时发生异常{}", convertJsonString(exception));
throw new Exception("向WCS发送拣选出库任务时发生异常。");
}
}
/** /**
* 发送拣选任务 * 发送拣选任务
*/ */

View File

@ -92,7 +92,7 @@ public class WorkServiceImplements implements IWorkService {
workOrderList.add(tempWorkflow.getWorkOrder()); workOrderList.add(tempWorkflow.getWorkOrder());
} }
// 添加盒子配置 // 添加盒子配置
String boxNo = tempWorkflow.getWorkOrder() + "-" + tempWorkflow.getWorkCenter(); String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter();
if (!boxNoList.contains(boxNo)) { if (!boxNoList.contains(boxNo)) {
boxNoList.add(boxNo); boxNoList.add(boxNo);
} }
@ -147,8 +147,8 @@ public class WorkServiceImplements implements IWorkService {
if (!boxNoList.isEmpty()) { if (!boxNoList.isEmpty()) {
String tempBoxNo = boxNoList.get(0); String tempBoxNo = boxNoList.get(0);
ELocationConfig eLocationConfig = new ELocationConfig(); ELocationConfig eLocationConfig = new ELocationConfig();
eLocationConfig.setWorkOrder(tempBoxNo.split("-")[0]); eLocationConfig.setWorkOrder(tempBoxNo.split("@")[0]);
eLocationConfig.setWorkCenter(tempBoxNo.split("-")[1]); eLocationConfig.setWorkCenter(tempBoxNo.split("@")[1]);
eLocationConfig.setWorkStation(workStation); eLocationConfig.setWorkStation(workStation);
eLocationConfig.setELocationId(eTagLocation.getELocationId()); eLocationConfig.setELocationId(eTagLocation.getELocationId());
eLocationConfig.setOrderBoxNo(tempBoxNo); eLocationConfig.setOrderBoxNo(tempBoxNo);
@ -327,7 +327,7 @@ public class WorkServiceImplements implements IWorkService {
workSummaryList.add(summary); workSummaryList.add(summary);
// 更新工单表 // 更新工单表
kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>() kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>()
.set(KateOrders::getOrderStatus, 2) .set(KateOrders::getOrderStatus, 4)
.set(KateOrders::getFinishTime, LocalDateTime.now()) .set(KateOrders::getFinishTime, LocalDateTime.now())
.set(KateOrders::getPickedQuantity, workFlow.getPickedNum()) .set(KateOrders::getPickedQuantity, workFlow.getPickedNum())
.set(KateOrders::getLackQuantity, workFlow.getNeedNum().subtract(workFlow.getPickedNum())) .set(KateOrders::getLackQuantity, workFlow.getNeedNum().subtract(workFlow.getPickedNum()))

View File

@ -3,10 +3,7 @@ package com.wms.utils.excel.listener;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils; import com.alibaba.excel.util.ListUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms.entity.table.KateDBS; import com.wms.entity.table.KateDBS;
import com.wms.entity.table.KateDBSLast;
import com.wms.service.KateDBSLastService;
import com.wms.service.KateDBSService; import com.wms.service.KateDBSService;
import com.wms.utils.StringUtils; import com.wms.utils.StringUtils;
import com.wms.utils.excel.vo.KateDbsExcelVo; import com.wms.utils.excel.vo.KateDbsExcelVo;
@ -14,8 +11,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import static com.wms.utils.WmsUtils.generateId; import static com.wms.utils.WmsUtils.generateId;
@ -28,17 +26,14 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
* 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收 * 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收
*/ */
private static final int BATCH_COUNT = 100; private static final int BATCH_COUNT = 100;
/**
* 保存数据总数
*/
private int SAVE_COUNT = 0;
private List<KateDbsExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); private List<KateDbsExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final KateDBSService kateDBSService;// Dbs服务 private final KateDBSService kateDBSService;// Dbs服务
private final KateDBSLastService kateDBSLastService;// DbsLast服务
private final String uploadUser;// 用户 private final String uploadUser;// 用户
public UploadDbsListener(KateDBSService kateDBSService, KateDBSLastService kateDBSLastService, String uploadUser) { private final Map<String, KateDBS> oldKateDBSMap;// 旧的DBS数据
private final Map<String, KateDBS> newKateDBSMap = new HashMap<>();// 新的DBS数据
public UploadDbsListener(KateDBSService kateDBSService, Map<String, KateDBS> oldKateDBSMap, String uploadUser) {
this.kateDBSService = kateDBSService; this.kateDBSService = kateDBSService;
this.kateDBSLastService = kateDBSLastService; this.oldKateDBSMap = oldKateDBSMap;
this.uploadUser = uploadUser; this.uploadUser = uploadUser;
} }
@ -66,7 +61,6 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
} }
// 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM // 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM
if (cachedDataList.size() >= BATCH_COUNT) { if (cachedDataList.size() >= BATCH_COUNT) {
logger.info("已经导入{}条数据,开始存储数据库!", cachedDataList.size());
saveData(); saveData();
// 存储完成清理 list // 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@ -80,38 +74,34 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
*/ */
@Override @Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) { public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 再做一次数据处理
saveData(); saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT); // 在这里统一保存数据
insertIntoDb();
} }
/** /**
* 存储数据 * 存储数据
*/ */
private void saveData() { private void saveData() {
List<KateDBS> kateDbsList = new ArrayList<>();
for (KateDbsExcelVo kateDbsExcelVo : cachedDataList) { for (KateDbsExcelVo kateDbsExcelVo : cachedDataList) {
if (kateDBSService.exists(new LambdaQueryWrapper<KateDBS>() if (newKateDBSMap.containsKey(kateDbsExcelVo.getWorkOrder())) {
.eq(KateDBS::getWorkOrder, kateDbsExcelVo.getWorkOrder()) // 新的数据工单号重复那么跳过这条DBS
.or().eq(KateDBS::getWorkSequence, kateDbsExcelVo.getWorkSequence()))) {
// 工单号或者序号重复那么跳过这条DBS
continue; continue;
} }
KateDBSLast kateDbsLast = kateDBSLastService.getOne(new LambdaQueryWrapper<KateDBSLast>() if (oldKateDBSMap.containsKey(kateDbsExcelVo.getWorkOrder())) {
.eq(KateDBSLast::getWorkOrder, kateDbsExcelVo.getWorkOrder())); // 之前有
if (kateDbsLast != null) { KateDBS oldKateDbs = oldKateDBSMap.get(kateDbsExcelVo.getWorkOrder());
// 之前存在过
KateDBS oldKateDbs = new KateDBS();
oldKateDbs.setDbsId(kateDbsLast.getDbsId());
oldKateDbs.setWorkSequence(kateDbsExcelVo.getWorkSequence()); oldKateDbs.setWorkSequence(kateDbsExcelVo.getWorkSequence());
oldKateDbs.setMachineNo(kateDbsExcelVo.getMachineNo()); oldKateDbs.setMachineNo(kateDbsExcelVo.getMachineNo());
oldKateDbs.setWorkOrder(kateDbsExcelVo.getWorkOrder());
oldKateDbs.setPlanStartDate(kateDbsExcelVo.getPlanStartDate()); oldKateDbs.setPlanStartDate(kateDbsExcelVo.getPlanStartDate());
oldKateDbs.setDbsStatus(kateDbsLast.getDbsStatus());
oldKateDbs.setLastUpdateTime(LocalDateTime.now()); oldKateDbs.setLastUpdateTime(LocalDateTime.now());
oldKateDbs.setLastUpdateUser(uploadUser); oldKateDbs.setLastUpdateUser(uploadUser);
kateDbsList.add(oldKateDbs); // 替换
newKateDBSMap.put(kateDbsExcelVo.getWorkOrder(), oldKateDbs);
} else { } else {
// 之前没存在过 // 之前没
KateDBS newKateDbs = new KateDBS(); KateDBS newKateDbs = new KateDBS();
newKateDbs.setDbsId(generateId("DBS_")); newKateDbs.setDbsId(generateId("DBS_"));
newKateDbs.setWorkSequence(kateDbsExcelVo.getWorkSequence()); newKateDbs.setWorkSequence(kateDbsExcelVo.getWorkSequence());
@ -121,10 +111,19 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
newKateDbs.setDbsStatus(0); newKateDbs.setDbsStatus(0);
newKateDbs.setLastUpdateTime(LocalDateTime.now()); newKateDbs.setLastUpdateTime(LocalDateTime.now());
newKateDbs.setLastUpdateUser(uploadUser); newKateDbs.setLastUpdateUser(uploadUser);
kateDbsList.add(newKateDbs); // 添加
newKateDBSMap.put(kateDbsExcelVo.getWorkOrder(), newKateDbs);
} }
} }
kateDBSService.saveOrUpdateBatch(kateDbsList); }
SAVE_COUNT += kateDbsList.size();
/**
* 保存数据库
*/
private void insertIntoDb() {
logger.info("此次共导入{}条数据。", newKateDBSMap.size());
// 保存数据
kateDBSService.saveOrUpdateBatch(newKateDBSMap.values(), BATCH_COUNT);
logger.info("保存成功{}条数据。", newKateDBSMap.size());
} }
} }

View File

@ -72,6 +72,7 @@ public class UploadGoodsListener implements ReadListener<GoodsExcelVo> {
*/ */
@Override @Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) { public void doAfterAllAnalysed(AnalysisContext analysisContext) {
logger.info("已经导入{}条数据,开始存储数据库!", cachedDataList.size());
saveData(); saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT); logger.info("此次共保存{}条数据。", SAVE_COUNT);
} }

View File

@ -25,27 +25,19 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
/** /**
* 每隔5条存储数据库实际使用中可以1000条然后清理list 方便内存回收 * 每隔5条存储数据库实际使用中可以1000条然后清理list 方便内存回收
*/ */
private static final int BATCH_COUNT = 5000; private static final int BATCH_COUNT = 1000;
/**
* 保存数据总数
*/
private int SAVE_COUNT = 0;
private List<KateOrdersExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); private List<KateOrdersExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/** /**
* 优化导入速度的变量---开始 * 筛选工单字符串
*/
private int MAP_INDEX = 0;
private int LAST_SHOT_INDEX = 0;
private final Map<Integer, Map<String, KateOrders>> doneMap = new HashMap<>();
private final List<KateOrdersLast> kateOrdersLastList;// 所有之前的工单列表;
/**
* 优化导入速度的变量---结束
*/ */
private final String slocFilterString = configMap.get(ConfigMapKeyEnum.SLOC_FILTER_STRING.getConfigKey());
private final KateOrdersService kateOrdersService;// Dbs服务 private final KateOrdersService kateOrdersService;// Dbs服务
private final String uploadUser;// 用户 private final String uploadUser;// 用户
public UploadKateOrdersListener(List<KateOrdersLast> kateOrdersLastList, KateOrdersService kateOrdersService, String uploadUser) { private final Map<String, KateOrders> oldKateOrdersMap;// 旧的工单数据
this.kateOrdersLastList = kateOrdersLastList; private final Map<String, KateOrders> newKateOrdersMap = new HashMap<>();// 新的工单数据
public UploadKateOrdersListener(KateOrdersService kateOrdersService, Map<String, KateOrders> oldKateOrdersMap, String uploadUser) {
this.kateOrdersService = kateOrdersService; this.kateOrdersService = kateOrdersService;
this.oldKateOrdersMap = oldKateOrdersMap;
this.uploadUser = uploadUser; this.uploadUser = uploadUser;
} }
@ -64,7 +56,6 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
*/ */
@Override @Override
public void invoke(KateOrdersExcelVo kateOrdersExcelVo, AnalysisContext analysisContext) { public void invoke(KateOrdersExcelVo kateOrdersExcelVo, AnalysisContext analysisContext) {
String slocFilterString = configMap.get(ConfigMapKeyEnum.SLOC_FILTER_STRING.getConfigKey());
if (StringUtils.isNotEmpty(slocFilterString) && Objects.equals(kateOrdersExcelVo.getSortString(), slocFilterString)) { if (StringUtils.isNotEmpty(slocFilterString) && Objects.equals(kateOrdersExcelVo.getSortString(), slocFilterString)) {
// 符合筛选字符串 // 符合筛选字符串
if (StringUtils.isNotEmpty(kateOrdersExcelVo.getWorkOrder()) if (StringUtils.isNotEmpty(kateOrdersExcelVo.getWorkOrder())
@ -78,7 +69,6 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
} }
// 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM // 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM
if (cachedDataList.size() >= BATCH_COUNT) { if (cachedDataList.size() >= BATCH_COUNT) {
logger.info("已经导入{}条数据,开始存储数据库!", cachedDataList.size());
saveData(); saveData();
// 存储完成清理 list // 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@ -92,91 +82,28 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
*/ */
@Override @Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) { public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 再做一次数据处理
saveData(); saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT); // 在这里统一保存数据
insertIntoDb();
} }
/** /**
* 存储数据 * 存储数据
*/ */
private void saveData() { private void saveData() {
List<KateOrders> kateOrdersList = new ArrayList<>();
Map<String, KateOrders> tempDoneMap = new HashMap<>();
for (KateOrdersExcelVo kateOrdersExcelVo : cachedDataList) { for (KateOrdersExcelVo kateOrdersExcelVo : cachedDataList) {
// 查看当前List中是否有该工单 String key = kateOrdersExcelVo.getWorkOrder() + kateOrdersExcelVo.getGoodsId() + kateOrdersExcelVo.getSupplyArea();
List<KateOrders> currentOrdersList = kateOrdersList.stream().filter(kateOrders -> if (newKateOrdersMap.containsKey(key)) {
Objects.equals(kateOrders.getWorkOrder(), kateOrdersExcelVo.getWorkOrder()) KateOrders currentOrder = newKateOrdersMap.get(key);
&& Objects.equals(kateOrders.getGoodsId(), kateOrdersExcelVo.getGoodsId())
&& Objects.equals(kateOrders.getSupplyArea(), kateOrdersExcelVo.getSupplyArea())
).toList();
if (!currentOrdersList.isEmpty()) {
KateOrders currentOrder = currentOrdersList.get(0);
// 设定数量 // 设定数量
currentOrder.setRequirementQuantity(currentOrder.getRequirementQuantity().add(kateOrdersExcelVo.getRequirementQuantity())); currentOrder.setRequirementQuantity(currentOrder.getRequirementQuantity().add(kateOrdersExcelVo.getRequirementQuantity()));
currentOrder.setLackQuantity(currentOrder.getLackQuantity().add(kateOrdersExcelVo.getRequirementQuantity())); currentOrder.setLackQuantity(currentOrder.getLackQuantity().add(kateOrdersExcelVo.getRequirementQuantity()));
// 先移除 newKateOrdersMap.replace(key, currentOrder);
kateOrdersList.removeIf(kateOrders ->
Objects.equals(kateOrders.getWorkOrder(), kateOrdersExcelVo.getWorkOrder())
&& Objects.equals(kateOrders.getGoodsId(), kateOrdersExcelVo.getGoodsId())
&& Objects.equals(kateOrders.getSupplyArea(), kateOrdersExcelVo.getSupplyArea()));
// 再添加
kateOrdersList.add(currentOrder);
continue; continue;
} }
// 查询数据库是否存在重复数据 // 查询数据库是否存在重复数据
KateOrders existsKateOrder = null; if (!oldKateOrdersMap.containsKey(key)) {
String key = kateOrdersExcelVo.getWorkOrder() + kateOrdersExcelVo.getGoodsId() + kateOrdersExcelVo.getSupplyArea();
if (LAST_SHOT_INDEX > 0) {
if (doneMap.get(LAST_SHOT_INDEX).containsKey(key)) {
existsKateOrder = doneMap.get(LAST_SHOT_INDEX).get(key);
System.out.println("命中");
}
} else {
for (Integer keyIndex : doneMap.keySet()) {
if (doneMap.get(keyIndex).containsKey(key)) {
LAST_SHOT_INDEX = keyIndex;
existsKateOrder = doneMap.get(keyIndex).get(key);
System.out.println("命中");
break;
}
}
}
if (existsKateOrder != null) {
// 数据重复
existsKateOrder.setRequirementQuantity(existsKateOrder.getRequirementQuantity().add(kateOrdersExcelVo.getRequirementQuantity()));
existsKateOrder.setLackQuantity(existsKateOrder.getLackQuantity().add(kateOrdersExcelVo.getRequirementQuantity()));
kateOrdersList.add(existsKateOrder);
continue;
}
List<KateOrdersLast> kateOrdersLastList = this.kateOrdersLastList.stream().filter(kateOrdersLast ->
Objects.equals(kateOrdersExcelVo.getWorkOrder(), kateOrdersLast.getWorkOrder())
&& Objects.equals(kateOrdersExcelVo.getGoodsId(), kateOrdersLast.getGoodsId())
&& Objects.equals(kateOrdersExcelVo.getSupplyArea(), kateOrdersLast.getSupplyArea())
).toList();
if (!kateOrdersLastList.isEmpty()) {
// 之前存在过
KateOrdersLast kateOrdersLast = kateOrdersLastList.get(0);
KateOrders oldKateOrders = new KateOrders();
oldKateOrders.setOrderId(kateOrdersLast.getOrderId());
oldKateOrders.setWorkOrder(kateOrdersExcelVo.getWorkOrder());
oldKateOrders.setGoodsId(kateOrdersExcelVo.getGoodsId());
oldKateOrders.setItem(kateOrdersExcelVo.getItem());
oldKateOrders.setDescription(kateOrdersExcelVo.getDescription());
oldKateOrders.setSLoc(kateOrdersExcelVo.getSLoc());
oldKateOrders.setType(kateOrdersExcelVo.getType());
oldKateOrders.setOriginStatus(kateOrdersExcelVo.getOriginStatus());
oldKateOrders.setSupplyArea(kateOrdersExcelVo.getSupplyArea());
oldKateOrders.setSortString(kateOrdersExcelVo.getSortString());
oldKateOrders.setRequirementQuantity(kateOrdersExcelVo.getRequirementQuantity());
oldKateOrders.setGoodsUnit(kateOrdersExcelVo.getGoodsUnit());
oldKateOrders.setOrderStatus(kateOrdersLast.getOrderStatus());
oldKateOrders.setLackQuantity(kateOrdersLast.getLackQuantity());
oldKateOrders.setPickedQuantity(kateOrdersLast.getPickedQuantity());
oldKateOrders.setFinishTime(kateOrdersLast.getFinishTime());
oldKateOrders.setUserName(uploadUser);
kateOrdersList.add(oldKateOrders);
tempDoneMap.put(kateOrdersExcelVo.getWorkOrder() + kateOrdersExcelVo.getGoodsId() + kateOrdersExcelVo.getSupplyArea(), oldKateOrders);
} else {
// 之前没存在过 // 之前没存在过
KateOrders newKateOrders = new KateOrders(); KateOrders newKateOrders = new KateOrders();
newKateOrders.setOrderId(generateId("ORDER_")); newKateOrders.setOrderId(generateId("ORDER_"));
@ -195,12 +122,18 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
newKateOrders.setLackQuantity(kateOrdersExcelVo.getRequirementQuantity()); newKateOrders.setLackQuantity(kateOrdersExcelVo.getRequirementQuantity());
newKateOrders.setPickedQuantity(BigDecimal.ZERO); newKateOrders.setPickedQuantity(BigDecimal.ZERO);
newKateOrders.setUserName(uploadUser); newKateOrders.setUserName(uploadUser);
kateOrdersList.add(newKateOrders); newKateOrdersMap.put(key, newKateOrders);
tempDoneMap.put(kateOrdersExcelVo.getWorkOrder() + kateOrdersExcelVo.getGoodsId() + kateOrdersExcelVo.getSupplyArea(), newKateOrders);
} }
} }
kateOrdersService.saveOrUpdateBatch(kateOrdersList); }
SAVE_COUNT += kateOrdersList.size();
doneMap.put(MAP_INDEX++, tempDoneMap); /**
* 保存数据库
*/
private void insertIntoDb() {
logger.info("此次共导入{}条数据。", newKateOrdersMap.size());
// 保存数据
kateOrdersService.saveOrUpdateBatch(newKateOrdersMap.values(), BATCH_COUNT);
logger.info("保存成功{}条数据。", newKateOrdersMap.size());
} }
} }

View File

@ -14,7 +14,9 @@ import org.slf4j.LoggerFactory;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import static com.wms.utils.WmsUtils.generateId; import static com.wms.utils.WmsUtils.generateId;
@ -27,15 +29,14 @@ public class UploadStationConfigListener implements ReadListener<StationConfigEx
* 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收 * 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收
*/ */
private static final int BATCH_COUNT = 100; private static final int BATCH_COUNT = 100;
/**
* 保存数据总数
*/
private int SAVE_COUNT = 0;
private List<StationConfigExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); private List<StationConfigExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final WorkStationConfigService workStationConfigService;// 工站配置服务 private final WorkStationConfigService workStationConfigService;// 工站配置服务
private final String uploadUser;// 用户 private final String uploadUser;// 用户
public UploadStationConfigListener(WorkStationConfigService workStationConfigService, String uploadUser) { private final Map<String, WorkStationConfig> oldWorkStationConfigMap;// 旧配置
private final Map<String, WorkStationConfig> newWorkStationConfigMap = new HashMap<>();// 新配置
public UploadStationConfigListener(WorkStationConfigService workStationConfigService, Map<String, WorkStationConfig> oldWorkStationConfigMap, String uploadUser) {
this.workStationConfigService = workStationConfigService; this.workStationConfigService = workStationConfigService;
this.oldWorkStationConfigMap = oldWorkStationConfigMap;
this.uploadUser = uploadUser; this.uploadUser = uploadUser;
} }
@ -59,9 +60,8 @@ public class UploadStationConfigListener implements ReadListener<StationConfigEx
// 符合条件的数据 // 符合条件的数据
cachedDataList.add(stationConfigExcelVo); cachedDataList.add(stationConfigExcelVo);
} }
// 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM // 达到BATCH_COUNT了
if (cachedDataList.size() >= BATCH_COUNT) { if (cachedDataList.size() >= BATCH_COUNT) {
logger.info("已经导入{}条数据,开始存储数据库!", cachedDataList.size());
saveData(); saveData();
// 存储完成清理 list // 存储完成清理 list
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
@ -75,8 +75,10 @@ public class UploadStationConfigListener implements ReadListener<StationConfigEx
*/ */
@Override @Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) { public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 再做一次数据处理
saveData(); saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT); // 在这里统一保存数据
insertIntoDb();
} }
/** /**
@ -84,12 +86,10 @@ public class UploadStationConfigListener implements ReadListener<StationConfigEx
*/ */
private void saveData() { private void saveData() {
// 存储数据 // 存储数据
List<WorkStationConfig> stationConfigList = new ArrayList<>();
for (StationConfigExcelVo stationConfigExcelVo : cachedDataList) { for (StationConfigExcelVo stationConfigExcelVo : cachedDataList) {
WorkStationConfig oldConfig = workStationConfigService.getOne(new LambdaQueryWrapper<WorkStationConfig>() String key = stationConfigExcelVo.getSmallBox();
.eq(WorkStationConfig::getSmallBox, stationConfigExcelVo.getSmallBox()) if (oldWorkStationConfigMap.containsKey(key)) {
.last("limit 1")); WorkStationConfig oldConfig = oldWorkStationConfigMap.get(key);
if (oldConfig != null) {
oldConfig.setOrderQuantity(stationConfigExcelVo.getOrderQuantity()); oldConfig.setOrderQuantity(stationConfigExcelVo.getOrderQuantity());
oldConfig.setWorkStation(stationConfigExcelVo.getWorkStation()); oldConfig.setWorkStation(stationConfigExcelVo.getWorkStation());
oldConfig.setVehicle(stationConfigExcelVo.getVehicle()); oldConfig.setVehicle(stationConfigExcelVo.getVehicle());
@ -100,17 +100,24 @@ public class UploadStationConfigListener implements ReadListener<StationConfigEx
oldConfig.setLastUpdateUser(uploadUser); oldConfig.setLastUpdateUser(uploadUser);
oldConfig.setModel(stationConfigExcelVo.getModel()); oldConfig.setModel(stationConfigExcelVo.getModel());
oldConfig.setBigBox(stationConfigExcelVo.getBigBox()); oldConfig.setBigBox(stationConfigExcelVo.getBigBox());
stationConfigList.add(oldConfig); oldWorkStationConfigMap.replace(key, oldConfig);
} else { } else {
WorkStationConfig stationConfig = BeanUtil.copyProperties(stationConfigExcelVo, WorkStationConfig.class); WorkStationConfig newStationConfig = BeanUtil.copyProperties(stationConfigExcelVo, WorkStationConfig.class);
stationConfig.setConfigId(generateId("STATION-CONFIG_")); newStationConfig.setConfigId(generateId("STATION-CONFIG_"));
stationConfig.setLastUpdateTime(LocalDateTime.now()); newStationConfig.setLastUpdateTime(LocalDateTime.now());
stationConfig.setLastUpdateUser(uploadUser); newStationConfig.setLastUpdateUser(uploadUser);
stationConfigList.add(stationConfig); oldWorkStationConfigMap.put(key, newStationConfig);
} }
} }
workStationConfigService.saveOrUpdateBatch(stationConfigList); }
// 打印数量
SAVE_COUNT += stationConfigList.size(); /**
* 保存数据库
*/
private void insertIntoDb() {
logger.info("此次共导入{}条数据。", newWorkStationConfigMap.size());
// 保存数据
workStationConfigService.saveOrUpdateBatch(newWorkStationConfigMap.values(), BATCH_COUNT);
logger.info("保存成功{}条数据。", newWorkStationConfigMap.size());
} }
} }

View File

@ -78,6 +78,7 @@ public class UploadStocksListener implements ReadListener<StockExcelVo> {
*/ */
private void saveData() { private void saveData() {
List<Stock> stockList = new ArrayList<>(); List<Stock> stockList = new ArrayList<>();
// TODO 下个项目优化
for (StockExcelVo stockExcelVo : cachedDataList) { for (StockExcelVo stockExcelVo : cachedDataList) {
Stock oldStock = stockService.getOne(new LambdaQueryWrapper<Stock>() Stock oldStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, stockExcelVo.getVehicleId()) .eq(Stock::getVehicleId, stockExcelVo.getVehicleId())