VisualBillUtil.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package jnpf.base.util;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.IdUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import jnpf.base.entity.BillNumEntity;
  6. import jnpf.base.service.BillNumService;
  7. import jnpf.constant.MsgCode;
  8. import jnpf.exception.DataException;
  9. import jnpf.model.visualJson.FieLdsModel;
  10. import jnpf.model.visualJson.config.ConfigModel;
  11. import jnpf.model.visualJson.config.PrefixSuffixModel;
  12. import jnpf.model.visualJson.config.RuleConfig;
  13. import jnpf.util.*;
  14. import jnpf.util.visiual.JnpfKeyConsts;
  15. import lombok.Synchronized;
  16. import org.apache.commons.collections4.CollectionUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Component;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.Objects;
  22. @Component
  23. public class VisualBillUtil {
  24. @Autowired
  25. private BillNumService billNumService;
  26. @Synchronized
  27. public Object getBillNumber(String visualId, FieLdsModel fieLdsModel, Map<String, Object> data, Object thisValue) {
  28. String jnpfKey = fieLdsModel.getConfig().getJnpfKey();
  29. if (JnpfKeyConsts.BILLRULE.equals(jnpfKey) && fieLdsModel.getConfig().getRuleType() != null
  30. && Objects.equals(fieLdsModel.getConfig().getRuleType(), 2) && ObjectUtil.isEmpty(thisValue)) {
  31. ConfigModel config = fieLdsModel.getConfig();
  32. RuleConfig ruleConfig = config.getRuleConfig();
  33. Integer type = ruleConfig.getType();
  34. String flowId = null;
  35. if (data.get(FlowFormConstant.FLOWID) != null && StringUtil.isNotEmpty(data.get(FlowFormConstant.FLOWID).toString())) {
  36. flowId = data.get(FlowFormConstant.FLOWID).toString();
  37. }
  38. StringBuilder strNumber = new StringBuilder();
  39. //前缀
  40. String preFixStr = setPreSuffFix(data, ruleConfig.getPrefixList());
  41. if (StringUtil.isNotEmpty(preFixStr) && preFixStr.length() > 100) {
  42. throw new DataException(MsgCode.VS027.get(config.getLabel()));
  43. }
  44. strNumber.append(preFixStr);
  45. String ruleId = config.getFormId();
  46. BillNumEntity billNum = billNumService.getBillNum(ruleId, visualId, flowId);
  47. switch (type) {
  48. case 2:
  49. // 随机数编号
  50. if (ObjectUtil.equal(ruleConfig.getRandomType(), 1)) {
  51. strNumber.append(cn.hutool.core.util.RandomUtil.randomNumbers(ruleConfig.getRandomDigit()));
  52. } else {
  53. strNumber.append(cn.hutool.core.util.RandomUtil.randomStringUpper(ruleConfig.getRandomDigit()));
  54. }
  55. if (billNum != null) {
  56. billNumService.removeByRuleId(ruleId, visualId, flowId);
  57. }
  58. break;
  59. case 3:
  60. // UUID
  61. strNumber.append(IdUtil.randomUUID().toUpperCase());
  62. if (billNum != null) {
  63. billNumService.removeByRuleId(ruleId, visualId, flowId);
  64. }
  65. break;
  66. default:
  67. // 时间格式
  68. RuleConfig rule = BeanUtil.copyProperties(ruleConfig, RuleConfig.class);
  69. rule.setRandomDigit(null);
  70. rule.setRandomType(null);
  71. String ruleJosn = JsonUtil.getObjectToString(rule);
  72. String dateFormat = getTimeFormat(ruleConfig.getDateFormat());
  73. String dateValue = "no".equals(dateFormat) ? "" : DateUtil.dateNow(dateFormat);
  74. //获取位数最大值
  75. Integer digit = ruleConfig.getDigit();
  76. StringBuilder maxStr = new StringBuilder();
  77. for (int i = 0; i < digit; i++) {
  78. maxStr.append("9");
  79. }
  80. Integer maxValue = Integer.parseInt(maxStr.toString());
  81. //起始值
  82. Integer startNumber = Integer.parseInt(ruleConfig.getStartNumber());
  83. Integer thisNum = 0;
  84. //处理流水号归0
  85. if (billNum != null) {
  86. if (ruleJosn.equals(billNum.getRuleConfig())) {
  87. String dateValueOld = billNum.getDateValue();
  88. //判断时间值是否一致,一致流水号递增,不一致则重置流水号
  89. if (StringUtil.isEmpty(dateValueOld) || dateValueOld.equals(dateValue)) {
  90. thisNum = billNum.getNum() + 1;
  91. if (startNumber + thisNum > maxValue) {
  92. thisNum = 0;
  93. }
  94. }
  95. }
  96. } else {
  97. billNum = new BillNumEntity();
  98. }
  99. billNum.setRuleId(ruleId);
  100. billNum.setVisualId(visualId);
  101. billNum.setFlowId(flowId);
  102. billNum.setDateValue(dateValue);
  103. billNum.setNum(thisNum);
  104. billNum.setRuleConfig(ruleJosn);
  105. billNumService.saveBillNum(billNum);
  106. if (!"no".equals(dateValue)) {
  107. strNumber.append(dateValue);
  108. }
  109. strNumber.append(PadUtil.padRight(String.valueOf(startNumber + thisNum), ruleConfig.getDigit(), '0'));
  110. break;
  111. }
  112. //后缀
  113. String suffFixStr = setPreSuffFix(data, ruleConfig.getSuffixList());
  114. if (StringUtil.isNotEmpty(suffFixStr) && suffFixStr.length() > 100) {
  115. throw new DataException(MsgCode.VS027.get(config.getLabel()));
  116. }
  117. strNumber.append(suffFixStr);
  118. return strNumber.toString();
  119. } else {
  120. return thisValue;
  121. }
  122. }
  123. /**
  124. * 获取时间格式
  125. *
  126. * @param dateFor
  127. * @return
  128. */
  129. private static String getTimeFormat(String dateFor) {
  130. String dateForValue = "no";
  131. if (StringUtil.isEmpty(dateFor)) {
  132. return dateForValue;
  133. }
  134. switch (dateFor) {
  135. case "YYYY":
  136. dateForValue = "yyyy";
  137. break;
  138. case "YYYYMM":
  139. dateForValue = "yyyyMM";
  140. break;
  141. case "YYYYMMDD":
  142. dateForValue = "yyyyMMdd";
  143. break;
  144. case "YYYYMMDDHH":
  145. dateForValue = "yyyyMMddHH";
  146. break;
  147. case "YYYYMMDDHHmm":
  148. dateForValue = "yyyyMMddHHmm";
  149. break;
  150. case "YYYYMMDDHHmmss":
  151. dateForValue = "yyyyMMddHHmmss";
  152. break;
  153. case "YYYYMMDDHHmmssSSS":
  154. dateForValue = "yyyyMMddHHmmssSSS";
  155. break;
  156. }
  157. return dateForValue;
  158. }
  159. /**
  160. * 设置前后缀的值
  161. *
  162. * @param data
  163. * @param list
  164. */
  165. private static String setPreSuffFix(Map<String, Object> data, List<PrefixSuffixModel> list) {
  166. StringBuilder sb = new StringBuilder();
  167. if (CollectionUtils.isNotEmpty(list)) {
  168. for (PrefixSuffixModel prefix : list) {
  169. //sourtype = 2自定义,1表单字段
  170. if (Objects.equals(prefix.getSourceType(), 2)) {
  171. sb.append(prefix.getRelationField());
  172. } else {
  173. if (StringUtil.isNotEmpty(prefix.getRelationField()) && data.get(prefix.getRelationField()) != null) {
  174. sb.append(data.get(prefix.getRelationField()));
  175. }
  176. }
  177. }
  178. }
  179. return sb.toString();
  180. }
  181. }