代码更新:

1. 增加库存判断时大小写的问题
2. 增加库存修改记录
This commit is contained in:
梁州 2024-09-06 16:31:38 +08:00
parent 283f2988ba
commit ebb2dd3b72
24 changed files with 6276 additions and 7430 deletions

View File

@ -16,6 +16,8 @@ public class WmsConstants {
public static String EMPTY_STRING = "";
public static String ROOT_MENU_ID = "0";
public static String MYSQL_JSON_CI = "COLLATE utf8mb4_general_ci";
public static Map<String, String> type_values = ImmutableMap.<String, String>builder()
.put("LR01", "CLC一箱两料")
.put("LR02", "CLC一箱一料")

View File

@ -12,7 +12,10 @@ public enum ConfigMapKeyEnum {
MAX_VEHICLE_NUMS("MAX_VEHICLE_NUMS"),
MAX_WCS_ACCEPT_NUMS("MAX_WCS_ACCEPT_NUMS"),
SLOC_FILTER_STRING("SLOC_FILTER_STRING"),
URL_WCS_CHANGE_TASK("URL_WCS_CHANGE_TASK");
URL_WCS_CHANGE_TASK("URL_WCS_CHANGE_TASK"),
LOG_DELETE_INTERVAL("LOG_DELETE_INTERVAL"),
RECORD_DELETE_INTERVAL("RECORD_DELETE_INTERVAL"),
IMPORTANT_RECORD_DELETE_INTERVAL("IMPORTANT_RECORD_DELETE_INTERVAL");
private final String configKey;
ConfigMapKeyEnum(String configKey) {
this.configKey = configKey;

View File

@ -46,6 +46,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.HttpUtils.getIpAddr;
import static com.wms.utils.StringUtils.convertJsonString;
@ -337,8 +338,8 @@ public class ExcelController {
.like(StringUtils.isNotEmpty(stockQuery.getVehicleId()), Stock::getVehicleId, stockQuery.getVehicleId())
.eq(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}, '%')", stockQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')", stockQuery.getGoodsName()));
.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()));
EasyExcel.write(response.getOutputStream(), StockExcelVo.class)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)

View File

@ -155,13 +155,15 @@ public class JobComponent {
}
}
/**
* 每天查询一次是否有过期记录
* 每天晚上10点执行一次
*/
// @Scheduled(cron = "0 0 22 * * ?")
@Scheduled(cron = "0 0 22 * * ?")
public void deleteOutOfDateData() {
logger.info("执行定时任务:删除过期数据");
// 删除日志数据
wmsJobService.deleteLogsRegularly();
// 删除记录数据
wmsJobService.deleteRecordsRegularly();
}
}

View File

