Compare commits

...

23 Commits

Author SHA1 Message Date
755e6b4b95 1. 增加拣选任务记录报表 2026-02-02 10:36:51 +08:00
048654698b 1. 增加可使用工站配置中开工日期的功能 2026-01-16 15:07:32 +08:00
6fe8a99049 1. 导入工单和dbs异常修复 2026-01-14 16:59:34 +08:00
3fe7085ae8 工作日历改动 2026-01-09 17:02:32 +08:00
25ce3ec144 1. 增加需求日期的调整;
2. 增加导入工单和dbs时存在不在工作日的日期时报错;
3. 增加显示工作日历的后台功能;
4. 增加一键切换创建与分配。
2026-01-08 17:02:33 +08:00
b380628d7a 开工日期调整 2026-01-02 15:50:29 +08:00
b097198695 1. 间接物料
2. 工单增加字段
3. 一些见面晚上
2025-12-25 13:59:51 +08:00
2e37264300 1. 改动需求日期暂存 2025-12-23 17:15:43 +08:00
45da059027 1. 工单表增加时间字段,已确定更新时间点。 2025-12-15 11:00:51 +08:00
feaa3f6377 1. 盘点请求中增加站台号字段;
2. 增加在拣选站台盘点的功能;
3. 增加每个站台的电子标签数量到160。
2025-12-10 14:54:05 +08:00
0c82ebffc3 1. 修复完成工作发生的主键冲突 2025-11-26 07:58:06 +08:00
55dc9f1685 1. 导入物料excel时修改indicator设置方式 2025-11-25 08:25:40 +08:00
f56df06fea 1. 盘点增加根据物料信息的二次判断。
2. 物料信息增加盘点指示器,1/3。
2025-11-24 14:34:44 +08:00
4df1d073c7 1.修复发送任务的问题;2.修复完成工作发生的问题。 2025-11-19 10:02:30 +08:00
2022369830 修复发送任务延迟性的问题 2025-11-18 13:40:01 +08:00
30d8831498 修复站台限制未生效 2025-11-17 16:16:46 +08:00
e60c80d7b8 修复程序:1. 工作状态的判断改为只判断1状态。2. 修改发送入库与拣选任务的写法。 2025-11-14 16:19:27 +08:00
22fdaa6df3 盘点确认数量不一致时,更新库存 2025-11-13 15:52:33 +08:00
acc7afcd13 注释掉不用的定时器 2025-11-13 11:26:19 +08:00
8ade4f2c79 移除多余字段 2025-11-13 11:07:44 +08:00
dc62dd9cfa 修复bug,回退测试方法 2025-11-13 10:48:09 +08:00
504b7cb96b 新方式暂存 2025-11-13 08:46:47 +08:00
3ab5b1af0b 修正 2025-10-16 09:31:02 +08:00
57 changed files with 2415 additions and 919 deletions

View File

