Files
scrq-hd/.svn/pristine/b2/b2e98894f9d1731db5e9a4a98ca524a84e46c1c9.svn-base
2025-07-03 10:34:04 +08:00

210 lines
7.3 KiB
Plaintext

package com.cmeim.basic.service;
import com.cmeim.basic.api.enums.BaNumberRuleCode;
import com.cmeim.basic.po.BaMaterial;
import com.cmeim.basic.po.BaNumberRule;
import com.cmeim.basic.repository.BaMaterialRepository;
import com.cmeim.basic.repository.BaNumberRuleRepository;
import com.cmeim.common.core.exception.ServiceException;
import com.cmeim.common.core.utils.DateUtil;
import com.cmeim.common.core.utils.SpringUtils;
import com.cmeim.common.core.web.domain.RespondEnum;
import com.cmeim.common.core.web.domain.TUserInfo;
import com.cmeim.common.core.web.service.GenericService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
//import String;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
@Service
public class NumberRuleService extends GenericService {
@Autowired
private BaNumberRuleRepository repository;
@Autowired
private BaMaterialRepository materialRepository;
@Override
public JpaRepository getRepository() {
return repository;
}
public void add(BaNumberRule rule, TUserInfo currentUser) {
//校验
if(repository.existsByRuleCode(rule.getRuleCode())) {
throw new ServiceException(RespondEnum.FAILURE, String.format("编码【%s】已存在", rule.getRuleCode()));
}
//赋值
rule.setCreatedBy(currentUser.getUserName());
rule.setCreatedDt(DateUtil.getCurrentDate());
//持久
repository.save(rule);
}
public void update(BaNumberRule rule, TUserInfo currentUser) {
//校验
if(repository.existsByRuleCodeAndIdNot(rule.getRuleCode(), rule.getId())) {
throw new ServiceException(RespondEnum.FAILURE, String.format("编码【%s】已存在", rule.getRuleCode()));
}
//查询
BaNumberRule orule = this.findById(rule.getId());
//赋值
orule.setRuleCode(rule.getRuleCode());
orule.setRuleName(rule.getRuleName());
orule.setPrefix(rule.getPrefix());
orule.setSuffix(rule.getSuffix());
orule.setInitValue(rule.getInitValue());
orule.setStepValue(rule.getStepValue());
orule.setLengthValue(rule.getLengthValue());
orule.setCurrentValue(rule.getCurrentValue());
orule.setDictPeriod(rule.getDictPeriod());
orule.setUpdatedBy(currentUser.getUserName());
orule.setUpdatedDt(DateUtil.getCurrentDate());
//持久
repository.save(orule);
}
public void delete(Long id) {
//查询
/*BaMaterial query = new BaMaterial();
query.setNumberRuleId(id);
long cnt = materialRepository.count((Specification) Example.of(query));
if(cnt > 0) {
throw new ServiceException(RespondEnum.FAILURE, "该规则已被物料使用");
}*/
//持久
repository.deleteById(id);
}
public String getNumber(BaNumberRule rule) {
String number = getPrefix(rule).concat(getSequence(rule)).concat(getSuffix(rule));
return number;
}
private String getSequence(BaNumberRule rule) {
String number = "";
Integer curValue = rule.getCurrentValue();
Integer length = rule.getLengthValue();
if(curValue != null && length != null) {
number = StringUtils.leftPad(String.valueOf(curValue), length, "0");
}
return number;
}
public String getNumber(Long id) {
return getNumbers(id, 1).get(0);
}
public String getNumber(BaNumberRuleCode id) {
return getNumbers(id, 1).get(0);
}
public List<String> getNumbers(BaNumberRuleCode rc, Integer size) {
BaNumberRuleRepository repository = SpringUtils.getBean(BaNumberRuleRepository.class);
BaNumberRule query = new BaNumberRule();
query.setRuleCode(rc.getCode());
List<BaNumberRule> rules = repository.findAll(Example.of(query));
if(rules.size() <= 0) {
throw new ServiceException(RespondEnum.FAILURE, String.format("编码规则[%s]不存在", rc.getCode()));
}
BaNumberRule rule = rules.get(0);
return getNumbers(rule, size);
}
public String getNumber(String code) {
return getNumbers(code, 1).get(0);
}
public List<String> getNumbers(Long id, Integer size) {
Optional<BaNumberRule> optional = repository.findById(id);
if(!optional.isPresent()) {
throw new ServiceException(RespondEnum.FAILURE, "编码规则不存在");
}
BaNumberRule rule = optional.get();
return getNumbers(rule, size);
}
public List<String> getNumbers(String code, Integer size) {
BaNumberRule query = new BaNumberRule();
query.setRuleCode(code);
List<BaNumberRule> rules = repository.findAll(Example.of(query));
if(rules.size() <= 0) {
throw new ServiceException(RespondEnum.FAILURE, String.format("编码规则【%s】不存在", code));
}
BaNumberRule rule = rules.get(0);
return getNumbers(rule, size);
}
private synchronized List<String> getNumbers(BaNumberRule rule, Integer size) {
logger.debug("根据编码规则生成编码, 规则:{}, 数量:{}", rule.getRuleCode(), size);
List<String> numbers = Lists.newArrayList();
Integer curValue = rule.getCurrentValue();
Integer length = rule.getLengthValue();
for(int i=0;i<size;i++) {
String number = "";
if(curValue != null && length != null) {
number = StringUtils.leftPad(String.valueOf(curValue), length, "0");
curValue = curValue + rule.getStepValue();
}
String code = getPrefix(rule).concat(number).concat(getSuffix(rule));
logger.debug("根据编码规则生成编码, 规则:{}, 编码:{}, 序号:{}", rule.getRuleCode(), code, i);
numbers.add(code);
}
if(curValue != null && length != null) {
rule.setCurrentValue(curValue);
repository.save(rule);
}
return numbers;
}
private String getPrefix(BaNumberRule rule) {
String prefix = rule.getPrefix()==null?"":rule.getPrefix();
prefix = getDateTime(prefix);
return prefix;
}
private String getSuffix(BaNumberRule rule) {
String suffix = rule.getSuffix()==null?"":rule.getSuffix();
suffix = getDateTime(suffix);
return suffix;
}
private String getDateTime(String text) {
Pattern pattern = Pattern.compile("\\DateTime\\[(\\w+)\\]");
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
String dateFormatPattern = matcher.group(1);
DateFormat df = new SimpleDateFormat(dateFormatPattern);
String date = df.format(new Date());
text = matcher.replaceFirst(date);
matcher.reset(text);
}
return text;
}
}