计算销售报表
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
package com.lideeyunji.core.framework.config.job;
|
||||||
|
|
||||||
|
import com.lideeyunji.core.framework.service.IGrBiSaAggService;
|
||||||
|
import com.lideeyunji.tool.framework.common.constant.lideeYunJiBaseConstant;
|
||||||
|
import com.lideeyunji.tool.framework.quartz.core.handler.JobHandler;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算销售报表
|
||||||
|
* erp_bi_data.GR_BI_PUB_GOODS
|
||||||
|
* erp_bi_data.GR_BI_PUB_SALEZONE
|
||||||
|
* erp_bi_data.GR_BI_PUB_PROVINCE
|
||||||
|
* erp_bi_data.GR_BI_PUB_SALETYPE
|
||||||
|
* erp_bi_data.GR_BI_PUB_DOSAGE
|
||||||
|
* erp_bi_data.GR_BI_PUB_CUSTOM
|
||||||
|
* erp_bi_data.GR_BI_PUB_SALER
|
||||||
|
* --> mysql erp_bi_data.yunji_gr_bi_sa_agg
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component("generateSalesReportJob")
|
||||||
|
public class GenerateSalesReportJob implements JobHandler {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IGrBiSaAggService grBiSaAggService;
|
||||||
|
public String execute(String param) {
|
||||||
|
log.info("*********** 开始生成销售报表 ************");
|
||||||
|
grBiSaAggService.generateSalesReportJob(lideeYunJiBaseConstant.DS_ERP_BI_DATA);
|
||||||
|
log.info("*********** 生成销售报表完成 ************");
|
||||||
|
return "*********** 生成销售报表完成 ************";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
package com.lideeyunji.core.framework.entity;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@TableName("yunji_gr_bi_sa_agg")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class GrBiSaAgg implements Serializable {
|
||||||
|
private final static long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@TableId(value = "ID", type = IdType.INPUT)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@TableField(value = "USEYEAR")
|
||||||
|
private Integer useYear;
|
||||||
|
|
||||||
|
@TableField(value = "USEMONTH")
|
||||||
|
private Integer useMonth;
|
||||||
|
|
||||||
|
@TableField(value = "ZONEID")
|
||||||
|
private String zoneId;
|
||||||
|
|
||||||
|
@TableField(value = "ZONENAME")
|
||||||
|
private String zoneName;
|
||||||
|
|
||||||
|
@TableField(value = "SALETYPEID")
|
||||||
|
private String saleTypeId;
|
||||||
|
|
||||||
|
@TableField(value = "SALETYPENAME")
|
||||||
|
private String saleTypeName;
|
||||||
|
|
||||||
|
@TableField(value = "CUSTOMID")
|
||||||
|
private String customId;
|
||||||
|
|
||||||
|
@TableField(value = "CUSTOMNAME")
|
||||||
|
private String customName;
|
||||||
|
|
||||||
|
@TableField(value = "DOSAGEID")
|
||||||
|
private String dosageId;
|
||||||
|
|
||||||
|
@TableField(value = "DOSAGENAME")
|
||||||
|
private String dosageName;
|
||||||
|
|
||||||
|
@TableField(value = "GOODSNAME")
|
||||||
|
private String goodsName;
|
||||||
|
|
||||||
|
@TableField(value = "PROVINCEID")
|
||||||
|
private String provinceId;
|
||||||
|
|
||||||
|
@TableField(value = "PROVINCENAME")
|
||||||
|
private String provinceName;
|
||||||
|
|
||||||
|
@TableField(value = "SALERID")
|
||||||
|
private String salerId;
|
||||||
|
|
||||||
|
@TableField(value = "SALERNAME")
|
||||||
|
private String salerName;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHSAQTY")
|
||||||
|
private String monthSaqty;
|
||||||
|
|
||||||
|
@TableField(value = "THISSAQTY")
|
||||||
|
private String thisSaqty;
|
||||||
|
|
||||||
|
@TableField(value = "LASTSAQTY")
|
||||||
|
private String lastSaqty;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHSAMONEY")
|
||||||
|
private String monthSaMoney;
|
||||||
|
|
||||||
|
@TableField(value = "THISSAMONEY")
|
||||||
|
private String thisSaMoney;
|
||||||
|
|
||||||
|
@TableField(value = "LASTSAMONEY")
|
||||||
|
private String lastSaMoney;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHPROFIT")
|
||||||
|
private String monthProfit;
|
||||||
|
|
||||||
|
@TableField(value = "THISPROFIT")
|
||||||
|
private String thisProfit;
|
||||||
|
|
||||||
|
@TableField(value = "LASTPROFIT")
|
||||||
|
private String lastProfit;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHCOST")
|
||||||
|
private String monthCost;
|
||||||
|
|
||||||
|
@TableField(value = "THISCOST")
|
||||||
|
private String thisCost;
|
||||||
|
|
||||||
|
@TableField(value = "LASTCOST")
|
||||||
|
private String lastCost;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHPROFITRATE")
|
||||||
|
private String monthProfitRate;
|
||||||
|
|
||||||
|
@TableField(value = "THISPROFITRATE")
|
||||||
|
private String thisProfitRate;
|
||||||
|
|
||||||
|
@TableField(value = "LASTPROFITRATE")
|
||||||
|
private String lastProfitRate;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHSAMONEYSHARE")
|
||||||
|
private String monthSaMoneyShare;
|
||||||
|
|
||||||
|
@TableField(value = "THISSAMONEYSHARE")
|
||||||
|
private String thisSaMoneyShare;
|
||||||
|
|
||||||
|
@TableField(value = "LASTSAMONEYSHARE")
|
||||||
|
private String lastSaMoneyShare;
|
||||||
|
|
||||||
|
@TableField(value = "MONTHPROFITSHARE")
|
||||||
|
private String monthProfitShare;
|
||||||
|
|
||||||
|
@TableField(value = "THISPROFITSHARE")
|
||||||
|
private String thisProfitShare;
|
||||||
|
|
||||||
|
@TableField(value = "LASTPROFITSHARE")
|
||||||
|
private String lastProfitShare;
|
||||||
|
|
||||||
|
@TableField(value = "SAMONEYGROWTH")
|
||||||
|
private String saMoneyGrowth;
|
||||||
|
|
||||||
|
@TableField(value = "PROFITGROWTH")
|
||||||
|
private String profitGrowth;
|
||||||
|
|
||||||
|
@TableField(value = "PROFITCHANGE")
|
||||||
|
private String profitChange;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.lideeyunji.core.framework.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.lideeyunji.core.framework.entity.GrBiSaAgg;
|
||||||
|
import com.lideeyunji.tool.framework.common.constant.lideeYunJiBaseConstant;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
@DS(lideeYunJiBaseConstant.DS_ERP_BI_DATA)
|
||||||
|
public interface GrBiSaAggMapper extends BaseMapper<GrBiSaAgg> {
|
||||||
|
|
||||||
|
|
||||||
|
List<GrBiSaAgg> generateSalesReport(@Param("pastYearMonth") Integer pastYearMonth,
|
||||||
|
@Param("currentYearMonth") Integer currentYearMonth);
|
||||||
|
|
||||||
|
int deleteSalesReport(@Param("pastYearMonth") Integer pastYearMonth,
|
||||||
|
@Param("currentYearMonth") Integer currentYearMonth);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.lideeyunji.core.framework.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.lideeyunji.core.framework.entity.GrBiSaAgg;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
public interface IGrBiSaAggService extends IService<GrBiSaAgg> {
|
||||||
|
|
||||||
|
//同步销售明细表
|
||||||
|
void generateSalesReportJob(@Param("dataSourceType") String dataSourceType);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package com.lideeyunji.core.framework.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.lideeyunji.core.framework.entity.GrBiSaAgg;
|
||||||
|
import com.lideeyunji.core.framework.mapper.GrBiSaAggMapper;
|
||||||
|
import com.lideeyunji.core.framework.service.IGrBiSaAggService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class GrBiSaAggServiceImpl extends ServiceImpl<GrBiSaAggMapper, GrBiSaAgg> implements IGrBiSaAggService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算销售报表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
@DS(value = "#dataSourceType")
|
||||||
|
public void generateSalesReportJob(@Param("dataSourceType") String dataSourceType) {
|
||||||
|
//获取本地mysql数据库中表中UPDATE_TIME最新的数据
|
||||||
|
LambdaQueryWrapper<GrBiSaAgg> queryWrapper = new LambdaQueryWrapper<GrBiSaAgg>().orderByDesc(GrBiSaAgg::getUseYear, GrBiSaAgg::getUseMonth).last("LIMIT 1");
|
||||||
|
GrBiSaAgg grBiSaAgg = this.baseMapper.selectOne(queryWrapper);
|
||||||
|
Integer lastUserMonth = grBiSaAgg.getUseMonth();
|
||||||
|
Integer lastUserYear = grBiSaAgg.getUseYear();
|
||||||
|
// 获取当前时间的年和月
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
int currentYear = now.getYear();
|
||||||
|
int currentMonth = now.getMonthValue();
|
||||||
|
|
||||||
|
// 获取三个月前的时间和年月
|
||||||
|
LocalDateTime threeMonthsAgo = now.minusMonths(3);
|
||||||
|
int pastYear = threeMonthsAgo.getYear();
|
||||||
|
int pastMonth = threeMonthsAgo.getMonthValue();
|
||||||
|
|
||||||
|
log.info("最后更新的年月:{}年{}月", lastUserYear, lastUserMonth);
|
||||||
|
log.info("当前:{}年{}月", currentYear, currentMonth);
|
||||||
|
log.info("三个月前:{}年{}月", pastYear, pastMonth);
|
||||||
|
if (lastUserYear < pastYear || (lastUserYear == pastYear && lastUserMonth < pastMonth)) {
|
||||||
|
pastYear = lastUserYear;
|
||||||
|
pastMonth = lastUserMonth;
|
||||||
|
|
||||||
|
}
|
||||||
|
log.info("开始时间:{}年{}月, 结束时间:{}年{}月", pastYear, pastMonth, currentYear, currentMonth);
|
||||||
|
// 获取三个月前的数据
|
||||||
|
List<GrBiSaAgg> grBiSaSetdtlList = this.baseMapper.generateSalesReport(pastYear * 100 + pastMonth, currentYear * 100 + currentMonth);
|
||||||
|
if (CollUtil.isEmpty(grBiSaSetdtlList)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//保存数据
|
||||||
|
removeAndSaveBatch(pastYear, pastMonth, currentYear, currentMonth, grBiSaSetdtlList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//批量新增
|
||||||
|
|
||||||
|
public void removeAndSaveBatch(Integer pastYear, Integer pastMonth, Integer currentYear, Integer currentMonth, List<GrBiSaAgg> grBiSaSetdtlList) {
|
||||||
|
|
||||||
|
int reNum = this.baseMapper.deleteSalesReport(pastYear * 100 + pastMonth, currentYear * 100 + currentMonth);
|
||||||
|
log.info("删除数量:{}", reNum);
|
||||||
|
int result = 0;
|
||||||
|
for (GrBiSaAgg grBiSaSetdtl : grBiSaSetdtlList) {
|
||||||
|
int re = this.baseMapper.insert(grBiSaSetdtl);
|
||||||
|
if (re < 1) {
|
||||||
|
throw new RuntimeException("批量新增异常");
|
||||||
|
}
|
||||||
|
result += re;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="com.lideeyunji.core.framework.mapper.GrBiSaAggMapper">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<select id="generateSalesReport" resultType="com.lideeyunji.core.framework.entity.GrBiSaAgg">
|
||||||
|
select a.USEYEAR,
|
||||||
|
a.USEMONTH,
|
||||||
|
-- goods.goodsid,
|
||||||
|
goods.GOODSNAME,
|
||||||
|
sales.SALEZONEID,
|
||||||
|
sales.SALEZONENAME,
|
||||||
|
province.PROVINCEID,
|
||||||
|
province.PROVINCENAME,
|
||||||
|
salestype.SALETYPEID,
|
||||||
|
salestype.SALETYPENAME,
|
||||||
|
dosage.DOSAGEID,
|
||||||
|
dosage.DOSAGENAME,
|
||||||
|
custom.CUSTOMID,
|
||||||
|
custom.CUSTOMNAME,
|
||||||
|
saler.SALERID,
|
||||||
|
saler.SALERNAME,
|
||||||
|
a.`本月销量` as MONTHSAQTY,
|
||||||
|
a.`含税销售额` as MONTHSAMONEY,
|
||||||
|
a.`销售成本` as MONTHCOST,
|
||||||
|
a.`毛利额` as MONTHPROFITSHARE
|
||||||
|
from erp_bi_data.GR_BI_PUB_GOODS as goods
|
||||||
|
inner join erp_bi_data.GR_BI_PUB_SALEZONE as sales
|
||||||
|
inner join erp_bi_data.GR_BI_PUB_PROVINCE as province
|
||||||
|
inner join erp_bi_data.GR_BI_PUB_SALETYPE as salestype
|
||||||
|
inner join erp_bi_data.GR_BI_PUB_DOSAGE as dosage
|
||||||
|
inner join erp_bi_data.GR_BI_PUB_CUSTOM as custom
|
||||||
|
INNER join erp_bi_data.GR_BI_PUB_SALER as saler
|
||||||
|
left join
|
||||||
|
(SELECT USEYEAR,
|
||||||
|
USEMONTH,
|
||||||
|
SALEZONEID,
|
||||||
|
SALEZONENAME,
|
||||||
|
PROVINCEID,
|
||||||
|
PROVINCENAME,
|
||||||
|
SALETYPE,
|
||||||
|
SALETYPENAME,
|
||||||
|
CUSTOMNAME,
|
||||||
|
SALERNAME,
|
||||||
|
DOSAGENAME,
|
||||||
|
goodsid,
|
||||||
|
GOODSNAME,
|
||||||
|
GOODSTYPE,
|
||||||
|
sum(SAQTY) as 本月销量,
|
||||||
|
DOSAGEID,
|
||||||
|
CUSTOMID,
|
||||||
|
SALERID,
|
||||||
|
round(SUM(SAMONEY), 2) 除税销售额,
|
||||||
|
round(sum(SAMONEYTX), 2) 含税销售额,
|
||||||
|
round(sum(COST), 2) 销售成本,
|
||||||
|
round(sum(PROFIT), 2) 毛利额
|
||||||
|
FROM GR_BI_SA_SETDTL
|
||||||
|
where USESTATUS = 2
|
||||||
|
GROUP BY SALETYPE, SALEZONEID, SALEZONENAME, PROVINCEID, PROVINCENAME, SALETYPE, SALETYPENAME, CUSTOMID,
|
||||||
|
CUSTOMNAME, SALERID, SALERNAME, DOSAGEID, DOSAGENAME, GOODSID, GOODSNAME, GOODSTYPE, USEYEAR,
|
||||||
|
USEMONTH) a
|
||||||
|
on a.goodsid = goods.goodsid and a.SALEZONEID = sales.SALEZONEID and a.PROVINCEID = province.PROVINCEID
|
||||||
|
and salestype.SALETYPEID = a.SALETYPE and dosage.DOSAGEID = a.DOSAGEID and
|
||||||
|
custom.CUSTOMID = a.CUSTOMID and saler.SALERID = a.SALERID
|
||||||
|
<where>
|
||||||
|
a.USEYEAR is not NULL
|
||||||
|
and (a.USEYEAR * 100 + a.USEMONTH) BETWEEN #{pastYearMonth} AND #{currentYearMonth}
|
||||||
|
</where>
|
||||||
|
order by a.USEYEAR, a.USEMONTH
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<delete id="deleteSalesReport">
|
||||||
|
delete from yunji_gr_bi_sa_agg
|
||||||
|
where (USEYEAR * 100 + USEMONTH) BETWEEN #{pastYearMonth} AND #{currentYearMonth}
|
||||||
|
</delete>
|
||||||
|
</mapper>
|
||||||
Reference in New Issue
Block a user