代码更新

This commit is contained in:
梁州 2024-08-07 23:12:08 +08:00
parent cfbc2a202d
commit 812558df92
17 changed files with 21489 additions and 2513 deletions

View File

@ -182,17 +182,22 @@
</dependencies>
<build>
<finalName>wms-server</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>16</source>
<target>16</target>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>

View File

@ -72,7 +72,7 @@ public class ExcelController {
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String uploadStocks(@RequestPart("file") MultipartFile file, @RequestPart("obj") FileVo fileVo) {
logger.info("导入库存请求ip{}", getIpAddr(servletRequest));
logger.info("导入库存请求ip{},文件详情:{}", getIpAddr(servletRequest), convertJsonString(fileVo));
ResponseEntity response = new ResponseEntity();
try {
// 导入excel
@ -102,7 +102,7 @@ public class ExcelController {
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String uploadDbs(@RequestPart("file") MultipartFile file, @RequestPart("obj") FileVo fileVo) {
logger.info("导入DBS请求ip{}", getIpAddr(servletRequest));
logger.info("导入DBS请求ip{},文件详情:{}", getIpAddr(servletRequest), convertJsonString(fileVo));
ResponseEntity response = new ResponseEntity();
try {
// 先移除之前last表中的内容
@ -138,7 +138,7 @@ public class ExcelController {
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String uploadKateOrders(@RequestPart("file") MultipartFile file, @RequestPart("obj") FileVo fileVo) {
logger.info("导入工单请求ip{}", getIpAddr(servletRequest));
logger.info("导入工单请求ip{},文件详情:{}", getIpAddr(servletRequest), convertJsonString(fileVo));
ResponseEntity response = new ResponseEntity();
try {
// 导入excel
@ -168,8 +168,8 @@ public class ExcelController {
public void downloadStockExcel(@RequestBody StockQuery stockQuery, HttpServletResponse response) throws IOException {
logger.info("导出库存记录,筛选参数:{}请求ip{}", convertJsonString(stockQuery), getIpAddr(servletRequest));
//设置响应格式
// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("库存报表", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
@ -200,7 +200,7 @@ public class ExcelController {
public void downloadInRecordExcel(@RequestBody TaskRecordQuery query, HttpServletResponse response) throws IOException {
logger.info("导出入库记录,筛选参数:{}请求ip{}", convertJsonString(query), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("入库记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
@ -226,7 +226,7 @@ public class ExcelController {
public void downloadOutRecordExcel(@RequestBody TaskRecordQuery query, HttpServletResponse response) throws IOException {
logger.info("导出出库记录,筛选参数:{}请求ip{}", convertJsonString(query), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("出库记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
@ -252,7 +252,7 @@ public class ExcelController {
public void downloadInventoryRecordExcel(@RequestBody TaskRecordQuery query, HttpServletResponse response) throws IOException {
logger.info("导出盘点记录,筛选参数:{}请求ip{}", convertJsonString(query), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("盘点记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
@ -278,7 +278,7 @@ public class ExcelController {
public void downloadVehicleExcel(@RequestBody VehicleQuery vehicleQuery, HttpServletResponse response) throws IOException {
logger.info("导出料箱报表,筛选参数:{}请求ip{}", convertJsonString(vehicleQuery), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("盘点记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
@ -308,7 +308,7 @@ public class ExcelController {
public void downloadLocationsExcel(@RequestBody LocationQuery locationQuery, HttpServletResponse response) throws IOException {
logger.info("导出库位报表,筛选参数:{}请求ip{}", convertJsonString(locationQuery), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.ms-excel"); //文件扩展名为excel格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("库位报表", StandardCharsets.UTF_8).replaceAll("\\+", "%20");

View File

@ -308,20 +308,15 @@ public class TaskController {
// 已有库存直接更新数量
existStock.getGoodsRelated().setRemainNum(existStock.getGoodsRelated().getRemainNum().add(inTask.getGoodsRelated().getOpNum()));
existStock.getGoodsRelated().setTotalNum(existStock.getGoodsRelated().getTotalNum().add(inTask.getGoodsRelated().getOpNum()));
existStock.setLastUpdateTime(LocalDateTime.now());
existStock.setLastUpdateUser(inTask.getUserName());
existStock.setLocationId(inTask.getDestination());
stockService.update(existStock, new LambdaUpdateWrapper<Stock>().eq(Stock::getStockId, existStock.getStockId()));
} 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());
newStock.setWeight(inTask.getWeight());
newStock.setLastUpdateUser(inTask.getUserName());
StockDetailInfo detailInfo = new StockDetailInfo();
detailInfo.setGoodsId(inTask.getGoodsRelated().getGoodsId());
detailInfo.setGoodsName(inTask.getGoodsRelated().getGoodsName());
@ -335,7 +330,8 @@ public class TaskController {
}
// 更新库存状态
List<Stock> backStocks = stockService.list(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, inTask.getVehicleId()));
.eq(Stock::getVehicleId, inTask.getVehicleId())
.ne(Stock::getStockStatus, StockStatus.OK.getCode()));
backStocks.forEach(stock -> {
if (stock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) == 0) {
// 库存数量为0时要删除当前库存
@ -348,6 +344,7 @@ public class TaskController {
// 后续没有移库
stock.setStockStatus(StockStatus.OK.getCode());
}
stock.setLocationId(inTask.getDestination());
stock.setLastUpdateTime(LocalDateTime.now());
stock.setLastUpdateUser(inTask.getUserName());
stockService.update(stock, new LambdaUpdateWrapper<Stock>().eq(Stock::getStockId, stock.getStockId()));
@ -1806,65 +1803,80 @@ public class TaskController {
.eq(Task::getTaskType, TaskType.IN.getCode())
.likeRight(Task::getTaskId, "HK_"));
if (!hasBackTask) {
// 寻找库位
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")) {
// 判断当前载具是否有入库任务
boolean hasInTask = taskService.exists(new LambdaQueryWrapper<Task>()
.eq(Task::getVehicleId, requestBackQuery.getVehicleId())
.eq(Task::getTaskType, TaskType.IN.getCode())
.eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode())
.likeRight(Task::getTaskId, "RK_"));
if (hasInTask) {
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())
.eq(Task::getVehicleId, requestBackQuery.getVehicleId())
.eq(Task::getTaskType, TaskType.IN.getCode())
.eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode())
.likeRight(Task::getTaskId, "RK_"));
} else {
// 寻找库位
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")));
LambdaUpdateWrapper<Location> updateLocationWrapper = new LambdaUpdateWrapper<Location>()
.set(Location::getLocationStatus, LocationStatus.OCCUPY.getCode())
.set(Location::getVehicleId, requestBackQuery.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);
} else {
Location nextLocation = locationService.getOne(new LambdaQueryWrapper<Location>().eq(Location::getLocationId, resultMap.get("nextLocationId")));
LambdaUpdateWrapper<Location> updateLocationWrapper = new LambdaUpdateWrapper<Location>()
.set(Location::getLocationStatus, LocationStatus.OCCUPY.getCode())
.set(Location::getVehicleId, requestBackQuery.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();
backTask.setTaskId(generateId("HK_"));
backTask.setTaskGroup(generateId(""));
backTask.setTaskType(TaskType.IN.getCode());
backTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
backTask.setVehicleId(requestBackQuery.getVehicleId());
backTask.setDestination(nextLocationId);
backTask.setVehicleSize(1);
backTask.setWeight(BigDecimal.ZERO);
backTask.setTaskPriority(1);
backTask.setUserName("WMS");
backTask.setCreateTime(LocalDateTime.now());
if (taskService.save(backTask)) {
// 删除outsideVehicle表
outsideVehiclesService.remove(new LambdaQueryWrapper<OutsideVehicles>().eq(OutsideVehicles::getVehicleId, requestBackQuery.getVehicleId()));
// 设置库存状态为回库中
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.BACK.getCode())
.eq(Stock::getVehicleId, requestBackQuery.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("生成回库任务失败,箱号:{}", requestBackQuery.getVehicleId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("生成回库任务失败。");
return convertJsonString(response);
// 生成回库任务
Task backTask = new Task();
backTask.setTaskId(generateId("HK_"));
backTask.setTaskGroup(generateId(""));
backTask.setTaskType(TaskType.IN.getCode());
backTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
backTask.setVehicleId(requestBackQuery.getVehicleId());
backTask.setDestination(nextLocationId);
backTask.setVehicleSize(1);
backTask.setWeight(BigDecimal.ZERO);
backTask.setTaskPriority(1);
backTask.setUserName("WMS");
backTask.setCreateTime(LocalDateTime.now());
if (taskService.save(backTask)) {
// 删除outsideVehicle表
outsideVehiclesService.remove(new LambdaQueryWrapper<OutsideVehicles>().eq(OutsideVehicles::getVehicleId, requestBackQuery.getVehicleId()));
// 设置库存状态为回库中
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.BACK.getCode())
.eq(Stock::getVehicleId, requestBackQuery.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("生成回库任务失败,箱号:{}", requestBackQuery.getVehicleId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("生成回库任务失败。");
return convertJsonString(response);
}
}
}
}
@ -1881,4 +1893,308 @@ public class TaskController {
return convertJsonString(response);
}
}
/**
* 特殊用法---请求拣选
*
* @param taskOutRequest 出库任务
* @return 结果
*/
@PostMapping("/requestPickTest")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "特殊用法---请求拣选", logMethod = "requestPickTest")
public String requestPickTest(@RequestBody TaskOutRequest taskOutRequest) {
logger.info("接收到特殊用法---请求拣选:{}ip地址{}", convertJsonString(taskOutRequest), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity response = new ResponseEntity();
try {
// 获取站台号
String standId = "";
if (StringUtils.isNotEmpty(taskOutRequest.getPickStand())) {
// 站台号从请求参数中获取
standId = taskOutRequest.getPickStand();
} else {
// 站台号从ip获取
Stand standOfIp = standService.getOne(new LambdaQueryWrapper<Stand>()
.eq(Stand::getStandIp, HttpUtils.getIpAddr(servletRequest))
.eq(Stand::getStandType, 2));
if (standOfIp != null && StringUtils.isNotEmpty(standOfIp.getStandId())) {
standId = standOfIp.getStandId();
}
}
if (StringUtils.isEmpty(standId)) {
logger.error("请求参数缺少站台号。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("请求参数缺少站台号。");
return convertJsonString(response);
}
if (StringUtils.isNotEmpty(taskOutRequest.getGoodsId())) {
// 根据物料请求拣选
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.eq(Stock::getStockStatus, StockStatus.OK.getCode())
.apply("goods_related ->> '$.goodsId' = {0}", taskOutRequest.getGoodsId())
.eq(StringUtils.isNotEmpty(taskOutRequest.getVehicleId()), Stock::getVehicleId, taskOutRequest.getVehicleId()));
BigDecimal needNum = taskOutRequest.getGoodsNum();
if (stockList != null && !stockList.isEmpty()) {
List<Stock> waitForOutStockList = new ArrayList<>();
// 尝试生成出库任务
for (Stock tempStock : stockList) {
if (needNum.compareTo(BigDecimal.ZERO) <= 0) {// 需求数量小于等于0
break;
}
if (tempStock.getGoodsRelated().getRemainNum().compareTo(needNum) > 0) {
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;
// 设置剩余数量
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(goodsRelated.getRemainNum().subtract(needNum));
tempStock.setGoodsRelated(goodsRelated);
waitForOutStockList.add(tempStock);
break;
} else {
// 当前箱子物料剩余数量少于需求数量
needNum = needNum.subtract(tempStock.getGoodsRelated().getRemainNum());
// 设置剩余数量
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(BigDecimal.ZERO);
tempStock.setGoodsRelated(goodsRelated);
waitForOutStockList.add(tempStock);
}
}
// 出库任务列表
List<Task> outTasks = new ArrayList<>();
// 载具列表
List<String> vehicleIds = new ArrayList<>();
for (Stock tempStock : waitForOutStockList) {
if (vehicleIds.contains(tempStock.getVehicleId())) {
continue;
}
// 创建出库任务
Task tempOutTask = new Task();
tempOutTask.setTaskId(generateId("CK_"));
tempOutTask.setTaskType(TaskType.OUT.getCode());
tempOutTask.setTaskGroup(generateId(""));
tempOutTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempOutTask.setTaskPriority(1);
tempOutTask.setVehicleId(tempStock.getVehicleId());
tempOutTask.setUserName("WMS_AUTO");
tempOutTask.setOrigin(tempStock.getLocationId());
tempOutTask.setDestination("");
tempOutTask.setCreateTime(LocalDateTime.now());
tempOutTask.setIsPicking(1);
tempOutTask.setPickStand(standId);
outTasks.add(tempOutTask);
// 添加载具列表
vehicleIds.add(tempStock.getVehicleId());
}
// 保存出库任务至任务表
taskService.saveBatch(outTasks);
// 更新载具信息
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, vehicleIds)
.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()));
// 更新库存信息
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.OUT.getCode())
.in(Stock::getVehicleId, vehicleIds)
.eq(Stock::getStockStatus, StockStatus.OK.getCode()));
// 保存拣选任务至拣选任务表
createPickTasks(vehicleIds, standId, PickTaskStatusEnum.TEMP.getCode());
}
} else {
List<Vehicle> vehicles = vehicleService.list(new LambdaQueryWrapper<Vehicle>()
.eq(StringUtils.isNotEmpty(taskOutRequest.getVehicleId()), Vehicle::getVehicleId, taskOutRequest.getVehicleId()));
BigDecimal needNum = taskOutRequest.getGoodsNum();
// 出库任务列表
List<Task> outTasks = new ArrayList<>();
// 载具列表
List<String> vehicleIds = new ArrayList<>();
for (Vehicle vehicle : vehicles) {
if (vehicleIds.contains(vehicle.getVehicleId())) {
continue;
}
// 创建出库任务
Task tempOutTask = new Task();
tempOutTask.setTaskId(generateId("CK_"));
tempOutTask.setTaskType(TaskType.OUT.getCode());
tempOutTask.setTaskGroup(generateId(""));
tempOutTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempOutTask.setTaskPriority(1);
tempOutTask.setVehicleId(vehicle.getVehicleId());
tempOutTask.setUserName("WMS_AUTO");
tempOutTask.setOrigin(vehicle.getCurrentLocation());
tempOutTask.setDestination("");
tempOutTask.setCreateTime(LocalDateTime.now());
tempOutTask.setIsPicking(1);
tempOutTask.setPickStand(standId);
outTasks.add(tempOutTask);
// 添加载具列表
vehicleIds.add(vehicle.getVehicleId());
}
// 保存出库任务至任务表
taskService.saveBatch(outTasks);
// 更新载具信息
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, vehicleIds)
.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()));
// 更新库存信息
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.OUT.getCode())
.in(Stock::getVehicleId, vehicleIds)
.eq(Stock::getStockStatus, StockStatus.OK.getCode()));
// 保存拣选任务至拣选任务表
createPickTasks(vehicleIds, standId, PickTaskStatusEnum.TEMP.getCode());
}
logger.info("请求拣选成功!");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("请求拣选成功!");
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("发生异常:{}", convertJsonString(e));
// 返回其他异常
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("发生异常");
return convertJsonString(response);
}
}
public void createPickTasks(List<String> vehicleIds, String workStation, Integer pickStatus) {
if (!Objects.equals(pickStatus, PickTaskStatusEnum.TEMP.getCode()) && !Objects.equals(pickStatus, PickTaskStatusEnum.NEW.getCode())) {
return;
}
// 拣选任务暂存列表
List<PickTask> pickTasks = new ArrayList<>();
vehicleIds.forEach(vehicleId -> {
// 暂存拣选任务
PickTask tempPickTask = new PickTask();
tempPickTask.setPickTaskId(generateId("PICK_"));
tempPickTask.setVehicleId(vehicleId);
tempPickTask.setStandId(workStation);
tempPickTask.setPickStatus(pickStatus);
tempPickTask.setLastUpdateTime(LocalDateTime.now());
pickTasks.add(tempPickTask);
});
// 添加数据库
pickTaskService.saveBatch(pickTasks);
}
/**
* 特殊用法---请求回库
*
* @param taskOutRequest 出库任务
* @return 结果
*/
@PostMapping("/requestBackTest")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "特殊用法---请求回库", logMethod = "requestBackTest")
public String requestBackTest(@RequestBody TaskOutRequest taskOutRequest) {
logger.info("接收到特殊用法---请求回库:{}ip地址{}", convertJsonString(taskOutRequest), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity response = new ResponseEntity();
try {
// 获取站台号
String standId = "";
if (StringUtils.isNotEmpty(taskOutRequest.getPickStand())) {
// 站台号从请求参数中获取
standId = taskOutRequest.getPickStand();
} else {
// 站台号从ip获取
Stand standOfIp = standService.getOne(new LambdaQueryWrapper<Stand>()
.eq(Stand::getStandIp, HttpUtils.getIpAddr(servletRequest))
.eq(Stand::getStandType, 2));
if (standOfIp != null && StringUtils.isNotEmpty(standOfIp.getStandId())) {
standId = standOfIp.getStandId();
}
}
if (StringUtils.isEmpty(standId)) {
logger.error("请求参数缺少站台号。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("请求参数缺少站台号。");
return convertJsonString(response);
}
// 查询当前站台的拣货任务
PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getStandId, standId)
.eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()));
if (pickTask != null) {
// 存储拣选记录
PickTaskRecord pickTaskRecord = BeanUtil.copyProperties(pickTask, PickTaskRecord.class);
pickTaskRecord.setLastUpdateTime(LocalDateTime.now());
pickTaskRecordService.save(pickTaskRecord);
// 删除当前拣选任务
pickTaskService.removeById(pickTask);
if (StringUtils.isNotEmpty(taskOutRequest.getGoodsId())) {
if (taskOutRequest.getGoodsNum() == null) {
logger.error("输入物料号时,请输入数量");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("输入物料号时,请输入数量");
return convertJsonString(response);
}
// 判断添加库存还是删除库存
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", taskOutRequest.getGoodsId())
.eq(Stock::getVehicleId, pickTask.getVehicleId()));
if (existStock != null) {
// 更新库存
StockDetailInfo goodsRelated = existStock.getGoodsRelated();
goodsRelated.setRemainNum(taskOutRequest.getGoodsNum());
existStock.setGoodsRelated(goodsRelated);
stockService.updateById(existStock);
} else {
if (StringUtils.isNotEmpty(taskOutRequest.getGoodsId())) {
// 生成库存
Stock newStock = new Stock();
newStock.setStockId(generateId("ST_"));
newStock.setVehicleId(pickTask.getVehicleId());
newStock.setNoUseDays(0);
newStock.setIsInventory(0);
newStock.setCreateTime(LocalDateTime.now());
newStock.setWeight(BigDecimal.ONE);
newStock.setLastUpdateUser(taskOutRequest.getUserName());
StockDetailInfo detailInfo = new StockDetailInfo();
detailInfo.setGoodsId(taskOutRequest.getGoodsId());
detailInfo.setGoodsName(taskOutRequest.getGoodsId());
detailInfo.setGoodsStatus(GoodsStatus.OK.getCode());
detailInfo.setRemainNum(taskOutRequest.getGoodsNum());
detailInfo.setTotalNum(taskOutRequest.getGoodsNum());
newStock.setGoodsRelated(detailInfo);
stockService.save(newStock);
}
}
}
}
// 调用Wcs的放行接口
wcsService.sendWcsDisposeVehicle(new WcsDisposeVehicleRequest(standId, null));
// 更新站台信息
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getLastUseTime, LocalDateTime.now())
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "")
.eq(Stand::getStandId, standId));
logger.info("请求回库成功!");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("请求回库成功");
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("发生异常:{}", convertJsonString(e));
// 返回其他异常
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("发生异常");
return convertJsonString(response);
}
}
}

View File

@ -98,7 +98,7 @@ public class UserController {
rsp.setMessage("登录成功");
// 返回用户数据
rsp.setReturnData(generateUserInfo(validatedUser, HttpUtils.getIpAddr(servletRequest)));
return JSON.toJSONString(rsp);
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@ -106,7 +106,7 @@ public class UserController {
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("登录异常");
return JSON.toJSONString(rsp);
return convertJsonString(rsp);
}
}
@ -147,7 +147,7 @@ public class UserController {
rsp.setMessage("登录成功");
// 返回用户数据
rsp.setReturnData(generateUserInfo(validatedUser, HttpUtils.getIpAddr(servletRequest)));
return JSON.toJSONString(rsp);
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@ -155,7 +155,7 @@ public class UserController {
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("登录异常");
return JSON.toJSONString(rsp);
return convertJsonString(rsp);
}
}

View File

@ -23,6 +23,11 @@ public class KateDBS {
*/
@TableField("work_sequence")
private Integer workSequence;
/**
* 机器序列号
*/
@TableField("machine_no")
private String machineNo;
/**
* 工单
*/

View File

@ -23,6 +23,11 @@ public class KateDBSHistory {
*/
@TableField("work_sequence")
private Integer workSequence;
/**
* 机器序列号
*/
@TableField("machine_no")
private String machineNo;
/**
* 工单
*/

View File

@ -23,6 +23,11 @@ public class KateDBSLast {
*/
@TableField("work_sequence")
private Integer workSequence;
/**
* 机器序列号
*/
@TableField("machine_no")
private String machineNo;
/**
* 工单
*/

View File

@ -398,6 +398,7 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
tempOutTask.setDestination("");
tempOutTask.setCreateTime(LocalDateTime.now());
tempOutTask.setIsPicking(1);
tempOutTask.setPickStand(workStation);
outTasks.add(tempOutTask);
// 添加载具列表
vehicleIds.add(tempStock.getVehicleId());

View File

@ -11,8 +11,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class StandServiceImplements extends ServiceImpl<StandMapper, Stand> implements StandService {

View File

@ -28,6 +28,10 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
* 每隔5条存储数据库实际使用中可以100条然后清理list 方便内存回收
*/
private static final int BATCH_COUNT = 100;
/**
* 保存数据总数
*/
private int SAVE_COUNT = 0;
private List<KateDbsExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final KateDBSService kateDBSService;// Dbs服务
private final KateDBSLastService kateDBSLastService;// DbsLast服务
@ -70,6 +74,7 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT);
}
/**
@ -111,5 +116,6 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
}
}
kateDBSService.saveOrUpdateBatch(kateDbsList);
SAVE_COUNT += kateDbsList.size();
}
}

View File

@ -4,9 +4,11 @@ import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms.constants.enums.ConfigMapKeyEnum;
import com.wms.entity.app.dto.extend.StockDetailInfo;
import com.wms.entity.table.*;
import com.wms.service.*;
import com.wms.utils.StringUtils;
import com.wms.utils.excel.vo.KateDbsExcelVo;
import com.wms.utils.excel.vo.KateOrdersExcelVo;
import com.wms.utils.excel.vo.StockExcelVo;
@ -16,7 +18,9 @@ import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.utils.StringUtils.convertJsonString;
import static com.wms.utils.WmsUtils.generateId;
@ -26,9 +30,13 @@ import static com.wms.utils.WmsUtils.generateId;
public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 每隔5条存储数据库实际使用中可以100然后清理list 方便内存回收
* 每隔5条存储数据库实际使用中可以1000然后清理list 方便内存回收
*/
private static final int BATCH_COUNT = 100;
private static final int BATCH_COUNT = 1000;
/**
* 保存数据总数
*/
private int SAVE_COUNT = 0;
private List<KateOrdersExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final KateOrdersService kateOrdersService;// Dbs服务
private final KateOrdersLastService kateOrdersLastService;// DbsLast服务
@ -53,7 +61,11 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
*/
@Override
public void invoke(KateOrdersExcelVo kateOrdersExcelVo, AnalysisContext analysisContext) {
cachedDataList.add(kateOrdersExcelVo);
String slocFilterString = configMap.get(ConfigMapKeyEnum.SLOC_FILTER_STRING.getConfigKey());
if (StringUtils.isNotEmpty(slocFilterString) && Objects.equals(kateOrdersExcelVo.getSLoc(), slocFilterString)) {
// 符合筛选条件的才能添加
cachedDataList.add(kateOrdersExcelVo);
}
// 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {
logger.info("已经导入{}条数据,开始存储数据库!", cachedDataList.size());
@ -71,6 +83,7 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT);
}
/**
@ -134,5 +147,6 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
}
}
kateOrdersService.saveOrUpdateBatch(kateOrdersList);
SAVE_COUNT += kateOrdersList.size();
}
}

View File

@ -23,9 +23,13 @@ import static com.wms.utils.WmsUtils.generateId;
public class UploadStocksListener implements ReadListener<StockExcelVo> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 每隔5条存储数据库实际使用中可以100然后清理list 方便内存回收
* 每隔5条存储数据库实际使用中可以1000然后清理list 方便内存回收
*/
private static final int BATCH_COUNT = 100;
private static final int BATCH_COUNT = 1000;
/**
* 保存数据总数
*/
private int SAVE_COUNT = 0;
private List<StockExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final StockService stockService;
public UploadStocksListener(StockService stockService) {
@ -64,6 +68,7 @@ public class UploadStocksListener implements ReadListener<StockExcelVo> {
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
saveData();
logger.info("此次共保存{}条数据。", SAVE_COUNT);
}
/**
@ -103,5 +108,6 @@ public class UploadStocksListener implements ReadListener<StockExcelVo> {
stockList.add(stock);
}
stockService.saveBatch(stockList);
SAVE_COUNT += stockList.size();
}
}

View File

@ -20,6 +20,11 @@ public class KateDbsExcelVo {
*/
@ExcelProperty("序号")
private Integer workSequence;
/**
* 机器序列号
*/
@ExcelProperty("机器序列号")
private String machineNo;
/**
* 工单
*/

View File

@ -7,27 +7,27 @@ spring:
datasource:
# 主库
master:
# 宝开服务器--外网
# url: jdbc:mysql://112.4.208.194:3001/wms_kate_suzhou?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
# username: coder
# password: coder
# 卡特数据库服务器
# url: jdbc:mysql://10.90.36.71:3306/wms_kate_suzhou?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
# username: developer
# password: developer
# driver-class-name: com.mysql.cj.jdbc.Driver
# 宝开服务器--内网
# url: jdbc:mysql://192.168.3.254:3306/wms_kate_suzhou?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
# username: coder
# password: coder
# driver-class-name: com.mysql.cj.jdbc.Driver
# 上线环境
# 本地环境
url: jdbc:mysql://localhost:3306/wms_kate_suzhou?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
username: developer
password: developer
driver-class-name: com.mysql.cj.jdbc.Driver
# 从库
slave_1:
url: jdbc:mysql://localhost:3306/wms_xizhou?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
username: developer
password: developer
driver-class-name: com.mysql.cj.jdbc.Driver
# slave_1:
# url: jdbc:mysql://localhost:3306/wms_aaa?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
# username: developer
# password: developer
# driver-class-name: com.mysql.cj.jdbc.Driver
profiles:
active: online
servlet:
@ -67,7 +67,9 @@ mybatis-plus:
update-strategy: not_null
logging:
config: classpath:logback-spring.xml
config: classpath:logback.xml
# file:
# encoding: UTF-8
#mybatis 分页插件
#pagehelper:

View File

@ -14,7 +14,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/info/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>10MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
@ -23,6 +23,7 @@
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
@ -34,7 +35,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/warning/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>10MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
@ -43,6 +44,7 @@
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARNING</level>
@ -54,7 +56,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/error/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>10MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
@ -63,6 +65,7 @@
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
@ -74,7 +77,7 @@
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/debug/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>10MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
@ -83,6 +86,7 @@
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址, 这里设置为项目的根目录-->
<property name="LOG_HOME" value="log" />
<!--日志文件名称这里spring.application.name表示工程名称-->
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<!--默认配置-->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!--配置控制台(Console)-->
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!-- 按照每天生成日志文件 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/info/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxFileSize>10MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="WARNING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/warning/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxFileSize>10MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARNING</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/error/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxFileSize>10MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的目录及文件名-->
<FileNamePattern>${LOG_HOME}/debug/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<maxFileSize>10MB</maxFileSize>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 多环境配置 按照active profile选择分支 -->
<springProfile name="local">
<!--root节点 全局日志级别,用来指定最基础的日志输出级别-->
<root level="INFO">
<!-- 将日志输出到文件-->
<appender-ref ref="INFO_FILE" />
<!-- 将日志输出到控制台-->
<appender-ref ref="CONSOLE"/>
</root>
<!-- 子节点向上级传递 局部(包级)日志级别-->
<logger level="WARN" name="org.springframework"/>
<logger level="WARN" name="com.netflix"/>
<logger level="DEBUG" name="org.hibernate.SQL"/>
<logger level="INFO" name="com.wms"/>
</springProfile>
<springProfile name="online">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
<logger level="INFO" name="com.wms" addtivity="false">
<!-- 将日志输出到文件-->
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARNING_FILE" />
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="DEBUG_FILE" />
</logger>
</springProfile>
</configuration>

File diff suppressed because one or more lines are too long