package jnpf.base.util; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import jnpf.base.entity.BillNumEntity; import jnpf.base.service.BillNumService; import jnpf.constant.MsgCode; import jnpf.exception.DataException; import jnpf.model.visualJson.FieLdsModel; import jnpf.model.visualJson.config.ConfigModel; import jnpf.model.visualJson.config.PrefixSuffixModel; import jnpf.model.visualJson.config.RuleConfig; import jnpf.util.*; import jnpf.util.visiual.JnpfKeyConsts; import lombok.Synchronized; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Objects; @Component public class VisualBillUtil { @Autowired private BillNumService billNumService; @Synchronized public Object getBillNumber(String visualId, FieLdsModel fieLdsModel, Map data, Object thisValue) { String jnpfKey = fieLdsModel.getConfig().getJnpfKey(); if (JnpfKeyConsts.BILLRULE.equals(jnpfKey) && fieLdsModel.getConfig().getRuleType() != null && Objects.equals(fieLdsModel.getConfig().getRuleType(), 2) && ObjectUtil.isEmpty(thisValue)) { ConfigModel config = fieLdsModel.getConfig(); RuleConfig ruleConfig = config.getRuleConfig(); Integer type = ruleConfig.getType(); String flowId = null; if (data.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(data.get(FlowFormConstant.FLOWID).toString())) { flowId = data.get(FlowFormConstant.FLOWID).toString(); } StringBuilder strNumber = new StringBuilder(); //前缀 String preFixStr = setPreSuffFix(data, ruleConfig.getPrefixList()); if (StringUtil.isNotEmpty(preFixStr) && preFixStr.length() > 100) { throw new DataException(MsgCode.VS027.get(config.getLabel())); } strNumber.append(preFixStr); String ruleId = config.getFormId(); BillNumEntity billNum = billNumService.getBillNum(ruleId, visualId, flowId); switch (type) { case 2: // 随机数编号 if (ObjectUtil.equal(ruleConfig.getRandomType(), 1)) { strNumber.append(cn.hutool.core.util.RandomUtil.randomNumbers(ruleConfig.getRandomDigit())); } else { strNumber.append(cn.hutool.core.util.RandomUtil.randomStringUpper(ruleConfig.getRandomDigit())); } if (billNum != null) { billNumService.removeByRuleId(ruleId, visualId, flowId); } break; case 3: // UUID strNumber.append(IdUtil.randomUUID().toUpperCase()); if (billNum != null) { billNumService.removeByRuleId(ruleId, visualId, flowId); } break; default: // 时间格式 RuleConfig rule = BeanUtil.copyProperties(ruleConfig, RuleConfig.class); rule.setRandomDigit(null); rule.setRandomType(null); String ruleJosn = JsonUtil.getObjectToString(rule); String dateFormat = getTimeFormat(ruleConfig.getDateFormat()); String dateValue = "no".equals(dateFormat) ? "" : DateUtil.dateNow(dateFormat); //获取位数最大值 Integer digit = ruleConfig.getDigit(); StringBuilder maxStr = new StringBuilder(); for (int i = 0; i < digit; i++) { maxStr.append("9"); } Integer maxValue = Integer.parseInt(maxStr.toString()); //起始值 Integer startNumber = Integer.parseInt(ruleConfig.getStartNumber()); Integer thisNum = 0; //处理流水号归0 if (billNum != null) { if (ruleJosn.equals(billNum.getRuleConfig())) { String dateValueOld = billNum.getDateValue(); //判断时间值是否一致,一致流水号递增,不一致则重置流水号 if (StringUtil.isEmpty(dateValueOld) || dateValueOld.equals(dateValue)) { thisNum = billNum.getNum() + 1; if (startNumber + thisNum > maxValue) { thisNum = 0; } } } } else { billNum = new BillNumEntity(); } billNum.setRuleId(ruleId); billNum.setVisualId(visualId); billNum.setFlowId(flowId); billNum.setDateValue(dateValue); billNum.setNum(thisNum); billNum.setRuleConfig(ruleJosn); billNumService.saveBillNum(billNum); if (!"no".equals(dateValue)) { strNumber.append(dateValue); } strNumber.append(PadUtil.padRight(String.valueOf(startNumber + thisNum), ruleConfig.getDigit(), '0')); break; } //后缀 String suffFixStr = setPreSuffFix(data, ruleConfig.getSuffixList()); if (StringUtil.isNotEmpty(suffFixStr) && suffFixStr.length() > 100) { throw new DataException(MsgCode.VS027.get(config.getLabel())); } strNumber.append(suffFixStr); return strNumber.toString(); } else { return thisValue; } } /** * 获取时间格式 * * @param dateFor * @return */ private static String getTimeFormat(String dateFor) { String dateForValue = "no"; if (StringUtil.isEmpty(dateFor)) { return dateForValue; } switch (dateFor) { case "YYYY": dateForValue = "yyyy"; break; case "YYYYMM": dateForValue = "yyyyMM"; break; case "YYYYMMDD": dateForValue = "yyyyMMdd"; break; case "YYYYMMDDHH": dateForValue = "yyyyMMddHH"; break; case "YYYYMMDDHHmm": dateForValue = "yyyyMMddHHmm"; break; case "YYYYMMDDHHmmss": dateForValue = "yyyyMMddHHmmss"; break; case "YYYYMMDDHHmmssSSS": dateForValue = "yyyyMMddHHmmssSSS"; break; } return dateForValue; } /** * 设置前后缀的值 * * @param data * @param list */ private static String setPreSuffFix(Map data, List list) { StringBuilder sb = new StringBuilder(); if (CollectionUtils.isNotEmpty(list)) { for (PrefixSuffixModel prefix : list) { //sourtype = 2自定义,1表单字段 if (Objects.equals(prefix.getSourceType(), 2)) { sb.append(prefix.getRelationField()); } else { if (StringUtil.isNotEmpty(prefix.getRelationField()) && data.get(prefix.getRelationField()) != null) { sb.append(data.get(prefix.getRelationField())); } } } } return sb.toString(); } }