3 Commits

Author SHA1 Message Date
king
8f22732f04 计算销售报表 2026-03-11 14:41:55 +08:00
king
e230587f66 计算销售报表 2026-03-11 14:41:51 +08:00
king
3fb081217f 计算销售报表 2026-03-11 14:38:51 +08:00
6 changed files with 366 additions and 0 deletions

View File

@@ -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 "*********** 生成销售报表完成 ************";
}
}

View File

@@ -0,0 +1,142 @@
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 = "GOODSID")
private String goodsId;
@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;
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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;
}
}
}

View File

@@ -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 as 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>