代码更新:

1.增加非计划领料
2。修改部分拉货逻辑
This commit is contained in:
梁州 2024-09-03 21:12:28 +08:00
parent 4f7c0732e3
commit f9b41b7ba2
7 changed files with 330 additions and 94 deletions

View File

@ -94,11 +94,11 @@ public class StockController {
/**
* 查询某个物料的库存总数
*/
@PostMapping("/getStocksByGoods")
@PostMapping("/getStockNumByGoodsId")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public String getStocksByGoods(@RequestBody StockQuery stockQuery) {
logger.info("接收到查询物料库存请求:{}请求ip{}", convertJsonString(stockQuery), HttpUtils.getIpAddr(servletRequest));
public String getStockNumByGoodsId(@RequestBody StockQuery stockQuery) {
logger.info("接收到查询物料库存数请求:{}请求ip{}", convertJsonString(stockQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
if (StringUtils.isEmpty(stockQuery.getGoodsId())) {

View File

@ -142,6 +142,10 @@ public class TaskController {
* 站台要料服务
*/
private final GoodsToStationService goodsToStationService;
/**
* 非计划领料服务
*/
private final NoPlanRecordService noPlanRecordService;
/**
* Wcs服务
*/
@ -426,26 +430,30 @@ public class TaskController {
continue;
}
if (outTask.getIsPicking() == 1) {
// 当前载具上所有库存状态设置为拣选
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.PICKING.getCode())
.eq(Stock::getVehicleId, outTask.getVehicleId())
.ne(Stock::getStockStatus, StockStatus.PICKING.getCode()));
// 当前载具设置为出库中状态
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.eq(Vehicle::getVehicleId, outTask.getVehicleId())
.ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()));
if (StringUtils.isNotEmpty(outTask.getPickStand())) {
// 当前载具上所有库存状态设置为拣选
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.PICKING.getCode())
.eq(Stock::getVehicleId, outTask.getVehicleId())
.ne(Stock::getStockStatus, StockStatus.PICKING.getCode()));
// 将该载具对应的拣选任务设置为可发送状态
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())
.eq(PickTask::getVehicleId, outTask.getVehicleId())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode()));
}
} else {// 代表整出
// 删除当前载具上所有库存
stockService.remove(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
// 删除载具
vehicleService.remove(new LambdaQueryWrapper<Vehicle>().eq(Vehicle::getVehicleId, outTask.getVehicleId()));
// 删除当前载具的所有拣选任务
pickTaskService.remove(new LambdaQueryWrapper<PickTask>().eq(PickTask::getVehicleId, outTask.getVehicleId()));
}
// 添加任务记录
outTask.setTaskStatus(WmsTaskStatus.FINISH.getCode());
@ -2263,7 +2271,6 @@ public class TaskController {
}
// 查询库存
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.eq(Stock::getStockStatus, StockStatus.OK.getCode())
.apply("goods_related ->> '$.goodsId' = {0}", noPlanRequest.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0")
.orderByAsc(Stock::getCreateTime));
@ -2272,33 +2279,95 @@ public class TaskController {
// 总数量
BigDecimal stockNum = stockOfGoodsList.stream().map(StockOfGoodsDto::getRemainNumSum).reduce(BigDecimal.ZERO, BigDecimal::add);
if (stockList != null && !stockList.isEmpty()) {
// 需求数量
BigDecimal needNum = noPlanRequest.getNeedNum();
List<Stock> waitForOutStockList = new ArrayList<>();
// TODO 生成出库任务
// 出库任务列表
List<Task> outTasks = 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);
// }
// }
// createVehicleOutTaskAndPickTask(waitForOutStockList, workStation);
for (Stock tempStock : stockList) {
if (needNum.compareTo(BigDecimal.ZERO) <= 0) {// 需求数量小于等于0
break;
}
if (Objects.equals(tempStock.getStockStatus(), StockStatus.OK.getCode())) {
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);
}
// 创建出库任务
Task tempOutTask = new Task();
tempOutTask.setTaskId(generateId("CK_"));
tempOutTask.setTaskType(TaskType.OUT.getCode());
tempOutTask.setTaskGroup(generateId(""));
tempOutTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempOutTask.setTaskPriority(2);
tempOutTask.setVehicleId(tempStock.getVehicleId());
tempOutTask.setUserName(noPlanRequest.getUserName());
tempOutTask.setOrigin(tempStock.getLocationId());
tempOutTask.setDestination("");
tempOutTask.setCreateTime(LocalDateTime.now());
tempOutTask.setIsPicking(1);
outTasks.add(tempOutTask);
} else if (Objects.equals(tempStock.getStockStatus(), StockStatus.OUT.getCode())) {
// 判断这个料箱是否有拣选任务
boolean hasPickTask = pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getVehicleId, tempStock.getVehicleId()));
if (!hasPickTask) {
// 有拣选任务时不做处理
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);
}
}
}
}
if (waitForOutStockList.isEmpty()) {
logger.error("所有库存在站台备料中。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("所有库存在站台备料中。");
return convertJsonString(response);
}
// 添加出库任务
taskService.saveBatch(outTasks);
List<String> vehicleIds = outTasks.stream().map(Task::getVehicleId).distinct().toList();
// 更新库存状态
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.OUT.getCode())
.in(Stock::getVehicleId, vehicleIds)
.eq(Stock::getStockStatus, StockStatus.OK.getCode()));
// 更新料箱状态
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, vehicleIds)
.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()));
// 非计划领料记录生成
NoPlanRecord noPlanRecord = new NoPlanRecord();
noPlanRecord.setRecordId(generateId("CLC-NO-PLAN_"));
@ -2306,23 +2375,26 @@ public class TaskController {
noPlanRecord.setGoodsId(noPlanRequest.getGoodsId());
noPlanRecord.setNeedNum(noPlanRequest.getNeedNum());
noPlanRecord.setStockNum(stockNum);
} else {
if (stockNum.compareTo(BigDecimal.ZERO) > 0) {
logger.error("所有库存在站台备料中。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("所有库存在站台备料中。");
noPlanRecord.setWorkOrder(noPlanRequest.getWorkOrder());
noPlanRecord.setSmallVehicleNo(noPlanRequest.getSmallVehicleNo());
noPlanRecord.setCallReason(noPlanRequest.getCallReason());
noPlanRecord.setFlowNo(noPlanRequest.getFlowNo());
noPlanRecord.setRemark(noPlanRequest.getRemark());
noPlanRecord.setCallTime(LocalDateTime.now());
noPlanRecord.setCallUser(noPlanRequest.getCallUser());
noPlanRecord.setPickedNum(BigDecimal.ZERO);
noPlanRecord.setPickStatus(0);// 未拣选
noPlanRecordService.save(noPlanRecord);
logger.info("处理直接物料非计划领料请求成功。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("处理直接物料非计划领料请求成功。");
} else {
logger.error("非计划领料没有库存。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("非计划领料没有库存。");
}
return convertJsonString(response);
}
logger.info("处理整理盒子请求成功。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("请根据灯光拣选盒子。");
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@ -2333,45 +2405,156 @@ public class TaskController {
}
}
/**
* 获取当前物料的待领料数量
*
* @param pickNumQuery 请求信息
* @return 结果
*/
@PostMapping("/getCurrentGoodsPickNum")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "获取当前物料的待领料数量", logMethod = "getCurrentGoodsPickNum")
public String getCurrentGoodsPickNum(@RequestBody PickNumQuery pickNumQuery) {
logger.info("获取当前物料的待领料数量:{}ip地址{}", convertJsonString(pickNumQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
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);
}
}
/**
* 直接物料非计划领料确认回库
*
* @param noPlanRequest 请求信息
* @param pickNumQuery 请求信息
* @return 结果
*/
@PostMapping("/clcNoPlanConfirmBack")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "直接物料非计划领料确认回库", logMethod = "clcNoPlanConfirmBack")
public String clcNoPlanConfirmBack(@RequestBody NoPlanRequest noPlanRequest) {
logger.info("直接物料非计划领料确认回库:{}ip地址{}", convertJsonString(noPlanRequest), HttpUtils.getIpAddr(servletRequest));
public String clcNoPlanConfirmBack(@RequestBody PickNumQuery pickNumQuery) {
logger.info("直接物料非计划领料确认回库:{}ip地址{}", convertJsonString(pickNumQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
// 获取站台号
Stand targetStand;
if (StringUtils.isNotEmpty(noPlanRequest.getStandId())) {
// 站台号从请求参数中获取
targetStand = standService.getById(noPlanRequest.getStandId());
} else {
// 站台号从ip获取
targetStand = standService.getOne(new LambdaQueryWrapper<Stand>()
.eq(Stand::getStandIp, HttpUtils.getIpAddr(servletRequest))
.eq(Stand::getStandType, 1)
.last("limit 1"));
}
if (targetStand == null) {
logger.error("查询拣选站台错误。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询拣选站台错误。");
// TODO 确认拣货完成回库
// 判断信息是否完备
if (StringUtils.isEmpty(pickNumQuery.getGoodsId())
|| StringUtils.isEmpty(pickNumQuery.getVehicleId())
|| pickNumQuery.getRealPickNum() == null) {
logger.error("请求缺少必须参数,箱号、料号、数量不可缺少。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("请求缺少必须参数,箱号、料号、数量不可缺少。");
return convertJsonString(response);
}
// 查询库存
// Task中的isPicking=1
logger.info("处理整理盒子请求成功。");
// 更新库存
Stock existStock = stockService.getOne(new LambdaQueryWrapper<Stock>()
.apply("goods_related -> '$.goodsId' = {0}", pickNumQuery.getGoodsId())
.eq(Stock::getVehicleId, pickNumQuery.getVehicleId())
.last("limit 1"));
// 更新库存数量
if (existStock != null && existStock.getGoodsRelated() != null) {
StockDetailInfo goodsDetail = existStock.getGoodsRelated();
goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(pickNumQuery.getRealPickNum()));
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
}
// 判断这个箱子是否还有拣选任务
boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getVehicleId, pickNumQuery.getVehicleId()));
if (!hasPickTasks) {
// 判断当前载具是否有回库任务
boolean hasBackTask = taskService.exists(new LambdaQueryWrapper<Task>()
.eq(Task::getVehicleId, pickNumQuery.getVehicleId())
.eq(Task::getTaskType, TaskType.IN.getCode())
.likeRight(Task::getTaskId, "HK_"));
if (!hasBackTask) {
// 判断当前载具是否有入库任务
boolean hasInTask = taskService.exists(new LambdaQueryWrapper<Task>()
.eq(Task::getVehicleId, pickNumQuery.getVehicleId())
.eq(Task::getTaskType, TaskType.IN.getCode())
.eq(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode())
.likeRight(Task::getTaskId, "RK_"));
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();
backTask.setTaskId(generateId("HK_"));
backTask.setTaskGroup(generateId(""));
backTask.setTaskType(TaskType.IN.getCode());
backTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
backTask.setVehicleId(pickNumQuery.getVehicleId());
backTask.setDestination(nextLocationId);
backTask.setVehicleSize(1);
backTask.setWeight(BigDecimal.ZERO);
backTask.setTaskPriority(1);
backTask.setUserName(pickNumQuery.getUserName());
backTask.setCreateTime(LocalDateTime.now());
if (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("确认回库成功。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("请根据灯光拣选盒子。");
response.setMessage("确认回库成功。");
} else {
logger.error("当前箱子还有拣选任务,不能回库,请将箱子置入拣货环线。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前箱子还有拣选任务,不能回库,请将箱子置入拣货环线。");
}
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务

View File

@ -0,0 +1,30 @@
package com.wms.entity.app.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 拣货/领料数量确认
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PickNumQuery extends PageQuery{
/**
* 箱号
*/
@JsonProperty("vehicleId")
private String vehicleId;
/**
* 料号
*/
@JsonProperty("goodsId")
private String goodsId;
/**
* 领料数量
*/
@JsonProperty("realPickNum")
private BigDecimal realPickNum;
}

View File

@ -0,0 +1,13 @@
package com.wms.entity.app.vo;
import com.wms.entity.app.request.PickNumQuery;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 非计划领料界面显示领料数量
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PickNumOfGoodsVo extends PickNumQuery {
}

View File

@ -74,4 +74,14 @@ public class NoPlanRecord {
*/
@TableField("call_user")
private String callUser;
/**
* 已拣选数量
*/
@TableField("picked_num")
private BigDecimal pickedNum;
/**
* 状态
*/
@TableField("pick_status")
private Integer pickStatus;
}

View File

@ -317,19 +317,19 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
.apply("goods_related ->> '$.remainNum' > 0")
.last("limit 1"));
if (stock == null) {
// 没有库存那么就要移除当前的outsideVehicles
outsideVehiclesService.removeById(outsideVehicle.getOutsideId());
// 没有库存
outsideVehicle.setRemainNum(BigDecimal.ZERO);
outsideVehiclesService.updateById(outsideVehicle);
} else {
StockDetailInfo goodsRelated = stock.getGoodsRelated();
if (goodsRelated.getRemainNum().compareTo(needNum) > 0) {
if (outsideVehicle.getRemainNum().compareTo(needNum) > 0) {
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;
outsideVehicle.setRemainNum(goodsRelated.getRemainNum().subtract(needNum));
outsideVehicle.setRemainNum(outsideVehicle.getRemainNum().subtract(needNum));
usedOutsideVehiclesList.add(outsideVehicle);
break;
} else {
// 当前箱子物料剩余数量少于需求数量
needNum = needNum.subtract(goodsRelated.getRemainNum());
needNum = needNum.subtract(outsideVehicle.getRemainNum());
outsideVehicle.setRemainNum(BigDecimal.ZERO);
usedOutsideVehiclesList.add(outsideVehicle);
}

View File

@ -8,20 +8,20 @@ spring:
# 主库
master:
# 卡特数据库服务器
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://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
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_aaa?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true