24282 2 anni fa
parent
commit
627ca3eb75

+ 20 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/bo/CustomerCodeAndCountryId.java

@@ -0,0 +1,20 @@
+package com.fjhx.common.entity.coding.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CustomerCodeAndCountryId {
+
+    /**
+     * 客户编码
+     */
+    private String customerCode;
+
+    /**
+     * 国家id
+     */
+    private Long CountryId;
+
+}

+ 2 - 4
hx-common/src/main/java/com/fjhx/common/entity/coding/dto/DefaultRule.java

@@ -1,7 +1,5 @@
 package com.fjhx.common.entity.coding.dto;
 
-import cn.hutool.core.util.ArrayUtil;
-import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.RuleTypeEnum;
 import lombok.Getter;
 import lombok.Setter;
@@ -18,13 +16,13 @@ public class DefaultRule {
     /**
      * 值
      */
-    private Object value;
+    private String value;
 
     public DefaultRule(RuleTypeEnum ruleTypeEnum) {
         this.ruleTypeEnum = ruleTypeEnum;
     }
 
-    public DefaultRule(RuleTypeEnum ruleTypeEnum, Object value) {
+    public DefaultRule(RuleTypeEnum ruleTypeEnum, String value) {
         this.ruleTypeEnum = ruleTypeEnum;
         this.value = value;
     }

+ 1 - 1
hx-common/src/main/java/com/fjhx/common/entity/coding/dto/RuleVo.java

@@ -15,6 +15,6 @@ public class RuleVo {
     /**
      * 值
      */
-    private Object value;
+    private String value;
 
 }

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/entity/coding/po/CodingRuleAuto.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.entity.coding.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 规则配置自增编码
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+@Getter
+@Setter
+@TableName("coding_rule_auto")
+public class CodingRuleAuto extends BasePo {
+
+    private String key;
+
+    private Integer num;
+
+}

+ 23 - 5
hx-common/src/main/java/com/fjhx/common/enums/CodingRuleEnum.java

@@ -2,11 +2,14 @@ package com.fjhx.common.enums;
 
 import com.fjhx.common.entity.coding.dto.DefaultRule;
 import com.fjhx.common.entity.coding.dto.RuleVo;
+import com.ruoyi.common.exception.ServiceException;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Getter
@@ -18,10 +21,9 @@ public enum CodingRuleEnum {
             getDefaultRule(RuleTypeEnum.DATE_FORMAT, "yyyyMM"),
             getDefaultRule(RuleTypeEnum.COUNTRY_CODE),
             getDefaultRule(RuleTypeEnum.CUSTOMER_CODE),
-            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, 5)
+            getDefaultRule(RuleTypeEnum.AUTOINCREMENT, "5")
     )),
 
-
     ;
 
     /**
@@ -37,18 +39,26 @@ public enum CodingRuleEnum {
     /**
      * 默认规则
      */
-    private final List<DefaultRule> defaultRule;
+    private final List<DefaultRule> defaultRuleList;
+
+    private static final Map<String, CodingRuleEnum> map = new HashMap<>();
+
+    static {
+        for (CodingRuleEnum value : CodingRuleEnum.values()) {
+            map.put(value.key, value);
+        }
+    }
 
     private static DefaultRule getDefaultRule(RuleTypeEnum ruleTypeEnum) {
         return new DefaultRule(ruleTypeEnum);
     }
 
