diff --git a/src/main/java/com/glxp/udi/admin/constant/ConstantStatus.java b/src/main/java/com/glxp/udi/admin/constant/ConstantStatus.java index 50b40cd..c6e05bd 100644 --- a/src/main/java/com/glxp/udi/admin/constant/ConstantStatus.java +++ b/src/main/java/com/glxp/udi/admin/constant/ConstantStatus.java @@ -57,4 +57,15 @@ public class ConstantStatus { public static final int FROM_UDIWMS = 9; public static final int FROM_COPY = 10; //单据复制 + //建垛规则启用状态 + /** + * 禁用 + */ + public static final int STACK_RULES_DISABLE = 0; + + /** + * 启用 + */ + public static final int STACK_RULES_ENABLE = 1; + } diff --git a/src/main/java/com/glxp/udi/admin/controller/basic/StackRulesController.java b/src/main/java/com/glxp/udi/admin/controller/basic/StackRulesController.java index 16b3212..99428b3 100644 --- a/src/main/java/com/glxp/udi/admin/controller/basic/StackRulesController.java +++ b/src/main/java/com/glxp/udi/admin/controller/basic/StackRulesController.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.glxp.udi.admin.common.enums.ResultEnum; import com.glxp.udi.admin.common.res.BaseResponse; import com.glxp.udi.admin.common.util.ResultVOUtils; +import com.glxp.udi.admin.constant.ConstantStatus; import com.glxp.udi.admin.entity.basic.StackRulesEntity; import com.glxp.udi.admin.req.basic.FilterStackRulesRequest; import com.glxp.udi.admin.req.inout.DeleteRequest; @@ -27,7 +28,7 @@ import javax.annotation.Resource; public class StackRulesController { @Resource - private StackRulesService stockRulesService; + private StackRulesService stackRulesService; /** * 查询建垛规则列表 @@ -37,7 +38,7 @@ public class StackRulesController { */ @GetMapping("/udims/stackRules/filter") public BaseResponse filterStockRules(FilterStackRulesRequest filterStockRulesRequest) { - IPage page = stockRulesService.filter(filterStockRulesRequest); + IPage page = stackRulesService.filter(filterStockRulesRequest); PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); pageSimpleResponse.setList(page.getRecords()); pageSimpleResponse.setTotal(page.getTotal()); @@ -47,28 +48,51 @@ public class StackRulesController { /** * 添加建垛规则 * - * @param stockRulesEntity + * @param stackRulesEntity * @return */ @PostMapping("/udims/stackRules/add") - public BaseResponse addStockRules(@RequestBody StackRulesEntity stockRulesEntity) { - stockRulesService.addStackRules(stockRulesEntity); + public BaseResponse addStockRules(@RequestBody StackRulesEntity stackRulesEntity) { + //判断此规则是否重复 + boolean exists = stackRulesService.exists(stackRulesEntity); + if (exists) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "规则重复"); + } + if (stackRulesEntity.getStatus().equals(ConstantStatus.STACK_RULES_ENABLE)) { + //判断当前用户是否已存在启用的规则 + Long count = stackRulesService.countEnableRules(stackRulesEntity.getCustomerId()); + if (count > 0) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "已有启用规则"); + } + } + stackRulesService.addStackRules(stackRulesEntity); return ResultVOUtils.success(); } /** * 更新建垛规则 * - * @param stockRulesEntity + * @param stackRulesEntity * @return */ @PostMapping("/udims/stackRules/update") - public BaseResponse updateStockRules(@RequestBody StackRulesEntity stockRulesEntity, BindingResult bindingResult) { + public BaseResponse updateStockRules(@RequestBody StackRulesEntity stackRulesEntity, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); } - - stockRulesService.updateStackRules(stockRulesEntity); + //判断此规则是否重复 + boolean exists = stackRulesService.exists(stackRulesEntity); + if (exists) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "规则重复"); + } + if (stackRulesEntity.getStatus().equals(ConstantStatus.STACK_RULES_ENABLE)) { + //判断当前用户是否已存在启用的规则 + Long count = stackRulesService.countEnableRules(stackRulesEntity.getCustomerId()); + if (count > 0) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "已有启用规则"); + } + } + stackRulesService.updateStackRules(stackRulesEntity); return ResultVOUtils.success("更新成功"); } @@ -83,7 +107,7 @@ public class StackRulesController { if (null == deleteRequest || StrUtil.isBlank(deleteRequest.getId())) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL); } - stockRulesService.delete(deleteRequest.getId()); + stackRulesService.delete(deleteRequest.getId()); return ResultVOUtils.success("删除成功"); } diff --git a/src/main/java/com/glxp/udi/admin/controller/inout/UdiInfoController.java b/src/main/java/com/glxp/udi/admin/controller/inout/UdiInfoController.java index 754c631..a443abb 100644 --- a/src/main/java/com/glxp/udi/admin/controller/inout/UdiInfoController.java +++ b/src/main/java/com/glxp/udi/admin/controller/inout/UdiInfoController.java @@ -53,7 +53,7 @@ public class UdiInfoController { if (StrUtil.isNotBlank(productInfoFilterRequest.getUdiCode())) { UdiEntity udiEntity = FilterUdiUtils.getUdi(productInfoFilterRequest.getUdiCode()); if (udiEntity != null) { - nameCode = udiEntity.getUdi(); + nameCode = udiEntity.getNameCode(); } else { return ResultVOUtils.error(500, "无效UDI码"); } diff --git a/src/main/java/com/glxp/udi/admin/controller/inout/UdiTraceController.java b/src/main/java/com/glxp/udi/admin/controller/inout/UdiTraceController.java index d94662c..b77b5f7 100644 --- a/src/main/java/com/glxp/udi/admin/controller/inout/UdiTraceController.java +++ b/src/main/java/com/glxp/udi/admin/controller/inout/UdiTraceController.java @@ -59,7 +59,7 @@ public class UdiTraceController { if (null == udiEntity) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "UDI码格式错误!"); } - UdiInfoEntity udiInfo = udiInfoService.findByNameCode(udiEntity.getUdi(), customerId); + UdiInfoEntity udiInfo = udiInfoService.findByNameCode(udiEntity.getNameCode(), customerId); if (null == udiInfo) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "此产品信息在耗材字典中不存在"); } @@ -125,7 +125,7 @@ public class UdiTraceController { if (udiEntity == null) { return ResultVOUtils.error(500, "UDI码格式错误!"); } - UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udiEntity.getUdi(), customerId); + UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udiEntity.getNameCode(), customerId); if (null == udiInfoEntity) { //码在耗材字典中不存在 return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "此产品信息在耗材字典中不存在"); @@ -162,7 +162,7 @@ public class UdiTraceController { UdiEntity udiEntity = FilterUdiUtils.getUdi(code); List invProductDetailEntities; if (udiEntity.getSerialNo() != null) { //有序列号 - UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udiEntity.getUdi(), warehouseQueryRequest.getCustomerId() + ""); + UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udiEntity.getNameCode(), warehouseQueryRequest.getCustomerId() + ""); if (null == udiInfoEntity) { return Collections.emptyList(); } @@ -191,7 +191,7 @@ public class UdiTraceController { return null; } } else { - UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udiEntity.getUdi(), warehouseQueryRequest.getCustomerId() + ""); + UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udiEntity.getNameCode(), warehouseQueryRequest.getCustomerId() + ""); if (udiInfoEntity == null) { return null; } diff --git a/src/main/java/com/glxp/udi/admin/controller/inout/WareHouseController.java b/src/main/java/com/glxp/udi/admin/controller/inout/WareHouseController.java index 288f405..8b10823 100644 --- a/src/main/java/com/glxp/udi/admin/controller/inout/WareHouseController.java +++ b/src/main/java/com/glxp/udi/admin/controller/inout/WareHouseController.java @@ -239,11 +239,11 @@ public class WareHouseController { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL); } UdiEntity udi = FilterUdiUtils.getUdi(codesReplaceRequest.getCode()); - if (null == udi || StrUtil.isBlank(udi.getUdi())) { + if (null == udi || StrUtil.isBlank(udi.getNameCode())) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "条码错误"); } //判断udi码是否在产品信息中已维护,如未维护则返回错误,否则库存无法对应 - UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udi.getUdi(), authAdminService.getCurrentUserCustomerId()); + UdiInfoEntity udiInfoEntity = udiInfoService.findByNameCode(udi.getNameCode(), authAdminService.getCurrentUserCustomerId()); if (null == udiInfoEntity) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "产品未维护"); } @@ -423,7 +423,7 @@ public class WareHouseController { warehousetempEntity.setBatchNo(udiEntity.getBatchNo()); warehousetempEntity.setProduceDate(udiEntity.getProduceDate()); warehousetempEntity.setLocStorageCode(addOrderRequest.getInvWarehouseCode()); - warehousetempEntity.setNameCode(udiEntity.getUdi()); + warehousetempEntity.setNameCode(udiEntity.getNameCode()); warehousetempEntity.setExpireDate(udiEntity.getExpireDate()); warehousetempEntity.setSerialNo(udiEntity.getSerialNo()); warehousetempEntity.setLocStorageCode(addOrderRequest.getLocStorageCode()); @@ -499,7 +499,7 @@ public class WareHouseController { return drugCodeSelectEntity; } UdiEntity originUdiEntity = FilterUdiUtils.getUdi(drugCodeSelectEntity.getCode()); - if (!StrUtil.emptyIfNull(originUdiEntity.getUdi()).equals(StrUtil.emptyIfNull(udiEntity.getUdi()))) { + if (!StrUtil.emptyIfNull(originUdiEntity.getNameCode()).equals(StrUtil.emptyIfNull(udiEntity.getNameCode()))) { continue; } if (!StrUtil.emptyIfNull(originUdiEntity.getBatchNo()).toUpperCase(Locale.ROOT).equals(StrUtil.emptyIfNull(udiEntity.getBatchNo()).toUpperCase(Locale.ROOT))) { diff --git a/src/main/java/com/glxp/udi/admin/controller/product/StackOrderController.java b/src/main/java/com/glxp/udi/admin/controller/product/StackOrderController.java index 33d2fde..4c03e34 100644 --- a/src/main/java/com/glxp/udi/admin/controller/product/StackOrderController.java +++ b/src/main/java/com/glxp/udi/admin/controller/product/StackOrderController.java @@ -2,6 +2,7 @@ package com.glxp.udi.admin.controller.product; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.glxp.udi.admin.annotation.AuthRuleAnnotation; @@ -176,13 +177,10 @@ public class StackOrderController { if (StrUtil.isBlank(importStackOrderRequest.getFilePath())) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "请上传文件!"); } - try { + ThreadUtil.execAsync(() -> { stackOrderService.importStackOrder(importStackOrderRequest.getFilePath()); - return ResultVOUtils.success(); - } catch (Exception e) { - log.error("导入建垛失败", e); - } - return ResultVOUtils.error(500, "建垛失败"); + }); + return ResultVOUtils.success("导入成功"); } diff --git a/src/main/java/com/glxp/udi/admin/entity/basic/StackRulesEntity.java b/src/main/java/com/glxp/udi/admin/entity/basic/StackRulesEntity.java index 63b3180..fc5fd9c 100644 --- a/src/main/java/com/glxp/udi/admin/entity/basic/StackRulesEntity.java +++ b/src/main/java/com/glxp/udi/admin/entity/basic/StackRulesEntity.java @@ -4,6 +4,10 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.glxp.udi.admin.util.serializer.LongJsonDeserializer; +import com.glxp.udi.admin.util.serializer.LongJsonSerializer; import lombok.Data; import javax.validation.constraints.NotNull; @@ -33,6 +37,8 @@ public class StackRulesEntity { * 客户ID */ @TableField(value = "customerId") + @JsonSerialize(using = LongJsonSerializer.class) + @JsonDeserialize(using = LongJsonDeserializer.class) private Long customerId; /** diff --git a/src/main/java/com/glxp/udi/admin/entity/product/StackCode.java b/src/main/java/com/glxp/udi/admin/entity/product/StackCode.java index a562e86..5480c63 100644 --- a/src/main/java/com/glxp/udi/admin/entity/product/StackCode.java +++ b/src/main/java/com/glxp/udi/admin/entity/product/StackCode.java @@ -15,9 +15,42 @@ public class StackCode { @TableId(type = IdType.AUTO) private Integer id; + + /** + * 码 + */ private String code; + + /** + * 垛号 + */ private String orderIdFk; + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private String produceDate; + + /** + * 失效日期 + */ + private String expireDate; + + /** + * 序列号 + */ + private String serialNo; + + /** + * 产品DI标识 + */ + private String nameCode; + public StackCode() { } diff --git a/src/main/java/com/glxp/udi/admin/entity/product/StackOrder.java b/src/main/java/com/glxp/udi/admin/entity/product/StackOrder.java index 484fce5..52d620a 100644 --- a/src/main/java/com/glxp/udi/admin/entity/product/StackOrder.java +++ b/src/main/java/com/glxp/udi/admin/entity/product/StackOrder.java @@ -18,15 +18,67 @@ public class StackOrder { @TableId(type = IdType.AUTO) private Integer id; + + /** + * 垛号 + */ private String orderId; + + /** + * 名称 + */ private String name; + + /** + * 导出状态 0:未导出 1:已导出 + */ private Integer exportStatus; + + /** + * 状态 + */ private Integer status; + /** + * 创建时间 + */ @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; + /** + * 更新时间 + */ @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; + + /** + * 客户ID + */ private String customerId; + + /** + * 批次号 + */ + private String batchNo; + + /** + * 生产日期 + */ + private String produceDate; + + /** + * 失效日期 + */ + private String expireDate; + + /** + * 序列号 + */ + private String serialNo; + + /** + * 产品DI标识 + */ + private String nameCode; + } diff --git a/src/main/java/com/glxp/udi/admin/entity/udid/UdiEntity.java b/src/main/java/com/glxp/udi/admin/entity/udid/UdiEntity.java index f51c8ad..8b1b31e 100644 --- a/src/main/java/com/glxp/udi/admin/entity/udid/UdiEntity.java +++ b/src/main/java/com/glxp/udi/admin/entity/udid/UdiEntity.java @@ -1,59 +1,34 @@ package com.glxp.udi.admin.entity.udid; -/** - * @author 彭于晏 - * @date 2020/9/22. - */ +import lombok.Data; + +@Data public class UdiEntity { + /** + * 批次号 + */ private String batchNo; + /** + * 生产日期 + */ private String produceDate; + /** + * 失效日期 + */ private String expireDate; + /** + * 序列号 + */ private String serialNo; - private String udi; - - public String getBatchNo() { - return batchNo; - } - - public void setBatchNo(String batchNo) { - this.batchNo = batchNo; - } - - public String getProduceDate() { - return produceDate; - } - - public void setProduceDate(String produceDate) { - this.produceDate = produceDate; - } - - public String getExpireDate() { - return expireDate; - } - - public void setExpireDate(String expireDate) { - this.expireDate = expireDate; - } - - public String getSerialNo() { - return serialNo; - } - - public void setSerialNo(String serialNo) { - this.serialNo = serialNo; - } - - public String getUdi() { - return udi; - } - public void setUdi(String udi) { - this.udi = udi; - } + /** + * DI标识 + */ + private String nameCode; } diff --git a/src/main/java/com/glxp/udi/admin/service/basic/StackRulesService.java b/src/main/java/com/glxp/udi/admin/service/basic/StackRulesService.java index fbc61d4..0c26b52 100644 --- a/src/main/java/com/glxp/udi/admin/service/basic/StackRulesService.java +++ b/src/main/java/com/glxp/udi/admin/service/basic/StackRulesService.java @@ -14,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; +import java.util.List; /** * 建垛规则Service @@ -67,6 +68,34 @@ public class StackRulesService { stackRulesDao.insert(stackRulesEntity); } + /** + * 判断此建垛规则是否存在 + * + * @param stackRules + * @return + */ + public boolean exists(StackRulesEntity stackRules) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("id", "name") + .eq("name", stackRules.getName()) + .eq("customerId", stackRules.getCustomerId()); + List stackRulesEntities = stackRulesDao.selectList(wrapper); + if (stackRulesEntities.size() > 0) { + if (null != stackRules.getId()) { + //更新,判断此规则是否为当前参数数据 + for (StackRulesEntity stackRulesEntity : stackRulesEntities) { + if (!stackRulesEntity.getId().equals(stackRules.getId())) { + return true; + } + } + } else { + //新增,此规则已存在 + return true; + } + } + return false; + } + /** * 更新建垛规则 * @@ -99,4 +128,14 @@ public class StackRulesService { return stackRulesEntity; } + /** + * @param customerId + * @return + */ + public Long countEnableRules(Long customerId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("status", 1) + .eq("customerId", customerId); + return stackRulesDao.selectCount(wrapper); + } } diff --git a/src/main/java/com/glxp/udi/admin/service/product/StackCodeService.java b/src/main/java/com/glxp/udi/admin/service/product/StackCodeService.java index 6c0f3d1..dda1172 100644 --- a/src/main/java/com/glxp/udi/admin/service/product/StackCodeService.java +++ b/src/main/java/com/glxp/udi/admin/service/product/StackCodeService.java @@ -1,5 +1,6 @@ package com.glxp.udi.admin.service.product; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -9,8 +10,10 @@ import com.glxp.udi.admin.dao.product.StackCodeDao; import com.glxp.udi.admin.dao.product.StackOrderDao; import com.glxp.udi.admin.entity.product.StackCode; import com.glxp.udi.admin.entity.product.StackOrder; +import com.glxp.udi.admin.entity.udid.UdiEntity; import com.glxp.udi.admin.req.product.AddStackCodeRequest; import com.glxp.udi.admin.req.product.FilterStackCodeRequest; +import com.glxp.udi.admin.util.FilterUdiUtils; import com.glxp.udi.admin.util.IdUtil; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; @@ -43,6 +46,8 @@ public class StackCodeService { if (CollUtil.isNotEmpty(stackCodeEntityList)) { StackCodeDao mapper = batchSession.getMapper(StackCodeDao.class); stackCodeEntityList.forEach(stackCodeEntity -> { + UdiEntity udi = FilterUdiUtils.getUdi(stackCodeEntity.getCode()); + BeanUtil.copyProperties(udi, stackCodeEntity); mapper.insert(stackCodeEntity); }); batchSession.commit(); @@ -96,6 +101,8 @@ public class StackCodeService { } else { stackCode.setOrderIdFk(addStackCodeRequest.getOrderId()); } + UdiEntity udi = FilterUdiUtils.getUdi(stackCode.getCode()); + BeanUtil.copyProperties(udi, stackCode); int id = stackCodeDao.insert(stackCode); stackCode.setId(id); return stackCode; @@ -104,7 +111,6 @@ public class StackCodeService { /** * 判断此条码是否在垛中存在 * - * @param orderId * @param code * @return */ diff --git a/src/main/java/com/glxp/udi/admin/service/product/StackOrderService.java b/src/main/java/com/glxp/udi/admin/service/product/StackOrderService.java index c355080..4a7e28b 100644 --- a/src/main/java/com/glxp/udi/admin/service/product/StackOrderService.java +++ b/src/main/java/com/glxp/udi/admin/service/product/StackOrderService.java @@ -1,10 +1,10 @@ package com.glxp.udi.admin.service.product; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.poi.excel.ExcelReader; -import cn.hutool.poi.excel.ExcelUtil; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -13,10 +13,13 @@ import com.glxp.udi.admin.dao.product.StackCodeDao; import com.glxp.udi.admin.dao.product.StackOrderDao; import com.glxp.udi.admin.entity.product.StackCode; import com.glxp.udi.admin.entity.product.StackOrder; +import com.glxp.udi.admin.entity.udid.UdiEntity; import com.glxp.udi.admin.req.product.StackOrderFilterRequest; import com.glxp.udi.admin.req.product.StackUploadRequest; import com.glxp.udi.admin.service.auth.CustomerService; +import com.glxp.udi.admin.util.FilterUdiUtils; import com.glxp.udi.admin.util.IdUtil; +import com.glxp.udi.admin.vo.StackCodeVo; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; @@ -26,12 +29,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; @Slf4j @@ -50,6 +54,8 @@ public class StackOrderService { @Resource private CustomerService customerService; + private ExecutorService executorService = ThreadUtil.newExecutor(8); + public IPage filterList(StackOrderFilterRequest stackOrderFilterRequest) { IPage page = new Page<>(stackOrderFilterRequest.getPage(), stackOrderFilterRequest.getLimit()); @@ -127,40 +133,74 @@ public class StackOrderService { * * @param filePath */ - public void importStackOrder(String filePath) throws Exception { + public void importStackOrder(String filePath) { long t1 = System.currentTimeMillis(); - List objects = EasyExcel.read(filePath).sheet().doReadSync(); + List list = EasyExcel.read(filePath).head(StackCodeVo.class).sheet().doReadSync(); + long t2 = System.currentTimeMillis(); - ExcelReader reader = ExcelUtil.getReader(new File(filePath)); - List> read = reader.read(1); - if (CollUtil.isEmpty(read)) { + log.info("解析数据用时:{}", t2 - t1); + if (CollUtil.isEmpty(list)) { log.error("解析垛码excel文件数据为空"); throw new RuntimeException("垛码excel文件数据为空"); } - List stackCodes = new ArrayList<>(read.size()); - for (List list : read) { - //流水号 - String serialNum = String.valueOf(list.get(0)); - String code = String.valueOf(list.get(1)); - if (StrUtil.isBlank(serialNum) || StrUtil.isBlank(code)) { - log.error("数据为空,数据不规范"); - throw new RuntimeException("垛码数据格式错误,解析失败"); - } + //条码集合 + List codeList = list.stream().map(StackCodeVo::getCode).collect(Collectors.toList()); + + List stackCodes = new ArrayList<>(list.size()); + + //线程计数器 + CountDownLatch countDownLatch = new CountDownLatch(list.size()); + for (StackCodeVo vo : list) { + executorService.submit(() -> { + log.info("添加任务"); + if (StrUtil.isBlank(vo.getOrderId()) || StrUtil.isBlank(vo.getCode())) { + log.error("数据为空,数据不规范"); + throw new RuntimeException("垛码数据格式错误,解析失败"); + } + + List codeTemp = new ArrayList<>(codeList.size()); + BeanUtil.copyProperties(codeList, codeTemp); + + + //判断此条码在数据库或者表中是否重复,如果有重复,则直接返回错误数据 + codeTemp.remove(vo.getCode()); //先移除自身 + if (codeTemp.contains(vo.getCode()) || stackCodeDao.countByCode(vo.getCode()) > 0) { + log.error("条码重复,重复的条码和流水号为:{},{}", vo.getCode(), vo.getOrderId()); + throw new RuntimeException("条码重复"); + } + + //构造码数据 + StackCode stackCode = new StackCode(vo.getOrderId(), vo.getCode()); + UdiEntity udi = FilterUdiUtils.getUdi(stackCode.getCode()); + BeanUtil.copyProperties(udi, stackCode); + stackCodes.add(stackCode); - StackCode stackCode = new StackCode(serialNum, code); - stackCodes.add(stackCode); + log.info("执行结束"); + //线程执行结束,计数器 -1 + countDownLatch.countDown(); + }); } - long t2 = System.currentTimeMillis(); - log.info("解析构造数据用时:{}", t2 - t1); + //阻塞到线程池任务执行结束 + try { + countDownLatch.await(); + log.info("数据封装任务执行完毕"); + } catch (Exception e) { + log.error("解析封装失败失败", e); + throw new RuntimeException("解析封装数据异常"); + } + + + long t3 = System.currentTimeMillis(); + log.info("构造数据用时:{}", t3 - t2); Map> stacks = stackCodes.stream().collect(Collectors.groupingBy(StackCode::getOrderIdFk)); //根据每一个流水号,创建单据,生成条码 String customerId = String.valueOf(customerService.getCustomerId()); - SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED); StackCodeDao mapper = sqlSession.getMapper(StackCodeDao.class); for (String serialNum : stacks.keySet()) { StackOrder stackOrder = new StackOrder(); @@ -175,13 +215,6 @@ public class StackOrderService { List saveDataList = new CopyOnWriteArrayList<>(data); saveDataList.parallelStream().forEach(stackCode -> { stackCode.setOrderIdFk(stackId); - //检查此码是否已经被添加过 - long count = stackCodeDao.countByCode(stackCode.getCode()); - if (count > 0) { - log.error("重复条码"); - throw new RuntimeException("重复条码"); - } - mapper.insert(stackCode); }); @@ -190,11 +223,12 @@ public class StackOrderService { sqlSession.close(); - long t3 = System.currentTimeMillis(); - log.info("插入数据用时:{}", t3 - t2); - log.info("全程用时:{}", t3 - t1); + long t4 = System.currentTimeMillis(); + log.info("插入数据用时:{}", t4 - t3); + log.info("全程用时:{}", t4 - t1); //导入成功,删除数据文件 FileUtil.del(filePath); } + } diff --git a/src/main/java/com/glxp/udi/admin/thread/BasicUpdateProductService.java b/src/main/java/com/glxp/udi/admin/thread/BasicUpdateProductService.java index 38ebe91..2ff7f86 100644 --- a/src/main/java/com/glxp/udi/admin/thread/BasicUpdateProductService.java +++ b/src/main/java/com/glxp/udi/admin/thread/BasicUpdateProductService.java @@ -63,7 +63,7 @@ public class BasicUpdateProductService { if (productInfoFilterRequest.getNameCode() != null) { UdiEntity udiEntity = FilterUdiUtils.getUdi(productInfoFilterRequest.getNameCode()); if (udiEntity != null) { - nameCode = udiEntity.getUdi(); + nameCode = udiEntity.getNameCode(); } else { nameCode = productInfoFilterRequest.getNameCode(); } diff --git a/src/main/java/com/glxp/udi/admin/util/FilterUdiUtils.java b/src/main/java/com/glxp/udi/admin/util/FilterUdiUtils.java index 6c72d2a..8fa7771 100644 --- a/src/main/java/com/glxp/udi/admin/util/FilterUdiUtils.java +++ b/src/main/java/com/glxp/udi/admin/util/FilterUdiUtils.java @@ -148,7 +148,7 @@ public class FilterUdiUtils { serialNo = data.substring(18); } udiEntity = new UdiEntity(); - udiEntity.setUdi(udi); + udiEntity.setNameCode(udi); udiEntity.setBatchNo(batchNo); udiEntity.setExpireDate(expireDate); udiEntity.setProduceDate(produceDate); @@ -188,7 +188,7 @@ public class FilterUdiUtils { udiEntity.setBatchNo(batchNo); udiEntity.setExpireDate(expireDate); udiEntity.setProduceDate(produceDate); - udiEntity.setUdi(nameCode); + udiEntity.setNameCode(nameCode); udiEntity.setSerialNo(serialNo); return udiEntity; @@ -218,7 +218,7 @@ public class FilterUdiUtils { udiEntity.setBatchNo(batchNo); udiEntity.setExpireDate(expireDate); udiEntity.setProduceDate(produceDate); - udiEntity.setUdi(udi); + udiEntity.setNameCode(udi); udiEntity.setSerialNo(serialNo); return udiEntity; } @@ -257,14 +257,14 @@ public class FilterUdiUtils { data.setProduceDate(udiEntity.getProduceDate()); data.setExpireDate(udiEntity.getExpireDate()); data.setSerialNo(udiEntity.getSerialNo()); - data.setUdi(udiEntity.getUdi()); + data.setUdi(udiEntity.getNameCode()); } return data; } public static String transGlxpStr(String code) { UdiEntity udiEntity = getUdi(code); - String udiCode = "#" + udiEntity.getUdi() + "#" + udiEntity.getProduceDate() + "#" + udiEntity.getExpireDate() + + String udiCode = "#" + udiEntity.getNameCode() + "#" + udiEntity.getProduceDate() + "#" + udiEntity.getExpireDate() + "#" + udiEntity.getBatchNo() + "#" + udiEntity.getSerialNo() + "#" + "#"; return udiCode; } @@ -276,7 +276,7 @@ public class FilterUdiUtils { } public static String transGlxpNoSerStr(UdiEntity warehouseEntity) { - String udiCode = "#" + warehouseEntity.getUdi() + "#" + warehouseEntity.getProduceDate() + "#" + warehouseEntity.getExpireDate() + + String udiCode = "#" + warehouseEntity.getNameCode() + "#" + warehouseEntity.getProduceDate() + "#" + warehouseEntity.getExpireDate() + "#" + warehouseEntity.getBatchNo() + "#" + "#" + "#"; return udiCode; } diff --git a/src/main/java/com/glxp/udi/admin/util/IdUtil.java b/src/main/java/com/glxp/udi/admin/util/IdUtil.java index 57e4309..8bfd8c5 100644 --- a/src/main/java/com/glxp/udi/admin/util/IdUtil.java +++ b/src/main/java/com/glxp/udi/admin/util/IdUtil.java @@ -1,5 +1,6 @@ package com.glxp.udi.admin.util; +import cn.hutool.core.util.StrUtil; import com.glxp.udi.admin.entity.basic.StackRulesEntity; import com.glxp.udi.admin.service.basic.StackRulesService; import lombok.extern.slf4j.Slf4j; @@ -24,12 +25,16 @@ public class IdUtil { */ public synchronized String getStackId(String customerId) { StackRulesEntity stackRulesEntity = stackRulesService.getEnableStockRule(customerId); - StringBuffer stackId = new StringBuffer(); + StringBuilder stackId = new StringBuilder("DH"); //垛号固定标识 - stackId.append("DH") - .append(stackRulesEntity.getPrefix()) - //拼接起始数 - .append(stackRulesEntity.getStartNum()); + if (StrUtil.isNotBlank(stackRulesEntity.getPrefix())) { + stackId.append(stackRulesEntity.getPrefix()); + } + //拼接起始数 + if (StrUtil.isBlank(stackRulesEntity.getStartNum())) { + stackId.append(stackRulesEntity.getStartNum()); + } + //查找该客户上一个垛号 String key = "DH" + customerId; int serialNum = 0; //顺序号 diff --git a/src/main/java/com/glxp/udi/admin/vo/StackCodeVo.java b/src/main/java/com/glxp/udi/admin/vo/StackCodeVo.java index 11e0338..dff85c2 100644 --- a/src/main/java/com/glxp/udi/admin/vo/StackCodeVo.java +++ b/src/main/java/com/glxp/udi/admin/vo/StackCodeVo.java @@ -1,5 +1,6 @@ package com.glxp.udi.admin.vo; +import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; /** @@ -11,11 +12,13 @@ public class StackCodeVo { /** * 流水号 */ + @ExcelProperty("垛号") private String orderId; /** * 条码 */ + @ExcelProperty("条码") private String code; }