package com.sd.business.util; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.exception.ServiceException; import com.sd.business.service.in.InOutStorageService; import com.sd.business.service.inventory.InventoryFinishedOrderDetailService; import com.sd.business.service.order.OrderInfoService; import com.sd.business.service.purchase.PurchaseService; import com.sd.business.service.statement.StatementOfAccountService; import lombok.Getter; import java.util.Date; import java.util.Map; @Getter public enum CodeEnum { // 对账单号 STATEMENT_OF_ACCOUNT_CODE("SOA", "-yyMMdd-", "code", 6, StatementOfAccountService.class), // 成品仓入库 FINISHED_IN("POS", "-yyMMdd-", "code", 6, InventoryFinishedOrderDetailService.class), // 成品仓出库 FINISHED_OUT("PWS", "-yyMMdd-", "code", 6, InventoryFinishedOrderDetailService.class), // 入库编号 IN_CODE("DTS", "-yyMMdd-", "code", 6, InOutStorageService.class), // 入库编号 OUT_CODE("OS", "-yyMMdd-", "code", 6, InOutStorageService.class), // 送货单号 SH_CODE("SH", "-yyMMddHH-", "delivery_code", 3, OrderInfoService.class), // 工单号 WORK_ORDER_CODE("JH", "-yyMMddHH-", "code", 3, OrderInfoService.class), // 采购单号 PURCHASE_CODE("PUR", "-yyMMdd-", "code", 6, PurchaseService.class), ; // 编码前缀 private final String prefix; // 编码加日期规则 private final String dateFormat; // 长度 private final Integer length; // 编码字段名 private final String codeFieldName; // service private final IService service; CodeEnum(String prefix, String dateFormat, String codeFieldName, Integer length, Class> serviceCls) { this.prefix = prefix; this.dateFormat = dateFormat; this.length = length; this.codeFieldName = codeFieldName; this.service = SpringUtil.getBean(serviceCls); } /** * 不够位数的在前面补0,保留num的长度位数字 */ private static String autoGenericCode(int length, Integer codeNum) { return String.format("%0" + length + "d", codeNum + 1); } /** * 获取键值对 */ public String getCode() { String itemPrefix; if (ObjectUtil.isNotEmpty(dateFormat)) { Date date = new Date(); String format = DateUtil.format(date, dateFormat); itemPrefix = prefix + format; } else { itemPrefix = prefix; } Object obj = service.query() .likeRight(codeFieldName, itemPrefix) .orderByDesc(codeFieldName) .last("limit 1") .one(); if (obj == null) { return itemPrefix + autoGenericCode(length, 0); } Map map = Convert.toMap(String.class, Object.class, obj); String code = Convert.toStr(map.get(CharSequenceUtil.toCamelCase(codeFieldName))); Integer codeNum = Convert.toInt(code.substring(itemPrefix.length())); if (ObjectUtil.isEmpty(codeNum)) { throw new ServiceException("自定义编码与系统编码生成规则冲突,暂时无法生成编码,请联系管理员"); } return itemPrefix + autoGenericCode(length, codeNum); } }