@ -5,9 +5,11 @@ import com.wms.constants.enums.ConfigMapKeyEnum;
import com.wms.entity.table.Config;
import com.wms.entity.table.Location;
import com.wms.entity.table.WorkDate;
import com.wms.entity.table.WorkStationConfig;
import com.wms.service.ConfigService;
import com.wms.service.LocationService;
import com.wms.service.WorkDateService;
import com.wms.service.WorkStationConfigService;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -40,11 +42,17 @@ public class InitLocalConfig implements ApplicationRunner {
* 工作日历服务
*/
private final WorkDateService workDateService;
/**
* 工站配置服务
*/
private final WorkStationConfigService workStationConfigService;
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
public static Map<String, String> configMap = new HashMap<>();
public static Map<String, Location> instantLocationMap = new HashMap<>();
public static List<LocalDate> localWorkDateList = new ArrayList<>();
public static Map<String, Integer> smallBoxDateAdjustMap = new HashMap<>();// 小盒子号对应开工日期调整map
@Override
public void run(ApplicationArguments args) {
List<Config> configs = configService.selectConfigs("");
@ -74,5 +82,8 @@ public class InitLocalConfig implements ApplicationRunner {
// 生成工作日历
localWorkDateList = workDateService.list(new LambdaQueryWrapper<WorkDate>().orderByAsc(WorkDate::getWorkDate)).stream().map(WorkDate::getWorkDate).distinct().toList();
logger.info("生成工作日历Map成功。");
// 生成小盒子号对应开工日期调整Map
smallBoxDateAdjustMap = workStationConfigService.list().stream().collect(Collectors.toMap(WorkStationConfig::getSmallBox, WorkStationConfig::getStartDateAdjust));
logger.info("生成小盒子号对应开工日期调整Map成功。");
}
}

View File

@ -1,5 +1,11 @@
package com.wms.constants.enums;
import lombok.Getter;
/**
* 配置项枚举
*/
@Getter
public enum ConfigMapKeyEnum {
MAX_WEIGHT("MAX_WEIGHT"),
URL_WCS_TASK("URL_WCS_TASK"),
@ -30,12 +36,12 @@ public enum ConfigMapKeyEnum {
IF_MERGE_TOMORROW("IF_MERGE_TOMORROW"),
SAME_MACHINE("SAME_MACHINE"),
SAME_AREA("SAME_AREA"),
RATE_TYPE("RATE_TYPE");
RATE_TYPE("RATE_TYPE"),
USE_REQUIRE_DATE("USE_REQUIRE_DATE"),// 是否使用需求时间
USE_DEFAULT_ADJUST("USE_DEFAULT_ADJUST"),// 使用默认调整天数
START_DATE_ADJUST("START_DATE_ADJUST");// 开工日期调整天数
private final String configKey;
ConfigMapKeyEnum(String configKey) {
this.configKey = configKey;
}
public String getConfigKey() {
return configKey;
}
}

View File

@ -1,5 +1,8 @@
package com.wms.constants.enums;
import lombok.Getter;
@Getter
public enum PickTaskStatusEnum {
TEMP(-1, "暂存"),
NEW(0, "初始化"),
@ -15,11 +18,13 @@ public enum PickTaskStatusEnum {
this.value = value;
}
public Integer getCode() {
return code;
public static String getValueByCode(Integer code) {
for (PickTaskStatusEnum value : PickTaskStatusEnum.values()) {
if (value.code.equals(code)) {
return value.value;
}
}
return "错误枚举值";
}
public String getValue() {
return value;
}
}

View File

@ -1,8 +1,11 @@
package com.wms.constants.enums;
import lombok.Getter;
/**
* 库存状态枚举
*/
@Getter
public enum StockStatus {
OK(0, "库存正常"),
OUT(1, "出库中"),
@ -10,6 +13,7 @@ public enum StockStatus {
MOVE(3, "移库中"),
PICKING(4, "拣选中"),
BACK(5, "回库中"),
OUTED(6, "已出库"),
LOCK(9, "库存锁定");
private final Integer code;
@ -21,11 +25,4 @@ public enum StockStatus {
this.value = value;
}
public Integer getCode() {
return code;
}
public String getValue() {
return value;
}
}

View File

@ -13,7 +13,8 @@ public enum StockUpdateReasonEnum {
KITTING_UPDATE("备料拣选更新"),
CONFIRM_UPDATE("站台确认更新"),
CONFIRM_DELETE("站台处理箱料错误"),
CLC_NO_PLAN_UPDATE("直接物料非计划领料回库更新");
CLC_NO_PLAN_UPDATE("直接物料非计划领料回库更新"),
INV_CONFIRM("盘点确认数量不一致更新");
StockUpdateReasonEnum(String reason) {
this.reason = reason;

View File

@ -15,6 +15,7 @@ import com.wms.entity.app.vo.FileVo;
import com.wms.entity.app.vo.UploadRecordVo;
import com.wms.entity.table.*;
import com.wms.service.*;
import com.wms.service.business.IWorkService;
import com.wms.utils.HttpUtils;
import com.wms.utils.StringUtils;
import com.wms.utils.excel.listener.*;
@ -26,7 +27,6 @@ import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
@ -38,9 +38,11 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.HttpUtils.getIpAddr;
import static com.wms.utils.StringUtils.convertJsonString;
@ -69,11 +71,10 @@ public class ExcelController {
private final WorkFlowService workFlowService;// 工作流服务
private final WorkDateService workDateService;// 工作日历服务
private final IStockUpdateRecordService stockUpdateRecordService; // 库存更新记录服务
private final IWorkService workService;
private final List<String> uploadFileHashStringList = new ArrayList<>();
@Value("${reqmtsDate}")
private boolean reqmtsDate;
private final PickTaskRecordService pickTaskRecordService;
/**
* 查询上传记录
@ -103,8 +104,7 @@ public class ExcelController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
logger.error("查询上传记录发生异常:{}", e.getMessage());
logger.error("查询上传记录发生异常:{}", convertJsonString(e));
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询上传记录发生异常");
return convertJsonString(response);
@ -186,7 +186,7 @@ public class ExcelController {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
uploadFileHashStringList.remove(fileVo.getHash());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("导入工作日历异常");
response.setMessage("导入工作日历异常" + e.getMessage());
return convertJsonString(response);
}
}
@ -214,7 +214,7 @@ public class ExcelController {
// 获取之前DBS表的内容
Map<String, KateDBS> kateDbsMap = kateDbsService.list().stream().collect(Collectors.toMap(KateDBS::getWorkOrder, kateDBS -> kateDBS));
// 导入excel
EasyExcel.read(file.getInputStream(), KateDbsExcelVo.class, new UploadDbsListener(kateDbsService, kateDbsMap, fileVo.getUserName(),reqmtsDate)).sheet().headRowNumber(8).doRead();
EasyExcel.read(file.getInputStream(), KateDbsExcelVo.class, new UploadDbsListener(kateDbsService, kateDbsMap, fileVo.getUserName())).sheet().headRowNumber(8).doRead();
// 添加导入记录
uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "DBS"));
uploadFileHashStringList.remove(fileVo.getHash());
@ -227,7 +227,7 @@ public class ExcelController {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
uploadFileHashStringList.remove(fileVo.getHash());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("导入DBS异常");
response.setMessage("导入DBS异常" + e.getMessage());
return convertJsonString(response);
}
}
@ -253,9 +253,9 @@ public class ExcelController {
}
uploadFileHashStringList.add(fileVo.getHash());
// 获取之前工单表的内容
Map<String, KateOrders> kateOrdersMap = kateOrdersService.list().stream().collect(Collectors.toMap(kateOrders -> kateOrders.getWorkOrder() + kateOrders.getGoodsId() + kateOrders.getSupplyArea(), kateOrders -> kateOrders));
Map<String, KateOrders> kateOrdersMap = kateOrdersService.list().stream().collect(Collectors.toMap(kateOrders -> kateOrders.getWorkOrder() + "_" + kateOrders.getGoodsId() + "_" + kateOrders.getSupplyArea(), kateOrders -> kateOrders));
// 导入excel
EasyExcel.read(file.getInputStream(), KateOrdersExcelVo.class, new UploadKateOrdersListener(kateOrdersService, kateOrdersMap, fileVo.getUserName(),reqmtsDate)).sheet().doRead();
EasyExcel.read(file.getInputStream(), KateOrdersExcelVo.class, new UploadKateOrdersListener(kateOrdersService, kateOrdersMap, fileVo.getUserName())).sheet().doRead();
// 添加导入记录
uploadRecordService.save(UploadRecord.ofFileVo(fileVo, "ORDERS"));
uploadFileHashStringList.remove(fileVo.getHash());
@ -268,7 +268,7 @@ public class ExcelController {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
uploadFileHashStringList.remove(fileVo.getHash());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("导入工单异常");
response.setMessage("导入工单异常:" + e.getMessage());
return convertJsonString(response);
}
}
@ -809,6 +809,113 @@ public class ExcelController {
.sheet("工作分析报表")
.doWrite(goodsList.stream().map(WorkSummaryExcelVo::of).toList());
}
/**
* 导出拣选任务记录
*
* @param response 请求
*/
@PostMapping("/downloadPickTaskRecordsExcel")
@ResponseBody
public void downloadPickTaskRecordsExcel(@RequestBody PickTaskRecordQuery pickTaskRecordQuery, HttpServletResponse response) throws IOException {
logger.info("导出拣选任务记录,筛选参数:{}请求ip{}", convertJsonString(pickTaskRecordQuery), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("拣选任务记录", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 内容样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelContentStyle.getContentStyle();
List<PickTaskRecord> recordList = Collections.emptyList();
if (pickTaskRecordQuery.getWorkDate() != null) {
var queryWrapper = new LambdaQueryWrapper<PickTaskRecord>()
.like(StringUtils.isNotEmpty(pickTaskRecordQuery.getVehicleId()), PickTaskRecord::getVehicleId, pickTaskRecordQuery.getVehicleId())
.like(StringUtils.isNotEmpty(pickTaskRecordQuery.getStandId()), PickTaskRecord::getStandId, pickTaskRecordQuery.getStandId())
.between(PickTaskRecord::getArriveTime, pickTaskRecordQuery.getWorkDate().atStartOfDay(), pickTaskRecordQuery.getWorkDate().plusDays(1).atStartOfDay().minusSeconds(1));
recordList = pickTaskRecordService.list(queryWrapper);
}
EasyExcel.write(response.getOutputStream(), PickTaskRecordExcelVo.class)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)
.sheet("拣选任务记录报表")
.doWrite(recordList.stream().map(PickTaskRecordExcelVo::fromPo).toList());
}
/**
* 导出工单
*
* @param response 请求
*/
@PostMapping("/downloadKateOrdersExcel")
@ResponseBody
public void downloadKateOrdersExcel(@RequestBody KateOrdersQuery kateOrdersQuery, HttpServletResponse response) throws IOException {
logger.info("导出工单,筛选参数:{}请求ip{}", convertJsonString(kateOrdersQuery), getIpAddr(servletRequest));
//设置响应格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("工单报表", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 内容样式
HorizontalCellStyleStrategy horizontalCellStyleStrategy = ExcelContentStyle.getContentStyle();
// 结果列表
List<KateOrders> kateOrdersList = Collections.emptyList();
if (kateOrdersQuery.getPlanStartDate() != null) {
// 添加进总汇总数据
List<WorkFlow> allFlows = new ArrayList<>();
// 查询配置是否使用默认开工日期
String useReqmtDate = configMap.get(ConfigMapKeyEnum.USE_REQUIRE_DATE.getConfigKey());
if (!StringUtils.isEmpty(useReqmtDate) && useReqmtDate.equals("1")) {// 使用工单的开工日期
// 查询配置是否使用默认开工日期调整
String useDefaultAdjust = configMap.get(ConfigMapKeyEnum.USE_DEFAULT_ADJUST.getConfigKey());
if (!StringUtils.isEmpty(useDefaultAdjust) && useDefaultAdjust.equals("1")) {
workService.findCurrentDateWorks(allFlows, kateOrdersQuery.getPlanStartDate());
} else {
workService.findCurrentDateWorksUseConfig(allFlows, kateOrdersQuery.getPlanStartDate());
}
} else {
// 获取当天所有的装载机工作
List<WorkFlow> thisDayMWLWorks = new ArrayList<>();
// 获取到当天所有的平地机工作
List<WorkFlow> thisDayMGWorks = new ArrayList<>();
// 需要合并第二天的平地机工作
List<WorkFlow> nextDayMGWorks = new ArrayList<>();
// 生成装载机工作流
workService.findWorks("", thisDayMWLWorks, "MWL", kateOrdersQuery.getPlanStartDate());
if (!thisDayMWLWorks.isEmpty()) {
allFlows.addAll(thisDayMWLWorks);
}
// 生成当天平地机工作流
workService.findWorks("", thisDayMGWorks, "NOT_MWL", kateOrdersQuery.getPlanStartDate());
if (!thisDayMGWorks.isEmpty()) {
allFlows.addAll(thisDayMGWorks);
// 查询配置是否需要合并第二天的配置
String ifMergeTomorrow = configMap.get(ConfigMapKeyEnum.IF_MERGE_TOMORROW.getConfigKey());
if (!StringUtils.isEmpty(ifMergeTomorrow) && ifMergeTomorrow.equals("1")) {
// 获取下一个工作日
LocalDate nextWorkDate = workService.nextWorkDate(kateOrdersQuery.getPlanStartDate());
if (nextWorkDate != null && nextWorkDate.isAfter(kateOrdersQuery.getPlanStartDate())) {
workService.findWorks("", nextDayMGWorks, "NOT_MWL", nextWorkDate);
}
if (!nextDayMGWorks.isEmpty()) {
// 添加第二天的平地机工作进汇总
allFlows.addAll(nextDayMGWorks);
}
}
}
}
if (!allFlows.isEmpty()) {
kateOrdersList = kateOrdersService.listByIds(allFlows.stream().map(WorkFlow::getOrderId).distinct().toList());
}
}
EasyExcel.write(response.getOutputStream(), KateOrdersExcelVo.class)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(horizontalCellStyleStrategy)
.sheet("工单报表")
.doWrite(kateOrdersList.stream().map(KateOrdersExcelVo::of).toList());
}
/**
* 导出工作流总结
*

View File

@ -1,14 +1,12 @@
package com.wms.controller;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.entity.app.ResponseEntity;
import com.wms.entity.app.dto.GoodsDto;
import com.wms.entity.app.dto.PageDto;
import com.wms.entity.app.dto.extend.VehicleDetailInfo;
import com.wms.entity.app.request.GoodsQuery;
@ -82,7 +80,8 @@ public class GoodsController {
Page<Goods> page = goodsQuery.toMpPage();
Page<Goods> goodsPage = goodsService.page(page, new LambdaQueryWrapper<Goods>()
.like(StringUtils.isNotEmpty(goodsQuery.getGoodsId()), Goods::getGoodsId, goodsQuery.getGoodsId())
.like(StringUtils.isNotEmpty(goodsQuery.getGoodsName()), Goods::getGoodsName, goodsQuery.getGoodsName()));
.like(StringUtils.isNotEmpty(goodsQuery.getGoodsName()), Goods::getGoodsName, goodsQuery.getGoodsName())
.like(StringUtils.isNotEmpty(goodsQuery.getGoodsType()), Goods::getGoodsType, goodsQuery.getGoodsType()));
PageDto<GoodsVo> pageDto = PageDto.of(goodsPage, goods -> BeanUtil.copyProperties(goods, GoodsVo.class));
response.setCode(ResponseCode.OK.getCode());
@ -107,7 +106,6 @@ public class GoodsController {
*/
@PostMapping("/updateGoodsInfo")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "更新物料信息", logMethod = "updateGoodsInfo")
public String updateGoodsInfo(@RequestBody GoodsQuery goodsQuery) {
logger.info("接收到更新物料信息请求:{}请求ip{}", convertJsonString(goodsQuery), HttpUtils.getIpAddr(servletRequest));
@ -133,9 +131,6 @@ public class GoodsController {
}
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
logger.error("更新物料信息发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
@ -168,10 +163,8 @@ public class GoodsController {
rsp.setReturnData(goodsList);
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// 返回其他异常
logger.error("查询物料信息发生错误{}", e.getMessage());
logger.error("查询物料信息发生异常:{}", e.getMessage());
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("查询物料发生异常");
return convertJsonString(rsp);
@ -218,7 +211,6 @@ public class GoodsController {
*/
@PostMapping("/deleteGoodsInfo")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "删除物料信息", logMethod = "deleteGoodsInfo")
public String deleteVehicle(@RequestBody GoodsQuery goodsQuery) {
logger.info("接收到删除物料信息请求:{}请求ip地址{}", convertJsonString(goodsQuery), HttpUtils.getIpAddr(servletRequest));
@ -231,7 +223,7 @@ public class GoodsController {
rsp.setMessage("请求删除的物料编码为空");
return convertJsonString(rsp);
}
if (goodsService.remove(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId, goodsQuery.getGoodsId()))) {
if (goodsService.removeById(goodsQuery.getGoodsId())) {
logger.info("删除物料信息成功");
rsp.setCode(ResponseCode.OK.getCode());
rsp.setMessage("删除物料信息成功");
@ -243,8 +235,6 @@ public class GoodsController {
}
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("删除物料信息发生异常:{}", e.getMessage());
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
@ -261,7 +251,6 @@ public class GoodsController {
*/
@PostMapping("/genGoods")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "生成物料表", logMethod = "genGoods")
public String genGoods(@RequestBody GoodsQuery goodsQuery) {
// 9*64*22
@ -296,8 +285,6 @@ public class GoodsController {
rsp.setMessage("生成测试物料成功。");
return convertJsonString(rsp);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.info("生成测试物料异常:{}", convertJsonString(e));
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
@ -367,11 +354,13 @@ public class GoodsController {
vehicle.setVehicleType("间接物料");
// 找到这个料箱包含的库存物料列表
List<Stock> indirectStocksOfVehicle = allIndirectStock.stream().filter(stock -> stock.getVehicleId().equals(vehicle.getVehicleId())).toList();
List<VehicleDetailInfo> details = new ArrayList<>();
VehicleDetailInfo goodsInfo = new VehicleDetailInfo();
List<String> detailGoodsIds = new ArrayList<>();
for (Stock stock : indirectStocksOfVehicle) {
details.add(new VehicleDetailInfo(stock.getGoodsRelated().getGoodsId()));
detailGoodsIds.add(stock.getGoodsRelated().getGoodsId());
}
vehicle.setDetails(details);
goodsInfo.setGoodsIds(detailGoodsIds);
vehicle.setGoodsInfo(goodsInfo);
}
// 更新料箱
vehicleService.updateBatchById(allIndirectVehicles);

View File

@ -29,10 +29,12 @@ import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static com.wms.config.InitLocalConfig.localWorkDateList;
import static com.wms.utils.StringUtils.convertJsonString;
/**
@ -87,6 +89,10 @@ public class KateWorkQueryController {
* 库位配置服务
*/
private final ELocationConfigLastService eLocationConfigLastService;
/**
* 工作日历服务
*/
private final WorkDateService workDateService;
/**
* 请求头部信息
*/
@ -114,7 +120,6 @@ public class KateWorkQueryController {
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
e.printStackTrace();
logger.error("查询DBS发生异常{}", e.getMessage());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询DBS发生异常");
@ -232,7 +237,8 @@ public class KateWorkQueryController {
Page<KateOrders> ordersPage = kateOrderService.page(page, new LambdaQueryWrapper<KateOrders>()
.like(StringUtils.isNotEmpty(kateOrdersQuery.getWorkOrder()), KateOrders::getWorkOrder, kateOrdersQuery.getWorkOrder())
.like(StringUtils.isNotEmpty(kateOrdersQuery.getGoodsId()), KateOrders::getGoodsId, kateOrdersQuery.getGoodsId())
.like(StringUtils.isNotEmpty(kateOrdersQuery.getSupplyArea()), KateOrders::getSupplyArea, kateOrdersQuery.getSupplyArea()));
.like(StringUtils.isNotEmpty(kateOrdersQuery.getSupplyArea()), KateOrders::getSupplyArea, kateOrdersQuery.getSupplyArea())
.eq(kateOrdersQuery.getPlanStartDate() != null, KateOrders::getPlanStartDate, kateOrdersQuery.getPlanStartDate()));
PageDto<KateOrdersVo> pageDto = PageDto.of(ordersPage, orders -> BeanUtil.copyProperties(orders, KateOrdersVo.class));
response.setCode(ResponseCode.OK.getCode());
@ -950,4 +956,157 @@ public class KateWorkQueryController {
return convertJsonString(response);
}
}
/**
* 查询工作日历
* @param workDateQuery 查询参数
* @return 查询结果
*/
@PostMapping("/queryWorkDate")
@ResponseBody
public String queryWorkDate(@RequestBody WorkDateQuery workDateQuery) {
logger.info("接收到查询工作日历请求:{}请求ip{}", convertJsonString(workDateQuery), HttpUtils.getIpAddr(servletRequest));
ResponseEntity response = new ResponseEntity();
try {
if (workDateQuery.getSourceType() == null) {
logger.error("查询工作日历的请求参数缺少来源类型。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询工作日历的请求参数缺少来源类型。");
return convertJsonString(response);
}
if (workDateQuery.getSourceType() == 1) {
// 查询当前正在使用的
List<WorkDateVo> workDateVoList = new ArrayList<>();
int index = 0;
for (LocalDate workDate : localWorkDateList) {
index++;
if (workDateQuery.getWorkDate() != null && !workDate.equals(workDateQuery.getWorkDate())) {
// 此处用于查询工作日期
continue;
}
WorkDateVo workDateVo = new WorkDateVo();
workDateVo.setKeyId(index);
workDateVo.setWorkDate(workDate);
workDateVoList.add(workDateVo);
}
// 获取分页信息
PageDto<WorkDateVo> pageDto = PageDto.ofList(workDateVoList.size(), (workDateVoList.size() + workDateQuery.getPageSize()) / workDateQuery.getPageSize(), workDateQuery.getPageNo(), workDateQuery.getPageSize(), workDateVoList);
response.setCode(ResponseCode.OK.getCode());
response.setMessage("查询工作日历成功");
response.setReturnData(pageDto);
return convertJsonString(response);
} else if (workDateQuery.getSourceType() == 2) {
// 查询数据库
Page<WorkDate> page = workDateQuery.toMpPage();
Page<WorkDate> workDatePage = workDateService.page(page, new LambdaQueryWrapper<WorkDate>()
.eq(workDateQuery.getWorkDate() != null, WorkDate::getWorkDate, workDateQuery.getWorkDate()));
PageDto<WorkDateVo> pageDto = PageDto.of(workDatePage, workDate -> BeanUtil.copyProperties(workDate, WorkDateVo.class));
response.setCode(ResponseCode.OK.getCode());
response.setMessage("查询工作日历成功。");
response.setReturnData(pageDto);
return convertJsonString(response);
} else {
logger.error("查询工作日历的请求参数来源类型错误。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询工作日历的请求参数来源类型错误。");
return convertJsonString(response);
}
} catch (Exception e) {
logger.error("查询工作日历发生异常:{}", convertJsonString(e));
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询工作日历发生异常");
return convertJsonString(response);
}
}
/**
* 增加一个工作日
*
* @param workDateQuery 新增的工作日信息
* @return 结果
*/
@PostMapping("/addWorkDate")
@ResponseBody
@MyLog(logTitle = "新增工作日", logMethod = "addWorkDate")
public String addWorkDate(@RequestBody WorkDateQuery workDateQuery) {
logger.info("接收到新增工作日请求:{}请求ip{}", convertJsonString(workDateQuery), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
if (workDateQuery.getWorkDate() == null) {// id为空不允许执行
logger.error("不可新增空的工作日。");
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("不可新增空的工作日。");
return convertJsonString(rsp);
}
// 先查询所有的工作日
List<WorkDate> workDateList = workDateService.list(new LambdaQueryWrapper<>());
WorkDate newWorkDate = new WorkDate();
newWorkDate.setWorkDate(workDateQuery.getWorkDate());
newWorkDate.setRemark(workDateQuery.getRemark());
workDateList.add(newWorkDate);
boolean updateResult = workDateService.updateWorkDate(workDateList);
if (updateResult) {
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) {
logger.error("新增工作日发生异常:{}", convertJsonString(e));
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("新增工作日发生异常");
return convertJsonString(rsp);
}
}
/**
* 删除工作日
*
* @param workDateQuery 删除参数
* @return 结果
*/
@PostMapping("/deleteWorkDate")
@ResponseBody
@MyLog(logTitle = "删除工作日", logMethod = "deleteWorkDate")
public String deleteWorkDate(@RequestBody WorkDateQuery workDateQuery) {
logger.info("接收到删除工作日请求:{}请求ip{}", convertJsonString(workDateQuery), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
if (workDateQuery.getWorkDate() == null) {// id为空不允许执行
logger.error("不可删除空的工作日。");
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("不可删除增空的工作日。");
return convertJsonString(rsp);
}
// 先查询所有的工作日
List<WorkDate> workDateList = workDateService.list(new LambdaQueryWrapper<>());
workDateList.removeIf(workDate -> workDate.getWorkDate().equals(workDateQuery.getWorkDate()));
boolean updateResult = workDateService.updateWorkDate(workDateList);
if (updateResult) {
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) {
logger.error("删除工作日发生异常:{}", convertJsonString(e));
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("删除工作日发生异常");
return convertJsonString(rsp);
}
}
}

View File

@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wms.annotation.MyLog;
import com.wms.constants.enums.ResponseCode;
import com.wms.entity.app.dto.PageDto;
import com.wms.entity.app.dto.extend.VehicleDetailInfo;
import com.wms.entity.app.dto.extend.VehicleDetailInfo_2;
import com.wms.entity.app.request.ELocationQuery;
import com.wms.entity.app.request.LocationQuery;
import com.wms.entity.app.request.VehicleQuery;
@ -39,6 +41,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import static com.wms.constants.WmsConstants.MYSQL_JSON_CI;
import static com.wms.utils.StringUtils.convertJsonString;
/**
@ -259,7 +262,11 @@ public class LocationController {
try {
List<ETagLocation> eLocations = new ArrayList<>();
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 120; j++) {
for (int j = 1; j <= 160; j++) {
if (j == 128) {
// 128号标签不用
continue;
}
ETagLocation eTagLocation = new ETagLocation();
if (j < 100) {
eTagLocation.setELocationId(i + "-" + StringUtils.padLeft(String.valueOf(j), 2, "0"));
@ -311,6 +318,7 @@ public class LocationController {
.like(StringUtils.isNotEmpty(vehicleQuery.getCurrentLocation()), Vehicle::getCurrentLocation, vehicleQuery.getCurrentLocation())
.eq(vehicleQuery.getVehicleStatus() != null, Vehicle::getVehicleStatus, vehicleQuery.getVehicleStatus())
.eq(vehicleQuery.getIsEmpty() != null, Vehicle::getIsEmpty, vehicleQuery.getIsEmpty())
.apply(StringUtils.isNotEmpty(vehicleQuery.getGoodsId()), "JSON_CONTAINS(goods_info ->> '$.goodsIds', {0})" + MYSQL_JSON_CI, "\"" + vehicleQuery.getGoodsId() + "\"")
.orderByDesc(Vehicle::getLastInTime);
if (StringUtils.isNotEmpty(vehicleQuery.getVehicleType())) {
if (vehicleQuery.getVehicleType().equals("间接物料")) {
@ -589,4 +597,48 @@ public class LocationController {
// return JSON.toJSONString(rsp);
// }
// }
/**
* 一键更新料箱的物料数据格式
*
* @param vehicleQuery 料箱
* @return 结果
*/
@PostMapping("/updateVehicleGoodsInfoFormat")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "一键更新料箱的物料数据格式", logMethod = "updateVehicleGoodsInfoFormat")
public String updateVehicleGoodsInfoFormat(@RequestBody VehicleQuery vehicleQuery) {
logger.info("接收到一键更新料箱的物料数据格式请求:{}请求ip{}", convertJsonString(vehicleQuery), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
// 查询到所有的料箱
List<Vehicle> allVehicles = vehicleService.list();
List<Vehicle> needUpdateVehicles = new ArrayList<>();
for (Vehicle vehicle : allVehicles) {
if (vehicle.getDetails() == null || vehicle.getDetails().isEmpty()) {
continue;
}
List<String> goodsIds = vehicle.getDetails().stream().map(VehicleDetailInfo_2::getGoodsId).distinct().toList();
VehicleDetailInfo goodsInfo = new VehicleDetailInfo();
goodsInfo.setGoodsIds(goodsIds);
vehicle.setGoodsInfo(goodsInfo);
needUpdateVehicles.add(vehicle);
}
// 更新数据
vehicleService.updateBatchById(needUpdateVehicles);
rsp.setCode(ResponseCode.OK.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

@ -137,6 +137,90 @@ public class StandController {
}
}
/**
* 一键切换至创建工作状态
*
* @param request 站台信息
* @return 结果
*/
@PostMapping("/switchToCreate")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "一键切换至创建工作状态", logMethod = "switchToCreate")
public String switchToCreate(@RequestBody StandQuery request) {
logger.info("接收到一键切换至创建工作状态请求:{}请求ip{}", convertJsonString(request), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
// 更新信息
LambdaUpdateWrapper<Stand> lambdaUpdateWrapper = new LambdaUpdateWrapper<Stand>()
.set(Stand::getStandStatus, 1)
.eq(Stand::getIsLock, 0)
.eq(Stand::getStandType, 2);
if (standService.update(lambdaUpdateWrapper)) {
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.error("一键切换创建工作发生异常:{}", convertJsonString(e));
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("一键切换创建工作发生异常");
return convertJsonString(rsp);
}
}
/**
* 一键切换至分配工作状态
*
* @param request 站台信息
* @return 结果
*/
@PostMapping("/switchToDistribute")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "一键切换至分配工作状态", logMethod = "switchToDistribute")
public String switchToDistribute(@RequestBody StandQuery request) {
logger.info("接收到一键切换至分配工作状态请求:{}请求ip{}", convertJsonString(request), HttpUtils.getIpAddr(servletRequest));
// 创建响应信息
ResponseEntity rsp = new ResponseEntity();
try {
// 更新信息
LambdaUpdateWrapper<Stand> lambdaUpdateWrapper = new LambdaUpdateWrapper<Stand>()
.set(Stand::getStandStatus, 0)
.eq(Stand::getIsLock, 0)
.eq(Stand::getStandType, 2);
if (standService.update(lambdaUpdateWrapper)) {
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.error("一键切换至分配工作发生异常:{}", convertJsonString(e));
// 返回其他异常
rsp.setCode(ResponseCode.ERROR.getCode());
rsp.setMessage("一键切换至分配工作发生异常");
return convertJsonString(rsp);
}
}
/**
* 堆垛机状态变更
*

View File

@ -112,10 +112,6 @@ public class TaskController {
* 物料服务
*/
private final GoodsService goodsService;
/**
* 流转中物料箱号数据
*/
private final OutsideVehiclesService outsideVehiclesService;
/**
* 拣选任务记录服务
*/
@ -132,10 +128,6 @@ public class TaskController {
* 工作站配置服务
*/
private final WorkStationConfigService workStationConfigService;
/**
* 站台要料服务
*/
private final GoodsToStationService goodsToStationService;
/**
* 非计划领料服务
*/
@ -161,7 +153,6 @@ public class TaskController {
*/
private final IWorkService workService;
private final WorkFlowLastService workFlowLastService;// 服务
private final StandStackerTaskService standStackerTaskService;// 特殊服务
private final InventoryListService inventoryService;
private final WorkSummaryService workSummaryService;
private final InventoryHistoryService inventoryHistoryService;
@ -447,9 +438,9 @@ public class TaskController {
newVehicle.setVehicleType(inTask.getGoodsRelated().getGoodsType());
if (Objects.equals(newVehicle.getVehicleType(), "间接物料")) {
// 如果是间接物料则设置配对物料
List<VehicleDetailInfo> vehicleDetailInfos = new ArrayList<>();
vehicleDetailInfos.add(new VehicleDetailInfo(inTask.getGoodsRelated().getGoodsId()));
newVehicle.setDetails(vehicleDetailInfos);
VehicleDetailInfo vehicleDetailInfos = new VehicleDetailInfo();
vehicleDetailInfos.setGoodsIds(new ArrayList<>(List.of(inTask.getGoodsRelated().getGoodsId())));
newVehicle.setGoodsInfo(vehicleDetailInfos);
}
}
newVehicle.setLastInTime(LocalDateTime.now());
@ -472,10 +463,22 @@ public class TaskController {
currentVehicle.setVehicleType(inTask.getGoodsRelated().getGoodsType());
if (Objects.equals(currentVehicle.getVehicleType(), "间接物料")) {
// 如果是间接物料则设置配对物料
List<VehicleDetailInfo> vehicleDetailInfos = currentVehicle.getDetails() == null ? new ArrayList<>() : currentVehicle.getDetails();
if (!vehicleDetailInfos.stream().map(VehicleDetailInfo::getGoodsId).toList().contains(inTask.getGoodsRelated().getGoodsId())) {
vehicleDetailInfos.add(new VehicleDetailInfo(inTask.getGoodsRelated().getGoodsId()));
currentVehicle.setDetails(vehicleDetailInfos);
VehicleDetailInfo goodsInfo = currentVehicle.getGoodsInfo();
if (goodsInfo == null) {
goodsInfo = new VehicleDetailInfo();
goodsInfo.setGoodsIds(new ArrayList<>(List.of(inTask.getGoodsRelated().getGoodsId())));
currentVehicle.setGoodsInfo(goodsInfo);
} else {
if (goodsInfo.getGoodsIds() == null) {
goodsInfo = new VehicleDetailInfo();
goodsInfo.setGoodsIds(new ArrayList<>(List.of(inTask.getGoodsRelated().getGoodsId())));
currentVehicle.setGoodsInfo(goodsInfo);
} else if (!goodsInfo.getGoodsIds().contains(inTask.getGoodsRelated().getGoodsId())) {
List<String> goodsIds = goodsInfo.getGoodsIds();
goodsIds.add(inTask.getGoodsRelated().getGoodsId());
goodsInfo.setGoodsIds(goodsIds);
currentVehicle.setGoodsInfo(goodsInfo);
}
}
}
}
@ -490,8 +493,6 @@ public class TaskController {
taskService.remove(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, inTask.getTaskId()));
// 移除当前料箱所有的拣选任务
pickTaskService.remove(new LambdaQueryWrapper<PickTask>().eq(PickTask::getVehicleId, inTask.getVehicleId()));
// 移除当前料箱所有的outsideVehicles
outsideVehiclesService.remove(new LambdaQueryWrapper<OutsideVehicles>().eq(OutsideVehicles::getVehicleId, inTask.getVehicleId()));
// 清除当前料箱的所有盘点任务
inventoryService.remove(new LambdaQueryWrapper<InventoryList>().eq(InventoryList::getVehicleId, inTask.getVehicleId()));
}
@ -514,20 +515,14 @@ public class TaskController {
.ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()));
// 当前载具上所有库存状态设置为拣选
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.PICKING.getCode())
.set(Stock::getStockStatus, StockStatus.OUTED.getCode())
.eq(Stock::getVehicleId, outTask.getVehicleId())
.ne(Stock::getStockStatus, StockStatus.PICKING.getCode()));
.ne(Stock::getStockStatus, StockStatus.OUTED.getCode()));
// 将该载具对应的拣选任务设置为可发送状态
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())
.eq(PickTask::getVehicleId, outTask.getVehicleId())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode()));
// 设置特殊
standStackerTaskService.update(new LambdaUpdateWrapper<StandStackerTask>()
.set(StandStackerTask::getTaskStatus, 1)
.set(StandStackerTask::getFinishTime, LocalDateTime.now())
.eq(StandStackerTask::getVehicleId, outTask.getVehicleId())
.ne(StandStackerTask::getTaskStatus, 1));
} else {// 代表整出
// 删除当前载具上所有库存
List<Stock> removeStocks = stockService.list(new LambdaQueryWrapper<Stock>().eq(Stock::getVehicleId, outTask.getVehicleId()));
@ -650,7 +645,7 @@ public class TaskController {
response.setMessage("暂无可用库位!");
return convertJsonString(response);
} else {
Location nextLocation = locationService.getOne(new LambdaQueryWrapper<Location>().eq(Location::getLocationId, resultMap.get("nextLocationId")).last("limit 1"));
Location nextLocation = locationService.getById(resultMap.get("nextLocationId"));
if (Objects.equals(nextLocation.getLocationStatus(), LocationStatus.OCCUPY.getCode()) && nextLocation.getVehicleId().equals(wcsVehicleInRequest.getVehicleNo())) {
nextLocationId = resultMap.get("nextLocationId");
break;
@ -912,7 +907,7 @@ public class TaskController {
.set(PickTask::getLastUpdateTime, LocalDateTime.now())
.eq(PickTask::getVehicleId, boxArriveRequest.getVehicleNo())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.TEMP.getCode()));
// 重置当前站台非当前箱子的已完成拣选任务 todo
// 重置当前站台非当前箱子的已完成拣选任务
pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())
.set(PickTask::getLastUpdateTime, LocalDateTime.now())
@ -923,6 +918,11 @@ public class TaskController {
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getPickVehicle, boxArriveRequest.getVehicleNo())
.eq(Stand::getStandId, pickTask.getStandId()));
// 更新库存为拣选中
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.PICKING.getCode())
.eq(Stock::getVehicleId, boxArriveRequest.getVehicleNo())
.ne(Stock::getStockStatus, StockStatus.PICKING.getCode()));
response.setCode(ResponseCode.OK.getCode());
response.setMessage("上报成功");
@ -1399,47 +1399,13 @@ public class TaskController {
}
// 更新实际拣选数量
workFlow.setPickedNum(workFlow.getPickedNum().add(BigDecimal.valueOf(eTaskFeedbackRequest.getConfirmNum())));
if (eTaskFeedbackRequest.getConfirmNum().compareTo(eTaskFeedbackRequest.getNeedNum()) < 0) {
int diffNum = eTaskFeedbackRequest.getNeedNum() - eTaskFeedbackRequest.getConfirmNum();
// 查站台要料表---未分配以及分配但未完全分配
GoodsToStation goodsToStation = goodsToStationService.getOne(new LambdaQueryWrapper<GoodsToStation>()
.eq(GoodsToStation::getWorkStation, workFlow.getWorkStation())
.eq(GoodsToStation::getGoodsId, workFlow.getGoodsId())
.last("limit 1"));
if (goodsToStation != null) {
// 更新站台要料数量
BigDecimal newDistributeNum = goodsToStation.getDistributedNum().subtract(BigDecimal.valueOf(diffNum));
goodsToStation.setDistributedNum(newDistributeNum.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : newDistributeNum);
goodsToStation.setDistributeStatus(1);
goodsToStationService.updateById(goodsToStation);
}
// 查询当前站台的拣货任务
PickTask pickTask = pickTaskService.getOne(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getStandId, workFlow.getWorkStation())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.FINISH.getCode())
.last("limit 1"));
if (pickTask != null) {
// 更新当前的outsideVehicles状态为一个新状态拉取任务时不拉取它
List<OutsideVehicles> outsideVehiclesList = outsideVehiclesService.list(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId())
.eq(OutsideVehicles::getGoodsId, workFlow.getGoodsId()));
for (OutsideVehicles outsideVehicles : outsideVehiclesList) {
outsideVehicles.setOutStatus(2);
}
outsideVehiclesService.updateBatchById(outsideVehiclesList);
}
// 更新workFlow状态
if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) {
// 缺料未完成
workFlow.setLightStatus(0);// 未亮灯
workFlow.setWorkStatus(1);// 正在做
} else {
if (workFlow.getPickedNum().compareTo(workFlow.getNeedNum()) < 0) {
// 缺料未完成
workFlow.setLightStatus(0);// 未亮灯
workFlow.setWorkStatus(1);// 正在做
} else {
workFlow.setLightStatus(2);// 已拍灯
workFlow.setWorkStatus(2);// 已完成
}
workFlow.setLightStatus(2);// 已拍灯
workFlow.setWorkStatus(2);// 已完成
}
// 更新workFlow
workFlow.setFinishTime(LocalDateTime.now());
@ -1587,24 +1553,6 @@ public class TaskController {
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore);
}
OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId())
.eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId())
.last("limit 1"));
if (workConfirmRequest.getRemainNumReal().compareTo(BigDecimal.ZERO) == 0) {// 实际剩余数量为0
// 更新流转载具表剩余数量
if (currentGoodsVehicle != null) {
currentGoodsVehicle.setRemainNum(BigDecimal.ZERO);
currentGoodsVehicle.setOutStatus(2);
outsideVehiclesService.updateById(currentGoodsVehicle);
}
} else {
// 更新流转载具表剩余数量 todo
if (currentGoodsVehicle != null) {
currentGoodsVehicle.setRemainNum(currentGoodsVehicle.getRemainNum().add(workConfirmRequest.getRemainNumReal().subtract(workConfirmRequest.getRemainNumOrigin())));
outsideVehiclesService.updateById(currentGoodsVehicle);
}
}
} else {
if (existStock != null && existStock.getGoodsRelated() != null) {
if (workConfirmRequest.getRemainNumOrigin().compareTo(BigDecimal.ZERO) == 0) {
@ -1615,13 +1563,6 @@ public class TaskController {
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.CONFIRM_UPDATE.getReason(), workConfirmRequest.getUserName(), quantityBefore);
OutsideVehicles currentGoodsVehicle = outsideVehiclesService.getOne(new LambdaQueryWrapper<OutsideVehicles>()
.eq(OutsideVehicles::getVehicleId, pickTask.getVehicleId())
.eq(OutsideVehicles::getGoodsId, workConfirmRequest.getGoodsId())
.last("limit 1"));
currentGoodsVehicle.setRemainNum(BigDecimal.ZERO);
currentGoodsVehicle.setOutStatus(2);
outsideVehiclesService.updateById(currentGoodsVehicle);
}
}
}
@ -1646,7 +1587,7 @@ public class TaskController {
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, standId)
.in(WorkFlow::getGoodsId, goodsIdList)
.notIn(WorkFlow::getWorkStatus, -1, 2))) {
.eq(WorkFlow::getWorkStatus, 1))) {
// 需要不放行返回前台提示信息
StandPickVo pickVoEntity = new StandPickVo();
pickVoEntity.setTip("当前料箱还有其他物料需要拣货");
@ -1670,7 +1611,7 @@ public class TaskController {
// 判断是不是已经完成工作
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, standId)
.notIn(WorkFlow::getWorkStatus, -1, 2))) {
.eq(WorkFlow::getWorkStatus, 1))) {
// 当前站台工作未全部完成
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getLastUseTime, LocalDateTime.now())
@ -1709,7 +1650,7 @@ public class TaskController {
// 判断是不是已经完成工作
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, standId)
.notIn(WorkFlow::getWorkStatus, -1, 2))) {
.eq(WorkFlow::getWorkStatus, 1))) {
// 当前站台工作未全部完成
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getLastUseTime, LocalDateTime.now())
@ -1827,7 +1768,7 @@ public class TaskController {
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, targetStand.getStandId())
.in(WorkFlow::getGoodsId, goodsIdList)
.notIn(WorkFlow::getWorkStatus, -1, 2))) {
.eq(WorkFlow::getWorkStatus, 1))) {
// 更新站台信息
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getPickGoods, "")
@ -1849,7 +1790,7 @@ public class TaskController {
// 判断是不是已经完成工作
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, targetStand.getStandId())
.notIn(WorkFlow::getWorkStatus, -1, 2))) {
.eq(WorkFlow::getWorkStatus, 1))) {
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getLastUseTime, LocalDateTime.now())
.set(Stand::getPickVehicle, "")
@ -1885,7 +1826,7 @@ public class TaskController {
// 判断是不是已经完成工作
if (workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, targetStand.getStandId())
.notIn(WorkFlow::getWorkStatus, -1, 2))) {
.eq(WorkFlow::getWorkStatus, 1))) {
// 当前站台工作未全部完成
standService.update(new LambdaUpdateWrapper<Stand>()
.set(Stand::getLastUseTime, LocalDateTime.now())
@ -2022,7 +1963,6 @@ public class TaskController {
*/
@PostMapping("/confirmFinishedWork")
@ResponseBody
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
@MyLog(logTitle = "工作完成确认", logMethod = "confirmFinishedWork")
public String confirmFinishedWork(@RequestBody WorkQuery workQuery) {
logger.info("工作完成确认:{}ip地址{}", convertJsonString(workQuery), HttpUtils.getIpAddr(servletRequest));
@ -2074,9 +2014,7 @@ public class TaskController {
}
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("工作完成确认异常");
logger.error("工作完成确认异常:{}", convertJsonString(e));
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("工作完成确认异常");
return convertJsonString(response);
@ -2104,25 +2042,6 @@ public class TaskController {
response.setMessage("料箱数量必须为大于0的整数");
return convertJsonString(response);
}
// 验证请求信息
// if (Objects.equals(callEmptyVehicleRequest.getVehicleType2(), "间接物料")) {
// // TODO 间接物料需要确认
// if (StringUtils.isEmpty(callEmptyVehicleRequest.getGoodsId())) {
// logger.error("间接物料必须输入物料号");
// response.setCode(ResponseCode.ERROR.getCode());
// response.setMessage("间接物料必须输入物料号");
// return convertJsonString(response);
// }
// // 查询物料是否是间接物料
// Goods goods = goodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId, callEmptyVehicleRequest.getGoodsId()).eq(Goods::getGoodsInVehicleType, "间接物料").last("limit 1"));
// if (goods == null) {
// logger.error("当前物料不是间接物料");
// response.setCode(ResponseCode.ERROR.getCode());
// response.setMessage("当前物料不是间接物料");
// return convertJsonString(response);
// }
// callEmptyVehicleRequest.setVehicleType1(goods.getVehicleType());
// }
// 生成料箱出库任务
int needNum = callEmptyVehicleRequest.getNeedNum();
@ -2130,14 +2049,31 @@ public class TaskController {
List<String> outVehicleIds = new ArrayList<>();// 料箱列表
// 查询出需求数量的空箱
LambdaQueryWrapper<Vehicle> emptyVehicleQueryWrapper = new LambdaQueryWrapper<Vehicle>()
.eq(Vehicle::getIsEmpty, 1)
.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode())
.orderByAsc(Vehicle::getLastInTime)
.last("limit " + needNum);
if (Objects.equals(callEmptyVehicleRequest.getVehicleType2(), "间接物料")) {
emptyVehicleQueryWrapper.eq(Vehicle::getVehicleType, "间接物料");
if (StringUtils.isEmpty(callEmptyVehicleRequest.getGoodsId())) {
logger.error("间接物料必须输入物料号");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("间接物料必须输入物料号");
return convertJsonString(response);
}
// 查询物料是否是间接物料
Goods goods = goodsService.getById(callEmptyVehicleRequest.getGoodsId());
if (goods == null || !Objects.equals(goods.getGoodsType(), "间接物料")) {
logger.error("当前物料不是间接物料");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前物料不是间接物料");
return convertJsonString(response);
}
emptyVehicleQueryWrapper
.eq(Vehicle::getVehicleType, "间接物料")
.apply("JSON_CONTAINS(goods_info ->> '$.goodsIds', {0})" + MYSQL_JSON_CI, "\"" + callEmptyVehicleRequest.getGoodsId() + "\"");
} else {
emptyVehicleQueryWrapper.ne(Vehicle::getVehicleType, "间接物料");
emptyVehicleQueryWrapper
.ne(Vehicle::getVehicleType, "间接物料")
.eq(Vehicle::getIsEmpty, 1);
}
List<Vehicle> emptyVehicles = vehicleService.list(emptyVehicleQueryWrapper);
for (Vehicle emptyVehicle : emptyVehicles) {
@ -2164,30 +2100,37 @@ public class TaskController {
outVehicleIds.add(emptyVehicle.getVehicleId());
needNum--;
}
// 保存任务
taskService.saveBatch(vehicleOutTasks);
// 更新料箱表
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, outVehicleIds)
.ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()));
if (!outVehicleIds.isEmpty()) {
// 保存任务
taskService.saveBatch(vehicleOutTasks);
// 更新料箱表
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, outVehicleIds)
.ne(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode()));
// 更新库存表
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.OUT.getCode())
.in(Stock::getVehicleId, outVehicleIds)
.ne(Stock::getStockStatus, StockStatus.OUT.getCode()));
}
if (needNum <= 0) {
response.setCode(ResponseCode.OK.getCode());
response.setMessage("呼叫空箱成功,请等待箱子出库。");
response.setMessage("呼叫箱成功,请等待箱子出库。");
} else if (needNum < callEmptyVehicleRequest.getNeedNum()) {
response.setCode(ResponseCode.OK.getCode());
response.setMessage("已呼叫空箱,但库中空箱数量不足。需求" + callEmptyVehicleRequest.getNeedNum() + "个,实际呼叫" + vehicleOutTasks.size() + "个。");
response.setMessage("已呼叫料箱,但库中符合要求料箱数量不足。需求" + callEmptyVehicleRequest.getNeedNum() + "个,实际呼叫" + vehicleOutTasks.size() + "个。");
} else {
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("库中没有箱了。");
response.setMessage("库中没有需求的料箱了。");
}
return convertJsonString(response);
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.error("呼叫箱发生异常,{}", convertJsonString(e));
logger.error("呼叫箱发生异常,{}", convertJsonString(e));
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("呼叫箱发生异常");
response.setMessage("呼叫箱发生异常");
return convertJsonString(response);
}
}
@ -2271,8 +2214,6 @@ public class TaskController {
backTask.setCreateTime(LocalDateTime.now());
// 保存任务
taskService.save(backTask);
// 删除outsideVehicle表
outsideVehiclesService.remove(new LambdaQueryWrapper<OutsideVehicles>().eq(OutsideVehicles::getVehicleId, requestBackQuery.getVehicleId()));
// 设置库存状态为回库中
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.BACK.getCode())
@ -2831,7 +2772,7 @@ public class TaskController {
return convertJsonString(response);
}
// TODO 以下是非计划领料变动
// 以下是非计划领料变动
// 1. 判断当前站台是否允许非计划
if (targetStand.getAllowNoPlan() != 1) {
logger.error("当前站台不允许非计划领料:{}。", targetStand.getStandId());
@ -2865,11 +2806,10 @@ public class TaskController {
// 出库任务列表
List<Task> outTasks = new ArrayList<>();
// TODO 非计划变动
// 非计划变动
// 拣选任务列表
List<PickTask> pickTasks = new ArrayList<>();
// 尝试生成出库任务
List<String> pickStandIds = new ArrayList<>();
for (Stock tempStock : stockList) {
@ -2907,7 +2847,7 @@ public class TaskController {
tempOutTask.setIsPicking(1);
outTasks.add(tempOutTask);
// TODO 非计划变动
// 非计划变动
// 只有备料站台才下发拣选任务
if (targetStand.getStandType() == 2) {
// 创建拣选任务
@ -2922,7 +2862,8 @@ public class TaskController {
}
} else if (Objects.equals(tempStock.getStockStatus(), StockStatus.OUT.getCode())
|| Objects.equals(tempStock.getStockStatus(), StockStatus.PICKING.getCode())) {
|| Objects.equals(tempStock.getStockStatus(), StockStatus.PICKING.getCode())
|| Objects.equals(tempStock.getStockStatus(), StockStatus.OUTED.getCode())) {
// 查询这个箱子的拣选任务
List<PickTask> thisVehiclePickTasks = pickTaskService.list(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getVehicleId, tempStock.getVehicleId()));
@ -2949,7 +2890,7 @@ public class TaskController {
.eq(Task::getVehicleId, tempStock.getVehicleId())
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
// TODO 非计划变动
// 非计划变动
if (targetStand.getStandType() == 1) {
// 入库站台
thisVehiclePickTasks.forEach(pickTask -> {
@ -2980,7 +2921,7 @@ public class TaskController {
// 保存出库任务
taskService.saveBatch(outTasks);
// TODO 非计划变动
// 非计划变动
// 保存拣选任务
if (!pickTasks.isEmpty()) {
pickTaskService.saveBatch(pickTasks);
@ -3260,9 +3201,6 @@ public class TaskController {
}
}
// TODO 以下是盘点待做
/**
* 盘点请求
*
@ -3283,6 +3221,36 @@ public class TaskController {
response.setMessage("盘点,请输入料号。");
return convertJsonString(response);
}
// 获取站台号
Stand targetStand;
if (StringUtils.isNotEmpty(inventoryRequest.getStandId())) {
// 站台号从请求参数中获取
targetStand = standService.getById(inventoryRequest.getStandId());
} else {
// 站台号从ip获取
targetStand = standService.getOne(new LambdaQueryWrapper<Stand>()
.eq(Stand::getStandIp, HttpUtils.getIpAddr(servletRequest))
.eq(Stand::getStandType, 1)
.last("limit 1"));
}
if (targetStand == null) {
logger.error("查询盘点站台错误。");
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("查询盘点站台错误。");
return convertJsonString(response);
}
// 判断当前站台是否有工作流
boolean haveWorkFlows = workFlowService.exists(new LambdaQueryWrapper<WorkFlow>()
.eq(WorkFlow::getWorkStation, targetStand.getStandId()));
if (haveWorkFlows) {
logger.error("当前站台还有工作不允许盘点:{}。", targetStand.getStandId());
response.setCode(ResponseCode.ERROR.getCode());
response.setMessage("当前站台还有工作不允许盘点。");
return convertJsonString(response);
}
// 查询库存
List<Stock> stockList = stockService.list(new LambdaQueryWrapper<Stock>()
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, inventoryRequest.getGoodsId())
@ -3297,21 +3265,27 @@ public class TaskController {
// 生成出库任务
List<Task> outTasks = new ArrayList<>();
List<InventoryList> inventoryList = new ArrayList<>();
// 本次出库的料箱
List<String> thisTimeOutVehicleIds = new ArrayList<>();
for (Stock stock : stockList) {
// 创建出库任务
Task tempOutTask = new Task();
tempOutTask.setTaskId(generateId("INV_"));
tempOutTask.setTaskType(TaskType.OUT.getCode());
tempOutTask.setTaskGroup(generateId(""));
tempOutTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempOutTask.setTaskPriority(2);
tempOutTask.setVehicleId(stock.getVehicleId());
tempOutTask.setUserName(inventoryRequest.getUserName());
tempOutTask.setOrigin(stock.getLocationId());
tempOutTask.setDestination("");
tempOutTask.setCreateTime(LocalDateTime.now());
tempOutTask.setIsPicking(1);
outTasks.add(tempOutTask);
if (!thisTimeOutVehicleIds.contains(stock.getVehicleId())) {
// 创建出库任务
Task tempOutTask = new Task();
tempOutTask.setTaskId(generateId("INV_"));
tempOutTask.setTaskType(TaskType.OUT.getCode());
tempOutTask.setTaskGroup(generateId(""));
tempOutTask.setTaskStatus(WmsTaskStatus.NEW.getCode());
tempOutTask.setTaskPriority(2);
tempOutTask.setVehicleId(stock.getVehicleId());
tempOutTask.setUserName(inventoryRequest.getUserName());
tempOutTask.setOrigin(stock.getLocationId());
tempOutTask.setDestination("");
tempOutTask.setCreateTime(LocalDateTime.now());
tempOutTask.setIsPicking(1);
outTasks.add(tempOutTask);
thisTimeOutVehicleIds.add(stock.getVehicleId());
}
// 创建盘点
InventoryList tempInventoryList = new InventoryList();
tempInventoryList.setInventoryId(generateId("INV_"));
@ -3329,16 +3303,43 @@ public class TaskController {
taskService.saveBatch(outTasks);
// 保存盘点
inventoryService.saveBatch(inventoryList);
List<String> vehicleIds = outTasks.stream().map(Task::getVehicleId).distinct().toList();
// 判断本次是否需要生成拣选任务
if (targetStand.getStandType() == 2) {
List<PickTask> newPickTasks = new ArrayList<>();
// 如果是拣选站台的话需要生成拣选任务
List<PickTask> oldPickTasks = pickTaskService.list(new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getStandId, targetStand.getStandId())
.in(PickTask::getVehicleId, thisTimeOutVehicleIds));
for (String vehicleId : thisTimeOutVehicleIds) {
// 判断这个料箱是否需要生成新的拣选任务
List<PickTask> hasOldPickTask = oldPickTasks.stream().filter(pickTask -> pickTask.getVehicleId().equals(vehicleId)).toList();
if (!hasOldPickTask.isEmpty()) {
continue;
}
// 创建拣选任务
PickTask tempPickTask = new PickTask();
String key = vehicleId + "_" + targetStand.getStandId();
tempPickTask.setPickTaskId(key);
tempPickTask.setVehicleId(vehicleId);
tempPickTask.setStandId(targetStand.getStandId());
tempPickTask.setPickStatus(PickTaskStatusEnum.TEMP.getCode());
tempPickTask.setLastUpdateTime(LocalDateTime.now());
newPickTasks.add(tempPickTask);
}
if (!newPickTasks.isEmpty()) {
// 保存拣选任务
pickTaskService.saveOrUpdateBatch(newPickTasks);
}
}
// 更新库存状态
stockService.update(new LambdaUpdateWrapper<Stock>()
.set(Stock::getStockStatus, StockStatus.OUT.getCode())
.in(Stock::getVehicleId, vehicleIds)
.in(Stock::getVehicleId, thisTimeOutVehicleIds)
.eq(Stock::getStockStatus, StockStatus.OK.getCode()));
// 更新料箱状态
vehicleService.update(new LambdaUpdateWrapper<Vehicle>()
.set(Vehicle::getVehicleStatus, VehicleStatus.OUT.getCode())
.in(Vehicle::getVehicleId, vehicleIds)
.in(Vehicle::getVehicleId, thisTimeOutVehicleIds)
.eq(Vehicle::getVehicleStatus, VehicleStatus.ON.getCode()));
}
@ -3402,7 +3403,7 @@ public class TaskController {
inventoryVo.setGoodsId(inventoryRequest.getGoodsId());
inventoryVo.setVehiclesQuantity(stockList.size());
inventoryVo.setVehicleIds(stock.getVehicleId());
String vehicleStatus = "";
String vehicleStatus;
if (Objects.equals(StockStatus.OK.getCode(), stock.getStockStatus())) {
vehicleStatus = "在库中";
} else if (Objects.equals(StockStatus.OUT.getCode(), stock.getStockStatus())) {
@ -3466,6 +3467,38 @@ public class TaskController {
.apply("goods_related ->> '$.goodsId' = {0}" + MYSQL_JSON_CI, confirmRequest.getGoodsId())
.eq(Stock::getVehicleId, confirmRequest.getVehicleId())
.last("limit 1"));
// 更新库存数量
if (existStock != null && existStock.getGoodsRelated() != null) {
if (confirmRequest.getConfirmNum().compareTo(existStock.getGoodsRelated().getRemainNum()) != 0) {
// 原始库存数量
Stock originStock = BeanUtil.copyProperties(existStock, Stock.class);
BigDecimal quantityBefore = originStock.getGoodsRelated().getRemainNum();
// 判断前后数量差距
BigDecimal diffQuantity = confirmRequest.getConfirmNum().subtract(quantityBefore);
BigDecimal diffPercent = diffQuantity.divide(quantityBefore, 2, RoundingMode.HALF_UP).abs();
if (diffPercent.compareTo(BigDecimal.valueOf(0.05)) > 0) {
// 查询物料信息
Goods goods = goodsService.getById(confirmRequest.getGoodsId());
if (goods != null) {
if (goods.getIndicator() == 3) {
// 判断是否已经盘点三次
if (confirmRequest.getInvIndex() < 3) {
logger.info("确认数量与原数量差距超过5%,请再次确认。");
response.setCode(ResponseCode.WARNING.getCode());
response.setMessage("确认数量与原数量差距超过5%,请再次确认。");
return convertJsonString(response);
}
}
}
}
StockDetailInfo goodsDetail = existStock.getGoodsRelated();
// 更新库存
goodsDetail.setRemainNum(confirmRequest.getConfirmNum());
existStock.setGoodsRelated(goodsDetail);
stockService.updateById(existStock);
stockUpdateRecordService.addStockUpdateRecord(originStock, existStock, StockUpdateReasonEnum.INV_CONFIRM.getReason(), confirmRequest.getUserName(), quantityBefore);
}
}
// 保存盘点记录
List<InventoryHistory> historyList = new ArrayList<>();
for (InventoryList inventoryList : currentGoodsInvList) {

View File

@ -16,96 +16,119 @@ public class GoodsDto {
/**
* 物料编号
*/
@JsonProperty("goodsId")
private String goodsId;
/**
* 物料名称/描述
*/
@JsonProperty("goodsName")
private String goodsName;
/**
* 单位
*/
@JsonProperty("goodsUnit")
private String goodsUnit;
/**
* 物料分类
*/
@JsonProperty("goodsType")
private String goodsType;
/**
* 供应商分类
*/
@JsonProperty("providerType")
private String providerType;
/**
* 重量
*/
@JsonProperty("weight")
private BigDecimal weight;
/**
* 重量单位
*/
@JsonProperty("weightUnit")
private String weightUnit;
/**
* 每盒数量
*/
@JsonProperty("quantityPerBox")
private BigDecimal quantityPerBox;
/**
* 拆包方式
*/
@JsonProperty("unpackingType")
private String unpackingType;
/**
* 载具类型
*/
@JsonProperty("vehicleType")
private String vehicleType;
/**
* 载具类型描述
*/
@JsonProperty("vehicleTypeDescription")
private String vehicleTypeDescription;
/**
* 物料载具类型
*/
@JsonProperty("goodsInVehicleType")
private String goodsInVehicleType;
/**
* 补料方式
* PULL有看板
* PUSH无看板
*/
@JsonProperty("feedingType")
private String feedingType;
/**
* 每个看板包含物料数量
*/
@JsonProperty("quantityPerKanban")
private BigDecimal quantityPerKanban;
/**
* 看板的数量
*/
@JsonProperty("kanbanNum")
private BigDecimal kanbanNum;
/**
* 看板详细信息
*/
@JsonProperty("kanbanList")
private List<KanbanEntity> kanbanList;
/**
* 补货点
*/
@JsonProperty("feedingValue")
private BigDecimal feedingValue;
/**
* 备注1
*/
@JsonProperty("remark1")
private String remark1;
/**
* 备注2
*/
@JsonProperty("remark2")
private String remark2;
/**
* 备注3
*/
@JsonProperty("remark3")
private String remark3;
/**
* 数据来源
*/
@JsonProperty("dataSource")
private String dataSource;
/**
* 最后更新日期
*/
@JsonProperty("lastUpdateTime")
private LocalDateTime lastUpdateTime;
/**
* 最后更新用户
*/
@JsonProperty("lastUpdateUser")
private String lastUpdateUser;
/**
* 热度
@ -117,4 +140,9 @@ public class GoodsDto {
*/
@JsonProperty("releasePoint")
private String releasePoint;
/**
* 盘点指示器
*/
@JsonProperty("indicator")
private Integer indicator;
}

View File

@ -40,4 +40,26 @@ public class PageDto<T> {
pageDto.setLists(page.getRecords().stream().map(converter).toList());
return pageDto;
}
/**
* 将列表集合转换为分页结果
* @param total 总数
* @param pages 总页数
* @param voList 列表集合
* @return
* @param <VO>
*/
public static <VO> PageDto<VO> ofList(long total, long pages, long pageNo, long pageSize, List<VO> voList) {
PageDto<VO> pageDto = new PageDto<>();
// 设置总数
pageDto.setTotal(total);
// 设置总页数
pageDto.setPages(pages);
if (voList.isEmpty()) {
pageDto.setLists(Collections.emptyList());
return pageDto;
}
pageDto.setLists(voList.subList((int) ((pageNo - 1) * pageSize), (int) Math.min(pageNo * pageSize, total)));
return pageDto;
}
}

View File

@ -33,7 +33,7 @@ public class VehicleDto {
/**
* 额外信息
*/
private VehicleDetailInfo details;
private VehicleDetailInfo goodsInfo;
/**
* 上次入库时间
*/

View File

@ -1,10 +1,14 @@
package com.wms.entity.app.dto.extend;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StockDetailInfo {
/**
* 物料编号

View File

@ -1,14 +1,22 @@
package com.wms.entity.app.dto.extend;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 料箱详细信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VehicleDetailInfo {
/// 料号
private String goodsId;
/**
* 料号列表
*/
@JsonProperty("goodsIds")
private List<String> goodsIds;
}

View File

@ -0,0 +1,22 @@
package com.wms.entity.app.dto.extend;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 料箱详细信息
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VehicleDetailInfo_2 {
/**
* 料号列表
*/
@JsonProperty("goodsId")
private String goodsId;
}

View File

@ -1,6 +1,7 @@
package com.wms.entity.app.request;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wms.entity.app.dto.extend.KanbanEntity;
@ -148,6 +149,30 @@ public class GoodsQuery extends PageQuery {
*/
@JsonProperty("releasePoint")
private String releasePoint;
/**
* 盘点管理
* YES
* NO
*/
@JsonProperty("needInventory")
private String needInventory;
/**
* SLED管理
* YES
* NO
*/
@TableField("haveSled")
private String haveSled;
/**
* SLED天数
*/
@TableField("sledDays")
private Integer sledDays;
/**
* 盘点指示器
*/
@JsonProperty("indicator")
private Integer indicator;
/**

View File

@ -29,9 +29,19 @@ public class InventoryRequest {
*/
@JsonProperty("confirmNum")
private BigDecimal confirmNum;
/**
* 盘点次数
*/
@JsonProperty("invIndex")
private Integer invIndex;
/**
* 操作人员
*/
@JsonProperty("userName")
private String userName;
/**
* 站台
*/
@JsonProperty("standId")
private String standId;
}

View File

@ -0,0 +1,34 @@
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.time.LocalDate;
/**
* 拣选任务记录查询
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PickTaskRecordQuery extends PageQuery {
/**
* 载具号
*/
@JsonProperty("vehicleId")
private String vehicleId;
/**
* 站台号
*/
@JsonProperty("standId")
private String standId;
/**
* 工作日期
*/
@JsonProperty("workDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate workDate;
}

View File

@ -7,7 +7,6 @@ import com.wms.entity.table.Vehicle;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Objects;
/**
@ -44,8 +43,13 @@ public class VehicleQuery extends PageQuery {
/**
* 额外信息
*/
@JsonProperty("details")
private String details;
@JsonProperty("goodsInfo")
private String goodsInfo;
/**
* 查询料号
*/
@JsonProperty("goodsId")
private String goodsId;
/**
* 将VehicleQuery转化为VehiclePO
@ -62,7 +66,7 @@ public class VehicleQuery extends PageQuery {
} else {
vehiclePO.setVehicleType("");
}
vehiclePO.setDetails(JSON.parseArray(details, VehicleDetailInfo.class));
vehiclePO.setGoodsInfo(JSON.parseObject(goodsInfo, VehicleDetailInfo.class));
return vehiclePO;
}

View File

@ -0,0 +1,34 @@
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.time.LocalDate;
/**
* 工作日历查询参数
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class WorkDateQuery extends PageQuery {
/**
* 工作日
*/
@JsonProperty("workDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate workDate;
/**
* 备注
*/
@JsonProperty("remark")
private String remark;
/**
* 查询来源
*/
@JsonProperty("sourceType")
private Integer sourceType;
}

View File

@ -1,5 +1,6 @@
package com.wms.entity.app.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wms.entity.app.dto.extend.KanbanEntity;
@ -141,4 +142,28 @@ public class GoodsVo {
*/
@JsonProperty("releasePoint")
private String releasePoint;
/**
* 盘点管理
* YES
* NO
*/
@JsonProperty("needInventory")
private String needInventory;
/**
* SLED管理
* YES
* NO
*/
@TableField("haveSled")
private String haveSled;
/**
* SLED天数
*/
@TableField("sledDays")
private Integer sledDays;
/**
* 盘点指示器
*/
@JsonProperty("indicator")
private Integer indicator;
}

View File

@ -113,4 +113,23 @@ public class KateOrdersVo {
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime planStartDate;
/**
* 创建时间
*/
@JsonProperty("createTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
/**
* 最后更新时间
*/
@JsonProperty("lastUpdateTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastUpdateTime;
/**
* 最后更新原因
*/
@JsonProperty("lastUpdateReason")
private String lastUpdateReason;
}

View File

@ -1,12 +1,12 @@
package com.wms.entity.app.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wms.entity.app.dto.extend.VehicleDetailInfo;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
/**
* 载具VO
@ -16,30 +16,37 @@ public class VehicleVO {
/**
* 载具编号
*/
@JsonProperty("vehicleId")
private String vehicleId;
/**
* 当前所在位置
*/
@JsonProperty("currentLocation")
private String currentLocation;
/**
* 载具状态
*/
@JsonProperty("vehicleStatus")
private Integer vehicleStatus;
/**
* 是否是空箱
*/
@JsonProperty("isEmpty")
private Integer isEmpty;
/**
* 载具类型
*/
@JsonProperty("vehicleType")
private String vehicleType;
/**
* 额外信息
* 绑定物料信息
*/
private List<VehicleDetailInfo> details;
@JsonProperty("goodsInfo")
private VehicleDetailInfo goodsInfo;
/**
* 上次入库时间
*/
@JsonProperty("lastInTime")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastInTime;

View File

@ -0,0 +1,32 @@
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.time.LocalDate;
/**
* 工作日历显示类
*/
@Data
public class WorkDateVo {
/**
* id
*/
@JsonProperty("id")
private Integer keyId;
/**
* 工作日
*/
@JsonProperty("workDate")
@JsonFormat(pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate workDate;
/**
* 备注
*/
@JsonProperty("remark")
private String remark;
}

View File

@ -54,6 +54,11 @@ public class WorkFlowVo {
*/
@JsonProperty("needNum")
private BigDecimal needNum;
/**
* 需求数量
*/
@JsonProperty("distributedNum")
private BigDecimal distributedNum;
/**
* 亮灯状态
* 0未亮灯

View File

@ -163,4 +163,11 @@ public class Goods {
*/
@TableField("sled_days")
private Integer SledDays;
/**
* 盘点指示器
* 1成本小于2.5$盘点至多1遍
* 3: 成本大于2.5$盘点至多3遍
*/
@TableField("indicator")
private Integer indicator;
}

View File

@ -110,4 +110,19 @@ public class KateOrders {
*/
@TableField("plan_start_date")
private LocalDate planStartDate;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 最后更新时间
*/
@TableField("last_update_time")
private LocalDateTime lastUpdateTime;
/**
* 最后更新原因
*/
@TableField("last_update_reason")
private String lastUpdateReason;
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler;
import com.wms.entity.app.dto.extend.VehicleDetailInfo;
import com.wms.entity.app.dto.extend.VehicleDetailInfo_2;
import lombok.Data;
import java.time.LocalDateTime;
@ -45,7 +46,12 @@ public class Vehicle {
* 额外信息
*/
@TableField(value = "details", typeHandler = Fastjson2TypeHandler.class)
private List<VehicleDetailInfo> details;
private List<VehicleDetailInfo_2> details;
/**
* 间接物料列表
*/
@TableField(value = "goods_info", typeHandler = Fastjson2TypeHandler.class)
private VehicleDetailInfo goodsInfo;
/**
* 上次入库时间
*/

View File

@ -104,4 +104,9 @@ public class WorkFlow {
*/
@TableField("big_box")
private String bigBox;
/**
* 已分配数量
*/
@TableField("distributed_num")
private BigDecimal distributedNum;
}

View File

@ -101,4 +101,9 @@ public class WorkFlowLast {
*/
@TableField("big_box")
private String bigBox;
/**
* 已分配数量
*/
@TableField("distributed_num")
private BigDecimal distributedNum;
}

View File

@ -10,6 +10,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.utils.StringUtils.convertJsonString;
/**
* 普通任务发送定时器类
@ -30,7 +31,6 @@ public class CommonTaskSender implements Job {
* @param jobExecutionContext 执行文本
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void execute(JobExecutionContext jobExecutionContext) {
try {
String sendTask = configMap.get(ConfigMapKeyEnum.SEND_TASK.getConfigKey());
@ -40,8 +40,7 @@ public class CommonTaskSender implements Job {
// 发送正常任务
wmsJobService.sendCommonTasks();
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("发送任务给wcs发生异常{}", convertJsonString(e));
}
}
}

View File

@ -25,6 +25,6 @@ public class DataClearExecutor implements Job {
// 删除日志数据
wmsJobService.deleteLogsRegularly();
// 删除记录数据
wmsJobService.deleteRecordsRegularly();
// wmsJobService.deleteRecordsRegularly();
}
}

View File

@ -1,8 +1,5 @@
package com.wms.quartz.job_executor;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms.constants.enums.ConfigMapKeyEnum;
import com.wms.entity.table.Stand;
import com.wms.service.StandService;
import com.wms.service.business.IWorkService;
import com.wms.utils.StringUtils;
@ -12,7 +9,6 @@ import org.quartz.*;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.utils.StringUtils.convertJsonString;
@ -43,6 +39,8 @@ public class KateWorkExecutor implements Job {
public void execute(JobExecutionContext jobExecutionContext) {
// 创建工作
createWork();
// 修复工作
repairWork();
// 执行工作
doWork();
}
@ -63,13 +61,13 @@ public class KateWorkExecutor implements Job {
try {
workService.createTempWorkFlows();
} catch (Exception e) {
log.error("创建当日工作发生错误:{}", e.getMessage());
log.error("创建当日工作发生异常:{}", convertJsonString(e));
}
try {
// 分配工作
workService.distributeWorks();
} catch (Exception e) {
log.error("分配工作时发生错误:{}", e.getMessage());
log.error("分配工作时发生异常:{}", convertJsonString(e));
}
}
@ -81,17 +79,33 @@ public class KateWorkExecutor implements Job {
if (StringUtils.isEmpty(startWork) || !startWork.equals("1")) {
return;
}
// 轮询工作站台判断是否需要下发任务
List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
.eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
.eq(Stand::getStandType, 2));
List<String> standIds = stands.stream().map(Stand::getStandId).toList();
for (String standId : standIds) {
try {
workService.doWork(standId);
} catch (Exception e) {
log.error("执行工作时发生错误:{}", convertJsonString(e.getMessage()));
}
try {
workService.doWorkMethod2();
} catch (Exception e) {
log.error("执行工作时发生异常:{}", convertJsonString(e));
}
// // 轮询工作站台判断是否需要下发任务
// List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
// .eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
// .eq(Stand::getStandType, 2));
// List<String> standIds = stands.stream().map(Stand::getStandId).toList();
// for (String standId : standIds) {
// try {
// workService.doWork(standId);
// } catch (Exception e) {
// log.error("执行工作时发生错误:{}", convertJsonString(e.getMessage()));
// }
// }
}
/**
* 修复工作
*/
public void repairWork() {
try {
workService.repairWork();
} catch (Exception e) {
log.error("修复工作发生异常:{}", convertJsonString(e));
}
}
}

View File

@ -6,10 +6,9 @@ import com.wms.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.utils.StringUtils.convertJsonString;
@Slf4j
@PersistJobDataAfterExecution
@ -27,7 +26,6 @@ public class PickTaskSender implements Job {
* @param jobExecutionContext 执行上下文
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void execute(JobExecutionContext jobExecutionContext) {
try {
String sendTask = configMap.get(ConfigMapKeyEnum.SEND_TASK.getConfigKey());
@ -37,8 +35,7 @@ public class PickTaskSender implements Job {
// 发送拣选任务
wmsJobService.sendPickTasks();
} catch (Exception e) {
// 回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
log.error("发送拣选任务任务给wcs发生异常{}", convertJsonString(e));
}
}
}

View File

@ -3,8 +3,15 @@ package com.wms.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wms.entity.table.WorkDate;
import java.util.List;
/**
* 卡特DBS服务接口
*/
public interface WorkDateService extends IService<WorkDate> {
/**
* 更新工作日历
* @param workDateList 工作日列表
*/
boolean updateWorkDate(List<WorkDate> workDateList);
}

View File

@ -6,9 +6,8 @@ package com.wms.service.business;
public interface IWmsJobService {
/**
* 执行普通任务
* @throws Exception 异常用于回滚事务
*/
void sendCommonTasks() throws Exception;
void sendCommonTasks();
/**
* 下发拣选出库任务
@ -18,9 +17,8 @@ public interface IWmsJobService {
/**
* 发送拣选任务
* @throws Exception 异常用于回滚事务
*/
void sendPickTasks() throws Exception;
void sendPickTasks();
/**
* 发送重复入库修正后的任务

View File

@ -1,5 +1,8 @@
package com.wms.service.business;
import com.wms.entity.table.WorkFlow;
import java.time.LocalDate;
import java.util.List;
/**
@ -13,6 +16,16 @@ public interface IWorkService {
*/
void doWork(String workStation) throws Exception;
/**
* 新的执行工作
*/
void doWorkMethod2();
/**
* 修复工作
*/
void repairWork();
/**
* 完成工作
* @param workStation 工作站台
@ -30,4 +43,12 @@ public interface IWorkService {
void distributeWorks();
void distributeWorksMethod2();
void findCurrentDateWorks(List<WorkFlow> workFlows, LocalDate currentWorkDate);
void findCurrentDateWorksUseConfig(List<WorkFlow> workFlows, LocalDate currentWorkDate);
void findWorks(String workStation, List<WorkFlow> workFlows, String model, LocalDate currentWorkDate);
LocalDate nextWorkDate(LocalDate currentDate);
}

View File

@ -2,7 +2,6 @@ package com.wms.service.business.serviceImplements;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms.constants.enums.*;
import com.wms.entity.app.dto.extend.VehicleDetailInfo;
import com.wms.entity.app.request.GoodsInRequest;
import com.wms.entity.app.request.TaskInRequest;
import com.wms.entity.app.request.TaskOutRequest;
@ -82,8 +81,8 @@ public class ValidateServiceImplements implements IValidateService {
goodsType = 1;
} else {
goodsType = 2;
if (existVehicle.getDetails() != null) {
canInGoodsIdList = existVehicle.getDetails().stream().map(VehicleDetailInfo::getGoodsId).toList();
if (existVehicle.getGoodsInfo() != null && !existVehicle.getGoodsInfo().getGoodsIds().isEmpty()) {
canInGoodsIdList = existVehicle.getGoodsInfo().getGoodsIds();
}
}
}

View File

@ -14,6 +14,7 @@ import com.wms.entity.app.wcs.WcsTaskRequest;
import com.wms.entity.table.*;
import com.wms.service.*;
import com.wms.service.business.IWmsJobService;
import com.wms.utils.DbTransUtils;
import com.wms.utils.HttpUtils;
import com.wms.utils.StringUtils;
import com.wms.utils.WmsUtils;
@ -47,7 +48,6 @@ import static com.wms.utils.StringUtils.convertJsonString;
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WmsJobServiceImplements implements IWmsJobService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());// 日志
private final String ROOT_PATH = "./file";
private final LogService logService;// 日志服务
private final TaskService taskService;// 任务服务
@ -65,92 +65,89 @@ public class WmsJobServiceImplements implements IWmsJobService {
private final IStockUpdateRecordService iStockUpdateRecordService;// 库存更新记录服务
private final UploadRecordService uploadRecordService;// 文件上传记录服务
private final InventoryHistoryService inventoryHistoryService;
private final DbTransUtils dbTransUtils;
/**
* 发送正常的任务
*/
@Override
public void sendCommonTasks() throws Exception {
try {
// 检索任务表---新建未下发的任务
LambdaQueryWrapper<Task> waitForDistributeTaskQuery = new LambdaQueryWrapper<Task>()
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode());
List<Task> allTasks = taskService.list(waitForDistributeTaskQuery);
if (!allTasks.isEmpty()) {
String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey());
if (StringUtils.isEmpty(max_wcs_accept_nums)) {
logger.error("配置未生成");
return;
public void sendCommonTasks() {
// 检索任务表---新建未下发的任务
LambdaQueryWrapper<Task> waitForDistributeTaskQuery = new LambdaQueryWrapper<Task>()
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode());
List<Task> allTasks = taskService.list(waitForDistributeTaskQuery);
if (!allTasks.isEmpty()) {
String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey());
if (StringUtils.isEmpty(max_wcs_accept_nums)) {
logger.error("配置未生成");
return;
}
int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);
// 需要发送给wcs的任务列表
List<WcsTaskRequest> request = new ArrayList<>();
// 已经下发的任务组列表
List<String> taskGroupIds = new ArrayList<>();
// 这里单独处理站台拣选出库以外的任务
for (Task task : allTasks) {
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
continue;
}
int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);
// 需要发送给wcs的任务列表
List<WcsTaskRequest> request = new ArrayList<>();
// 已经下发的任务组列表
List<String> taskGroupIds = new ArrayList<>();
// 这里单独处理站台拣选出库以外的任务
for (Task task : allTasks) {
if (request.size() >= maxWcsAcceptNums) {
// 每次给wcs下发数量
break;
}
if (taskGroupIds.contains(task.getTaskGroup())) {
// 该任务组已经下发
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
continue;
}
if (StringUtils.isNotEmpty(task.getPreTask())) {// 当前任务具有前置任务
// 查询一下前置的任务有没有存在存在则不下发
if (taskService.exists(new LambdaQueryWrapper<Task>().eq(Task::getTaskId, task.getPreTask()))) {
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();
tempTask.setTaskId(task.getTaskGroup());
if (Objects.equals(task.getTaskType(), TaskType.INVENTORY.getCode())) {
tempTask.setTaskType(TaskType.OUT.getCode());
} else {
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());
}
if (request.size() == 0) {
// 没有新任务发送
return;
// 创建发送的任务
WcsTaskRequest tempTask = new WcsTaskRequest();
tempTask.setTaskId(task.getTaskGroup());
if (Objects.equals(task.getTaskType(), TaskType.INVENTORY.getCode())) {
tempTask.setTaskType(TaskType.OUT.getCode());
} else {
tempTask.setTaskType(task.getTaskType());
}
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
if (url != null) {
logger.info("向WCS发送任务地址{},请求详情:{}", url, convertJsonString(request));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
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());
}
if (request.isEmpty()) {
// 没有新任务发送
return;
}
// 下面这行代码模拟wcs下发成功
// simulateSendPickOutTasks(taskGroupIds, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
if (url != null) {
// 循环发送任务
for (int i = 0; i < request.size(); i += maxWcsAcceptNums) {
List<WcsTaskRequest> tempRequest = request.subList(i, Math.min(i + maxWcsAcceptNums, request.size()));
logger.info("向WCS发送任务{}-{},地址:{},请求详情:{}", i + 1, Math.min(i + maxWcsAcceptNums, request.size()), url, convertJsonString(tempRequest));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(tempRequest)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(request), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送任务", "SetStackerTask", JSON.toJSONString(tempRequest), JSON.toJSONString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("插入日志错误。");
logger.error("保存发送任务的日志错误。");
}
if (result == null) {
logger.error("发送任务异常。");
logger.error("发送堆垛机任务异常。");
} else {
if (Objects.equals(ResponseCode.OK.getCode(), result.getCode())) {
logger.info("发送WCS任务成功。");
List<String> successTaskIds = tempRequest.stream().map(WcsTaskRequest::getTaskId).toList();
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.in(Task::getTaskGroup, taskGroupIds)
.in(Task::getTaskGroup, successTaskIds)
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
} else {
logger.error("发送任务错误:{}", convertJsonString(result));
// 判断returnData的数据
if (result.getReturnData() != null) {
List<WcsTaskRequest> errorTasks = JSON.parseArray(result.getReturnData().toString(), WcsTaskRequest.class);
@ -163,442 +160,79 @@ public class WmsJobServiceImplements implements IWmsJobService {
.eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode()));
}
}
logger.error("发送任务错误:{}", convertJsonString(result));
}
}
} else {
logger.error("WCS发送任务地址为空。");
}
} else {
logger.error("WCS发送任务地址为空。");
}
} catch (Exception exception) {
logger.error("向WCS发送任务时发生异常{}", convertJsonString(exception));
throw new Exception("向WCS发送任务时发生异常。");
}
}
/**
* 发送PickOut任务
* @throws Exception 异常
*/
// @Override
// public void sendPickOutTasks() throws Exception {
// try {
// // 检索任务表---新建未下发的任务
// LambdaQueryWrapper<Task> waitForDistributeTaskQuery = new LambdaQueryWrapper<Task>()
// .eq(Task::getTaskStatus, WmsTaskStatus.NEW.getCode())
// .eq(Task::getTaskType, TaskType.OUT.getCode())
// .eq(Task::getTaskPriority, 1);
// List<Task> allTasks = taskService.list(waitForDistributeTaskQuery);
// if (!allTasks.isEmpty()) {
// String max_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_VEHICLE_NUMS.getConfigKey());
// String max_wcs_accept_nums = configMap.get(ConfigMapKeyEnum.MAX_WCS_ACCEPT_NUMS.getConfigKey());
// String max_stand_vehicle_nums = configMap.get(ConfigMapKeyEnum.MAX_STAND_VEHICLE_NUMS.getConfigKey());
// if (StringUtils.isEmpty(max_vehicle_nums) || StringUtils.isEmpty(max_wcs_accept_nums) || StringUtils.isEmpty(max_stand_vehicle_nums)) {
// logger.error("配置未生成");
// return;
// }
// int maxVehicleNums = Integer.parseInt(max_vehicle_nums);// 线体最大箱子数量
// int maxWcsAcceptNums = Integer.parseInt(max_wcs_accept_nums);// wcs最大一次性可接受任务数量
// int maxStandVehicleNums = Integer.parseInt(max_stand_vehicle_nums);// 每个站台最大箱子数量
// List<String> outsideVehicles = outsideVehiclesService.selectDistinctVehicles();
// if (outsideVehicles == null || outsideVehicles.isEmpty()) {
// outsideVehicles = Collections.emptyList();
// }
// int remainVehicleNums = maxVehicleNums - outsideVehicles.size();// 线体剩余箱子数量
// if (remainVehicleNums <= 0) {
// return;
// }
//
// // 需要发送给wcs的任务列表
// 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计算每个站台已经出库的拣选任务
// Map<String, Integer> outPickTaskMap = new HashMap<>();
// Map<String, Integer> updatedOutPickTaskMap = new HashMap<>();
// // 轮询工作站台判断是否需要下发任务
// List<Stand> stands = standService.list(new LambdaQueryWrapper<Stand>()
// .eq(Stand::getIsLock, 0).eq(Stand::getStandStatus, 0)
// .eq(Stand::getStandType, 2));
// for (Stand workStation : stands) {
// outPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount());
// updatedOutPickTaskMap.put(workStation.getStandId(), workStation.getPickVehicleCount());
// }
// // 轮询堆垛机状态
// 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())));
// Map<Integer, Integer> runningTaskNumToEquipmentMap = new HashMap<>();
// for (Stand stacker : stackerList) {
// // 找这台堆垛机正在执行的拣选出库任务数量
// runningTaskNumToEquipmentMap.put(stacker.getEquipmentId(), 0);
// }
// // 生成堆垛机可用列表
// 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) >= 3) {
// runningTaskNumToEquipmentMap.remove(key);
// } else {
// runningTaskNumToEquipmentMap.replace(key, runningTaskNumToEquipmentMap.get(key) + 1);
// }
// }
// }
// }
// if (runningTaskNumToEquipmentMap.isEmpty()) {
// // 没有可用堆垛机
// return;
// }
// // 还有可用堆垛机
// while(!runningTaskNumToEquipmentMap.isEmpty()) {
// if (request.size() >= maxWcsAcceptNums || remainVehicleNums <= 0) {
// // 超过wcs一次可接受数量
// break;
// }
// if (outPickTaskMap.isEmpty()) {
// // 没有站台可以使用
// break;
// }
// // 先找出目前数量最少的站台
// String standId = outPickTaskMap.entrySet().stream()
// .min(Comparator.comparingInt(Map.Entry::getValue))
// .map(Map.Entry::getKey)
// .orElse("");
// List<String> vehicleIds;
// if (StringUtils.isNotEmpty(standId)) {
// // 如果这个站台箱子数量超过最大每个站台的箱子数量则跳过
// if (outPickTaskMap.get(standId) >= maxStandVehicleNums) {
// outPickTaskMap.remove(standId);
// continue;
// }
// // 查找这个站台未下发的料箱
// 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;
// }
// } 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);
// updatedOutPickTaskMap.put(tempStandId, updatedOutPickTaskMap.getOrDefault(tempStandId, 0) + 1);
// });
// }
// runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// // 已经发送过的vehicleId
// pickVehicleIds.add(maxVehicleId);
// vehicleStandsMap.remove(maxVehicleId);
// // 剩余线体可继续出库料箱数量
// remainVehicleNums--;
// }
// } else {
// if (!skipVehicleIds.contains(maxVehicleId)) {
// skipVehicleIds.add(maxVehicleId);
// }
// }
// } 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);
// updatedOutPickTaskMap.put(tempStandId, updatedOutPickTaskMap.getOrDefault(tempStandId, 0) + 1);
// });
// }
// runningTaskNumToEquipmentMap.replace(equipmentId, runningTaskNumToEquipmentMap.get(equipmentId) + 1);
// // 已经发送过的vehicleId
// pickVehicleIds.add(minVehicleId);
// vehicleStandsMap.remove(minVehicleId);
// // 剩余线体可继续出库料箱数量
// remainVehicleNums--;
// }
// } else {
// if (!skipVehicleIds.contains(minVehicleId)) {
// skipVehicleIds.add(minVehicleId);
// }
// }
// } else {
// if (!skipVehicleIds.contains(minVehicleId)) {
// skipVehicleIds.add(minVehicleId);
// }
// }
// }
// List<Integer> removeKeys = new ArrayList<>(runningTaskNumToEquipmentMap.keySet().stream().toList());
// for (int equipmentId : removeKeys) {
// // 剩余任务有没有这台堆垛机的
// List<Task> remainTasks = allTasks.stream().filter(task -> !skipVehicleIds.contains(task.getVehicleId()) && !pickVehicleIds.contains(task.getVehicleId())
// && task.getIsPicking() == 1 && StringUtils.isNotEmpty(task.getPickStand())).toList();
// if (remainTasks.isEmpty() || runningTaskNumToEquipmentMap.get(equipmentId) >= 3) {
// runningTaskNumToEquipmentMap.remove(equipmentId);
// }
// }
// }
//
// if (request.size() == 0) {
// // 没有新任务发送
// return;
// }
// // 发送任务
// String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
// if (url != null) {
// logger.info("向WCS发送拣选出库任务地址{},请求详情:{}", url, convertJsonString(request));
// ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
// 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("插入日志错误。");
// }
// 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()));
// // 流转载具状态变更
// if (!pickVehicleIds.isEmpty()) {
// outsideVehiclesService.update(new LambdaUpdateWrapper<OutsideVehicles>()
// .set(OutsideVehicles::getOutStatus, 1)
// .in(OutsideVehicles::getVehicleId, pickVehicleIds));
// // 更新站台拣选箱数
// for (String tempStandId : updatedOutPickTaskMap.keySet()) {
// standService.update(new LambdaUpdateWrapper<Stand>()
// .set(Stand::getPickVehicleCount, updatedOutPickTaskMap.get(tempStandId))
// .eq(Stand::getStandId, tempStandId));
// }
// }
// } else {
// // 判断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发送拣选出库任务时发生异常。");
// }
// }
/**
* 发送拣选任务
*/
@Override
public void sendPickTasks() throws Exception {
try {
// 检索任务表---新建未下发的拣选任务
LambdaQueryWrapper<PickTask> waitForDistributePickTaskQuery = new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode());
List<PickTask> allPickTasks = pickTaskService.list(waitForDistributePickTaskQuery);
if (allPickTasks == null || allPickTasks.isEmpty()) {
return;
public void sendPickTasks() {
// 检索任务表---新建未下发的拣选任务
LambdaQueryWrapper<PickTask> waitForDistributePickTaskQuery = new LambdaQueryWrapper<PickTask>()
.eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode());
List<PickTask> allPickTasks = pickTaskService.list(waitForDistributePickTaskQuery);
if (allPickTasks == null || allPickTasks.isEmpty()) {
return;
}
// 需要发送给wcs的拣选任务列表
List<WcsStandTaskRequest> request = new ArrayList<>();
// 载具对应站台列表
Map<String, List<String>> vehicleAndStansMap = new HashMap<>();
// 循环生成载具对应站台列表
for (PickTask pickTask : allPickTasks) {
// 当前载具已经添加过站台
if (vehicleAndStansMap.containsKey(pickTask.getVehicleId())) {
List<String> oldStandIds = vehicleAndStansMap.get(pickTask.getVehicleId());
oldStandIds.add(pickTask.getStandId());
vehicleAndStansMap.replace(pickTask.getVehicleId(), oldStandIds);
} else {// 新载具
List<String> newStandIds = new ArrayList<>();
newStandIds.add(pickTask.getStandId());
vehicleAndStansMap.put(pickTask.getVehicleId(), newStandIds);
}
// 需要发送给wcs的拣选任务列表
List<WcsStandTaskRequest> request = new ArrayList<>();
// 载具对应站台列表
Map<String, List<String>> vehicleAndStansMap = new HashMap<>();
// 循环生成载具对应站台列表
for (PickTask pickTask : allPickTasks) {
// 当前载具已经添加过站台
if (vehicleAndStansMap.containsKey(pickTask.getVehicleId())) {
List<String> oldStandIds = vehicleAndStansMap.get(pickTask.getVehicleId());
oldStandIds.add(pickTask.getStandId());
vehicleAndStansMap.replace(pickTask.getVehicleId(), oldStandIds);
} else {// 新载具
List<String> newStandIds = new ArrayList<>();
newStandIds.add(pickTask.getStandId());
vehicleAndStansMap.put(pickTask.getVehicleId(), newStandIds);
}
// 循环生成Wcs任务请求
for (String vehicleId : vehicleAndStansMap.keySet()) {
WcsStandTaskRequest requestSingle = new WcsStandTaskRequest();
requestSingle.setTaskGroup(WmsUtils.generateId(vehicleId));
requestSingle.setTaskType(1);
requestSingle.setVehicleNo(vehicleId);
requestSingle.setLocation(vehicleAndStansMap.get(vehicleId));
requestSingle.setRemark("站台拣选任务");
request.add(requestSingle);
}
// 下面是模拟发送wcs拣选任务
// simulateSendPickTasks(vehicleAndStansMap.keySet().stream().toList());
if (!request.isEmpty()) {
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_PICK_TASK.getConfigKey());
if (url != null) {
logger.info("向WCS发送拣选任务地址{},请求详情:{}", url, convertJsonString(request));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
logger.error("保存发送拣选任务日志错误。");
}
}
// 循环生成Wcs任务请求
for (String vehicleId : vehicleAndStansMap.keySet()) {
WcsStandTaskRequest requestSingle = new WcsStandTaskRequest();
requestSingle.setTaskGroup(WmsUtils.generateId(vehicleId));
requestSingle.setTaskType(1);
requestSingle.setVehicleNo(vehicleId);
requestSingle.setLocation(vehicleAndStansMap.get(vehicleId));
requestSingle.setRemark("站台拣选任务");
request.add(requestSingle);
}
if (!request.isEmpty()) {
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_PICK_TASK.getConfigKey());
if (url != null) {
logger.info("向WCS发送拣选任务地址{},请求详情:{}", url, convertJsonString(request));
ResponseEntity result = JSON.parseObject(HttpUtils.sendHttpPostWithoutToken(url, convertJsonString(request)), ResponseEntity.class);
try {
logService.save(new WmsLog(WmsUtils.generateId("LOG_"), "向WCS发送拣选任务", "setConveyTask", convertJsonString(request), convertJsonString(result), url, LocalDateTime.now(), "WMS"));
} catch (Exception e) {
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())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()));
} else {
logger.error("发送拣选任务错误:{}", convertJsonString(result));
}
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())
.eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode()));
} else {
logger.error("WCS发送拣选任务地址为空。");
logger.error("发送拣选任务错误:{}", convertJsonString(result));
}
} else {
logger.error("WCS发送拣选任务地址为空。");
}
} catch (Exception exception) {
logger.error("向WCS发送拣选任务时发生异常{}", convertJsonString(exception));
throw new Exception("向WCS发送拣选任务时发生异常。");
}
}
@ -710,12 +344,12 @@ public class WmsJobServiceImplements implements IWmsJobService {
int interval = 180;// 普通接口记录默认保留180天
int importantInterval = 365;// 重要接口记录默认保留一年
try {
interval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.LOG_DELETE_INTERVAL.getConfigKey()));
interval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.RECORD_DELETE_INTERVAL.getConfigKey()));
} catch (Exception e) {
logger.error("获取普通记录清理天数错误使用默认值180天");
}
try {
importantInterval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.LOG_DELETE_INTERVAL.getConfigKey()));
importantInterval = Integer.parseInt(configMap.get(ConfigMapKeyEnum.IMPORTANT_RECORD_DELETE_INTERVAL.getConfigKey()));
} catch (Exception e) {
logger.error("获取重要记录清理天数错误使用默认值365天");
}
@ -725,6 +359,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 查询过期任务记录
List<TaskRecord> expireTaskRecords = taskRecordService.list(new LambdaQueryWrapper<TaskRecord>()
.lt(TaskRecord::getCreateTime, deleteTime));
String ROOT_PATH = "./file";
if (expireTaskRecords != null && !expireTaskRecords.isEmpty()) {
List<String> needRemoveIds = new ArrayList<>();
List<DbOfTaskRecord> finishedExcelTemp = new ArrayList<>();
@ -938,7 +573,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 判断数据行是不是过多
int rowCount = list.size();
// 每50万行一个文件
int rowCountPerFile = 300000;
int rowCountPerFile = 100000;
int fileCounts = (rowCount + rowCountPerFile - 1) / rowCountPerFile;
for (int i = 1; i <= fileCounts; i++) {
List<T> dividedList = list.subList((i - 1) * rowCountPerFile, Math.min(i * rowCountPerFile, rowCount));
@ -1280,22 +915,29 @@ public class WmsJobServiceImplements implements IWmsJobService {
// .max(Comparator.comparingInt(Map.Entry::getValue))
// .map(Map.Entry::getKey)
// .orElse("");
// new 查找已下发状态以上最少箱子的站台
String standId = standPickCountsMap.entrySet().stream()
.min(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey)
.orElse("");
// 查找这个站台未下发的料箱
List<String> vehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& thisStackerVehicleIds.contains(pickTask.getVehicleId()) && standId.equals(pickTask.getStandId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (vehicleIds.isEmpty()) {
// 对这些站台进行排序从少到多
List<String> standIds = standPickCountsMap.entrySet().stream()
.sorted(Comparator.comparingInt(Map.Entry::getValue))
.map(Map.Entry::getKey).toList();
List<String> minStandVehicleIds = new ArrayList<>();
String minStandId = "";
for (String standId : standIds) {
// 查找这个站台未下发的料箱
minStandVehicleIds = standPickTasks.stream()
.filter(pickTask -> pickTask.getPickStatus().equals(PickTaskStatusEnum.TEMP.getCode())
&& thisStackerVehicleIds.contains(pickTask.getVehicleId()) && standId.equals(pickTask.getStandId()))
.map(PickTask::getVehicleId)
.distinct()
.toList();
if (!minStandVehicleIds.isEmpty()) {
minStandId = standId;
break;
}
}
if (minStandVehicleIds.isEmpty()) {
break;
}
List<String> vehicleIds = minStandVehicleIds;
// 生成箱子-站台数量的Map
Map<String, Integer> vehicleStandsMap = new HashMap<>();
standPickTasks.forEach(pickTask -> {
@ -1342,7 +984,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 添加特殊任务
newStandStackerTask.setVehicleId(task.getVehicleId());
newStandStackerTask.setStackerId(stacker.getEquipmentId());
newStandStackerTask.setStandId(standId);
newStandStackerTask.setStandId(minStandId);
newStandStackerTask.setTaskType(2);
newStandStackerTask.setTaskStatus(0);
newStandStackerTask.setCreateTime(LocalDateTime.now());
@ -1354,7 +996,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 已经发送过的vehicleId
pickVehicleIds.add(vehicleId);
availNum--;
standPickCountsMap.put(standId, standPickCountsMap.get(standId) + 1);
standPickCountsMap.put(minStandId, standPickCountsMap.getOrDefault(minStandId, 0) + 1);
}
}
}
@ -1364,6 +1006,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
// 没有新任务发送
return;
}
// 下面这行代码模拟wcs下发成功
// simulateSendPickOutTasks(taskGroupIds, pickVehicleIds, needAddStandStackerTasks, needRemoveStandStackerTasks);
// 发送任务
String url = configMap.get(ConfigMapKeyEnum.URL_WCS_TASK.getConfigKey());
@ -1444,7 +1087,7 @@ public class WmsJobServiceImplements implements IWmsJobService {
}
} else {
logger.error("WCS发送任务地址为空。");
logger.error("WCS发送站台出库任务地址为空。");
}
}
} catch (Exception exception) {
@ -1455,13 +1098,13 @@ public class WmsJobServiceImplements implements IWmsJobService {
/**
* 模拟出库发送成功
* @param taskGroupIds
* @param pickVehicleIds
* @param needAddStandStackerTasks
* @param needRemoveStandStackerTasks
* @param taskGroupIds 任务组
* @param pickVehicleIds 拣选料箱id
* @param needAddStandStackerTasks 需要添加的堆垛机站台任务
* @param needRemoveStandStackerTasks 需要移除的堆垛机站台任务
*/
void simulateSendPickOutTasks(List<String> taskGroupIds, List<String> pickVehicleIds, List<StandStackerTask> needAddStandStackerTasks, List<StandStackerTask> needRemoveStandStackerTasks) {
logger.info("发送WCS拣选出库任务成功");
logger.info("模拟发送wcs任务");
taskService.update(new LambdaUpdateWrapper<Task>()
.set(Task::getTaskStatus, WmsTaskStatus.WAIT.getCode())
.in(Task::getTaskGroup, taskGroupIds)
@ -1473,14 +1116,30 @@ public class WmsJobServiceImplements implements IWmsJobService {
.in(OutsideVehicles::getVehicleId, pickVehicleIds));
}
// 更新特殊信息
standStackerTaskService.saveBatch(needAddStandStackerTasks);
standStackerTaskService.removeBatchByIds(needRemoveStandStackerTasks);
List<StandStackerTaskBak> needSaveRecords = new ArrayList<>();
for (StandStackerTask standStackerTask : needRemoveStandStackerTasks) {
StandStackerTaskBak standStackerTaskBak = BeanUtil.copyProperties(standStackerTask, StandStackerTaskBak.class);
standStackerTaskBak.setRecordId(WmsUtils.generateId("STAND_STACKER_TASK_BAK_"));
needSaveRecords.add(standStackerTaskBak);
if (!needAddStandStackerTasks.isEmpty()) {
standStackerTaskService.saveBatch(needAddStandStackerTasks);
}
standStackerTaskBakService.saveBatch(needSaveRecords);
if (!needRemoveStandStackerTasks.isEmpty()) {
standStackerTaskService.removeBatchByIds(needRemoveStandStackerTasks);
List<StandStackerTaskBak> needSaveRecords = new ArrayList<>();
for (StandStackerTask standStackerTask : needRemoveStandStackerTasks) {
StandStackerTaskBak standStackerTaskBak = BeanUtil.copyProperties(standStackerTask, StandStackerTaskBak.class);
standStackerTaskBak.setRecordId(WmsUtils.generateId("STAND_STACKER_TASK_BAK_"));
needSaveRecords.add(standStackerTaskBak);
}
standStackerTaskBakService.saveBatch(needSaveRecords);
}
}
/**
* 模拟发送拣选任务
* @param vehicleIds 载具号
*/
void simulateSendPickTasks(List<String> vehicleIds) {
logger.info("模拟发送拣选任务。");
dbTransUtils.useTran(() -> pickTaskService.update(new LambdaUpdateWrapper<PickTask>()
.set(PickTask::getPickStatus, PickTaskStatusEnum.SEND.getCode())
.in(PickTask::getVehicleId, vehicleIds)
.eq(PickTask::getPickStatus, PickTaskStatusEnum.NEW.getCode())));
}
}

View File

@ -93,10 +93,9 @@ public class JobServiceImpl implements IJobService {
// 这里写死五个定时器
jobBeans.add(new JobBean("CommonTaskSender", CommonTaskSender.class, "0/2 * * * * ?", 2000, JobTimerTypeEnums.SIMPLE.getType(), 1));
jobBeans.add(new JobBean("PickTaskSender", PickTaskSender.class, "0/2 * * * * ?", 2000, JobTimerTypeEnums.SIMPLE.getType(), 1));
jobBeans.add(new JobBean("PickOutTaskSender", PickOutTaskSender.class, "0/2 * * * * ?", 2000, JobTimerTypeEnums.SIMPLE.getType(), 1));
// jobBeans.add(new JobBean("KateWorkExecutor", KateWorkExecutor.class, "0/20 * * * * ?", 20000, JobTimerTypeEnums.SIMPLE.getType(), 1));
// jobBeans.add(new JobBean("PickOutTaskSender", PickOutTaskSender.class, "0/2 * * * * ?", 2000, JobTimerTypeEnums.SIMPLE.getType(), 0));
jobBeans.add(new JobBean("KateWorkExecutor", KateWorkExecutor.class, "0 0 * * * ?", 20000, JobTimerTypeEnums.SIMPLE.getType(), 1));
jobBeans.add(new JobBean("DataClearExecutor", DataClearExecutor.class, "0 0 3 * * ?", 2000, JobTimerTypeEnums.CRON.getType(), 1));
jobBeans.add(new JobBean("DataClearExecutor", DataClearExecutor.class, "0 0 23 * * ?", 2000, JobTimerTypeEnums.CRON.getType(), 1));
for (JobBean jobBean : jobBeans) {
createJob(jobBean);
}

View File

@ -1,17 +1,54 @@
package com.wms.service.serviceImplements;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wms.entity.table.WorkDate;
import com.wms.mapper.WorkDateMapper;
import com.wms.service.WorkDateService;
import com.wms.utils.DbTransUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.List;
import static com.wms.config.InitLocalConfig.localWorkDateList;
/**
* 工作日历
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@RequiredArgsConstructor
@Slf4j
public class WorkDateServiceImpl extends ServiceImpl<WorkDateMapper, WorkDate> implements WorkDateService {
private final DbTransUtils dbTransUtils;
/**
* 更新工作日历---实现
* @param workDateList 工作日列表
*/
@Override
public boolean updateWorkDate(List<WorkDate> workDateList) {
// 对工作日列表进行排序
List<WorkDate> sortedWorkDateList = workDateList.stream().sorted(Comparator.comparing(WorkDate::getWorkDate)).toList();
// 设定id
int idIndex = 1;
for (WorkDate workDate : sortedWorkDateList) {
workDate.setKeyId(idIndex);
idIndex++;
}
boolean doTransResult = dbTransUtils.useTran(() -> {
// 删除所有工作日
super.remove(new LambdaQueryWrapper<>());
// 批量插入工作日
super.saveBatch(sortedWorkDateList);
});
if (!doTransResult) {
log.error("更新工作日的事务执行失败。");
}
// 更新本地缓存的工作日历
localWorkDateList = sortedWorkDateList.stream().map(WorkDate::getWorkDate).distinct().toList();
log.info("更新本地缓存的工作日历成功。");
return doTransResult;
}
}

View File

@ -0,0 +1,33 @@
package com.wms.utils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Component
@RequiredArgsConstructor
public class DbTransUtils {
private final PlatformTransactionManager transactionManager;
/**
* 执行一个事务方法
* @param baseTran 事务类
* @return 执行结果
*/
public boolean useTran(Runnable baseTran) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
baseTran.run();
transactionManager.commit(status);
return true;
} catch (Exception e) {
transactionManager.rollback(status);
return false;
}
}
}

