1.完善汇总出入库数据逻辑

master
x_z 2 years ago
parent f667a13279
commit 18d17933be

@ -76,11 +76,11 @@ public class IoStatDayServiceImpl implements IoStatDayService {
long balanceCount; long balanceCount;
BigDecimal balanceAmount; BigDecimal balanceAmount;
if (statData.getBalanceCount() == 0) { if (statData.getBalanceCount() == 0) {
balanceCount = Long.valueOf(statData.getBeginCount()) + orderDetailResultEntity.getReCount(); balanceCount = statData.getBeginCount() + statData.getInCount();
balanceAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(balanceCount)); balanceAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(balanceCount));
} else { } else {
balanceCount = statData.getBalanceCount() + orderDetailResultEntity.getReCount(); balanceCount = statData.getBalanceCount() + orderDetailResultEntity.getReCount();
balanceAmount = statData.getBalanceAmount().add(statData.getBalancePrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount()))); balanceAmount = statData.getBalanceAmount().add(statData.getInAmount());
} }
statData.setBalanceCount(Long.valueOf(balanceCount).intValue()); statData.setBalanceCount(Long.valueOf(balanceCount).intValue());
@ -100,14 +100,15 @@ public class IoStatDayServiceImpl implements IoStatDayService {
balanceAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(balanceCount)); balanceAmount = orderDetailResultEntity.getPrice().multiply(BigDecimal.valueOf(balanceCount));
} else { } else {
balanceCount = statData.getBalanceCount() + orderDetailResultEntity.getReCount(); balanceCount = statData.getBalanceCount() + orderDetailResultEntity.getReCount();
balanceAmount = statData.getBalanceAmount().add(statData.getBalancePrice().multiply(BigDecimal.valueOf(orderDetailResultEntity.getReCount()))); balanceAmount = statData.getBalanceAmount().subtract(statData.getOutAmount());
} }
statData.setBalanceCount(Long.valueOf(balanceCount).intValue()); statData.setBalanceCount(Long.valueOf(balanceCount).intValue());
statData.setBalanceAmount(balanceAmount); statData.setBalanceAmount(balanceAmount);
} }
}); });
//开始生成日数据汇总记录
//插入汇总记录
saveData(yesterday, dataList); saveData(yesterday, dataList);
} }
} }
@ -160,17 +161,21 @@ public class IoStatDayServiceImpl implements IoStatDayService {
statData.setBeginCount(0); statData.setBeginCount(0);
statData.setBeginPrice(orderDetailResultEntity.getPrice()); statData.setBeginPrice(orderDetailResultEntity.getPrice());
statData.setBeginAmount(BigDecimal.ZERO); statData.setBeginAmount(BigDecimal.ZERO);
statData.setBalanceCount(0);
statData.setBalancePrice(orderDetailResultEntity.getPrice());
} else { } else {
//已存在此产品汇总数据,基于旧数据生成新的汇总数据 //已存在此产品汇总数据,基于旧数据生成新的汇总数据
statData.setBeginCount(statDayEntity.getBalanceCount()); statData.setBeginCount(statDayEntity.getBalanceCount());
statData.setBeginPrice(statDayEntity.getBalancePrice()); statData.setBeginPrice(statDayEntity.getBalancePrice());
statData.setBeginAmount(statDayEntity.getBalanceAmount()); statData.setBeginAmount(statDayEntity.getBalanceAmount());
statData.setBalanceCount(statDayEntity.getBalanceCount());
statData.setBalanceAmount(statDayEntity.getBalanceAmount());
} }
//设置结余数据 //设置结余价格
statData.setBalanceCount(0);
statData.setBalancePrice(orderDetailResultEntity.getPrice()); statData.setBalancePrice(orderDetailResultEntity.getPrice());
statData.setBalanceAmount(BigDecimal.ZERO);
dataList.add(statData); dataList.add(statData);
return statData; return statData;
@ -186,8 +191,8 @@ public class IoStatDayServiceImpl implements IoStatDayService {
//生成汇总记录 //生成汇总记录
IoStatOrderEntity statOrderEntity = new IoStatOrderEntity(); IoStatOrderEntity statOrderEntity = new IoStatOrderEntity();
//生成记录号 //生成记录号
OrderNoTypeBean orderNoTypeEnum = new OrderNoTypeBean("STAT", " yyyyMMdd"); OrderNoTypeBean orderNoTypeBean = new OrderNoTypeBean("STATD", " yyyyMMdd");
String orderNo = gennerOrderUtils.createStatOrderNo(orderNoTypeEnum); String orderNo = gennerOrderUtils.createStatOrderNo(orderNoTypeBean);
statOrderEntity.setRecordKey(orderNo); statOrderEntity.setRecordKey(orderNo);
statOrderEntity.setType(4); statOrderEntity.setType(4);
statOrderEntity.setDate(date); statOrderEntity.setDate(date);
@ -197,6 +202,7 @@ public class IoStatDayServiceImpl implements IoStatDayService {
statOrderEntity.setUpdateTime(updateTime); statOrderEntity.setUpdateTime(updateTime);
statOrderDao.insert(statOrderEntity); statOrderDao.insert(statOrderEntity);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED); SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED);
IoStatDayDao mapper = sqlSession.getMapper(IoStatDayDao.class); IoStatDayDao mapper = sqlSession.getMapper(IoStatDayDao.class);
dataList.forEach(statDayEntity -> { dataList.forEach(statDayEntity -> {
@ -204,15 +210,17 @@ public class IoStatDayServiceImpl implements IoStatDayService {
statDayEntity.setRecordKeyFk(orderNo); statDayEntity.setRecordKeyFk(orderNo);
mapper.insert(statDayEntity); mapper.insert(statDayEntity);
}); });
sqlSession.commit(); sqlSession.commit();
sqlSession.close(); sqlSession.close();
} }
private static QueryWrapper<IoStatDayEntity> buildQueryWrapper(IoOrderDetailResultEntity orderDetailResultEntity, DateTime yesterday) { private static QueryWrapper<IoStatDayEntity> buildQueryWrapper(IoOrderDetailResultEntity orderDetailResultEntity, DateTime yesterday) {
QueryWrapper<IoStatDayEntity> wrapper = new QueryWrapper<>(); QueryWrapper<IoStatDayEntity> wrapper = new QueryWrapper<>();
wrapper.eq("year", yesterday.year()) DateTime dateTime = DateUtil.offsetDay(yesterday, -1); //取前天的时间
.eq("month", yesterday.monthBaseOne()) wrapper.eq("year", dateTime.year())
.eq("day", DateUtil.dayOfMonth(DateUtil.offsetDay(yesterday, -1))) //取前天的数据 .eq("month", dateTime.monthBaseOne())
.eq("day", dateTime.dayOfMonth()) //取前天的数据
.eq("relIdFk", orderDetailResultEntity.getBindRlFk()) .eq("relIdFk", orderDetailResultEntity.getBindRlFk())
.eq(StrUtil.isNotBlank(orderDetailResultEntity.getBatchNo()), "batchNo", orderDetailResultEntity.getBatchNo()) .eq(StrUtil.isNotBlank(orderDetailResultEntity.getBatchNo()), "batchNo", orderDetailResultEntity.getBatchNo())
.eq(StrUtil.isNotBlank(orderDetailResultEntity.getNameCode()), "nameCode", orderDetailResultEntity.getNameCode()); .eq(StrUtil.isNotBlank(orderDetailResultEntity.getNameCode()), "nameCode", orderDetailResultEntity.getNameCode());

@ -6,16 +6,20 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.IoStatDayDao;
import com.glxp.api.dao.inout.IoStatMonthDao; import com.glxp.api.dao.inout.IoStatMonthDao;
import com.glxp.api.dao.inout.IoStatOrderDao; import com.glxp.api.dao.inout.IoStatOrderDao;
import com.glxp.api.entity.inout.IoStatDayEntity; import com.glxp.api.entity.inout.IoStatDayEntity;
import com.glxp.api.entity.inout.IoStatMonthEntity; import com.glxp.api.entity.inout.IoStatMonthEntity;
import com.glxp.api.entity.inout.IoStatOrderEntity;
import com.glxp.api.service.inout.IoStatMonthService; import com.glxp.api.service.inout.IoStatMonthService;
import com.glxp.api.util.GennerOrderUtils; import com.glxp.api.util.GennerOrderUtils;
import com.glxp.api.util.OrderNoTypeBean;
import lombok.extern.slf4j.Slf4j; 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.SqlSessionFactory;
import org.apache.ibatis.session.TransactionIsolationLevel;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -35,8 +39,6 @@ public class IoStatMonthServiceImpl implements IoStatMonthService {
@Resource @Resource
private IoStatDayDao statDayDao; private IoStatDayDao statDayDao;
@Resource @Resource
private IoOrderDao orderDao;
@Resource
private GennerOrderUtils gennerOrderUtils; private GennerOrderUtils gennerOrderUtils;
@Resource @Resource
private IoStatOrderDao statOrderDao; private IoStatOrderDao statOrderDao;
@ -58,30 +60,61 @@ public class IoStatMonthServiceImpl implements IoStatMonthService {
//声明用于存放汇总数据的集合 //声明用于存放汇总数据的集合
List<IoStatMonthEntity> dataList = new ArrayList<>(); List<IoStatMonthEntity> dataList = new ArrayList<>();
statDayList.forEach(statDayEntity -> { statDayList.forEach(statDayEntity -> {
//查询上月的数据
IoStatMonthEntity statMonthEntity = statMonthDao.selectOne(buildQueryWrapper(statDayEntity, lastMonth));
//获取新的汇总数据 //获取新的汇总数据
IoStatMonthEntity statData = getStatData(dataList, statDayEntity, lastMonth); IoStatMonthEntity statData = getStatData(dataList, statDayEntity, lastMonth);
//设置入库数据 //设置入库数据
statData.setInCount(statData.getInCount() + statDayEntity.getInCount()); statData.setInCount(statData.getInCount() + statDayEntity.getInCount());
statData.setInPrice(statDayEntity.getBalancePrice()); statData.setInPrice(statDayEntity.getBalancePrice());
BigDecimal inAmount = statDayEntity.getBalancePrice().multiply(BigDecimal.valueOf(statDayEntity.getInCount())); statData.setInAmount(statData.getInAmount().add(statDayEntity.getInAmount()));
statData.setInAmount(inAmount.add(statData.getInAmount()));
//设置出库数据 //设置出库数据
statData.setOutCount(statData.getOutCount() + statDayEntity.getOutCount()); statData.setOutCount(statData.getOutCount() + statDayEntity.getOutCount());
statData.setOutPrice(statDayEntity.getBalancePrice()); statData.setOutPrice(statDayEntity.getBalancePrice());
BigDecimal outAmount = statDayEntity.getBalancePrice().multiply(BigDecimal.valueOf(statDayEntity.getOutCount())); statData.setOutAmount(statData.getOutAmount().add(statDayEntity.getOutAmount()));
statData.setOutAmount(outAmount.add(statData.getOutAmount()));
//设置结余数据 //设置结余数据
statData.setBalanceCount(statData.getBalanceCount() + statData.getInCount() - statData.getOutCount()); statData.setBalanceCount(statData.getBalanceCount() + statData.getInCount() - statData.getOutCount());
statData.setBalanceAmount(statData.getBalanceAmount().add(statData.getInAmount()).subtract(statData.getOutAmount()));
});
//插入汇总记录
saveData(lastMonth, dataList);
}
}
/**
*
*
* @param lastMonth
* @param dataList
*/
private void saveData(DateTime lastMonth, List<IoStatMonthEntity> dataList) {
//生成汇总记录
IoStatOrderEntity statOrderEntity = new IoStatOrderEntity();
//生成记录号
OrderNoTypeBean orderNoTypeBean = new OrderNoTypeBean("STATM", "yyyyMMdd");
String orderNo = gennerOrderUtils.createStatOrderNo(orderNoTypeBean);
statOrderEntity.setRecordKey(orderNo);
statOrderEntity.setType(3);
statOrderEntity.setDate(lastMonth);
statOrderEntity.setTitle(lastMonth.year() + " 年 " + lastMonth.monthBaseOne() + " 月出入库汇总");
Date updateTime = new Date();
statOrderEntity.setUpdateTime(updateTime);
statOrderDao.insert(statOrderEntity);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED);
IoStatMonthDao mapper = sqlSession.getMapper(IoStatMonthDao.class);
dataList.forEach(statMonthEntity -> {
statMonthEntity.setUpdateTime(updateTime);
statMonthEntity.setRecordKeyFk(orderNo);
mapper.insert(statMonthEntity);
}); });
}
sqlSession.commit();
sqlSession.close();
} }
/** /**
@ -132,13 +165,22 @@ public class IoStatMonthServiceImpl implements IoStatMonthService {
statData.setBeginCount(0); statData.setBeginCount(0);
statData.setBeginPrice(statDayEntity.getBalancePrice()); statData.setBeginPrice(statDayEntity.getBalancePrice());
statData.setBeginAmount(BigDecimal.ZERO); statData.setBeginAmount(BigDecimal.ZERO);
statData.setBalanceCount(0);
statData.setBalanceAmount(BigDecimal.ZERO);
} else { } else {
//已存在此产品汇总数据,基于旧数据生成新的汇总数据 //已存在此产品汇总数据,基于旧数据生成新的汇总数据
statData.setBeginCount(statMonthEntity.getBalanceCount()); statData.setBeginCount(statMonthEntity.getBalanceCount());
statData.setBeginPrice(statDayEntity.getBalancePrice()); statData.setBeginPrice(statMonthEntity.getBalancePrice());
statData.setBeginAmount(statMonthEntity.getBalanceAmount()); statData.setBeginAmount(statMonthEntity.getBalanceAmount());
statData.setBalanceCount(statDayEntity.getBalanceCount());
statData.setBalanceAmount(statMonthEntity.getBalanceAmount());
} }
//设置结余价格
statData.setBalancePrice(statDayEntity.getBalancePrice());
dataList.add(statData); dataList.add(statData);
return statData; return statData;
} }
@ -152,9 +194,16 @@ public class IoStatMonthServiceImpl implements IoStatMonthService {
*/ */
private Wrapper<IoStatMonthEntity> buildQueryWrapper(IoStatDayEntity statDayEntity, DateTime lastMonth) { private Wrapper<IoStatMonthEntity> buildQueryWrapper(IoStatDayEntity statDayEntity, DateTime lastMonth) {
QueryWrapper<IoStatMonthEntity> wrapper = new QueryWrapper<>(); QueryWrapper<IoStatMonthEntity> wrapper = new QueryWrapper<>();
if (lastMonth.monthBaseOne() == 1) {
//当前汇总的记录为1月上一月份的时间取前一年的12月
wrapper.eq("year", lastMonth.year() - 1)
.eq("month", 12);
} else {
wrapper.eq("year", lastMonth.year()) wrapper.eq("year", lastMonth.year())
.eq("month", lastMonth.monthBaseOne() - 1) //取上上月的数据 .eq("month", lastMonth.monthBaseOne() - 1);//取上上月的数据
.eq("relIdFk", statDayEntity.getRelIdFk()) }
wrapper.eq("relIdFk", statDayEntity.getRelIdFk())
.eq(StrUtil.isNotBlank(statDayEntity.getBatchNo()), "batchNo", statDayEntity.getBatchNo()) .eq(StrUtil.isNotBlank(statDayEntity.getBatchNo()), "batchNo", statDayEntity.getBatchNo())
.eq(StrUtil.isNotBlank(statDayEntity.getNameCode()), "nameCode", statDayEntity.getNameCode()); .eq(StrUtil.isNotBlank(statDayEntity.getNameCode()), "nameCode", statDayEntity.getNameCode());
return wrapper; return wrapper;

@ -1,18 +1,238 @@
package com.glxp.api.service.inout.impl; 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.query.QueryWrapper;
import com.glxp.api.dao.inout.IoStatMonthDao;
import com.glxp.api.dao.inout.IoStatOrderDao;
import com.glxp.api.dao.inout.IoStatQuarterDao;
import com.glxp.api.entity.inout.IoStatMonthEntity;
import com.glxp.api.entity.inout.IoStatOrderEntity;
import com.glxp.api.entity.inout.IoStatQuarterEntity;
import com.glxp.api.service.inout.IoStatQuarterService; import com.glxp.api.service.inout.IoStatQuarterService;
import com.glxp.api.util.GennerOrderUtils;
import com.glxp.api.util.OrderNoTypeBean;
import lombok.extern.slf4j.Slf4j; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List;
@Slf4j @Slf4j
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class IoStatQuarterServiceImpl implements IoStatQuarterService { public class IoStatQuarterServiceImpl implements IoStatQuarterService {
@Resource
private IoStatMonthDao statMonthDao;
@Resource
private IoStatOrderDao statOrderDao;
@Resource
private IoStatQuarterDao statQuarterDao;
@Resource
private GennerOrderUtils gennerOrderUtils;
@Resource
private SqlSessionFactory sqlSessionFactory;
@Override @Override
public void statData(Date date) { public void statData(Date date) {
//汇总上一季度的数据
DateTime yesterday = DateUtil.offsetDay(date, -1);
//查询上一季度各个月度的数据
List<IoStatMonthEntity> statMonthList = getMonthStatList(yesterday);
if (CollUtil.isNotEmpty(statMonthList)) {
//声明用于存放汇总数据的集合
List<IoStatQuarterEntity> dataList = new ArrayList<>();
statMonthList.forEach(statMonthEntity -> {
//获取新的汇总数据
IoStatQuarterEntity statData = getStatData(dataList, statMonthEntity, yesterday);
//设置入库数据
statData.setInCount(statData.getInCount() + statMonthEntity.getInCount());
statData.setInPrice(statMonthEntity.getInPrice());
statData.setInAmount(statData.getInAmount().add(statMonthEntity.getInAmount()));
//设置出库数据
statData.setOutCount(statData.getOutCount() + statMonthEntity.getOutCount());
statData.setOutPrice(statMonthEntity.getOutPrice());
statData.setOutAmount(statData.getOutAmount().add(statMonthEntity.getOutAmount()));
//设置结余数据
statData.setBalanceCount(statData.getBalanceCount() + statData.getInCount() - statData.getOutCount());
statData.setBalanceAmount(statData.getBalanceAmount().add(statData.getInAmount()).subtract(statData.getOutAmount()));
});
//插入汇总数据
saveData(yesterday, dataList);
}
}
/**
*
*
* @param yesterday
* @param dataList
*/
private void saveData(DateTime yesterday, List<IoStatQuarterEntity> dataList) {
//生成汇总记录
IoStatOrderEntity statOrderEntity = new IoStatOrderEntity();
//生成记录号
OrderNoTypeBean orderNoTypeBean = new OrderNoTypeBean("STATQ", "yyyyMMdd");
String orderNo = gennerOrderUtils.createStatOrderNo(orderNoTypeBean);
statOrderEntity.setRecordKey(orderNo);
statOrderEntity.setType(3);
statOrderEntity.setDate(yesterday);
statOrderEntity.setTitle(yesterday.year() + " 年 " + yesterday.quarter() + " 季度出入库汇总");
Date updateTime = new Date();
statOrderEntity.setUpdateTime(updateTime);
statOrderDao.insert(statOrderEntity);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED);
IoStatQuarterDao mapper = sqlSession.getMapper(IoStatQuarterDao.class);
dataList.forEach(statQuarterEntity -> {
statQuarterEntity.setUpdateTime(updateTime);
statQuarterEntity.setRecordKeyFk(orderNo);
mapper.insert(statQuarterEntity);
});
sqlSession.commit();
sqlSession.close();
}
/**
*
*
* @param dataList
* @param statMonthEntity
* @param yesterday
* @return
*/
private IoStatQuarterEntity getStatData(List<IoStatQuarterEntity> dataList, IoStatMonthEntity statMonthEntity, DateTime yesterday) {
if (CollUtil.isNotEmpty(dataList)) {
for (IoStatQuarterEntity statQuarterEntity : dataList) {
if (statQuarterEntity.getRelIdFk().equals(statMonthEntity.getRelIdFk())) {
if ((StrUtil.isNotBlank(statQuarterEntity.getBatchNo()) && StrUtil.isNotBlank(statMonthEntity.getBatchNo())) && statQuarterEntity.getBatchNo().equals(statMonthEntity.getBatchNo())) {
return statQuarterEntity;
} else if (StrUtil.isBlank(statQuarterEntity.getBatchNo()) && StrUtil.isBlank(statMonthEntity.getBatchNo())) {
return statQuarterEntity;
}
}
}
}
//未存在于集合中,构造新数据
IoStatQuarterEntity statData = new IoStatQuarterEntity();
statData.setYear(yesterday.year());
statData.setQuarter(yesterday.quarter());
statData.setRelIdFk(statMonthEntity.getRelIdFk());
statData.setNameCode(statMonthEntity.getNameCode());
statData.setProductName(statMonthEntity.getProductName());
statData.setGgxh(statMonthEntity.getGgxh());
statData.setBatchNo(statMonthEntity.getBatchNo());
//设置结余价格
statData.setBalancePrice(statMonthEntity.getBalancePrice());
//设置初始化出入库数量和价格
statData.setInCount(0);
statData.setInPrice(statMonthEntity.getBalancePrice());
statData.setInAmount(BigDecimal.ZERO);
statData.setOutCount(0);
statData.setOutPrice(statMonthEntity.getBalancePrice());
statData.setOutAmount(BigDecimal.ZERO);
//设置期初数据
IoStatQuarterEntity statQuarterEntity = statQuarterDao.selectOne(buildQueryWrapper(statMonthEntity, yesterday));
if (null == statQuarterEntity) {
//第一次汇总季度数据
statData.setBeginCount(0);
statData.setBalancePrice(statMonthEntity.getBalancePrice());
statData.setBeginAmount(BigDecimal.ZERO);
statData.setBalanceCount(0);
statData.setBalanceAmount(BigDecimal.ZERO);
} else {
statData.setBeginCount(statQuarterEntity.getBalanceCount());
statData.setBeginPrice(statQuarterEntity.getBalancePrice());
statData.setBeginAmount(statQuarterEntity.getBalanceAmount());
statData.setBalanceCount(statQuarterEntity.getBalanceCount());
statData.setBalanceAmount(statQuarterEntity.getBalanceAmount());
}
//设置结余价格
statData.setBalancePrice(statMonthEntity.getBalancePrice());
dataList.add(statData);
return statData;
}
/**
*
*
* @param statMonthEntity
* @param yesterday
* @return
*/
private QueryWrapper<IoStatQuarterEntity> buildQueryWrapper(IoStatMonthEntity statMonthEntity, DateTime yesterday) {
QueryWrapper<IoStatQuarterEntity> wrapper = new QueryWrapper<>();
if (yesterday.quarter() == 1) {
//当前汇总的记录为第一季度,上一季度时间取前一年的第四季度数据
wrapper.eq("year", yesterday.year() - 1)
.eq("quarter", 4);
} else {
wrapper.eq("year", yesterday.year())
.eq("quarter", yesterday.quarter() - 1);
}
wrapper.eq("relIdFk", statMonthEntity.getRelIdFk())
.eq(StrUtil.isNotBlank(statMonthEntity.getBatchNo()), "batchNo", statMonthEntity.getBatchNo())
.eq(StrUtil.isNotBlank(statMonthEntity.getNameCode()), "nameCode", statMonthEntity.getNameCode());
return wrapper;
}
/**
*
*
* @param quarter 1
* @return
*/
private List<IoStatMonthEntity> getMonthStatList(DateTime yesterday) {
int quarter = yesterday.quarter();
List<Integer> months = new ArrayList<>(3);
switch (quarter) {
case 1:
months.addAll(Arrays.asList(1, 2, 3));
break;
case 2:
months.addAll(Arrays.asList(4, 5, 6));
break;
case 3:
months.addAll(Arrays.asList(7, 8, 9));
break;
case 4:
months.addAll(Arrays.asList(10, 11, 12));
break;
default:
break;
}
List<IoStatMonthEntity> list = statMonthDao.selectList(new QueryWrapper<IoStatMonthEntity>()
.eq("year", yesterday.year())
.eq("quarter", yesterday.quarter())
.in("month", months)
);
return list;
} }
} }

@ -1,18 +1,208 @@
package com.glxp.api.service.inout.impl; 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.query.QueryWrapper;
import com.glxp.api.dao.inout.IoStatOrderDao;
import com.glxp.api.dao.inout.IoStatQuarterDao;
import com.glxp.api.dao.inout.IoStatYearDao;
import com.glxp.api.entity.inout.IoStatOrderEntity;
import com.glxp.api.entity.inout.IoStatQuarterEntity;
import com.glxp.api.entity.inout.IoStatYearEntity;
import com.glxp.api.service.inout.IoStatYearService; import com.glxp.api.service.inout.IoStatYearService;
import com.glxp.api.util.GennerOrderUtils;
import com.glxp.api.util.OrderNoTypeBean;
import lombok.extern.slf4j.Slf4j; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; 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.Date;
import java.util.List;
@Slf4j @Slf4j
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class IoStatYearServiceImpl implements IoStatYearService { public class IoStatYearServiceImpl implements IoStatYearService {
@Resource
private IoStatYearDao statYearDao;
@Resource
private IoStatQuarterDao statQuarterDao;
@Resource
private IoStatOrderDao statOrderDao;
@Resource
private GennerOrderUtils gennerOrderUtils;
@Resource
private SqlSessionFactory sqlSessionFactory;
@Override @Override
public void statData(Date date) { public void statData(Date date) {
//汇总上一年度的数据
DateTime yesterday = DateUtil.offsetDay(date, -1);
//查询上一年度各个季度的数据
List<IoStatQuarterEntity> statQuarterList = getQuarterStatList(yesterday);
if (CollUtil.isNotEmpty(statQuarterList)) {
//声明用于存放汇总数据的集合
List<IoStatYearEntity> dataList = new ArrayList<>();
statQuarterList.forEach(statQuarterEntity -> {
//获取新的汇总数据
IoStatYearEntity statData = getStatData(dataList, statQuarterEntity, yesterday);
//设置入库数据
statData.setInCount(statData.getInCount() + statQuarterEntity.getInCount());
statData.setInPrice(statQuarterEntity.getInPrice());
statData.setInAmount(statData.getInAmount().add(statQuarterEntity.getInAmount()));
//设置出库数据
statData.setOutCount(statData.getOutCount() + statQuarterEntity.getOutCount());
statData.setOutPrice(statQuarterEntity.getOutPrice());
statData.setOutAmount(statData.getOutAmount().add(statQuarterEntity.getOutAmount()));
//设置结余数据
statData.setBalanceCount(statData.getBalanceCount() + statData.getInCount() - statData.getOutCount());
statData.setBalanceAmount(statData.getBalanceAmount().add(statData.getInAmount()).subtract(statData.getOutAmount()));
});
//插入汇总数据
saveData(yesterday, dataList);
}
}
/**
*
*
* @param yesterday
* @param dataList
*/
private void saveData(DateTime yesterday, List<IoStatYearEntity> dataList) {
//生成汇总记录
IoStatOrderEntity statOrderEntity = new IoStatOrderEntity();
//生成记录号
OrderNoTypeBean orderNoTypeBean = new OrderNoTypeBean("STATY", "yyyyMMdd");
String orderNo = gennerOrderUtils.createStatOrderNo(orderNoTypeBean);
statOrderEntity.setRecordKey(orderNo);
statOrderEntity.setType(3);
statOrderEntity.setDate(yesterday);
statOrderEntity.setTitle(yesterday.year() + " 年度出入库汇总");
Date updateTime = new Date();
statOrderEntity.setUpdateTime(updateTime);
statOrderDao.insert(statOrderEntity);
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, TransactionIsolationLevel.READ_COMMITTED);
IoStatYearDao mapper = sqlSession.getMapper(IoStatYearDao.class);
dataList.forEach(statYearEntity -> {
statYearEntity.setUpdateTime(updateTime);
statYearEntity.setRecordKeyFk(orderNo);
mapper.insert(statYearEntity);
});
sqlSession.commit();
sqlSession.close();
}
/**
*
*
* @param dataList
* @param statQuarterEntity
* @param yesterday
* @return
*/
private IoStatYearEntity getStatData(List<IoStatYearEntity> dataList, IoStatQuarterEntity statQuarterEntity, DateTime yesterday) {
if (CollUtil.isNotEmpty(dataList)) {
for (IoStatYearEntity statYearEntity : dataList) {
if (statYearEntity.getRelIdFk().equals(statQuarterEntity.getRelIdFk())) {
if ((StrUtil.isNotBlank(statYearEntity.getBatchNo()) && StrUtil.isNotBlank(statQuarterEntity.getBatchNo())) && statYearEntity.getBatchNo().endsWith(statQuarterEntity.getBatchNo())) {
return statYearEntity;
} else if (StrUtil.isBlank(statYearEntity.getBatchNo()) && StrUtil.isBlank(statQuarterEntity.getBatchNo())) {
return statYearEntity;
}
}
}
}
//未在于集合中,构造新数据
IoStatYearEntity statData = new IoStatYearEntity();
statData.setYear(yesterday.year());
statData.setRelIdFk(statQuarterEntity.getRelIdFk());
statData.setNameCode(statQuarterEntity.getNameCode());
statData.setProductName(statQuarterEntity.getProductName());
statData.setGgxh(statQuarterEntity.getGgxh());
statData.setBatchNo(statQuarterEntity.getBatchNo());
//设置结余价格
statData.setBalancePrice(statQuarterEntity.getBalancePrice());
//设置初始化出入库数量和价格
statData.setInCount(0);
statData.setInPrice(statQuarterEntity.getBalancePrice());
statData.setInAmount(BigDecimal.ZERO);
statData.setOutCount(0);
statData.setOutPrice(statQuarterEntity.getBalancePrice());
statData.setOutAmount(BigDecimal.ZERO);
//设置期初数据
IoStatYearEntity statYearEntity = statYearDao.selectOne(buildQueryWrapper(statQuarterEntity, yesterday));
if (null == statYearEntity) {
//第一次汇总年度数据
statData.setBeginCount(0);
statData.setBalancePrice(statYearEntity.getBalancePrice());
statData.setBeginAmount(BigDecimal.ZERO);
statData.setBalanceCount(0);
statData.setBalanceAmount(BigDecimal.ZERO);
} else {
statData.setBeginCount(statYearEntity.getBalanceCount());
statData.setBeginPrice(statYearEntity.getBalancePrice());
statData.setBeginAmount(statYearEntity.getBalanceAmount());
statData.setBalanceCount(statYearEntity.getBalanceCount());
statData.setBalanceAmount(statYearEntity.getBalanceAmount());
}
//设置结余价格
statData.setBalancePrice(statYearEntity.getBalancePrice());
dataList.add(statData);
return statData;
}
/**
*
*
* @param statQuarterEntity
* @param yesterday
*/
private QueryWrapper<IoStatYearEntity> buildQueryWrapper(IoStatQuarterEntity statQuarterEntity, DateTime yesterday) {
QueryWrapper<IoStatYearEntity> wrapper = new QueryWrapper<>();
wrapper.eq("year", yesterday.year() - 1)
.eq("relIdFk", statQuarterEntity.getRelIdFk())
.eq(StrUtil.isNotBlank(statQuarterEntity.getBatchNo()), "batchNo", statQuarterEntity.getBatchNo())
.eq(StrUtil.isNotBlank(statQuarterEntity.getNameCode()), "nameCode", statQuarterEntity.getNameCode());
return wrapper;
}
/**
*
*
* @param yesterday
* @return
*/
private List<IoStatQuarterEntity> getQuarterStatList(DateTime yesterday) {
List<IoStatQuarterEntity> list = statQuarterDao.selectList(new QueryWrapper<IoStatQuarterEntity>()
.eq("year", yesterday.year())
);
return list;
} }
} }

Loading…
Cancel
Save