localizer
lzq 2025-10-29 18:38:38 +08:00
parent da713ef56e
commit ff2df428fd
27 changed files with 658 additions and 99 deletions

View File

@ -18,11 +18,22 @@ import java.util.List;
@Accessors(chain = true)
@Constraint
public class AddSnConfigParam implements Constrained {
/**
*
*/
@NotBlank(message = "规则名称不能为空")
private String snname;
/**
* ; sncode
*/
@NotBlank(message = "编码名称不能为空")
private String sncode;
/**
*
*/
@NotBlank(message = "示例不能为空")
private String example;
/**
*
*/

View File

@ -4,11 +4,15 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.njzscloud.common.sn.contant.PadMode;
import com.njzscloud.common.sn.contant.RollbackMode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
import java.util.Objects;
/**
*
*/
@ -26,38 +30,69 @@ public class IncSnEntity {
private Long id;
/**
*
*
*/
private String code;
/**
*
*
*/
private Long val;
/**
*
*
*/
private Integer step;
/**
*
*
*/
private Long initialVal;
/**
*
*
*/
private PadMode padMode;
/**
*
*
*/
private String padVal;
/**
*
*
*/
private Integer padLen;
/**
*
*/
private Long maxVal;
/**
*
*/
private RollbackMode rollback;
/**
*
*/
private Boolean allowOverflow;
/**
*
*/
private LocalDateTime lastTime;
/**
*
*/
private String lastPici;
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
IncSnEntity that = (IncSnEntity) o;
return Objects.equals(code, that.code);
}
@Override
public int hashCode() {
return Objects.hashCode(code);
}
}

View File

@ -1,14 +1,20 @@
package com.njzscloud.common.sn;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.common.sn.contant.RollbackMode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.List;
/**
@ -67,12 +73,128 @@ public class IncSnService extends ServiceImpl<IncSnMapper, IncSnEntity> implemen
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public synchronized Long inc(String code) {
public Long inc(String code, String pici) {
IncSnEntity incCodeEntity = this.getOne(Wrappers.<IncSnEntity>lambdaQuery()
.eq(IncSnEntity::getCode, code));
Long val = incCodeEntity.getVal();
val += incCodeEntity.getStep();
this.updateById(incCodeEntity.setVal(val));
return val;
Assert.notNull(incCodeEntity, () -> Exceptions.exception("编码规则不存在"));
long newVal = 0;
long val = incCodeEntity.getVal();
long maxVal = incCodeEntity.getMaxVal();
if (val == maxVal) {
Boolean allowOverflow = incCodeEntity.getAllowOverflow();
if (allowOverflow) {
newVal = incCodeEntity.getInitialVal();
} else {
throw Exceptions.exception("编码已到最大值,规则:{},最大值:{}", code, maxVal);
}
}
RollbackMode rollback = incCodeEntity.getRollback();
LocalDateTime now = LocalDateTime.now();
LocalDateTime lastTime = incCodeEntity.getLastTime();
switch (rollback) {
case Wu: {
newVal = val + incCodeEntity.getStep();
}
break;
case Ri: {
if (now.isBefore(lastTime)) {
throw Exceptions.exception("服务器时间回溯,无法生成编号");
}
LocalDateTime time1 = lastTime
.withHour(0).withMinute(0).withSecond(0).withNano(0); // 当天00:00:00
LocalDateTime time2 = lastTime
.withHour(23).withMinute(59).withSecond(59).withNano(999_999_999); // 当天23:59:59.999999999
if (time1.isBefore(time2)) {
newVal = incCodeEntity.getInitialVal();
} else if (time1.isEqual(time2)) {
newVal = val + incCodeEntity.getStep();
}
}
break;
case Zhou: {
if (now.isBefore(lastTime)) {
throw Exceptions.exception("服务器时间回溯,无法生成编号");
}
LocalDateTime time1 = lastTime
.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
.withHour(0)
.withMinute(0)
.withSecond(0)
.withNano(0);
LocalDateTime time2 = lastTime
.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY))
.withHour(23)
.withMinute(59)
.withSecond(59)
.withNano(999_999_999);
if (now.isBefore(time1) || now.isAfter(time2)) {
newVal = incCodeEntity.getInitialVal();
} else {
newVal = val + incCodeEntity.getStep();
}
}
break;
case Yue: {
if (now.isBefore(lastTime)) {
throw Exceptions.exception("服务器时间回溯,无法生成编号");
}
LocalDateTime time1 = lastTime
.with(TemporalAdjusters.firstDayOfMonth())
.withHour(0).withMinute(0).withSecond(0).withNano(0);
LocalDateTime time2 = lastTime
.with(TemporalAdjusters.lastDayOfMonth())
.withHour(23).withMinute(59).withSecond(59).withNano(999_999_999);
if (now.isBefore(time1) || now.isAfter(time2)) {
newVal = incCodeEntity.getInitialVal();
} else {
newVal = val + incCodeEntity.getStep();
}
}
break;
case Nian: {
if (now.isBefore(lastTime)) {
throw Exceptions.exception("服务器时间回溯,无法生成编号");
}
LocalDateTime time1 = lastTime
.with(TemporalAdjusters.firstDayOfYear())
.withHour(0).withMinute(0).withSecond(0).withNano(0);
LocalDateTime time2 = lastTime
.with(TemporalAdjusters.lastDayOfYear())
.withHour(23).withMinute(59).withSecond(59).withNano(999_999_999);
if (now.isBefore(time1) || now.isAfter(time2)) {
newVal = incCodeEntity.getInitialVal();
} else {
newVal = val + incCodeEntity.getStep();
}
}
break;
case Pi: {
Assert.notBlank(pici, () -> Exceptions.exception("批次号不能为空"));
String lastPici = incCodeEntity.getLastPici();
if (pici.equals(lastPici)) {
newVal = incCodeEntity.getInitialVal();
} else {
newVal = val + incCodeEntity.getStep();
}
}
break;
default:
throw Exceptions.exception("未知的回卷模式:{}", rollback);
}
this.updateById(new IncSnEntity().setId(incCodeEntity.getId())
.setLastTime(now)
.setLastPici(pici)
.setVal(newVal));
return newVal;
}
}

View File

@ -19,6 +19,20 @@ import java.util.List;
public class ModifySnConfigParam implements Constrained {
private Long id;
/**
*
*/
private String snname;
/**
*
*/
private String sncode;
/**
*
*/
private String example;
/**
*
*/