View File

@ -101,9 +101,9 @@ public class HttpUtils {
HttpGet httpGet = new HttpGet(url);
// 设置超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000)
.setConnectionRequestTimeout(1000)
.setSocketTimeout(5000).build();
.setConnectTimeout(15000)
.setConnectionRequestTimeout(15000)
.setSocketTimeout(15000).build();
httpGet.setConfig(requestConfig);
for(Map.Entry<String, String> entry : header.entrySet()){
@ -153,9 +153,9 @@ public class HttpUtils {
httpClient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000)
.setConnectionRequestTimeout(5000)
.setSocketTimeout(5000).build();
.setConnectTimeout(15000)
.setConnectionRequestTimeout(15000)
.setSocketTimeout(15000).build();
httppost.setConfig(requestConfig);
httppost.setHeader("Content-Type", "application/json;charset=UTF-8");
if (StringUtils.isEmpty(token) && StringUtils.isNotEmpty(userName) && StringUtils.isNotEmpty(password)) {
@ -197,9 +197,9 @@ public class HttpUtils {
httpClient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000)
.setConnectionRequestTimeout(1000)
.setSocketTimeout(5000).build();
.setConnectTimeout(15000)
.setConnectionRequestTimeout(15000)
.setSocketTimeout(15000).build();
httppost.setConfig(requestConfig);
httppost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
if (StringUtils.isEmpty(token) && StringUtils.isNotEmpty(userName) && StringUtils.isNotEmpty(password)) {

View File

@ -1,6 +1,8 @@
package com.wms.utils;
import com.alibaba.fastjson2.JSON;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
/**
* WMS字符串工具类
@ -27,6 +29,7 @@ public class StringUtils {
*/
public static String toUnderScoreCase(String str)
{
ApplicationContext applicationContext = SpringApplication.run(StringUtils.class);
if (str == null)
{
return null;
@ -140,4 +143,34 @@ public class StringUtils {
public static String padRight(String value, int size, String padStr) {
return org.apache.commons.lang3.StringUtils.rightPad(value, size, padStr);
}
/**
* 时长格式化最高xx天xx小时xx分xx秒
* @param origin
* @return 格式化字符串
*/
public static String durationFormat(Long origin) {
long dayDiv = 60 * 60 * 24;
long hourDiv = 60 * 60;
long minuteDiv = 60;
long days = origin / dayDiv;
long hours = (origin % dayDiv) / hourDiv;
long minutes = (origin % hourDiv) / minuteDiv;
long seconds = origin % minuteDiv;
String finalStr = "";
if (days > 0) {
finalStr += days + "";
}
if (hours > 0) {
finalStr += hours + "小时";
}
if (minutes > 0) {
finalStr += minutes + "分钟";
}
if (seconds > 0) {
finalStr += seconds + "";
}
return finalStr;
}
}

View File

@ -102,6 +102,12 @@ public class UploadBaseGoodsListener implements ReadListener<BaseGoodsExcelVo> {
tempGoods.setNeedInventory(goodsExcelVo.getNeedInventory());
tempGoods.setHaveSled(goodsExcelVo.getHaveSled());
tempGoods.setSledDays(goodsExcelVo.getSledDays());
if (StringUtils.isEmpty(goodsExcelVo.getIndicator())) {
tempGoods.setIndicator(1);
} else {
tempGoods.setIndicator(3);
}
tempGoods.setLastUpdateTime(LocalDateTime.now());
tempGoods.setLastUpdateUser(uploadUser);
goodsList.add(tempGoods);

View File

@ -3,6 +3,7 @@ package com.wms.utils.excel.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.wms.constants.enums.ConfigMapKeyEnum;
import com.wms.entity.table.KateDBS;
import com.wms.service.KateDBSService;
import com.wms.utils.StringUtils;
@ -15,6 +16,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.config.InitLocalConfig.localWorkDateList;
import static com.wms.utils.WmsUtils.generateId;
/**
@ -32,21 +35,25 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
private final Map<String, KateDBS> oldKateDBSMap;// 旧的DBS数据
private final Map<String, KateDBS> newKateDBSMap = new HashMap<>();// 新的DBS数据
private final int maxSequence;
private final boolean isAddReqmtDate;
public UploadDbsListener(KateDBSService kateDBSService, Map<String, KateDBS> oldKateDBSMap, String uploadUser, boolean isAddReqmtDate) {
private boolean isAddReqmtDate = false;
public UploadDbsListener(KateDBSService kateDBSService, Map<String, KateDBS> oldKateDBSMap, String uploadUser) {
this.kateDBSService = kateDBSService;
this.oldKateDBSMap = oldKateDBSMap;
this.uploadUser = uploadUser;
this.isAddReqmtDate = isAddReqmtDate;
// 获取最大序列号
maxSequence = oldKateDBSMap.values().stream().mapToInt(KateDBS::getWorkSequence).max().orElse(0);
// 查询配置是否使用默认开工日期
String useReqmtDate = configMap.get(ConfigMapKeyEnum.USE_REQUIRE_DATE.getConfigKey());
if (!StringUtils.isEmpty(useReqmtDate) && useReqmtDate.equals("1")) {
isAddReqmtDate = true;
}
}
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
int rowCount = context.readRowHolder().getRowIndex() + 1;
logger.error("处理Dbs数据发生异常第{}行发生异常。", rowCount);
throw new Exception("" + rowCount + "行数据异常");
throw new Exception("" + rowCount + "行数据异常" + exception.getMessage());
}
/**
@ -60,14 +67,25 @@ public class UploadDbsListener implements ReadListener<KateDbsExcelVo> {
if (kateDbsExcelVo.getWorkSequence() != null
&& StringUtils.isNotEmpty(kateDbsExcelVo.getWorkOrder())
&& StringUtils.isNotEmpty(kateDbsExcelVo.getMachineNo())) {
if(!isAddReqmtDate){
if(kateDbsExcelVo.getPlanStartDate() != null){
int rowCount = analysisContext.readRowHolder().getRowIndex() + 1;
if (kateDbsExcelVo.getPlanStartDate() != null) {
// 需要判断日期是否在配置的工作日历里面
int indexOfCurrentDate = localWorkDateList.indexOf(kateDbsExcelVo.getPlanStartDate().toLocalDate());
if (indexOfCurrentDate == -1) {
// 工作日不包含此开工日期
logger.error("第{}行DBS开工日期为非工作日。", rowCount);
throw new RuntimeException("" + rowCount + "行DBS开工日期" + kateDbsExcelVo.getPlanStartDate().toLocalDate() + "为非工作日。");
}
cachedDataList.add(kateDbsExcelVo);
} else {
if (!isAddReqmtDate) {
// 缺少开工日期
logger.error("第{}行DBS缺少开工日期。", rowCount);
throw new RuntimeException("" + rowCount + "行DBS缺少开工日期。");
} else {
cachedDataList.add(kateDbsExcelVo);
}
}else{
cachedDataList.add(kateDbsExcelVo);
}
}
// 达到BATCH_COUNT了需要去存储一次数据库防止数据几万条数据在内存容易OOM
if (cachedDataList.size() >= BATCH_COUNT) {

View File

@ -12,9 +12,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import static com.wms.config.InitLocalConfig.configMap;
import static com.wms.config.InitLocalConfig.localWorkDateList;
import static com.wms.utils.WmsUtils.generateId;
/**
@ -35,20 +37,23 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
private final String uploadUser;// 用户
private final Map<String, KateOrders> oldKateOrdersMap;// 旧的工单数据
private final Map<String, KateOrders> newKateOrdersMap = new HashMap<>();// 新的工单数据
private final boolean isAddReqmtDate;
public UploadKateOrdersListener(KateOrdersService kateOrdersService, Map<String, KateOrders> oldKateOrdersMap, String uploadUser, boolean isAddReqmtDate) {
private boolean isAddReqmtDate = false;
public UploadKateOrdersListener(KateOrdersService kateOrdersService, Map<String, KateOrders> oldKateOrdersMap, String uploadUser) {
this.kateOrdersService = kateOrdersService;
this.oldKateOrdersMap = oldKateOrdersMap;
this.uploadUser = uploadUser;
this.isAddReqmtDate = isAddReqmtDate;
// 查询配置是否使用默认开工日期
String useReqmtDate = configMap.get(ConfigMapKeyEnum.USE_REQUIRE_DATE.getConfigKey());
if (!StringUtils.isEmpty(useReqmtDate) && useReqmtDate.equals("1")) {
isAddReqmtDate = true;
}
}
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
int rowCount = context.readRowHolder().getRowIndex() + 1;
logger.error("处理工单数据发生异常,第{}行发生异常。", rowCount);
throw new Exception("" + rowCount + "行数据异常");
throw new Exception("" + rowCount + "行数据异常" + exception.getMessage());
}
/**
@ -67,13 +72,24 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
&& StringUtils.isNotEmpty(kateOrdersExcelVo.getSupplyArea())
&& kateOrdersExcelVo.getRequirementQuantity() != null
&& kateOrdersExcelVo.getRequirementQuantity().compareTo(BigDecimal.ZERO) > 0) {
if(isAddReqmtDate){
if(kateOrdersExcelVo.getPlanStartDate() != null){
int rowCount = analysisContext.readRowHolder().getRowIndex() + 1;
if (kateOrdersExcelVo.getPlanStartDate() != null) {
// 需要判断日期是否在配置的工作日历里面
int indexOfCurrentDate = localWorkDateList.indexOf(kateOrdersExcelVo.getPlanStartDate());
if (indexOfCurrentDate == -1) {
// 工作日不包含此开工日期
logger.error("第{}行工单需求日期为非工作日。", rowCount);
throw new RuntimeException("" + rowCount + "行工单需求日期" + kateOrdersExcelVo.getPlanStartDate() + "为非工作日。");
}
cachedDataList.add(kateOrdersExcelVo);
} else {
if (isAddReqmtDate) {
// 缺少开工日期
logger.error("第{}行工单缺少需求日期。", rowCount);
throw new RuntimeException("" + rowCount + "行工单缺少需求日期。");
} else {
cachedDataList.add(kateOrdersExcelVo);
}
}else {
// 符合条件
cachedDataList.add(kateOrdersExcelVo);
}
}
}
@ -103,7 +119,7 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
*/
private void saveData() {
for (KateOrdersExcelVo kateOrdersExcelVo : cachedDataList) {
String key = kateOrdersExcelVo.getWorkOrder() + kateOrdersExcelVo.getGoodsId() + kateOrdersExcelVo.getSupplyArea();
String key = kateOrdersExcelVo.getWorkOrder() + "_" + kateOrdersExcelVo.getGoodsId() + "_" + kateOrdersExcelVo.getSupplyArea();
if (newKateOrdersMap.containsKey(key)) {
KateOrders currentOrder = newKateOrdersMap.get(key);
// 设定数量
@ -112,32 +128,52 @@ public class UploadKateOrdersListener implements ReadListener<KateOrdersExcelVo>
newKateOrdersMap.replace(key, currentOrder);
continue;
}
// 查询数据库是否存在重复数据
if (!oldKateOrdersMap.containsKey(key)) {
// 之前没存在过
KateOrders newKateOrders = new KateOrders();
newKateOrders.setOrderId(generateId("ORDER_"));
newKateOrders.setWorkOrder(kateOrdersExcelVo.getWorkOrder());
newKateOrders.setGoodsId(kateOrdersExcelVo.getGoodsId());
newKateOrders.setItem(kateOrdersExcelVo.getItem());
newKateOrders.setDescription(kateOrdersExcelVo.getDescription());
newKateOrders.setSLoc(kateOrdersExcelVo.getSLoc());
newKateOrders.setType(kateOrdersExcelVo.getType());
newKateOrders.setOriginStatus(kateOrdersExcelVo.getOriginStatus());
newKateOrders.setSupplyArea(kateOrdersExcelVo.getSupplyArea());
newKateOrders.setSortString(kateOrdersExcelVo.getSortString());
newKateOrders.setRequirementQuantity(kateOrdersExcelVo.getRequirementQuantity());
newKateOrders.setGoodsUnit(kateOrdersExcelVo.getGoodsUnit());
newKateOrders.setOrderStatus(0);
newKateOrders.setLackQuantity(kateOrdersExcelVo.getRequirementQuantity());
newKateOrders.setPickedQuantity(BigDecimal.ZERO);
newKateOrders.setUserName(uploadUser);
//计划开工时间这个替换后面的dbs的计划开始时间
if(isAddReqmtDate) {
newKateOrders.setPlanStartDate(kateOrdersExcelVo.getPlanStartDate());
if (oldKateOrdersMap.containsKey(key)) {
KateOrders oldOrder = oldKateOrdersMap.get(key);
if (oldOrder.getOrderStatus() == 0) {
oldOrder.setItem(kateOrdersExcelVo.getItem());
oldOrder.setDescription(kateOrdersExcelVo.getDescription());
oldOrder.setSLoc(kateOrdersExcelVo.getSLoc());
oldOrder.setType(kateOrdersExcelVo.getType());
oldOrder.setOriginStatus(kateOrdersExcelVo.getOriginStatus());
oldOrder.setSortString(kateOrdersExcelVo.getSortString());
oldOrder.setRequirementQuantity(kateOrdersExcelVo.getRequirementQuantity());
oldOrder.setGoodsUnit(kateOrdersExcelVo.getGoodsUnit());
oldOrder.setLackQuantity(kateOrdersExcelVo.getRequirementQuantity());
oldOrder.setPickedQuantity(BigDecimal.ZERO);
oldOrder.setUserName(uploadUser);
oldOrder.setLastUpdateTime(LocalDateTime.now());
oldOrder.setLastUpdateReason("导入工单");
//计划开工时间这个替换后面的dbs的计划开始时间
oldOrder.setPlanStartDate(kateOrdersExcelVo.getPlanStartDate());
newKateOrdersMap.put(key, oldOrder);
}
newKateOrdersMap.put(key, newKateOrders);
continue;
}
// 之前没存在过
KateOrders newKateOrders = new KateOrders();
newKateOrders.setOrderId(generateId("ORDER_"));
newKateOrders.setWorkOrder(kateOrdersExcelVo.getWorkOrder());
newKateOrders.setGoodsId(kateOrdersExcelVo.getGoodsId());
newKateOrders.setItem(kateOrdersExcelVo.getItem());
newKateOrders.setDescription(kateOrdersExcelVo.getDescription());
newKateOrders.setSLoc(kateOrdersExcelVo.getSLoc());
newKateOrders.setType(kateOrdersExcelVo.getType());
newKateOrders.setOriginStatus(kateOrdersExcelVo.getOriginStatus());
newKateOrders.setSupplyArea(kateOrdersExcelVo.getSupplyArea());
newKateOrders.setSortString(kateOrdersExcelVo.getSortString());
newKateOrders.setRequirementQuantity(kateOrdersExcelVo.getRequirementQuantity());
newKateOrders.setGoodsUnit(kateOrdersExcelVo.getGoodsUnit());
newKateOrders.setOrderStatus(0);
newKateOrders.setLackQuantity(kateOrdersExcelVo.getRequirementQuantity());
newKateOrders.setPickedQuantity(BigDecimal.ZERO);
newKateOrders.setUserName(uploadUser);
newKateOrders.setCreateTime(LocalDateTime.now());
newKateOrders.setLastUpdateTime(LocalDateTime.now());
newKateOrders.setLastUpdateReason("导入工单");
//计划开工时间这个替换后面的dbs的计划开始时间
newKateOrders.setPlanStartDate(kateOrdersExcelVo.getPlanStartDate());
newKateOrdersMap.put(key, newKateOrders);
}
}

View File

@ -5,6 +5,7 @@ import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wms.config.InitLocalConfig;
import com.wms.entity.table.WorkStationConfig;
import com.wms.service.WorkStationConfigService;
import com.wms.utils.StringUtils;
@ -17,6 +18,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.wms.utils.WmsUtils.generateId;
@ -119,5 +121,8 @@ public class UploadStationConfigListener implements ReadListener<StationConfigEx
// 保存数据
workStationConfigService.saveOrUpdateBatch(newWorkStationConfigMap.values(), BATCH_COUNT);
logger.info("保存成功{}条数据。", newWorkStationConfigMap.size());
// 生成小盒子号对应开工日期调整Map
InitLocalConfig.smallBoxDateAdjustMap = workStationConfigService.list().stream().collect(Collectors.toMap(WorkStationConfig::getSmallBox, WorkStationConfig::getStartDateAdjust));
logger.info("生成小盒子号对应开工日期调整Map成功。");
}
}

View File

@ -11,6 +11,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -28,7 +29,6 @@ public class UploadWorkDateListener implements ReadListener<WorkDateExcelVo> {
private static final int BATCH_COUNT = 100;
private List<WorkDateExcelVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
private final WorkDateService workDateService;// 工作日服务
private int key = 1;// 主键
private final Map<LocalDate, WorkDate> newWorkDateMap = new HashMap<>();// 新的工作日
public UploadWorkDateListener(WorkDateService workDateService) {
this.workDateService = workDateService;
@ -86,11 +86,9 @@ public class UploadWorkDateListener implements ReadListener<WorkDateExcelVo> {
}
// 创建一个新的工作日历对象
WorkDate workDate = new WorkDate();
workDate.setKeyId(key);
workDate.setWorkDate(workDateExcelVo.getWorkDate());
workDate.setRemark(workDateExcelVo.getRemark());
newWorkDateMap.put(workDateExcelVo.getWorkDate(), workDate);
key++;
}
}
@ -99,11 +97,10 @@ public class UploadWorkDateListener implements ReadListener<WorkDateExcelVo> {
*/
private void insertIntoDb() {
logger.info("此次共导入{}条数据。", newWorkDateMap.size());
// 保存数据
workDateService.saveOrUpdateBatch(newWorkDateMap.values(), BATCH_COUNT);
// 先移除之前的数据
if (!workDateService.updateWorkDate(new ArrayList<>(newWorkDateMap.values()))) {
throw new RuntimeException("保存数据库失败。");
}
logger.info("保存成功{}条数据。", newWorkDateMap.size());
// 生成工作日历
localWorkDateList = workDateService.list(new LambdaQueryWrapper<WorkDate>().orderByAsc(WorkDate::getWorkDate)).stream().map(WorkDate::getWorkDate).distinct().toList();
logger.info("生成工作日历Map成功。");
}
}

View File

@ -91,4 +91,9 @@ public class BaseGoodsExcelVo {
*/
@ExcelProperty("补料方式")
private String feedingType;
/**
* 盘点指示器
*/
@ExcelProperty("indicator")
private String indicator;
}

View File

@ -3,10 +3,7 @@ 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.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.wms.entity.table.KateOrders;
import com.wms.entity.table.Location;
import lombok.Data;
import java.math.BigDecimal;

View File

@ -0,0 +1,98 @@
package com.wms.utils.excel.vo;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.wms.constants.enums.PickTaskStatusEnum;
import com.wms.entity.table.PickTaskRecord;
import com.wms.utils.StringUtils;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Objects;
/**
* 拣选任务记录excelVo
*/
@Data
public class PickTaskRecordExcelVo {
/**
* 拣选任务号
*/
@ExcelProperty("拣选任务号")
private String pickTaskId;
/**
* 载具号
*/
@ExcelProperty("载具号")
private String vehicleId;
/**
* 站台号
*/
@ExcelProperty("站台号")
private String standId;
/**
* 拣选任务状态
* -1暂时不可发送
* 0初始化
* 1已发送
* 2已完成
*/
@ExcelProperty("拣选任务状态")
private String pickStatus;
/**
* 到达时间
*/
@ExcelProperty("到达时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime arriveTime;
/**
* 最近更新时间
*/
@ExcelProperty("离开时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastUpdateTime;
/**
* 机型
* 1: 装载机2: 平地机
*/
@ExcelProperty("机型")
private String machineType;
/**
* 区域类型
* 1: 2:
*/
@ExcelProperty("区域类型")
private String areaType;
/**
* 滞留时长
*/
@ExcelProperty("滞留时长")
private String useTime;
/**
* 创建vo
* @param pickTaskRecord po
* @return vo
*/
public static PickTaskRecordExcelVo fromPo(PickTaskRecord pickTaskRecord) {
PickTaskRecordExcelVo pickTaskRecordExcelVo = new PickTaskRecordExcelVo();
pickTaskRecordExcelVo.setPickTaskId(pickTaskRecord.getPickTaskId());
pickTaskRecordExcelVo.setVehicleId(pickTaskRecord.getVehicleId());
pickTaskRecordExcelVo.setStandId(pickTaskRecord.getStandId());
pickTaskRecordExcelVo.setPickStatus(PickTaskStatusEnum.getValueByCode(pickTaskRecord.getPickStatus()));
pickTaskRecordExcelVo.setLastUpdateTime(pickTaskRecord.getLastUpdateTime());
pickTaskRecordExcelVo.setArriveTime(pickTaskRecord.getArriveTime());
pickTaskRecordExcelVo.setMachineType(Objects.equals(pickTaskRecord.getMachineType(), 1) ? "装载机" : "平地机");
pickTaskRecordExcelVo.setAreaType(Objects.equals(pickTaskRecord.getAreaType(), 1) ? "" : "");
if (pickTaskRecord.getArriveTime() != null && pickTaskRecord.getLastUpdateTime() != null) {
pickTaskRecordExcelVo.setUseTime(StringUtils.durationFormat(pickTaskRecord.getArriveTime().until(pickTaskRecord.getLastUpdateTime(), ChronoUnit.SECONDS)));
} else {
pickTaskRecordExcelVo.setUseTime("到达时间与离开时间中有一个错误。");
}
return pickTaskRecordExcelVo;
}
}

View File

@ -1,8 +1,8 @@
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.alibaba.fastjson2.JSON;
import com.wms.entity.table.Vehicle;
import lombok.Data;
@ -36,6 +36,16 @@ public class VehicleExcelVo {
@ExcelProperty("上次入库时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastInTime;
/**
* 载具类型
*/
@ExcelProperty("载具类型")
private String vehicleType;
/**
* 间接物料列表
*/
@ExcelProperty("料号列表")
private String goodsInfo;
/**
* 从数据库实体转换为excel对象
@ -43,6 +53,14 @@ public class VehicleExcelVo {
* @return excel对象
*/
public static VehicleExcelVo of(Vehicle vehiclePo) {
return BeanUtil.copyProperties(vehiclePo, VehicleExcelVo.class);
VehicleExcelVo tempVo = new VehicleExcelVo();
tempVo.setVehicleId(vehiclePo.getVehicleId());
tempVo.setCurrentLocation(vehiclePo.getCurrentLocation());
tempVo.setVehicleStatus(vehiclePo.getVehicleStatus());
tempVo.setIsEmpty(vehiclePo.getIsEmpty());
tempVo.setLastInTime(vehiclePo.getLastInTime());
tempVo.setVehicleType(vehiclePo.getVehicleType());
tempVo.setGoodsInfo(JSON.toJSONString(vehiclePo.getGoodsInfo()));
return tempVo;
}
}

View File

@ -59,6 +59,8 @@ mybatis-plus:
logging:
config: classpath:logback.xml
reqmtsDate: false
# file:
# encoding: UTF-8