@ -24,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
/**
@ -61,8 +62,8 @@ public class RecordController {
LambdaQueryWrapper<TaskRecord> lambdaQueryWrapper = new LambdaQueryWrapper<TaskRecord>()
.eq(taskRecordQuery.getTaskType() != null, TaskRecord::getTaskType, taskRecordQuery.getTaskType())
.like(StringUtils.isNotEmpty(taskRecordQuery.getVehicleId()), TaskRecord::getVehicleId, taskRecordQuery.getVehicleId())
.apply(StringUtils.isNotEmpty(taskRecordQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')", taskRecordQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(taskRecordQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')", taskRecordQuery.getGoodsName());
.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());
Page<TaskRecord> taskRecordPage = taskRecordService.page(page, lambdaQueryWrapper);
// 生成数据
PageDto<TaskRecordVO> pageDto = PageDto.of(taskRecordPage, records -> BeanUtil.copyProperties(records, TaskRecordVO.class));

View File

@ -12,6 +12,7 @@ import com.wms.entity.app.dto.StockDto;
import com.wms.entity.app.request.StockQuery;
import com.wms.entity.app.vo.StockVo;
import com.wms.entity.table.Stock;
import com.wms.service.IStockUpdateRecordService;
import com.wms.service.StockService;
import com.wms.utils.HttpUtils;
import com.wms.utils.StringUtils;
@ -33,6 +34,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
/**
@ -51,7 +53,10 @@ public class StockController {
* 库存服务
*/
private final StockService stockService;
/**
* 库存更新记录服务
*/
private final IStockUpdateRecordService stockUpdateRecordService;
/**
* 请求头部信息
*/
@ -72,8 +77,8 @@ public class StockController {
.like(StringUtils.isNotEmpty(stockQuery.getVehicleId()), Stock::getVehicleId, stockQuery.getVehicleId())
.eq(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}, '%')", stockQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')", stockQuery.getGoodsName())
.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));
PageDto<StockVo> pageDto = PageDto.of(stockPage, StockVo::of);
@ -112,7 +117,7 @@ public class StockController {
stockVo.setGoodsId(stockQuery.getGoodsId());
// 查询库存
List<Stock> stocks = stockService.list(new LambdaQueryWrapper<Stock>()
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsId()), "goods_related ->> '$.goodsId' = {0}", stockQuery.getGoodsId()));
.apply(StringUtils.isNotEmpty(stockQuery.getGoodsId()), "goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, stockQuery.getGoodsId()));
if (stocks == null || stocks.isEmpty()) {
// 没有库存
stockVo.setRemainNum(BigDecimal.ZERO);
@ -161,9 +166,11 @@ public class StockController {
rsp.setMessage("请求的库存编号为空,不允许修改");
return convertJsonString(rsp);
}
Stock stockBefore = stockService.getOne(new LambdaQueryWrapper<Stock>().eq(Stock::getStockId, stock.getStockId()));
LambdaQueryWrapper<Stock> stockLambdaQueryWrapper = new LambdaQueryWrapper<Stock>().eq(Stock::getStockId, stock.getStockId());
if (stock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) <= 0) {
if (stockService.remove(stockLambdaQueryWrapper)) {
stockUpdateRecordService.addStockUpdateRecord(stockBefore, null, "删除库存", "前端界面");
// 返回成功
logger.info("数量为0删除库存成功");
rsp.setCode(ResponseCode.OK.getCode());
@ -176,11 +183,11 @@ public class StockController {
}
} else {
if (stockService.update(BeanUtil.copyProperties(stock, Stock.class), stockLambdaQueryWrapper)) {
stockUpdateRecordService.addStockUpdateRecord(stockBefore, BeanUtil.copyProperties(stock, Stock.class), "修改库存", "前端界面");
// 返回成功
logger.info("更新库存信息成功");
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage("更新库存信息成功");
return JSON.toJSONString(rsp);
} else {
// 返回失败
logger.error("更新库存信息失败");
@ -218,6 +225,7 @@ public class StockController {
StockDto tempStock = new StockDto();
tempStock.setStockId(WmsUtils.generateId("ST"));
if (stockService.save(BeanUtil.copyProperties(stock, Stock.class))) {
stockUpdateRecordService.addStockUpdateRecord(null, BeanUtil.copyProperties(stock, Stock.class), "新增库存", "前端界面");
// 返回成功
logger.info("添加库存信息成功");
rsp.setCode(ResponseCode.OK.getCode());
@ -228,7 +236,7 @@ public class StockController {
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("添加库存信息失败");
}
return JSON.toJSONString(rsp);
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@ -236,7 +244,7 @@ public class StockController {
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage(e.getMessage());
return JSON.toJSONString(rsp);
return convertJsonString(rsp);
}
}
}

View File

@ -44,6 +44,7 @@ import java.util.*;
import java.util.stream.Collectors;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
import static com.wms.utils.WmsUtils.generateId;
@ -147,6 +148,10 @@ public class TaskController {
* 非计划领料服务
*/
private final NoPlanRecordService noPlanRecordService;
/**
* 库存更新服务
*/
private final IStockUpdateRecordService stockUpdateRecordService;
/**
* 日志服务
*/
@ -330,18 +335,22 @@ public class TaskController {
if (inTask.getGoodsRelated() != null && StringUtils.isNotEmpty(inTask.getGoodsRelated().getGoodsId())) {
// 查询这个物料有没有库存
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", inTask.getGoodsRelated().getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, inTask.getGoodsRelated().getGoodsId())
.eq(Stock::getVehicleId, inTask.getVehicleId())
.last("limit 1"));
if (existStock != null) {
Stock originStock = BeanUtil.copyProperties(existStock, Stock.class);
// 已有库存直接更新数量
existStock.setLocationId(inTask.getDestination());
existStock.getGoodsRelated().setRemainNum(existStock.getGoodsRelated().getRemainNum().add(inTask.getGoodsRelated().getOpNum()));
existStock.getGoodsRelated().setTotalNum(existStock.getGoodsRelated().getTotalNum().add(inTask.getGoodsRelated().getOpNum()));
stockService.update(existStock, new LambdaUpdateWrapper<Stock>().eq(Stock::getStockId, existStock.getStockId()));
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "入库", inTask.getUserName());
} else {
Stock newStock = new Stock();
newStock.setStockId(generateId("ST_"));
newStock.setVehicleId(inTask.getVehicleId());
newStock.setLocationId(inTask.getDestination());
newStock.setNoUseDays(0);
newStock.setIsInventory(0);
newStock.setCreateTime(LocalDateTime.now());
@ -354,6 +363,7 @@ public class TaskController {
detailInfo.setTotalNum(inTask.getGoodsRelated().getOpNum());
newStock.setGoodsRelated(detailInfo);
stockService.save(newStock);
stockUpdateRecordService.addStockUpdateRecord(null, newStock, "入库", inTask.getUserName());
}
}
}
@ -453,6 +463,10 @@ public class TaskController {
}
} else {// 代表整出
// 删除当前载具上所有库存
List<Stock> removeStocks = stockService.list(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
for (Stock stock : removeStocks) {
stockUpdateRecordService.addStockUpdateRecord(stock, null, "整出", outTask.getUserName());
}
stockService.remove(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
// 删除载具
vehicleService.remove(new LambdaQueryWrapper<Vehicle>().eq(Vehicle::getVehicleId, outTask.getVehicleId()));
@ -723,8 +737,8 @@ public class TaskController {
.eq(taskQuery.getTaskType() != null, Task::getTaskType, taskQuery.getTaskType())
.eq(taskQuery.getTaskStatus() != null, Task::getTaskStatus, taskQuery.getTaskStatus())
.like(StringUtils.isNotEmpty(taskQuery.getVehicleId()), Task::getVehicleId, taskQuery.getVehicleId())
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')", taskQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')", taskQuery.getGoodsName());
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')" + MYSQL_JSON_CI, taskQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, taskQuery.getGoodsName());
Page<Task> tasksPage = taskService.page(page, lambdaQueryWrapper);
// 生成数据
PageDto<TaskVO> pageDto = PageDto.of(tasksPage, tasks -> BeanUtil.copyProperties(tasks, TaskVO.class));
@ -757,8 +771,8 @@ public class TaskController {
.eq(taskQuery.getTaskStatus() != null, Task::getTaskStatus, taskQuery.getTaskStatus())
.eq(taskQuery.getIsPicking() != null, Task::getIsPicking, taskQuery.getIsPicking())
.like(StringUtils.isNotEmpty(taskQuery.getVehicleId()), Task::getVehicleId, taskQuery.getVehicleId())
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')", taskQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')", taskQuery.getGoodsName());
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')" + MYSQL_JSON_CI, taskQuery.getGoodsId())
.apply(StringUtils.isNotEmpty(taskQuery.getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, taskQuery.getGoodsName());
List<Task> tasks = taskService.list(lambdaQueryWrapper);
response.setCode(ResponseCode.OK.getCode());
response.setMessage("查询成功");
@ -893,7 +907,7 @@ public class TaskController {
// 查找库存信息
Stock stock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, vehicleId)
.apply("goods_related ->> '$.goodsId' = {0}", workQuery.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workQuery.getGoodsId())
.last("limit 1"));
if (stock == null || StringUtils.isEmpty(stock.getStockId()) || stock.getGoodsRelated() == null) {
logger.error("请求料号:{}与正在拣选的箱子:{}无对应关系", workQuery.getGoodsId(), vehicleId);
@ -1196,14 +1210,16 @@ public class TaskController {
workFlowService.updateById(workFlow);
// 更新库存数量
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", workFlow.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workFlow.getGoodsId())
.eq(Stock::getVehicleId, eTaskFeedbackRequest.getVehicleNo())
.last("limit 1"));
if (existStock != null && existStock.getGoodsRelated() != null) {
Stock originStock = BeanUtil.copyProperties(existStock, Stock.class);
StockDetailInfo goodsDetail = existStock.getGoodsRelated();
goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum())));
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "备料拣选更新", "电子标签灯光反馈");
}
// 更新电子标签库位信息
etagLocationService.update(new LambdaUpdateWrapper<ETagLocation>()
@ -1310,14 +1326,16 @@ public class TaskController {
// 处理库存偏差
if (workConfirmRequest.getRemainNumReal().compareTo(workConfirmRequest.getRemainNumOrigin()) != 0) {
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", workConfirmRequest.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, workConfirmRequest.getGoodsId())
.eq(Stock::getVehicleId, pickTask.getVehicleId())
.last("limit 1"));// 更新库存数量
if (existStock != null && existStock.getGoodsRelated() != null) {
Stock originStock = BeanUtil.copyProperties(existStock, Stock.class);
StockDetailInfo goodsDetail = existStock.getGoodsRelated();
goodsDetail.setRemainNum(workConfirmRequest.getRemainNumReal());
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "站台确认更新", workConfirmRequest.getUserName());
}
OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId())
@ -2287,7 +2305,7 @@ public class TaskController {
}
// 查询库存
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.apply("goods_related ->> '$.goodsId' = {0}", noPlanRequest.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, noPlanRequest.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0")
.orderByAsc(Stock::getCreateTime));
// 查询应该的库存总数
@ -2476,15 +2494,17 @@ public class TaskController {
}
// 更新库存
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", pickNumQuery.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, pickNumQuery.getGoodsId())
.eq(Stock::getVehicleId, pickNumQuery.getVehicleId())
.last("limit 1"));
// 更新库存数量
if (existStock != null && existStock.getGoodsRelated() != null) {
Stock originStock = BeanUtil.copyProperties(existStock, Stock.class);
StockDetailInfo goodsDetail = existStock.getGoodsRelated();
goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(pickNumQuery.getRealPickNum()));
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "直接物料非计划领料确认回库", pickNumQuery.getUserName());
}
// 判断这个箱子是否还有拣选任务
boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper<PickTask>()

