代码更新:

1. 修复bug
This commit is contained in:
梁州 2024-09-04 20:10:19 +08:00
parent f9b41b7ba2
commit 283f2988ba
9 changed files with 213 additions and 54 deletions

View File

@ -14,7 +14,9 @@ public enum TaskInValidationEnum {
ERROR_GOODS_ID("错误的物料编号"),
ERROR_GOODS_NUM("带料入库数量为空"),
NO_WEIGHT("重量信息为空"),
OVER_WEIGHT("超重");
OVER_WEIGHT("超重"),
ON_PICKING("当前料箱正在拣选"),
OTHER_TASKS("当前料箱存在其他任务");
private final String errorMessage;
TaskInValidationEnum(String errorMessage) {

View File

@ -13,9 +13,11 @@ import com.wms.entity.app.request.VehicleQuery;
import com.wms.entity.app.ResponseEntity;
import com.wms.entity.app.vo.LocationVo;
import com.wms.entity.app.vo.VehicleVO;
import com.wms.entity.table.ELocationConfig;
import com.wms.entity.table.ETagLocation;
import com.wms.entity.table.Location;
import com.wms.entity.table.Vehicle;
import com.wms.service.ELocationConfigService;
import com.wms.service.ETagLocationService;
import com.wms.service.LocationService;
import com.wms.service.VehicleService;
@ -62,6 +64,7 @@ public class LocationController {
* 电子标签库位服务
*/
private final ETagLocationService etagLocationService;
private final ELocationConfigService eLocationConfigService;
/**
* 请求头部信息
*/
@ -394,4 +397,84 @@ public class LocationController {
return JSON.toJSONString(rsp);
}
}
// /**
// * 查询电子标签库位信息
// * @param eLocationQuery 查询参数
// * @return 结果
// */
// @PostMapping("/getELocationsByPage")
// @ResponseBody
// @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
// @MyLog(logTitle = "查询电子标签库位信息", logMethod = "getVehiclesByPage")
// public String getVehiclesByPage(@RequestBody ELocationQuery eLocationQuery) {
// logger.info("接收到查询电子标签库位信息请求:{}请求ip{}", convertJsonString(eLocationQuery), HttpUtils.getIpAddr(servletRequest));
// ResponseEntity response = new ResponseEntity();
// try {
// Page<ETagLocation> page = eLocationQuery.toMpPage();
// Page<Vehicle> vehiclePage = vehicleService.page(page, new LambdaQueryWrapper<Vehicle>()
// .like(StringUtils.isNotEmpty(vehicleQuery.getVehicleId()), Vehicle::getVehicleId, vehicleQuery.getVehicleId())
// .eq(vehicleQuery.getVehicleStatus() != null, Vehicle::getVehicleStatus, vehicleQuery.getVehicleStatus())
// .eq(vehicleQuery.getIsEmpty() != null, Vehicle::getIsEmpty, vehicleQuery.getIsEmpty())
// .orderByDesc(Vehicle::getLastInTime));
//
// PageDto<VehicleVO> pageDto = PageDto.of(vehiclePage, vehicle -> BeanUtil.copyProperties(vehicle, VehicleVO.class));
// response.setCode(ResponseCode.OK.getCode());
// response.setMessage("查询成功");
// response.setReturnData(pageDto);
// return convertJsonString(response);
// } catch (Exception e) {
// // 回滚事务
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// logger.error("查询载具信息发生异常");
// response.setCode(ResponseCode.ERROR.getCode());
// response.setMessage("查询载具信息发生异常");
// return convertJsonString(response);
// }
// }
//
// /**
// * 更新料箱信息
// *
// * @param vehicleQuery 料箱
// * @return 结果
// */
// @PostMapping("/updateVehicleInfo")
// @ResponseBody
// @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
// @MyLog(logTitle = "更新载具信息", logMethod = "updateVehicleInfo")
// public String updateVehicleInfo(@RequestBody VehicleQuery vehicleQuery) {
// logger.info("接收到更新载具信息信息请求:{}请求ip{}", convertJsonString(vehicleQuery), HttpUtils.getIpAddr(servletRequest));
// // 创建响应信息
// ResponseEntity rsp = new ResponseEntity();
// try {
// if (StringUtils.isEmpty(vehicleQuery.getVehicleId())) {// 载具号为空
// logger.error("缺少载具号");
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("缺少载具号");
// return convertJsonString(rsp);
// }
// if (vehicleService.update(vehicleQuery.toVehiclePO(), new LambdaQueryWrapper<Vehicle>().eq(Vehicle::getVehicleId, vehicleQuery.getVehicleId()))) {
// // 返回成功
// logger.info("更新载具信息成功");
// rsp.setCode(ResponseCode.OK.getCode());
// rsp.setMessage("更新载具信息成功");
// } else {
// // 返回失败
// logger.error("更新载具信息失败");
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("更新载具信息失败");
// }
//
// return convertJsonString(rsp);
// } catch (Exception e) {
// // 回滚事务
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// logger.info("更新载具信息发生异常:{}", convertJsonString(e));
// // 返回其他异常
// rsp.setCode(ResponseCode.ERROR.getCode());
// rsp.setMessage("更新载具信息发生异常");
// return JSON.toJSONString(rsp);
// }
// }
}

View File

@ -25,6 +25,7 @@ import com.wms.service.business.IWmsTaskService;
import com.wms.service.business.IWorkService;
import com.wms.utils.HttpUtils;
import com.wms.utils.StringUtils;
import com.wms.utils.WmsUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
@ -146,6 +147,10 @@ public class TaskController {
* 非计划领料服务
*/
private final NoPlanRecordService noPlanRecordService;
/**
* 日志服务
*/
private final LogService logService;
/**
* Wcs服务
*/
@ -171,7 +176,6 @@ public class TaskController {
ResponseEntity response = new ResponseEntity();
try {
// 验证入库请求
// TODO 这里需要判断这个箱子里面的其他物料是否能和当前物料放在一起
String validationInfo = validateService.validateTaskInRequest(taskInRequest);
if (!Objects.equals(validationInfo, TaskInValidationEnum.OK.getErrorMessage())) {
logger.error("入库请求验证错误!{}", validationInfo);
@ -977,6 +981,11 @@ public class TaskController {
// 发送信息
logger.info("发送电子标签亮灯请求:{}", convertJsonString(wcsETaskRequest));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(sendToWcsETaskUrl, convertJsonString(wcsETaskRequest)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "发送电子标签任务", "eTagTask", convertJsonString(wcsETaskRequest), convertJsonString(result), sendToWcsETaskUrl, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误");
}
if (result == null || !Objects.equals(result.getCode(), ResponseCode.OK.getCode())) {
logger.error("发送电子标签亮灯任务失败:{}", convertJsonString(result));
throw new Exception("发送电子标签亮灯任务失败");
@ -1170,6 +1179,7 @@ public class TaskController {
List<PickTask> pickedTasks = pickTaskService.list(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getStandId, workFlow.getWorkStation())
.ne(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode()));
if (!pickedTasks.isEmpty()) {
List<String> vehicleIds = pickedTasks.stream().map(PickTask::getVehicleId).distinct().toList();
if (outsideVehiclesService.exists(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getGoodsId, workFlow.getGoodsId())
@ -1177,6 +1187,7 @@ public class TaskController {
workFlow.setLightStatus(0);// 未亮灯
workFlow.setWorkStatus(1);// 正在做
}
}
} else {
workFlow.setLightStatus(2);// 已拍灯
workFlow.setWorkStatus(2);// 已完成
@ -2199,6 +2210,11 @@ public class TaskController {
} else {
logger.info("发送电子标签亮灯请求:{}", convertJsonString(wcsETaskRequest));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(sendToWcsETaskUrl, convertJsonString(wcsETaskRequest)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "发送电子标签任务", "eTagTask", convertJsonString(wcsETaskRequest), convertJsonString(result), sendToWcsETaskUrl, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误");
}
if (result == null || !Objects.equals(result.getCode(), ResponseCode.OK.getCode())) {
logger.error("发送电子标签亮灯任务失败:{}", convertJsonString(result));
throw new Exception("发送电子标签亮灯任务失败");

View File

@ -33,4 +33,11 @@ public class OutsideVehicles {
*/
@TableField("remain_num")
private BigDecimal remainNum;
/**
* 状态
* 0未出库完成
* 1已出库完成
*/
@TableField("out_status")
private Integer outStatus;
}

View File

@ -22,8 +22,6 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Objects;
import static com.wms.config.InitLocalConfig.configMap;
/**
* 验证服务接口的实现
*/
@ -37,6 +35,7 @@ public class ValidateServiceImplements implements IValidateService {
private final GoodsService goodsService;// 物料服务
private final LocationService locationService;// 库位服务
private final StockService stockService;// 库存服务
private final PickTaskService pickTaskService;// 拣选任务
/**
* 验证入库请求
@ -57,7 +56,17 @@ public class ValidateServiceImplements implements IValidateService {
.and(wrapper -> wrapper.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode())))) {
return TaskInValidationEnum.DUPLICATE_VEHICLE_ID.getErrorMessage();
}
// 如果这个箱子还有拣选任务不允许操作
if (pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getVehicleId, taskInRequest.getVehicleId()))) {
return TaskInValidationEnum.ON_PICKING.getErrorMessage();
}
// 验证当前的箱子是否有其他不是暂存状态的任务
if(taskService.exists(new LambdaQueryWrapper<Task>()
.eq(Task::getVehicleId, taskInRequest.getVehicleId())
.ne(Task::getTaskStatus, WmsTaskStatus.TEMP.getCode()))) {
return TaskInValidationEnum.OTHER_TASKS.getErrorMessage();
}
// 验证物料信息
if (taskInRequest.getGoodsList() != null && !taskInRequest.getGoodsList().isEmpty()) {
for (GoodsInRequest goodsInRequest : taskInRequest.getGoodsList()) {

View File

@ -7,6 +7,7 @@ import com.wms.constants.enums.*;
import com.wms.entity.app.ResponseEntity;
import com.wms.entity.app.wcs.WcsStandTaskRequest;
import com.wms.entity.app.wcs.WcsTaskRequest;
import com.wms.entity.table.OutsideVehicles;
import com.wms.entity.table.PickTask;
import com.wms.entity.table.Task;
import com.wms.entity.table.WmsLog;
@ -55,12 +56,8 @@ public class WmsJobServiceImplements implements IWmsJobService {
int maxVehicleNums = Integer.parseInt(max_vehicle_nums);
int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);
List<String> outsideVehicles = outsideVehiclesService.selectDistinctVehicles();
if (outsideVehicles == null) {
if (outsideVehicles == null || outsideVehicles.isEmpty()) {
outsideVehicles = Collections.emptyList();
} else {
if (outsideVehicles.size() >= maxVehicleNums) {
return;
}
}
int remainVehicleNums = maxVehicleNums - outsideVehicles.size();
@ -72,19 +69,34 @@ public class WmsJobServiceImplements implements IWmsJobService {
List<WcsTaskRequest> request = new ArrayList<>();
// 已经下发的任务组列表
List<String> taskGroupIds = new ArrayList<>();
// 本次生成的环线任务
List<String> pickVehicleIds = new ArrayList<>();
if (!allTasks.isEmpty()) {
for (Task task : allTasks) {
if (taskGroupIds.size() >= remainVehicleNums || taskGroupIds.size() >= maxWcsAcceptNums) {
if (taskGroupIds.size() >= maxWcsAcceptNums) {
// 每次给wcs下发数量
break;
}
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
continue;
}
}
if (taskGroupIds.contains(task.getTaskGroup())) {
if (Objects.equals(task.getTaskType(), TaskType.OUT.getCode())
&& task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) {
// 去站台的拣选任务
if (!pickVehicleIds.contains(task.getVehicleId())) {
if (pickVehicleIds.size() >= remainVehicleNums) {
continue;
} else {
pickVehicleIds.add(task.getVehicleId());
}
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
@ -116,23 +128,46 @@ public class WmsJobServiceImplements implements IWmsJobService {
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误");
logger.error("插入日志错误");
}
if (result != null && Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
if (result == null) {
logger.error("发送任务异常。");
} else {
if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
logger.info("发送WCS任务成功。");
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.in(Task::getTaskGroup, taskGroupIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
} else {
logger.error("发送任务错误:{}", convertJsonString(result));
// 流转载具状态变更
if (!pickVehicleIds.isEmpty()) {
outsideVehiclesService.update(new LambdaUpdateWrapper<OutsideVehicles>()
.set(OutsideVehicles::getOutStatus, 1)
.in(OutsideVehicles::getVehicleId, pickVehicleIds));
}
} else {
logger.error("WCS发送任务地址为空");
// 判断returnData的数据
if (result.getReturnData() != null) {
List<WcsTaskRequest> errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class);
if (!errorTasks.isEmpty()) {
List<String> failedTaskIds = errorTasks.stream().map(WcsTaskRequest::getTaskId).distinct().toList();
// 更新任务状态为异常
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.EXCEPTION.getCode())
.in(Task::getTaskGroup, failedTaskIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
}
}
logger.error("发送任务错误:{}", convertJsonString(result));
}
}
} else {
logger.error("WCS发送任务地址为空。");
}
}
} catch (Exception exception) {
logger.error("向WCS发送任务时发生异常{}", convertJsonString(exception));
throw new Exception("向WCS发送任务时发生异常");
throw new Exception("向WCS发送任务时发生异常");
}
}
@ -184,9 +219,10 @@ public class WmsJobServiceImplements implements IWmsJobService {
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误");
logger.error("插入日志错误");
}
if (result != null && Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
logger.info("发送拣选任务成功。");
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.SEND.getCode())
.in(PickTask::getVehicleId, vehicleAndStansMap.keySet())
@ -195,12 +231,12 @@ public class WmsJobServiceImplements implements IWmsJobService {
logger.error("发送拣选任务错误:{}", convertJsonString(result));
}
} else {
logger.error("WCS发送拣选任务地址为空");
logger.error("WCS发送拣选任务地址为空");
}
}
} catch (Exception exception) {
logger.error("向WCS发送拣选任务时发生异常{}", convertJsonString(exception));
throw new Exception("向WCS发送拣选任务时发生异常");
throw new Exception("向WCS发送拣选任务时发生异常");
}
}

View File

@ -119,15 +119,19 @@ public class WorkServiceImplements implements IWorkService {
goodsToStationService.saveBatch(goodsToStationList);
// 更新工单表
List<String> orderIds = currentStationWorkFlows.stream().map(WorkFlow::getOrderId).distinct().toList();
if (!orderIds.isEmpty()) {
kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>()
.set(KateOrders::getOrderStatus, 1)
.in(KateOrders::getOrderId, orderIds)
.eq(KateOrders::getOrderStatus, 0));
}
// 更新dbs表
if (!workOrderList.isEmpty()) {
kateDBSService.update(new LambdaUpdateWrapper<KateDBS>()
.set(KateDBS::getDbsStatus, 1)
.in(KateDBS::getWorkOrder, workOrderList)
.eq(KateDBS::getDbsStatus, 0));
}
// 电子标签库位配置
List<ELocationConfig> eLocationConfigList = new ArrayList<>();
// 查找到当前站台所有可用的电子标签
@ -195,6 +199,7 @@ public class WorkServiceImplements implements IWorkService {
// 已经不存在未分配的任务且没有拣选任务可视为完成
// 更新工作流状态-->完成
List<String> workFlowIds = currentWorkFlowList.stream().map(WorkFlow::getWorkFlowId).distinct().toList();
if (!workFlowIds.isEmpty()) {
workFlowService.update(new LambdaUpdateWrapper<WorkFlow>()
.set(WorkFlow::getWorkStatus, 2)
.set(WorkFlow::getFinishTime, LocalDateTime.now())
@ -202,6 +207,7 @@ public class WorkServiceImplements implements IWorkService {
.in(WorkFlow::getWorkFlowId, workFlowIds)
.ne(WorkFlow::getWorkStatus, 2));
}
}
return;
}
for (GoodsToStation goodsToStation : goodsToStationList) {

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

View File

@ -3,6 +3,6 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wms.mapper.OutsideVehiclesMapper">
<select id="selectDistinctVehicles" resultType="string">
select distinct vehicle_id from tbl_app_outside_vehicles;
select distinct vehicle_id from tbl_app_outside_vehicles where out_status = 1;
</select>
</mapper>