代码更新:

1. 调整下发任务逻辑
2. 调整非计划领料
This commit is contained in:
梁州 2024-09-27 17:43:14 +08:00
parent e734e21174
commit 3b25a93b5e
20 changed files with 18899 additions and 32647 deletions

View File

@ -82,8 +82,10 @@ public class MyLogAspect {
}
wmsLog.setLogTime(LocalDateTime.now());
// 获取用户名
Method methodToGetUserName = wmsLog.getLogRequest().getClass().getMethod("getUserName");
wmsLog.setLogUser((String) methodToGetUserName.invoke(wmsLog.getLogRequest(), new Object[]{}));
if (wmsLog.getLogRequest() != null) {
Method methodToGetUserName = wmsLog.getLogRequest().getClass().getMethod("getUserName");
wmsLog.setLogUser((String) methodToGetUserName.invoke(wmsLog.getLogRequest(), new Object[]{}));
}
logService.save(wmsLog);
} catch (Exception e) {
e.printStackTrace();
@ -125,8 +127,10 @@ public class MyLogAspect {
}
wmsLog.setLogTime(LocalDateTime.now());
// 获取用户名
Method methodToGetUserName = wmsLog.getLogRequest().getClass().getMethod("getUserName");
wmsLog.setLogUser((String) methodToGetUserName.invoke(wmsLog.getLogRequest(), new Object[]{}));
if (wmsLog.getLogRequest() != null) {
Method methodToGetUserName = wmsLog.getLogRequest().getClass().getMethod("getUserName");
wmsLog.setLogUser((String) methodToGetUserName.invoke(wmsLog.getLogRequest(), new Object[]{}));
}
logService.save(wmsLog);
} catch (Exception exception) {
exception.printStackTrace();

View File

@ -0,0 +1,23 @@
package com.wms.constants.enums;
import lombok.Getter;
@Getter
public enum StockUpdateReasonEnum {
UPDATE_CLIENT("界面修改库存"),
DELETE_CLIENT("界面删除库存"),
ADD_CLIENT("界面增加库存"),
UPDATE_IN("入库更新库存"),
ADD_IN("入库增加库存"),
FULL_OUT("整出"),
KITTING_UPDATE("备料拣选更新"),
CONFIRM_UPDATE("站台确认更新"),
CONFIRM_DELETE("站台处理箱料错误"),
CLC_NO_PLAN_UPDATE("直接物料非计划领料回库更新");
StockUpdateReasonEnum(String reason) {
this.reason = reason;
}
private final String reason;
}

View File

@ -369,7 +369,7 @@ public class ExcelController {
// 目标数量
BigDecimal targetNum = stockOfGoodsDto.getNumOfKanban().multiply(stockOfGoodsDto.getNumOfPerKanban());
// 计算需要多少个看板
BigDecimal needKanbanQuantity = targetNum.subtract(stockOfGoodsDto.getRemainNumSum()).divide(stockOfGoodsDto.getNumOfPerKanban(), 0, RoundingMode.CEILING);
BigDecimal needKanbanQuantity = targetNum.subtract(stockOfGoodsDto.getRemainNumSum()).divide(stockOfGoodsDto.getNumOfPerKanban(), 0, RoundingMode.FLOOR);
// 设定物流数据
tempClcKanbanRequirementExcelVo.setGoodsId(stockOfGoodsDto.getGoodsId());
tempClcKanbanRequirementExcelVo.setReleasePoint(stockOfGoodsDto.getReleasePoint());

View File

@ -67,6 +67,10 @@ public class KateWorkQueryController {
* 工作流服务
*/
private final WorkFlowService workFlowService;
/**
* 工作总结服务
*/
private final WorkSummaryService workSummaryService;
/**
* 请求头部信息
*/
@ -487,7 +491,7 @@ public class KateWorkQueryController {
TotalNumOfType = TotalNumOfType.add(BigDecimal.ONE);
BigDecimal targetNum = stockOfGoodsDto.getNumOfKanban().multiply(stockOfGoodsDto.getNumOfPerKanban());
// 计算需要多少个看板
BigDecimal needKanbanQuantity = targetNum.subtract(stockOfGoodsDto.getRemainNumSum()).divide(stockOfGoodsDto.getNumOfPerKanban(), 0, RoundingMode.CEILING);
BigDecimal needKanbanQuantity = targetNum.subtract(stockOfGoodsDto.getRemainNumSum()).divide(stockOfGoodsDto.getNumOfPerKanban(), 0, RoundingMode.FLOOR);
TotalNumOfPc = TotalNumOfPc.add(needKanbanQuantity.multiply(stockOfGoodsDto.getNumOfPerKanban()));
TotalNumOfBox = TotalNumOfBox.add(needKanbanQuantity);
if (stockOfGoodsDto.getBoxType().contains("810")) {
@ -621,4 +625,39 @@ public class KateWorkQueryController {
return convertJsonString(rsp);
}
}
/**
* 查询工作总结
*/
@PostMapping("/getWorkSummary")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "查询工作总结", logMethod = "getWorkSummary")
public String getWorkSummary(@RequestBody WorkSummaryQuery workSummaryQuery) {
logger.info("接收到查询工作总结请求:{}请求ip{}", convertJsonString(workSummaryQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
Page<WorkSummary> page = workSummaryQuery.toMpPage();
Page<WorkSummary> workSummaryPage = workSummaryService.page(page, new LambdaQueryWrapper<WorkSummary>()
.eq(workSummaryQuery.getLackStatus() != null, WorkSummary::getLackStatus, workSummaryQuery.getLackStatus())
.eq(workSummaryQuery.getWorkDate() != null, WorkSummary::getWorkDate, workSummaryQuery.getWorkDate())
.like(StringUtils.isNotEmpty(workSummaryQuery.getWorkStation()), WorkSummary::getWorkStation, workSummaryQuery.getWorkStation())
.like(StringUtils.isNotEmpty(workSummaryQuery.getWorkOrder()), WorkSummary::getWorkOrder, workSummaryQuery.getWorkOrder())
.like(StringUtils.isNotEmpty(workSummaryQuery.getWorkCenter()), WorkSummary::getWorkCenter, workSummaryQuery.getWorkCenter())
.like(StringUtils.isNotEmpty(workSummaryQuery.getGoodsId()), WorkSummary::getGoodsId, workSummaryQuery.getGoodsId()));
PageDto<WorkSummaryVo> pageDto = PageDto.of(workSummaryPage, workSummary -> BeanUtil.copyProperties(workSummary, WorkSummaryVo.class));
logger.info("查询工作总结成功。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("查询工作总结成功。");
response.setReturnData(pageDto);
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

@ -7,15 +7,18 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wms.annotation.MyLog;
import com.wms.constants.enums.ResponseCode;
import com.wms.constants.enums.StockUpdateReasonEnum;
import com.wms.entity.app.ResponseEntity;
import com.wms.entity.app.dto.PageDto;
import com.wms.entity.app.dto.StockDto;
import com.wms.entity.app.dto.extend.StockDetailInfo;
import com.wms.entity.app.request.StockQuery;
import com.wms.entity.app.request.StockUpdateRecordQuery;
import com.wms.entity.app.request.WorkSummaryQuery;
import com.wms.entity.app.vo.StockUpdateRecordVo;
import com.wms.entity.app.vo.StockVo;
import com.wms.entity.table.Location;
import com.wms.entity.table.Stock;
import com.wms.entity.table.Vehicle;
import com.wms.entity.app.vo.WorkSummaryVo;
import com.wms.entity.table.*;
import com.wms.service.IStockUpdateRecordService;
import com.wms.service.LocationService;
import com.wms.service.StockService;
@ -195,7 +198,7 @@ public class StockController {
.eq(Vehicle::getVehicleId, stockBefore.getVehicleId())
.eq(Vehicle::getIsEmpty, 0));
}
stockUpdateRecordService.addStockUpdateRecord(stockBefore, null, "删除库存", stockQuery.getUserName());
stockUpdateRecordService.addStockUpdateRecord(stockBefore, null, StockUpdateReasonEnum.DELETE_CLIENT.getReason(), stockQuery.getUserName());
// 返回成功
logger.info("数量为0删除库存成功");
rsp.setCode(ResponseCode.OK.getCode());
@ -223,7 +226,7 @@ public class StockController {
}
// 更新库存
if (stockService.update(updatingStock, stockLambdaQueryWrapper)) {
stockUpdateRecordService.addStockUpdateRecord(stockBefore, updatingStock, "修改库存", stockQuery.getUserName());
stockUpdateRecordService.addStockUpdateRecord(stockBefore, updatingStock, StockUpdateReasonEnum.UPDATE_CLIENT.getReason(), stockQuery.getUserName());
// 返回成功
logger.info("更新库存信息成功");
rsp.setCode(ResponseCode.OK.getCode());
@ -272,7 +275,7 @@ public class StockController {
.set(Vehicle::getIsEmpty, 0)
.eq(Vehicle::getVehicleId, stockPo.getVehicleId())
.eq(Vehicle::getIsEmpty, 1));
stockUpdateRecordService.addStockUpdateRecord(null, stockPo, "新增库存", stockQuery.getUserName());
stockUpdateRecordService.addStockUpdateRecord(null, stockPo, StockUpdateReasonEnum.ADD_CLIENT.getReason(), stockQuery.getUserName());
// 返回成功
logger.info("添加库存信息成功");
rsp.setCode(ResponseCode.OK.getCode());
@ -294,4 +297,39 @@ public class StockController {
return convertJsonString(rsp);
}
}
/**
* 查询库存更新记录
* @param stockUpdateRecordQuery 记录查询参数
* @return 查询结果
*/
@PostMapping("/getStockUpdateRecord")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "查询库存更新记录", logMethod = "getStockUpdateRecord")
public String getStockUpdateRecord(@RequestBody StockUpdateRecordQuery stockUpdateRecordQuery) {
logger.info("接收到查询库存更新记录请求:{}请求ip{}", convertJsonString(stockUpdateRecordQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
Page<StockUpdateRecord> page = stockUpdateRecordQuery.toMpPage();
Page<StockUpdateRecord> recordsPage = stockUpdateRecordService.page(page, new LambdaQueryWrapper<StockUpdateRecord>()
.like(StringUtils.isNotEmpty(stockUpdateRecordQuery.getReason()), StockUpdateRecord::getReason, stockUpdateRecordQuery.getReason())
.like(StringUtils.isNotEmpty(stockUpdateRecordQuery.getVehicleId()), StockUpdateRecord::getVehicleId, stockUpdateRecordQuery.getVehicleId())
.like(StringUtils.isNotEmpty(stockUpdateRecordQuery.getGoodsId()), StockUpdateRecord::getGoodsId, stockUpdateRecordQuery.getGoodsId())
.orderByDesc(StockUpdateRecord::getUpdateTime));
PageDto<StockUpdateRecordVo> pageDto = PageDto.of(recordsPage, updateRecord -> BeanUtil.copyProperties(updateRecord, StockUpdateRecordVo.class));
logger.info("查询库存更新记录成功。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("查询库存更新记录成功。");
response.setReturnData(pageDto);
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

@ -341,7 +341,7 @@ public class TaskController {
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());
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.UPDATE_IN.getReason(), inTask.getUserName());
} else {
Stock newStock = new Stock();
newStock.setStockId(generateId("ST_"));
@ -359,7 +359,7 @@ public class TaskController {
detailInfo.setTotalNum(inTask.getGoodsRelated().getOpNum());
newStock.setGoodsRelated(detailInfo);
stockService.save(newStock);
stockUpdateRecordService.addStockUpdateRecord(null, newStock, "入库", inTask.getUserName());
stockUpdateRecordService.addStockUpdateRecord(null, newStock, StockUpdateReasonEnum.ADD_IN.getReason(), inTask.getUserName());
}
}
}
@ -461,7 +461,7 @@ public class TaskController {
// 删除当前载具上所有库存
List<Stock> removeStocks = stockService.list(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
for (Stock stock : removeStocks) {
stockUpdateRecordService.addStockUpdateRecord(stock, null, "整出", outTask.getUserName());
stockUpdateRecordService.addStockUpdateRecord(stock, null, StockUpdateReasonEnum.FULL_OUT.getReason(), outTask.getUserName());
}
stockService.remove(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
// 删除载具
@ -1242,7 +1242,7 @@ public class TaskController {
goodsDetail.setRemainNum(goodsDetail.getRemainNum().subtract(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum())));
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "备料拣选更新", "电子标签灯光反馈");
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.KITTING_UPDATE.getReason(), "电子标签灯光反馈");
}
// 更新电子标签库位信息
etagLocationService.update(new LambdaUpdateWrapper<ETagLocation>()
@ -1263,6 +1263,15 @@ public class TaskController {
eLocationConfigLast.setBoxStatus(2);
eLocationConfigLastService.updateById(eLocationConfigLast);
}
// 更新电子标签库位信息
etagLocationService.update(new LambdaUpdateWrapper<ETagLocation>()
.set(ETagLocation::getPickStatus, 0)
.set(ETagLocation::getTaskId, "")
.set(ETagLocation::getVehicleNo, "")
.set(ETagLocation::getTaskType, null)
.set(ETagLocation::getNeedNum, null)
.set(ETagLocation::getConfirmNum, null)
.eq(ETagLocation::getELocationId, eTaskFeedbackRequest.getLocation()));
}
response.setCode(ResponseCode.OK.getCode());
response.setMessage("处理反馈成功");
@ -1358,7 +1367,7 @@ public class TaskController {
goodsDetail.setRemainNum(workConfirmRequest.getRemainNumReal());
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "站台确认更新", workConfirmRequest.getUserName());
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName());
}
OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId())
@ -1428,6 +1437,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, standId));
response.setMessage("确认成功,放行");
} else {
@ -1436,6 +1446,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "当前工作已经全部完成,请至完成界面进行后续工作。")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, standId));
StandPickVo pickVoEntity = new StandPickVo();
pickVoEntity.setTip("当前工作已经全部完成,请至完成界面进行后续工作。");
@ -1464,6 +1475,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, standId));
response.setMessage("确认成功,放行");
} else {
@ -1472,6 +1484,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "当前工作已经全部完成,请至完成界面进行后续工作。")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, standId));
StandPickVo pickVoEntity = new StandPickVo();
pickVoEntity.setTip("当前工作已经全部完成,请至完成界面进行后续工作。");
@ -1598,6 +1611,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, targetStand.getStandId()));
// 当前站台工作未全部完成
response.setMessage("确认成功,放行");
@ -1607,6 +1621,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "当前工作已经全部完成,请至完成界面进行后续工作。")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, targetStand.getStandId()));
// 当前站台工作已全部完成需要提示工作完成打印标签
response.setMessage("当前工作已经全部完成,请至完成界面进行后续工作。");
@ -1632,6 +1647,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, targetStand.getStandId()));
response.setMessage("确认成功,放行");
} else {
@ -1640,6 +1656,7 @@ public class TaskController {
.set(Stand::getPickVehicle, "")
.set(Stand::getPickGoods, "")
.set(Stand::getPickTip, "当前工作已经全部完成,请至完成界面进行后续工作。")
.setDecrBy(Stand::getPickVehicleCount, 1)
.eq(Stand::getStandId, targetStand.getStandId()));
// 当前站台工作已全部完成需要提示工作完成打印标签
response.setMessage("当前工作已经全部完成,请至完成界面进行后续工作。");
@ -2160,7 +2177,7 @@ public class TaskController {
ResponseEntity response = new ResponseEntity();
try {
// 判断请求参数是否正确
if (sortBoxRequest == null || StringUtils.isEmpty(sortBoxRequest.getBigBoxNo()) || sortBoxRequest.getOrderOfOrders() == null) {
if (sortBoxRequest == null || StringUtils.isEmpty(sortBoxRequest.getBigBoxNo())) {
logger.error("请求参数不全。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("请求参数不全。");
@ -2358,10 +2375,10 @@ public class TaskController {
if (stockList != null && !stockList.isEmpty()) {
// 需求数量
BigDecimal needNum = noPlanRequest.getNeedNum();
List<Stock> waitForOutStockList = new ArrayList<>();
// 出库任务列表
List<Task> outTasks = new ArrayList<>();
// 尝试生成出库任务
List<String> pickStandIds = new ArrayList<>();
for (Stock tempStock : stockList) {
if (needNum.compareTo(BigDecimal.ZERO) <= 0) {// 需求数量小于等于0
break;
@ -2374,7 +2391,6 @@ public class TaskController {
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(goodsRelated.getRemainNum().subtract(needNum));
tempStock.setGoodsRelated(goodsRelated);
waitForOutStockList.add(tempStock);
} else {
// 当前箱子物料剩余数量少于需求数量
needNum = needNum.subtract(tempStock.getGoodsRelated().getRemainNum());
@ -2382,7 +2398,6 @@ public class TaskController {
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(BigDecimal.ZERO);
tempStock.setGoodsRelated(goodsRelated);
waitForOutStockList.add(tempStock);
}
// 创建出库任务
Task tempOutTask = new Task();
@ -2399,11 +2414,10 @@ public class TaskController {
tempOutTask.setIsPicking(1);
outTasks.add(tempOutTask);
} else if (Objects.equals(tempStock.getStockStatus(), StockStatus.OUT.getCode())) {
// 判断这个料箱是否有拣选任务
boolean hasPickTask = pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
// 查询这个箱子的拣选任务
List<PickTask> thisVehiclePickTasks = pickTaskService.list(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getVehicleId, tempStock.getVehicleId()));
if (!hasPickTask) {
// 有拣选任务时不做处理
if (thisVehiclePickTasks.isEmpty()) {
if (tempStock.getGoodsRelated().getRemainNum().compareTo(needNum) > 0) {
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;
@ -2411,7 +2425,6 @@ public class TaskController {
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(goodsRelated.getRemainNum().subtract(needNum));
tempStock.setGoodsRelated(goodsRelated);
waitForOutStockList.add(tempStock);
} else {
// 当前箱子物料剩余数量少于需求数量
needNum = needNum.subtract(tempStock.getGoodsRelated().getRemainNum());
@ -2419,17 +2432,21 @@ public class TaskController {
StockDetailInfo goodsRelated = tempStock.getGoodsRelated();
goodsRelated.setRemainNum(BigDecimal.ZERO);
tempStock.setGoodsRelated(goodsRelated);
waitForOutStockList.add(tempStock);
}
} else {
// 将这个箱子对应的出库任务优先级设置位2
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskPriority, 2)
.eq(Task::getTaskId, tempStock.getVehicleId())
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
thisVehiclePickTasks.forEach(pickTask -> {
if (!pickStandIds.contains(pickTask.getStandId())) {
pickStandIds.add(pickTask.getStandId());
}
});
}
}
}
if (waitForOutStockList.isEmpty()) {
logger.error("所有库存在站台备料中。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("所有库存在站台备料中。");
return convertJsonString(response);
}
// 添加出库任务
if (!outTasks.isEmpty()) {
taskService.saveBatch(outTasks);
@ -2465,7 +2482,13 @@ public class TaskController {
logger.info("处理直接物料非计划领料请求成功。");
response.setCode(ResponseCode.OK.getCode());
response.setMessage("处理直接物料非计划领料请求成功。");
StringBuilder message = new StringBuilder("处理直接物料非计划领料请求成功。");
if (!pickStandIds.isEmpty()) {
message.append("有料需要去工作站台领取。站台号:");
pickStandIds.forEach(pickStandId -> message.append(pickStandId).append(""));
message.replace(message.length()-1, message.length(), "");
}
response.setMessage(String.valueOf(message));
} else {
logger.error("非计划领料没有库存。");
response.setCode(ResponseCode.ERROR.getCode());
@ -2567,7 +2590,7 @@ public class TaskController {
}
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, "直接物料非计划领料确认回库更新", pickNumQuery.getUserName());
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CLC_NO_PLAN_UPDATE.getReason(), pickNumQuery.getUserName());
}
// 判断这个箱子是否还有拣选任务
boolean hasPickTasks = pickTaskService.exists(new LambdaQueryWrapper<PickTask>()

View File

@ -0,0 +1,97 @@
package com.wms.entity.app.request;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 工作总结查询类
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class WorkSummaryQuery extends PageQuery {
/**
* id
*/
@JsonProperty("workFlowId")
private String workFlowId;
/**
* 工作站台
*/
@JsonProperty("workStation")
private String workStation;
/**
* 工单
*/
@JsonProperty("workOrder")
private String workOrder;
/**
* 工位
*/
@JsonProperty("workCenter")
private String workCenter;
/**
* 物料编号
*/
@JsonProperty("goodsId")
private String goodsId;
/**
* 已拣货数量
*/
@JsonProperty("pickedNum")
private BigDecimal pickedNum;
/**
* 需求数量
*/
@JsonProperty("needNum")
private BigDecimal needNum;
/**
* 缺件数量
*/
@JsonProperty("lackNum")
private BigDecimal lackNum;
/**
* 工作日期
*/
@JsonProperty("workDate")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime workDate;
/**
* 工作状态
* 0未开始
* 1正在做
* 2已完成
*/
@JsonProperty("workStatus")
private Integer workStatus;
/**
* 缺件状态
* 0不缺件
* 1缺件
*/
@JsonProperty("lackStatus")
private Integer lackStatus;
/**
* 完成时间
*/
@JsonProperty("finishTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime finishTime;
/**
* 操作人员
*/
@JsonProperty("opUser")
private String opUser;
/**
* 电子标签位
*/
@JsonProperty("eLocationId")
private String eLocationId;
}

View File

@ -1,6 +1,7 @@
package com.wms.entity.app.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@ -67,4 +68,9 @@ public class StandVo {
* 拣选提示信息
*/
private String pickTip;
/**
* 所有待拣选的箱子数量
*/
@JsonProperty("pickVehicleCount")
private Integer pickVehicleCount;
}

View File

@ -0,0 +1,95 @@
package com.wms.entity.app.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 工作总结Vo
*/
@Data
public class WorkSummaryVo {
/**
* id
*/
@JsonProperty("workFlowId")
private String workFlowId;
/**
* 工作站台
*/
@JsonProperty("workStation")
private String workStation;
/**
* 工单
*/
@JsonProperty("workOrder")
private String workOrder;
/**
* 工位
*/
@JsonProperty("workCenter")
private String workCenter;
/**
* 物料编号
*/
@JsonProperty("goodsId")
private String goodsId;
/**
* 已拣货数量
*/
@JsonProperty("pickedNum")
private BigDecimal pickedNum;
/**
* 需求数量
*/
@JsonProperty("needNum")
private BigDecimal needNum;
/**
* 缺件数量
*/
@JsonProperty("lackNum")
private BigDecimal lackNum;
/**
* 工作日期
*/
@JsonProperty("workDate")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime workDate;
/**
* 工作状态
* 0未开始
* 1正在做
* 2已完成
*/
@JsonProperty("workStatus")
private Integer workStatus;
/**
* 缺件状态
* 0不缺件
* 1缺件
*/
@JsonProperty("lackStatus")
private Integer lackStatus;
/**
* 完成时间
*/
@JsonProperty("finishTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime finishTime;
/**
* 操作人员
*/
@JsonProperty("opUser")
private String opUser;
/**
* 电子标签位
*/
@JsonProperty("eLocationId")
private String eLocationId;
}

View File

@ -1,67 +0,0 @@
package com.wms.entity.page;
import com.wms.utils.StringUtils;
/**
* 分页请求
* 前端表格用
*/
public class PageDomain {
/**
* 当前记录起始索引
*/
private Integer pageNum;
/**
* 每页显示记录数
*/
private Integer pageSize;
/**
*排序列
*/
private String orderByColumn;
/**
* 排序方向
*/
private String isAsc = "asc";
public String getOrderBy()
{
if (StringUtils.isEmpty(orderByColumn))
{
return "";
}
return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public String getOrderByColumn() {
return orderByColumn;
}
public void setOrderByColumn(String orderByColumn) {
this.orderByColumn = orderByColumn;
}
public String getIsAsc() {
return isAsc;
}
public void setIsAsc(String isAsc) {
this.isAsc = isAsc;
}
}

View File

@ -1,43 +0,0 @@
package com.wms.entity.page;
/**
* 前端请求表格数据
*/
public class TableRequest<T, T2> {
/**
* 分页请求数据
*/
private PageDomain page;
/**
* 参数
*/
private T param;
/**
* 参数2
*/
private T2 param2;
public PageDomain getPage() {
return page;
}
public void setPage(PageDomain page) {
this.page = page;
}
public T getParam() {
return param;
}
public void setParam(T param) {
this.param = param;
}
public T2 getParam2() {
return param2;
}
public void setParam2(T2 param2) {
this.param2 = param2;
}
}

View File

@ -1,57 +0,0 @@
package com.wms.entity.page;
import java.util.List;
/**
* 前端表格请求的返回值
*/
public class TableResponse {
/**
* 总记录数
*/
private long total;
/**
* 列表数据
*/
private List<?> rows;
/**
* 状态码
*/
private int code;
/**
* 消息
*/
private String message;
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List<?> getRows() {
return rows;
}
public void setRows(List<?> rows) {
this.rows = rows;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@ -86,4 +86,9 @@ public class Stand {
*/
@TableField("pick_tip")
private String pickTip;
/**
* 所有待拣选的箱子数量
*/
@TableField("pick_vehicle_count")
private Integer pickVehicleCount;
}

View File

@ -84,4 +84,9 @@ public class WorkSummary {
*/
@TableField("op_user")
private String opUser;
/**
* 电子标签位
*/
@TableField("e_location_id")
private String eLocationId;
}

View File

@ -80,9 +80,11 @@ public class WmsJobServiceImplements implements IWmsJobService {
continue;
}
}
if (Objects.equals(task.getTaskType(), TaskType.OUT.getCode())
&& task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) {
continue;
if (task.getTaskPriority() == 1) {
if (Objects.equals(task.getTaskType(), TaskType.OUT.getCode())
&& task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())) {
continue;
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
@ -151,6 +153,10 @@ public class WmsJobServiceImplements implements IWmsJobService {
}
}
/**
* 发送PickOut任务
* @throws Exception 异常
*/
@Override
public void sendPickOutTasks() throws Exception {
try {
@ -181,8 +187,10 @@ public class WmsJobServiceImplements implements IWmsJobService {
List<WcsTaskRequest> request = new ArrayList<>();
// 已经下发的任务组列表
List<String> taskGroupIds = new ArrayList<>();
// 本次生成的环线任务
// 本次生成的箱子
List<String> pickVehicleIds = new ArrayList<>();
// 本次跳过的箱子
List<String> skipVehicleIds = new ArrayList<>();
// 查找所有站台拣选任务
List<PickTask> standPickTasks = pickTaskService.list();
// 生成一个Map计算每个站台已经出库的拣选任务
@ -192,155 +200,221 @@ public class WmsJobServiceImplements implements IWmsJobService {
.eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
.eq(Stand::getStandType, 2));
for (Stand workStation : stands) {
outPickTaskMap.put(workStation.getStandId(), 0);
outPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount());
}
standPickTasks.forEach(pickTask -> {
if (!Objects.equals(pickTask.getPickStatus(), PickTaskStatusEnum.TEMP.getCode())) {
outPickTaskMap.put(pickTask.getStandId(),
outPickTaskMap.getOrDefault(pickTask.getStandId(), 0) + 1);
}
});
// 轮询堆垛机状态
List<Stand> stackerList = standService.list(new LambdaQueryWrapper<Stand>()
.eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
.eq(Stand::getStandType, 3));
List<Task> stackRunningTasks = taskService.list(new LambdaQueryWrapper<Task>()
.eq(Task::getTaskType, TaskType.OUT.getCode())
.and(wrapper -> {
wrapper.eq(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.or().eq(Task::getTaskStatus, WmsTaskStatus.RUN.getCode());
}));
.and(wrapper -> wrapper.eq(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.or().eq(Task::getTaskStatus, WmsTaskStatus.RUN.getCode())));
Map<Integer, Integer> runningTaskNumToEquipmentMap = new HashMap<>();
Map<Integer, List<Task>> newTaskToEquipmentMap = new HashMap<>();
for (Stand stacker : stackerList) {
// 找这台堆垛机正在执行的拣选出库任务数量
runningTaskNumToEquipmentMap.put(stacker.getEquipmentId(), 0);
// 查询每台堆垛机还没有下发的任务
List<Task> stackNewTasks = new ArrayList<>(allTasks.stream().filter(task ->
task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())
&& Objects.equals(stacker.getEquipmentId(), instantLocationMap.get(task.getOrigin()).getEquipmentId())
).toList());
newTaskToEquipmentMap.put(stacker.getEquipmentId(), stackNewTasks);
}
stackRunningTasks.forEach(task -> {
if (instantLocationMap.containsKey(task.getOrigin())) {
int key = instantLocationMap.get(task.getOrigin()).getEquipmentId();
runningTaskNumToEquipmentMap.put(key, runningTaskNumToEquipmentMap.get(key) + 1);
// 生成堆垛机可用列表
for (Task tempStackRunningTask : stackRunningTasks) {
if (instantLocationMap.containsKey(tempStackRunningTask.getOrigin())) {
int key = instantLocationMap.get(tempStackRunningTask.getOrigin()).getEquipmentId();
if (runningTaskNumToEquipmentMap.isEmpty()) {
// 没有可用堆垛机
break;
}
if (runningTaskNumToEquipmentMap.containsKey(key)) {
if (runningTaskNumToEquipmentMap.get(key) >= 2) {
runningTaskNumToEquipmentMap.remove(key);
} else {
runningTaskNumToEquipmentMap.replace(key, runningTaskNumToEquipmentMap.get(key) + 1);
}
}
}
});
for (Stand stacker : stackerList) {
}
if (runningTaskNumToEquipmentMap.isEmpty()) {
// 没有可用堆垛机
return;
}
// 还有可用堆垛机
while(!runningTaskNumToEquipmentMap.isEmpty()) {
if (request.size() >= maxWcsAcceptNums || remainVehicleNums <= 0) {
// 超过wcs一次可接受数量
break;
}
int availableTaskNum = 4 - runningTaskNumToEquipmentMap.get(stacker.getEquipmentId());
while (availableTaskNum > 0) {
if (request.size() >= maxWcsAcceptNums || remainVehicleNums <= 0) {
// 超过wcs一次可接受数量
break;
// 先找出目前数量最少的站台
String standId = outPickTaskMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
List<String> vehicleIds;
if (StringUtils.isNotEmpty(standId)) {
// 查找这个站台未下发的料箱
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& !pickVehicleIds.contains(pickTask.getVehicleId())
&& !skipVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
outPickTaskMap.remove(standId);
continue;
}
// 可以继续发任务
List<Task> currentStackerTasks = newTaskToEquipmentMap.get(stacker.getEquipmentId());
// 从这些任务里面找到最适合的任务下发
if (!currentStackerTasks.isEmpty()) {
// 先找出目前数量最少的站台
String standId = outPickTaskMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
List<String> vehicleIds;
List<String> currentStackerVehicleIds = currentStackerTasks.stream().map(Task::getVehicleId).distinct().toList();
if (StringUtils.isNotEmpty(standId)) {
// 查找这个站台未下发的料箱
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getStandId().equals(standId) && pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& !pickVehicleIds.contains(pickTask.getVehicleId()) && currentStackerVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
outPickTaskMap.remove(standId);
continue;
}
} else {
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& !pickVehicleIds.contains(pickTask.getVehicleId()) && currentStackerVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
break;
}
}
// 生成箱子-站台数量的Map
Map<String, Integer> vehicleStandsMap = new HashMap<>();
standPickTasks.forEach(pickTask -> {
if (vehicleIds.contains(pickTask.getVehicleId())) {
vehicleStandsMap.put(pickTask.getVehicleId(),
vehicleStandsMap.getOrDefault(pickTask.getVehicleId(), 0) + 1);
}
});
// 先找出适合的料箱
String vehicleId = vehicleStandsMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
if (StringUtils.isEmpty(vehicleId)) {
continue;
}
// 更新每个站台的拣选箱数量
List<String> standIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getVehicleId().equals(vehicleId))
.map(PickTask::getStandId)
.distinct()
.toList();
if (!standIds.isEmpty()) {
standIds.forEach(tempStandId -> outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1));
}
// 找到这个箱子的任务
List<Task> outPickTasks = currentStackerTasks.stream().filter(task -> task.getVehicleId().equals(vehicleId)).toList();
for (Task task : outPickTasks) {
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
currentStackerTasks.remove(task);
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
currentStackerTasks.remove(task);
continue;
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
tempTask.setTaskType(task.getTaskType());
tempTask.setOrigin(task.getOrigin());
tempTask.setDestination(task.getDestination());
tempTask.setVehicleNo(task.getVehicleId());
tempTask.setVehicleSize(task.getVehicleSize());
tempTask.setWeight(task.getWeight());
tempTask.setPriority(task.getTaskPriority());
request.add(tempTask);
// 已经发送过的任务组
taskGroupIds.add(task.getTaskGroup());
}
// 已经发送过的vehicleId
pickVehicleIds.add(vehicleId);
// 移除已经发送过的任务
currentStackerTasks.removeIf(task -> task.getVehicleId().equals(vehicleId));
newTaskToEquipmentMap.replace(stacker.getEquipmentId(), currentStackerTasks);
// 可用数量-1
availableTaskNum--;
// 剩余线体可继续出库料箱数量
remainVehicleNums--;
} else {
} else {
vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& !pickVehicleIds.contains(pickTask.getVehicleId())
&& !skipVehicleIds.contains(pickTask.getVehicleId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
break;
}
}
// 生成箱子-站台数量的Map
Map<String, Integer> vehicleStandsMap = new HashMap<>();
standPickTasks.forEach(pickTask -> {
if (vehicleIds.contains(pickTask.getVehicleId())) {
vehicleStandsMap.put(pickTask.getVehicleId(),
vehicleStandsMap.getOrDefault(pickTask.getVehicleId(), 0) + 1);
}
});
// 最多使用的箱子
String maxVehicleId = vehicleStandsMap.entrySet().stream()
.max(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
if (!StringUtils.isEmpty(maxVehicleId)) {
// 找到这个箱子的任务
List<Task> outPickTasks = allTasks.stream().filter(task -> task.getVehicleId().equals(maxVehicleId) && !pickVehicleIds.contains(task.getVehicleId())
&& task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
if (!outPickTasks.isEmpty()) {
// 更新每个站台的拣选箱数量
List<String> maxStandIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getVehicleId().equals(maxVehicleId))
.map(PickTask::getStandId)
.distinct()
.toList();
// 给当前设备号+1
int equipmentId = instantLocationMap.get(outPickTasks.get(0).getOrigin()).getEquipmentId();
if (runningTaskNumToEquipmentMap.containsKey(equipmentId)) {
boolean flag = false;
for (Task task : outPickTasks) {
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
continue;
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
tempTask.setTaskType(task.getTaskType());
tempTask.setOrigin(task.getOrigin());
tempTask.setDestination(task.getDestination());
tempTask.setVehicleNo(task.getVehicleId());
tempTask.setVehicleSize(task.getVehicleSize());
tempTask.setWeight(task.getWeight());
tempTask.setPriority(task.getTaskPriority());
request.add(tempTask);
// 已经发送过的任务组
taskGroupIds.add(task.getTaskGroup());
flag = true;
}
if (flag) {
if (!maxStandIds.isEmpty()) {
maxStandIds.forEach(tempStandId -> outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1));
}
runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// 已经发送过的vehicleId
pickVehicleIds.add(maxVehicleId);
// 剩余线体可继续出库料箱数量
remainVehicleNums--;
}
} else {
if (!skipVehicleIds.contains(maxVehicleId)) {
skipVehicleIds.add(maxVehicleId);
}
}
}
}
// 最少使用的箱子
String minVehicleId = vehicleStandsMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
if (!StringUtils.isEmpty(minVehicleId)) {
// 找到这个箱子的任务
List<Task> outPickTasks = allTasks.stream().filter(task -> task.getVehicleId().equals(minVehicleId) && !pickVehicleIds.contains(task.getVehicleId())
&& task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
if (!outPickTasks.isEmpty()) {
// 更新每个站台的拣选箱数量
List<String> minStandIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getVehicleId().equals(minVehicleId))
.map(PickTask::getStandId)
.distinct()
.toList();
// 给当前设备号+1
int equipmentId = instantLocationMap.get(outPickTasks.get(0).getOrigin()).getEquipmentId();
if (runningTaskNumToEquipmentMap.containsKey(equipmentId)) {
boolean flag = false;
for (Task task : outPickTasks) {
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
continue;
}
}
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
tempTask.setTaskType(task.getTaskType());
tempTask.setOrigin(task.getOrigin());
tempTask.setDestination(task.getDestination());
tempTask.setVehicleNo(task.getVehicleId());
tempTask.setVehicleSize(task.getVehicleSize());
tempTask.setWeight(task.getWeight());
tempTask.setPriority(task.getTaskPriority());
request.add(tempTask);
// 已经发送过的任务组
taskGroupIds.add(task.getTaskGroup());
flag = true;
}
if (flag) {
if (!minStandIds.isEmpty()) {
minStandIds.forEach(tempStandId -> outPickTaskMap.put(tempStandId, outPickTaskMap.getOrDefault(tempStandId, 0) + 1));
}
runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// 已经发送过的vehicleId
pickVehicleIds.add(minVehicleId);
// 剩余线体可继续出库料箱数量
remainVehicleNums--;
}
} else {
if (!skipVehicleIds.contains(minVehicleId)) {
skipVehicleIds.add(minVehicleId);
}
}
}
}
List<Integer> removeKeys = new ArrayList<>(runningTaskNumToEquipmentMap.keySet().stream().toList());
for (int equipmentId : removeKeys) {
if (runningTaskNumToEquipmentMap.get(equipmentId) >= 2) {
runningTaskNumToEquipmentMap.remove(equipmentId);
}
}
}
if (request.size() == 0) {
// 没有新任务发送
return;
@ -369,6 +443,12 @@ public class WmsJobServiceImplements implements IWmsJobService {
outsideVehiclesService.update(new LambdaUpdateWrapper<OutsideVehicles>()
.set(OutsideVehicles::getOutStatus, 1)
.in(OutsideVehicles::getVehicleId, pickVehicleIds));
// 更新站台拣选箱数
for (String tempStandId : outPickTaskMap.keySet()) {
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getPickVehicleCount, outPickTaskMap.get(tempStandId))
.eq(Stand::getStandId, tempStandId));
}
}
} else {
// 判断returnData的数据

View File

@ -320,10 +320,16 @@ public class WorkServiceImplements implements IWorkService {
summary.setPickedNum(workFlow.getPickedNum());
summary.setNeedNum(workFlow.getNeedNum());
summary.setLackNum(workFlow.getNeedNum().subtract(workFlow.getPickedNum()));
summary.setWorkDate(workFlow.getFinishTime());
summary.setWorkDate(workFlow.getCreateTime().toLocalDate().atStartOfDay());
summary.setWorkStatus(workFlow.getWorkStatus());
summary.setLackStatus(summary.getLackNum().compareTo(BigDecimal.ZERO) > 0 ? 1 : 0);
summary.setFinishTime(workFlow.getFinishTime());
summary.setOpUser(workFlow.getOpUser());
// 设置电子标签位置
List<ELocationConfig> currentBoxELocationList = eLocationConfigList.stream().filter(e ->
e.getWorkOrder().equals(workFlow.getWorkOrder())
&& e.getWorkCenter().equals(workFlow.getWorkCenter())).toList();
summary.setELocationId(currentBoxELocationList.size() > 0 ? currentBoxELocationList.get(0).getELocationId() : "");
workSummaryList.add(summary);
// 更新工单表
kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>()

View File

@ -12,8 +12,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 UserServiceImplements extends ServiceImpl<UserMapper, User> implements UserService {
@ -24,7 +22,7 @@ public class UserServiceImplements extends ServiceImpl<UserMapper, User> impleme
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>()
.eq(User::getLoginAccount, user.getLoginAccount())
.or().eq(withAuth, User::getLoginPassword, user.getLoginPassword())
.or().eq(StringUtils.isEmpty(user.getLoginPassword()), User::getLoginAccount, null);
.or().eq(StringUtils.isEmpty(user.getLoginPassword()), User::getLoginPassword, null);
return BeanUtil.copyProperties(userMapper.selectOne(queryWrapper), UserDto.class);
}
}

View File

@ -0,0 +1,74 @@
package com.wms.utils.excel.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class StockUpdateRecordExcelVo {
/**
* 记录编号
*/
@ExcelProperty("记录编号")
private String recordId;
/**
* 库存编号
*/
@ExcelProperty("库存编号")
private String stockId;
/**
* 料箱编号
*/
@ExcelProperty("箱号")
private String vehicleId;
/**
* 料号
*/
@ExcelProperty("料号")
private String goodsId;
/**
* 物料名称
*/
@ExcelProperty("物料名称")
private String goodsName;
/**
* 原来库位
*/
@ExcelProperty("原库位")
private String locationBefore;
/**
* 后来库位
*/
@ExcelProperty("新库位")
private String locationAfter;
/**
* 原来数量
*/
@ExcelProperty("原数量")
private BigDecimal quantityBefore;
/**
* 后来数量
*/
@ExcelProperty("新数量")
private BigDecimal quantityAfter;
/**
* 原因
*/
@ExcelProperty("原因")
private String reason;
/**
* 更新时间
*/
@ExcelProperty("更新时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
/**
* 更新用户
*/
@ExcelProperty("更新用户")
private String updateUser;
}

View File

@ -0,0 +1,103 @@
package com.wms.utils.excel.vo;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.wms.entity.table.WorkSummary;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 工作总结excelVo
*/
@Data
public class WorkSummaryExcelVo {
/**
* id
*/
@ExcelProperty("id")
private String workFlowId;
/**
* 工作站台
*/
@ExcelProperty("工作站台")
private String workStation;
/**
* 工单
*/
@ExcelProperty("工单")
private String workOrder;
/**
* 工位
*/
@ExcelProperty("小工位")
private String workCenter;
/**
* 物料编号
*/
@ExcelProperty("物料编号")
private String goodsId;
/**
* 已拣货数量
*/
@ExcelProperty("已拣货数量")
private BigDecimal pickedNum;
/**
* 需求数量
*/
@ExcelProperty("需求数量")
private BigDecimal needNum;
/**
* 缺件数量
*/
@ExcelProperty("缺件数量")
private BigDecimal lackNum;
/**
* 工作日期
*/
@ExcelProperty("工作日期")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime workDate;
/**
* 工作状态
* 0未开始
* 1正在做
* 2已完成
*/
@ExcelProperty("工作状态")
private Integer workStatus;
/**
* 缺件状态
* 0不缺件
* 1缺件
*/
@ExcelProperty("缺件状态")
private Integer lackStatus;
/**
* 完成时间
*/
@ExcelProperty("完成时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime finishTime;
/**
* 操作人员
*/
@ExcelProperty("操作人员")
private String opUser;
/**
* 电子标签位
*/
@ExcelProperty("电子标签位")
private String eLocationId;
/**
* 将数据库Po转化为ExcelVo
* @param workSummaryPo 数据库Po
* @return ExcelVo
*/
public static WorkSummaryExcelVo of(WorkSummary workSummaryPo) {
return BeanUtil.copyProperties(workSummaryPo, WorkSummaryExcelVo.class);
}
}

File diff suppressed because one or more lines are too long