Merge remote-tracking branch 'origin/master'

master
郑明梁 2 years ago
commit 92750942b1

@ -7,6 +7,7 @@ public class Constant {
public static final String SERIAL_CACHE_PREFIX = "serial_";
public static final String SERIAL_CACHE_PREFIX_ST = "serialst_";
public static final String SERIAL_CACHE_PREFIX_STAT = "serialstat_";
public static final String SERIAL_CACHE_SYNC_UDI = "syncUdi";
public static final String SCAN_ORDER = "MS";

@ -19,6 +19,12 @@ public class IoStatDayEntity {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
*
*/
@TableField(value = "recordKeyFk")
private String recordKeyFk;
/**
*
*/
@ -95,7 +101,7 @@ public class IoStatDayEntity {
*
*/
@TableField(value = "inCount")
private String inCount;
private Integer inCount;
/**
*
@ -107,13 +113,13 @@ public class IoStatDayEntity {
*
*/
@TableField(value = "inAmount")
private String inAmount;
private BigDecimal inAmount;
/**
*
*/
@TableField(value = "outCount")
private String outCount;
private Integer outCount;
/**
*
@ -125,13 +131,13 @@ public class IoStatDayEntity {
*
*/
@TableField(value = "outAmount")
private String outAmount;
private BigDecimal outAmount;
/**
*
*/
@TableField(value = "balanceCount")
private String balanceCount;
private Integer balanceCount;
/**
*
@ -143,7 +149,7 @@ public class IoStatDayEntity {
*
*/
@TableField(value = "balanceAmount")
private String balanceAmount;
private BigDecimal balanceAmount;
/**
*

@ -19,6 +19,12 @@ public class IoStatMonthEntity {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
*
*/
@TableField(value = "recordKeyFk")
private String recordKeyFk;
/**
*
*/
@ -89,7 +95,7 @@ public class IoStatMonthEntity {
*
*/
@TableField(value = "inCount")
private String inCount;
private Integer inCount;
/**
*
@ -101,13 +107,13 @@ public class IoStatMonthEntity {
*
*/
@TableField(value = "inAmount")
private String inAmount;
private BigDecimal inAmount;
/**
*
*/
@TableField(value = "outCount")
private String outCount;
private Integer outCount;
/**
*
@ -119,13 +125,13 @@ public class IoStatMonthEntity {
*
*/
@TableField(value = "outAmount")
private String outAmount;
private BigDecimal outAmount;
/**
*
*/
@TableField(value = "balanceCount")
private String balanceCount;
private Integer balanceCount;
/**
*
@ -137,7 +143,7 @@ public class IoStatMonthEntity {
*
*/
@TableField(value = "balanceAmount")
private String balanceAmount;
private BigDecimal balanceAmount;
/**
*

@ -31,7 +31,7 @@ public class IoStatOrderEntity {
private Date date;
/**
* 1:2.3
* 1:2.3 4
*/
@TableField(value = "`type`")
private Integer type;

@ -15,9 +15,16 @@ import java.util.Date;
@Data
@TableName(value = "io_stat_quarter")
public class IoStatQuarterEntity {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
*
*/
@TableField(value = "recordKeyFk")
private String recordKeyFk;
/**
*
*/
@ -82,7 +89,7 @@ public class IoStatQuarterEntity {
*
*/
@TableField(value = "inCount")
private String inCount;
private Integer inCount;
/**
*
@ -94,13 +101,13 @@ public class IoStatQuarterEntity {
*
*/
@TableField(value = "inAmount")
private String inAmount;
private BigDecimal inAmount;
/**
*
*/
@TableField(value = "outCount")
private String outCount;
private Integer outCount;
/**
*
@ -112,13 +119,13 @@ public class IoStatQuarterEntity {
*
*/
@TableField(value = "outAmount")
private String outAmount;
private BigDecimal outAmount;
/**
*
*/
@TableField(value = "balanceCount")
private String balanceCount;
private Integer balanceCount;
/**
*
@ -130,7 +137,7 @@ public class IoStatQuarterEntity {
*
*/
@TableField(value = "balanceAmount")
private String balanceAmount;
private BigDecimal balanceAmount;
/**
*

@ -19,6 +19,12 @@ public class IoStatYearEntity {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
*
*/
@TableField(value = "recordKeyFk")
private String recordKeyFk;
/**
*
*/
@ -77,7 +83,7 @@ public class IoStatYearEntity {
*
*/
@TableField(value = "inCount")
private String inCount;
private Integer inCount;
/**
*
@ -89,13 +95,13 @@ public class IoStatYearEntity {
*
*/
@TableField(value = "inAmount")
private String inAmount;
private BigDecimal inAmount;
/**
*
*/
@TableField(value = "outCount")
private String outCount;
private Integer outCount;
/**
*
@ -107,13 +113,13 @@ public class IoStatYearEntity {
*
*/
@TableField(value = "outAmount")
private String outAmount;
private BigDecimal outAmount;
/**
*
*/
@TableField(value = "balanceCount")
private String balanceCount;
private Integer balanceCount;
/**
*
@ -125,7 +131,7 @@ public class IoStatYearEntity {
*
*/
@TableField(value = "balanceAmount")
private String balanceAmount;
private BigDecimal balanceAmount;
/**
*

@ -57,4 +57,9 @@ public class DeviceMAOrderResponse {
*/
private String code;
/**
*
*/
private String deptName;
}

@ -9,19 +9,27 @@ import com.glxp.api.constant.ConstantType;
import com.glxp.api.dao.inout.IoOrderDao;
import com.glxp.api.dao.inout.IoOrderDetailResultDao;
import com.glxp.api.dao.inout.IoStatDayDao;
import com.glxp.api.dao.inout.IoStatOrderDao;
import com.glxp.api.entity.inout.IoOrderDetailResultEntity;
import com.glxp.api.entity.inout.IoOrderEntity;
import com.glxp.api.entity.inout.IoStatDayEntity;
import com.glxp.api.entity.inout.IoStatOrderEntity;
import com.glxp.api.service.inout.IoStatDayService;
import com.glxp.api.util.GennerOrderUtils;
import com.glxp.api.util.OrderNoTypeBean;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.TransactionIsolationLevel;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@Slf4j
@Service
@ -34,6 +42,12 @@ public class IoStatDayServiceImpl implements IoStatDayService {
private IoOrderDetailResultDao ioOrderDetailResultDao;
@Resource
private IoOrderDao orderDao;
@Resource
private GennerOrderUtils gennerOrderUtils;
@Resource
private IoStatOrderDao statOrderDao;
@Resource
private SqlSessionFactory sqlSessionFactory;
@Override
public void statData(Date date) {
@ -43,51 +57,162 @@ public class IoStatDayServiceImpl implements IoStatDayService {
.select("orderIdFk", "bindRlFk", "nameCode", "batchNo", "productDate", "expireDate", "coName", "spec", "price", "count", "reCount")
.between("createTime", DateUtil.beginOfDay(yesterday), DateUtil.endOfDay(yesterday)));
if (CollUtil.isNotEmpty(orderDetailResultEntities)) {
List<IoOrderDetailResultEntity> dataList = new CopyOnWriteArrayList<>(orderDetailResultEntities);
dataList.parallelStream().forEach(orderDetailResultEntity -> {
//查询此产品前一天的数据
IoStatDayEntity statDayEntity = statDayDao.selectOne(buildQueryWrapper(orderDetailResultEntity, yesterday));
if (null == statDayEntity) {
//第一次汇总次产品数据
statDayEntity = new IoStatDayEntity();
statDayEntity.setYear(yesterday.year());
statDayEntity.setMonth(yesterday.month());
statDayEntity.setDay(DateUtil.dayOfMonth(yesterday));
statDayEntity.setRelIdFk(String.valueOf(orderDetailResultEntity.getBindRlFk()));
statDayEntity.setNameCode(orderDetailResultEntity.getNameCode());
statDayEntity.setProductName(orderDetailResultEntity.getCoName());
statDayEntity.setGgxh(orderDetailResultEntity.getSpec());
statDayEntity.setBatchNo(orderDetailResultEntity.getBatchNo());
//设置期初数据
statDayEntity.setBeginCount(0);
statDayEntity.setBeginPrice(orderDetailResultEntity.getPrice());
statDayEntity.setBeginAmount(BigDecimal.ZERO);
//查询此单是出库还是入库
IoOrderEntity order = orderDao.selectOne(new QueryWrapper<IoOrderEntity>().select("mainAction").eq("billNo", orderDetailResultEntity.getOrderIdFk()));
if (order.getMainAction().equals(ConstantType.TYPE_PUT)) {
//入库
statDayEntity.setInCount(String.valueOf(orderDetailResultEntity.getReCount()));
statDayEntity.setInPrice(orderDetailResultEntity.getPrice());
BigDecimal inAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount()));
statDayEntity.setInAmount(inAmount.toString());
} else if (order.getMainAction().equals(ConstantType.TYPE_OUT)) {
//出库
//声明用于存放汇总数据的集合
List<IoStatDayEntity> dataList = new ArrayList<>();
orderDetailResultEntities.forEach(orderDetailResultEntity -> {
//获取新的汇总数据
IoStatDayEntity statData = getStatData(dataList, orderDetailResultEntity, yesterday);
//查询此单是出库还是入库
IoOrderEntity order = orderDao.selectOne(new QueryWrapper<IoOrderEntity>().select("mainAction").eq("billNo", orderDetailResultEntity.getOrderIdFk()));
if (order.getMainAction().equals(ConstantType.TYPE_PUT)) {
//入库
statData.setInCount(orderDetailResultEntity.getReCount() + statData.getInCount());
statData.setInPrice(orderDetailResultEntity.getPrice());
BigDecimal inAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount()));
statData.setInAmount(inAmount.add(statData.getInAmount()));
//计算结余金额
long balanceCount;
BigDecimal balanceAmount;
if (statData.getBalanceCount() == 0) {
balanceCount = Long.valueOf(statData.getBeginCount()) + orderDetailResultEntity.getReCount();
balanceAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(balanceCount));
} else {
balanceCount = statData.getBalanceCount() + orderDetailResultEntity.getReCount();
balanceAmount = statData.getBalanceAmount().add(statData.getBalancePrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount())));
}
statData.setBalanceCount(Long.valueOf(balanceCount).intValue());
statData.setBalanceAmount(balanceAmount);
} else if (order.getMainAction().equals(ConstantType.TYPE_OUT)) {
//出库
statData.setOutCount(orderDetailResultEntity.getReCount() + statData.getOutCount());
statData.setOutPrice(orderDetailResultEntity.getPrice());
BigDecimal outAmount = statData.getBeginAmount().add(orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount())));
statData.setOutAmount(outAmount.add(statData.getOutAmount()));
//计算结余金额
long balanceCount;
BigDecimal balanceAmount;
if (statData.getBalanceCount() == 0) {
balanceCount = Long.valueOf(statData.getBeginCount()) - orderDetailResultEntity.getReCount();
balanceAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(balanceCount));
} else {
balanceCount = statData.getBalanceCount() + orderDetailResultEntity.getReCount();
balanceAmount = statData.getBalanceAmount().add(statData.getBalancePrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount())));
}
statData.setBalanceCount(Long.valueOf(balanceCount).intValue());
statData.setBalanceAmount(balanceAmount);
}
});
//开始生成日数据汇总记录
saveData(yesterday, dataList);
}
}
/**
*
*
* @param dataList
* @param orderDetailResultEntity
* @return
*/
private IoStatDayEntity getStatData(List<IoStatDayEntity> dataList, IoOrderDetailResultEntity orderDetailResultEntity, DateTime yesterday) {
if (CollUtil.isNotEmpty(dataList)) {
for (IoStatDayEntity statDayEntity : dataList) {
if (statDayEntity.getRelIdFk().equals(orderDetailResultEntity.getBindRlFk())) {
if ((StrUtil.isNotBlank(statDayEntity.getBatchNo()) && StrUtil.isNotBlank(orderDetailResultEntity.getBatchNo())) && statDayEntity.getBatchNo().equals(orderDetailResultEntity.getBatchNo())) {
return statDayEntity;
} else if (StrUtil.isBlank(statDayEntity.getBatchNo()) && StrUtil.isBlank(orderDetailResultEntity.getBatchNo())) {
return statDayEntity;
}
}
}
}
IoStatDayEntity statData = new IoStatDayEntity();
statData.setYear(yesterday.year());
statData.setQuarter(yesterday.quarter());
statData.setMonth(yesterday.monthBaseOne());
statData.setDay(DateUtil.dayOfMonth(yesterday));
statData.setRelIdFk(String.valueOf(orderDetailResultEntity.getBindRlFk()));
statData.setNameCode(orderDetailResultEntity.getNameCode());
statData.setProductName(orderDetailResultEntity.getCoName());
statData.setGgxh(orderDetailResultEntity.getSpec());
statData.setBatchNo(orderDetailResultEntity.getBatchNo());
//设置结余价格
statData.setBalancePrice(orderDetailResultEntity.getPrice());
//设置初始化出入库数量和价格
statData.setInCount(0);
statData.setInPrice(orderDetailResultEntity.getPrice());
statData.setInAmount(BigDecimal.ZERO);
statData.setOutCount(0);
statData.setOutPrice(orderDetailResultEntity.getPrice());
statData.setOutAmount(BigDecimal.ZERO);
//设置期初数据
IoStatDayEntity statDayEntity = statDayDao.selectOne(buildQueryWrapper(orderDetailResultEntity, yesterday));
if (null == statDayEntity) {
//第一次汇总日数据
statData.setBeginCount(0);
statData.setBeginPrice(orderDetailResultEntity.getPrice());
statData.setBeginAmount(BigDecimal.ZERO);
} else {
//已存在此产品汇总数据,基于旧数据生成新的汇总数据
statData.setBeginCount(statDayEntity.getBalanceCount());
statData.setBeginPrice(statDayEntity.getBalancePrice());
statData.setBeginAmount(statDayEntity.getBalanceAmount());
}
//设置结余数据
statData.setBalanceCount(0);
statData.setBalancePrice(orderDetailResultEntity.getPrice());
statData.setBalanceAmount(BigDecimal.ZERO);
dataList.add(statData);
return statData;
}
/**
*
*
* @param date
* @param dataList
*/
private void saveData(Date date, List<IoStatDayEntity> dataList) {
//生成汇总记录
IoStatOrderEntity statOrderEntity = new IoStatOrderEntity();
//生成记录号
OrderNoTypeBean orderNoTypeEnum = new OrderNoTypeBean("STAT", " yyyyMMdd");
String orderNo = gennerOrderUtils.createStatOrderNo(orderNoTypeEnum);
statOrderEntity.setRecordKey(orderNo);
statOrderEntity.setType(4);
statOrderEntity.setDate(date);
statOrderEntity.setTitle(DateUtil.format(date, "yyyy-MM-dd") + " 日出入库汇总");
Date updateTime = new Date();
statOrderEntity.setUpdateTime(updateTime);
statOrderDao.insert(statOrderEntity);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED);
IoStatDayDao mapper = sqlSession.getMapper(IoStatDayDao.class);
dataList.forEach(statDayEntity -> {
statDayEntity.setUpdateTime(updateTime);
statDayEntity.setRecordKeyFk(orderNo);
mapper.insert(statDayEntity);
});
sqlSession.commit();
sqlSession.close();
}
private static QueryWrapper<IoStatDayEntity> buildQueryWrapper(IoOrderDetailResultEntity orderDetailResultEntity, DateTime yesterday) {
QueryWrapper<IoStatDayEntity> wrapper = new QueryWrapper<>();
wrapper.eq("year", yesterday.year())
.eq("month", yesterday.month())
.eq("day", DateUtil.dayOfMonth(yesterday))
.eq("month", yesterday.monthBaseOne())
.eq("day", DateUtil.dayOfMonth(DateUtil.offsetDay(yesterday, -1))) //取前天的数据
.eq("relIdFk", orderDetailResultEntity.getBindRlFk())
.eq(StrUtil.isNotBlank(orderDetailResultEntity.getBatchNo()), "batchNo", orderDetailResultEntity.getBatchNo())
.eq(StrUtil.isNotBlank(orderDetailResultEntity.getNameCode()), "nameCode", orderDetailResultEntity.getNameCode());

@ -1,18 +1,162 @@
package com.glxp.api.service.inout.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.glxp.api.dao.inout.IoOrderDao;
import com.glxp.api.dao.inout.IoStatDayDao;
import com.glxp.api.dao.inout.IoStatMonthDao;
import com.glxp.api.dao.inout.IoStatOrderDao;
import com.glxp.api.entity.inout.IoStatDayEntity;
import com.glxp.api.entity.inout.IoStatMonthEntity;
import com.glxp.api.service.inout.IoStatMonthService;
import com.glxp.api.util.GennerOrderUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class IoStatMonthServiceImpl implements IoStatMonthService {
@Resource
private IoStatMonthDao statMonthDao;
@Resource
private IoStatDayDao statDayDao;
@Resource
private IoOrderDao orderDao;
@Resource
private GennerOrderUtils gennerOrderUtils;
@Resource
private IoStatOrderDao statOrderDao;
@Resource
private SqlSessionFactory sqlSessionFactory;
@Override
public void statData(Date date) {
//汇总上一个月的数据
DateTime lastMonth = DateUtil.lastMonth();
//查询上个月每天的汇总数据
List<IoStatDayEntity> statDayList = statDayDao.selectList(new QueryWrapper<IoStatDayEntity>()
.eq("year", lastMonth.year())
.eq("quarter", lastMonth.quarter())
.eq("month", lastMonth.monthBaseOne())
);
if (CollUtil.isNotEmpty(statDayList)) {
//声明用于存放汇总数据的集合
List<IoStatMonthEntity> dataList = new ArrayList<>();
statDayList.forEach(statDayEntity -> {
//查询上月的数据
IoStatMonthEntity statMonthEntity = statMonthDao.selectOne(buildQueryWrapper(statDayEntity, lastMonth));
//获取新的汇总数据
IoStatMonthEntity statData = getStatData(dataList, statDayEntity, lastMonth);
//设置入库数据
statData.setInCount(statData.getInCount() + statDayEntity.getInCount());
statData.setInPrice(statDayEntity.getBalancePrice());
BigDecimal inAmount = statDayEntity.getBalancePrice().multiply(BigDecimal.valueOf(statDayEntity.getInCount()));
statData.setInAmount(inAmount.add(statData.getInAmount()));
//设置出库数据
statData.setOutCount(statData.getOutCount() + statDayEntity.getOutCount());
statData.setOutPrice(statDayEntity.getBalancePrice());
BigDecimal outAmount = statDayEntity.getBalancePrice().multiply(BigDecimal.valueOf(statDayEntity.getOutCount()));
statData.setOutAmount(outAmount.add(statData.getOutAmount()));
//设置结余数据
statData.setBalanceCount(statData.getBalanceCount() + statData.getInCount() - statData.getOutCount());
});
}
}
/**
*
*
* @param dataList
* @param statDayEntity
* @param lastMonth
* @return
*/
private IoStatMonthEntity getStatData(List<IoStatMonthEntity> dataList, IoStatDayEntity statDayEntity, DateTime lastMonth) {
if (CollUtil.isNotEmpty(dataList)) {
for (IoStatMonthEntity statMonthEntity : dataList) {
if (statMonthEntity.getRelIdFk().equals(statDayEntity.getRelIdFk())) {
if ((StrUtil.isNotBlank(statMonthEntity.getBatchNo()) && StrUtil.isNotBlank(statDayEntity.getRelIdFk())) && statMonthEntity.getBatchNo().equals(statDayEntity.getBatchNo())) {
return statMonthEntity;
}
} else if (StrUtil.isBlank(statMonthEntity.getBatchNo()) && StrUtil.isBlank(statDayEntity.getBatchNo())) {
return statMonthEntity;
}
}
}
IoStatMonthEntity statData = new IoStatMonthEntity();
statData.setYear(lastMonth.year());
statData.setQuarter(lastMonth.quarter());
statData.setMonth(lastMonth.monthBaseOne());
statData.setRelIdFk(statDayEntity.getRelIdFk());
statData.setNameCode(statDayEntity.getNameCode());
statData.setProductName(statDayEntity.getProductName());
statData.setGgxh(statDayEntity.getGgxh());
statData.setBatchNo(statDayEntity.getBatchNo());
//设置结余价格
statData.setBalancePrice(statDayEntity.getBalancePrice());
//设置初始化出入库数量和价格
statData.setInCount(0);
statData.setInPrice(statDayEntity.getInPrice());
statData.setInAmount(BigDecimal.ZERO);
statData.setOutCount(0);
statData.setOutPrice(statDayEntity.getOutPrice());
statData.setOutAmount(BigDecimal.ZERO);
//设置期初数据
IoStatMonthEntity statMonthEntity = statMonthDao.selectOne(buildQueryWrapper(statDayEntity, lastMonth));
if (null == statMonthEntity) {
//第一次汇总月度数据
statData.setBeginCount(0);
statData.setBeginPrice(statDayEntity.getBalancePrice());
statData.setBeginAmount(BigDecimal.ZERO);
} else {
//已存在此产品汇总数据,基于旧数据生成新的汇总数据
statData.setBeginCount(statMonthEntity.getBalanceCount());
statData.setBeginPrice(statDayEntity.getBalancePrice());
statData.setBeginAmount(statMonthEntity.getBalanceAmount());
}
dataList.add(statData);
return statData;
}
/**
*
*
* @param statDayEntity
* @param lastMonth
* @return
*/
private Wrapper<IoStatMonthEntity> buildQueryWrapper(IoStatDayEntity statDayEntity, DateTime lastMonth) {
QueryWrapper<IoStatMonthEntity> wrapper = new QueryWrapper<>();
wrapper.eq("year", lastMonth.year())
.eq("month", lastMonth.monthBaseOne() - 1) //取上上月的数据
.eq("relIdFk", statDayEntity.getRelIdFk())
.eq(StrUtil.isNotBlank(statDayEntity.getBatchNo()), "batchNo", statDayEntity.getBatchNo())
.eq(StrUtil.isNotBlank(statDayEntity.getNameCode()), "nameCode", statDayEntity.getNameCode());
return wrapper;
}
}

@ -53,37 +53,60 @@ public class IoStatOrderTask implements SchedulingConfigurer {
}
private void process() {
log.info("开始汇总物资出入库数据");
//生成每日汇总数据
Date today = new Date();
ThreadUtil.execAsync(() -> {
log.info("开始生成每日物资出入库汇总数据");
statDayService.statData(today);
log.info("每日物资出入库数据汇总生成结束");
});
if (DateUtil.isMonthStart(today)) {
//判断起始时间,设置生成递进顺序,保证日汇总数据优先生成,否则后续数据的源数据会发生缺失,导致计算错误
if (DateUtil.isYearStart(today)) {
//年初第一天,依次生成 日 -> 月 -> 季度 -> 年度 汇总数据
ThreadUtil.execAsync(() -> {
log.info("开始生成每日物资出入库汇总数据");
statDayService.statData(today);
log.info("每日物资出入库数据汇总生成结束");
log.info("本日为月初,生成月度物资出入库汇总数据");
statMonthService.statData(today);
log.info("月度物资出入库汇总数据生成结束");
});
}
if (DateUtil.isQuarterStart(today)) {
ThreadUtil.execAsync(() -> {
log.info("本日为季初,生成季度物资出入库汇总数据");
statQuarterService.statData(today);
log.info("季度物资出入库汇总数据生成结束");
});
}
if (DateUtil.isYearStart(today)) {
ThreadUtil.execAsync(() -> {
log.info("本日为年初,生成年度物资出入库汇总数据");
statYearService.statData(today);
log.info("年度物资出入库汇总数据生成结束");
});
} else if (DateUtil.isQuarterStart(today)) {
//季度第一天,依次生成 日 -> 月 -> 季度 汇总数据
ThreadUtil.execAsync(() -> {
log.info("开始生成每日物资出入库汇总数据");
statDayService.statData(today);
log.info("每日物资出入库数据汇总生成结束");
log.info("本日为月初,生成月度物资出入库汇总数据");
statMonthService.statData(today);
log.info("月度物资出入库汇总数据生成结束");
log.info("本日为季初,生成季度物资出入库汇总数据");
statQuarterService.statData(today);
log.info("季度物资出入库汇总数据生成结束");
});
} else if (DateUtil.isMonthStart(today)) {
//月度第一天,依次生成 日 -> 月 汇总数据
ThreadUtil.execAsync(() -> {
log.info("开始生成每日物资出入库汇总数据");
statDayService.statData(today);
log.info("每日物资出入库数据汇总生成结束");
log.info("本日为月初,生成月度物资出入库汇总数据");
statMonthService.statData(today);
log.info("月度物资出入库汇总数据生成结束");
});
} else {
//生成日汇总数据
ThreadUtil.execAsync(() -> {
log.info("开始生成每日物资出入库汇总数据");
statDayService.statData(today);
log.info("每日物资出入库数据汇总生成结束");
});
}
}

@ -41,6 +41,10 @@ public class GennerOrderUtils {
return Constant.SERIAL_CACHE_PREFIX.concat(serialPrefix);
}
private static String getStatCacheKey(String serialPrefix) {
return Constant.SERIAL_CACHE_PREFIX_STAT.concat(serialPrefix);
}
/**
*
*
@ -196,4 +200,28 @@ public class GennerOrderUtils {
return completionSerial("D", incrementalSerial, 4);
}
/**
*
*
* @param orderNoTypeEnum
* @return
*/
public String createStatOrderNo(OrderNoTypeBean orderNoTypeEnum) {
//获得单号前缀
//格式 固定前缀 +时间前缀 示例
String formNoPrefix = getFormNoPrefix(orderNoTypeEnum);
//获得缓存key
String cacheKey = getStatCacheKey(formNoPrefix);
//获得当日自增数
Long incrementalSerial = redisUtil.incr(cacheKey, 1);
// 设置key过期时间, 保证每天的流水号从1开始
if (incrementalSerial == 1) {
//设置失效时间 凌晨过期
redisUtil.expire(cacheKey, getSecondsNextEarlyMorning());
}
//组合单号并补全流水号
String serialWithPrefix = completionSerial(formNoPrefix, incrementalSerial, orderNoTypeEnum);
//补全随机数
return completionRandom(serialWithPrefix, orderNoTypeEnum);
}
}

Loading…
Cancel
Save