View File

@ -0,0 +1,10 @@
package com.wms.entity.app.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class StockUpdateRecordQuery extends PageQuery {
}

View File

@ -0,0 +1,74 @@
package com.wms.entity.app.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 库存更新记录Vo
*/
@Data
public class StockUpdateRecordVo {
/**
* 库存编号
*/
@JsonProperty("record_id")
private String recordId;
/**
* 库位ID
*/
@JsonProperty("stock_id")
private String stockId;
/**
* 库位ID
*/
@JsonProperty("vehicle_id")
private String vehicleId;
/**
* 库位ID
*/
@JsonProperty("goods_id")
private String goodsId;
/**
* 库位ID
*/
@JsonProperty("goods_name")
private String goodsName;
/**
* 库位ID
*/
@JsonProperty("location_before")
private String locationBefore;
/**
* 库位ID
*/
@JsonProperty("location_after")
private String locationAfter;
/**
* 库位ID
*/
@JsonProperty("quantity_before")
private BigDecimal quantityBefore;
/**
* 库位ID
*/
@JsonProperty("quantity_after")
private BigDecimal quantityAfter;
/**
* 库位ID
*/
@JsonProperty("reason")
private String reason;
/**
* 更新时间
*/
@JsonProperty("updateTime")
private LocalDateTime updateTime;
/**
* 更新用户
*/
@JsonProperty("updateUser")
private String updateUser;
}

View File

@ -0,0 +1,77 @@
package com.wms.entity.table;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 接口更新记录
*/
@Data
@TableName(value = "tbl_app_stock_update_record", autoResultMap = true)
public class StockUpdateRecord {
/**
* 记录id
*/
@TableId("record_id")
private String recordId;
/**
* 库存id
*/
@TableField("stock_id")
private String stockId;
/**
* 料箱号
*/
@TableField("vehicle_id")
private String vehicleId;
/**
* 料号
*/
@TableField("goods_id")
private String goodsId;
/**
* 物料名称
*/
@TableField("goods_name")
private String goodsName;
/**
* 更新前库位
*/
@TableField("location_before")
private String locationBefore;
/**
* 更新后库位
*/
@TableField("location_after")
private String locationAfter;
/**
* 更新前数量
*/
@TableField("quantity_before")
private BigDecimal quantityBefore;
/**
* 更新后数量
*/
@TableField("quantity_after")
private BigDecimal quantityAfter;
/**
* 更新原因
*/
@TableField("reason")
private String reason;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
/**
* 更新用户
*/
@TableField("update_user")
private String updateUser;
}

View File

@ -0,0 +1,12 @@
package com.wms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wms.entity.table.StockUpdateRecord;
import org.apache.ibatis.annotations.Mapper;
/**
* 库存更新记录Mapper
*/
@Mapper
public interface StockUpdateRecordMapper extends BaseMapper<StockUpdateRecord> {
}

