package com.vincent.rsf.server.system.utils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.databind.ObjectMapper; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.utils.DateUtils; import com.vincent.rsf.server.system.entity.SerialRule; import com.vincent.rsf.server.system.entity.SerialRuleItem; import com.vincent.rsf.server.system.enums.SerialRuleReset; import com.vincent.rsf.server.system.enums.SerialRuleType; import com.vincent.rsf.server.system.service.SerialRuleItemService; import com.vincent.rsf.server.system.service.SerialRuleService; import org.apache.tika.utils.StringUtils; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; /** * @author Ryan * @version 1.0 * @title 生成规则编码功能 * @description * @create 2025/3/5 08:01 */ public class SerialRuleUtils { /** * @author Ryan * @description 根据编码规则生成编码号 * @throws * @return 编码号 * @time 2025/3/5 08:52 */ public static String generateRuleCode(String code, Object obj) { SerialRuleService ruleService = SpringUtils.getBean(SerialRuleService.class); //获取规则编码主单 SerialRule serialRule = ruleService .getOne(new LambdaQueryWrapper() .eq(SerialRule::getCode, code)); if (Objects.isNull(serialRule)) { throw new CoolException("当前业务:" + code + ",编码规则不存在!!"); } SerialRuleItemService serialRuleItemService = SpringUtils.getBean(SerialRuleItemService.class); //获取规则编码明细 List ruleItems = serialRuleItemService .list(new LambdaQueryWrapper() .eq(SerialRuleItem::getRuleId, serialRule.getId()) .orderByAsc(SerialRuleItem::getSort)); if (Objects.isNull(ruleItems) || ruleItems.isEmpty()) { throw new CoolException("编码规则明细为空!!"); } StringBuffer buffer = new StringBuffer(); ruleItems.forEach(rule -> { if (rule.getWkType().equals(SerialRuleType.WK_CONSTANT.wkType)) { buffer.append(rule.getFeildValue()); } else if (rule.getWkType().equals(SerialRuleType.WK_SERIAL_NO.wkType)) { String result = "", format = ""; if (serialRule.getReset().equals(SerialRuleReset.SERIAL_REST_TYPE_YEAR.type)) { format = DateUtils.format(new Date(), "yyyy"); } else if (serialRule.getReset().equals(SerialRuleReset.SERIAL_REST_TYPE_MONTH.type)) { format = DateUtils.format(new Date(), "MM"); } else if (serialRule.getReset().equals(SerialRuleReset.SERIAL_REST_TYPE_DAYS.type)){ format = DateUtils.format(new Date(), "dd"); } //当前值自动加1 Integer curVal = serialRule.getCurrValue() + 1; //字符串左边自加补0 String lef = StringUtils.leftPad(curVal + "", serialRule.getMaxLen(), "0"); //最近一次流水号 result = format + lef; //修改最后编码,当前值 serialRule.setCurrValue(curVal); buffer.append(result); } else if (rule.getWkType().equals(SerialRuleType.WK_DATE_FORMAT.wkType)) { //获取时间14位格式时间值yyyyMMddHHmmss String format = DateUtils.format(new Date(), DateUtils.YYYYMMDDHHMMSS_PATTER); //判断是否设置截取长度和起始截取位置 buffer.append(subStr(format, rule.getLenStr(), rule.getLen())); } else if (rule.getWkType().equals(SerialRuleType.WK_FEILD.wkType)) { String subStr; if (!Objects.isNull(objectToMap(obj).get(rule.getFeildValue()))) { subStr = subStr(objectToMap(obj).get(rule.getFeildValue()).toString(), rule.getLenStr(), rule.getLen()); buffer.append(subStr); } } }); serialRule.setLastCode(buffer.toString()); //修改当前规则编码号至数据库 if (!ruleService.saveOrUpdate(serialRule)) { throw new CoolException("规则编码保存失败!!"); } return buffer.toString(); } /** * @author Ryan * @description 根据字段长度及,起始位置截取字符串 * @throws * @return * @time 2025/3/5 13:00 */ public static String subStr(String str, Integer start, Integer end) { StringBuffer buffer = new StringBuffer(); //判断是否设置截取长度和起始截取位置 if (Objects.isNull(start) || end == 0) { buffer.append(str); } else { if (str.length() < (end + start)) { throw new CoolException("截取字符起出字符串长度,请查看规则设定!!"); } //返回起始位置lenStr开始,终点位置为lenStr + len长度的字符串 String substring = str.substring(start, (start + end)); buffer.append(substring); } return buffer.toString(); } /** * @author Ryan * @description Object 转 Map字段 * @throws * @return * @time 2025/3/5 14:00 */ public static Map objectToMap (Object obj) { if (Objects.isNull(obj)) { return null; } ObjectMapper objectMapper = new ObjectMapper(); Map mappedObject = objectMapper.convertValue(obj, Map.class); return mappedObject; } }