Commit f7e4e74d authored by 李驰骋's avatar 李驰骋

扩展自定义编码功能,添加编码回收功能void recycleCodeNos(String code,String[]...

扩展自定义编码功能,添加编码回收功能void recycleCodeNos(String code,String[] codesNos),修改原生成编码功能,如果编码回收表存在数据,优先返回回收表编号
parent 27b72ec5
...@@ -25,4 +25,7 @@ public interface CodingGenerator { ...@@ -25,4 +25,7 @@ public interface CodingGenerator {
*/ */
String getNextCode(String bizKindId, Map<String, Object> inputParams); String getNextCode(String bizKindId, Map<String, Object> inputParams);
} }
...@@ -5,6 +5,7 @@ import java.util.Map; ...@@ -5,6 +5,7 @@ import java.util.Map;
import com.huigou.data.domain.query.FolderAndCodeAndNameQueryRequest; import com.huigou.data.domain.query.FolderAndCodeAndNameQueryRequest;
import com.huigou.uasp.bmp.configuration.domain.model.CodeBuildRule; import com.huigou.uasp.bmp.configuration.domain.model.CodeBuildRule;
import com.huigou.uasp.bmp.configuration.domain.model.CodeRecycle;
/** /**
* 系统参数服务 * 系统参数服务
...@@ -29,6 +30,13 @@ public interface CodeBuildRuleApplication { ...@@ -29,6 +30,13 @@ public interface CodeBuildRuleApplication {
*/ */
String saveCodeBuildRule(CodeBuildRule codeBuildRule); String saveCodeBuildRule(CodeBuildRule codeBuildRule);
/**
* 保存回收单据编号值
* @param codeRecycle
* @return
*/
String saveCodeRecycle(CodeRecycle codeRecycle);
/** /**
* 加载单据编码规则 * 加载单据编码规则
* *
...@@ -85,4 +93,5 @@ public interface CodeBuildRuleApplication { ...@@ -85,4 +93,5 @@ public interface CodeBuildRuleApplication {
* @return * @return
*/ */
List<CodeBuildRule> queryAll(); List<CodeBuildRule> queryAll();
} }
...@@ -8,6 +8,8 @@ import java.util.Map; ...@@ -8,6 +8,8 @@ import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.huigou.uasp.bmp.configuration.domain.model.CodeRecycle;
import com.huigou.uasp.bmp.configuration.repository.CodeRecycleRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
...@@ -37,6 +39,9 @@ public class CodeBuildRuleApplicationImpl extends BaseApplication implements Cod ...@@ -37,6 +39,9 @@ public class CodeBuildRuleApplicationImpl extends BaseApplication implements Cod
@Autowired @Autowired
private CodeBuildRuleRepository repository; private CodeBuildRuleRepository repository;
@Autowired
private CodeRecycleRepository codeRecycleRepository;
@Override @Override
@Transactional @Transactional
public String saveCodeBuildRule(CodeBuildRule codeBuildRule) { public String saveCodeBuildRule(CodeBuildRule codeBuildRule) {
...@@ -46,6 +51,13 @@ public class CodeBuildRuleApplicationImpl extends BaseApplication implements Cod ...@@ -46,6 +51,13 @@ public class CodeBuildRuleApplicationImpl extends BaseApplication implements Cod
return codeBuildRule.getId(); return codeBuildRule.getId();
} }
@Override
public String saveCodeRecycle(CodeRecycle codeRecycle) {
Assert.notNull(codeRecycle, MessageSourceContext.getMessage(MessageConstants.PARAMETER_NOT_NULL_FORMAT, "codeRecycle"));
codeRecycle = (CodeRecycle) this.codeRecycleRepository.save(codeRecycle);
return codeRecycle.getId();
}
@Override @Override
public CodeBuildRule loadCodeBuildRule(String id) { public CodeBuildRule loadCodeBuildRule(String id) {
this.checkIdNotBlank(id); this.checkIdNotBlank(id);
......
package com.huigou.uasp.bmp.configuration.mapper;
import com.huigou.uasp.bmp.configuration.domain.model.CodeRecycle;
import com.huigou.uasp.bmp.configuration.domain.query.CodeRecycleQuery;
import com.topsunit.query.annotations.Mapper;
import com.topsunit.query.annotations.ResultType;
import java.util.Map;
/**
* 自定义编号值回收
* @ Author: chicheng.li
* @ Date : 17:53 2021/4/7
*/
@Mapper(xml = "config/uasp/query/bmp/configuration.xml")
public interface CodeRecycleMapper {
/**
* 分页查询回收自定义编号
* @param query
* @return
*/
Map<String, Object> slicedCodeRecycle(CodeRecycleQuery query);
}
...@@ -19,4 +19,11 @@ public interface CodeBuildRuleRepository extends JpaRepository<CodeBuildRule, St ...@@ -19,4 +19,11 @@ public interface CodeBuildRuleRepository extends JpaRepository<CodeBuildRule, St
@Lock(value = LockModeType.PESSIMISTIC_WRITE) @Lock(value = LockModeType.PESSIMISTIC_WRITE)
@Query(value = "select o from CodeBuildRule o where o.id= :id ") @Query(value = "select o from CodeBuildRule o where o.id= :id ")
CodeBuildRule getByIdForUpdate(@Param("id") String id); CodeBuildRule getByIdForUpdate(@Param("id") String id);
/**
* 通过编号查询自定义编码规是配置
* @param code 自定义编码号
* @return
*/
CodeBuildRule getFirstByCode(String code);
} }
package com.huigou.uasp.bmp.fn; package com.huigou.uasp.bmp.fn;
import com.huigou.uasp.bmp.configuration.domain.model.CodeRecycle;
import com.huigou.uasp.bmp.configuration.domain.query.CodeRecycleQuery;
import java.util.List; import java.util.List;
/** /**
...@@ -26,4 +29,20 @@ public interface CodeGenerator { ...@@ -26,4 +29,20 @@ public interface CodeGenerator {
*/ */
List<String> getNextCodesAsStep(String bizKindId, Integer step); List<String> getNextCodesAsStep(String bizKindId, Integer step);
/**
* 回收自定义编号
*
* @param code 自定义编码号
* @param codesNos 回收编码值
*/
void recycleCodeNos(String code,String[] codesNos);
/**
* 使用回收自定义编号值
* @param code 自定义编号
* @param quantity 使用数量
* @return
*/
List<String> useRecycleCode(String code, int quantity);
} }
...@@ -4,9 +4,19 @@ import java.text.SimpleDateFormat; ...@@ -4,9 +4,19 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
import com.huigou.context.Operator;
import com.huigou.context.ThreadLocalUtil;
import com.huigou.data.domain.query.QueryPageRequest;
import com.huigou.uasp.bmp.configuration.domain.model.CodeRecycle;
import com.huigou.uasp.bmp.configuration.domain.query.CodeRecycleQuery;
import com.huigou.uasp.bmp.configuration.mapper.CodeRecycleMapper;
import com.huigou.uasp.bmp.configuration.repository.CodeBuildRuleRepository;
import com.huigou.util.ClassHelper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
...@@ -28,6 +38,10 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera ...@@ -28,6 +38,10 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera
@Autowired @Autowired
private CodeBuildRuleApplication codeBuildRuleApplication; private CodeBuildRuleApplication codeBuildRuleApplication;
@Autowired
private CodeBuildRuleRepository codeBuildRuleRepository;
@Autowired
private CodeRecycleMapper codeRecycleMapper;
/** /**
* 获取单据编号 * 获取单据编号
...@@ -38,6 +52,11 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera ...@@ -38,6 +52,11 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
try { try {
CodeBuildRule codeBuildRule = codeBuildRuleApplication.getRuleValueAsStep(bizKindId, 1); CodeBuildRule codeBuildRule = codeBuildRuleApplication.getRuleValueAsStep(bizKindId, 1);
//查询编号回收表是否存在值,存在的话直接返回
List<String> noList = this.useRecycleCode(codeBuildRule.getCode(), 1);
if(noList.size()>0){
return noList.get(0);
}
String rule = codeBuildRule.getRule(); String rule = codeBuildRule.getRule();
Integer nextValue = codeBuildRule.getCurrentValue(); Integer nextValue = codeBuildRule.getCurrentValue();
Pattern p = Pattern.compile(CodeBuildRuleApplication.RULE_REG, Pattern.CASE_INSENSITIVE); Pattern p = Pattern.compile(CodeBuildRuleApplication.RULE_REG, Pattern.CASE_INSENSITIVE);
...@@ -64,27 +83,49 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera ...@@ -64,27 +83,49 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera
if (step == null || step < 1) { if (step == null || step < 1) {
step = 1; step = 1;
} }
List<String> list = new ArrayList<>(step);
try { try {
CodeBuildRule codeBuildRule = codeBuildRuleApplication.getRuleValueAsStep(bizKindId, step); //先查询编号回收表是否存在值,存在的话优先取
String rule = codeBuildRule.getRule(); CodeBuildRule tempBuildRule = codeBuildRuleRepository.getFirstByCode(bizKindId);
Integer lastValue = codeBuildRule.getLastValue(); List<String> noList = this.useRecycleCode(tempBuildRule.getCode(), step);
Pattern p = Pattern.compile(CodeBuildRuleApplication.RULE_REG, Pattern.CASE_INSENSITIVE); //回收表编号不足的情况,继续生成编号
int serialLength = 1; if(step > noList.size()){
StringBuffer sb = new StringBuffer(); step = step - noList.size();
Matcher m = p.matcher(rule); CodeBuildRule codeBuildRule = codeBuildRuleApplication.getRuleValueAsStep(bizKindId, step);
if (m.find()) { String rule = codeBuildRule.getRule();
String dateFormat = m.group(1); Integer lastValue = codeBuildRule.getLastValue();
serialLength = Integer.parseInt(m.group(3)); Pattern p = Pattern.compile(CodeBuildRuleApplication.RULE_REG, Pattern.CASE_INSENSITIVE);
m.appendReplacement(sb, formatDate(dateFormat, DateUtil.getDateTime()) + m.group(2) + "%s"); int serialLength = 1;
} StringBuffer sb = new StringBuffer();
for (int i = 1; i <= step; i++) { Matcher m = p.matcher(rule);
list.add(String.format(sb.toString(), formatSerialNumber(lastValue + i, serialLength))); if (m.find()) {
String dateFormat = m.group(1);
serialLength = Integer.parseInt(m.group(3));
m.appendReplacement(sb, formatDate(dateFormat, DateUtil.getDateTime()) + m.group(2) + "%s");
}
for (int i = 1; i <= step; i++) {
noList.add(String.format(sb.toString(), formatSerialNumber(lastValue + i, serialLength)));
}
} }
return noList;
} catch (Exception e) { } catch (Exception e) {
throw new ApplicationException(e); throw new ApplicationException(e);
} }
return list; }
@Override
public void recycleCodeNos(String code,String[] codesNos) {
//保存回收编号数据
for(String temp : codesNos){
CodeRecycle codeRecycle = new CodeRecycle();
codeRecycle.setCode(code);
codeRecycle.setCodeNo(temp);
codeRecycle.setIsRecycle("0");
Operator operator = ThreadLocalUtil.getOperator();
codeRecycle.setCreatedDate(new Date());
codeRecycle.setCreatedById(operator.getLoginUser().getId());
codeRecycle.setCreatedByName(operator.getLoginUser().getName());
codeBuildRuleApplication.saveCodeRecycle(codeRecycle);
}
} }
/** /**
...@@ -119,4 +160,28 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera ...@@ -119,4 +160,28 @@ public class CodeGeneratorImpl extends AbstractDaoFunction implements CodeGenera
return df.format(date); return df.format(date);
} }
@Override
public List<String> useRecycleCode(String code, int quantity) {
CodeRecycleQuery query = new CodeRecycleQuery();
query.setCode(code);
query.setIsRecycle("0");
QueryPageRequest pageInfo = new QueryPageRequest();
pageInfo.setPageIndex(1);
pageInfo.setPageSize(quantity);
pageInfo.setSortFieldName("CREATED_DATE");
query.setPageModel(pageInfo);
Map<String, Object> data = codeRecycleMapper.slicedCodeRecycle(query);
List<CodeRecycle> list = ((List<Object>)data.get("Rows")).stream().map(map->ClassHelper.fromMap(CodeRecycle.class,(Map<String,Object>)map)).collect(Collectors.toList());
//返回回收的自定义编码值
List<String> rst = new ArrayList<String>();
for(int i=0;i<quantity&&i<list.size();i++){
CodeRecycle codeRecycle = list.get(i);
rst.add(codeRecycle.getCodeNo());
//修改回收数据为已使用
codeRecycle.setUseDate(new Date());
codeRecycle.setIsRecycle("1");
codeBuildRuleApplication.saveCodeRecycle(codeRecycle);
}
return rst;
}
} }
...@@ -133,4 +133,12 @@ ...@@ -133,4 +133,12 @@
order by t.sequence asc order by t.sequence asc
</sql> </sql>
</query> </query>
<query name="slicedCodeRecycle" table="SA_CODE_RECYCLE">
<sql-query>
select t.* from SA_CODE_RECYCLE t where 1=1
</sql-query>
<condition column="CODE" name="code" symbol="=" alias="t"/>
<condition column="IS_RECYCLE" name="isRecycle" symbol="=" alias="t"/>
</query>
</query-mappings> </query-mappings>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment