localizer
parent
da713ef56e
commit
ff2df428fd
|
|
@ -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;
|
||||
/**
|
||||
* 配置
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
/**
|
||||
* 配置
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,15 @@ public class SnConfigEntity {
|
|||
*/
|
||||
@TableId(type = IdType.ASSIGN_ID)
|
||||
private Long id;
|
||||
/**
|
||||
* 规则名称
|
||||
*/
|
||||
private String snname;
|
||||
|
||||
/**
|
||||
* 示例
|
||||
*/
|
||||
private String example;
|
||||
/**
|
||||
* 编码名称
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -8,5 +8,4 @@ import org.apache.ibatis.annotations.Mapper;
|
|||
*/
|
||||
@Mapper
|
||||
public interface SnConfigMapper extends BaseMapper<SnConfigEntity> {
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
package com.njzscloud.common.sn.support;
|
||||
|
||||
public interface ISnSection {
|
||||
String next();
|
||||
String next(String pici);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -7,9 +7,18 @@ import java.util.Map;
|
|||
|
||||
public interface SectionConfig {
|
||||
|
||||
/**
|
||||
* 编码段名称
|
||||
*/
|
||||
SnSection getSectionName();
|
||||
|
||||
/**
|
||||
* 编码段实例
|
||||
*/
|
||||
ISnSection section();
|
||||
|
||||
/**
|
||||
* 解析配置
|
||||
*/
|
||||
void resolve(Map<String, Object> config);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 不能同时使用"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 -> {
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
Loading…
Reference in New Issue