View File

@ -0,0 +1,50 @@
package com.njzscloud.common.sn;
import com.njzscloud.common.sn.support.SectionConfig;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.List;
/**
*
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class SearchSnConfigResult {
/**
* Id
*/
private Long id;
/**
*
*/
private String snname;
/**
*
*/
private String example;
/**
*
*/
private String sncode;
/**
*
*/
private List<SectionConfig> config;
/**
*
*/
private String memo;
}

View File

@ -68,7 +68,7 @@ public class SnConfigController {
*
*/
@GetMapping("/paging")
public R<PageResult<SnConfigEntity>> paging(PageParam pageParam, SnConfigEntity snConfigEntity) {
public R<PageResult<SearchSnConfigResult>> paging(PageParam pageParam, SnConfigEntity snConfigEntity) {
return R.success(snConfigService.paging(pageParam, snConfigEntity));
}

View File

@ -27,7 +27,15 @@ public class SnConfigEntity {
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
*
*/
private String snname;
/**
*
*/
private String example;
/**
*
*/

View File

@ -8,5 +8,4 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface SnConfigMapper extends BaseMapper<SnConfigEntity> {
}

View File

@ -1,10 +1,20 @@
package com.njzscloud.common.sn;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.core.tuple.Tuple2;
import com.njzscloud.common.core.utils.GroupUtil;
import com.njzscloud.common.mp.support.PageParam;
import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.common.sn.contant.PadMode;
import com.njzscloud.common.sn.support.IncSectionConfig;
import com.njzscloud.common.sn.support.SectionConfig;
import com.njzscloud.common.sn.support.Sn;
@ -13,7 +23,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -37,51 +47,137 @@ public class SnConfigService extends ServiceImpl<SnConfigMapper, SnConfigEntity>
*/
@Transactional(rollbackFor = Exception.class)
public void add(AddSnConfigParam addSnConfigParam) {
List<SectionConfig> configs = addSnConfigParam.getConfig()
.stream()
.map(SnUtil::resolve)
.collect(Collectors.toList());
String sncode = addSnConfigParam.getSncode();
boolean exists = this.exists(Wrappers.<SnConfigEntity>lambdaQuery().eq(SnConfigEntity::getSncode, sncode));
Assert.isFalse(exists, () -> Exceptions.exception("编码配置已存在:{}", sncode));
List<HashMap<String, Object>> configList = addSnConfigParam.getConfig();
Tuple2<List<SectionConfig>, List<IncSnEntity>> tuple2 = resolveConfig(configList);
this.save(new SnConfigEntity()
.setSncode(addSnConfigParam.getSncode())
.setSnname(addSnConfigParam.getSnname())
.setSncode(sncode)
.setExample(addSnConfigParam.getExample())
.setConfig(tuple2.get_0())
.setMemo(addSnConfigParam.getMemo())
.setConfig(configs)
);
List<IncSnEntity> collect = configs
.stream()
.filter(it -> it.getClass() == IncSectionConfig.class)
.map(it -> {
IncSectionConfig config = (IncSectionConfig) it;
return new IncSnEntity()
.setCode(config.getCode())
.setVal((long) config.getInitialVal())
.setStep(config.getStep())
.setInitialVal((long) config.getInitialVal())
.setPadMode(config.getPadMode())
.setPadVal(config.getPadVal())
.setPadLen(config.getPadLen());
}).collect(Collectors.toList());
if (collect.isEmpty()) return;
incSnService.saveBatch(collect);
saveIncSnEntityList(tuple2.get_1());
}
private Tuple2<List<SectionConfig>, List<IncSnEntity>> resolveConfig(List<HashMap<String, Object>> configList) {
Assert.notEmpty(configList, () -> Exceptions.exception("编码配置不能为空"));
List<SectionConfig> configs = new ArrayList<>(configList.size());
List<IncSnEntity> incSnEntityList = new LinkedList<>();
Set<String> incSnEntityCodeList = new HashSet<>();
for (HashMap<String, Object> config : configList) {
SectionConfig sectionConfig = SnUtil.resolve(config);
if (sectionConfig instanceof IncSectionConfig) {
IncSectionConfig incSectionConfig = (IncSectionConfig) sectionConfig;
PadMode padMode = incSectionConfig.getPadMode();
String code = incSectionConfig.getCode();
Assert.isFalse(incSnEntityCodeList.contains(code), () -> Exceptions.exception("编码配置已存在:{}", code));
incSnEntityCodeList.add(code);
incSnEntityList.add(new IncSnEntity()
.setCode(code)
.setVal((long) incSectionConfig.getInitialVal())
.setStep(incSectionConfig.getStep())
.setInitialVal((long) incSectionConfig.getInitialVal())
.setMaxVal(padMode == PadMode.Wu ? Long.MAX_VALUE : (long) (Math.pow(10, incSectionConfig.getPadLen()) - 1))
.setPadMode(padMode)
.setPadVal(incSectionConfig.getPadVal())
.setPadLen(incSectionConfig.getPadLen())
.setRollback(incSectionConfig.getRollback())
.setAllowOverflow(incSectionConfig.getAllowOverflow()));
}
configs.add(sectionConfig);
}
return Tuple2.create(configs, incSnEntityList);
}
private void saveIncSnEntityList(List<IncSnEntity> incSnEntityList) {
if (incSnEntityList.isEmpty()) return;
List<String> incSnCodes = incSnEntityList.stream().map(IncSnEntity::getCode).collect(Collectors.toList());
boolean exists = incSnService.exists(Wrappers.<IncSnEntity>lambdaQuery().in(IncSnEntity::getCode, incSnCodes));
Assert.isFalse(exists, () -> Exceptions.exception("编码配置已存在:{}", incSnCodes));
incSnService.saveBatch(incSnEntityList);
}
/**
*
*/
@Transactional(rollbackFor = Exception.class)
public void modify(ModifySnConfigParam modifySnConfigParam) {
List<SectionConfig> configs = modifySnConfigParam.getConfig()
.stream()
.map(SnUtil::resolve)
Long id = modifySnConfigParam.getId();
SnConfigEntity oldData = this.getById(id);
Assert.notNull(oldData, () -> Exceptions.exception("编码配置不存在"));
List<SectionConfig> oldConfig = oldData.getConfig();
List<HashMap<String, Object>> newConfig = modifySnConfigParam.getConfig();
Tuple2<List<SectionConfig>, List<IncSnEntity>> tuple2 = resolveConfig(newConfig);
List<String> oldIncSectionConfigCodeList = oldConfig.stream()
.filter(it -> it instanceof IncSectionConfig)
.map(it -> ((IncSectionConfig) it).getCode())
.collect(Collectors.toList());
List<IncSnEntity> oldIncSnEntityList;
if (CollUtil.isEmpty(oldIncSectionConfigCodeList)) {
oldIncSnEntityList = Collections.emptyList();
} else {
oldIncSnEntityList = incSnService.list(Wrappers.lambdaQuery(IncSnEntity.class).in(IncSnEntity::getCode, oldIncSectionConfigCodeList));
}
modifyIncSnSectionConfig(oldIncSnEntityList, tuple2.get_1());
this.updateById(new SnConfigEntity()
.setId(modifySnConfigParam.getId())
.setId(id)
.setSnname(modifySnConfigParam.getSnname())
.setSncode(modifySnConfigParam.getSncode())
.setExample(modifySnConfigParam.getExample())
.setConfig(tuple2.get_0())
.setMemo(modifySnConfigParam.getMemo())
.setConfig(configs)
);
}
private void modifyIncSnSectionConfig(List<IncSnEntity> oldIncSnEntityList, List<IncSnEntity> newIncSnEntityList) {
if (oldIncSnEntityList.isEmpty() && newIncSnEntityList.isEmpty()) return;
// 旧无 新有 --> 新增
List<IncSnEntity> addList = difference(newIncSnEntityList, oldIncSnEntityList);
if (CollUtil.isNotEmpty(addList)) saveIncSnEntityList(addList);
// 旧有 新有 --> 修改
List<IncSnEntity> modList = intersection(oldIncSnEntityList, newIncSnEntityList);
if (CollUtil.isNotEmpty(modList)) incSnService.updateBatchById(modList);
// 旧有 新无 --> 删除
List<IncSnEntity> delList = difference(oldIncSnEntityList, newIncSnEntityList);
if (CollUtil.isNotEmpty(delList)) incSnService.removeBatchByIds(delList);
}
private List<IncSnEntity> difference(List<IncSnEntity> list1, List<IncSnEntity> list2) {
List<String> codes = list2.stream().map(IncSnEntity::getCode).collect(Collectors.toList());
return list1.stream()
.filter(it -> !codes.contains(it.getCode()))
.collect(Collectors.toList());
}
private List<IncSnEntity> intersection(List<IncSnEntity> list1, List<IncSnEntity> list2) {
Map<String, IncSnEntity> map = GroupUtil.k_o(list2, IncSnEntity::getCode);
return list1.stream()
.filter(it -> map.containsKey(it.getCode()))
.map(it -> {
IncSnEntity newData = map.get(it.getCode());
PadMode padMode = newData.getPadMode();
Integer padLen = newData.getPadLen();
return new IncSnEntity()
.setId(it.getId())
.setStep(newData.getStep())
.setInitialVal(newData.getInitialVal())
.setPadMode(padMode)
.setPadVal(newData.getPadVal())
.setPadLen(padLen)
.setMaxVal(padMode == PadMode.Wu ? Long.MAX_VALUE : (long) (Math.pow(10, padLen) - 1))
.setRollback(newData.getRollback())
.setAllowOverflow(newData.getAllowOverflow());
})
.collect(Collectors.toList());
}
/**
*
*/
@ -100,8 +196,14 @@ public class SnConfigService extends ServiceImpl<SnConfigMapper, SnConfigEntity>
/**
*
*/
public PageResult<SnConfigEntity> paging(PageParam pageParam, SnConfigEntity snConfigEntity) {
return PageResult.of(this.page(pageParam.toPage(), Wrappers.<SnConfigEntity>query(snConfigEntity)));
public PageResult<SearchSnConfigResult> paging(PageParam pageParam, SnConfigEntity snConfigEntity) {
String sncode = snConfigEntity.getSncode();
String snname = snConfigEntity.getSnname();
LambdaQueryWrapper<SnConfigEntity> ew = Wrappers.lambdaQuery(SnConfigEntity.class)
.like(StrUtil.isNotBlank(sncode), SnConfigEntity::getSncode, sncode)
.like(StrUtil.isNotBlank(snname), SnConfigEntity::getSnname, snname);
IPage<SnConfigEntity> page = this.page(pageParam.toPage(), ew);
return PageResult.of(page.convert(it -> BeanUtil.copyProperties(it, SearchSnConfigResult.class)));
}
}

View File

@ -0,0 +1,24 @@
package com.njzscloud.common.sn.contant;
import com.njzscloud.common.core.ienum.DictStr;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* rollback_mode
*
*/
@Getter
@RequiredArgsConstructor
public enum RollbackMode implements DictStr {
Wu("Wu", "不回卷"),
Ri("Ri", "每日"),
Zhou("Zhou", "每周"),
Yue("Yue", "每月"),
Nian("Nian", "每年"),
Pi("Pi", "每批");
private final String val;
private final String txt;
}

View File

@ -4,10 +4,13 @@ import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class FixedSection implements ISnSection {
/**
*
*/
private final String value;
@Override
public String next() {
public String next(String pici) {
return value;
}
}

View File

@ -6,19 +6,21 @@ import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.sn.contant.SnSection;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.Map;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class FixedSectionConfig implements SectionConfig {
private final SnSection sectionName = SnSection.GuDing;
/**
*
*/
private String value;
@Override
public ISnSection section() {
return new FixedSection(value);

View File

@ -1,5 +1,5 @@
package com.njzscloud.common.sn.support;
public interface ISnSection {
String next();
String next(String pici);
}

View File

@ -4,24 +4,50 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.njzscloud.common.sn.IncSnService;
import com.njzscloud.common.sn.contant.PadMode;
import com.njzscloud.common.sn.contant.RollbackMode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequiredArgsConstructor
public class IncSection implements ISnSection {
/**
*
*/
private final String code;
/**
*
*/
private final Integer step;
/**
*
*/
private final Integer initialVal;
/**
*
*/
private final PadMode padMode;
/**
*
*/
private final String padVal;
/**
*
*/
private final Integer padLen;
private final IncSnService incSnService = SpringUtil.getBean(IncSnService.class);
/**
*
*/
private RollbackMode rollback;
/**
*
*/
private Boolean allowOverflow;
@Override
public String next() {
Long val = incSnService.inc(code);
public String next(String pici) {
Long val = incSnService.inc(code, pici);
return padMode == PadMode.Zuo ? StrUtil.padPre(val.toString(), padLen, padVal) :
padMode == PadMode.You ? StrUtil.padAfter(val.toString(), padLen, padVal) :
val.toString();

View File

@ -5,26 +5,51 @@ import cn.hutool.core.map.MapUtil;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.core.ienum.Dict;
import com.njzscloud.common.sn.contant.PadMode;
import com.njzscloud.common.sn.contant.RollbackMode;
import com.njzscloud.common.sn.contant.SnSection;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.Map;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class IncSectionConfig implements SectionConfig {
private final SnSection sectionName = SnSection.ZiZeng;
/**
*
*/
private String code;
/**
*
*/
private Integer step;
/**
*
*/
private Integer initialVal;
/**
*
*/
private PadMode padMode;
/**
*
*/
private String padVal;
/**
*
*/
private Integer padLen;
/**
*
*/
private RollbackMode rollback;
/**
*
*/
private Boolean allowOverflow;
@Override
public ISnSection section() {
@ -37,14 +62,15 @@ public class IncSectionConfig implements SectionConfig {
step = MapUtil.getInt(config, "step");
initialVal = MapUtil.getInt(config, "initialVal");
padMode = Dict.parse(MapUtil.getStr(config, "padMode"), PadMode.values());
if (padMode == null) padMode = PadMode.Wu;
padVal = MapUtil.getStr(config, "padVal");
padLen = MapUtil.getInt(config, "padLen");
Assert.notBlank(code, () -> Exceptions.clierr("递增编码配置错误,设置字段 code"));
Assert.notNull(step, () -> Exceptions.clierr("递增编码配置错误,设置字段 step"));
Assert.notNull(initialVal, () -> Exceptions.clierr("递增编码配置错误,设置字段 initialVal"));
if (padMode != null) {
Assert.notBlank(padVal, () -> Exceptions.clierr("递增编码配置错误,设置字段 padVal"));
Assert.notNull(padLen, () -> Exceptions.clierr("递增编码配置错误,设置字段 padLen"));
Assert.notBlank(code, () -> Exceptions.clierr("递增编码配置错误,设置字段 code"));
Assert.notNull(step, () -> Exceptions.clierr("递增编码配置错误,设置字段 step"));
Assert.notNull(initialVal, () -> Exceptions.clierr("递增编码配置错误,设置字段 initialVal"));
if (padMode != PadMode.Wu) {
Assert.notBlank(padVal, () -> Exceptions.clierr("递增编码配置错误,设置字段 padVal"));
Assert.notNull(padLen, () -> Exceptions.clierr("递增编码配置错误,设置字段 padLen"));
}
}
}

View File

@ -4,9 +4,21 @@ import cn.hutool.core.util.IdUtil;
import com.njzscloud.common.sn.contant.RandomMode;
public class RandomSection implements ISnSection {
/**
*
*/
private final RandomMode randomMode;
/**
* -ID
*/
private final Long workerId;
/**
* -ID
*/
private final Long datacenterId;
/**
* NanoId-
*/
private final Integer nanoIdSize;
public RandomSection(RandomMode randomMode, Long workerId, Long datacenterId, Integer nanoIdSize) {
@ -29,7 +41,7 @@ public class RandomSection implements ISnSection {
}
@Override
public String next() {
public String next(String pici) {
switch (randomMode) {
case UUID:
return IdUtil.simpleUUID();

View File

@ -8,20 +8,30 @@ import com.njzscloud.common.sn.contant.RandomMode;
import com.njzscloud.common.sn.contant.SnSection;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.Map;
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class RandomSectionConfig implements SectionConfig {
private final SnSection sectionName = SnSection.SuiJi;
/**
*
*/
private RandomMode randomMode;
/**
* -ID
*/
private Long workerId;
/**
* -ID
*/
private Long datacenterId;
/**
* NanoId-
*/
private Integer nanoIdSize;
@Override

View File

@ -7,9 +7,18 @@ import java.util.Map;
public interface SectionConfig {
/**
*
*/
SnSection getSectionName();
/**
*
*/
ISnSection section();
/**
*
*/
void resolve(Map<String, Object> config);
}

View File

@ -17,12 +17,30 @@ public class Sn {
}
public String next() {
return next(null);
}
/**
*
*
* @param pici
* @return
*/
public String next(String pici) {
if (sections == null || sections.isEmpty()) {
return null;
}
return sections.stream()
.map(ISnSection::next)
.reduce((a, b) -> a + b)
.orElseThrow(() -> Exceptions.exception("编码配置配置错误"));
StringBuilder builder = new StringBuilder();
try {
for (ISnSection section : sections) {
builder.append(section.next(pici));
}
} catch (Exception e) {
throw Exceptions.error("编码配置配置错误");
}
return builder.toString();
}
}

View File

@ -41,7 +41,7 @@ public final class SnUtil {
}
public static synchronized String next(String sncode) {
Assert.notBlank(sncode);
Assert.notBlank(sncode, () -> Exceptions.clierr("未指定编码规则"));
return SN_CONFIG_SERVICE.getSn(sncode).next();
}
}

View File

@ -7,13 +7,21 @@ import java.util.Date;
@RequiredArgsConstructor
public class TimeSection implements ISnSection {
/**
*
*/
private final String pattern;
/**
*
*/
private final Boolean timestamp;
/**
* 1 --> 1000-->60000 --> 3600000 --> 86400000 -->
*/
private final Integer unit;
@Override
public String next() {
public String next(String pici) {
return timestamp ? new Date().getTime() / unit + "" : DateUtil.format(new Date(), pattern);
}
}

View File

@ -18,8 +18,17 @@ import java.util.Map;
@Accessors(chain = true)
public class TimeSectionConfig implements SectionConfig {
private final SnSection sectionName = SnSection.ShiJian;
/**
*
*/
private String pattern;
/**
*
*/
private Boolean timestamp;
/**
* 1 --> 1000-->60000 --> 3600000 --> 86400000 -->
*/
private Integer unit;
@Override
@ -33,13 +42,12 @@ public class TimeSectionConfig implements SectionConfig {
timestamp = MapUtil.getBool(config, "timestamp", false);
unit = MapUtil.getInt(config, "unit");
if (timestamp) {
Assert.notNull(unit, () -> Exceptions.clierr("时间编码配置错误,为设置字段 unit"));
Assert.isTrue(StrUtil.isBlank(pattern), () -> Exceptions.clierr("时间编码配置错误,为设置字段 pattern 与 timestamp 不能同时使用"));
Assert.isTrue(unit != null && (unit == 1 || unit == 1000 || unit == 60000 || unit == 3600000 || unit == 86400000), () -> Exceptions.clierr("时间编码配置错误,字段 unit 只能为 1,1000,60000,3600000,86400000 中的一个"));
Assert.isTrue(StrUtil.isBlank(pattern), () -> Exceptions.clierr("时间编码配置错误,字段 pattern 与 timestamp 不能同时使用"));
} else {
Assert.notBlank(pattern, () -> Exceptions.clierr("时间编码配置错误,为设置字段 pattern"));
Assert.isTrue(unit == null, () -> Exceptions.clierr("时间编码配置错误,为设置字段 unit 与 pattern 不能同时使用"));
Assert.notBlank(pattern, () -> Exceptions.clierr("时间编码配置错误,未设置字段 pattern"));
Assert.isTrue(unit == null, () -> Exceptions.clierr("时间编码配置错误,字段 unit 与 pattern 不能同时使用"));
}
}
}

View File

@ -6,6 +6,7 @@ import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.supervisory.biz.pojo.entity.BizDriverEntity;
import com.njzscloud.supervisory.biz.pojo.param.AddDriverParam;
import com.njzscloud.supervisory.biz.pojo.param.AuditDriverParam;
import com.njzscloud.supervisory.biz.pojo.param.ModifyDriverParam;
import com.njzscloud.supervisory.biz.service.BizDriverService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -37,12 +38,10 @@ public class BizDriverController {
/**
*
*
* @param bizDriverEntity
*/
@PostMapping("/modify")
public R<?> modify(@RequestBody BizDriverEntity bizDriverEntity) {
bizDriverService.modify(bizDriverEntity);
public R<?> modify(@RequestBody ModifyDriverParam modifyDriverParam) {
bizDriverService.modify(modifyDriverParam);
return R.success();
}

View File

@ -0,0 +1,50 @@
package com.njzscloud.supervisory.biz.pojo.param;
import com.njzscloud.supervisory.sys.user.pojo.param.AddUserParam;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.time.LocalDate;
/**
*
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class ModifyDriverParam {
private Long id;
/**
*
*/
private String driverName;
/**
*
*/
private String phone;
/**
* ;
*/
private String drivingLicence;
/**
* ; []
*/
private LocalDate licenceStartTime;
private LocalDate licenceEndTime;
private AddUserParam user;
/**
*
*/
private String drivingLicenceNo;
}

View File

@ -1,9 +1,9 @@
package com.njzscloud.supervisory.biz.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -18,6 +18,7 @@ import com.njzscloud.supervisory.biz.mapper.BizDriverMapper;
import com.njzscloud.supervisory.biz.pojo.entity.BizDriverEntity;
import com.njzscloud.supervisory.biz.pojo.param.AddDriverParam;
import com.njzscloud.supervisory.biz.pojo.param.AuditDriverParam;
import com.njzscloud.supervisory.biz.pojo.param.ModifyDriverParam;
import com.njzscloud.supervisory.biz.pojo.result.SearchCompanyResult;
import com.njzscloud.supervisory.sys.auth.pojo.result.MyResult;
import com.njzscloud.supervisory.sys.user.pojo.param.AddUserAccountParam;
@ -28,6 +29,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collections;
import java.util.List;
/**
@ -65,10 +67,30 @@ public class BizDriverService extends ServiceImpl<BizDriverMapper, BizDriverEnti
/**
*
*
* @param bizDriverEntity
*/
public void modify(BizDriverEntity bizDriverEntity) {
@Transactional(rollbackFor = Exception.class)
public void modify(ModifyDriverParam modifyDriverParam) {
Long id = modifyDriverParam.getId();
BizDriverEntity oldData = this.getById(id);
Assert.notNull(oldData, () -> Exceptions.clierr("数据不存在"));
AuditStatus auditStatus = oldData.getAuditStatus();
Long driverUserId = oldData.getUserId();
if (auditStatus == AuditStatus.DaiShenHe || auditStatus == AuditStatus.BoHui) {
sysUserService.del(Collections.singletonList(driverUserId));
AddUserParam user = modifyDriverParam.getUser();
AddUserAccountParam account = user.getAccount();
user.setPhone(account.getPhone())
.setBizObj(BizObj.SiJi);
account.setPhone(null);
driverUserId = sysUserService.add(user);
}
BizDriverEntity bizDriverEntity = BeanUtil.copyProperties(modifyDriverParam, BizDriverEntity.class)
.setAuditStatus(auditStatus == AuditStatus.BoHui ? AuditStatus.DaiShenHe : null)
.setAuditMemo(auditStatus == AuditStatus.BoHui ? "" : null)
.setUserId(driverUserId);
this.updateById(bizDriverEntity);
}

View File

@ -2,6 +2,7 @@ package com.njzscloud.supervisory.bs.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.NumberUtil;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.core.utils.GroupUtil;
import com.njzscloud.supervisory.bs.mapper.SupervisionStatisticsMapper;
@ -71,32 +72,32 @@ public class SupervisionStatisticsService {
.thenApply(dataStatistics -> {
Double todayTotalWeight = MapUtil.getDouble(dataStatistics, "todayTotalWeight", 0.0);
Double yesterdayTotalWeight = MapUtil.getDouble(dataStatistics, "yesterdayTotalWeight", 0.0);
Double dayRate = yesterdayTotalWeight == 0 ? 0 : (todayTotalWeight - yesterdayTotalWeight) / yesterdayTotalWeight * 100;
double dayRate = yesterdayTotalWeight == 0 ? 0 : (todayTotalWeight - yesterdayTotalWeight) / yesterdayTotalWeight * 100;
Double currentMonthTotalWeight = MapUtil.getDouble(dataStatistics, "currentMonthTotalWeight", 0.0);
Double lastMonthTotalWeight = MapUtil.getDouble(dataStatistics, "lastMonthTotalWeight", 0.0);
Double monthRate = lastMonthTotalWeight == 0 ? 0 : (currentMonthTotalWeight - lastMonthTotalWeight) / lastMonthTotalWeight * 100;
double monthRate = lastMonthTotalWeight == 0 ? 0 : (currentMonthTotalWeight - lastMonthTotalWeight) / lastMonthTotalWeight * 100;
Double todayFinishCount = MapUtil.getDouble(dataStatistics, "todayFinishCount", 0.0);
Double todayTotalCount = MapUtil.getDouble(dataStatistics, "todayTotalCount", 0.0);
Double todayFinishRate = todayTotalCount == 0 ? 0 : todayFinishCount / todayTotalCount * 100;
double todayFinishRate = todayTotalCount == 0 ? 0 : todayFinishCount / todayTotalCount * 100;
Double yesterdayFinishCount = MapUtil.getDouble(dataStatistics, "yesterdayFinishCount", 0.0);
// Double yesterdayTotalCount = MapUtil.getDouble(dataStatistics, "yesterdayTotalCount", 0.0);
// Double yesterdayFinishRate = yesterdayFinishCount == 0 ? 100 : yesterdayFinishCount / yesterdayTotalCount * 100;
Double incFinishRate = yesterdayFinishCount == 0 ? 0 : (todayFinishCount - yesterdayFinishCount) / yesterdayFinishCount * 100;
double incFinishRate = yesterdayFinishCount == 0 ? 0 : (todayFinishCount - yesterdayFinishCount) / yesterdayFinishCount * 100;
Double todayWarnCount = MapUtil.getDouble(dataStatistics, "todayWarnCount", 0.0);
Double yesterdayWarnCount = MapUtil.getDouble(dataStatistics, "yesterdayWarnCount", 0.0);
Double warnRate = todayTotalCount == 0 ? 0 : todayWarnCount / todayTotalCount * 100;
Double incWarnRate = yesterdayWarnCount == 0 ? 0 : (todayWarnCount - yesterdayWarnCount) / yesterdayWarnCount * 100;
double warnRate = todayTotalCount == 0 ? 0 : todayWarnCount / todayTotalCount * 100;
double incWarnRate = yesterdayWarnCount == 0 ? 0 : (todayWarnCount - yesterdayWarnCount) / yesterdayWarnCount * 100;
dataStatistics.put("dayRate", dayRate);
dataStatistics.put("monthRate", monthRate);
dataStatistics.put("finishRate", todayFinishRate);
dataStatistics.put("incFinishRate", incFinishRate);
dataStatistics.put("warnRate", warnRate);
dataStatistics.put("incWarnRate", incWarnRate);
dataStatistics.put("dayRate", NumberUtil.decimalFormat("#.##", dayRate));
dataStatistics.put("monthRate", NumberUtil.decimalFormat("#.##", monthRate));
dataStatistics.put("finishRate", NumberUtil.decimalFormat("#.##", todayFinishRate));
dataStatistics.put("incFinishRate", NumberUtil.decimalFormat("#.##", incFinishRate));
dataStatistics.put("warnRate", NumberUtil.decimalFormat("#.##", warnRate));
dataStatistics.put("incWarnRate", NumberUtil.decimalFormat("#.##", incWarnRate));
return dataStatistics;
})
.exceptionally(ex -> {

View File

@ -22,13 +22,13 @@
MAX(IF(t = 2, c, 0)) jin_tian
FROM (SELECT COUNT(*) c, 1 t
FROM order_info a
WHERE a.create_time >= UNIX_TIMESTAMP(CURDATE())
AND a.create_time <![CDATA[ < ]]> UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL -24 HOUR))
WHERE UNIX_TIMESTAMP(a.create_time) >= UNIX_TIMESTAMP(CURDATE())
AND UNIX_TIMESTAMP(a.create_time) <![CDATA[ < ]]> UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL -24 HOUR))
UNION ALL
SELECT COUNT(*) c, 2 t
FROM order_info a
WHERE a.create_time >= UNIX_TIMESTAMP(CURDATE())
AND a.create_time <![CDATA[ < ]]> UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL 24 HOUR))) t) tt
WHERE UNIX_TIMESTAMP(a.create_time) >= UNIX_TIMESTAMP(CURDATE())
AND UNIX_TIMESTAMP(a.create_time) <![CDATA[ < ]]> UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL 24 HOUR))) t) tt
</select>
<select id="getDisposeTotalWeight" resultType="java.lang.Integer">