View File

@ -0,0 +1,20 @@
package com.wms.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wms.entity.table.Stock;
import com.wms.entity.table.StockUpdateRecord;
/**
* 库存更新记录接口
*/
public interface IStockUpdateRecordService extends IService<StockUpdateRecord> {
/**
* 添加库存更新记录
* @param stockBefore 原始库存---可为null
* @param stockAfter 锌库存---可为null
* @param reason 更新原因
* @param opUser 操作用户
* @return 添加结果
*/
boolean addStockUpdateRecord(Stock stockBefore, Stock stockAfter, String reason, String opUser);
}

View File

@ -21,4 +21,14 @@ public interface IWmsJobService {
* @throws Exception 异常用于回滚
*/
void solveDuplicateTask() throws Exception;
/**
* 定期清除日志数据
*/
void deleteLogsRegularly();
/**
* 定期清除记录数据
*/
void deleteRecordsRegularly();
}

View File

@ -22,6 +22,8 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Objects;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
/**
* 验证服务接口的实现
*/
@ -144,8 +146,8 @@ public class ValidateServiceImplements implements IValidateService {
}
// 查询库存信息
LambdaQueryWrapper<Stock> stockQueryWrapper = new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", taskOutRequest.getGoodsId())
.apply("goods_related -> '$.remainNum' > 0")
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, taskOutRequest.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0")
.eq(StringUtils.isNotEmpty(taskOutRequest.getVehicleId()), Stock::getVehicleId, taskOutRequest.getVehicleId())
.eq(StringUtils.isNotEmpty(taskOutRequest.getOriginPoint()), Stock::getLocationId, taskOutRequest.getOriginPoint());
if (!stockService.exists(stockQueryWrapper)) {

View File

@ -24,6 +24,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.time.LocalDateTime;
import java.util.*;
@ -45,6 +49,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
/**
* 发送正常的任务
*/
@Override
public void sendCommonTasks() throws Exception {
try {
String max_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_VEHICLE_NUMS.getConfigKey());
@ -174,6 +179,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
/**
* 发送拣选任务
*/
@Override
public void sendPickTasks() throws Exception {
try {
// 检索任务表---新建未下发的拣选任务
@ -243,6 +249,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
/**
* 处理重复入库的任务
*/
@Override
public void solveDuplicateTask() throws Exception {
try {
// 检索任务表---重复入库的任务
@ -307,4 +314,53 @@ public class WmsJobServiceImplements implements IWmsJobService {
throw new Exception("向WCS发送新目的地时发生异常");
}
}
/**
* 定期清除日志
*/
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void deleteLogsRegularly() {
try {
int interval = 30;
try {
interval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.LOG_DELETE_INTERVAL.getConfigKey()));
} catch (Exception e) {
logger.error("获取日志清理天数错误使用默认值30天");
}
LambdaQueryWrapper<WmsLog> lambdaQueryWrapper = new LambdaQueryWrapper<WmsLog>()
.apply("log_time <= date_add(curdate(),INTERVAL -{0} DAY)", interval);
logService.remove(lambdaQueryWrapper);
} catch (Exception exception) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
/**
* 定期清除记录
*/
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void deleteRecordsRegularly() {
try {
int interval = 180;// 普通接口记录默认保留180天
int importantInterval = 365;// 重要接口记录默认保留一年
try {
interval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.LOG_DELETE_INTERVAL.getConfigKey()));
} catch (Exception e) {
logger.error("获取普通记录清理天数错误使用默认值180天");
}
try {
importantInterval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.LOG_DELETE_INTERVAL.getConfigKey()));
} catch (Exception e) {
logger.error("获取重要记录清理天数错误使用默认值365天");
}
// 重要记录---盘点记录工作总结库存更新记录非计划领料记录上传文件记录
} catch (Exception exception) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
}

View File