-    private static DefaultRule getDefaultRule(RuleTypeEnum ruleTypeEnum, Object value) {
+    private static DefaultRule getDefaultRule(RuleTypeEnum ruleTypeEnum, String value) {
         return new DefaultRule(ruleTypeEnum, value);
     }
 
     public List<RuleVo> getDefaultRuleVoList() {
-        return defaultRule.stream().map(item -> {
+        return defaultRuleList.stream().map(item -> {
             RuleVo ruleVo = new RuleVo();
             ruleVo.setRuleType(item.getRuleTypeEnum().getType());
             ruleVo.setValue(item.getValue());
@@ -56,4 +66,12 @@ public enum CodingRuleEnum {
         }).collect(Collectors.toList());
     }
 
+    public static List<RuleVo> getDefaultRuleVoList(String key) {
+        CodingRuleEnum codingRuleEnum = map.get(key);
+        if (codingRuleEnum == null) {
+            throw new ServiceException("编码规则key不存在");
+        }
+        return codingRuleEnum.getDefaultRuleVoList();
+    }
+
 }

+ 20 - 0
hx-common/src/main/java/com/fjhx/common/enums/RuleTypeEnum.java

@@ -1,8 +1,12 @@
 package com.fjhx.common.enums;
 
+import com.ruoyi.common.exception.ServiceException;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.HashMap;
+import java.util.Map;
+
 @Getter
 @AllArgsConstructor
 public enum RuleTypeEnum {
@@ -18,4 +22,20 @@ public enum RuleTypeEnum {
 
     private final String name;
 
+    private static final Map<Integer, RuleTypeEnum> map = new HashMap<>();
+
+    static {
+        for (RuleTypeEnum value : RuleTypeEnum.values()) {
+            map.put(value.getType(), value);
+        }
+    }
+
+    public static RuleTypeEnum getRuleTypeEnum(Integer type) {
+        RuleTypeEnum ruleTypeEnum = map.get(type);
+        if (ruleTypeEnum == null) {
+            throw new ServiceException("编码规则类型不存在");
+        }
+        return ruleTypeEnum;
+    }
+
 }

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/mapper/coding/CodingRuleAutoMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.mapper.coding;
+
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 规则配置自增编码 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+public interface CodingRuleAutoMapper extends BaseMapper<CodingRuleAuto> {
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleAutoService.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.service.coding;
+
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 规则配置自增编码 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+public interface CodingRuleAutoService extends BaseService<CodingRuleAuto> {
+
+}

+ 9 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleCustomerService.java

@@ -0,0 +1,9 @@
+package com.fjhx.common.service.coding;
+
+import com.fjhx.common.entity.coding.bo.CustomerCodeAndCountryId;
+
+public interface CodingRuleCustomerService {
+
+    CustomerCodeAndCountryId getCustomerCodeAndCountryId(Long customerId);
+
+}

+ 2 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/CodingRuleService.java

@@ -28,4 +28,6 @@ public interface CodingRuleService extends BaseService<CodingRule> {
      */
     void edit(CodingRuleDto codingRuleDto);
 
+    String createCode(String key, Long customerId);
+
 }

+ 21 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/impl/CodingRuleAutoServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.common.service.coding.impl;
+
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
+import com.fjhx.common.mapper.coding.CodingRuleAutoMapper;
+import com.fjhx.common.service.coding.CodingRuleAutoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 规则配置自增编码 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-18
+ */
+@Service
+public class CodingRuleAutoServiceImpl extends ServiceImpl<CodingRuleAutoMapper, CodingRuleAuto> implements CodingRuleAutoService {
+
+}

+ 146 - 0
hx-common/src/main/java/com/fjhx/common/service/coding/impl/CodingRuleServiceImpl.java

@@ -1,21 +1,37 @@
 package com.fjhx.common.service.coding.impl;
 
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.area.entity.po.CustomizeArea;
+import com.fjhx.area.service.CustomizeAreaService;
+import com.fjhx.common.entity.coding.bo.CustomerCodeAndCountryId;
 import com.fjhx.common.entity.coding.dto.CodingRuleDto;
 import com.fjhx.common.entity.coding.dto.CodingRuleSelectDto;
 import com.fjhx.common.entity.coding.dto.RuleVo;
 import com.fjhx.common.entity.coding.po.CodingRule;
+import com.fjhx.common.entity.coding.po.CodingRuleAuto;
 import com.fjhx.common.entity.coding.vo.CodingRulePageVo;
 import com.fjhx.common.enums.CodingRuleEnum;
+import com.fjhx.common.enums.RuleTypeEnum;
 import com.fjhx.common.mapper.coding.CodingRuleMapper;
+import com.fjhx.common.service.coding.CodingRuleAutoService;
+import com.fjhx.common.service.coding.CodingRuleCustomerService;
 import com.fjhx.common.service.coding.CodingRuleService;
+import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.utils.UserUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -31,6 +47,18 @@ import java.util.Map;
 @Service
 public class CodingRuleServiceImpl extends ServiceImpl<CodingRuleMapper, CodingRule> implements CodingRuleService {
 
+    @Autowired
+    private CodingRuleCustomerService codingRuleCustomerService;
+
+    @Autowired
+    private CustomizeAreaService customizeAreaService;
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private CodingRuleAutoService codingRuleAutoService;
+
     @Override
     public Page<CodingRulePageVo> getPage(CodingRuleSelectDto dto) {
 
@@ -91,6 +119,77 @@ public class CodingRuleServiceImpl extends ServiceImpl<CodingRuleMapper, CodingR
         this.saveOrUpdate(codingRuleDto);
     }
 
+    @Override
+    public String createCode(String key, Long customerId) {
+
+        StringBuilder codeBuilder = new StringBuilder();
+
+        CustomerCodeAndCountryId customerCodeAndCountryId = null;
+
+        Integer autoNum = null;
+
+        List<RuleVo> ruleVoList = getRuleVoList(key);
+        for (RuleVo ruleVo : ruleVoList) {
+            Integer ruleType = ruleVo.getRuleType();
+            RuleTypeEnum ruleTypeEnum = RuleTypeEnum.getRuleTypeEnum(ruleType);
+
+            switch (ruleTypeEnum) {
+                case CUSTOMIZE:
+                    codeBuilder.append(ruleVo.getValue());
+                    break;
+                case COUNTRY_CODE:
+                    if (customerCodeAndCountryId == null) {
+                        customerCodeAndCountryId = codingRuleCustomerService.getCustomerCodeAndCountryId(customerId);
+                    }
+                    codeBuilder.append(getCountryCode(customerCodeAndCountryId.getCountryId()));
+                    break;
+                case SALESMAN_CODE:
+                    codeBuilder.append(getUserCode());
+                    break;
+                case CUSTOMER_CODE:
+                    if (customerCodeAndCountryId == null) {
+                        customerCodeAndCountryId = codingRuleCustomerService.getCustomerCodeAndCountryId(customerId);
+                    }
+                    codeBuilder.append(customerCodeAndCountryId.getCustomerCode());
+                    break;
+                case AUTOINCREMENT:
+                    if (autoNum == null) {
+                        autoNum = getAutoCode(key);
+                    }
+                    String value = ruleVo.getValue();
+                    codeBuilder.append(autoGenericCode(value, autoNum));
+                    break;
+                case DATE_FORMAT:
+                    String dataFormat = ruleVo.getValue();
+                    try {
+                        String format = DateUtil.format(new Date(), dataFormat);
+                        codeBuilder.append(format);
+                    } catch (Exception e) {
+                        throw new ServiceException("生成编码配置日期生成格式错误");
+                    }
+                    break;
+            }
+        }
+
+        return codeBuilder.toString();
+    }
+
+    private Integer getAutoCode(String key) {
+        CodingRuleAuto codingRuleAuto = codingRuleAutoService.getOne(q -> q.eq(CodingRuleAuto::getKey, key));
+        if (codingRuleAuto == null) {
+            codingRuleAuto = new CodingRuleAuto();
+            codingRuleAuto.setKey(key);
+            codingRuleAuto.setNum(1);
+            codingRuleAutoService.save(codingRuleAuto);
+            return 1;
+        }
+
+        codingRuleAuto.setNum(codingRuleAuto.getNum() + 1);
+        codingRuleAutoService.updateById(codingRuleAuto);
+        return codingRuleAuto.getNum();
+    }
+
+
     private int getTempIndex(int startIndex, int endIndex, int tempIndex,
                              List<CodingRulePageVo> codingRulePageVoList,
                              List<String> keyList,
@@ -108,4 +207,51 @@ public class CodingRuleServiceImpl extends ServiceImpl<CodingRuleMapper, CodingR
         return ++tempIndex;
     }
 
+    private List<RuleVo> getRuleVoList(String key) {
+        CodingRule codingRule = getOne(q -> q.eq(CodingRule::getCodingKey, key));
+
+        if (codingRule != null) {
+            List<RuleVo> ruleVoList = JSON.parseArray(codingRule.getRuleJson(), RuleVo.class);
+            if (ruleVoList.size() == 0) {
+                throw new ServiceException("编码生成规则为空");
+            }
+            return ruleVoList;
+        }
+        return CodingRuleEnum.getDefaultRuleVoList(key);
+    }
+
+    private String getCountryCode(Long countryId) {
+        CustomizeArea customizeArea = customizeAreaService.getOne(q -> q
+                .eq(BaseIdPo::getId, countryId)
+                .eq(CustomizeArea::getLevelCode, 1));
+
+        if (customizeArea == null) {
+            throw new ServiceException("国家为空");
+        }
+
+        return customizeArea.getCode();
+    }
+
+
+    private String getUserCode() {
+        SysUser sysUser = sysUserService.getById(SecurityUtils.getUserId());
+        String userCode = sysUser.getUserCode();
+        if (StrUtil.isBlank(userCode)) {
+            throw new ServiceException("业务原代码未配置,生成编码失败");
+        }
+        return userCode;
+    }
+
+    /**
+     * 不够位数的在前面补0,保留num的长度位数字
+     */
+    private static String autoGenericCode(Object length, Integer codeNum) {
+        Integer integer = Convert.toInt(length);
+        if (integer == null) {
+            throw new ServiceException("自定义编码长度不为数字");
+        }
+
+        return String.format("%0" + integer + "d", codeNum + 1);
+    }
+
 }

+ 4 - 0
hx-common/src/main/resources/mapper/coding/CodingRuleAutoMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.common.mapper.coding.CodingRuleAutoMapper">
+</mapper>

+ 22 - 7
hx-customer/src/main/java/com/fjhx/customer/service/customer/impl/CustomerServiceImpl.java

@@ -2,15 +2,14 @@ package com.fjhx.customer.service.customer.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.area.utils.AreaUtil;
-import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.area.utils.CustomizeAreaUtil;
+import com.fjhx.common.entity.coding.bo.CustomerCodeAndCountryId;
+import com.fjhx.common.service.coding.CodingRuleCustomerService;
 import com.fjhx.customer.entity.customer.dto.CustomerDto;
 import com.fjhx.customer.entity.customer.dto.CustomerSelectDto;
 import com.fjhx.customer.entity.customer.po.Customer;
@@ -28,7 +27,6 @@ import com.fjhx.tenant.entity.dict.dto.DictTenantDataSelectDto;
 import com.fjhx.tenant.entity.dict.vo.DictTenantDataVo;
 import com.fjhx.tenant.service.dict.DictTenantDataService;
 import com.obs.services.internal.ServiceException;
-import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
@@ -50,7 +48,7 @@ import java.util.Map;
  * @since 2023-04-04
  */
 @Service
-public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements CustomerService {
+public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements CustomerService, CodingRuleCustomerService {
     @Autowired
     private CustomerUserService customerUserService;
     @Autowired
@@ -325,12 +323,29 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
         baseMapper.customerAllocation(dto);
     }
 
-    //根据字典编码获取字典的数据
-    private List<DictTenantDataVo> getDict(String code){
+    // 根据字典编码获取字典的数据
+    private List<DictTenantDataVo> getDict(String code) {
         DictTenantDataSelectDto dto = new DictTenantDataSelectDto();
         dto.setDictCode(code);
         List<DictTenantDataVo> dictTenantDataServiceList = dictTenantDataService.getList(dto);
         return dictTenantDataServiceList;
     }
 
+    @Override
+    public CustomerCodeAndCountryId getCustomerCodeAndCountryId(Long customerId) {
+        if (customerId == null) {
+            throw new ServiceException("客户id不能为空");
+        }
+
+        Customer customer = getById(customerId);
+        if (customer == null) {
+            throw new ServiceException("未找到客户");
+        }
+
+        CustomerCodeAndCountryId customerCodeAndCountryId = new CustomerCodeAndCountryId();
+        customerCodeAndCountryId.setCountryId(customer.getCountryId());
+        customerCodeAndCountryId.setCustomerCode(customer.getCode());
+
+        return customerCodeAndCountryId;
+    }
 }