代码更新:

1. 修复bug
2. 增加大屏监控
3. 增加自动生成任务的功能,已注释。
This commit is contained in:
梁州 2024-10-22 18:50:07 +08:00
parent 1a780398fd
commit dcf4a87204
8 changed files with 667 additions and 378 deletions

View File

@ -0,0 +1,191 @@
package com.wms.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms.entity.app.monitor.Analysis7Days;
import com.wms.entity.app.monitor.FinishDetail;
import com.wms.entity.app.monitor.LocationUseDetail;
import com.wms.entity.app.monitor.WorkInfoByStand;
import com.wms.entity.table.Location;
import com.wms.entity.table.Stand;
import com.wms.entity.table.WorkFlow;
import com.wms.entity.table.WorkSummary;
import com.wms.service.LocationService;
import com.wms.service.StandService;
import com.wms.service.WorkFlowService;
import com.wms.service.WorkSummaryService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import static com.wms.utils.StringUtils.convertJsonString;
/**
* 大屏监控类
*/
@Controller
@CrossOrigin
@RequestMapping(value = "/monitor")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MonitorController {
private final LocationService locationService;
private final WorkFlowService workFlowService;
private final WorkSummaryService workSummaryService;
private final StandService standService;
/**
* 请求库位使用情况
* @return 库位使用情况
*/
@GetMapping("/getLocationUseDetail")
@ResponseBody
public String getLocationUseDetail() {
LocationUseDetail response = new LocationUseDetail();
try {
int allSize = (int) locationService.count();
int emptySize = (int) locationService.count(new LambdaQueryWrapper<Location>()
.eq(Location::getIsLock, 0)
.eq(Location::getLocationStatus, 0));
response.setUsed(allSize - emptySize);
response.setEmpty(emptySize);
} catch (Exception e) {
response.setUsed(0);
response.setEmpty(0);
}
return convertJsonString(response);
}
/**
* 请求最近7天的工作量统计
* @return 最近7天的工作量统计
*/
@GetMapping("/getAnalysis7Days")
@ResponseBody
public String getAnalysis7Days() {
Analysis7Days response = new Analysis7Days();
List<String> dateList = new ArrayList<>();
WorkInfoByStand works = new WorkInfoByStand();
try {
// 获取当前日期
LocalDate now = LocalDate.now();
// 创建一个列表来存储日期
List<LocalDate> dates = new ArrayList<>();
// 添加最近7天的日期到列表中
for (int i = 6; i >= 0; i--) {
dates.add(now.minusDays(i));
}
// 9个站台的信息
List<Integer> stand1 = new ArrayList<>();
List<Integer> stand2 = new ArrayList<>();
List<Integer> stand3 = new ArrayList<>();
List<Integer> stand4 = new ArrayList<>();
List<Integer> stand5 = new ArrayList<>();
List<Integer> stand6 = new ArrayList<>();
List<Integer> stand7 = new ArrayList<>();
List<Integer> stand8 = new ArrayList<>();
List<Integer> stand9 = new ArrayList<>();
// 获取所有的工作总结
List<WorkSummary> allWorkSummaries = workSummaryService.list();
// 循环日期
for (LocalDate date : dates) {
dateList.add(date.format(DateTimeFormatter.ofPattern("MM-dd")));
// 获取当日的工作总结
List<WorkSummary> dayWorkSummaryList = allWorkSummaries.stream().filter(workSummary -> Objects.equals(workSummary.getWorkDate().toLocalDate(), date)).toList();
// 获取1号站台当日的工作总结
List<WorkSummary> stand1WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#1")).toList();
stand1.add(stand1WorkSummaryList.size());
// 获取2号站台当日的工作总结
List<WorkSummary> stand2WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#2")).toList();
stand2.add(stand2WorkSummaryList.size());
// 获取3号站台当日的工作总结
List<WorkSummary> stand3WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#3")).toList();
stand3.add(stand3WorkSummaryList.size());
// 获取4号站台当日的工作总结
List<WorkSummary> stand4WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#4")).toList();
stand4.add(stand4WorkSummaryList.size());
// 获取5号站台当日的工作总结
List<WorkSummary> stand5WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#5")).toList();
stand5.add(stand5WorkSummaryList.size());
// 获取6号站台当日的工作总结
List<WorkSummary> stand6WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#6")).toList();
stand6.add(stand6WorkSummaryList.size());
// 获取7号站台当日的工作总结
List<WorkSummary> stand7WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#7")).toList();
stand7.add(stand7WorkSummaryList.size());
// 获取8号站台当日的工作总结
List<WorkSummary> stand8WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#8")).toList();
stand8.add(stand8WorkSummaryList.size());
// 获取9号站台当日的工作总结
List<WorkSummary> stand9WorkSummaryList = dayWorkSummaryList.stream().filter(workSummary -> workSummary.getWorkStation().contains("#9")).toList();
stand9.add(stand9WorkSummaryList.size());
}
// 设定站台信息
works.setStand1(stand1);
works.setStand2(stand2);
works.setStand3(stand3);
works.setStand4(stand4);
works.setStand5(stand5);
works.setStand6(stand6);
works.setStand7(stand7);
works.setStand8(stand8);
works.setStand9(stand9);
} catch (Exception e) {
dateList = Collections.emptyList();
works = new WorkInfoByStand();
}
response.setWorks(works);
response.setDate(dateList);
return convertJsonString(response);
}
/**
* 请求工单完成情况
* @return 工单完成情况
*/
@GetMapping("/getFinishDetail")
@ResponseBody
public String getFinishDetail() {
FinishDetail response = new FinishDetail();
List<Integer> total = new ArrayList<>();
List<Integer> complete = new ArrayList<>();
try {
// 获取当前站台所有的工作流信息
List<WorkFlow> allWorkFlows = workFlowService.list();
List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
.eq(Stand::getStandType, 2)
.orderByAsc(Stand::getStandId));
for (Stand workStation : stands) {
// 查询到当前的工作量
List<WorkFlow> currentStationWorkFlowList = allWorkFlows.stream().filter(workFlow -> Objects.equals(workFlow.getWorkStation(), workStation.getStandId())).toList();
int finishingRows = 0;
for (WorkFlow workFlow : currentStationWorkFlowList) {
if (workFlow.getWorkStatus() == 2) {
finishingRows++;
}
}
total.add(currentStationWorkFlowList.size());
complete.add(finishingRows);
}
} catch (Exception e) {
total = Collections.emptyList();
complete = Collections.emptyList();
}
response.setComplete(complete);
response.setTotal(total);
return convertJsonString(response);
}
}