@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
import static com.wms.utils.WmsUtils.generateId;
@ -196,8 +197,8 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
public String genGoodsOutTask(TaskOutRequest taskOutRequest) {
// 查询库存
LambdaQueryWrapper<Stock> stockQueryWrapper = new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", taskOutRequest.getGoodsId())
.apply("goods_related -> '$.remainNum' > 0")
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, taskOutRequest.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0")
.eq(StringUtils.isNotEmpty(taskOutRequest.getVehicleId()), Stock::getVehicleId, taskOutRequest.getVehicleId())
.eq(StringUtils.isNotEmpty(taskOutRequest.getOriginPoint()), Stock::getLocationId, taskOutRequest.getOriginPoint());
List<Stock> stocks = stockService.list(stockQueryWrapper);
@ -313,7 +314,7 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
// 查询当前料箱当前物料的库存
Stock stock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, outsideVehicle.getVehicleId())
.apply("goods_related ->> '$.goodsId' = {0}", goodsId)
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsId)
.apply("goods_related ->> '$.remainNum' > 0")
.last("limit 1"));
if (stock == null) {
@ -350,7 +351,7 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
// 查询库存判断数量是否充足
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.eq(Stock::getStockStatus, StockStatus.OK.getCode())
.apply("goods_related ->> '$.goodsId' = {0}", goodsId)
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsId)
.orderByAsc(Stock::getCreateTime));
if (stockList != null && !stockList.isEmpty()) {
List<Stock> waitForOutStockList = new ArrayList<>();

View File

@ -21,6 +21,7 @@ import java.time.LocalDateTime;
import java.util.*;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
/**
@ -219,7 +220,7 @@ public class WorkServiceImplements implements IWorkService {
}
// 判断实际库存是否充足
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.apply("goods_related ->> '$.goodsId' = {0}", goodsToStation.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsToStation.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0"));
if (stockList == null || stockList.isEmpty()) {
goodsToStation.setDistributeStatus(3);

View File

@ -21,6 +21,8 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.*;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class LocationServiceImplements extends ServiceImpl<LocationMapper, Location> implements LocationService {
@ -142,7 +144,7 @@ public class LocationServiceImplements extends ServiceImpl<LocationMapper, Locat
List<Integer> equipmentIds = new ArrayList<>();
List<Task> tasks = taskMapper.selectList(new LambdaQueryWrapper<Task>()
.select(Task::getDestination)
.apply("goods_related -> '$.goodsId' = {0}", goodsId)
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsId)
.eq(Task::getTaskType, 1));
for (Task task : tasks) {
Location tempLocation = locationMapper.selectOne(new LambdaQueryWrapper<Location>().eq(Location::getLocationId, task.getDestination()));
@ -152,7 +154,7 @@ public class LocationServiceImplements extends ServiceImpl<LocationMapper, Locat
}
List<Stock> stocks = stockMapper.selectList(new LambdaQueryWrapper<Stock>()
.select(Stock::getLocationId)
.apply("goods_related -> '$.goodsId' = {0}", goodsId)
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsId)
.eq(Stock::getStockStatus, StockStatus.OK.getCode()));
for (Stock stock : stocks) {
Location tempLocation = locationMapper.selectOne(new LambdaQueryWrapper<Location>().eq(Location::getLocationId, stock.getLocationId()));

View File

@ -18,6 +18,8 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class StockServiceImplements extends ServiceImpl<StockMapper, Stock> implements StockService {
@ -55,7 +57,7 @@ public class StockServiceImplements extends ServiceImpl<StockMapper, Stock> impl
public List<StockOfGoodsDto> selectSumOfGoods(List<String> goodsIdList) {
// 先查询库存
List<Stock> stocks = stockMapper.selectList(new LambdaQueryWrapper<Stock>()
.apply(goodsIdList != null && !goodsIdList.isEmpty(), "goods_related ->> '$.goodsId' in {0}", goodsIdList));
.apply(goodsIdList != null && !goodsIdList.isEmpty(), "goods_related ->> '$.goodsId' in {0}" + MYSQL_JSON_CI, goodsIdList));
if (stocks == null || stocks.isEmpty()) {
// 查不到对应物料的库存
return Collections.emptyList();

View File

@ -0,0 +1,56 @@
package com.wms.service.serviceImplements;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wms.entity.table.Stock;
import com.wms.entity.table.StockUpdateRecord;
import com.wms.mapper.StockUpdateRecordMapper;
import com.wms.service.IStockUpdateRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import static com.wms.utils.WmsUtils.generateId;
/**
* 库存接收记录服务实现类
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class StockUpdateRecordServiceImpl extends ServiceImpl<StockUpdateRecordMapper, StockUpdateRecord> implements IStockUpdateRecordService {
private final StockUpdateRecordMapper stockUpdateRecordMapper;
@Override
public boolean addStockUpdateRecord(Stock stockBefore, Stock stockAfter, String reason, String opUser) {
if (stockBefore == null && stockAfter == null) {
return false;
}
StockUpdateRecord stockUpdateRecord = new StockUpdateRecord();
stockUpdateRecord.setRecordId(generateId("STOCK_UPDATE_"));
// 解析数据
if (stockBefore != null) {
stockUpdateRecord.setStockId(stockBefore.getStockId());
stockUpdateRecord.setGoodsId(stockBefore.getGoodsRelated().getGoodsId());
stockUpdateRecord.setGoodsName(stockBefore.getGoodsRelated().getGoodsName());
stockUpdateRecord.setVehicleId(stockBefore.getVehicleId());
stockUpdateRecord.setLocationBefore(stockBefore.getLocationId());
stockUpdateRecord.setQuantityBefore(stockBefore.getGoodsRelated().getRemainNum());
} else {
stockUpdateRecord.setStockId(stockAfter.getStockId());
stockUpdateRecord.setGoodsId(stockAfter.getGoodsRelated().getGoodsId());
stockUpdateRecord.setGoodsName(stockAfter.getGoodsRelated().getGoodsName());
stockUpdateRecord.setVehicleId(stockAfter.getVehicleId());
stockUpdateRecord.setLocationBefore("");
stockUpdateRecord.setQuantityBefore(BigDecimal.ZERO);
}
if (stockAfter != null) {
stockUpdateRecord.setLocationAfter(stockAfter.getLocationId());
stockUpdateRecord.setQuantityAfter(stockAfter.getGoodsRelated().getRemainNum());
}
stockUpdateRecord.setReason(reason);
stockUpdateRecord.setUpdateTime(LocalDateTime.now());
stockUpdateRecord.setUpdateUser(opUser);
return stockUpdateRecordMapper.insert(stockUpdateRecord) > 0;
}
}

View File

@ -15,6 +15,8 @@ import org.springframework.stereotype.Service;
import java.util.List;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@ -47,9 +49,9 @@ public class TaskRecordServiceImplements extends ServiceImpl<TaskRecordMapper, T
if (query.getGoodsRelated() != null) {
queryWrapper
// 物料编号
.apply(StringUtils.isNotEmpty(query.getGoodsRelated().getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')", query.getGoodsRelated().getGoodsId())
.apply(StringUtils.isNotEmpty(query.getGoodsRelated().getGoodsId()), "goods_related ->> '$.goodsId' like concat('%', {0}, '%')" + MYSQL_JSON_CI, query.getGoodsRelated().getGoodsId())
// 物料名称/描述
.apply(StringUtils.isNotEmpty(query.getGoodsRelated().getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')", query.getGoodsRelated().getGoodsName());
.apply(StringUtils.isNotEmpty(query.getGoodsRelated().getGoodsName()), "goods_related ->> '$.goodsName' like concat('%', {0}, '%')" + MYSQL_JSON_CI, query.getGoodsRelated().getGoodsName());
}
return super.list(queryWrapper);
}

View File

@ -15,6 +15,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
import static com.wms.utils.WmsUtils.generateId;
@ -81,7 +82,7 @@ public class UploadStocksListener implements ReadListener<StockExcelVo> {
Stock oldStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, stockExcelVo.getVehicleId())
.eq(Stock::getLocationId, stockExcelVo.getLocationId())
.apply("goods_related ->> '$.goodsId' = {0}", stockExcelVo.getGoodsId())
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, stockExcelVo.getGoodsId())
.last("limit 1"));
if (oldStock != null) {
StockDetailInfo goodsRelated = oldStock.getGoodsRelated();

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wms.mapper.StockUpdateRecordMapper">
</mapper>

File diff suppressed because one or more lines are too long