代码更新:

1. 增加日期筛选功能
2. 增加站台拣选任务配置:每个站台最大箱子
This commit is contained in:
梁州 2024-11-19 16:50:07 +08:00
parent da4074dcf9
commit 5175a8841f
10 changed files with 80 additions and 9 deletions

View File

@ -13,7 +13,8 @@ public enum ConfigMapKeyEnum {
SEND_TASK("SEND_TASK"),
ALLOW_EMPTY_BACK("ALLOW_EMPTY_BACK"),
SEND_PICK_OUT_TASK("SEND_PICK_OUT_TASK"),
MAX_VEHICLE_NUMS("MAX_VEHICLE_NUMS"),
MAX_VEHICLE_NUMS("MAX_VEHICLE_NUMS"),// 线体上最大箱子数
MAX_STAND_VEHICLE_NUMS("MAX_STAND_VEHICLE_NUMS"),// 每个站台最大箱子数
MAX_WCS_ACCEPT_NUMS("MAX_WCS_ACCEPT_NUMS"),
SLOC_FILTER_STRING("SLOC_FILTER_STRING"),
URL_WCS_CHANGE_TASK("URL_WCS_CHANGE_TASK"),

View File

@ -507,12 +507,16 @@ public class ExcelController {
// 内容样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelContentStyle.getContentStyle();
// 查询参数
List<Stock> stockPoList = stockService.list(new LambdaQueryWrapper<Stock>()
LambdaQueryWrapper<Stock> queryWrapper = new LambdaQueryWrapper<Stock>()
.like(StringUtils.isNotEmpty(stockQuery.getVehicleId()), Stock::getVehicleId, stockQuery.getVehicleId())
.like(StringUtils.isNotEmpty(stockQuery.getLocationId()), Stock::getLocationId, stockQuery.getLocationId())
.eq(stockQuery.getStockStatus() != null, Stock::getStockStatus, stockQuery.getStockStatus())
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')" + MYSQL_JSON_CI, stockQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, stockQuery.getGoodsName()));
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, stockQuery.getGoodsName());
if (stockQuery.getCreateTime() != null) {
queryWrapper.between(Stock::getCreateTime, stockQuery.getCreateTime().toLocalDate().atStartOfDay(), stockQuery.getCreateTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
List<Stock> stockPoList = stockService.list(queryWrapper);
EasyExcel.write(response.getOutputStream(), StockExcelVo.class)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)

View File

@ -64,6 +64,12 @@ public class RecordController {
.like(StringUtils.isNotEmpty(taskRecordQuery.getVehicleId()), TaskRecord::getVehicleId, taskRecordQuery.getVehicleId())
.apply(StringUtils.isNotEmpty(taskRecordQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')" + MYSQL_JSON_CI, taskRecordQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(taskRecordQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, taskRecordQuery.getGoodsName());
if (taskRecordQuery.getCreateTime() != null) {
lambdaQueryWrapper.between(TaskRecord::getCreateTime, taskRecordQuery.getCreateTime().toLocalDate().atStartOfDay(), taskRecordQuery.getCreateTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
if (taskRecordQuery.getFinishTime() != null) {
lambdaQueryWrapper.between(TaskRecord::getFinishTime, taskRecordQuery.getFinishTime().toLocalDate().atStartOfDay(), taskRecordQuery.getFinishTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
Page<TaskRecord> taskRecordPage = taskRecordService.page(page, lambdaQueryWrapper);
// 生成数据
PageDto<TaskRecordVO> pageDto = PageDto.of(taskRecordPage, records -> BeanUtil.copyProperties(records, TaskRecordVO.class));

View File

@ -107,13 +107,17 @@ public class StockController {
ResponseEntity response = new ResponseEntity();
try {
Page<Stock> page = stockQuery.toMpPage();
Page<Stock> stockPage = stockService.page(page, new LambdaQueryWrapper<Stock>()
LambdaQueryWrapper<Stock> lambdaQueryWrapper = new LambdaQueryWrapper<Stock>()
.like(StringUtils.isNotEmpty(stockQuery.getVehicleId()), Stock::getVehicleId, stockQuery.getVehicleId())
.like(StringUtils.isNotEmpty(stockQuery.getLocationId()), Stock::getLocationId, stockQuery.getLocationId())
.eq(stockQuery.getStockStatus() != null, Stock::getStockStatus, stockQuery.getStockStatus())
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')" + MYSQL_JSON_CI, stockQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, stockQuery.getGoodsName())
.orderByDesc(Stock::getLastUpdateTime));
.orderByDesc(Stock::getLastUpdateTime);
if (stockQuery.getCreateTime() != null) {
lambdaQueryWrapper.between(Stock::getCreateTime, stockQuery.getCreateTime().toLocalDate().atStartOfDay(), stockQuery.getCreateTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
Page<Stock> stockPage = stockService.page(page, lambdaQueryWrapper);
PageDto<StockVo> pageDto = PageDto.of(stockPage, StockVo::of);
response.setCode(ResponseCode.OK.getCode());
@ -334,11 +338,15 @@ public class StockController {
ResponseEntity response = new ResponseEntity();
try {
Page<StockUpdateRecord> page = stockUpdateRecordQuery.toMpPage();
Page<StockUpdateRecord> recordsPage = stockUpdateRecordService.page(page, new LambdaQueryWrapper<StockUpdateRecord>()
LambdaQueryWrapper<StockUpdateRecord> stockLambdaQueryWrapper = new LambdaQueryWrapper<StockUpdateRecord>()
.like(StringUtils.isNotEmpty(stockUpdateRecordQuery.getReason()), StockUpdateRecord::getReason, stockUpdateRecordQuery.getReason())
.like(StringUtils.isNotEmpty(stockUpdateRecordQuery.getVehicleId()), StockUpdateRecord::getVehicleId, stockUpdateRecordQuery.getVehicleId())
.like(StringUtils.isNotEmpty(stockUpdateRecordQuery.getGoodsId()), StockUpdateRecord::getGoodsId, stockUpdateRecordQuery.getGoodsId())
.orderByDesc(StockUpdateRecord::getUpdateTime));
.orderByDesc(StockUpdateRecord::getUpdateTime);
if (stockUpdateRecordQuery.getUpdateTime() != null) {
stockLambdaQueryWrapper.between(StockUpdateRecord::getUpdateTime, stockUpdateRecordQuery.getUpdateTime().toLocalDate().atStartOfDay(), stockUpdateRecordQuery.getUpdateTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
Page<StockUpdateRecord> recordsPage = stockUpdateRecordService.page(page, stockLambdaQueryWrapper);
PageDto<StockUpdateRecordVo> pageDto = PageDto.of(recordsPage, updateRecord -> BeanUtil.copyProperties(updateRecord, StockUpdateRecordVo.class));
logger.info("查询库存更新记录成功。");
response.setCode(ResponseCode.OK.getCode());

View File

@ -1,8 +1,10 @@
package com.wms.entity.app.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -64,6 +66,8 @@ public class StockUpdateRecordQuery extends PageQuery {
* 更新时间
*/
@JsonProperty("updateTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 更新用户

View File

@ -1,11 +1,15 @@
package com.wms.entity.app.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wms.entity.app.dto.extend.TaskDetailInfo;
import com.wms.entity.table.TaskRecord;
import com.wms.utils.StringUtils;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* 任务记录查询
@ -33,6 +37,18 @@ public class TaskRecordQuery extends PageQuery {
*/
@JsonProperty("goodsName")
private String goodsName;
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 完成时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime finishTime;
/**
* 根据客户端查询生成数据库查询条件
@ -42,6 +58,8 @@ public class TaskRecordQuery extends PageQuery {
TaskRecord recordPO = new TaskRecord();
recordPO.setTaskType(taskType);// 任务类型
recordPO.setVehicleId(vehicleId);// 载具号
recordPO.setCreateTime(createTime);
recordPO.setFinishTime(finishTime);
if (StringUtils.isNotEmpty(goodsId) || StringUtils.isNotEmpty(goodsName)) {// 包含物料详细信息
TaskDetailInfo goodsRelatedPO = new TaskDetailInfo();
goodsRelatedPO.setGoodsId(goodsId);

View File

@ -1,7 +1,9 @@
package com.wms.entity.app.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -65,6 +67,8 @@ public class StockUpdateRecordVo {
* 更新时间
*/
@JsonProperty("updateTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 更新用户

View File

@ -1,7 +1,9 @@
package com.wms.entity.app.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.wms.entity.app.dto.extend.TaskDetailInfo;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ -54,10 +56,14 @@ public class TaskRecordVO {
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 完成时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime finishTime;
/**
* 用户名

View File

@ -169,12 +169,14 @@ public class WmsJobServiceImplements implements IWmsJobService {
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());
if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums)) {
String max_stand_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_STAND_VEHICLE_NUMS.getConfigKey());
if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums) || StringUtils.isEmpty(max_stand_vehicle_nums)) {
logger.error("配置未生成");
return;
}
int maxVehicleNums = Integer.parseInt(max_vehicle_nums);
int maxVehicleNums = Integer.parseInt(max_vehicle_nums);// 线体最大箱子数量
int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);// wcs最大一次性可接受任务数量
int maxStandVehicleNums = Integer.parseInt(max_stand_vehicle_nums);// 每个站台最大箱子数量
List<String> outsideVehicles = outsideVehiclesService.selectDistinctVehicles();
if (outsideVehicles == null || outsideVehicles.isEmpty()) {
outsideVehicles = Collections.emptyList();
@ -245,6 +247,10 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 超过wcs一次可接受数量
break;
}
if (outPickTaskMap.isEmpty()) {
// 没有站台可以使用
break;
}
// 先找出目前数量最少的站台
String standId = outPickTaskMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
@ -252,6 +258,11 @@ public class WmsJobServiceImplements implements IWmsJobService {
.orElse("");
List<String> vehicleIds;
if (StringUtils.isNotEmpty(standId)) {
// 如果这个站台箱子数量超过最大每个站台的箱子数量则跳过
if (outPickTaskMap.get(standId) >= maxStandVehicleNums) {
outPickTaskMap.remove(standId);
continue;
}
// 查找这个站台未下发的料箱
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
@ -340,6 +351,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// 已经发送过的vehicleId
pickVehicleIds.add(maxVehicleId);
vehicleStandsMap.remove(maxVehicleId);
// 剩余线体可继续出库料箱数量
remainVehicleNums--;
}
@ -410,6 +422,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// 已经发送过的vehicleId
pickVehicleIds.add(minVehicleId);
vehicleStandsMap.remove(minVehicleId);
// 剩余线体可继续出库料箱数量
remainVehicleNums--;
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wms.constants.enums.TaskType;
import com.wms.entity.app.dto.TaskRecordDto;
import com.wms.entity.table.Stock;
import com.wms.entity.table.TaskRecord;
import com.wms.mapper.TaskRecordMapper;
import com.wms.service.TaskRecordService;
@ -53,6 +54,12 @@ public class TaskRecordServiceImplements extends ServiceImpl<TaskRecordMapper, T
// 物料名称/描述
.apply(StringUtils.isNotEmpty(query.getGoodsRelated().getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, query.getGoodsRelated().getGoodsName());
}
if (query.getCreateTime() != null) {
queryWrapper.between(TaskRecord::getCreateTime, query.getCreateTime().toLocalDate().atStartOfDay(), query.getCreateTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
if (query.getFinishTime() != null) {
queryWrapper.between(TaskRecord::getFinishTime, query.getFinishTime().toLocalDate().atStartOfDay(), query.getFinishTime().toLocalDate().plusDays(1).atStartOfDay().minusSeconds(1));
}
return super.list(queryWrapper);
}
}