This commit is contained in:
lym
2024-11-28 11:01:38 +08:00
72 changed files with 2094 additions and 398 deletions
@@ -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 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_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 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, "保存组织下自定义板编号序号配置失败,请联系客服处理");
} }
@@ -512,7 +512,6 @@ public class OrderController {
// 生产单超期(工作台) // 生产单超期(工作台)
@GetMapping("/getOrderOverdue") @GetMapping("/getOrderOverdue")
@Operation(summary = "生产单超期 (工作台)") @Operation(summary = "生产单超期 (工作台)")
@PreAuthorize("@ss.hasPermission('productManager:List')")
public CommonResult<PageResult<OrderOverdueRespVO>> getOrderOverdue(@Valid PageParam pageParam) { public CommonResult<PageResult<OrderOverdueRespVO>> getOrderOverdue(@Valid PageParam pageParam) {
return success(orderService.getOrderOverdue(pageParam)); return success(orderService.getOrderOverdue(pageParam));
} }
@@ -520,7 +519,6 @@ public class OrderController {
// 生产单到期告警 (工作台) // 生产单到期告警 (工作台)
@GetMapping("/getOrderWarn") @GetMapping("/getOrderWarn")
@Operation(summary = "生产单到期告警 (工作台)") @Operation(summary = "生产单到期告警 (工作台)")
@PreAuthorize("@ss.hasPermission('productManager:List')")
public CommonResult<PageResult<OrderOverdueRespVO>> getOrderNear(@Valid PageParam pageParam) { public CommonResult<PageResult<OrderOverdueRespVO>> getOrderNear(@Valid PageParam pageParam) {
return success(orderService.getOrderNear(pageParam)); return success(orderService.getOrderNear(pageParam));
} }
@@ -7,7 +7,6 @@ import lombok.Data;
@Data @Data
public class OrderIds { public class OrderIds {
@@ -189,15 +189,15 @@ public class PlateDO extends BaseDO {
/** /**
* 房间名 * 房间名
*/ */
@TableField(exist = false)
private String roomName; private String roomName;
/** /**
* 柜体名 * 柜体名
*/ */
@TableField(exist = false)
private String bodyName; private String bodyName;
/** @TableField(exist = false)
* 加工组名 private StringBuilder customPlateNo;
*/
private String processGroupName;
} }
@@ -1,5 +1,6 @@
package com.cf.imes.module.executor.service.customplateno; 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 com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import java.util.List; import java.util.List;
@@ -14,7 +15,8 @@ public interface CustomPlateNoGenerateService {
/** /**
* 生成自定义板编号 * 生成自定义板编号
* *
* @param orderDO 生产单号
* @param plateDOList 板件列表 * @param plateDOList 板件列表
*/ */
void generateCustomPlateNo(List<PlateDO> plateDOList); void generateCustomPlateNo(OrderDO orderDO, List<PlateDO> plateDOList);
} }
@@ -1,10 +1,32 @@
package com.cf.imes.module.executor.service.customplateno; 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.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 lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; 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.List;
import java.util.Optional;
/** /**
* @author Gqr * @author Gqr
@@ -14,8 +36,125 @@ import java.util.List;
@Slf4j @Slf4j
public class CustomPlateNoGenerateServiceImpl implements CustomPlateNoGenerateService { public class CustomPlateNoGenerateServiceImpl implements CustomPlateNoGenerateService {
@Resource
@Lazy
private OrderService orderService;
@Resource
private SystemConfigApi systemConfigApi;
@Resource
private CustomPlateNoSeqApi customPlateNoSeqApi;
@Resource
private List<CustomPlateNoGenerateRuleService> 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 @Override
public void generateCustomPlateNo(List<PlateDO> plateDOList) { public void generateCustomPlateNo(OrderDO orderDO, List<PlateDO> plateDOList) {
// todo generateCustomPlateNo Long orderId = orderDO.getId();
// 1、获取生产配置
CustomPlateNoGenerateConfigVO generateConfig = getGenerateConfig(orderId);
// 如果没有查到配置规则就不做后续生成操作了
List<CustomPlateNoRuleVO> 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<Boolean> 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<CustomPlateNoRuleVO> 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<CustomPlateNoRuleVO> customPlateNoRuleVOS = List.of();
// 查询机构的自定义版编号配置
CommonResult<SystemConfigRespDTO> 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<SystemConfigRespDTO> 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<CustomPlateNoSeqDTO> orgCustomPlateNoSeq = customPlateNoSeqApi.getOrgCustomPlateNoSeq();
if (orgCustomPlateNoSeq.isSuccess()) {
customPlateNoGenerateConfigVO.setOrgCustomPlateNoSeqRespDTO(orgCustomPlateNoSeq.getData());
}
return customPlateNoGenerateConfigVO;
} }
} }
@@ -1,6 +1,6 @@
package com.cf.imes.module.executor.service.customplateno.vo; 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 lombok.Data;
import java.io.Serializable; import java.io.Serializable;
@@ -27,5 +27,5 @@ public class CustomPlateNoGenerateConfigVO implements Serializable {
/** /**
* 机构下的自定义板编号序号 * 机构下的自定义板编号序号
*/ */
private CustomPlateNoSeqRespDTO orgCustomPlateNoSeqRespDTO; private CustomPlateNoSeqDTO orgCustomPlateNoSeqRespDTO;
} }
@@ -3,6 +3,7 @@ package com.cf.imes.module.executor.service.customplateno.vo;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
/** /**
* 系统配置-自定义板编号setting项 vo * 系统配置-自定义板编号setting项 vo
@@ -48,4 +49,9 @@ public class CustomPlateNoRuleVO implements Serializable {
* 复位/清零模式 * 复位/清零模式
*/ */
private Integer resetMode; private Integer resetMode;
/**
* 开始生成板编号的时间
*/
private LocalDateTime now;
} }
@@ -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;
}
@@ -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;
}
@@ -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<OrderCustomPlateNoSeqBodyVO> bodys;
}
@@ -1,6 +1,8 @@
package com.cf.imes.module.executor.service.customplateno.vo; package com.cf.imes.module.executor.service.customplateno.vo;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
@@ -12,92 +14,39 @@ import java.util.List;
* @since 2024/11/15 10:41 * @since 2024/11/15 10:41
*/ */
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
public class OrderCustomPlateNoSeqVO implements Serializable { public class OrderCustomPlateNoSeqVO implements Serializable {
private static final long serialVersionUID = 5841977329049878792L; private static final long serialVersionUID = 5841977329049878792L;
/**
* 生产单序号
*/
private Integer orderNoSeq;
/** /**
* 生产单下房间序号 * 生产单下房间序号
*/ */
private int roomSeq; private Integer roomNoSeq;
/** /**
* 生产单下柜体序号 * 生产单下柜体序号
*/ */
private int bodySeq; private Integer bodyNoSeq;
/**
* 生产单下加工组序号
*/
private int processGroupSeq;
/** /**
* 生产单下板件序号 * 生产单下板件序号
*/ */
private int plateNoSeq; private Integer plateNoSeq;
/** /**
* 生产单下房间列表 * 生产单下房间列表
*/ */
private List<Room> rooms; private List<OrderCustomPlateNoSeqRoomVO> rooms;
/**
* 生产单下柜体列表
*/
private List<OrderCustomPlateNoSeqBodyVO> bodys;
} }
@Data
class Room implements Serializable {
private static final long serialVersionUID = -127388898531267048L;
/**
* 房间名
*/
private String roomNo;
/**
* 房间下板件序号
*/
private int plateNoSeq;
/**
* 房间下柜体序号
*/
private int bodySeq;
/**
* 房间下柜体列表
*/
private List<Body> bodys;
/**
* 房间下加工组序号
*/
private int processGroupSeq;
/**
* 房间下加工组列表
*/
private List<ProcessGroup> 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;
}
@@ -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<OrderCustomPlateNoSeqRoomVO> rooms = orderCustomPlateNoSeqVO.getRooms();
if (CollUtil.isEmpty(rooms)) {
rooms = new ArrayList<>();
orderCustomPlateNoSeqVO.setRooms(rooms);
}
List<OrderCustomPlateNoSeqBodyVO> 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<OrderCustomPlateNoSeqBodyVO> 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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqBodyVO> 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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqBodyVO> bodyVOList) {
if (CollUtil.isEmpty(bodyVOList)) {
return null;
}
return bodyVOList.stream().filter(bodyVO -> ObjectUtil.equal(bodyName, bodyVO.getBodyName())).findAny().orElse(null);
}
}
@@ -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<PlateDO> plateDOList) {
// for (PlateDO plateDO : plateDOList) {
// plateDO.getCustomPlateNo().append(plateNoRule.getValue());
// }
// return generateConfig;
// }
//
//}
@@ -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);
}
}
@@ -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<PlateDO> plateDOList) {
// for (PlateDO plateDO : plateDOList) {
// plateDO.getCustomPlateNo().append(plateNoRule.getNow().format(DateTimeFormatter.ofPattern(plateNoRule.getValue())));
// }
// return generateConfig;
// }
//}
@@ -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();
}
}
@@ -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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqBodyVO> 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<OrderCustomPlateNoSeqRoomVO> 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();
}
}
@@ -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<PlateDO> 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<OrderCustomPlateNoSeqRoomVO> rooms = orderCustomPlateNoSeqVO.getRooms();
// if (CollUtil.isEmpty(rooms)) {
// rooms = new ArrayList<>();
// orderCustomPlateNoSeqVO.setRooms(rooms);
// }
// List<OrderCustomPlateNoSeqProcessGroupVO> 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<PlateDO> plateDOList) {
// Integer initValue = plateNoRule.getInitValue() - plateNoRule.getIncrementStep();
// // 生产单下的序号
// OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO();
// // 机构下的自定义板编号序号
// CustomPlateNoSeqRespDTO orgCustomPlateNoSeqRespDTO = generateConfig.getOrgCustomPlateNoSeqRespDTO();
// // 生产单下加工组序号
// Integer orderProcessGroupNoSeq = null;
// List<OrderCustomPlateNoSeqProcessGroupVO> processGroups = orderCustomPlateNoSeqVO.getProcessGroups();
// if (ObjectUtil.equal(orderId, orgCustomPlateNoSeqRespDTO.getLastOrderNo())) {
// // 当次导入和上次导入是同一个生产单
// // 取之前的生产单下加工组序号,没有就用初始值
// orderProcessGroupNoSeq = Optional.ofNullable(orderCustomPlateNoSeqVO.getProcessGroupNoSeq()).orElse(initValue);
// }
// // 基于加工组名分组
// Map<String, List<PlateDO>> processGroupMap = plateDOList.stream().collect(Collectors.groupingBy(PlateDO::getProcessGroupName, Collectors.toList()));
// for (Map.Entry<String, List<PlateDO>> 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<PlateDO> 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<PlateDO> plateDOList) {
// Integer initValue = plateNoRule.getInitValue() - plateNoRule.getIncrementStep();
// // 生产单下的序号
// OrderCustomPlateNoSeqVO orderCustomPlateNoSeqVO = generateConfig.getOrderCustomPlateNoSeqVO();
// List<OrderCustomPlateNoSeqRoomVO> rooms = orderCustomPlateNoSeqVO.getRooms();
// // 基于房间名分组
// Map<String, List<PlateDO>> roomGroupMap = plateDOList.stream().collect(Collectors.groupingBy(PlateDO::getRoomName, Collectors.toList()));
//
// for (Map.Entry<String, List<PlateDO>> roomEntry : roomGroupMap.entrySet()) {
// List<PlateDO> 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<String, List<PlateDO>> roomProcessGroupMap = roomPlateList.stream()
// .collect(Collectors.groupingBy(PlateDO::getProcessGroupName, Collectors.toList()));
// for (Map.Entry<String, List<PlateDO>> roomPrcesssGroupEntry : roomProcessGroupMap.entrySet()) {
// // 如果是新的柜体vo,要把累加的值记录到生产单rooms下的柜体
// boolean needRecordToOrder = false;
// String processGroupName = roomPrcesssGroupEntry.getKey();
// // 根据加工组名获取生产单下序号中rooms下加工组列表的加工组序号
// List<OrderCustomPlateNoSeqProcessGroupVO> 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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqProcessGroupVO> processGroupVOList) {
// if (CollUtil.isEmpty(processGroupVOList)) {
// return null;
// }
// return processGroupVOList.stream().filter(processGroupVO -> ObjectUtil.equal(processGroupName, processGroupVO.getProcessGroupName())).findAny().orElse(null);
// }
//}
@@ -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<OrderCustomPlateNoSeqRoomVO> 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<OrderCustomPlateNoSeqRoomVO> roomVOList) {
return roomVOList.stream().filter(roomVO -> ObjectUtil.equal(roomName, roomVO.getRoomName())).findAny().orElse(null);
}
}
@@ -266,8 +266,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
List<OrderDO> orderDOS = orderMapper.selectOrderPackList(orderIds, getUserOrganId()); List<OrderDO> orderDOS = orderMapper.selectOrderPackList(orderIds, getUserOrganId());
if (ObjectUtil.isNotEmpty(orderDOS)) { if (ObjectUtil.isNotEmpty(orderDOS)) {
List<OrderDO> orderDOList = orderDOS.stream().map(m -> m.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus())).toList(); orderDOS.forEach(f -> {
orderMapper.updateBatch(orderDOList); 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(); Boolean isOptimized = optimizeBoardModelDO.getIsOptimized();
if(Boolean.FALSE.equals(isOptimized)){ if(Boolean.FALSE.equals(isOptimized)){
throw exception(ORDER_PLAN_NO_OPTIMIZE_UPDATE_ERROR); throw exception(ORDER_PLAN_NO_OPTIMIZE_UPDATE_ERROR);
} }
@@ -355,9 +356,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
if(!orderIdList.isEmpty()) { if(!orderIdList.isEmpty()) {
List<OrderDO> orderDOList = orderMapper.selectBatchIds(orderIdList); List<OrderDO> orderDOList = orderMapper.selectBatchIds(orderIdList);
orderMapper.updateBatch(orderDOList.stream() orderDOList.forEach(f -> {
.map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())) f.setStatus(OrderStatusEnum.SORTED.getStatus());
.toList()); f.setFinishTime(null);
});
orderMapper.updateBatch(orderDOList);
} }
return; return;
@@ -382,8 +386,11 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
List<OrderDO> orderDOS = orderMapper.selectOrderList(orderIds, getUserOrganId()); List<OrderDO> orderDOS = orderMapper.selectOrderList(orderIds, getUserOrganId());
if(!orderDOS.isEmpty()){ if(!orderDOS.isEmpty()){
List<OrderDO> orderDOList = orderDOS.stream().map(m -> m.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus())).toList(); orderDOS.forEach(f -> {
orderMapper.updateBatch(orderDOList); 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) { public void refresh( String index) {
try { try {
@@ -45,4 +45,25 @@ public class OrderPartsRespVO {
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
private String remark; 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;
} }
@@ -23,7 +23,7 @@ public class OtherPackReqVO {
@Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "配件名称不能为空") @NotBlank(message = "配件名称不能为空")
@Size(max = 30, message = "配件名称长度不能超过 64 个字符") @Size(max = 64, message = "配件名称长度不能超过 64 个字符")
private String name; private String name;
@@ -31,6 +31,12 @@ public class OtherPackReqVO {
@NumberValid(name = "配件数量") @NumberValid(name = "配件数量")
private Double num; 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) @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED)
private String packNo; private String packNo;
@@ -105,4 +105,23 @@ public class PackageDetailsRespVO {
private String factory; 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;
} }
@@ -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.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; 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.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.controller.admin.query.vo.pack.OrderPackageVO;
import com.cf.imes.module.manage.dal.dataobject.query.OrderPackageDO; import com.cf.imes.module.manage.dal.dataobject.query.OrderPackageDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -73,8 +72,6 @@ public interface OrderPackageMapper extends BaseMapperX<OrderPackageDO> {
List<PackRespVO> selectPackPieceCount(@Param("orderIds") List<Long> orderIds, @Param("organId") Long organId); List<PackRespVO> selectPackPieceCount(@Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
List<PlateAndPartIdList> selectOrderPack(@Param("orderId") Long orderId,@Param("organId") Long organId);
// 删除当前生产单下所有的包裹 // 删除当前生产单下所有的包裹
default void updateDelete(Long orderId,Long organId) { default void updateDelete(Long orderId,Long organId) {
@@ -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.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; 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.pack.vo.PlateDetailsRespVO;
import com.cf.imes.module.manage.controller.admin.process.vo.PlateDetails; import com.cf.imes.module.manage.controller.admin.process.vo.PlateDetails;
import com.cf.imes.module.manage.controller.admin.process.vo.ProcessPlateReqVO; import com.cf.imes.module.manage.controller.admin.process.vo.ProcessPlateReqVO;
@@ -80,17 +81,6 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
} }
default List<OrderItemDO> selectPartsList(Long orderId, Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId, organId)
.eqIfPresent(OrderItemDO::getOrderId, orderId)
.eq(OrderItemDO::getPackageId,0)
.select(OrderItemDO::getPartsId));
}
default List<OrderItemDO> selectPackByPlateId(List<Long> plateId,Long orderId ,Long organId) { default List<OrderItemDO> selectPackByPlateId(List<Long> plateId,Long orderId ,Long organId) {
return selectList(new LambdaQueryWrapperX<OrderItemDO>() return selectList(new LambdaQueryWrapperX<OrderItemDO>()
.eq(OrderItemDO::getOrganId, organId) .eq(OrderItemDO::getOrganId, organId)
@@ -98,4 +88,11 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
.inIfPresent(OrderItemDO::getPlateId, plateId) .inIfPresent(OrderItemDO::getPlateId, plateId)
.select(OrderItemDO::getPackageId)); .select(OrderItemDO::getPackageId));
} }
List<PlateAndPartIdList> selectOrderPackPartsIds(@Param("orderId") Long orderId, @Param("organId") Long organId);
List<PlateAndPartIdList> selectOrderPackPlateIds(@Param("orderId") Long orderId,@Param("organId") Long organId);
} }
@@ -44,6 +44,7 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@@ -268,7 +269,6 @@ public class PackServiceImpl implements PackService {
@Override @Override
public List<OrderPartsRespVO> getPartsList(OrderPartsReqVO reqVO) { public List<OrderPartsRespVO> getPartsList(OrderPartsReqVO reqVO) {
return orderPartsMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId()); return orderPartsMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId());
} }
@@ -381,6 +381,7 @@ public class PackServiceImpl implements PackService {
if(orderDO.getStatus().equals(OrderStatusEnum.FINISH_PRODUCTION.getStatus())){ if(orderDO.getStatus().equals(OrderStatusEnum.FINISH_PRODUCTION.getStatus())){
orderDO.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus()); orderDO.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus());
orderDO.setFinishTime(null);
} }
ordersMapper.updateById(orderDO); ordersMapper.updateById(orderDO);
@@ -491,10 +492,11 @@ public class PackServiceImpl implements PackService {
return false; return false;
} }
List<PlateAndPartIdList> plateAndPartIdLists = orderPackageMapper.selectOrderPack(orderId, getUserOrganId()); List<PlateAndPartIdList> partsIds = orderItemMapper.selectOrderPackPartsIds(orderId, getUserOrganId());
List<PlateAndPartIdList> 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()){ if(orderPlanApi.getOrder(orderId).getData()){
orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); 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); OrderPartsNDO orderParts = BeanUtils.toBean(reqVO, OrderPartsNDO.class);
// 因为是外部配件,所以配件类型的名称固定为 “ 外部配件” // 因为是外部配件,所以配件类型的名称固定为 “ 外部配件”
orderParts.setType("外部配件"); orderParts.setType("外部配件");
orderParts.setUnit(reqVO.getUnit());
orderPartsMapper.insert(orderParts); orderPartsMapper.insert(orderParts);
@@ -665,6 +669,7 @@ public class PackServiceImpl implements PackService {
OrderPartsNDO orderParts = BeanUtils.toBean(reqVO, OrderPartsNDO.class); OrderPartsNDO orderParts = BeanUtils.toBean(reqVO, OrderPartsNDO.class);
// 因为是外部配件,所以配件类型的名称固定为 “ 外部配件” // 因为是外部配件,所以配件类型的名称固定为 “ 外部配件”
orderParts.setType("外部配件"); orderParts.setType("外部配件");
orderParts.setUnit(reqVO.getUnit());
orderPartsMapper.insert(orderParts); orderPartsMapper.insert(orderParts);
// 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量) // 在生产单明细表中添加数据(生产单号,配件ID,包裹ID,部件数量)
@@ -825,13 +830,14 @@ public class PackServiceImpl implements PackService {
orderItemMapper.updateBatch(orderItemDOS); orderItemMapper.updateBatch(orderItemDOS);
// 查询配件是否为空,为空,修改生产单的状态为已打包 // 查询配件是否为空,为空,修改生产单的状态为已打包
List<OrderItemDO> orderItemDoPartsList = orderItemMapper.selectPartsList(reqVO.getOrderId(), getUserOrganId()); List<PlateAndPartIdList> partsIds = orderItemMapper.selectOrderPackPartsIds(reqVO.getOrderId(), getUserOrganId());
if (orderItemDoPartsList.isEmpty()) { if (partsIds.isEmpty()) {
OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId()); OrderDO orderDO = ordersMapper.selectById(reqVO.getOrderId());
orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus()); orderDO.setPackaged(OrderPackageStatusEnum.PACKAGED.getStatus());
if(Boolean.TRUE.equals(orderPlanApi.getOrder(reqVO.getOrderId()).getData())){ if(Boolean.TRUE.equals(orderPlanApi.getOrder(reqVO.getOrderId()).getData())){
orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus()); orderDO.setStatus(OrderStatusEnum.FINISH_PRODUCTION.getStatus());
orderDO.setFinishTime(LocalDateTime.now());
} }
ordersMapper.updateById(orderDO); ordersMapper.updateById(orderDO);
} }
@@ -110,21 +110,6 @@
</select> </select>
<select id="selectOrderPack"
resultType="com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList">
select distinct oi.plate_id,
oi.parts_id
from order_package op
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id
where op.organ_id = #{organId} and op.order_id = #{orderId} and op.deleted = false and oi.package_id = 0
</select>
<select id="selectPackListByOrderId" <select id="selectPackListByOrderId"
resultType="com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO"> resultType="com.cf.imes.module.manage.controller.admin.query.vo.pack.OrderPackageVO">
@@ -316,5 +316,33 @@
</select> </select>
<select id="selectOrderPackPartsIds"
resultType="com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList">
select distinct oi.parts_id
from order_item oi
join order_parts op on oi.organ_id = op.organ_id and oi.order_id = op.order_id and oi.parts_id = op.id
where oi.organ_id = #{organId} and oi.order_id = #{orderId} and oi.package_id = 0 and op.type != '封边条'
</select>
<select id="selectOrderPackPlateIds"
resultType="com.cf.imes.module.manage.controller.admin.pack.vo.PlateAndPartIdList">
select distinct plate_id
from order_item
where organ_id = #{organId}
and order_id = #{orderId}
and package_id = 0
and plate_id !=0
</select>
</mapper> </mapper>
@@ -17,6 +17,12 @@
<result property="brand" column="brand"/> <result property="brand" column="brand"/>
<result property="factory" column="factory"/> <result property="factory" column="factory"/>
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
<result property="partsColor" column="partsColor"/>
<result property="partsWidth" column="partsWidth"/>
<result property="partsLength" column="partsLength"/>
<result property="partsThickness" column="partsThickness"/>
<result property="category" column="category"/>
<result property="subparts" column="subparts"/>
</resultMap> </resultMap>
<select id="selectParts" <select id="selectParts"
@@ -37,6 +43,12 @@
op.type as type, op.type as type,
op.remark as remark, op.remark as remark,
op.is_composite as isComposite, op.is_composite as isComposite,
op.color as partsColor,
op.width as partsWidth,
op.length as partsLength,
op.thickness as partsThickness,
op.category as category,
op.subparts as subparts,
oi.num as num oi.num as num
from order_parts op from order_parts op
@@ -65,6 +77,12 @@
<result property="brand" column="brand"/> <result property="brand" column="brand"/>
<result property="factory" column="factory"/> <result property="factory" column="factory"/>
<result property="remark" column="remark"/> <result property="remark" column="remark"/>
<result property="partsColor" column="partsColor"/>
<result property="partsWidth" column="partsWidth"/>
<result property="partsLength" column="partsLength"/>
<result property="partsThickness" column="partsThickness"/>
<result property="category" column="category"/>
<result property="subparts" column="subparts"/>
</resultMap> </resultMap>
<select id="selectPartsList" <select id="selectPartsList"
parameterType="java.lang.Long" parameterType="java.lang.Long"
@@ -72,11 +90,26 @@
select distinct select distinct
op.id as partsId,op.name,op.model,op.spec,oi.num as num,op.unit,op.brand,op.factory,op.remark,op.type op.id as partsId,
op.name,
op.model,
op.spec,
oi.num as num,
op.unit,
op.brand,
op.factory,
op.remark,
op.color as partsColor,
op.width as partsWidth,
op.length as partsLength,
op.thickness as partsThickness,
op.category as category,
op.subparts as subparts,
op.type
from order_parts op from order_parts op
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.parts_id left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.parts_id
where op.organ_id = #{organId} and op.order_id = #{orderId} and op.deleted = false and oi.package_id = 0 where op.organ_id = #{organId} and op.order_id = #{orderId} and op.deleted = false and op.type != '封边条' and oi.package_id = 0
</select> </select>
@@ -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_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_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_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 ========== // ========== UREPORT datasource模块 1-003-002-000 ==========
@@ -56,7 +56,7 @@ public class ReportDatasetSaveReqVO implements Serializable {
private List<ReportDatasetParameterVO> parameters = new ArrayList<>(); private List<ReportDatasetParameterVO> parameters = new ArrayList<>();
@Schema(description = "字段列表") @Schema(description = "字段列表")
@Size(max = 30, message = "字段列表数量不能超过30个") @Size(max = 100, message = "字段列表数量不能超过100个")
@Valid @Valid
private List<ReportDatasetFieldVO> fields = new ArrayList<>(); private List<ReportDatasetFieldVO> fields = new ArrayList<>();
} }
@@ -2,7 +2,6 @@ package com.cf.imes.module.report.controller.admin.datasource;
import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.common.utils.MultipleJdbcTemplate;
import com.bstek.datasource.bean.DataSourceInfo; import com.bstek.datasource.bean.DataSourceInfo;
import com.bstek.datasource.bean.PreviewParams;
import com.bstek.datasource.service.DataSourceService; import com.bstek.datasource.service.DataSourceService;
import com.bstek.ureport.definition.dataset.Field; import com.bstek.ureport.definition.dataset.Field;
import com.cf.imes.framework.common.pojo.CommonResult; 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.controller.admin.datasource.vo.ReportDatasourceTestConnReqVO;
import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; 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.service.datasource.ReportDatasourceService;
import com.cf.imes.module.report.utils.TenantParamsUtils;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@@ -51,6 +51,9 @@ public class ReportDatasourceController {
@Resource @Resource
private DataSourceService ureportDataSourceService; private DataSourceService ureportDataSourceService;
@Resource
private TenantParamsUtils tenantParamsUtils;
@PutMapping("/datasource") @PutMapping("/datasource")
@Operation(summary = "创建报表数据源") @Operation(summary = "创建报表数据源")
@PreAuthorize("@ss.hasPermission('report:design')") @PreAuthorize("@ss.hasPermission('report:design')")
@@ -87,8 +90,8 @@ public class ReportDatasourceController {
@GetMapping("/datasources") @GetMapping("/datasources")
@Operation(summary = "获取报表数据源列表") @Operation(summary = "获取报表数据源列表")
@PreAuthorize("@ss.hasPermission('report:design')") @PreAuthorize("@ss.hasPermission('report:design')")
public CommonResult<List<ReportDatasourceRespVO>> getDatasourcePage() { public CommonResult<List<ReportDatasourceRespVO>> getDatasourcePage(@RequestParam(value = "organId", required = false) Long organId) {
return success(BeanUtils.toBean(datasourceService.getDatasourceList(), ReportDatasourceRespVO.class)); return success(BeanUtils.toBean(datasourceService.getDatasourceList(organId), ReportDatasourceRespVO.class));
} }
@GetMapping("/datasource/beans") @GetMapping("/datasource/beans")
@@ -134,13 +137,13 @@ public class ReportDatasourceController {
@Operation(summary = "获取数据源表字段") @Operation(summary = "获取数据源表字段")
@PreAuthorize("@ss.hasPermission('report:design')") @PreAuthorize("@ss.hasPermission('report:design')")
public CommonResult<List<Field>> getDatasourceTableFields(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) { public CommonResult<List<Field>> getDatasourceTableFields(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) {
return success(datasourceService.getTableFields(BeanUtils.toBean(reqVO, PreviewParams.class))); return success(datasourceService.getTableFields(tenantParamsUtils.prepareTenantParam(reqVO)));
} }
@PostMapping("/datasource/preview") @PostMapping("/datasource/preview")
@Operation(summary = "数据源预览") @Operation(summary = "数据源预览")
@PreAuthorize("@ss.hasPermission('report:design')") @PreAuthorize("@ss.hasPermission('report:design')")
public CommonResult<Map<String, Object>> previewData(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) { public CommonResult<Map<String, Object>> previewData(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) {
return success(ureportDataSourceService.previewData(BeanUtils.toBean(reqVO, PreviewParams.class))); return success(ureportDataSourceService.previewData(tenantParamsUtils.prepareTenantParam(reqVO)));
} }
} }
@@ -24,7 +24,7 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
public class ReportDatasourcePreviewReqVO { public class ReportDatasourcePreviewReqVO {
@Schema(description = "数据源连接信息") @Schema(description = "数据源连接信息")
@NotNull @NotNull(message = "数据源连接信息不能为空")
@Valid @Valid
private ReportDatasourceTestConnReqVO info; private ReportDatasourceTestConnReqVO info;
@@ -37,4 +37,8 @@ public class ReportDatasourcePreviewReqVO {
@Size(max = 30, message = "查询参数列表数量不能超过30个") @Size(max = 30, message = "查询参数列表数量不能超过30个")
@Valid @Valid
private List<ReportDatasourceParameterVO> parameters; private List<ReportDatasourceParameterVO> parameters;
@Schema(description = "数据源编号")
@NotNull(message = "数据源编号不能为空")
private Long datasourceId;
} }
@@ -101,8 +101,10 @@ public class ReportTemplateController {
@GetMapping("/templates") @GetMapping("/templates")
@Operation(summary = "获取报表模板信息列表") @Operation(summary = "获取报表模板信息列表")
@PreAuthorize("@ss.hasPermission('report:design')") @PreAuthorize("@ss.hasPermission('report:design')")
public CommonResult<List<ReportTemplateRespVO>> getTemplatePage(@RequestParam(value = "name", required = false) @Size(max = 64, message = "模板名称长度不能超过64个字符") String name) { public CommonResult<List<ReportTemplateRespVO>> getTemplatePage(
ReportTemplateReqVO reqVO = new ReportTemplateReqVO(name, null); @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)); return success(BeanUtils.toBean(templateService.getReportTemplateList(reqVO), ReportTemplateRespVO.class));
} }
@@ -21,4 +21,7 @@ public class ReportTemplateReqVO {
@Schema(description = "模板类型,0内置、1自定义", example = "1") @Schema(description = "模板类型,0内置、1自定义", example = "1")
private Integer type; private Integer type;
@Schema(description = "组织id")
private Long organId;
} }
@@ -49,10 +49,10 @@ public interface ReportDatasourceService {
/** /**
* 获取模板下的数据源列表 * 获取模板下的数据源列表
* *
* @param reqVO 查询参数 * @param organId 组织id
* @return 报表数据源分页 * @return 报表数据源分页
*/ */
List<ReportDatasourceDO> getDatasourceList(); List<ReportDatasourceDO> getDatasourceList(Long organId);
/** /**
* 获取springbean数据源列表 * 获取springbean数据源列表
@@ -13,7 +13,6 @@ import com.bstek.datasource.bean.PreviewParams;
import com.bstek.ureport.definition.dataset.Field; import com.bstek.ureport.definition.dataset.Field;
import com.bstek.ureport.definition.dataset.Parameter; import com.bstek.ureport.definition.dataset.Parameter;
import com.bstek.ureport.definition.dataset.SqlDatasetDefinition; import com.bstek.ureport.definition.dataset.SqlDatasetDefinition;
import com.bstek.ureport.definition.dataset.TenantParams;
import com.bstek.ureport.utils.ProcedureUtils; import com.bstek.ureport.utils.ProcedureUtils;
import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
@@ -133,16 +132,21 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
@Override @Override
@OrganIgnore @OrganIgnore
public List<ReportDatasourceDO> getDatasourceList() { public List<ReportDatasourceDO> getDatasourceList(Long organId) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
LambdaQueryWrapper<ReportDatasourceDO> queryWrapper = new LambdaQueryWrapperX<ReportDatasourceDO>().orderByDesc(ReportDatasourceDO::getCreateTime); LambdaQueryWrapper<ReportDatasourceDO> queryWrapper = new LambdaQueryWrapperX<ReportDatasourceDO>().orderByDesc(ReportDatasourceDO::getCreateTime);
if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { // 当前登录人机构id
// 普通用户查看机构下的和system数据源 Long currentOrganId = loginUser.getOrganId();
queryWrapper.or(wrapper -> wrapper // 超管查看不同组织数据源
.eq(ReportDatasourceDO::getOrganId, loginUser.getOrganId()) if (ObjectUtil.isNotNull(loginUser) && Boolean.TRUE.equals(loginUser.getIsSupAdmin()) && ObjectUtil.isNotNull(organId)) {
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)) currentOrganId = organId;
.or(wrapper -> wrapper.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM));
} }
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<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(queryWrapper); List<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(queryWrapper);
// 查询数据集 // 查询数据集
if (CollUtil.isNotEmpty(reportDatasourceDOS)) { if (CollUtil.isNotEmpty(reportDatasourceDOS)) {
@@ -150,7 +154,6 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
queryDatasetInSource(reportDatasourceDO); queryDatasetInSource(reportDatasourceDO);
}); });
} }
// 超管查看全部
return reportDatasourceDOS; return reportDatasourceDOS;
} }
@@ -233,7 +236,7 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
Map<String, Object> pmap = sqlDatasetDefinition.buildParameters(params); Map<String, Object> pmap = sqlDatasetDefinition.buildParameters(params);
String sqlForUse = sqlDatasetDefinition.parseSql(pmap, new TenantParams()); String sqlForUse = sqlDatasetDefinition.parseSql(pmap, previewParams.getTenantParams());
if (ProcedureUtils.isProcedure(sqlForUse)) { if (ProcedureUtils.isProcedure(sqlForUse)) {
return ProcedureUtils.procedureColumnsQuery(sqlForUse, pmap, conn); return ProcedureUtils.procedureColumnsQuery(sqlForUse, pmap, conn);
} }
@@ -30,11 +30,11 @@ import com.bstek.ureport.parser.ReportParser;
import com.bstek.ureport.utils.ToolUtils; import com.bstek.ureport.utils.ToolUtils;
import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants; 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.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; 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.ReportTemplatePreviewReqVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateRespVO; 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.datasource.ReportDatasourceMapper;
import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; 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.enums.template.ReportTemplateTypeEnum;
import com.cf.imes.module.report.utils.TenantParamsUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -64,12 +66,12 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; 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.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_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_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_NOT_EXISTS;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_PREIVEW_QUERYPARAM_EMPTY;
/** /**
* 报表模板信息 Service 实现类 * 报表模板信息 Service 实现类
@@ -92,7 +94,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
private static final String UTF8_CHARSET = CharsetUtil.UTF_8; private static final String UTF8_CHARSET = CharsetUtil.UTF_8;
@Resource @Resource
private CfReportProperties cfReportProperties; private TenantParamsUtils tenantParamsUtils;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -340,54 +342,44 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
@Override @Override
public List<ReportTemplateDO> getReportTemplateList(ReportTemplateReqVO reqVO) { public List<ReportTemplateDO> getReportTemplateList(ReportTemplateReqVO reqVO) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
LambdaQueryWrapper<ReportTemplateDO> queryWrapper = new LambdaQueryWrapperX<ReportTemplateDO>().likeIfPresent(ReportTemplateDO::getName, reqVO.getName()) // 当前登录人机构id
.orderByDesc(ReportTemplateDO::getCreateTime) Long organId = loginUser.getOrganId();
// 不返回content xml,点击具体的模板中返回xml // 超管查看不同组织模板
.select(ReportTemplateDO::getId, ReportTemplateDO::getName, ReportTemplateDO::getCreateTime, ReportTemplateDO::getRemark, ReportTemplateDO::getType); if (ObjectUtil.isNotNull(loginUser) && Boolean.TRUE.equals(loginUser.getIsSupAdmin()) && ObjectUtil.isNotNull(reqVO.getOrganId())) {
if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { organId = reqVO.getOrganId();
return templateMapper.selectNormalTemplateList(reqVO.getName(), loginUser.getOrganId()); }
} else { return templateMapper.selectNormalTemplateList(reqVO.getName(), organId);
// 超管查看全部 }
return templateMapper.selectList(queryWrapper);
/**
* 检查查询参数不为空
*
* @param queryMap
*/
private void checkQueryNotEmpty(Map<String, Object> queryMap) {
if (ObjectUtil.isNotNull(queryMap)) {
for (Map.Entry<String, Object> 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 @Override
public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) { public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) {
// 检查查询参数中的空值
checkQueryNotEmpty(reqVO.getQuery());
// 自定义请求vo转ureport对象 // 自定义请求vo转ureport对象
PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class);
Long userOrganId = SecurityFrameworkUtils.getUserOrganId();
HtmlProducer htmlProducer = new HtmlProducer(); HtmlProducer htmlProducer = new HtmlProducer();
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params); ReportDefinition reportDefinition = getReportDefinition(reportRender, params);
Map<String, Object> parameters = params.getQuery(); Map<String, Object> parameters = params.getQuery();
if (Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { // 增加多租户参数
// 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport tenantParamsUtils.prepareTenantParam(parameters);
List<Long> datasetIds = (List) parameters.get("datasetIds");
if (CollUtil.isNotEmpty(datasetIds)) {
// 内置数据集名称列表
List<String> buildinDsNames = new ArrayList<>();
// 遍历获取所有上级数据源
List<ReportDatasetDO> 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);
}
Report report = reportRender.render(reportDefinition, parameters); Report report = reportRender.render(reportDefinition, parameters);
return htmlProducer.produce(reportDefinition, report); return htmlProducer.produce(reportDefinition, report);
} }
@@ -400,7 +392,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params); ReportDefinition reportDefinition = getReportDefinition(reportRender, params);
Report report = reportRender.render(reportDefinition, params.getQuery()); Map<String, Object> query = params.getQuery();
// 增加多租户参数
tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, query);
Map<String, String> chartImages = params.getChartImages(); Map<String, String> chartImages = params.getChartImages();
report.setChartImages(chartImages); report.setChartImages(chartImages);
try { try {
@@ -427,7 +422,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params); ReportDefinition reportDefinition = getReportDefinition(reportRender, params);
Report report = reportRender.render(reportDefinition, params.getQuery()); Map<String, Object> query = params.getQuery();
// 增加多租户参数
tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, query);
Map<String, String> chartImages = params.getChartImages(); Map<String, String> chartImages = params.getChartImages();
report.setChartImages(chartImages); report.setChartImages(chartImages);
try { try {
@@ -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<ReportDatasetDO> datasetDOList = datasetMapper.selectList(new LambdaQueryWrapperX<ReportDatasetDO>().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<String, Object> parameters) {
Long userOrganId = SecurityFrameworkUtils.getUserOrganId();
// 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport
List<Long> datasetIds = (List) parameters.get("datasetIds");
if (CollUtil.isNotEmpty(datasetIds)) {
// 内置数据集名称列表
List<String> buildinDsNames = new ArrayList<>();
// 遍历获取所有上级数据源
List<ReportDatasetDO> 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);
}
}
@@ -72,7 +72,7 @@ public class ReportDatasourceServiceImplTest extends ReportCommonServiceImplTest
reqVO.setTemplateId(templateId); reqVO.setTemplateId(templateId);
reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode()); reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode());
reqVO.setName(updateReqVO.getName()); reqVO.setName(updateReqVO.getName());
List<ReportDatasourceDO> templateDatasourceList = reportDatasourceService.getDatasourceList(); List<ReportDatasourceDO> templateDatasourceList = reportDatasourceService.getDatasourceList(null);
assertNotNull(templateDatasourceList); assertNotNull(templateDatasourceList);
assertNotEquals(0, templateDatasourceList.size()); assertNotEquals(0, templateDatasourceList.size());
@@ -1,12 +1,14 @@
package com.cf.imes.module.system.api.customplateno; package com.cf.imes.module.system.api.customplateno;
import com.cf.imes.framework.common.pojo.CommonResult; 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 com.cf.imes.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; 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") @GetMapping(PREFIX + "/organ")
@Operation(summary = "获取组织下自定义版编号序号") @Operation(summary = "获取组织下自定义版编号序号")
CommonResult<CustomPlateNoSeqRespDTO> getOrgCustomPlateNoSeq(); CommonResult<CustomPlateNoSeqDTO> getOrgCustomPlateNoSeq();
@PostMapping(PREFIX + "/organ")
@Operation(summary = "更新组织下自定义版编号序号")
CommonResult<Boolean> modifyOrgCustomPlateNoSeq(@RequestBody CustomPlateNoSeqDTO customPlateNoSeqDTO);
} }
@@ -15,7 +15,7 @@ import java.io.Serializable;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class CustomPlateNoSeqRespDTO implements Serializable { public class CustomPlateNoSeqDTO implements Serializable {
private static final long serialVersionUID = -3415615478757941611L; private static final long serialVersionUID = -3415615478757941611L;
private Long id; 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;
} }
@@ -9,6 +9,7 @@ public class DictTypeConstants {
public static final String USER_TYPE = "user_type"; // 用户类型 public static final String USER_TYPE = "user_type"; // 用户类型
public static final String COMMON_STATUS = "common_status"; // 系统状态 public static final String COMMON_STATUS = "common_status"; // 系统状态
public static final String ROLE_TYPE = "system_role_type"; // 系统角色类型
// ========== SYSTEM 模块 ========== // ========== SYSTEM 模块 ==========
@@ -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_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_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 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_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, "密码必须包含至少一个数字"); 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 ========== // ========== 组织信息 1-002-015-000 ==========
public static final ErrorCode ORGAN_NOT_EXISTS = new ErrorCode(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_DISABLE = new ErrorCode(1_002_015_001, "【{}】组织已被禁用");
public static final ErrorCode ORGAN_EXPIRE = new ErrorCode(1_002_015_002, "名字为【{}】组织已过期"); 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_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_NAME_DUPLICATE = new ErrorCode(1_002_015_004, "名字为【{}】的组织已存在");
public static final ErrorCode ORGAN_WEBSITE_DUPLICATE = new ErrorCode(1_002_015_005, "域名为【{}】的组织已存在"); public static final ErrorCode ORGAN_WEBSITE_DUPLICATE = new ErrorCode(1_002_015_005, "域名为【{}】的组织已存在");
@@ -135,7 +135,7 @@ public class ErrorCodeConstants {
// ========== 组织套餐 1-002-016-000 ========== // ========== 组织套餐 1-002-016-000 ==========
public static final ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(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_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_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_DELETED_EXIT = new ErrorCode(1_002_016_004, "无法删除内置组织权限套餐");
public static final ErrorCode TENANT_PACKAGE_NAME_UNIQE_ERROR = new ErrorCode(1_002_016_005, "套餐名已存在,请编辑套餐名后重试"); 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 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_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_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才能保存"); public static final ErrorCode BRANCHING_SETTING_COUNT_ERROR = new ErrorCode(1_002_039_005, "智能分线配置机台数量必须大于2才能保存");
//=========== 系统配置 1-002-040-000 ============ //=========== 系统配置 1-002-040-000 ============
public static final ErrorCode SYSTEM_CONFIG_NOT_EXISTS = new ErrorCode(1_002_040_001, "系统配置不存在"); 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_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, "系统配置:自定义板编号保存解析失败,请检查配置规则或联系客服");
} }
@@ -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.AllArgsConstructor;
import lombok.Getter;
/** /**
* 自定义板编号规则编码枚举 * 自定义板编号规则编码枚举
@@ -9,7 +10,7 @@ import lombok.AllArgsConstructor;
* @since 2024/11/11 15:20 * @since 2024/11/11 15:20
*/ */
@AllArgsConstructor @AllArgsConstructor
public enum CustBoardRuleCodeEnum { public enum CustomPlateNoRuleCodeEnum {
/** /**
* 自定义 * 自定义
*/ */
@@ -38,22 +39,19 @@ public enum CustBoardRuleCodeEnum {
/** /**
* 柜体序号 * 柜体序号
*/ */
BODYNO("bodyNo"), BODYNO("bodyNo");
/**
* 加工组序号
*/
PROCESSGROUP("processGroupNo");
@Getter
private String ruleCode; private String ruleCode;
/** /**
* 是否匹配 * 是否匹配
*
* @param ruleCode * @param ruleCode
* @return * @return
*/ */
public static CustBoardRuleCodeEnum match(String ruleCode) { public static CustomPlateNoRuleCodeEnum match(String ruleCode) {
for (CustBoardRuleCodeEnum codeEnum : CustBoardRuleCodeEnum.values()) { for (CustomPlateNoRuleCodeEnum codeEnum : CustomPlateNoRuleCodeEnum.values()) {
if (codeEnum.ruleCode.equals(ruleCode)) { if (codeEnum.ruleCode.equals(ruleCode)) {
return codeEnum; return codeEnum;
} }
@@ -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;
}
}
@@ -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.pojo.CommonResult;
import com.cf.imes.framework.common.util.object.BeanUtils; 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 com.cf.imes.module.system.service.customplateno.CustomPlateNoSeqService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@@ -23,7 +24,12 @@ public class CustomPlateNoSeqApiImpl implements CustomPlateNoSeqApi {
private CustomPlateNoSeqService customPlateNoSeqService; private CustomPlateNoSeqService customPlateNoSeqService;
@Override @Override
public CommonResult<CustomPlateNoSeqRespDTO> getOrgCustomPlateNoSeq() { public CommonResult<CustomPlateNoSeqDTO> getOrgCustomPlateNoSeq() {
return CommonResult.success(BeanUtils.toBean(customPlateNoSeqService.getOrgCustomPlateNoSeq(), CustomPlateNoSeqRespDTO.class)); return CommonResult.success(BeanUtils.toBean(customPlateNoSeqService.getOrgCustomPlateNoSeq(), CustomPlateNoSeqDTO.class));
}
@Override
public CommonResult<Boolean> modifyOrgCustomPlateNoSeq(CustomPlateNoSeqDTO customPlateNoSeqDTO) {
return CommonResult.success(customPlateNoSeqService.modifyOrgCustomPlateNoSeq(BeanUtils.toBean(customPlateNoSeqDTO, CustomPlateNoSeqDO.class)));
} }
} }
@@ -22,14 +22,14 @@ import javax.validation.constraints.Pattern;
public class AuthLoginReqVO { public class AuthLoginReqVO {
@Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "chenfengyuanma") @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "chenfengyuanma")
@NotEmpty(message = "登录账号不能为空") @NotEmpty(message = "登录失败,账号密码不正确")
@Length(min = 4, max = 16, message = "账号长度为 4-16 位") @Length(max = 11, message = "登录失败,账号密码不正确")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") @Pattern(regexp = "^[A-Za-z0-9]+$", message = "登录失败,账号密码不正确")
private String username; private String username;
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao") @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位") @Length(min = 8, max = 16, message = "登录失败,账号密码不正确")
@NotEmpty(message = "密码不能为空") @NotEmpty(message = "登录失败,账号密码不正确")
private String password; private String password;
// ========== 图片验证码相关 ========== // ========== 图片验证码相关 ==========
@@ -24,7 +24,7 @@ public class AuthLoginSmsCheckReqVO {
private String mobile; private String mobile;
@Schema(description = "验证码", example = "123456") @Schema(description = "验证码", example = "123456")
@Length(min = 6, max = 6, message = "验证码长度必须 6 位") @Length(min = 6, max = 6, message = "短信验证码不正确")
@NotEmpty(message = "短信验证码不能为空") @NotEmpty(message = "短信验证码不能为空")
private String smsCaptchaVerification; private String smsCaptchaVerification;
} }
@@ -48,9 +48,6 @@ public class AuthPermissionInfoRespVO {
@Schema(description = "组织id") @Schema(description = "组织id")
private Long organId; private Long organId;
@Schema(description = "是否需要设置密码")
private boolean needSetPwd;
@Schema(description = "ip地址") @Schema(description = "ip地址")
private String ip; private String ip;
@@ -1,6 +1,7 @@
package com.cf.imes.module.system.controller.admin.notice; package com.cf.imes.module.system.controller.admin.notice;
import cn.hutool.core.lang.Assert; 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.enums.UserTypeEnum;
import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.pojo.PageResult;
@@ -68,10 +69,18 @@ public class NoticeController {
return success(BeanUtils.toBean(pageResult, NoticeRespVO.class)); return success(BeanUtils.toBean(pageResult, NoticeRespVO.class));
} }
@GetMapping("/homepage")
@Operation(summary = "获取首页通知公告列表")
public CommonResult<PageResult<NoticeRespVO>> getHomePageNoticePage(@Validated NoticePageReqVO pageReqVO) {
// 首页只看生效的公告
pageReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
PageResult<NoticeDO> pageResult = noticeService.getNoticePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, NoticeRespVO.class));
}
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得通知公告") @Operation(summary = "获得通知公告")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system:notice:query')")
public CommonResult<NoticeRespVO> getNotice(@RequestParam("id") Long id) { public CommonResult<NoticeRespVO> getNotice(@RequestParam("id") Long id) {
NoticeDO notice = noticeService.getNotice(id); NoticeDO notice = noticeService.getNotice(id);
return success(BeanUtils.toBean(notice, NoticeRespVO.class)); return success(BeanUtils.toBean(notice, NoticeRespVO.class));
@@ -1,5 +1,6 @@
package com.cf.imes.module.system.controller.admin.permission.vo.role; 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.annotations.DictFormat;
import com.cf.imes.framework.excel.core.convert.DictConvert; import com.cf.imes.framework.excel.core.convert.DictConvert;
import com.cf.imes.module.system.enums.DictTypeConstants; import com.cf.imes.module.system.enums.DictTypeConstants;
@@ -39,19 +40,23 @@ public class RoleRespVO {
private Integer status; private Integer status;
@Schema(description = "角色类型,参见 RoleTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "角色类型,参见 RoleTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty(value = "角色类型", converter = DictConvert.class)
@DictFormat(DictTypeConstants.ROLE_TYPE)
private Integer type; private Integer type;
@Schema(description = "备注", example = "我是一个角色") @Schema(description = "备注", example = "我是一个角色")
@ExcelProperty("备注")
private String remark; private String remark;
@Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("数据范围")
private Integer dataScope; private Integer dataScope;
@Schema(description = "数据范围(指定部门数组)", example = "1") @Schema(description = "数据范围(指定部门数组)", example = "1")
private Set<Long> dataScopeDeptIds; private Set<Long> dataScopeDeptIds;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")
@ExcelProperty("创建时间")
@ColumnWidth(20)
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "组织id", example = "1") @Schema(description = "组织id", example = "1")
@@ -1,8 +1,8 @@
package com.cf.imes.module.system.controller.admin.sms.vo.log; 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.annotations.DictFormat;
import com.cf.imes.framework.excel.core.convert.DictConvert; 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.cf.imes.module.system.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
@@ -21,13 +21,23 @@ public class SmsLogRespVO {
@ExcelProperty("编号") @ExcelProperty("编号")
private Long id; private Long id;
@Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("短信渠道编号") @ExcelProperty("创建时间")
private Long channelId; @ColumnWidth(20)
private LocalDateTime createTime;
@Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300")
@ExcelProperty("短信渠道编码") @ExcelProperty("手机号")
private String channelCode; 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") @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
@ExcelProperty("模板编号") @ExcelProperty("模板编号")
@@ -41,76 +51,4 @@ public class SmsLogRespVO {
@ExcelProperty(value = "短信类型", converter = DictConvert.class) @ExcelProperty(value = "短信类型", converter = DictConvert.class)
@DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE)
private Integer templateType; 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<String, Object> 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;
} }
@@ -20,7 +20,7 @@ public class UserMobileUpdateReqVO {
private String mobile; private String mobile;
@Schema(description = "验证码", example = "123456") @Schema(description = "验证码", example = "123456")
@Length(min = 6, max = 6, message = "验证码长度必须 6 位") @Length(min = 6, max = 6, message = "短信验证码不正确")
@NotEmpty(message = "短信验证码不能为空") @NotEmpty(message = "短信验证码不能为空")
private String smsCaptchaVerification; private String smsCaptchaVerification;
} }
@@ -12,12 +12,12 @@ public class UserProfileUpdatePasswordReqVO {
@Schema(description = "旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @Schema(description = "旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@NotEmpty(message = "旧密码不能为空") @NotEmpty(message = "旧密码不能为空")
@Length(min = 8, max = 16, message = "密码长度为 4-16 位") @Length(min = 8, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符")
private String oldPassword; private String oldPassword;
@Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "654321") @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "654321")
@NotEmpty(message = "新密码不能为空") @NotEmpty(message = "新密码不能为空")
@Length(min = 8, max = 16, message = "密码长度为 4-16 位") @Length(min = 8, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符")
private String newPassword; private String newPassword;
} }
@@ -13,11 +13,11 @@ public class UserResetPasswordReqVO {
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@NotEmpty(message = "密码不能为空") @NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位") @Length(min = 4, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符")
private String password; private String password;
@Schema(description = "短信验证码", example = "123456") @Schema(description = "短信验证码", example = "123456")
@Length(min = 6, max = 6, message = "短信验证码长度为 6 位") @Length(min = 6, max = 6, message = "短信验证码不正确")
@NotEmpty(message = "短信验证码不能为空") @NotEmpty(message = "短信验证码不能为空")
private String smsCaptchaVerification; private String smsCaptchaVerification;
@@ -36,7 +36,6 @@ public class UserSaveReqVO {
@Schema(description = "用户邮箱", example = "chenfeng@cf.com") @Schema(description = "用户邮箱", example = "chenfeng@cf.com")
@Email(message = "邮箱格式不正确") @Email(message = "邮箱格式不正确")
@Size(max = 50, message = "邮箱长度不能超过 50 个字符") @Size(max = 50, message = "邮箱长度不能超过 50 个字符")
@NotBlank(message = "邮箱不能为空")
private String email; private String email;
@Schema(description = "手机号码", example = "15601691300") @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停用)") @Schema(description = "帐号状态(0正常 1停用)")
@NotNull(message = "账号状态不能空") @NotNull(message = "账号状态不能空")
@CommonStatus @CommonStatus
@@ -17,7 +17,7 @@ public class UserUpdatePasswordReqVO {
@Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
@NotEmpty(message = "密码不能为空") @NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位") @Length(min = 4, max = 16, message = "密码长度不少于8位,且包含大小写字母、数字和特殊字符")
private String password; private String password;
} }
@@ -49,7 +49,7 @@ public interface AuthConvert {
return AuthPermissionInfoRespVO.builder() return AuthPermissionInfoRespVO.builder()
.user(AuthPermissionInfoRespVO.UserVO.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() : "") .expireTime(organizationDO.getExpireTime()).ip(ipQuerySuccess ? ipQueryDataRespDTO.getIp() : "")
.region(region) .region(region)
.build()) .build())
@@ -36,7 +36,7 @@ public interface RoleMapper extends BaseMapperX<RoleDO> {
.eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) .eqIfPresent(RoleDO::getStatus, reqVO.getStatus())
.betweenIfPresent(RoleDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(RoleDO::getCreateTime, reqVO.getCreateTime())
.ne(RoleDO::getId, 1) .ne(RoleDO::getId, 1)
.orderByAsc(RoleDO::getId); .orderByAsc(RoleDO::getSort).orderByAsc(RoleDO::getId);
return selectPage(reqVO, lambdaQueryWrapperX); return selectPage(reqVO, lambdaQueryWrapperX);
} }
@@ -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.controller.admin.systemconfig.vo.ConfigUpdateStatusReqVO;
import com.cf.imes.module.system.dal.dataobject.systemconfig.SystemConfigDO; 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.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.mysql.systemconfig.SystemConfigMapper;
import com.cf.imes.module.system.dal.redis.RedisKeyConstants; 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.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.config.factory.service.AbstractSystemConfigServiceHandler;
import com.cf.imes.module.system.service.dict.DictDataService; import com.cf.imes.module.system.service.dict.DictDataService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -35,7 +35,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; 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 { public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHandler {
// 自定义板编号校验错误全部统一编号:1_002_040_003 // 自定义板编号校验错误全部统一编号: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_PLATE_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_PLATE_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_PLATE_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_PLATE_NO_RULE_CHECK_CUSTOM_VALUE_EMPTY_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_PLATE_NO_RULE_CHECK_RESETMODE_ERROR = 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_PLATE_NO_RULE_CHECK_INT_TYPE_NO_EMPTY = 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_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 @Resource
private DictDataService dictDataService; private DictDataService dictDataService;
@Resource
private CustomPlateNoSeqMapper customPlateNoSeqMapper;
@Resource @Resource
private SystemConfigMapper systemConfigMapper; private SystemConfigMapper systemConfigMapper;
@@ -78,30 +76,30 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand
public void checkValid(String setting) { public void checkValid(String setting) {
// 字典中的时间格式 // 字典中的时间格式
List<DictDataDO> dateTypeFormatDictList = dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), "system_setting_date_type"); List<DictDataDO> dateTypeFormatDictList = dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), "system_setting_date_type");
// 字典中的复位模式
List<DictDataDO> resetModeDictList = dictDataService.getDictDataList(CommonStatusEnum.ENABLE.getStatus(), "system_setting_rest_type");
try { try {
JSONArray jsonArray = JSON.parseArray(setting); JSONArray jsonArray = JSON.parseArray(setting);
for (int i = 0; i < jsonArray.size(); i++) { for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i); JSONObject jsonObject = jsonArray.getJSONObject(i);
String ruleCode = jsonObject.getString("ruleCode"); String ruleCode = jsonObject.getString("ruleCode");
// 1.校验code // 1.校验code
CustBoardRuleCodeEnum custBoardRuleCodeEnum = checkRoleCode(ruleCode); CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum = checkRoleCode(ruleCode);
// 2.时间格式校验 // 2.自定义格式校验
checkCustom(custBoardRuleCodeEnum, jsonObject);
// 3.时间格式校验
checkDateFormat(custBoardRuleCodeEnum, jsonObject.getString("value"), dateTypeFormatDictList); checkDateFormat(custBoardRuleCodeEnum, jsonObject.getString("value"), dateTypeFormatDictList);
// 3.序号类型校验数字和布尔类型 // 4.序号类型校验数字和布尔类型
checkNoType(custBoardRuleCodeEnum, jsonObject); checkNoType(custBoardRuleCodeEnum, jsonObject);
// 4.复位类型校验 // 5.复位类型校验
checkResetMode(custBoardRuleCodeEnum, jsonObject.getInteger("resetMode"), resetModeDictList); checkResetMode(custBoardRuleCodeEnum, jsonObject.getInteger("resetMode"), ruleCode);
} }
} catch (ServiceException e) { } catch (ServiceException e) {
throw e; throw e;
} catch (Exception 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); log.error(systemConfigCustomPlateNoRuleSaveCheckError.getMsg(), e);
throw new ServiceException(systemConfigCustomPlateNoRuleSaveCheckError); throw new ServiceException(systemConfigCustomPlateNoRuleSaveCheckError);
} }
@@ -112,13 +110,13 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand
* *
* @param ruleCode 规则编码 * @param ruleCode 规则编码
*/ */
private CustBoardRuleCodeEnum checkRoleCode(String ruleCode) { private CustomPlateNoRuleCodeEnum checkRoleCode(String ruleCode) {
if (StringUtils.isEmpty(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)) { 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; return custBoardRuleCodeEnum;
} }
@@ -129,11 +127,25 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand
* @param custBoardRuleCodeEnum 规则编码枚举 * @param custBoardRuleCodeEnum 规则编码枚举
* @param format 格式 * @param format 格式
*/ */
private void checkDateFormat(CustBoardRuleCodeEnum custBoardRuleCodeEnum, String format, List<DictDataDO> dateTypeFormatDictList) { private void checkDateFormat(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, String format, List<DictDataDO> dateTypeFormatDictList) {
if (ObjectUtil.equal(CustBoardRuleCodeEnum.DATE, custBoardRuleCodeEnum) && StringUtils.isNotEmpty(format)) { if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.DATE, custBoardRuleCodeEnum) && StringUtils.isNotEmpty(format)) {
Optional<DictDataDO> dateFormatDictDataOptional = dateTypeFormatDictList.stream().filter(d -> format.equals(d.getValue())).findAny(); Optional<DictDataDO> dateFormatDictDataOptional = dateTypeFormatDictList.stream().filter(d -> format.equals(d.getValue())).findAny();
if (dateFormatDictDataOptional.isEmpty()) { 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 custBoardRuleCodeEnum
* @param object * @param object
*/ */
private void checkNoType(CustBoardRuleCodeEnum custBoardRuleCodeEnum, JSONObject object) { private void checkNoType(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, JSONObject object) {
// 序号类型才校验 // 序号类型才校验
if (ObjectUtil.equal(CustBoardRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum) if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum)
|| ObjectUtil.equal(CustBoardRuleCodeEnum.PLATENO, custBoardRuleCodeEnum) || ObjectUtil.equal(CustomPlateNoRuleCodeEnum.PLATENO, custBoardRuleCodeEnum)
|| ObjectUtil.equal(CustBoardRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum) || ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum)
|| ObjectUtil.equal(CustBoardRuleCodeEnum.BODYNO, custBoardRuleCodeEnum) || ObjectUtil.equal(CustomPlateNoRuleCodeEnum.BODYNO, custBoardRuleCodeEnum)
|| ObjectUtil.equal(CustBoardRuleCodeEnum.PROCESSGROUP, custBoardRuleCodeEnum)) { ) {
Map<String, String> intTypeFieldMap = new HashMap<>() {{ Map<String, String> intTypeFieldMap = new HashMap<>() {{
put("initValue", "起始值"); put("initValue", "起始值");
put("length", "位数"); put("length", "位数");
@@ -173,10 +185,10 @@ public class CustomPlateNoServiceHandler extends AbstractSystemConfigServiceHand
*/ */
private void checkInt(Object intObj, String fieldName) { private void checkInt(Object intObj, String fieldName) {
if (ObjectUtil.isNull(intObj)) { 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())) { 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) { private void checkBol(Object bolObj, String fieldName) {
if (ObjectUtil.isNull(bolObj)) { 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)) { 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 * @param resetMode
*/ */
private void checkResetMode(CustBoardRuleCodeEnum custBoardRuleCodeEnum, Integer resetMode, List<DictDataDO> resetModeDictList) { private void checkResetMode(CustomPlateNoRuleCodeEnum custBoardRuleCodeEnum, Integer resetMode, String ruleCode) {
if (ObjectUtil.equal(CustBoardRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum) boolean checkSuccess = true;
|| ObjectUtil.equal(CustBoardRuleCodeEnum.PLATENO, custBoardRuleCodeEnum) if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.ORDERNO, custBoardRuleCodeEnum)) {
|| ObjectUtil.equal(CustBoardRuleCodeEnum.ROOMNO, custBoardRuleCodeEnum) checkSuccess = ObjectUtil.equal(resetMode, ResetModeEnum.DIGIT.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.YEAR.getMode())
|| ObjectUtil.equal(CustBoardRuleCodeEnum.BODYNO, custBoardRuleCodeEnum) || ObjectUtil.equal(resetMode, ResetModeEnum.MONTH.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.DAY.getMode());
|| ObjectUtil.equal(CustBoardRuleCodeEnum.PROCESSGROUP, custBoardRuleCodeEnum)) { } else if (ObjectUtil.equal(CustomPlateNoRuleCodeEnum.PLATENO, custBoardRuleCodeEnum)) {
Optional<DictDataDO> resetModeDictDataOptional = resetModeDictList.stream().filter(d -> resetMode.toString().equals(d.getValue())).findAny(); checkSuccess = ObjectUtil.equal(resetMode, ResetModeEnum.ORDER.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.YEAR.getMode())
if (resetModeDictDataOptional.isEmpty()) { || ObjectUtil.equal(resetMode, ResetModeEnum.MONTH.getMode()) || ObjectUtil.equal(resetMode, ResetModeEnum.ROOM.getMode())
throw ServiceExceptionUtil.exception(CUSTOM_BOARD_NO_RULE_CHECK_RESETMODE_ERROR, resetMode); || 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()) .eq(SystemConfigDO::getType, SystemConfigTypeEnum.CUSTOM_PLATE_NO.getType())
.le(SystemConfigDO::getVersion, minReserveVersion)); .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 @Override
@@ -1,6 +1,7 @@
package com.cf.imes.module.system.service.config.factory.service.impl; package com.cf.imes.module.system.service.config.factory.service.impl;
import cn.hutool.core.util.ObjectUtil; 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.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.context.OrganContextHolder; import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.system.controller.admin.systemconfig.vo.ConfigDeleteReqVO; 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.dal.mysql.systemconfig.SystemConfigMapper;
import com.cf.imes.module.system.enums.config.SystemConfigTypeEnum; import com.cf.imes.module.system.enums.config.SystemConfigTypeEnum;
import com.cf.imes.module.system.service.config.factory.service.AbstractSystemConfigServiceHandler; import com.cf.imes.module.system.service.config.factory.service.AbstractSystemConfigServiceHandler;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -19,7 +19,6 @@ import javax.annotation.Resource;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
/** /**
* *
@@ -35,15 +34,16 @@ public class DefaultSystemConfigServiceHandler extends AbstractSystemConfigServi
@Override @Override
public List<SystemConfigDO> selectList(ConfigPageReqVO reqVO) { public List<SystemConfigDO> selectList(ConfigPageReqVO reqVO) {
List<SystemConfigDO> systemConfigDOS = systemConfigMapper.selectList(new LambdaQueryWrapperX<SystemConfigDO>()
.likeIfPresent(SystemConfigDO::getName, reqVO.getName())
.eqIfPresent(SystemConfigDO::getStatus, reqVO.getStatus())
.eqIfPresent(SystemConfigDO::getOrganId, OrganContextHolder.getOrganId())
.orderByAsc(SystemConfigDO::getId));
// todo 后续所有configTypeEnum中的类型需要上到列表补全时通过遍历enum来补充 // todo 后续所有configTypeEnum中的类型需要上到列表补全时通过遍历enum来补充
SystemConfigTypeEnum customplateNoEnum = SystemConfigTypeEnum.CUSTOM_PLATE_NO; SystemConfigTypeEnum customplateNoEnum = SystemConfigTypeEnum.CUSTOM_PLATE_NO;
CopyOnWriteArrayList<SystemConfigDO> configDOS = Lists.newCopyOnWriteArrayList(systemConfigDOS); List<SystemConfigDO> systemConfigDOS = systemConfigMapper.selectList(new LambdaQueryWrapperX<SystemConfigDO>()
Optional<SystemConfigDO> configDOOptional = configDOS.stream().filter(c -> ObjectUtil.equal(customplateNoEnum.getType(), c.getType())).findAny(); .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<SystemConfigDO> configDOOptional = systemConfigDOS.stream().filter(c -> ObjectUtil.equal(customplateNoEnum.getType(), c.getType())).findAny();
if (configDOOptional.isEmpty()) { if (configDOOptional.isEmpty()) {
SystemConfigDO initCustomPlateNoConfig = new SystemConfigDO().builder().id(null).name(customplateNoEnum.getName()).type(customplateNoEnum.getType()).build(); SystemConfigDO initCustomPlateNoConfig = new SystemConfigDO().builder().id(null).name(customplateNoEnum.getName()).type(customplateNoEnum.getType()).build();
return List.of(initCustomPlateNoConfig); return List.of(initCustomPlateNoConfig);
@@ -22,6 +22,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.*; import static com.cf.imes.module.system.enums.ErrorCodeConstants.*;
@@ -57,11 +58,12 @@ public class IntellectBranchingService extends AbstractSystemConfigServiceHandle
JSONObject jsonObject = jsonArray.getJSONObject(i); JSONObject jsonObject = jsonArray.getJSONObject(i);
checkMachineId(jsonObject.getString("machineId")); checkMachineId(jsonObject.getString("machineId"));
checkMachineName(jsonObject.getString("machineName")); String machineName = jsonObject.getString("machineName");
checkMachineConfig(jsonObject.get("machineConfig")); checkMachineName(machineName);
checkMachineConfig(jsonObject.get("machineConfig"),machineName);
} }
if(jsonArray.size() < 2){ if(jsonArray.size() <= 2){
throw new ServiceException(BRANCHING_SETTING_COUNT_ERROR); 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)) { if (ObjectUtil.isEmpty(machineConfig)) {
throw new ServiceException(BRANCHING_SETTING_SAVE_ERROR); throw exception(BRANCHING_SETTING_SAVE_ERROR,machineName);
} }
} }
@@ -15,4 +15,11 @@ public interface CustomPlateNoSeqService {
* @return * @return
*/ */
CustomPlateNoSeqDO getOrgCustomPlateNoSeq(); CustomPlateNoSeqDO getOrgCustomPlateNoSeq();
/**
* 修改机构的自定义版编号序号
*
* @param seqDO
*/
Boolean modifyOrgCustomPlateNoSeq(CustomPlateNoSeqDO seqDO);
} }
@@ -24,4 +24,11 @@ public class CustomPlateNoSeqServiceImpl implements CustomPlateNoSeqService {
return customPlateNoSeqMapper.selectOne(new LambdaQueryWrapperX<CustomPlateNoSeqDO>() return customPlateNoSeqMapper.selectOne(new LambdaQueryWrapperX<CustomPlateNoSeqDO>()
.eq(CustomPlateNoSeqDO::getOrganId, OrganContextHolder.getOrganId())); .eq(CustomPlateNoSeqDO::getOrganId, OrganContextHolder.getOrganId()));
} }
}
@Override
public Boolean modifyOrgCustomPlateNoSeq(CustomPlateNoSeqDO seqDO) {
return customPlateNoSeqMapper.insertOrUpdate(seqDO);
}
}
@@ -1,5 +1,7 @@
package com.cf.imes.module.system.service.notice; 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.exception.util.ServiceExceptionUtil;
import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
@@ -115,6 +115,12 @@ public class OrganServiceImpl implements OrganService {
if (ObjectUtil.isNull(organizationDO.getPackageId())) { if (ObjectUtil.isNull(organizationDO.getPackageId())) {
throw exception(TENANT_PACKAGE_NOT_EXISTS); 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; return organizationDO;
} }
@@ -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.dataobject.permission.RoleDO;
import com.cf.imes.module.system.dal.mysql.permission.RoleMapper; 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.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.DataScopeEnum;
import com.cf.imes.module.system.enums.permission.RoleCodeEnum; import com.cf.imes.module.system.enums.permission.RoleCodeEnum;
import com.cf.imes.module.system.enums.permission.RoleTypeEnum; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@@ -53,6 +57,12 @@ public class RoleServiceImpl implements RoleService {
@Resource @Resource
private RoleService roleService; private RoleService roleService;
@Resource
private StringRedisTemplate stringRedisTemplate;
// 模糊匹配redisKeyrole:{organId}:{roleId}
public static final String REDIS_ROLE_KEY_PATTERN = RedisKeyConstants.ROLE + ":*:%d";
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createRole(RoleSaveReqVO createReqVO, Integer type) { public Long createRole(RoleSaveReqVO createReqVO, Integer type) {
@@ -80,6 +90,8 @@ public class RoleServiceImpl implements RoleService {
// 更新到数据库 // 更新到数据库
RoleDO updateObj = BeanUtils.toBean(updateReqVO, RoleDO.class); RoleDO updateObj = BeanUtils.toBean(updateReqVO, RoleDO.class);
roleMapper.updateById(updateObj); roleMapper.updateById(updateObj);
// 移除角色缓存
scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, updateObj.getId()));
} }
@Override @Override
@@ -91,6 +103,8 @@ public class RoleServiceImpl implements RoleService {
// 更新状态 // 更新状态
RoleDO updateObj = new RoleDO().setId(id).setStatus(status); RoleDO updateObj = new RoleDO().setId(id).setStatus(status);
roleMapper.updateById(updateObj); roleMapper.updateById(updateObj);
// 移除角色缓存
scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, updateObj.getId()));
} }
@Override @Override
@@ -117,6 +131,31 @@ public class RoleServiceImpl implements RoleService {
roleMapper.deleteById(id); roleMapper.deleteById(id);
// 删除相关数据 // 删除相关数据
permissionService.processRoleDeleted(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<String> matchKeys = new ArrayList<>();
Cursor<String> 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 name 角色名字
* @param code 角色额编码 * @param code 角色额编码
* @param id 角色编号 * @param id 角色编号
*/ */
@VisibleForTesting @VisibleForTesting
void validateRoleDuplicate(String name, String code, Long id, Long organId) { void validateRoleDuplicate(String name, String code, Long id, Long organId) {
@@ -156,7 +195,7 @@ public class RoleServiceImpl implements RoleService {
* *
* @param id 角色编号 * @param id 角色编号
*/ */
// @VisibleForTesting // @VisibleForTesting
@OrganIgnore @OrganIgnore
@Override @Override
public void validateRoleForUpdate(Long id) { public void validateRoleForUpdate(Long id) {
@@ -199,7 +238,7 @@ public class RoleServiceImpl implements RoleService {
public List<RoleDO> getRoleListByStatus(Collection<Integer> statuses, Long organId) { public List<RoleDO> getRoleListByStatus(Collection<Integer> statuses, Long organId) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
assert loginUser != null; assert loginUser != null;
if(!loginUser.getIsSupAdmin()) { if (!loginUser.getIsSupAdmin()) {
return roleMapper.selectList(new LambdaQueryWrapperX<RoleDO>() return roleMapper.selectList(new LambdaQueryWrapperX<RoleDO>()
.in(RoleDO::getStatus, statuses) .in(RoleDO::getStatus, statuses)
.in(RoleDO::getOrganId, loginUser.getOrganId(), 0L) .in(RoleDO::getOrganId, loginUser.getOrganId(), 0L)
@@ -226,7 +265,7 @@ public class RoleServiceImpl implements RoleService {
if (CollUtil.isEmpty(ids)) { if (CollUtil.isEmpty(ids)) {
return Collections.emptyList(); return Collections.emptyList();
} }
return roleMapper.selectBatchIds(ids); return roleMapper.selectBatchIds(ids);
} }
@Override @Override
@@ -293,7 +332,7 @@ public class RoleServiceImpl implements RoleService {
if (CollUtil.isEmpty(roleIds)) { if (CollUtil.isEmpty(roleIds)) {
return Collections.emptyList(); return Collections.emptyList();
} }
return roleMapper.selectBatchIds(roleIds); return roleMapper.selectBatchIds(roleIds);
} }
} }
@@ -119,7 +119,8 @@ public class AdminUserServiceImpl implements AdminUserService {
private static final String UPPER_LETTER_PATTERN = ".*[A-Z].*"; private static final String UPPER_LETTER_PATTERN = ".*[A-Z].*";
private static final String LOWER_LETTER_PATTERN = ".*[a-z].*"; private static final String LOWER_LETTER_PATTERN = ".*[a-z].*";
private static final String DIGIT_PATTERN = ".*\\d.*"; 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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -490,8 +491,6 @@ public class AdminUserServiceImpl implements AdminUserService {
validateUserExists(id); validateUserExists(id);
// 校验用户名唯一 // 校验用户名唯一
validateUsernameUnique(id, username, organId); validateUsernameUnique(id, username, organId);
// 校验邮箱唯一
validateEmailUnique(id, email, organId);
// 校验部门处于开启状态 // 校验部门处于开启状态
deptService.validateDeptList(CollectionUtils.singleton(deptId)); deptService.validateDeptList(CollectionUtils.singleton(deptId));
// 校验岗位处于开启状态 // 校验岗位处于开启状态
@@ -508,19 +507,23 @@ public class AdminUserServiceImpl implements AdminUserService {
} }
// 检查是否包含大写字母 // 检查是否包含大写字母
if (!Pattern.matches(UPPER_LETTER_PATTERN, password)) { 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)) { 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)) { 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)) { 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);
} }
} }
@@ -106,8 +106,6 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest {
o.setStatus(CommonStatusEnum.ENABLE.getStatus()); o.setStatus(CommonStatusEnum.ENABLE.getStatus());
})); }));
//when(postService.getPostList(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); //when(postService.getPostList(eq(reqVO.getPostIds()), isNull())).thenReturn(posts);
// mock passwordEncoder 的方法
when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("chenfengyuanma");
// 调用 // 调用
Long userId = userService.createUser(reqVO); Long userId = userService.createUser(reqVO);