View File

@ -1422,6 +1422,7 @@ public class TaskController {
// 更新流转载具表剩余数量
if (currentGoodsVehicle != null) {
currentGoodsVehicle.setRemainNum(BigDecimal.ZERO);
currentGoodsVehicle.setOutStatus(2);
outsideVehiclesService.updateById(currentGoodsVehicle);
}
} else {
@ -1446,22 +1447,24 @@ public class TaskController {
.eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId())
.last("limit 1"));
currentGoodsVehicle.setRemainNum(BigDecimal.ZERO);
currentGoodsVehicle.setOutStatus(2);
outsideVehiclesService.updateById(currentGoodsVehicle);
}
}
}
// 查询当前载具上的流转中的物料
List<OutsideVehicles> outsideVehicles = outsideVehiclesService.list(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()));
List<String> goodsIdList = new ArrayList<>();
if (outsideVehicles != null && !outsideVehicles.isEmpty()) {
for (OutsideVehicles outsideVehicle : outsideVehicles) {
// 查询库存
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, pickTask.getVehicleId()));
if (stockList != null && !stockList.isEmpty()) {
for (Stock tempStock : stockList) {
// 当前确认料号
if (Objects.equals(outsideVehicle.getGoodsId(), workConfirmRequest.getGoodsId())) {
if (Objects.equals(tempStock.getGoodsRelated().getGoodsId(), workConfirmRequest.getGoodsId())) {
continue;
}
if (!goodsIdList.contains(outsideVehicle.getGoodsId())) {
goodsIdList.add(outsideVehicle.getGoodsId());
if (!goodsIdList.contains(tempStock.getGoodsRelated().getGoodsId())
&& tempStock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) > 0) {
goodsIdList.add(tempStock.getGoodsRelated().getGoodsId());
}
}
}
@ -1629,18 +1632,19 @@ public class TaskController {
response.setCode(ResponseCode.OK.getCode());
response.setMessage("确认成功,放行");
} else {
// 查询当前载具上的流转中的物料
List<OutsideVehicles> outsideVehicles = outsideVehiclesService.list(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId()));
List<String> goodsIdList = new ArrayList<>();
if (outsideVehicles != null && !outsideVehicles.isEmpty()) {
for (OutsideVehicles outsideVehicle : outsideVehicles) {
if (Objects.equals(outsideVehicle.getGoodsId(), targetStand.getPickGoods())) {
// 正在拣货的物料除外
// 查询库存
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.eq(Stock::getVehicleId, pickTask.getVehicleId()));
if (stockList != null && !stockList.isEmpty()) {
for (Stock tempStock : stockList) {
// 当前确认料号
if (Objects.equals(tempStock.getGoodsRelated().getGoodsId(), targetStand.getPickGoods())) {
continue;
}
if (!goodsIdList.contains(outsideVehicle.getGoodsId())) {
goodsIdList.add(outsideVehicle.getGoodsId());
if (!goodsIdList.contains(tempStock.getGoodsRelated().getGoodsId())
&& tempStock.getGoodsRelated().getRemainNum().compareTo(BigDecimal.ZERO) > 0) {
goodsIdList.add(tempStock.getGoodsRelated().getGoodsId());
}
}
}

View File

@ -0,0 +1,20 @@
package com.wms.entity.app.monitor;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
public class Analysis7Days {
/**
* 日期
*/
@JsonProperty("date")
private List<String> date;
/**
* 工作量
*/
@JsonProperty("works")
private WorkInfoByStand works;
}

View File

@ -0,0 +1,20 @@
package com.wms.entity.app.monitor;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
public class FinishDetail {
/**
* 总量
*/
@JsonProperty("total")
private List<Integer> total;
/**
* 完成
*/
@JsonProperty("complete")
private List<Integer> complete;
}

View File

@ -0,0 +1,18 @@
package com.wms.entity.app.monitor;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class LocationUseDetail {
/**
* 占用
*/
@JsonProperty("used")
private Integer used;
/**
* 空闲
*/
@JsonProperty("empty")
private Integer empty;
}

View File

@ -0,0 +1,31 @@
package com.wms.entity.app.monitor;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 每个站台工作量
*/
@Data
public class WorkInfoByStand {
@JsonProperty("stand1")
private List<Integer> stand1;
@JsonProperty("stand2")
private List<Integer> stand2;
@JsonProperty("stand3")
private List<Integer> stand3;
@JsonProperty("stand4")
private List<Integer> stand4;
@JsonProperty("stand5")
private List<Integer> stand5;
@JsonProperty("stand6")
private List<Integer> stand6;
@JsonProperty("stand7")
private List<Integer> stand7;
@JsonProperty("stand8")
private List<Integer> stand8;
@JsonProperty("stand9")
private List<Integer> stand9;
}

View File

@ -330,6 +330,11 @@ public class WmsTaskServiceImplements implements IWmsTaskService {
outsideVehicle.setRemainNum(BigDecimal.ZERO);
outsideVehiclesService.updateById(outsideVehicle);
} else {
// 库存状态为正常
if (Objects.equals(stock.getStockStatus(), StockStatus.OK.getCode())) {
outsideVehiclesService.removeById(outsideVehicle);
continue;
}
if (outsideVehicle.getRemainNum().compareTo(needNum) > 0) {
// 当前箱子剩余物料数量多于需求数量
needNum = BigDecimal.ZERO;

View File

@ -53,135 +53,6 @@ public class WorkServiceImplements implements IWorkService {
private final List<String> workDoingStations = new ArrayList<>();// 当前正在执行任务的站台
private final List<String> workFinishingStations = new ArrayList<>();// 当前正在完成任务的站台
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void createWork(String workStation) throws Exception {
if (workCreatingStations.contains(workStation)) {
// 当前站台正在创建任务
return;
} else {
// 添加站台
workCreatingStations.add(workStation);
}
if (StringUtils.isEmpty(workStation)) {
// 站台号为空
return;
}
try {
// 先判断当日是否是工作日
if (!localWorkDateList.contains(LocalDate.now())) {
return;
}
// 先查看当前站台已经生成的工作流是否为空
List<WorkFlow> currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation));
// 当前站台的工作流中还存在其他任务
if (currentWorkFlowList != null && !currentWorkFlowList.isEmpty()) {
return;
}
// 当前站台分配的工位
List<WorkFlow> currentStationWorkFlows = new ArrayList<>();
// 先找MWL机型
findWorks(workStation, currentStationWorkFlows, "MWL");
if (currentStationWorkFlows.isEmpty()) {
// 找非MWL机型
findWorks(workStation, currentStationWorkFlows, "NOT_MWL");
}
// 如果当前站台有任务
if (!currentStationWorkFlows.isEmpty()) {
// 将工作流列表添加进数据库
workFlowService.saveBatch(currentStationWorkFlows);
// 获得工单列表
List<String> workOrderList = new ArrayList<>();
// 获得工单以及小工位列表
List<String> boxNoList = new ArrayList<>();
// 要料Map
Map<String, BigDecimal> needGoodsMap = new HashMap<>();
for (WorkFlow tempWorkflow : currentStationWorkFlows) {
// 添加工单
if (!workOrderList.contains(tempWorkflow.getWorkOrder())) {
workOrderList.add(tempWorkflow.getWorkOrder());
}
// 添加盒子配置
String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter();
if (!boxNoList.contains(boxNo)) {
boxNoList.add(boxNo);
}
// 添加要料信息
if (!needGoodsMap.containsKey(tempWorkflow.getGoodsId())) {
// 添加物料信息
needGoodsMap.put(tempWorkflow.getGoodsId(), tempWorkflow.getNeedNum());
} else {
// 增加需求数量
needGoodsMap.replace(tempWorkflow.getGoodsId(), needGoodsMap.get(tempWorkflow.getGoodsId()).add(tempWorkflow.getNeedNum()));
}
}
// 站台要料
List<GoodsToStation> goodsToStationList = new ArrayList<>();
for (String goodsId : needGoodsMap.keySet()) {
GoodsToStation goodsToStation = new GoodsToStation();
goodsToStation.setGoodsId(goodsId);
goodsToStation.setWorkStation(workStation);
goodsToStation.setDistributeStatus(0);
goodsToStation.setDistributedNum(BigDecimal.ZERO);
goodsToStation.setTotalNum(needGoodsMap.get(goodsId));
goodsToStationList.add(goodsToStation);
}
// 将站台要料列表存进数据库
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<>();
// 查找到当前站台所有可用的电子标签
List<ETagLocation> eTagLocationList = eTagLocationService.list(new LambdaQueryWrapper<ETagLocation>()
.eq(ETagLocation::getWorkStation, workStation)
.eq(ETagLocation::getELocationStatus, 0)
.orderByAsc(ETagLocation::getSequenceId));
if (eTagLocationList.isEmpty() || eTagLocationList.size() < boxNoList.size()) {
throw new Exception("站台:" + workStation + "没有足够可用的电子标签位!");
}
for (ETagLocation eTagLocation : eTagLocationList) {
if (!boxNoList.isEmpty()) {
String tempBoxNo = boxNoList.get(0);
ELocationConfig eLocationConfig = new ELocationConfig();
eLocationConfig.setWorkOrder(tempBoxNo.split("@")[0]);
eLocationConfig.setWorkCenter(tempBoxNo.split("@")[1]);
eLocationConfig.setWorkStation(workStation);
eLocationConfig.setELocationId(eTagLocation.getELocationId());
eLocationConfig.setOrderBoxNo(tempBoxNo);
// 添加配置
eLocationConfigList.add(eLocationConfig);
// 移除已经分配的盒子
boxNoList.remove(tempBoxNo);
}
}
// 将电子标签库位配置存进数据库
eLocationConfigService.saveBatch(eLocationConfigList);
}
} catch (Exception e) {
logger.error("创建站台:{}工作发生异常:{}", workStation, convertJsonString(e));
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} finally {
// 当前站台创建任务完成
workCreatingStations.remove(workStation);
}
}
// @Override
// @Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
// public void createWork(String workStation) throws Exception {
@ -197,31 +68,40 @@ public class WorkServiceImplements implements IWorkService {
// return;
// }
// try {
// // 先判断当日是否是工作日
// if (!localWorkDateList.contains(LocalDate.now())) {
// return;
// }
// // 先查看当前站台已经生成的工作流是否为空
// List<WorkFlow> currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
// .eq(WorkFlow::getWorkStation, workStation)
// .ne(WorkFlow::getWorkStatus, 0));
// .eq(WorkFlow::getWorkStation, workStation));
// // 当前站台的工作流中还存在其他任务
// if (currentWorkFlowList != null && !currentWorkFlowList.isEmpty()) {
// return;
// }
// // 查询是否有已经分配好的电子标签库位信息
// List<ELocationConfig> oldELocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper<ELocationConfig>()
// .eq(ELocationConfig::getWorkStation, workStation));
// if (oldELocationConfigList != null && !oldELocationConfigList.isEmpty()) {
// return;
// // 当前站台分配的工位
// List<WorkFlow> currentStationWorkFlows = new ArrayList<>();
// // 先找MWL机型
// findWorks(workStation, currentStationWorkFlows, "MWL");
// if (currentStationWorkFlows.isEmpty()) {
// // 找非MWL机型
// findWorks(workStation, currentStationWorkFlows, "NOT_MWL");
// }
// // 查询所有待下发的
// List<WorkFlow> currentStationWorkFlows = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
// .eq(WorkFlow::getWorkStatus, 0)
// .eq(WorkFlow::getWorkStation, workStation));
// // 如果当前站台有任务
// if (!currentStationWorkFlows.isEmpty()) {
// // 将工作流列表添加进数据库
// workFlowService.saveBatch(currentStationWorkFlows);
// // 获得工单列表
// List<String> workOrderList = new ArrayList<>();
// // 获得工单以及小工位列表
// List<String> boxNoList = new ArrayList<>();
// // 要料Map
// Map<String, BigDecimal> needGoodsMap = new HashMap<>();
// for (WorkFlow tempWorkflow : currentStationWorkFlows) {
// // 添加工单
// if (!workOrderList.contains(tempWorkflow.getWorkOrder())) {
// workOrderList.add(tempWorkflow.getWorkOrder());
// }
// // 添加盒子配置
// String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter();
// if (!boxNoList.contains(boxNo)) {
@ -240,7 +120,6 @@ public class WorkServiceImplements implements IWorkService {
// List<GoodsToStation> goodsToStationList = new ArrayList<>();
// for (String goodsId : needGoodsMap.keySet()) {
// GoodsToStation goodsToStation = new GoodsToStation();
// goodsToStation.setConfigId(goodsId + "_" + workStation);
// goodsToStation.setGoodsId(goodsId);
// goodsToStation.setWorkStation(workStation);
// goodsToStation.setDistributeStatus(0);
@ -249,7 +128,22 @@ public class WorkServiceImplements implements IWorkService {
// goodsToStationList.add(goodsToStation);
// }
// // 将站台要料列表存进数据库
// goodsToStationService.saveOrUpdateBatch(goodsToStationList);
// 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<>();
// // 查找到当前站台所有可用的电子标签
@ -277,12 +171,6 @@ public class WorkServiceImplements implements IWorkService {
// }
// // 将电子标签库位配置存进数据库
// eLocationConfigService.saveBatch(eLocationConfigList);
// // 更新工作流状态
// List<String> workFlowIds = currentStationWorkFlows.stream().map(WorkFlow::getWorkFlowId).distinct().toList();
// workFlowService.update(new LambdaUpdateWrapper<WorkFlow>()
// .set(WorkFlow::getWorkStatus, 1)
// .in(WorkFlow::getWorkFlowId, workFlowIds)
// .eq(WorkFlow::getWorkStatus, 0));
// }
// } catch (Exception e) {
// logger.error("创建站台:{}工作发生异常:{}", workStation, convertJsonString(e));
@ -296,148 +184,113 @@ public class WorkServiceImplements implements IWorkService {
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void doWork(String workStation) throws Exception {
if (workDoingStations.contains(workStation)) {
public void createWork(String workStation) throws Exception {
if (workCreatingStations.contains(workStation)) {
// 当前站台正在创建任务
return;
} else {
// 添加站台
workDoingStations.add(workStation);
workCreatingStations.add(workStation);
}
try {
// 查找当前站台未开始的工作流
List<WorkFlow> currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation)
.ne(WorkFlow::getWorkStatus, 2));
// 没有可做的任务
if (currentWorkFlowList == null || currentWorkFlowList.isEmpty()) {
if (StringUtils.isEmpty(workStation)) {
// 站台号为空
return;
}
// 查站台要料表---未分配以及分配但未完全分配
List<GoodsToStation> goodsToStationList = goodsToStationService.list(new LambdaQueryWrapper<GoodsToStation>()
.eq(GoodsToStation::getWorkStation, workStation));
List<GoodsToStation> notFinishedGoodsList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() < 2).toList();
if (notFinishedGoodsList.isEmpty()) {
// 查询是否还有这个站台的拣选任务
if (!pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getStandId, workStation))) {
// 需要重新分配的goodsToStationsList
Map<String, GoodsToStation> needDistributeGoodsMap = new HashMap<>();
// 需要完成的工作流
List<WorkFlow> needFinishWorkFlowList = new ArrayList<>();
// 所有缺料的分配
List<String> lackGoodsIdList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 3).map(GoodsToStation::getGoodsId).distinct().toList();
// 不缺料的分配
Map<String, GoodsToStation> noLackGoodsMap = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 2).collect(Collectors.toMap(GoodsToStation::getGoodsId, goodsToStation -> goodsToStation));
// 查询当前工作流中所有缺料的数据行
for (WorkFlow notFinishedWorkFlow : currentWorkFlowList) {
if (notFinishedWorkFlow.getPickedNum().compareTo(notFinishedWorkFlow.getNeedNum()) < 0) {
// 缺料时判断是否当前物料在缺料列表中
if (lackGoodsIdList.contains(notFinishedWorkFlow.getGoodsId())) {
// 缺料添加到需要分配的列表中
notFinishedWorkFlow.setWorkStatus(2);
notFinishedWorkFlow.setFinishTime(LocalDateTime.now());
notFinishedWorkFlow.setOpUser("系统自动完成");
needFinishWorkFlowList.add(notFinishedWorkFlow);
} else {
BigDecimal needNum = notFinishedWorkFlow.getNeedNum().subtract(notFinishedWorkFlow.getPickedNum());
if (needDistributeGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) {
// 减少分配数量
GoodsToStation oldGoodsToStation = needDistributeGoodsMap.get(notFinishedWorkFlow.getGoodsId());
oldGoodsToStation.setDistributedNum(oldGoodsToStation.getDistributedNum().subtract(needNum));
oldGoodsToStation.setDistributeStatus(1);
needDistributeGoodsMap.replace(notFinishedWorkFlow.getGoodsId(), oldGoodsToStation);
} else {
if (noLackGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) {
GoodsToStation newGoodsToStation = noLackGoodsMap.get(notFinishedWorkFlow.getGoodsId());
newGoodsToStation.setDistributedNum(newGoodsToStation.getDistributedNum().subtract(needNum));
newGoodsToStation.setDistributeStatus(1);
needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), newGoodsToStation);
try {
// 先查看当前站台已经生成的工作流是否为空
List<WorkFlow> currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation)
.ne(WorkFlow::getWorkStatus, 0));
// 当前站台的工作流中还存在其他任务
if (currentWorkFlowList != null && !currentWorkFlowList.isEmpty()) {
return;
}
// 查询是否有已经分配好的电子标签库位信息
List<ELocationConfig> oldELocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation));
if (oldELocationConfigList != null && !oldELocationConfigList.isEmpty()) {
return;
}
// 查询所有待下发的
List<WorkFlow> currentStationWorkFlows = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStatus, 0)
.eq(WorkFlow::getWorkStation, workStation));
// 如果当前站台有任务
if (!currentStationWorkFlows.isEmpty()) {
// 获得工单以及小工位列表
List<String> boxNoList = new ArrayList<>();
// 要料Map
Map<String, BigDecimal> needGoodsMap = new HashMap<>();
for (WorkFlow tempWorkflow : currentStationWorkFlows) {
// 添加盒子配置
String boxNo = tempWorkflow.getWorkOrder() + "@" + tempWorkflow.getWorkCenter();
if (!boxNoList.contains(boxNo)) {
boxNoList.add(boxNo);
}
// 添加要料信息
if (!needGoodsMap.containsKey(tempWorkflow.getGoodsId())) {
// 添加物料信息
needGoodsMap.put(tempWorkflow.getGoodsId(), tempWorkflow.getNeedNum());
} else {
// 增加需求数量
needGoodsMap.replace(tempWorkflow.getGoodsId(), needGoodsMap.get(tempWorkflow.getGoodsId()).add(tempWorkflow.getNeedNum()));
}
}
// 站台要料
List<GoodsToStation> goodsToStationList = new ArrayList<>();
for (String goodsId : needGoodsMap.keySet()) {
GoodsToStation goodsToStation = new GoodsToStation();
goodsToStation.setConfigId(notFinishedWorkFlow.getGoodsId() + "_" + workStation);
goodsToStation.setGoodsId(notFinishedWorkFlow.getGoodsId());
goodsToStation.setConfigId(goodsId + "_" + workStation);
goodsToStation.setGoodsId(goodsId);
goodsToStation.setWorkStation(workStation);
goodsToStation.setDistributeStatus(0);
goodsToStation.setDistributedNum(BigDecimal.ZERO);
goodsToStation.setTotalNum(needNum);
needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), goodsToStation);
goodsToStation.setTotalNum(needGoodsMap.get(goodsId));
goodsToStationList.add(goodsToStation);
}
// 将站台要料列表存进数据库
goodsToStationService.saveOrUpdateBatch(goodsToStationList);
// 电子标签库位配置
List<ELocationConfig> eLocationConfigList = new ArrayList<>();
// 查找到当前站台所有可用的电子标签
List<ETagLocation> eTagLocationList = eTagLocationService.list(new LambdaQueryWrapper<ETagLocation>()
.eq(ETagLocation::getWorkStation, workStation)
.eq(ETagLocation::getELocationStatus, 0)
.orderByAsc(ETagLocation::getSequenceId));
if (eTagLocationList.isEmpty() || eTagLocationList.size() < boxNoList.size()) {
throw new Exception("站台:" + workStation + "没有足够可用的电子标签位!");
}
for (ETagLocation eTagLocation : eTagLocationList) {
if (!boxNoList.isEmpty()) {
String tempBoxNo = boxNoList.get(0);
ELocationConfig eLocationConfig = new ELocationConfig();
eLocationConfig.setWorkOrder(tempBoxNo.split("@")[0]);
eLocationConfig.setWorkCenter(tempBoxNo.split("@")[1]);
eLocationConfig.setWorkStation(workStation);
eLocationConfig.setELocationId(eTagLocation.getELocationId());
eLocationConfig.setOrderBoxNo(tempBoxNo);
// 添加配置
eLocationConfigList.add(eLocationConfig);
// 移除已经分配的盒子
boxNoList.remove(tempBoxNo);
}
}
}
} else {
// 不缺料直接完成
notFinishedWorkFlow.setWorkStatus(2);
notFinishedWorkFlow.setFinishTime(LocalDateTime.now());
notFinishedWorkFlow.setOpUser("系统自动完成");
needFinishWorkFlowList.add(notFinishedWorkFlow);
}
}
// 保存重新分配的goodsToStationList
goodsToStationService.saveOrUpdateBatch(needDistributeGoodsMap.values());
// 保存需要完成的工作流
workFlowService.updateBatchById(needFinishWorkFlowList);
}
return;
}
for (GoodsToStation goodsToStation : notFinishedGoodsList) {
// 当前物料当前站台需求数量
BigDecimal needNum = goodsToStation.getTotalNum().subtract(goodsToStation.getDistributedNum());
if (needNum.compareTo(BigDecimal.ZERO) == 0) {
// 需求数量为0
continue;
}
// 判断实际库存是否充足
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsToStation.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0"));
if (stockList == null || stockList.isEmpty()) {
goodsToStation.setDistributeStatus(3);
continue;
}
// 判断当前物料是否在流转中
needNum = wmsTaskService.callGoods(goodsToStation.getGoodsId(), needNum, workStation);
// 判断此时需求数量是否为0
if (needNum.compareTo(BigDecimal.ZERO) <= 0) {
// 分配完成
goodsToStation.setDistributeStatus(2);
} else {
needNum = wmsTaskService.callStocks(goodsToStation.getGoodsId(), needNum, workStation);
if (needNum.compareTo(BigDecimal.ZERO) > 0) {
// 已分配但未完全分配
goodsToStation.setDistributeStatus(1);
} else {
// 分配完成
goodsToStation.setDistributeStatus(2);
}
}
// 更新已分配数量
goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum));
}
goodsToStationService.updateBatchById(notFinishedGoodsList);
// 将电子标签库位配置存进数据库
eLocationConfigService.saveBatch(eLocationConfigList);
// 更新工作流状态
List<String> workFlowIds = currentWorkFlowList.stream().map(WorkFlow::getWorkFlowId).distinct().toList();
List<String> orderIds = currentWorkFlowList.stream().map(WorkFlow::getOrderId).distinct().toList();
List<String> goodsIds = currentWorkFlowList.stream().map(WorkFlow::getGoodsId).distinct().toList();
List<String> smallBoxes = currentWorkFlowList.stream().map(WorkFlow::getWorkCenter).distinct().toList();
List<String> workFlowIds = currentStationWorkFlows.stream().map(WorkFlow::getWorkFlowId).distinct().toList();
workFlowService.update(new LambdaUpdateWrapper<WorkFlow>()
.set(WorkFlow::getWorkStatus, 1)
.in(WorkFlow::getWorkFlowId, workFlowIds)
.eq(WorkFlow::getWorkStatus, 0));
// 更新工单表状态
kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>()
.set(KateOrders::getOrderStatus, 2)
.in(KateOrders::getOrderId, orderIds)
.in(KateOrders::getGoodsId, goodsIds)
.in(KateOrders::getSupplyArea, smallBoxes)
.eq(KateOrders::getOrderStatus, 1));
}
} catch (Exception e) {
logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e));
logger.error("创建站台:{}工作发生异常:{}", workStation, convertJsonString(e));
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} finally {
// 当前站台创建任务完成
workDoingStations.remove(workStation);
workCreatingStations.remove(workStation);
}
}
@ -455,7 +308,7 @@ public class WorkServiceImplements implements IWorkService {
// // 查找当前站台未开始的工作流
// List<WorkFlow> currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
// .eq(WorkFlow::getWorkStation, workStation)
// .eq(WorkFlow::getWorkStatus, 1));
// .ne(WorkFlow::getWorkStatus, 2));
// // 没有可做的任务
// if (currentWorkFlowList == null || currentWorkFlowList.isEmpty()) {
// return;
@ -562,6 +415,22 @@ public class WorkServiceImplements implements IWorkService {
// goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum));
// }
// goodsToStationService.updateBatchById(notFinishedGoodsList);
// // 更新工作流状态
// List<String> workFlowIds = currentWorkFlowList.stream().map(WorkFlow::getWorkFlowId).distinct().toList();
// List<String> orderIds = currentWorkFlowList.stream().map(WorkFlow::getOrderId).distinct().toList();
// List<String> goodsIds = currentWorkFlowList.stream().map(WorkFlow::getGoodsId).distinct().toList();
// List<String> smallBoxes = currentWorkFlowList.stream().map(WorkFlow::getWorkCenter).distinct().toList();
// workFlowService.update(new LambdaUpdateWrapper<WorkFlow>()
// .set(WorkFlow::getWorkStatus, 1)
// .in(WorkFlow::getWorkFlowId, workFlowIds)
// .eq(WorkFlow::getWorkStatus, 0));
// // 更新工单表状态
// kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>()
// .set(KateOrders::getOrderStatus, 2)
// .in(KateOrders::getOrderId, orderIds)
// .in(KateOrders::getGoodsId, goodsIds)
// .in(KateOrders::getSupplyArea, smallBoxes)
// .eq(KateOrders::getOrderStatus, 1));
// } catch (Exception e) {
// logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e));
// // 回滚事务
@ -573,105 +442,134 @@ public class WorkServiceImplements implements IWorkService {
// }
@Override
public String finishWork(String workStation) throws Exception {
if (workFinishingStations.contains(workStation)) {
// 当前站台正在完成工作
return "当前站台正在完成工作,请勿重复操作";
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void doWork(String workStation) throws Exception {
if (workDoingStations.contains(workStation)) {
// 当前站台正在创建任务
return;
} else {
// 添加站台
workFinishingStations.add(workStation);
workDoingStations.add(workStation);
}
try {
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
// 查找当前站台未开始的工作流
List<WorkFlow> currentWorkFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation)
.ne(WorkFlow::getWorkStatus, 2))) {
// 当前站台工作未全部完成
return "工作未全部做完,不允许确认完成。";
.eq(WorkFlow::getWorkStatus, 1));
// 没有可做的任务
if (currentWorkFlowList == null || currentWorkFlowList.isEmpty()) {
return;
}
if (eLocationConfigService.exists(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation)
.eq(ELocationConfig::getPrintStatus, 0))) {
// 有标签未打印
return "有标签未打印";
}
if (!eLocationConfigService.exists(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation))) {
// 没有标签说明点过确认
return "没有可以确认完成的工作,请勿重复点击。";
}
// 查找当前站台的标签配置
List<ELocationConfig> eLocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation));
// 保存一下记录
List<ELocationConfigLast> eLocationConfigLastList = ELocationConfig.toLocationsConfigLastList(eLocationConfigList);
// 先清空之前的
eLocationConfigLastService.remove(new LambdaQueryWrapper<ELocationConfigLast>()
.eq(ELocationConfigLast::getWorkStation, workStation));
eLocationConfigLastService.saveBatch(eLocationConfigLastList);
// 删除所有的标签配置
eLocationConfigService.remove(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation));
// 查询当前站台的所有工作流列表
List<WorkFlow> workFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation)
.eq(WorkFlow::getWorkStatus, 2));
// workSummary列表
List<WorkSummary> workSummaryList = new ArrayList<>();
for (WorkFlow workFlow : workFlowList) {
WorkSummary summary = new WorkSummary();
summary.setWorkFlowId(workFlow.getWorkFlowId());
summary.setWorkStation(workFlow.getWorkStation());
summary.setWorkOrder(workFlow.getWorkOrder());
summary.setWorkCenter(workFlow.getWorkCenter());
summary.setGoodsId(workFlow.getGoodsId());
summary.setPickedNum(workFlow.getPickedNum());
summary.setNeedNum(workFlow.getNeedNum());
summary.setLackNum(workFlow.getNeedNum().subtract(workFlow.getPickedNum()));
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>()
.set(KateOrders::getOrderStatus, 4)
.set(KateOrders::getFinishTime, LocalDateTime.now())
.set(KateOrders::getPickedQuantity, workFlow.getPickedNum())
.set(KateOrders::getLackQuantity, workFlow.getNeedNum().subtract(workFlow.getPickedNum()))
.eq(KateOrders::getOrderId, workFlow.getOrderId())
.eq(KateOrders::getSupplyArea, workFlow.getWorkCenter())
.eq(KateOrders::getGoodsId, workFlow.getGoodsId()));
// 如果当前工单已经没有未完成的工作更新DBS状态完成
if (!kateOrdersService.exists(new LambdaQueryWrapper<KateOrders>()
.eq(KateOrders::getOrderId, workFlow.getOrderId())
.ne(KateOrders::getOrderStatus, 4))) {
kateDBSService.update(new LambdaUpdateWrapper<KateDBS>()
.set(KateDBS::getDbsStatus, 2)
.set(KateDBS::getLastUpdateTime, LocalDateTime.now())
.eq(KateDBS::getWorkOrder, workFlow.getOrderId()));
}
}
workSummaryService.saveBatch(workSummaryList);
// 移除工作流
workFlowService.remove(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation));
// 移库站台要料
goodsToStationService.remove(new LambdaQueryWrapper<GoodsToStation>()
// 查站台要料表---未分配以及分配但未完全分配
List<GoodsToStation> goodsToStationList = goodsToStationService.list(new LambdaQueryWrapper<GoodsToStation>()
.eq(GoodsToStation::getWorkStation, workStation));
} catch (Exception e) {
logger.error("完成站台:{}工作发生异常:{}", workStation, convertJsonString(e));
throw new Exception("完成站台:" + workStation + "工作发生异常!");
} finally {
// 当前站台工作完成
workFinishingStations.remove(workStation);
List<GoodsToStation> notFinishedGoodsList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() < 2).toList();
if (notFinishedGoodsList.isEmpty()) {
// 查询是否还有这个站台的拣选任务
if (!pickTaskService.exists(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getStandId, workStation))) {
// 需要重新分配的goodsToStationsList
Map<String, GoodsToStation> needDistributeGoodsMap = new HashMap<>();
// 需要完成的工作流
List<WorkFlow> needFinishWorkFlowList = new ArrayList<>();
// 所有缺料的分配
List<String> lackGoodsIdList = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 3).map(GoodsToStation::getGoodsId).distinct().toList();
// 不缺料的分配
Map<String, GoodsToStation> noLackGoodsMap = goodsToStationList.stream().filter(goodsToStation -> goodsToStation.getDistributeStatus() == 2).collect(Collectors.toMap(GoodsToStation::getGoodsId, goodsToStation -> goodsToStation));
// 查询当前工作流中所有缺料的数据行
for (WorkFlow notFinishedWorkFlow : currentWorkFlowList) {
if (notFinishedWorkFlow.getPickedNum().compareTo(notFinishedWorkFlow.getNeedNum()) < 0) {
// 缺料时判断是否当前物料在缺料列表中
if (lackGoodsIdList.contains(notFinishedWorkFlow.getGoodsId())) {
// 缺料添加到需要分配的列表中
notFinishedWorkFlow.setWorkStatus(2);
notFinishedWorkFlow.setFinishTime(LocalDateTime.now());
notFinishedWorkFlow.setOpUser("系统自动完成");
needFinishWorkFlowList.add(notFinishedWorkFlow);
} else {
BigDecimal needNum = notFinishedWorkFlow.getNeedNum().subtract(notFinishedWorkFlow.getPickedNum());
if (needDistributeGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) {
// 减少分配数量
GoodsToStation oldGoodsToStation = needDistributeGoodsMap.get(notFinishedWorkFlow.getGoodsId());
oldGoodsToStation.setDistributedNum(oldGoodsToStation.getDistributedNum().subtract(needNum));
oldGoodsToStation.setDistributeStatus(1);
needDistributeGoodsMap.replace(notFinishedWorkFlow.getGoodsId(), oldGoodsToStation);
} else {
if (noLackGoodsMap.containsKey(notFinishedWorkFlow.getGoodsId())) {
GoodsToStation newGoodsToStation = noLackGoodsMap.get(notFinishedWorkFlow.getGoodsId());
newGoodsToStation.setDistributedNum(newGoodsToStation.getDistributedNum().subtract(needNum));
newGoodsToStation.setDistributeStatus(1);
needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), newGoodsToStation);
} else {
GoodsToStation goodsToStation = new GoodsToStation();
goodsToStation.setConfigId(notFinishedWorkFlow.getGoodsId() + "_" + workStation);
goodsToStation.setGoodsId(notFinishedWorkFlow.getGoodsId());
goodsToStation.setWorkStation(workStation);
goodsToStation.setDistributeStatus(0);
goodsToStation.setDistributedNum(BigDecimal.ZERO);
goodsToStation.setTotalNum(needNum);
needDistributeGoodsMap.put(notFinishedWorkFlow.getGoodsId(), goodsToStation);
}
}
}
} else {
// 不缺料直接完成
notFinishedWorkFlow.setWorkStatus(2);
notFinishedWorkFlow.setFinishTime(LocalDateTime.now());
notFinishedWorkFlow.setOpUser("系统自动完成");
needFinishWorkFlowList.add(notFinishedWorkFlow);
}
}
// 保存重新分配的goodsToStationList
goodsToStationService.saveOrUpdateBatch(needDistributeGoodsMap.values());
// 保存需要完成的工作流
workFlowService.updateBatchById(needFinishWorkFlowList);
}
return;
}
for (GoodsToStation goodsToStation : notFinishedGoodsList) {
// 当前物料当前站台需求数量
BigDecimal needNum = goodsToStation.getTotalNum().subtract(goodsToStation.getDistributedNum());
if (needNum.compareTo(BigDecimal.ZERO) == 0) {
// 需求数量为0
continue;
}
// 判断实际库存是否充足
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, goodsToStation.getGoodsId())
.apply("goods_related ->> '$.remainNum' > 0"));
if (stockList == null || stockList.isEmpty()) {
goodsToStation.setDistributeStatus(3);
continue;
}
// 判断当前物料是否在流转中
needNum = wmsTaskService.callGoods(goodsToStation.getGoodsId(), needNum, workStation);
// 判断此时需求数量是否为0
if (needNum.compareTo(BigDecimal.ZERO) <= 0) {
// 分配完成
goodsToStation.setDistributeStatus(2);
} else {
needNum = wmsTaskService.callStocks(goodsToStation.getGoodsId(), needNum, workStation);
if (needNum.compareTo(BigDecimal.ZERO) > 0) {
// 已分配但未完全分配
goodsToStation.setDistributeStatus(1);
} else {
// 分配完成
goodsToStation.setDistributeStatus(2);
}
}
// 更新已分配数量
goodsToStation.setDistributedNum(goodsToStation.getTotalNum().subtract(needNum));
}
goodsToStationService.updateBatchById(notFinishedGoodsList);
} catch (Exception e) {
logger.error("执行站台:{}工作发生异常:{}", workStation, convertJsonString(e));
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} finally {
// 当前站台创建任务完成
workDoingStations.remove(workStation);
}
return "";
}
// @Override
@ -686,7 +584,7 @@ public class WorkServiceImplements implements IWorkService {
// try {
// if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
// .eq(WorkFlow::getWorkStation, workStation)
// .eq(WorkFlow::getWorkStatus, 1))) {
// .ne(WorkFlow::getWorkStatus, 2))) {
// // 当前站台工作未全部完成
// return "工作未全部做完,不允许确认完成。";
// }
@ -740,6 +638,24 @@ public class WorkServiceImplements implements IWorkService {
// && e.getWorkCenter().equals(workFlow.getWorkCenter())).toList();
// summary.setELocationId(currentBoxELocationList.size() > 0 ? currentBoxELocationList.get(0).getELocationId() : "");
// workSummaryList.add(summary);
// // 更新工单表
// kateOrdersService.update(new LambdaUpdateWrapper<KateOrders>()
// .set(KateOrders::getOrderStatus, 4)
// .set(KateOrders::getFinishTime, LocalDateTime.now())
// .set(KateOrders::getPickedQuantity, workFlow.getPickedNum())
// .set(KateOrders::getLackQuantity, workFlow.getNeedNum().subtract(workFlow.getPickedNum()))
// .eq(KateOrders::getOrderId, workFlow.getOrderId())
// .eq(KateOrders::getSupplyArea, workFlow.getWorkCenter())
// .eq(KateOrders::getGoodsId, workFlow.getGoodsId()));
// // 如果当前工单已经没有未完成的工作更新DBS状态完成
// if (!kateOrdersService.exists(new LambdaQueryWrapper<KateOrders>()
// .eq(KateOrders::getOrderId, workFlow.getOrderId())
// .ne(KateOrders::getOrderStatus, 4))) {
// kateDBSService.update(new LambdaUpdateWrapper<KateDBS>()
// .set(KateDBS::getDbsStatus, 2)
// .set(KateDBS::getLastUpdateTime, LocalDateTime.now())
// .eq(KateDBS::getWorkOrder, workFlow.getOrderId()));
// }
// }
// workSummaryService.saveBatch(workSummaryList);
// // 移除工作流
@ -758,6 +674,90 @@ public class WorkServiceImplements implements IWorkService {
// return "";
// }
@Override
public String finishWork(String workStation) throws Exception {
if (workFinishingStations.contains(workStation)) {
// 当前站台正在完成工作
return "当前站台正在完成工作,请勿重复操作";
} else {
// 添加站台
workFinishingStations.add(workStation);
}
try {
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation)
.eq(WorkFlow::getWorkStatus, 1))) {
// 当前站台工作未全部完成
return "工作未全部做完,不允许确认完成。";
}
if (eLocationConfigService.exists(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation)
.eq(ELocationConfig::getPrintStatus, 0))) {
// 有标签未打印
return "有标签未打印";
}
if (!eLocationConfigService.exists(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation))) {
// 没有标签说明点过确认
return "没有可以确认完成的工作,请勿重复点击。";
}
// 查找当前站台的标签配置
List<ELocationConfig> eLocationConfigList = eLocationConfigService.list(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation));
// 保存一下记录
List<ELocationConfigLast> eLocationConfigLastList = ELocationConfig.toLocationsConfigLastList(eLocationConfigList);
// 先清空之前的
eLocationConfigLastService.remove(new LambdaQueryWrapper<ELocationConfigLast>()
.eq(ELocationConfigLast::getWorkStation, workStation));
eLocationConfigLastService.saveBatch(eLocationConfigLastList);
// 删除所有的标签配置
eLocationConfigService.remove(new LambdaQueryWrapper<ELocationConfig>()
.eq(ELocationConfig::getWorkStation, workStation));
// 查询当前站台的所有工作流列表
List<WorkFlow> workFlowList = workFlowService.list(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation)
.eq(WorkFlow::getWorkStatus, 2));
// workSummary列表
List<WorkSummary> workSummaryList = new ArrayList<>();
for (WorkFlow workFlow : workFlowList) {
WorkSummary summary = new WorkSummary();
summary.setWorkFlowId(workFlow.getWorkFlowId());
summary.setWorkStation(workFlow.getWorkStation());
summary.setWorkOrder(workFlow.getWorkOrder());
summary.setWorkCenter(workFlow.getWorkCenter());
summary.setGoodsId(workFlow.getGoodsId());
summary.setPickedNum(workFlow.getPickedNum());
summary.setNeedNum(workFlow.getNeedNum());
summary.setLackNum(workFlow.getNeedNum().subtract(workFlow.getPickedNum()));
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);
}
workSummaryService.saveBatch(workSummaryList);
// 移除工作流
workFlowService.remove(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, workStation));
// 移库站台要料
goodsToStationService.remove(new LambdaQueryWrapper<GoodsToStation>()
.eq(GoodsToStation::getWorkStation, workStation));
} catch (Exception e) {
logger.error("完成站台:{}工作发生异常:{}", workStation, convertJsonString(e));
throw new Exception("完成站台:" + workStation + "工作发生异常!");
} finally {
// 当前站台工作完成
workFinishingStations.remove(workStation);
}
return "";
}
/**
* 先找到MWL的小工位的配置
*