diff --git a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java index 37c8fde9a..31f75df7e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java +++ b/cf-module-prod-executor/cf-module-prod-executor-api/src/main/java/com/cf/imes/module/executor/enums/ErrorCodeConstants.java @@ -59,4 +59,11 @@ public class ErrorCodeConstants { public static final ErrorCode SOURCE_NOT_EXITS_ERROR = new ErrorCode(1_002_029_013, "源数据查询失败"); public static final ErrorCode ORDER_DELETED_ERR = new ErrorCode(1_002_029_006, "生产单删除失败"); public static final ErrorCode ORDER_RESTORE_ERR = new ErrorCode(1_002_029_006, "生产单还原失败"); + + // ========== 自定义板编号生成 ========== + public static final ErrorCode CUSTOM_PLATENO_GENERATE_ORDERNO_RULE_NOT_SUPPORT_RESETMODE = new ErrorCode(1_002_030_001, "自定义版编号生产单序号规则中存在不支持的复位类型:{}"); + public static final ErrorCode CUSTOM_PLATENO_GENERATE_BODY_RULE_NOT_SUPPORT_RESETMODE = new ErrorCode(1_002_030_002, "自定义版编号柜体序号规则中存在不支持的复位类型:{}"); + public static final ErrorCode CUSTOM_PLATENO_GENERATE_PROCESSGROUP_RULE_NOT_SUPPORT_RESETMODE = new ErrorCode(1_002_030_003, "自定义版编号加工组序号规则中存在不支持的复位类型:{}"); + public static final ErrorCode CUSTOM_PLATENO_GENERATE_PLATE_RULE_NOT_SUPPORT_RESETMODE = new ErrorCode(1_002_030_004, "自定义版编号板件序号规则中存在不支持的复位类型:{}"); + public static final ErrorCode CUSTOM_PLATENO_GENERATE_ORG_CUSTOM_PLATENO_SEQ_MODIFY_ERROR = new ErrorCode(1_002_030_005, "保存组织下自定义板编号序号配置失败,请联系客服处理"); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java index 73c3a6723..766685711 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java @@ -512,7 +512,6 @@ public class OrderController { // 生产单超期(工作台) @GetMapping("/getOrderOverdue") @Operation(summary = "生产单超期 (工作台)") - @PreAuthorize("@ss.hasPermission('productManager:List')") public CommonResult> getOrderOverdue(@Valid PageParam pageParam) { return success(orderService.getOrderOverdue(pageParam)); } @@ -520,7 +519,6 @@ public class OrderController { // 生产单到期告警 (工作台) @GetMapping("/getOrderWarn") @Operation(summary = "生产单到期告警 (工作台)") - @PreAuthorize("@ss.hasPermission('productManager:List')") public CommonResult> getOrderNear(@Valid PageParam pageParam) { return success(orderService.getOrderNear(pageParam)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderIds.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderIds.java index d7f710275..1deffa1f3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderIds.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/plan/bo/OrderIds.java @@ -7,7 +7,6 @@ import lombok.Data; @Data - public class OrderIds { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java index b43a00a23..3bcf85f64 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/plate/PlateDO.java @@ -189,15 +189,15 @@ public class PlateDO extends BaseDO { /** * 房间名 */ + @TableField(exist = false) private String roomName; /** * 柜体名 */ + @TableField(exist = false) private String bodyName; - /** - * 加工组名 - */ - private String processGroupName; + @TableField(exist = false) + private StringBuilder customPlateNo; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateService.java index fa956ae83..941a70d6d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateService.java @@ -1,5 +1,6 @@ package com.cf.imes.module.executor.service.customplateno; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import java.util.List; @@ -14,7 +15,8 @@ public interface CustomPlateNoGenerateService { /** * 生成自定义板编号 * + * @param orderDO 生产单号 * @param plateDOList 板件列表 */ - void generateCustomPlateNo(List plateDOList); + void generateCustomPlateNo(OrderDO orderDO, List plateDOList); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java index eb1dbff85..10b63186f 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java @@ -1,10 +1,32 @@ package com.cf.imes.module.executor.service.customplateno; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.enums.ErrorCodeConstants; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO; +import com.cf.imes.module.executor.service.customplatenorule.CustomPlateNoGenerateRuleService; +import com.cf.imes.module.executor.service.order.OrderService; +import com.cf.imes.module.system.api.customplateno.CustomPlateNoSeqApi; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; +import com.cf.imes.module.system.api.systemconfig.SystemConfigApi; +import com.cf.imes.module.system.api.systemconfig.dto.SystemConfigRespDTO; +import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Optional; /** * @author Gqr @@ -14,8 +36,125 @@ import java.util.List; @Slf4j public class CustomPlateNoGenerateServiceImpl implements CustomPlateNoGenerateService { + @Resource + @Lazy + private OrderService orderService; + + @Resource + private SystemConfigApi systemConfigApi; + + @Resource + private CustomPlateNoSeqApi customPlateNoSeqApi; + + @Resource + private List ruleServices; + + private static final DateTimeFormatter YEAR_FORMATTER = DateTimeFormatter.ofPattern("yyyy"); + private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM"); + private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + @Override - public void generateCustomPlateNo(List plateDOList) { - // todo generateCustomPlateNo + public void generateCustomPlateNo(OrderDO orderDO, List plateDOList) { + Long orderId = orderDO.getId(); + // 1、获取生产配置 + CustomPlateNoGenerateConfigVO generateConfig = getGenerateConfig(orderId); + // 如果没有查到配置规则就不做后续生成操作了 + List orgCustomPlateNoRuleVOList = generateConfig.getOrgCustomPlateNoRuleVOList(); + if (CollUtil.isEmpty(orgCustomPlateNoRuleVOList)) { + return; + } + + // 开始生成时记录时间,用于后续年月日复位、上次年月日记录等 + LocalDateTime now = LocalDateTime.now(); + orgCustomPlateNoRuleVOList.forEach(rule -> rule.setNow(now)); + + // 2、遍历小板列表,生成板编号 + for (PlateDO plateDO : plateDOList) { + loopGenerateNo(orderId, plateDO, orgCustomPlateNoRuleVOList, generateConfig); + } + + // 3、保存生产单序号json + orderDO.setCustomPlatenoSeq(JSON.toJSONString(generateConfig.getOrderCustomPlateNoSeqVO())); + CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); + orgCustomPlateNoSeqRespDTO.setLastOrderNo(orderId); + orgCustomPlateNoSeqRespDTO.setLastYear(Integer.parseInt(YEAR_FORMATTER.format(now))); + orgCustomPlateNoSeqRespDTO.setLastMonth(Integer.parseInt(MONTH_FORMATTER.format(now))); + orgCustomPlateNoSeqRespDTO.setLastDay(Integer.parseInt(DAY_FORMATTER.format(now))); + // 保存组织下全局序号配置 + CommonResult orgCustomPlateNoSeqModifyResult = customPlateNoSeqApi.modifyOrgCustomPlateNoSeq(orgCustomPlateNoSeqRespDTO); + if (orgCustomPlateNoSeqModifyResult.isError() || !orgCustomPlateNoSeqModifyResult.getData().booleanValue()) { + throw new ServiceException(ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_ORG_CUSTOM_PLATENO_SEQ_MODIFY_ERROR); + } + } + + /** + * 循环规则和板件列表生成编号 + * + * @param orderId + * @param plateDO + * @param orgCustomPlateNoRuleVOList + * @param generateConfig + */ + private void loopGenerateNo(Long orderId, PlateDO plateDO, List orgCustomPlateNoRuleVOList, CustomPlateNoGenerateConfigVO generateConfig) { + // 遍历规则列表 + for (CustomPlateNoRuleVO plateNoRule : orgCustomPlateNoRuleVOList) { + if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.CUSTOM.getRuleCode(), plateNoRule.getRuleCode())) { + plateDO.getCustomPlateNo().append(plateNoRule.getValue()); + } + if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.DATE.getRuleCode(), plateNoRule.getRuleCode())) { + plateDO.getCustomPlateNo().append(plateNoRule.getNow().format(DateTimeFormatter.ofPattern(plateNoRule.getValue()))); + } + // 遍历规则生成服务列表,获取对应的规则服务 + for (CustomPlateNoGenerateRuleService ruleService : ruleServices) { + if (ruleService.match(plateNoRule.getRuleCode())) { + generateConfig = ruleService.generateNo(orderId, plateNoRule, generateConfig, plateDO); + break; + } + } + } + plateDO.setPlateNo(plateDO.getCustomPlateNo().toString()); + } + + private CustomPlateNoGenerateConfigVO getGenerateConfig(Long orderId) { + // 生成自定义版编号所需配置 + CustomPlateNoGenerateConfigVO customPlateNoGenerateConfigVO = new CustomPlateNoGenerateConfigVO(); + + // 机构下自定义板编号配置 + SystemConfigRespDTO orgCustomPlateNoConfig = null; + // 生产单下序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO(); + // 自定义板编号配置规则明细列表 + List customPlateNoRuleVOS = List.of(); + // 查询机构的自定义版编号配置 + CommonResult orgCustomPlateNoConfigResult = systemConfigApi.getOrgCustomPlateNoConfig(); + if (orgCustomPlateNoConfigResult.isSuccess()) { + orgCustomPlateNoConfig = orgCustomPlateNoConfigResult.getData(); + customPlateNoRuleVOS = Optional.ofNullable(orgCustomPlateNoConfig) + .map(config -> JSON.parseArray(config.getSetting(), CustomPlateNoRuleVO.class)) + .orElse(List.of()); + } + + OrderDO order = orderService.getOrder(orderId); + if (ObjectUtil.isNotNull(order) && ObjectUtil.isNotNull(orgCustomPlateNoConfig)) { + // 老单 + // 生产单上的自定义板编号配置id和当前最新的对比,不同用生产单号上的 + Long orderCustomPlatenoConfigId = order.getCustomPlatenoConfigId(); + if (ObjectUtil.isNotNull(orderCustomPlatenoConfigId) && ObjectUtil.notEqual(orgCustomPlateNoConfig.getId(), orderCustomPlatenoConfigId)) { + CommonResult previousCustomPlateNoConfig = systemConfigApi.getById(orderCustomPlatenoConfigId); + if (previousCustomPlateNoConfig.isSuccess()) { + customPlateNoRuleVOS = JSON.parseArray(previousCustomPlateNoConfig.getData().getSetting(), CustomPlateNoRuleVO.class); + } + } + + // 上一次的生产单内 自定义版编号序号 + orderCustomPlateNoSeqVO = JSON.parseObject(order.getCustomPlatenoSeq(), OrderCustomPlateNoSeqVO.class); + } + customPlateNoGenerateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO); + customPlateNoGenerateConfigVO.setOrgCustomPlateNoRuleVOList(customPlateNoRuleVOS); + CommonResult orgCustomPlateNoSeq = customPlateNoSeqApi.getOrgCustomPlateNoSeq(); + if (orgCustomPlateNoSeq.isSuccess()) { + customPlateNoGenerateConfigVO.setOrgCustomPlateNoSeqRespDTO(orgCustomPlateNoSeq.getData()); + } + return customPlateNoGenerateConfigVO; } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoGenerateConfigVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoGenerateConfigVO.java index 178e45358..411687dc9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoGenerateConfigVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoGenerateConfigVO.java @@ -1,6 +1,6 @@ package com.cf.imes.module.executor.service.customplateno.vo; -import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqRespDTO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; import lombok.Data; import java.io.Serializable; @@ -27,5 +27,5 @@ public class CustomPlateNoGenerateConfigVO implements Serializable { /** * 机构下的自定义板编号序号 */ - private CustomPlateNoSeqRespDTO orgCustomPlateNoSeqRespDTO; + private CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoRuleVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoRuleVO.java index 98cfbea73..47c8713d3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoRuleVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/CustomPlateNoRuleVO.java @@ -3,6 +3,7 @@ package com.cf.imes.module.executor.service.customplateno.vo; import lombok.Data; import java.io.Serializable; +import java.time.LocalDateTime; /** * 系统配置-自定义板编号setting项 vo @@ -48,4 +49,9 @@ public class CustomPlateNoRuleVO implements Serializable { * 复位/清零模式 */ private Integer resetMode; + + /** + * 开始生成板编号的时间 + */ + private LocalDateTime now; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqBodyVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqBodyVO.java new file mode 100644 index 000000000..4b554cc20 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqBodyVO.java @@ -0,0 +1,26 @@ +package com.cf.imes.module.executor.service.customplateno.vo; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Builder +public class OrderCustomPlateNoSeqBodyVO implements Serializable { + private static final long serialVersionUID = 2686882895438975156L; + /** + * 柜体名 + */ + private String bodyName; + + /** + * 柜体下板件序号 + */ + private Integer plateNoSeq; + + /** + * 柜体序号 + */ + private Integer bodyNoSeq; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqProcessGroupVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqProcessGroupVO.java new file mode 100644 index 000000000..3a436593c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqProcessGroupVO.java @@ -0,0 +1,26 @@ +package com.cf.imes.module.executor.service.customplateno.vo; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Builder +public class OrderCustomPlateNoSeqProcessGroupVO implements Serializable { + private static final long serialVersionUID = -6834098282222544638L; + /** + * 加工组名 + */ + private String processGroupName; + + /** + * 加工组下板件序号 + */ + private Integer plateNoSeq; + + /** + * 加工组序号 + */ + private Integer processGroupNoSeq; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqRoomVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqRoomVO.java new file mode 100644 index 000000000..0ba456f16 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqRoomVO.java @@ -0,0 +1,37 @@ +package com.cf.imes.module.executor.service.customplateno.vo; + +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@Builder +public class OrderCustomPlateNoSeqRoomVO implements Serializable { + private static final long serialVersionUID = -127388898531267048L; + /** + * 房间名 + */ + private String roomName; + + /** + * 房间序号 + */ + private Integer roomNoSeq; + + /** + * 房间下板件序号 + */ + private Integer plateNoSeq; + + /** + * 房间下柜体序号 + */ + private Integer bodyNoSeq; + + /** + * 房间下柜体列表 + */ + private List bodys; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqVO.java index 810c3c6d8..cd3c1d93a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/vo/OrderCustomPlateNoSeqVO.java @@ -1,6 +1,8 @@ package com.cf.imes.module.executor.service.customplateno.vo; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.List; @@ -12,92 +14,39 @@ import java.util.List; * @since 2024/11/15 10:41 */ @Data +@NoArgsConstructor +@AllArgsConstructor public class OrderCustomPlateNoSeqVO implements Serializable { private static final long serialVersionUID = 5841977329049878792L; + + /** + * 生产单序号 + */ + private Integer orderNoSeq; + /** * 生产单下房间序号 */ - private int roomSeq; + private Integer roomNoSeq; /** * 生产单下柜体序号 */ - private int bodySeq; - - /** - * 生产单下加工组序号 - */ - private int processGroupSeq; + private Integer bodyNoSeq; /** * 生产单下板件序号 */ - private int plateNoSeq; + private Integer plateNoSeq; /** * 生产单下房间列表 */ - private List rooms; + private List rooms; + + /** + * 生产单下柜体列表 + */ + private List bodys; } -@Data -class Room implements Serializable { - private static final long serialVersionUID = -127388898531267048L; - /** - * 房间名 - */ - private String roomNo; - - /** - * 房间下板件序号 - */ - private int plateNoSeq; - - /** - * 房间下柜体序号 - */ - private int bodySeq; - - /** - * 房间下柜体列表 - */ - private List bodys; - - /** - * 房间下加工组序号 - */ - private int processGroupSeq; - - /** - * 房间下加工组列表 - */ - private List processGroups; -} - -@Data -class Body implements Serializable { - private static final long serialVersionUID = 2686882895438975156L; - /** - * 柜体名 - */ - private String bodyNo; - - /** - * 柜体下板件序号 - */ - private int plateNoSeq; -} - -@Data -class ProcessGroup implements Serializable { - private static final long serialVersionUID = -6834098282222544638L; - /** - * 加工组名 - */ - private String processGroupNo; - - /** - * 加工组下板件序号 - */ - private int plateNoSeq; -} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/BodyNoGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/BodyNoGenerateRuleServiceImpl.java new file mode 100644 index 000000000..65aed1fe1 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/BodyNoGenerateRuleServiceImpl.java @@ -0,0 +1,223 @@ +package com.cf.imes.module.executor.service.customplatenorule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqBodyVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqRoomVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; +import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +import com.cf.imes.module.system.enums.customplateno.ResetModeEnum; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_BODY_RULE_NOT_SUPPORT_RESETMODE; + +/** + * 柜体序号生成规则服务实现类 + * + * @author Gqr + * @since 2024/11/19 16:35 + */ +@Service("bodyNoGenerateRuleService") +public class BodyNoGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { + @Override + public boolean match(String ruleCode) { + return ObjectUtil.equal(CustomPlateNoRuleCodeEnum.BODYNO.getRuleCode(), ruleCode); + } + + @Override + public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + // 初始化配置 + initConfig(generateConfig); + // 按复位模式走不同的生成方式 + ResetModeEnum resetModeEnum = ResetModeEnum.getByMode(plateNoRule.getResetMode()); + if (ObjectUtil.equal(ResetModeEnum.ORDER, resetModeEnum)) { + generateConfig = generateNoByOrderResetMode(orderId, plateNoRule, generateConfig, plateDO); + } else if (ObjectUtil.equal(ResetModeEnum.ROOM, resetModeEnum)) { + generateConfig = generateNoByRoomResetMode(plateNoRule, generateConfig, plateDO); + } else { + throw ServiceExceptionUtil.exception(CUSTOM_PLATENO_GENERATE_BODY_RULE_NOT_SUPPORT_RESETMODE, plateNoRule.getResetMode()); + } + return generateConfig; + } + + /** + * 初始化生成所需配置 + * + * @param generateConfigVO + */ + private static void initConfig(CustomPlateNoGenerateConfigVO generateConfigVO) { + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfigVO.getOrderCustomPlateNoSeqVO(); + if (ObjectUtil.isNull(orderCustomPlateNoSeqVO)) { + orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO(); + generateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO); + } + List rooms = orderCustomPlateNoSeqVO.getRooms(); + if (CollUtil.isEmpty(rooms)) { + rooms = new ArrayList<>(); + orderCustomPlateNoSeqVO.setRooms(rooms); + } + List boyds = orderCustomPlateNoSeqVO.getBodys(); + if (CollUtil.isEmpty(boyds)) { + boyds = new ArrayList<>(); + orderCustomPlateNoSeqVO.setBodys(boyds); + } + } + + /** + * 按生产单复位模式下的板编号生成 + * + * @param orderId 生产单号 + * @param plateNoRule 当前规则配置 + * @param generateConfig 生成规则配置 + * @param plateDO 板件列表 + * @return + */ + private CustomPlateNoGenerateConfigVO generateNoByOrderResetMode(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + Integer incrementStep = plateNoRule.getIncrementStep(); + Integer initValue = plateNoRule.getInitValue() - incrementStep; + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + // 机构下的自定义板编号序号 + CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); + // 生产单下柜体序号 + Integer orderBodyNoSeq = Optional.ofNullable(orderCustomPlateNoSeqVO.getBodyNoSeq()).orElse(initValue); + // 生产单序号下的房间序号列表 + List bodys = orderCustomPlateNoSeqVO.getBodys(); + // 上次导入的生产单号 + Long lastOrderNo = orgCustomPlateNoSeqRespDTO.getLastOrderNo(); + if (ObjectUtil.isNotNull(lastOrderNo) && ObjectUtil.notEqual(orderId, lastOrderNo)) { + // 跨单复位到初始值 + orderBodyNoSeq = initValue; + } + String bodyName = plateDO.getBodyName(); + // 根据柜体名获取生产单下序号json中第一层柜体列表的柜体序号 + OrderCustomPlateNoSeqBodyVO bodySeqVo = getBodySeqVOByBodyName(bodyName, bodys); + // 获取当前柜体序号值 + Integer bodyNoSeq = Optional.ofNullable(bodySeqVo).map(OrderCustomPlateNoSeqBodyVO::getBodyNoSeq).orElse(null); + if (bodySeqVo == null) { + // 生产单序号下柜体为空,新建柜体,取生产单下柜体序号 + bodySeqVo = OrderCustomPlateNoSeqBodyVO.builder() + .bodyName(bodyName) + .build(); + bodys.add(bodySeqVo); + // 累加步长 + bodyNoSeq = orderBodyNoSeq + incrementStep; + // 累加后的值同步到当前生产单序号中,生产单下柜体序号累加到多少了 + orderCustomPlateNoSeqVO.setBodyNoSeq(bodyNoSeq); + } else if (bodyNoSeq == null) { + // 柜体下序号为空,取生产单下房间序号 + // 累加步长 + bodyNoSeq = orderBodyNoSeq + incrementStep; + // 累加后的值同步到当前生产单序号中,生产单下柜体序号累加到多少了 + orderCustomPlateNoSeqVO.setBodyNoSeq(bodyNoSeq); + } + + // 补零 + String noPartAfterFillZero = fillZero(bodyNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFillZero); + // 累加后同步到json:柜体下累加到多少了 + bodySeqVo.setBodyNoSeq(bodyNoSeq); + + return generateConfig; + } + + /** + * 按房间号复位模式下的板编号生成 + * + * @param plateNoRule + * @param generateConfig + * @param plateDO + * @return + */ + private CustomPlateNoGenerateConfigVO generateNoByRoomResetMode(CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + Integer incrementStep = plateNoRule.getIncrementStep(); + Integer initValue = plateNoRule.getInitValue() - incrementStep; + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + List rooms = orderCustomPlateNoSeqVO.getRooms(); + + String roomName = plateDO.getRoomName(); + // 根据房间名获取生产单下序号json中的房间下的柜体序号 + OrderCustomPlateNoSeqRoomVO roomSeqVo = getRoomSeqVOByRoomName(roomName, rooms); + Integer roomBodyNoRoomSeq = Optional.ofNullable(roomSeqVo) + .map(OrderCustomPlateNoSeqRoomVO::getBodyNoSeq) + .orElse(initValue); + + if (roomSeqVo == null) { + // 房间为空,新建对象,设置初始值 + roomSeqVo = OrderCustomPlateNoSeqRoomVO.builder() + .roomName(roomName) + .bodyNoSeq(roomBodyNoRoomSeq) + .bodys(new ArrayList<>()) + .build(); + rooms.add(roomSeqVo); + } + + // 如果是新的柜体vo,要把累加的值记录到生产单rooms下的柜体 + String bodyName = plateDO.getBodyName(); + // 根据柜体名获取生产单下序号中rooms下柜体列表的柜体序号 + List roomBodys = roomSeqVo.getBodys(); + OrderCustomPlateNoSeqBodyVO roomBodySeqVo = getBodySeqVOByBodyName(bodyName, roomBodys); + // 获取当前房间下柜体的序号值 + Integer roomBodyNoSeq = Optional.ofNullable(roomBodySeqVo).map(OrderCustomPlateNoSeqBodyVO::getBodyNoSeq).orElse(null); + if (roomBodySeqVo == null) { + // 房间下柜体为空,新建对象,设置房间下全局柜体序号值 + roomBodySeqVo = OrderCustomPlateNoSeqBodyVO.builder() + .bodyName(bodyName) + .build(); + roomBodys.add(roomBodySeqVo); + // 累加步长 + roomBodyNoSeq = roomBodyNoRoomSeq + incrementStep; + // 累加后的值同步到当前生产单序号中,生产单下房间中柜体累加到多少了 + roomSeqVo.setBodyNoSeq(roomBodyNoSeq); + } else if (roomBodyNoSeq == null) { + // 房间下柜体序号为空,设置房间下全局柜体序号值 + // 累加步长 + roomBodyNoSeq = roomBodyNoRoomSeq + incrementStep; + // 累加后的值同步到当前生产单序号中,生产单下房间中柜体累加到多少了 + roomSeqVo.setBodyNoSeq(roomBodyNoSeq); + } + + // 补零 + String noPartAfterFillZero = fillZero(roomBodyNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFillZero); + // 累加后同步到json中,room下柜体累加到多少了 + roomBodySeqVo.setBodyNoSeq(roomBodyNoSeq); + + return generateConfig; + } + + /** + * 根据房间名从生产单序号json中获取房间序号 + * + * @param roomName + * @param roomVOList + * @return + */ + private OrderCustomPlateNoSeqRoomVO getRoomSeqVOByRoomName(String roomName, List roomVOList) { + return roomVOList.stream().filter(roomVO -> ObjectUtil.equal(roomName, roomVO.getRoomName())).findAny().orElse(null); + } + + /** + * 根据柜体名从生产单序号json中获取柜体序号 + * + * @param bodyName + * @param bodyVOList + * @return + */ + private OrderCustomPlateNoSeqBodyVO getBodySeqVOByBodyName(String bodyName, List bodyVOList) { + if (CollUtil.isEmpty(bodyVOList)) { + return null; + } + return bodyVOList.stream().filter(bodyVO -> ObjectUtil.equal(bodyName, bodyVO.getBodyName())).findAny().orElse(null); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/CustomGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/CustomGenerateRuleServiceImpl.java new file mode 100644 index 000000000..cc84974fe --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/CustomGenerateRuleServiceImpl.java @@ -0,0 +1,33 @@ +//package com.cf.imes.module.executor.service.customplatenorule; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +//import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +// +///** +// * 自定义规则生成实现类 +// * +// * @author Gqr +// * @since 2024/11/18 16:37 +// */ +////@Service("customGenerateRuleService") +//public class CustomGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { +// @Override +// public boolean match(String ruleCode) { +// return ObjectUtil.equal(CustomPlateNoRuleCodeEnum.CUSTOM.getRuleCode(), ruleCode); +// } +// +// @Override +// public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List plateDOList) { +// for (PlateDO plateDO : plateDOList) { +// plateDO.getCustomPlateNo().append(plateNoRule.getValue()); +// } +// return generateConfig; +// } +// +//} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/CustomPlateNoGenerateRuleService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/CustomPlateNoGenerateRuleService.java new file mode 100644 index 000000000..8c7f4ac38 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/CustomPlateNoGenerateRuleService.java @@ -0,0 +1,47 @@ +package com.cf.imes.module.executor.service.customplatenorule; + +import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; + +/** + * 自定义板编号生成规则服务 + * + * @author Gqr + * @since 2024/11/18 16:30 + */ +public interface CustomPlateNoGenerateRuleService { + /** + * 是否匹配的规则编码 + * + * @param ruleCode + * @return + */ + boolean match(String ruleCode); + + /** + * 生成编号 + * + * @param orderId 生产单号 + * @param plateDO 板材列表 + * @param generateConfig 生成所需要的配置 + * @return 生成后改变的配置 + */ + CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO); + + /** + * 左补零 + * + * @param curr 当前值 + * @param plateNoRule 生成规则 + * @return + */ + default String fillZero(int curr, CustomPlateNoRuleVO plateNoRule) { + boolean leftFillZero = plateNoRule.isLeftFillZero(); + Integer length = plateNoRule.getLength(); + if (leftFillZero) { + return String.format("%0" + length + "d", curr); + } + return String.valueOf(curr); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/DateGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/DateGenerateRuleServiceImpl.java new file mode 100644 index 000000000..eebf442b7 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/DateGenerateRuleServiceImpl.java @@ -0,0 +1,33 @@ +//package com.cf.imes.module.executor.service.customplatenorule; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +//import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +//import org.springframework.stereotype.Service; +// +//import java.time.format.DateTimeFormatter; +//import java.util.List; +// +///** +// * 日期规则生成服务实现类 +// * +// * @author Gqr +// * @since 2024/11/18 16:46 +// */ +//@Service("dateGenerateRuleService") +//public class DateGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { +// @Override +// public boolean match(String ruleCode) { +// return ObjectUtil.equal(CustomPlateNoRuleCodeEnum.DATE.getRuleCode(), ruleCode); +// } +// +// @Override +// public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List plateDOList) { +// for (PlateDO plateDO : plateDOList) { +// plateDO.getCustomPlateNo().append(plateNoRule.getNow().format(DateTimeFormatter.ofPattern(plateNoRule.getValue()))); +// } +// return generateConfig; +// } +//} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/OrderNoGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/OrderNoGenerateRuleServiceImpl.java new file mode 100644 index 000000000..fd4bbe703 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/OrderNoGenerateRuleServiceImpl.java @@ -0,0 +1,185 @@ +package com.cf.imes.module.executor.service.customplatenorule; + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; +import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +import com.cf.imes.module.system.enums.customplateno.ResetModeEnum; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Optional; + +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_ORDERNO_RULE_NOT_SUPPORT_RESETMODE; + +/** + * 生产单序号生成规则服务实现类 + * + * @author Gqr + * @since 2024/11/18 17:18 + */ +@Service("orderNoGenerateRuleService") +public class OrderNoGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { + + private static final DateTimeFormatter YEAR_FORMATTER = DateTimeFormatter.ofPattern("yyyy"); + private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM"); + private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + + @Override + public boolean match(String ruleCode) { + return ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ORDERNO.getRuleCode(), ruleCode); + } + + /** + * 初始化生成所需配置 + * + * @param generateConfigVO + */ + private static void initConfig(CustomPlateNoGenerateConfigVO generateConfigVO) { + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfigVO.getOrderCustomPlateNoSeqVO(); + if (ObjectUtil.isNull(orderCustomPlateNoSeqVO)) { + orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO(); + generateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO); + } + } + + @Override + public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + // 初始化配置 + initConfig(generateConfig); + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + Integer orderNoSeq = orderCustomPlateNoSeqVO.getOrderNoSeq(); + // 当前导入已有序号的,生产单内生产单序号不会再变直接用 + if (ObjectUtil.isNotNull(orderNoSeq)) { + // 补零 + String noPartAfterFill = this.fillZero(orderNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFill); + return generateConfig; + } + // 机构下的自定义板编号序号 + CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); + // 获取当前序号值 + int currOrderNoSeq = Optional.ofNullable(orgCustomPlateNoSeqRespDTO.getOrderNoSeq()).orElse(plateNoRule.getInitValue() - plateNoRule.getIncrementStep()); + // 上次导入的生产单号 + Long lastOrderNo = orgCustomPlateNoSeqRespDTO.getLastOrderNo(); + if (ObjectUtil.isNull(lastOrderNo) || ObjectUtil.notEqual(orderId, lastOrderNo)) { + // 跨单 + // 根据复位模式计算序号 + currOrderNoSeq = generateNoByResetMode(currOrderNoSeq, ResetModeEnum.getByMode(plateNoRule.getResetMode()), plateNoRule, orgCustomPlateNoSeqRespDTO); + } + // 补零 + String noPartAfterFill = this.fillZero(currOrderNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFill); + + // 累加后的值同步到当前生产单序号和机构序号中 + orderCustomPlateNoSeqVO.setOrderNoSeq(currOrderNoSeq); + orgCustomPlateNoSeqRespDTO.setOrderNoSeq(currOrderNoSeq); + return generateConfig; + } + + /** + * 基于复位模式的板编号生成 + * + * @param orderNoSeq + * @param resetModeEnum + * @param plateNoRule + * @param orgCustomPlateNoSeqRespDTO + * @return 循环累加后的序号 + */ + private int generateNoByResetMode(int orderNoSeq, ResetModeEnum resetModeEnum, CustomPlateNoRuleVO plateNoRule, CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO) { + // 机构全局序号下的上一次年月日记录 + int year = orgCustomPlateNoSeqRespDTO.getLastYear(); + int month = orgCustomPlateNoSeqRespDTO.getLastMonth(); + int day = orgCustomPlateNoSeqRespDTO.getLastDay(); + + // 根据不同复位模式生成序号 + if (ObjectUtil.equal(ResetModeEnum.DIGIT, resetModeEnum)) { + orderNoSeq = resetByLength(orderNoSeq, plateNoRule); + } else if (ObjectUtil.equal(ResetModeEnum.YEAR, resetModeEnum)) { + orderNoSeq = resetByYear(orderNoSeq, year, plateNoRule); + } else if (ObjectUtil.equal(ResetModeEnum.MONTH, resetModeEnum)) { + orderNoSeq = resetByMonth(orderNoSeq, month, plateNoRule); + } else if (ObjectUtil.equal(ResetModeEnum.DAY, resetModeEnum)) { + orderNoSeq = resetByDay(orderNoSeq, day, plateNoRule); + } else { + throw ServiceExceptionUtil.exception(CUSTOM_PLATENO_GENERATE_ORDERNO_RULE_NOT_SUPPORT_RESETMODE, plateNoRule.getResetMode()); + } + return orderNoSeq; + } + + /** + * 按位数复位 + * + * @param curr 当前值 + * @param plateNoRule 规则配置 + */ + private int resetByLength(int curr, CustomPlateNoRuleVO plateNoRule) { + // 位数下的最大值 10的length次方-1 + int maxNum = (int) (Math.pow(10, plateNoRule.getLength()) - 1); + // 加上步长后的下一个序号 + int nextValue = curr + plateNoRule.getIncrementStep(); + // 超过最大值复位到初始值,没超过就继续下一个 + if (nextValue > maxNum) { + return plateNoRule.getInitValue(); + } else { + return nextValue; + } + } + + /** + * 按年复位 + * + * @param curr + * @param year + * @param plateNoRule + * @return + */ + private int resetByYear(int curr, int year, CustomPlateNoRuleVO plateNoRule) { + LocalDateTime now = plateNoRule.getNow(); + Integer initValue = plateNoRule.getInitValue(); + if (ObjectUtil.notEqual(String.valueOf(year), now.format(YEAR_FORMATTER))) { + return initValue; + } + return curr + plateNoRule.getIncrementStep(); + } + + /** + * 按月复位 + * + * @param curr + * @param month + * @param plateNoRule + * @return + */ + private int resetByMonth(int curr, int month, CustomPlateNoRuleVO plateNoRule) { + LocalDateTime now = plateNoRule.getNow(); + Integer initValue = plateNoRule.getInitValue(); + if (ObjectUtil.notEqual(String.valueOf(month), now.format(MONTH_FORMATTER))) { + return initValue; + } + return curr + plateNoRule.getIncrementStep(); + } + + /** + * 按天复位 + * + * @param curr + * @param day + * @param plateNoRule + * @return + */ + private int resetByDay(int curr, int day, CustomPlateNoRuleVO plateNoRule) { + LocalDateTime now = plateNoRule.getNow(); + Integer initValue = plateNoRule.getInitValue(); + if (ObjectUtil.notEqual(String.valueOf(day), now.format(DAY_FORMATTER))) { + return initValue; + } + return curr + plateNoRule.getIncrementStep(); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/PlateNoGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/PlateNoGenerateRuleServiceImpl.java new file mode 100644 index 000000000..d3030838f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/PlateNoGenerateRuleServiceImpl.java @@ -0,0 +1,311 @@ +package com.cf.imes.module.executor.service.customplatenorule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqBodyVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqRoomVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; +import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +import com.cf.imes.module.system.enums.customplateno.ResetModeEnum; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static com.cf.imes.module.executor.enums.ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_PLATE_RULE_NOT_SUPPORT_RESETMODE; + +/** + * @author Gqr + * @since 2024/11/20 15:28 + */ +@Service("plateNoGenerateRuleService") +public class PlateNoGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { + + private static final DateTimeFormatter YEAR_FORMATTER = DateTimeFormatter.ofPattern("yyyy"); + private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM"); + private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + + @Override + public boolean match(String ruleCode) { + return ObjectUtil.equal(CustomPlateNoRuleCodeEnum.PLATENO.getRuleCode(), ruleCode); + } + + @Override + public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + // 初始化配置 + initConfig(generateConfig); + // 按复位模式走不同的生成方式 + ResetModeEnum resetModeEnum = ResetModeEnum.getByMode(plateNoRule.getResetMode()); + if (ObjectUtil.equal(ResetModeEnum.ORDER, resetModeEnum)) { + return generateNoByOrderResetMode(orderId, plateNoRule, generateConfig, plateDO); + } else if (ObjectUtil.equal(ResetModeEnum.ROOM, resetModeEnum)) { + return generateNoByRoomResetMode(plateNoRule, generateConfig, plateDO); + } else if (ObjectUtil.equal(ResetModeEnum.BODY, resetModeEnum)) { + return generateNoByBodyResetMode(plateNoRule, generateConfig, plateDO); + } else if (ObjectUtil.equal(ResetModeEnum.YEAR, resetModeEnum) || ObjectUtil.equal(ResetModeEnum.MONTH, resetModeEnum) || ObjectUtil.equal(ResetModeEnum.DAY, resetModeEnum)) { + return generateNoByDateResetMode(resetModeEnum, plateNoRule, generateConfig, plateDO); + } else { + throw ServiceExceptionUtil.exception(CUSTOM_PLATENO_GENERATE_PLATE_RULE_NOT_SUPPORT_RESETMODE, plateNoRule.getResetMode()); + } + } + + /** + * 按年/月/日复位模式下的板编号生成 + */ + private CustomPlateNoGenerateConfigVO generateNoByDateResetMode(ResetModeEnum resetModeEnum, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + // 机构下的自定义板编号序号 + CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); + // 上一次自定义编号生成的年月日 + int year = orgCustomPlateNoSeqRespDTO.getLastYear(); + int month = orgCustomPlateNoSeqRespDTO.getLastMonth(); + int day = orgCustomPlateNoSeqRespDTO.getLastDay(); + // 从全局配置获取当前序号,取不到用初始值 + Integer orderNoSeq = orgCustomPlateNoSeqRespDTO.getPlateNoSeq(); + if (ObjectUtil.isNull(orderNoSeq)) { + orderNoSeq = plateNoRule.getInitValue() - plateNoRule.getIncrementStep(); + } + + if (ObjectUtil.equal(ResetModeEnum.YEAR, resetModeEnum)) { + orderNoSeq = resetByYear(orderNoSeq, year, plateNoRule); + } else if (ObjectUtil.equal(ResetModeEnum.MONTH, resetModeEnum)) { + orderNoSeq = resetByMonth(orderNoSeq, month, plateNoRule); + } else if (ObjectUtil.equal(ResetModeEnum.DAY, resetModeEnum)) { + orderNoSeq = resetByDay(orderNoSeq, day, plateNoRule); + } + // 跨板件累加步长,补零 + orderNoSeq += plateNoRule.getIncrementStep(); + String noPartAfterFillZero = fillZero(orderNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFillZero); + + orgCustomPlateNoSeqRespDTO.setPlateNoSeq(orderNoSeq); + return generateConfig; + } + + /** + * 按生产单复位模式下的板编号生成 + * + * @param orderId + * @param plateNoRule + * @param generateConfig + * @param plateDO + */ + private CustomPlateNoGenerateConfigVO generateNoByOrderResetMode(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + Integer incrementStep = plateNoRule.getIncrementStep(); + Integer initValue = plateNoRule.getInitValue() - incrementStep; + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + // 机构下的自定义板编号序号 + CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); + // 获取当前生产单下板件序号 + Integer orderPlateNoSeq = Optional.ofNullable(orderCustomPlateNoSeqVO.getPlateNoSeq()).orElse(initValue); + // 上次导入的生产单号 + Long lastOrderNo = orgCustomPlateNoSeqRespDTO.getLastOrderNo(); + if (ObjectUtil.isNotNull(lastOrderNo) && ObjectUtil.notEqual(orderId, lastOrderNo)) { + // 跨单复位到初始值 + orderPlateNoSeq = initValue; + } + // 跨板件累加步长,补零 + orderPlateNoSeq += incrementStep; + plateDO.getCustomPlateNo().append(fillZero(orderPlateNoSeq, plateNoRule)); + // 累加后的值同步到当前生产单序号中 + orderCustomPlateNoSeqVO.setPlateNoSeq(orderPlateNoSeq); + return generateConfig; + } + + /** + * 按房间复位模式下的板编号生成 + * + * @param plateNoRule + * @param generateConfig + * @param plateDO + * @return + */ + private CustomPlateNoGenerateConfigVO generateNoByRoomResetMode(CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + Integer incrementStep = plateNoRule.getIncrementStep(); + Integer initValue = plateNoRule.getInitValue() - incrementStep; + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + List rooms = orderCustomPlateNoSeqVO.getRooms(); + String roomName = plateDO.getRoomName(); + // 根据房间名获取生产单下序号json中的房间下的加工组序号 + OrderCustomPlateNoSeqRoomVO roomSeqVo = getSeqRoomByRoomName(roomName, rooms); + // 为空初始化,加入列表 + if (roomSeqVo == null) { + roomSeqVo = OrderCustomPlateNoSeqRoomVO.builder() + .roomName(roomName) + .bodys(new ArrayList<>()) + .build(); + rooms.add(roomSeqVo); + } + // 获取当前房间下板件序号 + // 累加步长 + Integer roomPlateNoSeq = Optional.ofNullable(roomSeqVo.getPlateNoSeq()) + .orElse(initValue) + incrementStep; + // 累加后的值同步到当前生产单序号中 + roomSeqVo.setPlateNoSeq(roomPlateNoSeq); + // 补零 + plateDO.getCustomPlateNo().append(fillZero(roomPlateNoSeq, plateNoRule)); + return generateConfig; + } + + /** + * 根据房间名从生产单序号json中获取房间序号列表 + * + * @param roomName + * @param roomVOList + * @return + */ + private OrderCustomPlateNoSeqRoomVO getSeqRoomByRoomName(String roomName, List roomVOList) { + return roomVOList.stream().filter(roomVO -> ObjectUtil.equal(roomName, roomVO.getRoomName())).findAny().orElse(null); + } + + /** + * 按柜体复位模式下的板编号生成 + * + * @param plateNoRule + * @param generateConfig + * @param plateDO + * @return + */ + private CustomPlateNoGenerateConfigVO generateNoByBodyResetMode(CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + Integer incrementStep = plateNoRule.getIncrementStep(); + Integer initValue = plateNoRule.getInitValue() - incrementStep; + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + List rooms = orderCustomPlateNoSeqVO.getRooms(); + + String roomName = plateDO.getRoomName(); + // 根据房间名获取生产单下序号json中的房间下的加工组序号 + OrderCustomPlateNoSeqRoomVO roomSeqVo = getSeqRoomByRoomName(roomName, rooms); + if (ObjectUtil.isNull(roomSeqVo)) { + // 房间为空,new房间 + roomSeqVo = OrderCustomPlateNoSeqRoomVO. + builder() + .roomName(roomName) + .bodys(new ArrayList<>()) + .build(); + rooms.add(roomSeqVo); + } + + String bodyName = plateDO.getBodyName(); + // 根据柜体名获取生产单下序号json中的房间下的加工组序号 + OrderCustomPlateNoSeqBodyVO bodySeqVO = getBodySeqByBodyName(bodyName, roomSeqVo); + + if (bodySeqVO == null) { + // 柜体为空,new柜体 + bodySeqVO = OrderCustomPlateNoSeqBodyVO.builder() + .bodyName(bodyName) + .build(); + roomSeqVo.getBodys().add(bodySeqVO); + } + + // 累加步长 + // 获取柜体下的板件序号 + Integer bodyPlateNoSeq = Optional.ofNullable(bodySeqVO.getPlateNoSeq()).orElse(initValue) + incrementStep; + // 累加后的值同步到当前生产单序号中 + bodySeqVO.setPlateNoSeq(bodyPlateNoSeq); + // 补零 + String noPartAfterFillZero = fillZero(bodyPlateNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFillZero); + return generateConfig; + } + + /** + * 根据房间名从生产单序号json中获取房间序号列表 + * + * @param bodyName + * @param roomVO + * @return + */ + private OrderCustomPlateNoSeqBodyVO getBodySeqByBodyName(String bodyName, OrderCustomPlateNoSeqRoomVO roomVO) { + List bodys = roomVO.getBodys(); + if (ObjectUtil.isNotNull(bodys)) { + for (OrderCustomPlateNoSeqBodyVO bodyVO : bodys) { + if (ObjectUtil.equal(bodyVO.getBodyName(), bodyName)) { + return bodyVO; + } + } + } else { + bodys = new ArrayList<>(); + roomVO.setBodys(bodys); + } + return null; + } + + /** + * 初始化生成所需配置 + * + * @param generateConfigVO + */ + private void initConfig(CustomPlateNoGenerateConfigVO generateConfigVO) { + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfigVO.getOrderCustomPlateNoSeqVO(); + if (ObjectUtil.isNull(orderCustomPlateNoSeqVO)) { + orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO(); + generateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO); + } + List rooms = orderCustomPlateNoSeqVO.getRooms(); + if (CollUtil.isEmpty(rooms)) { + rooms = new ArrayList<>(); + orderCustomPlateNoSeqVO.setRooms(rooms); + } + } + + /** + * 按年复位 + * + * @param curr + * @param year + * @param plateNoRule + * @return + */ + private int resetByYear(int curr, int year, CustomPlateNoRuleVO plateNoRule) { + LocalDateTime now = plateNoRule.getNow(); + Integer initValue = plateNoRule.getInitValue(); + if (ObjectUtil.notEqual(String.valueOf(year), now.format(YEAR_FORMATTER))) { + return initValue; + } + return curr + plateNoRule.getIncrementStep(); + } + + /** + * 按月复位 + * + * @param curr + * @param month + * @param plateNoRule + * @return + */ + private int resetByMonth(int curr, int month, CustomPlateNoRuleVO plateNoRule) { + LocalDateTime now = plateNoRule.getNow(); + Integer initValue = plateNoRule.getInitValue(); + if (ObjectUtil.notEqual(String.valueOf(month), now.format(MONTH_FORMATTER))) { + return initValue; + } + return curr + plateNoRule.getIncrementStep(); + } + + /** + * 按天复位 + * + * @param curr + * @param day + * @param plateNoRule + * @return + */ + private int resetByDay(int curr, int day, CustomPlateNoRuleVO plateNoRule) { + LocalDateTime now = plateNoRule.getNow(); + Integer initValue = plateNoRule.getInitValue(); + if (ObjectUtil.notEqual(String.valueOf(day), now.format(DAY_FORMATTER))) { + return initValue; + } + return curr + plateNoRule.getIncrementStep(); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/ProcessGroupNoGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/ProcessGroupNoGenerateRuleServiceImpl.java new file mode 100644 index 000000000..5ea697da3 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/ProcessGroupNoGenerateRuleServiceImpl.java @@ -0,0 +1,240 @@ +//package com.cf.imes.module.executor.service.customplatenorule; +// +//import cn.hutool.core.collection.CollUtil; +//import cn.hutool.core.util.ObjectUtil; +//import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +//import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +//import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +//import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqProcessGroupVO; +//import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqRoomVO; +//import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO; +//import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqRespDTO; +//import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +//import com.cf.imes.module.system.enums.customplateno.ResetModeEnum; +//import org.springframework.stereotype.Service; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +//import java.util.Optional; +//import java.util.concurrent.atomic.AtomicReference; +//import java.util.stream.Collectors; +// +//import static com.cf.imes.module.executor.enums.ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_PROCESSGROUP_RULE_NOT_SUPPORT_RESETMODE; +// +///** +// * 加工组序号生成规则服务实现类 +// * +// * @author Gqr +// * @since 2024/11/20 13:42 +// */ +//@Service("processGroupNoGenerateRuleService") +//public class ProcessGroupNoGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { +// @Override +// public boolean match(String ruleCode) { +// return false; +// } +// +// @Override +// public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List plateDOList) { +// // 初始化配置 +// initConfig(generateConfig); +// // 按复位模式走不同的生成方式 +// ResetModeEnum resetModeEnum = ResetModeEnum.getByMode(plateNoRule.getResetMode()); +// if (ObjectUtil.equal(ResetModeEnum.ORDER, resetModeEnum)) { +// generateConfig = generateNoByOrderResetMode(orderId, plateNoRule, generateConfig, plateDOList); +// } else if (ObjectUtil.equal(ResetModeEnum.ROOM, resetModeEnum)) { +// generateConfig = generateNoByRoomResetMode(plateNoRule, generateConfig, plateDOList); +// } else { +// throw ServiceExceptionUtil.exception(CUSTOM_PLATENO_GENERATE_PROCESSGROUP_RULE_NOT_SUPPORT_RESETMODE, plateNoRule.getResetMode()); +// } +// return generateConfig; +// } +// +// /** +// * 初始化生成所需配置 +// * +// * @param generateConfigVO +// */ +// private static void initConfig(CustomPlateNoGenerateConfigVO generateConfigVO) { +// OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfigVO.getOrderCustomPlateNoSeqVO(); +// if (ObjectUtil.isNull(orderCustomPlateNoSeqVO)) { +// orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO(); +// generateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO); +// } +// List rooms = orderCustomPlateNoSeqVO.getRooms(); +// if (CollUtil.isEmpty(rooms)) { +// rooms = new ArrayList<>(); +// orderCustomPlateNoSeqVO.setRooms(rooms); +// } +// List processGroups = orderCustomPlateNoSeqVO.getProcessGroups(); +// if (CollUtil.isEmpty(processGroups)) { +// processGroups = new ArrayList<>(); +// orderCustomPlateNoSeqVO.setProcessGroups(processGroups); +// } +// } +// +// +// /** +// * 按生产单复位模式下的板编号生成 +// * +// * @param orderId 生产单号 +// * @param plateNoRule 当前规则配置 +// * @param generateConfig 生成规则配置 +// * @param plateDOList 板件列表 +// * @return +// */ +// private CustomPlateNoGenerateConfigVO generateNoByOrderResetMode(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List plateDOList) { +// Integer initValue = plateNoRule.getInitValue() - plateNoRule.getIncrementStep(); +// // 生产单下的序号 +// OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); +// // 机构下的自定义板编号序号 +// CustomPlateNoSeqRespDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); +// // 生产单下加工组序号 +// Integer orderProcessGroupNoSeq = null; +// List processGroups = orderCustomPlateNoSeqVO.getProcessGroups(); +// if (ObjectUtil.equal(orderId, orgCustomPlateNoSeqRespDTO.getLastOrderNo())) { +// // 当次导入和上次导入是同一个生产单 +// // 取之前的生产单下加工组序号,没有就用初始值 +// orderProcessGroupNoSeq = Optional.ofNullable(orderCustomPlateNoSeqVO.getProcessGroupNoSeq()).orElse(initValue); +// } +// // 基于加工组名分组 +// Map> processGroupMap = plateDOList.stream().collect(Collectors.groupingBy(PlateDO::getProcessGroupName, Collectors.toList())); +// for (Map.Entry> processGroupEntry : processGroupMap.entrySet()) { +// // 如果是新的加工组vo,要把累加的值记录到生产单 +// boolean needRecordToOrder = false; +// String processGroupName = processGroupEntry.getKey(); +// // 根据加工组名获取生产单下序号json中第一层加工组列表的加工组序号 +// OrderCustomPlateNoSeqProcessGroupVO processSeqVO = getProcessGroupSeqVOByProcessGroupName(processGroupName, processGroups); +// // 获取当前加工组序号值 +// Integer processGroupNoSeq = Optional.ofNullable(processSeqVO).map(OrderCustomPlateNoSeqProcessGroupVO::getProcessGroupNoSeq).orElse(initValue); +// if (processSeqVO == null) { +// // 房间为空,新建对象,设置初始值 +// processSeqVO = OrderCustomPlateNoSeqProcessGroupVO.builder() +// .processGroupName(processGroupName) +// .build(); +// processGroups.add(processSeqVO); +// needRecordToOrder = true; +// } +// +// List processGroupPlateList = processGroupEntry.getValue(); +// processGroupNoSeq += plateNoRule.getIncrementStep(); +// // 跨柜体累加步长,补零 +// String noPartAfterFillZero = fillZero(processGroupNoSeq, plateNoRule); +// processGroupPlateList.forEach(processGroupPlate -> processGroupPlate.getCustomPlateNo().append(noPartAfterFillZero)); +// // 累加后同步到json:加工组下累加到多少了 +// processSeqVO.setProcessGroupNoSeq(processGroupNoSeq); +// if (needRecordToOrder) { +// // 新的房间下加工组vo,累加值同步到房间中 +// orderProcessGroupNoSeq = processGroupNoSeq; +// } +// } +// // 累加后的值同步到当前生产单序号中,生产单下加工组序号累加到多少了 +// orderCustomPlateNoSeqVO.setProcessGroupNoSeq(orderProcessGroupNoSeq); +// return generateConfig; +// } +// +// /** +// * 按房间号复位模式下的板编号生成 +// * +// * @param plateNoRule +// * @param generateConfig +// * @param plateDOList +// * @return +// */ +// private CustomPlateNoGenerateConfigVO generateNoByRoomResetMode(CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, List plateDOList) { +// Integer initValue = plateNoRule.getInitValue() - plateNoRule.getIncrementStep(); +// // 生产单下的序号 +// OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); +// List rooms = orderCustomPlateNoSeqVO.getRooms(); +// // 基于房间名分组 +// Map> roomGroupMap = plateDOList.stream().collect(Collectors.groupingBy(PlateDO::getRoomName, Collectors.toList())); +// +// for (Map.Entry> roomEntry : roomGroupMap.entrySet()) { +// List roomPlateList = roomEntry.getValue(); +// String roomName = roomEntry.getKey(); +// // 根据房间名获取生产单下序号json中的房间下的柜体序号 +// OrderCustomPlateNoSeqRoomVO roomSeqVo = getRoomSeqVOByRoomName(roomName, rooms); +// Integer roomProcessGroupNoRoomSeq = Optional.ofNullable(roomSeqVo) +// .map(OrderCustomPlateNoSeqRoomVO::getProcessGroupNoSeq) +// .orElse(initValue); +// +// if (roomSeqVo == null) { +// // 房间为空,新建对象,设置初始值 +// roomSeqVo = OrderCustomPlateNoSeqRoomVO.builder() +// .roomName(roomName) +// .processGroupNoSeq(roomProcessGroupNoRoomSeq) +// .processGroups(new ArrayList<>()) +// .build(); +// rooms.add(roomSeqVo); +// } +// +// // 基于加工组分组 +// Map> roomProcessGroupMap = roomPlateList.stream() +// .collect(Collectors.groupingBy(PlateDO::getProcessGroupName, Collectors.toList())); +// for (Map.Entry> roomPrcesssGroupEntry : roomProcessGroupMap.entrySet()) { +// // 如果是新的柜体vo,要把累加的值记录到生产单rooms下的柜体 +// boolean needRecordToOrder = false; +// String processGroupName = roomPrcesssGroupEntry.getKey(); +// // 根据加工组名获取生产单下序号中rooms下加工组列表的加工组序号 +// List roomProcessGroups = roomSeqVo.getProcessGroups(); +// OrderCustomPlateNoSeqProcessGroupVO roomProcessGroupSeqVo = getProcessGroupSeqVOByProcessGroupName(processGroupName, roomProcessGroups); +// // 获取当前房间下加工组的序号值 +// Integer roomProcessGroupNoSeq = Optional.ofNullable(roomProcessGroupSeqVo).map(OrderCustomPlateNoSeqProcessGroupVO::getProcessGroupNoSeq).orElse(null); +// if (roomProcessGroupSeqVo == null) { +// // 房间下柜体为空,新建对象,设置初始值 +// roomProcessGroupSeqVo = OrderCustomPlateNoSeqProcessGroupVO.builder() +// .processGroupName(processGroupName) +// .build(); +// roomProcessGroups.add(roomProcessGroupSeqVo); +// roomProcessGroupNoSeq= roomProcessGroupNoRoomSeq; +// needRecordToOrder = true; +// } else if(roomProcessGroupNoSeq == null){ +// roomProcessGroupNoSeq= roomProcessGroupNoRoomSeq; +// needRecordToOrder = true; +// } +// +// // 跨加工组累加步长 +// roomProcessGroupNoSeq += plateNoRule.getIncrementStep(); +// // 补零 +// String noPartAfterFillZero = fillZero(roomProcessGroupNoSeq, plateNoRule); +// roomPrcesssGroupEntry.getValue().forEach(roomPrcesssGroupPlate -> roomPrcesssGroupPlate.getCustomPlateNo().append(noPartAfterFillZero)); +// // 累加后同步到json中,room下柜体累加到多少了 +// roomProcessGroupSeqVo.setProcessGroupNoSeq(roomProcessGroupNoSeq); +// if (needRecordToOrder) { +// // 新的房间下柜体vo,累加值同步到房间中 +// roomProcessGroupNoRoomSeq = roomProcessGroupNoSeq; +// } +// } +// // 累加后的值同步到当前生产单序号中,生产单下房间中加工组累加到多少了 +// roomSeqVo.setProcessGroupNoSeq(roomProcessGroupNoRoomSeq); +// } +// return generateConfig; +// } +// +// /** +// * 根据房间名从生产单序号json中获取房间序号列表 +// * +// * @param roomName +// * @param roomVOList +// * @return +// */ +// private OrderCustomPlateNoSeqRoomVO getRoomSeqVOByRoomName(String roomName, List roomVOList) { +// return roomVOList.stream().filter(roomVO -> ObjectUtil.equal(roomName, roomVO.getRoomName())).findAny().orElse(null); +// } +// +// /** +// * 根据柜体名从生产单序号json中获取柜体序号列表 +// * +// * @param processGroupName +// * @param processGroupVOList +// * @return +// */ +// private OrderCustomPlateNoSeqProcessGroupVO getProcessGroupSeqVOByProcessGroupName(String processGroupName, List processGroupVOList) { +// if (CollUtil.isEmpty(processGroupVOList)) { +// return null; +// } +// return processGroupVOList.stream().filter(processGroupVO -> ObjectUtil.equal(processGroupName, processGroupVO.getProcessGroupName())).findAny().orElse(null); +// } +//} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/RoomNoGenerateRuleServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/RoomNoGenerateRuleServiceImpl.java new file mode 100644 index 000000000..bb25a254b --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplatenorule/RoomNoGenerateRuleServiceImpl.java @@ -0,0 +1,107 @@ +package com.cf.imes.module.executor.service.customplatenorule; + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoGenerateConfigVO; +import com.cf.imes.module.executor.service.customplateno.vo.CustomPlateNoRuleVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqRoomVO; +import com.cf.imes.module.executor.service.customplateno.vo.OrderCustomPlateNoSeqVO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; +import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * 房间序号生成规则服务实现类 + * + * @author Gqr + * @since 2024/11/19 13:41 + */ +@Service("roomNoGenerateRuleService") +public class RoomNoGenerateRuleServiceImpl implements CustomPlateNoGenerateRuleService { + @Override + public boolean match(String ruleCode) { + return ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ROOMNO.getRuleCode(), ruleCode); + } + + @Override + public CustomPlateNoGenerateConfigVO generateNo(Long orderId, CustomPlateNoRuleVO plateNoRule, CustomPlateNoGenerateConfigVO generateConfig, PlateDO plateDO) { + Integer incrementStep = plateNoRule.getIncrementStep(); + Integer initValue = plateNoRule.getInitValue() - incrementStep; + // 初始化配置 + initConfig(generateConfig); + // 生产单下的序号 + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO(); + // 机构下的自定义板编号序号 + CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO(); + // 生产单下房间序号 + Integer orderRoomNoSeq = Optional.ofNullable(orderCustomPlateNoSeqVO.getRoomNoSeq()).orElse(initValue); + // 生产单序号下的的房间序号列表 + List rooms = orderCustomPlateNoSeqVO.getRooms(); + // 上次导入的生产单号 + Long lastOrderNo = orgCustomPlateNoSeqRespDTO.getLastOrderNo(); + if (ObjectUtil.isNotNull(lastOrderNo) && ObjectUtil.notEqual(orderId, lastOrderNo)) { + // 跨单复位到初始值 + orderRoomNoSeq = initValue; + } + + String roomName = plateDO.getRoomName(); + // 根据房间名获取生产单下序号json中的房间下的柜体序号 + OrderCustomPlateNoSeqRoomVO roomSeqVo = getRoomSeqVOByRoomName(roomName, rooms); + // 获取当前房间序号值 + Integer roomNoSeq = Optional.ofNullable(roomSeqVo).map(OrderCustomPlateNoSeqRoomVO::getRoomNoSeq).orElse(null); + if (roomSeqVo == null) { + // 房间为空,新建房间,取生产单下房间序号 + roomSeqVo = OrderCustomPlateNoSeqRoomVO.builder() + .roomName(roomName) + .bodys(new ArrayList<>()) + .build(); + rooms.add(roomSeqVo); + // 累加步长 + roomNoSeq = orderRoomNoSeq + incrementStep; + // 累加后的值同步到当前生产单序号中,生产单下房间序号累加到多少了 + orderCustomPlateNoSeqVO.setRoomNoSeq(roomNoSeq); + } else if (roomNoSeq == null) { + // 房间下序号为空,取生产单下房间序号 + // 累加步长 + roomNoSeq = orderRoomNoSeq + incrementStep; + // 累加后的值同步到当前生产单序号中,生产单下房间序号累加到多少了 + orderCustomPlateNoSeqVO.setRoomNoSeq(roomNoSeq); + } + + // 补零 + String noPartAfterFillZero = fillZero(roomNoSeq, plateNoRule); + plateDO.getCustomPlateNo().append(noPartAfterFillZero); + // 累加后同步到json:房间下累加到多少了 + roomSeqVo.setRoomNoSeq(roomNoSeq); + + return generateConfig; + } + + /** + * 初始化生成所需配置 + * + * @param generateConfigVO + */ + private static void initConfig(CustomPlateNoGenerateConfigVO generateConfigVO) { + OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfigVO.getOrderCustomPlateNoSeqVO(); + if (ObjectUtil.isNull(orderCustomPlateNoSeqVO)) { + orderCustomPlateNoSeqVO = new OrderCustomPlateNoSeqVO(); + generateConfigVO.setOrderCustomPlateNoSeqVO(orderCustomPlateNoSeqVO); + } + } + + /** + * 根据房间名从生产单序号json中获取房间序号列表 + * + * @param roomName + * @param roomVOList + * @return + */ + private OrderCustomPlateNoSeqRoomVO getRoomSeqVOByRoomName(String roomName, List roomVOList) { + return roomVOList.stream().filter(roomVO -> ObjectUtil.equal(roomName, roomVO.getRoomName())).findAny().orElse(null); + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java index a547e2c04..f9d99404d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/optimizeplan/OptimizePlanServiceImpl.java @@ -266,8 +266,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List orderDOS = orderMapper.selectOrderPackList(orderIds, getUserOrganId()); if (ObjectUtil.isNotEmpty(orderDOS)) { - List orderDOList = orderDOS.stream().map(m -> m.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus())).toList(); - orderMapper.updateBatch(orderDOList); + orderDOS.forEach(f -> { + f.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); + f.setFinishTime(LocalDateTime.now()); + }); + orderMapper.updateBatch(orderDOS); } } @@ -304,9 +307,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { Boolean isOptimized = optimizeBoardModelDO.getIsOptimized(); if(Boolean.FALSE.equals(isOptimized)){ - throw exception(ORDER_PLAN_NO_OPTIMIZE_UPDATE_ERROR); - } @@ -355,9 +356,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { if(!orderIdList.isEmpty()) { List orderDOList = orderMapper.selectBatchIds(orderIdList); - orderMapper.updateBatch(orderDOList.stream() - .map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())) - .toList()); + orderDOList.forEach(f -> { + f.setStatus(OrderStatusEnum.SORTED.getStatus()); + f.setFinishTime(null); + }); + orderMapper.updateBatch(orderDOList); + } return; @@ -382,8 +386,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { List orderDOS = orderMapper.selectOrderList(orderIds, getUserOrganId()); if(!orderDOS.isEmpty()){ - List orderDOList = orderDOS.stream().map(m -> m.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus())).toList(); - orderMapper.updateBatch(orderDOList); + orderDOS.forEach(f -> { + f.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus()); + f.setFinishTime(null); + }); + orderMapper.updateBatch(orderDOS); } } @@ -916,6 +923,7 @@ public class OptimizePlanServiceImpl implements OptimizePlanService { + // ES 文档数据刷新 public void refresh( String index) { try { diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OrderPartsRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OrderPartsRespVO.java index acaf61fae..98b7fb5ec 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OrderPartsRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OrderPartsRespVO.java @@ -45,4 +45,25 @@ public class OrderPartsRespVO { @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) private String remark; + + @Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String partsColor; + + @Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsWidth; + + @Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsLength; + + @Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsThickness; + + @Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) + private String category; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) + private String subparts; + + + } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OtherPackReqVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OtherPackReqVO.java index c62f1b8d8..b637737bc 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OtherPackReqVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/pack/vo/OtherPackReqVO.java @@ -23,7 +23,7 @@ public class OtherPackReqVO { @Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "配件名称不能为空") - @Size(max = 30, message = "配件名称长度不能超过 64 个字符") + @Size(max = 64, message = "配件名称长度不能超过 64 个字符") private String name; @@ -31,6 +31,12 @@ public class OtherPackReqVO { @NumberValid(name = "配件数量") private Double num; + + @Schema(description = "配件单位", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "配件单位不能为空") + @Size(max = 32, message = "配件单位长度不能超过 32 个字符") + private String unit; + @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) private String packNo; diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java index 1faa5b3fc..d62bf6436 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/controller/admin/query/vo/pack/PackageDetailsRespVO.java @@ -105,4 +105,23 @@ public class PackageDetailsRespVO { private String factory; + @Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) + private String partsColor; + + @Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsWidth; + + @Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsLength; + + @Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) + private Double partsThickness; + + @Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) + private String category; + + @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) + private String subparts; + + } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java index 1189ac1e8..688174273 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.java @@ -10,7 +10,6 @@ import com.cf.imes.framework.common.enums.OrderPackageTypeEnum; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.manage.controller.admin.pack.vo.PackRespVO; -import com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList; import com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO; import com.cf.imes.module.manage.dal.dataobject.query.OrderPackageDO; import org.apache.ibatis.annotations.Mapper; @@ -73,8 +72,6 @@ public interface OrderPackageMapper extends BaseMapperX { List selectPackPieceCount(@Param("orderIds") List orderIds, @Param("organId") Long organId); - List selectOrderPack(@Param("orderId") Long orderId,@Param("organId") Long organId); - // 删除当前生产单下所有的包裹 default void updateDelete(Long orderId,Long organId) { diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java index 0d6ddea53..87384bb37 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/dal/mysql/query/OrderItemMapper.java @@ -3,6 +3,7 @@ package com.cf.imes.module.manage.dal.mysql.query; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList; import com.cf.imes.module.manage.controller.admin.pack.vo.PlateDetailsRespVO; import com.cf.imes.module.manage.controller.admin.process.vo.PlateDetails; import com.cf.imes.module.manage.controller.admin.process.vo.ProcessPlateReqVO; @@ -80,17 +81,6 @@ public interface OrderItemMapper extends BaseMapperX { } - - - default List selectPartsList(Long orderId, Long organId) { - return selectList(new LambdaQueryWrapperX() - .eq(OrderItemDO::getOrganId, organId) - .eqIfPresent(OrderItemDO::getOrderId, orderId) - .eq(OrderItemDO::getPackageId,0) - .select(OrderItemDO::getPartsId)); - } - - default List selectPackByPlateId(List plateId,Long orderId ,Long organId) { return selectList(new LambdaQueryWrapperX() .eq(OrderItemDO::getOrganId, organId) @@ -98,4 +88,11 @@ public interface OrderItemMapper extends BaseMapperX { .inIfPresent(OrderItemDO::getPlateId, plateId) .select(OrderItemDO::getPackageId)); } + + + List selectOrderPackPartsIds(@Param("orderId") Long orderId, @Param("organId") Long organId); + + List selectOrderPackPlateIds(@Param("orderId") Long orderId,@Param("organId") Long organId); + + } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java index 0fe435075..c23967ed1 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/pack/PackServiceImpl.java @@ -44,6 +44,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -268,7 +269,6 @@ public class PackServiceImpl implements PackService { @Override public List getPartsList(OrderPartsReqVO reqVO) { - return orderPartsMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId()); } @@ -381,6 +381,7 @@ public class PackServiceImpl implements PackService { if(orderDO.getStatus().equals(OrderStatusEnum.FINISH_PRODUCTION.getStatus())){ orderDO.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus()); + orderDO.setFinishTime(null); } ordersMapper.updateById(orderDO); @@ -491,10 +492,11 @@ public class PackServiceImpl implements PackService { return false; } - List plateAndPartIdLists = orderPackageMapper.selectOrderPack(orderId, getUserOrganId()); + List partsIds = orderItemMapper.selectOrderPackPartsIds(orderId, getUserOrganId()); + List plateIds = orderItemMapper.selectOrderPackPlateIds(orderId, getUserOrganId()); - return plateAndPartIdLists.isEmpty(); + return partsIds.isEmpty() && plateIds.isEmpty(); } @@ -512,6 +514,7 @@ public class PackServiceImpl implements PackService { if(orderPlanApi.getOrder(orderId).getData()){ orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); + orderDO.setFinishTime(LocalDateTime.now()); } @@ -618,6 +621,7 @@ public class PackServiceImpl implements PackService { OrderPartsNDO orderParts = BeanUtils.toBean(reqVO, OrderPartsNDO.class); // 因为是外部配件,所以配件类型的名称固定为 “ 外部配件” orderParts.setType("外部配件"); + orderParts.setUnit(reqVO.getUnit()); orderPartsMapper.insert(orderParts); @@ -665,6 +669,7 @@ public class PackServiceImpl implements PackService { OrderPartsNDO orderParts = BeanUtils.toBean(reqVO, OrderPartsNDO.class); // 因为是外部配件,所以配件类型的名称固定为 “ 外部配件” orderParts.setType("外部配件"); + orderParts.setUnit(reqVO.getUnit()); orderPartsMapper.insert(orderParts); // 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量) @@ -825,13 +830,14 @@ public class PackServiceImpl implements PackService { orderItemMapper.updateBatch(orderItemDOS); // 查询配件是否为空,为空,修改生产单的状态为已打包 - List orderItemDoPartsList = orderItemMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId()); + List partsIds = orderItemMapper.selectOrderPackPartsIds(reqVO.getOrderId(), getUserOrganId()); - if (orderItemDoPartsList.isEmpty()) { + if (partsIds.isEmpty()) { OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus()); if(Boolean.TRUE.equals(orderPlanApi.getOrder(reqVO.getOrderId()).getData())){ orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); + orderDO.setFinishTime(LocalDateTime.now()); } ordersMapper.updateById(orderDO); } diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml index ccab1614e..0e8651dc5 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/pack/OrderPackageMapper.xml @@ -110,21 +110,6 @@ - - - + + + + \ No newline at end of file diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderPartsMapper.xml b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderPartsMapper.xml index d59e9704b..1ded583dd 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderPartsMapper.xml +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/resources/com/cf/imes/module/manage/dal/mysql/query/OrderPartsMapper.xml @@ -17,6 +17,12 @@ + + + + + + diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java index a594ec997..a2425150b 100644 --- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java +++ b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java @@ -14,6 +14,7 @@ public final class ErrorCodeConstants { public static final ErrorCode TEMPLATE_NOT_EXISTS = new ErrorCode(1_003_001_001, "报表模板信息不存在"); public static final ErrorCode TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR = new ErrorCode(1_003_001_002, "内置模板操作权限不足"); public static final ErrorCode TEMPLATE_NAME_UNIQE_ERROR = new ErrorCode(1_003_001_003, "模板名【{}】已存在,请编辑模板名后重试"); + public static final ErrorCode TEMPLATE_PREIVEW_QUERYPARAM_EMPTY = new ErrorCode(1_003_001_004, "查询参数不能为空:{}"); // ========== UREPORT datasource模块 1-003-002-000 ========== diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java index c36eba371..bb15f22fe 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java @@ -56,7 +56,7 @@ public class ReportDatasetSaveReqVO implements Serializable { private List parameters = new ArrayList<>(); @Schema(description = "字段列表") - @Size(max = 30, message = "字段列表数量不能超过30个") + @Size(max = 100, message = "字段列表数量不能超过100个") @Valid private List fields = new ArrayList<>(); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java index 30a62b9b4..e2800af05 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java @@ -2,7 +2,6 @@ package com.cf.imes.module.report.controller.admin.datasource; import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.datasource.bean.DataSourceInfo; -import com.bstek.datasource.bean.PreviewParams; import com.bstek.datasource.service.DataSourceService; import com.bstek.ureport.definition.dataset.Field; import com.cf.imes.framework.common.pojo.CommonResult; @@ -14,6 +13,7 @@ import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasource import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceTestConnReqVO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.service.datasource.ReportDatasourceService; +import com.cf.imes.module.report.utils.TenantParamsUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -51,6 +51,9 @@ public class ReportDatasourceController { @Resource private DataSourceService ureportDataSourceService; + @Resource + private TenantParamsUtils tenantParamsUtils; + @PutMapping("/datasource") @Operation(summary = "创建报表数据源") @PreAuthorize("@ss.hasPermission('report:design')") @@ -87,8 +90,8 @@ public class ReportDatasourceController { @GetMapping("/datasources") @Operation(summary = "获取报表数据源列表") @PreAuthorize("@ss.hasPermission('report:design')") - public CommonResult> getDatasourcePage() { - return success(BeanUtils.toBean(datasourceService.getDatasourceList(), ReportDatasourceRespVO.class)); + public CommonResult> getDatasourcePage(@RequestParam(value = "organId", required = false) Long organId) { + return success(BeanUtils.toBean(datasourceService.getDatasourceList(organId), ReportDatasourceRespVO.class)); } @GetMapping("/datasource/beans") @@ -134,13 +137,13 @@ public class ReportDatasourceController { @Operation(summary = "获取数据源表字段") @PreAuthorize("@ss.hasPermission('report:design')") public CommonResult> getDatasourceTableFields(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) { - return success(datasourceService.getTableFields(BeanUtils.toBean(reqVO, PreviewParams.class))); + return success(datasourceService.getTableFields(tenantParamsUtils.prepareTenantParam(reqVO))); } @PostMapping("/datasource/preview") @Operation(summary = "数据源预览") @PreAuthorize("@ss.hasPermission('report:design')") public CommonResult> previewData(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) { - return success(ureportDataSourceService.previewData(BeanUtils.toBean(reqVO, PreviewParams.class))); + return success(ureportDataSourceService.previewData(tenantParamsUtils.prepareTenantParam(reqVO))); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java index a90a1a37c..9ff4a8a3c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java @@ -24,7 +24,7 @@ import java.util.List; @NoArgsConstructor public class ReportDatasourcePreviewReqVO { @Schema(description = "数据源连接信息") - @NotNull + @NotNull(message = "数据源连接信息不能为空") @Valid private ReportDatasourceTestConnReqVO info; @@ -37,4 +37,8 @@ public class ReportDatasourcePreviewReqVO { @Size(max = 30, message = "查询参数列表数量不能超过30个") @Valid private List parameters; + + @Schema(description = "数据源编号") + @NotNull(message = "数据源编号不能为空") + private Long datasourceId; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java index 4903eaf50..4a7b1d32a 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java @@ -101,8 +101,10 @@ public class ReportTemplateController { @GetMapping("/templates") @Operation(summary = "获取报表模板信息列表") @PreAuthorize("@ss.hasPermission('report:design')") - public CommonResult> getTemplatePage(@RequestParam(value = "name", required = false) @Size(max = 64, message = "模板名称长度不能超过64个字符") String name) { - ReportTemplateReqVO reqVO = new ReportTemplateReqVO(name, null); + public CommonResult> getTemplatePage( + @RequestParam(value = "name", required = false) @Size(max = 64, message = "模板名称长度不能超过64个字符") String name, + @RequestParam(value = "organId", required = false) Long organId) { + ReportTemplateReqVO reqVO = new ReportTemplateReqVO(name, null, organId); return success(BeanUtils.toBean(templateService.getReportTemplateList(reqVO), ReportTemplateRespVO.class)); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateReqVO.java index 397a40189..727350d73 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateReqVO.java @@ -21,4 +21,7 @@ public class ReportTemplateReqVO { @Schema(description = "模板类型,0内置、1自定义", example = "1") private Integer type; + + @Schema(description = "组织id") + private Long organId; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java index b602e7e75..ac7c93b0d 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java @@ -49,10 +49,10 @@ public interface ReportDatasourceService { /** * 获取模板下的数据源列表 * - * @param reqVO 查询参数 + * @param organId 组织id * @return 报表数据源分页 */ - List getDatasourceList(); + List getDatasourceList(Long organId); /** * 获取springbean数据源列表 diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index fabd876f3..d25e1bb2a 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -13,7 +13,6 @@ import com.bstek.datasource.bean.PreviewParams; import com.bstek.ureport.definition.dataset.Field; import com.bstek.ureport.definition.dataset.Parameter; import com.bstek.ureport.definition.dataset.SqlDatasetDefinition; -import com.bstek.ureport.definition.dataset.TenantParams; import com.bstek.ureport.utils.ProcedureUtils; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; @@ -133,16 +132,21 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override @OrganIgnore - public List getDatasourceList() { + public List getDatasourceList(Long organId) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapperX().orderByDesc(ReportDatasourceDO::getCreateTime); - if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { - // 普通用户查看机构下的和system数据源 - queryWrapper.or(wrapper -> wrapper - .eq(ReportDatasourceDO::getOrganId, loginUser.getOrganId()) - .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)) - .or(wrapper -> wrapper.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)); + // 当前登录人机构id + Long currentOrganId = loginUser.getOrganId(); + // 超管查看不同组织数据源 + if (ObjectUtil.isNotNull(loginUser) && Boolean.TRUE.equals(loginUser.getIsSupAdmin()) && ObjectUtil.isNotNull(organId)) { + currentOrganId = organId; } + Long finalCurrentOrganId = currentOrganId; + queryWrapper.or(wrapper -> wrapper + .eq(ReportDatasourceDO::getOrganId, finalCurrentOrganId) + .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)) + .or(wrapper -> wrapper.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)); + List reportDatasourceDOS = datasourceMapper.selectList(queryWrapper); // 查询数据集 if (CollUtil.isNotEmpty(reportDatasourceDOS)) { @@ -150,7 +154,6 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { queryDatasetInSource(reportDatasourceDO); }); } - // 超管查看全部 return reportDatasourceDOS; } @@ -233,7 +236,7 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { Map params = new HashMap<>(); Map pmap = sqlDatasetDefinition.buildParameters(params); - String sqlForUse = sqlDatasetDefinition.parseSql(pmap, new TenantParams()); + String sqlForUse = sqlDatasetDefinition.parseSql(pmap, previewParams.getTenantParams()); if (ProcedureUtils.isProcedure(sqlForUse)) { return ProcedureUtils.procedureColumnsQuery(sqlForUse, pmap, conn); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index f5fb34878..bb4201bb5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -30,11 +30,11 @@ import com.bstek.ureport.parser.ReportParser; import com.bstek.ureport.utils.ToolUtils; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; -import com.cf.imes.module.report.config.CfReportProperties; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplatePreviewReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateRespVO; @@ -46,9 +46,11 @@ import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; +import com.cf.imes.module.report.utils.TenantParamsUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; @@ -64,12 +66,12 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NAME_UNIQE_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_PREIVEW_QUERYPARAM_EMPTY; /** * 报表模板信息 Service 实现类 @@ -92,7 +94,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { private static final String UTF8_CHARSET = CharsetUtil.UTF_8; @Resource - private CfReportProperties cfReportProperties; + private TenantParamsUtils tenantParamsUtils; @Override @Transactional(rollbackFor = Exception.class) @@ -340,54 +342,44 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public List getReportTemplateList(ReportTemplateReqVO reqVO) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapperX().likeIfPresent(ReportTemplateDO::getName, reqVO.getName()) - .orderByDesc(ReportTemplateDO::getCreateTime) - // 不返回content xml,点击具体的模板中返回xml - .select(ReportTemplateDO::getId, ReportTemplateDO::getName, ReportTemplateDO::getCreateTime, ReportTemplateDO::getRemark, ReportTemplateDO::getType); - if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { - return templateMapper.selectNormalTemplateList(reqVO.getName(), loginUser.getOrganId()); - } else { - // 超管查看全部 - return templateMapper.selectList(queryWrapper); + // 当前登录人机构id + Long organId = loginUser.getOrganId(); + // 超管查看不同组织模板 + if (ObjectUtil.isNotNull(loginUser) && Boolean.TRUE.equals(loginUser.getIsSupAdmin()) && ObjectUtil.isNotNull(reqVO.getOrganId())) { + organId = reqVO.getOrganId(); + } + return templateMapper.selectNormalTemplateList(reqVO.getName(), organId); + } + + /** + * 检查查询参数不为空 + * + * @param queryMap + */ + private void checkQueryNotEmpty(Map queryMap) { + if (ObjectUtil.isNotNull(queryMap)) { + for (Map.Entry entry : queryMap.entrySet()) { + String key = entry.getKey(); + if (ObjectUtils.isEmpty(entry.getValue()) && ObjectUtil.notEqual(key, "datasetIds") && ObjectUtil.notEqual(key, "datasourceIds")) { + throw ServiceExceptionUtil.exception(TEMPLATE_PREIVEW_QUERYPARAM_EMPTY, key); + } + } } } @Override public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) { + // 检查查询参数中的空值 + checkQueryNotEmpty(reqVO.getQuery()); // 自定义请求vo转ureport对象 PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); - Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); HtmlProducer htmlProducer = new HtmlProducer(); ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params); Map parameters = params.getQuery(); - if (Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { - // 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport - List datasetIds = (List) parameters.get("datasetIds"); - if (CollUtil.isNotEmpty(datasetIds)) { - // 内置数据集名称列表 - List buildinDsNames = new ArrayList<>(); - // 遍历获取所有上级数据源 - List reportDatasetDOS = datasetMapper.selectNormalDatasetList(datasetIds.stream().collect(Collectors.toSet())); - for (ReportDatasetDO datasetDO : reportDatasetDOS) { - Long datasourceId = datasetDO.getDatasourceId(); - // 查询数据源,如果是内置数据源则把数据集的name传给ureport - // 机构下 + 内置数据源查询 - ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); - if (ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { - buildinDsNames.add(datasetDO.getName()); - } - } - if (CollUtil.isNotEmpty(buildinDsNames)) { - parameters.put("buildinDsNames", buildinDsNames); - } - } - // imes多租户业务表表名列表 - parameters.put("tenantTableNames", cfReportProperties.getTenantTableNames()); - // 用户组织id - parameters.put("organId", userOrganId); - } + // 增加多租户参数 + tenantParamsUtils.prepareTenantParam(parameters); Report report = reportRender.render(reportDefinition, parameters); return htmlProducer.produce(reportDefinition, report); } @@ -400,7 +392,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { long start = System.currentTimeMillis(); ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params); - Report report = reportRender.render(reportDefinition, params.getQuery()); + Map query = params.getQuery(); + // 增加多租户参数 + tenantParamsUtils.prepareTenantParam(query); + Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); report.setChartImages(chartImages); try { @@ -427,7 +422,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params); - Report report = reportRender.render(reportDefinition, params.getQuery()); + Map query = params.getQuery(); + // 增加多租户参数 + tenantParamsUtils.prepareTenantParam(query); + Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); report.setChartImages(chartImages); try { diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java new file mode 100644 index 000000000..8493278ac --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java @@ -0,0 +1,102 @@ +package com.cf.imes.module.report.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.bstek.datasource.bean.PreviewParams; +import com.bstek.ureport.definition.dataset.TenantParams; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +import com.cf.imes.module.report.config.CfReportProperties; +import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourcePreviewReqVO; +import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; +import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; +import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 租户参数工具类 + * + * @author Gqr + * @since 2024/11/27 10:32 + */ +@Component +public class TenantParamsUtils { + + @Resource + private ReportDatasourceMapper datasourceMapper; + + @Resource + private ReportDatasetMapper datasetMapper; + + @Resource + private CfReportProperties cfReportProperties; + + /** + * 根据数据源id构造租户对象 + * + * @param reqVO + */ + public PreviewParams prepareTenantParam(ReportDatasourcePreviewReqVO reqVO) { + PreviewParams previewParams = BeanUtils.toBean(reqVO, PreviewParams.class); + Long datasourceId = reqVO.getDatasourceId(); + TenantParams tenantParams = new TenantParams(); + Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); + // 根据前端传递的数据源id,判断是不是内置数据源,是就把所有其下的datasetname传给ureport + ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); + if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { + List datasetDOList = datasetMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasetDO::getDatasourceId, datasourceId)); + if (CollUtil.isNotEmpty(datasetDOList)) { + tenantParams.setBuildinDsNames(datasetDOList.stream().map(ReportDatasetDO::getName).collect(Collectors.toList())); + } + } + // 用户组织id + tenantParams.setOrganId(userOrganId); + // imes多租户业务表表名列表 + tenantParams.setTenantTableNames(cfReportProperties.getTenantTableNames()); + previewParams.setTenantParams(tenantParams); + return previewParams; + } + + /** + * 往parameters中增加租户相关参数 + * + * @param parameters + */ + public void prepareTenantParam(Map parameters) { + Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); + // 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport + List datasetIds = (List) parameters.get("datasetIds"); + if (CollUtil.isNotEmpty(datasetIds)) { + // 内置数据集名称列表 + List buildinDsNames = new ArrayList<>(); + // 遍历获取所有上级数据源 + List reportDatasetDOS = datasetMapper.selectNormalDatasetList(datasetIds.stream().collect(Collectors.toSet())); + for (ReportDatasetDO datasetDO : reportDatasetDOS) { + Long datasourceId = datasetDO.getDatasourceId(); + // 查询数据源,如果是内置数据源则把数据集的name传给ureport + // 机构下 + 内置数据源查询 + ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); + if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { + buildinDsNames.add(datasetDO.getName()); + } + } + if (CollUtil.isNotEmpty(buildinDsNames)) { + parameters.put("buildinDsNames", buildinDsNames); + } + } + // imes多租户业务表表名列表 + parameters.put("tenantTableNames", cfReportProperties.getTenantTableNames()); + // 用户组织id + parameters.put("organId", userOrganId); + } + +} diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar index fa2621d2e..a4e48968e 100644 Binary files a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar and b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar differ diff --git a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java index 63670c962..4cc9aaed1 100644 --- a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java +++ b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java @@ -72,7 +72,7 @@ public class ReportDatasourceServiceImplTest extends ReportCommonServiceImplTest reqVO.setTemplateId(templateId); reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode()); reqVO.setName(updateReqVO.getName()); - List templateDatasourceList = reportDatasourceService.getDatasourceList(); + List templateDatasourceList = reportDatasourceService.getDatasourceList(null); assertNotNull(templateDatasourceList); assertNotEquals(0, templateDatasourceList.size()); diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApi.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApi.java index 45c9a4105..b932ece92 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApi.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApi.java @@ -1,12 +1,14 @@ package com.cf.imes.module.system.api.customplateno; import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqRespDTO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; import com.cf.imes.module.system.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; /** @@ -22,5 +24,9 @@ public interface CustomPlateNoSeqApi { @GetMapping(PREFIX + "/organ") @Operation(summary = "获取组织下自定义版编号序号") - CommonResult getOrgCustomPlateNoSeq(); + CommonResult getOrgCustomPlateNoSeq(); + + @PostMapping(PREFIX + "/organ") + @Operation(summary = "更新组织下自定义版编号序号") + CommonResult modifyOrgCustomPlateNoSeq(@RequestBody CustomPlateNoSeqDTO customPlateNoSeqDTO); } diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/dto/CustomPlateNoSeqRespDTO.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/dto/CustomPlateNoSeqDTO.java similarity index 86% rename from cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/dto/CustomPlateNoSeqRespDTO.java rename to cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/dto/CustomPlateNoSeqDTO.java index f4322d3f9..009fc9731 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/dto/CustomPlateNoSeqRespDTO.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/api/customplateno/dto/CustomPlateNoSeqDTO.java @@ -15,7 +15,7 @@ import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor -public class CustomPlateNoSeqRespDTO implements Serializable { +public class CustomPlateNoSeqDTO implements Serializable { private static final long serialVersionUID = -3415615478757941611L; private Long id; @@ -48,15 +48,15 @@ public class CustomPlateNoSeqRespDTO implements Serializable { /** * 上次年 */ - private int lastYear; + private Integer lastYear; /** * 上次月 */ - private int lastMonth; + private Integer lastMonth; /** * 上次天 */ - private int lastDay; + private Integer lastDay; } diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java index 0d97370cc..47c79a9f2 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java @@ -9,6 +9,7 @@ public class DictTypeConstants { public static final String USER_TYPE = "user_type"; // 用户类型 public static final String COMMON_STATUS = "common_status"; // 系统状态 + public static final String ROLE_TYPE = "system_role_type"; // 系统角色类型 // ========== SYSTEM 模块 ========== diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index 92200f4b4..537f4402a 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -50,7 +50,7 @@ public class ErrorCodeConstants { public static final ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); public static final ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "创建用户失败,原因:超过组织最大组织配额({})!"); public static final ErrorCode USER_ME_ERROR = new ErrorCode(1_002_003_009, "不允许操作用户自身"); - public static final ErrorCode THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS = new ErrorCode(1_002_003_010, "密码长度必须至少为8个字符"); + public static final ErrorCode THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS = new ErrorCode(1_002_003_010, "密码长度不少于8位,且包含大小写字母、数字和特殊字符"); public static final ErrorCode THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_LOWER_LETTER = new ErrorCode(1_002_003_011, "密码必须包含至少一个小写字母"); public static final ErrorCode THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_NUMBER = new ErrorCode(1_002_003_012, "密码必须包含至少一个数字"); @@ -123,8 +123,8 @@ public class ErrorCodeConstants { // ========== 组织信息 1-002-015-000 ========== public static final ErrorCode ORGAN_NOT_EXISTS = new ErrorCode(1_002_015_000, "组织不存在"); - public static final ErrorCode ORGAN_DISABLE = new ErrorCode(1_002_015_001, "名字为【{}】的组织已被禁用"); - public static final ErrorCode ORGAN_EXPIRE = new ErrorCode(1_002_015_002, "名字为【{}】的组织已过期"); + public static final ErrorCode ORGAN_DISABLE = new ErrorCode(1_002_015_001, "【{}】组织已被禁用"); + public static final ErrorCode ORGAN_EXPIRE = new ErrorCode(1_002_015_002, "【{}】组织已过期"); public static final ErrorCode ORGAN_CAN_NOT_UPDATE_SYSTEM = new ErrorCode(1_002_015_003, "系统组织不能进行修改、删除等操作!"); public static final ErrorCode ORGAN_NAME_DUPLICATE = new ErrorCode(1_002_015_004, "名字为【{}】的组织已存在"); public static final ErrorCode ORGAN_WEBSITE_DUPLICATE = new ErrorCode(1_002_015_005, "域名为【{}】的组织已存在"); @@ -135,7 +135,7 @@ public class ErrorCodeConstants { // ========== 组织套餐 1-002-016-000 ========== public static final ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1_002_016_000, "组织套餐不存在"); public static final ErrorCode TENANT_PACKAGE_USED = new ErrorCode(1_002_016_001, "组织正在使用该套餐,请给组织重新设置套餐后再尝试删除"); - public static final ErrorCode TENANT_PACKAGE_DISABLE = new ErrorCode(1_002_016_002, "名字为【{}】的组织套餐已被禁用"); + public static final ErrorCode TENANT_PACKAGE_DISABLE = new ErrorCode(1_002_016_002, "【{}】组织套餐已被禁用"); public static final ErrorCode TENANT_PACKAGE_DEPT_EXIT = new ErrorCode(1_002_016_003, "无法修改内置组织权限套餐"); public static final ErrorCode TENANT_PACKAGE_DELETED_EXIT = new ErrorCode(1_002_016_004, "无法删除内置组织权限套餐"); public static final ErrorCode TENANT_PACKAGE_NAME_UNIQE_ERROR = new ErrorCode(1_002_016_005, "套餐名已存在,请编辑套餐名后重试"); @@ -343,11 +343,11 @@ public class ErrorCodeConstants { public static final ErrorCode CURRENTLY_NO_CONFIGURATION_AVAILABLE = new ErrorCode(1_002_039_001, "当前没有{}配置信息,请前往设置配置"); public static final ErrorCode BRANCHING_SETTING_NAME_REPEAT = new ErrorCode(1_002_039_002, "分线配置名称重复,请重新设置"); public static final ErrorCode BRANCHING_SETTING_RULE_SAVE_CHECK_ERROR = new ErrorCode(1_002_039_003, "智能分线配置保存解析失败,数据有误,请检查配置规则或联系客服"); - public static final ErrorCode BRANCHING_SETTING_SAVE_ERROR = new ErrorCode(1_002_039_004, "智能分线配置为空,请添加配置"); + public static final ErrorCode BRANCHING_SETTING_SAVE_ERROR = new ErrorCode(1_002_039_004, "机台:{} 的配置为空,请添加配置"); public static final ErrorCode BRANCHING_SETTING_COUNT_ERROR = new ErrorCode(1_002_039_005, "智能分线配置机台数量必须大于2才能保存"); //=========== 系统配置 1-002-040-000 ============ public static final ErrorCode SYSTEM_CONFIG_NOT_EXISTS = new ErrorCode(1_002_040_001, "系统配置不存在"); public static final ErrorCode SYSTEM_CONFIG_TYPE_NOT_SUPPORT = new ErrorCode(1_002_040_002, "不支持的系统配置类型"); - public static final ErrorCode SYSTEM_CONFIG_CUSTOM_BOARD_NO_RULE_SAVE_CHECK_ERROR = new ErrorCode(1_002_040_003, "系统配置:自定义板编号保存解析失败,请检查配置规则或联系客服"); + public static final ErrorCode SYSTEM_CONFIG_CUSTOM_PLATE_NO_RULE_SAVE_CHECK_ERROR = new ErrorCode(1_002_040_003, "系统配置:自定义板编号保存解析失败,请检查配置规则或联系客服"); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/enums/config/CustBoardRuleCodeEnum.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/customplateno/CustomPlateNoRuleCodeEnum.java similarity index 68% rename from cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/enums/config/CustBoardRuleCodeEnum.java rename to cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/customplateno/CustomPlateNoRuleCodeEnum.java index 14971b049..3c8168bd3 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/enums/config/CustBoardRuleCodeEnum.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/customplateno/CustomPlateNoRuleCodeEnum.java @@ -1,6 +1,7 @@ -package com.cf.imes.module.system.enums.config; +package com.cf.imes.module.system.enums.customplateno; import lombok.AllArgsConstructor; +import lombok.Getter; /** * 自定义板编号规则编码枚举 @@ -9,7 +10,7 @@ import lombok.AllArgsConstructor; * @since 2024/11/11 15:20 */ @AllArgsConstructor -public enum CustBoardRuleCodeEnum { +public enum CustomPlateNoRuleCodeEnum { /** * 自定义 */ @@ -38,22 +39,19 @@ public enum CustBoardRuleCodeEnum { /** * 柜体序号 */ - BODYNO("bodyNo"), - - /** - * 加工组序号 - */ - PROCESSGROUP("processGroupNo"); + BODYNO("bodyNo"); + @Getter private String ruleCode; /** * 是否匹配 + * * @param ruleCode * @return */ - public static CustBoardRuleCodeEnum match(String ruleCode) { - for (CustBoardRuleCodeEnum codeEnum : CustBoardRuleCodeEnum.values()) { + public static CustomPlateNoRuleCodeEnum match(String ruleCode) { + for (CustomPlateNoRuleCodeEnum codeEnum : CustomPlateNoRuleCodeEnum.values()) { if (codeEnum.ruleCode.equals(ruleCode)) { return codeEnum; } diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/customplateno/ResetModeEnum.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/customplateno/ResetModeEnum.java new file mode 100644 index 000000000..0b870eeb7 --- /dev/null +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/customplateno/ResetModeEnum.java @@ -0,0 +1,70 @@ +package com.cf.imes.module.system.enums.customplateno; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author Gqr + * @since 2024/11/19 9:40 + */ +@AllArgsConstructor +public enum ResetModeEnum { + /** + * 不清零,累加 + */ + ACCUMULATION(0), + + /** + * 按位数 + */ + DIGIT(1), + + /** + * 按年 + */ + YEAR(2), + + /** + * 按月 + */ + MONTH(3), + + /** + * 按天 + */ + DAY(4), + + /** + * 按生产单 + */ + ORDER(5), + + /** + * 按房间 + */ + ROOM(6), + + /** + * 按柜体 + */ + BODY(7); + + @Getter + private int mode; + + /** + * 根据mode获取对应枚举 + * + * @param mode + * @return + */ + public static ResetModeEnum getByMode(int mode) { + for (ResetModeEnum modeEnum : ResetModeEnum.values()) { + if (ObjectUtil.equal(modeEnum.getMode(), mode)) { + return modeEnum; + } + } + return null; + } +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApiImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApiImpl.java index 140285783..d2e69c6d7 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApiImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/api/customplateno/CustomPlateNoSeqApiImpl.java @@ -2,7 +2,8 @@ package com.cf.imes.module.system.api.customplateno; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqRespDTO; +import com.cf.imes.module.system.api.customplateno.dto.CustomPlateNoSeqDTO; +import com.cf.imes.module.system.dal.dataobject.customplateno.CustomPlateNoSeqDO; import com.cf.imes.module.system.service.customplateno.CustomPlateNoSeqService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; @@ -23,7 +24,12 @@ public class CustomPlateNoSeqApiImpl implements CustomPlateNoSeqApi { private CustomPlateNoSeqService customPlateNoSeqService; @Override - public CommonResult getOrgCustomPlateNoSeq() { - return CommonResult.success(BeanUtils.toBean(customPlateNoSeqService.getOrgCustomPlateNoSeq(), CustomPlateNoSeqRespDTO.class)); + public CommonResult getOrgCustomPlateNoSeq() { + return CommonResult.success(BeanUtils.toBean(customPlateNoSeqService.getOrgCustomPlateNoSeq(), CustomPlateNoSeqDTO.class)); + } + + @Override + public CommonResult modifyOrgCustomPlateNoSeq(CustomPlateNoSeqDTO customPlateNoSeqDTO) { + return CommonResult.success(customPlateNoSeqService.modifyOrgCustomPlateNoSeq(BeanUtils.toBean(customPlateNoSeqDTO, CustomPlateNoSeqDO.class))); } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginReqVO.java index 5c17b3c3b..f6a038b74 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginReqVO.java @@ -22,14 +22,14 @@ import javax.validation.constraints.Pattern; public class AuthLoginReqVO { @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "chenfengyuanma") - @NotEmpty(message = "登录账号不能为空") - @Length(min = 4, max = 16, message = "账号长度为 4-16 位") - @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") + @NotEmpty(message = "登录失败,账号密码不正确") + @Length(max = 11, message = "登录失败,账号密码不正确") + @Pattern(regexp = "^[A-Za-z0-9]+$", message = "登录失败,账号密码不正确") private String username; @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") - @NotEmpty(message = "密码不能为空") + @Length(min = 8, max = 16, message = "登录失败,账号密码不正确") + @NotEmpty(message = "登录失败,账号密码不正确") private String password; // ========== 图片验证码相关 ========== diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java index 79f8853a1..85e54955f 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java @@ -24,7 +24,7 @@ public class AuthLoginSmsCheckReqVO { private String mobile; @Schema(description = "验证码", example = "123456") - @Length(min = 6, max = 6, message = "验证码长度必须 6 位") + @Length(min = 6, max = 6, message = "短信验证码不正确") @NotEmpty(message = "短信验证码不能为空") private String smsCaptchaVerification; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java index f643ce620..464e0cabe 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java @@ -48,9 +48,6 @@ public class AuthPermissionInfoRespVO { @Schema(description = "组织id") private Long organId; - @Schema(description = "是否需要设置密码") - private boolean needSetPwd; - @Schema(description = "ip地址") private String ip; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/notice/NoticeController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/notice/NoticeController.java index 69cdbed4c..bee49431a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/notice/NoticeController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/notice/NoticeController.java @@ -1,6 +1,7 @@ package com.cf.imes.module.system.controller.admin.notice; import cn.hutool.core.lang.Assert; +import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.enums.UserTypeEnum; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageResult; @@ -68,10 +69,18 @@ public class NoticeController { return success(BeanUtils.toBean(pageResult, NoticeRespVO.class)); } + @GetMapping("/homepage") + @Operation(summary = "获取首页通知公告列表") + public CommonResult> getHomePageNoticePage(@Validated NoticePageReqVO pageReqVO) { + // 首页只看生效的公告 + pageReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + PageResult pageResult = noticeService.getNoticePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, NoticeRespVO.class)); + } + @GetMapping("/get") @Operation(summary = "获得通知公告") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:notice:query')") public CommonResult getNotice(@RequestParam("id") Long id) { NoticeDO notice = noticeService.getNotice(id); return success(BeanUtils.toBean(notice, NoticeRespVO.class)); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java index be9d8f9a4..6212e2aac 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java @@ -1,5 +1,6 @@ package com.cf.imes.module.system.controller.admin.permission.vo.role; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.cf.imes.framework.excel.core.annotations.DictFormat; import com.cf.imes.framework.excel.core.convert.DictConvert; import com.cf.imes.module.system.enums.DictTypeConstants; @@ -39,19 +40,23 @@ public class RoleRespVO { private Integer status; @Schema(description = "角色类型,参见 RoleTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "角色类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ROLE_TYPE) private Integer type; @Schema(description = "备注", example = "我是一个角色") + @ExcelProperty("备注") private String remark; @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("数据范围") private Integer dataScope; @Schema(description = "数据范围(指定部门数组)", example = "1") private Set dataScopeDeptIds; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; @Schema(description = "组织id", example = "1") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java index ce927b1f5..42675b425 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java @@ -1,8 +1,8 @@ package com.cf.imes.module.system.controller.admin.sms.vo.log; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.cf.imes.framework.excel.core.annotations.DictFormat; import com.cf.imes.framework.excel.core.convert.DictConvert; -import com.cf.imes.framework.excel.core.convert.JsonConvert; import com.cf.imes.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -21,13 +21,23 @@ public class SmsLogRespVO { @ExcelProperty("编号") private Long id; - @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @ExcelProperty("短信渠道编号") - private Long channelId; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + @ColumnWidth(20) + private LocalDateTime createTime; - @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") - @ExcelProperty("短信渠道编码") - private String channelCode; + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @ExcelProperty("手机号") + private String mobile; + + @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024") + @ExcelProperty("短信内容") + private String templateContent; + + @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "发送状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_SEND_STATUS) + private Integer sendStatus; @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") @ExcelProperty("模板编号") @@ -41,76 +51,4 @@ public class SmsLogRespVO { @ExcelProperty(value = "短信类型", converter = DictConvert.class) @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) private Integer templateType; - - @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024") - @ExcelProperty("短信内容") - private String templateContent; - - @Schema(description = "短信参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "name,code") - @ExcelProperty(value = "短信参数", converter = JsonConvert.class) - private Map templateParams; - - @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SMS_207945135") - @ExcelProperty("短信 API 的模板编号") - private String apiTemplateId; - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - @ExcelProperty("手机号") - private String mobile; - - @Schema(description = "用户编号", example = "10") - @ExcelProperty("用户编号") - private Long userId; - - @Schema(description = "用户类型", example = "1") - @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(DictTypeConstants.USER_TYPE) - private Integer userType; - - @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty(value = "发送状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.SMS_SEND_STATUS) - private Integer sendStatus; - - @Schema(description = "发送时间") - @ExcelProperty("发送时间") - private LocalDateTime sendTime; - - @Schema(description = "短信 API 发送结果的编码", example = "SUCCESS") - @ExcelProperty("短信 API 发送结果的编码") - private String apiSendCode; - - @Schema(description = "短信 API 发送失败的提示", example = "成功") - @ExcelProperty("短信 API 发送失败的提示") - private String apiSendMsg; - - @Schema(description = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") - @ExcelProperty("短信 API 发送返回的唯一请求 ID") - private String apiRequestId; - - @Schema(description = "短信 API 发送返回的序号", example = "62923244790") - @ExcelProperty("短信 API 发送返回的序号") - private String apiSerialNo; - - @Schema(description = "接收状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @ExcelProperty(value = "接收状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS) - private Integer receiveStatus; - - @Schema(description = "接收时间") - @ExcelProperty("接收时间") - private LocalDateTime receiveTime; - - @Schema(description = "API 接收结果的编码", example = "DELIVRD") - @ExcelProperty("API 接收结果的编码") - private String apiReceiveCode; - - @Schema(description = "API 接收结果的说明", example = "用户接收成功") - @ExcelProperty("API 接收结果的说明") - private String apiReceiveMsg; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserMobileUpdateReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserMobileUpdateReqVO.java index 8d25db462..79dd7a358 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserMobileUpdateReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserMobileUpdateReqVO.java @@ -20,7 +20,7 @@ public class UserMobileUpdateReqVO { private String mobile; @Schema(description = "验证码", example = "123456") - @Length(min = 6, max = 6, message = "验证码长度必须 6 位") + @Length(min = 6, max = 6, message = "短信验证码不正确") @NotEmpty(message = "短信验证码不能为空") private String smsCaptchaVerification; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java index 52f8be672..f8d5cff90 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java @@ -12,12 +12,12 @@ public class UserProfileUpdatePasswordReqVO { @Schema(description = "旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @NotEmpty(message = "旧密码不能为空") - @Length(min = 8, max = 16, message = "密码长度为 4-16 位") + @Length(min = 8, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符") private String oldPassword; @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "654321") @NotEmpty(message = "新密码不能为空") - @Length(min = 8, max = 16, message = "密码长度为 4-16 位") + @Length(min = 8, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符") private String newPassword; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserResetPasswordReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserResetPasswordReqVO.java index d8447f844..3e89a7d7e 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserResetPasswordReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserResetPasswordReqVO.java @@ -13,11 +13,11 @@ public class UserResetPasswordReqVO { @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @NotEmpty(message = "密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + @Length(min = 4, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符") private String password; @Schema(description = "短信验证码", example = "123456") - @Length(min = 6, max = 6, message = "短信验证码长度为 6 位") + @Length(min = 6, max = 6, message = "短信验证码不正确") @NotEmpty(message = "短信验证码不能为空") private String smsCaptchaVerification; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index 26d159330..f71485d9d 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -36,7 +36,6 @@ public class UserSaveReqVO { @Schema(description = "用户邮箱", example = "chenfeng@cf.com") @Email(message = "邮箱格式不正确") @Size(max = 50, message = "邮箱长度不能超过 50 个字符") - @NotBlank(message = "邮箱不能为空") private String email; @Schema(description = "手机号码", example = "15601691300") @@ -54,10 +53,6 @@ public class UserSaveReqVO { // ========== 仅【创建】时,需要传递的字段 ========== - @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") - @Size(min = 4, max = 16, message = "密码长度为 4-16 位") - private String password; - @Schema(description = "帐号状态(0正常 1停用)") @NotNull(message = "账号状态不能空") @CommonStatus diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java index 3a24d07cb..253e50018 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java @@ -17,7 +17,7 @@ public class UserUpdatePasswordReqVO { @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @NotEmpty(message = "密码不能为空") - @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + @Length(min = 4, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符") private String password; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/convert/auth/AuthConvert.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/convert/auth/AuthConvert.java index 43d91c398..97c6f471d 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/convert/auth/AuthConvert.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/convert/auth/AuthConvert.java @@ -49,7 +49,7 @@ public interface AuthConvert { return AuthPermissionInfoRespVO.builder() .user(AuthPermissionInfoRespVO.UserVO.builder() - .id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).organId(user.getOrganId()).needSetPwd(StringUtils.isEmpty(user.getPassword())) + .id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).organId(user.getOrganId()) .expireTime(organizationDO.getExpireTime()).ip(ipQuerySuccess ? ipQueryDataRespDTO.getIp() : "") .region(region) .build()) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java index 3e7a757c4..05f467a8b 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/permission/RoleMapper.java @@ -36,7 +36,7 @@ public interface RoleMapper extends BaseMapperX { .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) .betweenIfPresent(RoleDO::getCreateTime, reqVO.getCreateTime()) .ne(RoleDO::getId, 1) - .orderByAsc(RoleDO::getId); + .orderByAsc(RoleDO::getSort).orderByAsc(RoleDO::getId); return selectPage(reqVO, lambdaQueryWrapperX); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/CustomPlateNoServiceHandler.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/CustomPlateNoServiceHandler.java index 437213964..760807c23 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/CustomPlateNoServiceHandler.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/CustomPlateNoServiceHandler.java @@ -17,11 +17,11 @@ import com.cf.imes.module.system.controller.admin.systemconfig.vo.ConfigSaveReqV import com.cf.imes.module.system.controller.admin.systemconfig.vo.ConfigUpdateStatusReqVO; import com.cf.imes.module.system.dal.dataobject.systemconfig.SystemConfigDO; import com.cf.imes.module.system.dal.dataobject.dict.DictDataDO; -import com.cf.imes.module.system.dal.mysql.customplateno.CustomPlateNoSeqMapper; import com.cf.imes.module.system.dal.mysql.systemconfig.SystemConfigMapper; import com.cf.imes.module.system.dal.redis.RedisKeyConstants; -import com.cf.imes.module.system.enums.config.CustBoardRuleCodeEnum; +import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; import com.cf.imes.module.system.enums.config.SystemConfigTypeEnum; +import com.cf.imes.module.system.enums.customplateno.ResetModeEnum; import com.cf.imes.module.system.service.config.factory.service.AbstractSystemConfigServiceHandler; import com.cf.imes.module.system.service.dict.DictDataService; import lombok.extern.slf4j.Slf4j; @@ -35,7 +35,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import static com.cf.imes.module.system.enums.ErrorCodeConstants.SYSTEM_CONFIG_CUSTOM_BOARD_NO_RULE_SAVE_CHECK_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.SYSTEM_CONFIG_CUSTOM_PLATE_NO_RULE_SAVE_CHECK_ERROR; /** * 自定义板编号服务处理器 @@ -48,21 +48,19 @@ import static com.cf.imes.module.system.enums.ErrorCodeConstants.SYSTEM_CONFIG_C public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHandler { // 自定义板编号校验错误全部统一编号:1_002_040_003 - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_RULECODE_EMPTY_ERROR = new ErrorCode(1_002_040_003, "规则编码不能为空"); - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_RULECODE_NOT_MATCH_ERROR = new ErrorCode(1_002_040_003, "规则编码【{}】不合法,请检查配置规则"); - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_DATE_TYPE_FORMAT_ERROR = new ErrorCode(1_002_040_003, "时间格式【{}】不合法,请检查配置规则"); - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_RESETMODE_ERROR = new ErrorCode(1_002_040_003, "复位/清零模式【{}】不合法,请检查配置规则"); - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_INT_TYPE_NO_EMPTY = new ErrorCode(1_002_040_003, "参数【{}】不能为空,请检查配置规则"); - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_INT_TYPE_ERROR = new ErrorCode(1_002_040_003, "数值类型参数{}:【{}】转换异常,请检查配置规则"); - public static final ErrorCode CUSTOM_BOARD_NO_RULE_CHECK_BOL_TYPE_ERROR = new ErrorCode(1_002_040_003, "布尔类型参数{}:【{}】转换异常,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_RULECODE_EMPTY_ERROR = new ErrorCode(1_002_040_003, "规则编码不能为空"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_RULECODE_NOT_MATCH_ERROR = new ErrorCode(1_002_040_003, "规则编码【{}】不合法,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_DATE_TYPE_FORMAT_ERROR = new ErrorCode(1_002_040_003, "时间格式【{}】不合法,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_CUSTOM_VALUE_EMPTY_ERROR = new ErrorCode(1_002_040_003, "自定义字符值不能为空,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_RESETMODE_ERROR = new ErrorCode(1_002_040_003, "规则【{}】复位/清零模式【{}】不合法,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_INT_TYPE_NO_EMPTY = new ErrorCode(1_002_040_003, "参数【{}】不能为空,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_INT_TYPE_ERROR = new ErrorCode(1_002_040_003, "数值类型参数{}:【{}】转换异常,请检查配置规则"); + public static final ErrorCode CUSTOM_PLATE_NO_RULE_CHECK_BOL_TYPE_ERROR = new ErrorCode(1_002_040_003, "布尔类型参数{}:【{}】转换异常,请检查配置规则"); @Resource private DictDataService dictDataService; - @Resource - private CustomPlateNoSeqMapper customPlateNoSeqMapper; - @Resource private SystemConfigMapper systemConfigMapper; @@ -78,30 +76,30 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand public void checkValid(String setting) { // 字典中的时间格式 List dateTypeFormatDictList = dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), "system_setting_date_type"); - // 字典中的复位模式 - List resetModeDictList = dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), "system_setting_rest_type"); - try { JSONArray jsonArray = JSON.parseArray(setting); for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String ruleCode = jsonObject.getString("ruleCode"); // 1.校验code - CustBoardRuleCodeEnum custBoardRuleCodeEnum = checkRoleCode(ruleCode); + CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum = checkRoleCode(ruleCode); - // 2.时间格式校验 + // 2.自定义格式校验 + checkCustom(custBoardRuleCodeEnum, jsonObject); + + // 3.时间格式校验 checkDateFormat(custBoardRuleCodeEnum, jsonObject.getString("value"), dateTypeFormatDictList); - // 3.序号类型校验数字和布尔类型 + // 4.序号类型校验数字和布尔类型 checkNoType(custBoardRuleCodeEnum, jsonObject); - // 4.复位类型校验 - checkResetMode(custBoardRuleCodeEnum, jsonObject.getInteger("resetMode"), resetModeDictList); + // 5.复位类型校验 + checkResetMode(custBoardRuleCodeEnum, jsonObject.getInteger("resetMode"), ruleCode); } } catch (ServiceException e) { throw e; } catch (Exception e) { - ErrorCode systemConfigCustomPlateNoRuleSaveCheckError = SYSTEM_CONFIG_CUSTOM_BOARD_NO_RULE_SAVE_CHECK_ERROR; + ErrorCode systemConfigCustomPlateNoRuleSaveCheckError = SYSTEM_CONFIG_CUSTOM_PLATE_NO_RULE_SAVE_CHECK_ERROR; log.error(systemConfigCustomPlateNoRuleSaveCheckError.getMsg(), e); throw new ServiceException(systemConfigCustomPlateNoRuleSaveCheckError); } @@ -112,13 +110,13 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand * * @param ruleCode 规则编码 */ - private CustBoardRuleCodeEnum checkRoleCode(String ruleCode) { + private CustomPlateNoRuleCodeEnum checkRoleCode(String ruleCode) { if (StringUtils.isEmpty(ruleCode)) { - throw new ServiceException(CUSTOM_BOARD_NO_RULE_CHECK_RULECODE_EMPTY_ERROR); + throw new ServiceException(CUSTOM_PLATE_NO_RULE_CHECK_RULECODE_EMPTY_ERROR); } - CustBoardRuleCodeEnum custBoardRuleCodeEnum = CustBoardRuleCodeEnum.match(ruleCode); + CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum = CustomPlateNoRuleCodeEnum.match(ruleCode); if (ObjectUtil.isNull(custBoardRuleCodeEnum)) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_RULECODE_NOT_MATCH_ERROR, ruleCode); + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_RULECODE_NOT_MATCH_ERROR, ruleCode); } return custBoardRuleCodeEnum; } @@ -129,11 +127,25 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand * @param custBoardRuleCodeEnum 规则编码枚举 * @param format 格式 */ - private void checkDateFormat(CustBoardRuleCodeEnum custBoardRuleCodeEnum, String format, List dateTypeFormatDictList) { - if (ObjectUtil.equal(CustBoardRuleCodeEnum.DATE, custBoardRuleCodeEnum) && StringUtils.isNotEmpty(format)) { + private void checkDateFormat(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, String format, List dateTypeFormatDictList) { + if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.DATE, custBoardRuleCodeEnum) && StringUtils.isNotEmpty(format)) { Optional dateFormatDictDataOptional = dateTypeFormatDictList.stream().filter(d -> format.equals(d.getValue())).findAny(); if (dateFormatDictDataOptional.isEmpty()) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_DATE_TYPE_FORMAT_ERROR, format); + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_DATE_TYPE_FORMAT_ERROR, format); + } + } + } + + /** + * 校验自定义格式 + * + * @param custBoardRuleCodeEnum + * @param jsonObject + */ + private void checkCustom(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, JSONObject jsonObject) { + if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.CUSTOM, custBoardRuleCodeEnum)) { + if (ObjectUtil.isEmpty(jsonObject.get("value"))) { + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_CUSTOM_VALUE_EMPTY_ERROR, jsonObject.get("ruleCode")); } } } @@ -144,13 +156,13 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand * @param custBoardRuleCodeEnum * @param object */ - private void checkNoType(CustBoardRuleCodeEnum custBoardRuleCodeEnum, JSONObject object) { + private void checkNoType(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, JSONObject object) { // 序号类型才校验 - if (ObjectUtil.equal(CustBoardRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.PLATENO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.BODYNO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.PROCESSGROUP, custBoardRuleCodeEnum)) { + if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum) + || ObjectUtil.equal(CustomPlateNoRuleCodeEnum.PLATENO, custBoardRuleCodeEnum) + || ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum) + || ObjectUtil.equal(CustomPlateNoRuleCodeEnum.BODYNO, custBoardRuleCodeEnum) + ) { Map intTypeFieldMap = new HashMap<>() {{ put("initValue", "起始值"); put("length", "位数"); @@ -173,10 +185,10 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand */ private void checkInt(Object intObj, String fieldName) { if (ObjectUtil.isNull(intObj)) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_INT_TYPE_NO_EMPTY, fieldName); + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_INT_TYPE_NO_EMPTY, fieldName); } if (!NumberUtil.isInteger(intObj.toString())) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_INT_TYPE_ERROR, fieldName, intObj); + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_INT_TYPE_ERROR, fieldName, intObj); } } @@ -188,10 +200,10 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand */ private void checkBol(Object bolObj, String fieldName) { if (ObjectUtil.isNull(bolObj)) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_INT_TYPE_NO_EMPTY, fieldName); + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_INT_TYPE_NO_EMPTY, fieldName); } if (!(bolObj instanceof Boolean)) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_BOL_TYPE_ERROR, fieldName, bolObj); + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_BOL_TYPE_ERROR, fieldName, bolObj); } } @@ -200,16 +212,22 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand * * @param resetMode */ - private void checkResetMode(CustBoardRuleCodeEnum custBoardRuleCodeEnum, Integer resetMode, List resetModeDictList) { - if (ObjectUtil.equal(CustBoardRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.PLATENO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.BODYNO, custBoardRuleCodeEnum) - || ObjectUtil.equal(CustBoardRuleCodeEnum.PROCESSGROUP, custBoardRuleCodeEnum)) { - Optional resetModeDictDataOptional = resetModeDictList.stream().filter(d -> resetMode.toString().equals(d.getValue())).findAny(); - if (resetModeDictDataOptional.isEmpty()) { - throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_RESETMODE_ERROR, resetMode); - } + private void checkResetMode(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, Integer resetMode, String ruleCode) { + boolean checkSuccess = true; + if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum)) { + checkSuccess = ObjectUtil.equal(resetMode, ResetModeEnum.DIGIT.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.YEAR.getMode()) + || ObjectUtil.equal(resetMode, ResetModeEnum.MONTH.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.DAY.getMode()); + } else if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.PLATENO, custBoardRuleCodeEnum)) { + checkSuccess = ObjectUtil.equal(resetMode, ResetModeEnum.ORDER.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.YEAR.getMode()) + || ObjectUtil.equal(resetMode, ResetModeEnum.MONTH.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.ROOM.getMode()) + || ObjectUtil.equal(resetMode, ResetModeEnum.BODY.getMode()); + } else if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum)) { + checkSuccess = ObjectUtil.equal(resetMode, ResetModeEnum.ORDER.getMode()); + } else if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.BODYNO, custBoardRuleCodeEnum)) { + checkSuccess = ObjectUtil.equal(resetMode, ResetModeEnum.ORDER.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.ROOM.getMode()); + } + if (!checkSuccess) { + throw ServiceExceptionUtil.exception(CUSTOM_PLATE_NO_RULE_CHECK_RESETMODE_ERROR, ruleCode, resetMode); } } @@ -246,6 +264,11 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand .eq(SystemConfigDO::getType, SystemConfigTypeEnum.CUSTOM_PLATE_NO.getType()) .le(SystemConfigDO::getVersion, minReserveVersion)); } + // 移除机构下的板编号配置缓存 + // 禁用配置移除缓存 + String redisKey = String.format("%s:%d:%s", RedisKeyConstants.SYSTEM_CONFIG, OrganContextHolder.getOrganId(), RedisKeyConstants.CUSTOM_PLATE_NO); + Boolean delete = stringRedisTemplate.delete(redisKey); + log.info("[CustomPlateNoGenerateService][afterUpdateStatus]key:{}缓存删除结果:{}", redisKey, delete); } @Override diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/DefaultSystemConfigServiceHandler.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/DefaultSystemConfigServiceHandler.java index cc29a0002..b9e3950c8 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/DefaultSystemConfigServiceHandler.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/DefaultSystemConfigServiceHandler.java @@ -1,6 +1,7 @@ package com.cf.imes.module.system.service.config.factory.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.module.system.controller.admin.systemconfig.vo.ConfigDeleteReqVO; @@ -11,7 +12,6 @@ import com.cf.imes.module.system.dal.dataobject.systemconfig.SystemConfigDO; import com.cf.imes.module.system.dal.mysql.systemconfig.SystemConfigMapper; import com.cf.imes.module.system.enums.config.SystemConfigTypeEnum; import com.cf.imes.module.system.service.config.factory.service.AbstractSystemConfigServiceHandler; -import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -19,7 +19,6 @@ import javax.annotation.Resource; import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.concurrent.CopyOnWriteArrayList; /** * @@ -35,15 +34,16 @@ public class DefaultSystemConfigServiceHandler extends AbstractSystemConfigServi @Override public List selectList(ConfigPageReqVO reqVO) { - List systemConfigDOS = systemConfigMapper.selectList(new LambdaQueryWrapperX() - .likeIfPresent(SystemConfigDO::getName, reqVO.getName()) - .eqIfPresent(SystemConfigDO::getStatus, reqVO.getStatus()) - .eqIfPresent(SystemConfigDO::getOrganId, OrganContextHolder.getOrganId()) - .orderByAsc(SystemConfigDO::getId)); // todo 后续所有configTypeEnum中的类型需要上到列表补全时通过遍历enum来补充 SystemConfigTypeEnum customplateNoEnum = SystemConfigTypeEnum.CUSTOM_PLATE_NO; - CopyOnWriteArrayList configDOS = Lists.newCopyOnWriteArrayList(systemConfigDOS); - Optional configDOOptional = configDOS.stream().filter(c -> ObjectUtil.equal(customplateNoEnum.getType(), c.getType())).findAny(); + List systemConfigDOS = systemConfigMapper.selectList(new LambdaQueryWrapperX() + .likeIfPresent(SystemConfigDO::getName, reqVO.getName()) + .eq(SystemConfigDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) + .eq(SystemConfigDO::getType, customplateNoEnum.getType()) + .eqIfPresent(SystemConfigDO::getOrganId, OrganContextHolder.getOrganId()) + .select(SystemConfigDO::getId, SystemConfigDO::getName, SystemConfigDO::getStatus, SystemConfigDO::getType) + .orderByAsc(SystemConfigDO::getId)); + Optional configDOOptional = systemConfigDOS.stream().filter(c -> ObjectUtil.equal(customplateNoEnum.getType(), c.getType())).findAny(); if (configDOOptional.isEmpty()) { SystemConfigDO initCustomPlateNoConfig = new SystemConfigDO().builder().id(null).name(customplateNoEnum.getName()).type(customplateNoEnum.getType()).build(); return List.of(initCustomPlateNoConfig); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/IntellectBranchingService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/IntellectBranchingService.java index a1d2c7f1e..50f0ae731 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/IntellectBranchingService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/config/factory/service/impl/IntellectBranchingService.java @@ -22,6 +22,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; @@ -57,11 +58,12 @@ public class IntellectBranchingService extends AbstractSystemConfigServiceHandle JSONObject jsonObject = jsonArray.getJSONObject(i); checkMachineId(jsonObject.getString("machineId")); - checkMachineName(jsonObject.getString("machineName")); - checkMachineConfig(jsonObject.get("machineConfig")); + String machineName = jsonObject.getString("machineName"); + checkMachineName(machineName); + checkMachineConfig(jsonObject.get("machineConfig"),machineName); } - if(jsonArray.size() < 2){ + if(jsonArray.size() <= 2){ throw new ServiceException(BRANCHING_SETTING_COUNT_ERROR); } @@ -136,9 +138,9 @@ public class IntellectBranchingService extends AbstractSystemConfigServiceHandle * 校验 机台分流条件 * */ - private void checkMachineConfig(Object machineConfig) { + private void checkMachineConfig(Object machineConfig,String machineName) { if (ObjectUtil.isEmpty(machineConfig)) { - throw new ServiceException(BRANCHING_SETTING_SAVE_ERROR); + throw exception(BRANCHING_SETTING_SAVE_ERROR,machineName); } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqService.java index 3887fc884..752cc036a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqService.java @@ -15,4 +15,11 @@ public interface CustomPlateNoSeqService { * @return */ CustomPlateNoSeqDO getOrgCustomPlateNoSeq(); + + /** + * 修改机构的自定义版编号序号 + * + * @param seqDO + */ + Boolean modifyOrgCustomPlateNoSeq(CustomPlateNoSeqDO seqDO); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqServiceImpl.java index d640e10e5..c9650f919 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/customplateno/CustomPlateNoSeqServiceImpl.java @@ -24,4 +24,11 @@ public class CustomPlateNoSeqServiceImpl implements CustomPlateNoSeqService { return customPlateNoSeqMapper.selectOne(new LambdaQueryWrapperX() .eq(CustomPlateNoSeqDO::getOrganId, OrganContextHolder.getOrganId())); } -} + + @Override + public Boolean modifyOrgCustomPlateNoSeq(CustomPlateNoSeqDO seqDO) { + return customPlateNoSeqMapper.insertOrUpdate(seqDO); + } + + +} \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java index eaa3728eb..c8c249efb 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java @@ -1,5 +1,7 @@ package com.cf.imes.module.system.service.notice; +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/OrganServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/OrganServiceImpl.java index ce62f758b..c5d3c3068 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/OrganServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/organ/OrganServiceImpl.java @@ -115,6 +115,12 @@ public class OrganServiceImpl implements OrganService { if (ObjectUtil.isNull(organizationDO.getPackageId())) { throw exception(TENANT_PACKAGE_NOT_EXISTS); } + // 组织套餐相关校验 + Long packageId = organizationDO.getPackageId(); + if (ObjectUtil.isNull(packageId)) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + tenantPackageService.validTenantPackage(packageId); return organizationDO; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java index dc0553aee..6a5a02a27 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java @@ -17,6 +17,7 @@ import com.cf.imes.module.system.controller.admin.permission.vo.role.RoleSaveReq import com.cf.imes.module.system.dal.dataobject.permission.RoleDO; import com.cf.imes.module.system.dal.mysql.permission.RoleMapper; import com.cf.imes.module.system.dal.redis.RedisKeyConstants; +import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants; import com.cf.imes.module.system.enums.permission.DataScopeEnum; import com.cf.imes.module.system.enums.permission.RoleCodeEnum; import com.cf.imes.module.system.enums.permission.RoleTypeEnum; @@ -24,6 +25,9 @@ import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; @@ -53,6 +57,12 @@ public class RoleServiceImpl implements RoleService { @Resource private RoleService roleService; + @Resource + private StringRedisTemplate stringRedisTemplate; + + // 模糊匹配redisKey:role:{organId}:{roleId} + public static final String REDIS_ROLE_KEY_PATTERN = RedisKeyConstants.ROLE + ":*:%d"; + @Override @Transactional(rollbackFor = Exception.class) public Long createRole(RoleSaveReqVO createReqVO, Integer type) { @@ -80,6 +90,8 @@ public class RoleServiceImpl implements RoleService { // 更新到数据库 RoleDO updateObj = BeanUtils.toBean(updateReqVO, RoleDO.class); roleMapper.updateById(updateObj); + // 移除角色缓存 + scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, updateObj.getId())); } @Override @@ -91,6 +103,8 @@ public class RoleServiceImpl implements RoleService { // 更新状态 RoleDO updateObj = new RoleDO().setId(id).setStatus(status); roleMapper.updateById(updateObj); + // 移除角色缓存 + scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, updateObj.getId())); } @Override @@ -117,6 +131,31 @@ public class RoleServiceImpl implements RoleService { roleMapper.deleteById(id); // 删除相关数据 permissionService.processRoleDeleted(id); + // 删除角色移除角色缓存 + scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, id)); + } + + /** + * scan匹配keyPattern下缓存并删除缓存 + * + * @param keyPattern + */ + private void scanAndDelKeys(String keyPattern) { + // 根据keyPattern scan匹配的redis key + List matchKeys = new ArrayList<>(); + Cursor cursor = stringRedisTemplate.scan(ScanOptions.scanOptions().match(keyPattern).count(200).build()); + while (cursor.hasNext()) { + matchKeys.add(cursor.next()); + } + cursor.close(); + if (CollUtil.isNotEmpty(matchKeys)) { + for (String key : matchKeys) { + // 移除缓存 + stringRedisTemplate.delete(key); + } + } + // 通知刷新本地缓存 + stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); } /** @@ -127,7 +166,7 @@ public class RoleServiceImpl implements RoleService { * * @param name 角色名字 * @param code 角色额编码 - * @param id 角色编号 + * @param id 角色编号 */ @VisibleForTesting void validateRoleDuplicate(String name, String code, Long id, Long organId) { @@ -156,7 +195,7 @@ public class RoleServiceImpl implements RoleService { * * @param id 角色编号 */ - // @VisibleForTesting + // @VisibleForTesting @OrganIgnore @Override public void validateRoleForUpdate(Long id) { @@ -199,7 +238,7 @@ public class RoleServiceImpl implements RoleService { public List getRoleListByStatus(Collection statuses, Long organId) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); assert loginUser != null; - if(!loginUser.getIsSupAdmin()) { + if (!loginUser.getIsSupAdmin()) { return roleMapper.selectList(new LambdaQueryWrapperX() .in(RoleDO::getStatus, statuses) .in(RoleDO::getOrganId, loginUser.getOrganId(), 0L) @@ -226,7 +265,7 @@ public class RoleServiceImpl implements RoleService { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } - return roleMapper.selectBatchIds(ids); + return roleMapper.selectBatchIds(ids); } @Override @@ -293,7 +332,7 @@ public class RoleServiceImpl implements RoleService { if (CollUtil.isEmpty(roleIds)) { return Collections.emptyList(); } - return roleMapper.selectBatchIds(roleIds); + return roleMapper.selectBatchIds(roleIds); } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java index 444e4cd0d..03e21d157 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java @@ -119,7 +119,8 @@ public class AdminUserServiceImpl implements AdminUserService { private static final String UPPER_LETTER_PATTERN = ".*[A-Z].*"; private static final String LOWER_LETTER_PATTERN = ".*[a-z].*"; private static final String DIGIT_PATTERN = ".*\\d.*"; - private static final String VALID_CHAR_PATTERN = "^[A-Za-z\\d]+$"; + private static final String SPECIAL_CHARACTER_PATTERN = ".*[~!@#$%^&*()_+\\-=].*"; + private static final String VALID_CHAR_PATTERN = "^[A-Za-z\\d~!@#$%^&*()_+\\-=]+$"; @Override @Transactional(rollbackFor = Exception.class) @@ -490,8 +491,6 @@ public class AdminUserServiceImpl implements AdminUserService { validateUserExists(id); // 校验用户名唯一 validateUsernameUnique(id, username, organId); - // 校验邮箱唯一 - validateEmailUnique(id, email, organId); // 校验部门处于开启状态 deptService.validateDeptList(CollectionUtils.singleton(deptId)); // 校验岗位处于开启状态 @@ -508,19 +507,23 @@ public class AdminUserServiceImpl implements AdminUserService { } // 检查是否包含大写字母 if (!Pattern.matches(UPPER_LETTER_PATTERN, password)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_UPPER_LETTER); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS); } // 检查是否包含小写字母 if (!Pattern.matches(LOWER_LETTER_PATTERN, password)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_LOWER_LETTER); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS); } // 检查是否包含数字 if (!Pattern.matches(DIGIT_PATTERN, password)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_NUMBER); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS); } - // 检查是否只包含字母和数字 + // 检查是否包含特殊字符 + if (!Pattern.matches(SPECIAL_CHARACTER_PATTERN, password)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS); + } + // 检查是否只包含字母、数字和特殊字符 if (!Pattern.matches(VALID_CHAR_PATTERN, password)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.PASSWORDS_CAN_ONLY_CONTAIN_LETTERS_AND_NUMBERS); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS); } } diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java index 4326b9441..4fba52f93 100644 --- a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java +++ b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/user/AdminUserServiceImplTest.java @@ -106,8 +106,6 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { o.setStatus(CommonStatusEnum.ENABLE.getStatus()); })); //when(postService.getPostList(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); - // mock passwordEncoder 的方法 - when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("chenfengyuanma"); // 调用 Long userId = userService.createUser(reqVO);