diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/LideeYunJiReportEnhance.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/LideeYunJiReportEnhance.java index d6d6784..2aba128 100644 --- a/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/LideeYunJiReportEnhance.java +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/LideeYunJiReportEnhance.java @@ -13,6 +13,7 @@ import com.lideeyunji.core.framework.config.aspect.enhancereport.model.EnhanceRe import com.lideeyunji.core.framework.config.aspect.enhancereport.model.EnhanceReportParam; import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportAfterAdvicePlugin; import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportBaseAdvicePlugin; +import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportBeforeAdvicePlugin; import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportPluginManager; import com.lideeyunji.core.framework.entity.ReportEntity; import com.lideeyunji.core.framework.service.IReportService; @@ -25,6 +26,7 @@ import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -113,6 +115,31 @@ public class LideeYunJiReportEnhance extends LideeYunJiBaseEnhance { } + @Before("@annotation(lideeyunJiReportEnhance)") + public void before(JoinPoint joinPoint, LideeyunJiReportEnhance lideeyunJiReportEnhance) throws Throwable { + + //获取参数 + BuildEnhanceReportContext buildEnhanceContext = this.getContextAndPlugins(joinPoint); + if (FuncBase.isEmpty(buildEnhanceContext)) {//没有增强 + return ; + } + + //增强列表 + String javaClass = buildEnhanceContext.getJavaClass(); + if (Func.isEmpty(javaClass)) {//无增强 + return ; + } + //有增强,但是增强不是报表增强,直接返回原值 + ReportBaseAdvicePlugin plugin = ReportPluginManager.getPlugin(javaClass); + if (!(plugin instanceof ReportBeforeAdvicePlugin)) { + return ; + } + + EnhanceReportContext context = buildEnhanceContext.getContext(); + //执行增强 + ReportPluginManager.executePlugin(javaClass, context); + } + private BuildEnhanceReportContext getContextAndPlugins(JoinPoint joinPoint) { Map paramMap = super.getJoinPointParam(joinPoint); diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/plugin/ReportBeforeAdvicePlugin.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/plugin/ReportBeforeAdvicePlugin.java new file mode 100644 index 0000000..699024b --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/config/aspect/enhancereport/plugin/ReportBeforeAdvicePlugin.java @@ -0,0 +1,9 @@ + +package com.lideeyunji.core.framework.config.aspect.enhancereport.plugin; + +/** + * 报表统计 前置增强(报表统计专属) + */ +public interface ReportBeforeAdvicePlugin extends ReportBaseAdvicePlugin { + +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/enhance/example/report/xtsy/zhxsqkLineReportEnhance.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/enhance/example/report/xtsy/zhxsqkLineReportEnhance.java new file mode 100644 index 0000000..af85c6f --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/enhance/example/report/xtsy/zhxsqkLineReportEnhance.java @@ -0,0 +1,159 @@ + +package com.lideeyunji.core.framework.enhance.example.report.xtsy; + +import com.lideeyunji.core.framework.config.aspect.enhancereport.model.EnhanceReportContext; +import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportBeforeAdvicePlugin; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 报表-系统首页-单表 + */ +@Slf4j +@Component("zhxsqkLineReportEnhance") +public class zhxsqkLineReportEnhance implements ReportBeforeAdvicePlugin { + + @Override + public void execute(EnhanceReportContext enhanceContext) { + log.info("进入=======>zhxsqkLineReportEnhance=======>execute"); + Map params = enhanceContext.getParam().getParams(); + if (params.containsKey("Group by")) { + List groupFieldList = Arrays.asList(params.get("Group by").toString().split(",")); + StringBuilder executePluginSql = new StringBuilder(); + executePluginSql.append(" SELECT \n"); + if (groupFieldList.contains("customname")) { //客户名称 + executePluginSql.append(" tbl_lgbsa.CUSTOMID, \n"); + executePluginSql.append(" tbl_lgbsa.CUSTOMNAME, \n"); + } + if (groupFieldList.contains("useyear")) { //年 + executePluginSql.append(" tbl_lgbsa.USEYEAR, \n"); + } + if (groupFieldList.contains("usemonth")) { //月 + executePluginSql.append(" tbl_lgbsa.USEMONTH, \n"); + } + if (groupFieldList.contains("zonename")) { //业务区域 + executePluginSql.append(" tbl_lgbsa.ZONEID, \n"); + executePluginSql.append(" tbl_lgbsa.ZONENAME, \n"); + } + if (groupFieldList.contains("saletypename")) { //销售类型 + executePluginSql.append(" tbl_lgbsa.SALETYPEID, \n"); + executePluginSql.append(" tbl_lgbsa.SALETYPENAME, \n"); + } + if (groupFieldList.contains("salername")) { //业务员 + executePluginSql.append(" tbl_lgbsa.SALERID, \n"); + executePluginSql.append(" tbl_lgbsa.SALERNAME, \n"); + } + if (groupFieldList.contains("dosagename")) { //剂型 + executePluginSql.append(" tbl_lgbsa.DOSAGEID, \n"); + executePluginSql.append(" tbl_lgbsa.DOSAGENAME, \n"); + } + executePluginSql.append(" max(CONCAT(USEYEAR, LPAD(USEMONTH, 2, '0'))) as ny, \n"); //年月 + executePluginSql.append(" GROUP_CONCAT(DISTINCT tbl_lgbsa.PROVINCEID ORDER BY tbl_lgbsa.PROVINCEID SEPARATOR ',') as PROVINCEID, \n"); //行政区域ID + executePluginSql.append(" GROUP_CONCAT(DISTINCT tbl_lgbsa.PROVINCENAME ORDER BY tbl_lgbsa.PROVINCEID SEPARATOR ',') as PROVINCENAME, \n"); //行政区域名称 + executePluginSql.append(" sum(tbl_lgbsa.MONTHSAQTY) as MONTHSAQTY, \n"); //本月销量 + executePluginSql.append(" CONCAT(ROUND((SELECT SUM(MONTHSAQTY) FROM yunji_gr_bi_sa_agg)/100000000 ,2), '亿') AS monthsaqty_s, \n"); + executePluginSql.append(" CONCAT(ROUND((SELECT SUM(THISSAQTY) FROM yunji_gr_bi_sa_agg)/100000000 ,2), '亿') AS thissaqty_s, \n"); + executePluginSql.append(" CONCAT(ROUND((SELECT SUM(LASTSAQTY) FROM yunji_gr_bi_sa_agg)/100000000 ,2), '亿') AS lastsaqty_s, \n"); + executePluginSql.append(" -- 原本带CAST的字段,简化写法(CONCAT会自动转为字符串) \n"); + executePluginSql.append(" CONCAT(ROUND((SELECT SUM(MONTHSAMONEY) FROM yunji_gr_bi_sa_agg)/100000000 ,2), '亿') AS monthsamoney_s, \n"); + executePluginSql.append(" CONCAT(ROUND((SELECT SUM(THISSAMONEY) FROM yunji_gr_bi_sa_agg)/100000000,2), '亿') AS thissamoney_s, \n"); + executePluginSql.append(" CONCAT(ROUND((SELECT SUM(LASTSAMONEY) FROM yunji_gr_bi_sa_agg)/100000000,2), '亿') AS lastsamoney_s, \n"); + executePluginSql.append(" max(tbl_lgbsa.THISSAQTY) as THISSAQTY, \n"); + executePluginSql.append(" max(tbl_lgbsa.LASTSAQTY) as LASTSAQTY, \n"); + executePluginSql.append(" -- 数量同比(原有) \n"); + executePluginSql.append(" CASE \n"); + executePluginSql.append(" WHEN (CASE WHEN sum(tbl_lgbsa.LASTSAQTY) = 0 THEN IF(sum(tbl_lgbsa.THISSAQTY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAQTY) - sum(tbl_lgbsa.LASTSAQTY)) / sum(tbl_lgbsa.LASTSAQTY) * 100 END) > 0 THEN \n"); + executePluginSql.append(" CONCAT('🟢 ', ROUND((CASE WHEN sum(tbl_lgbsa.LASTSAQTY) = 0 THEN IF(sum(tbl_lgbsa.THISSAQTY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAQTY) - sum(tbl_lgbsa.LASTSAQTY)) / sum(tbl_lgbsa.LASTSAQTY) * 100 END), 2), '%') \n"); + executePluginSql.append(" WHEN (CASE WHEN sum(tbl_lgbsa.LASTSAQTY) = 0 THEN IF(sum(tbl_lgbsa.THISSAQTY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAQTY) - sum(tbl_lgbsa.LASTSAQTY)) / sum(tbl_lgbsa.LASTSAQTY) * 100 END) < 0 THEN \n"); + executePluginSql.append(" CONCAT('🔴 ', ROUND((CASE WHEN sum(tbl_lgbsa.LASTSAQTY) = 0 THEN IF(sum(tbl_lgbsa.THISSAQTY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAQTY) - sum(tbl_lgbsa.LASTSAQTY)) / sum(tbl_lgbsa.LASTSAQTY) * 100 END), 2), '%') \n"); + executePluginSql.append("ELSE '0.00%' \n"); + executePluginSql.append(" END AS saqty_yoy, \n"); + executePluginSql.append(" max(tbl_lgbsa.MONTHSAMONEY) as MONTHSAMONEY, \n"); + executePluginSql.append(" max(tbl_lgbsa.THISSAMONEY) as THISSAMONEY, \n"); + executePluginSql.append(" max(tbl_lgbsa.LASTSAMONEY) as LASTSAMONEY, \n"); + executePluginSql.append(" -- 销售金额同比(原有新增) \n"); + executePluginSql.append(" CASE \n"); + executePluginSql.append(" WHEN (CASE WHEN sum(tbl_lgbsa.LASTSAMONEY) = 0 THEN IF(sum(tbl_lgbsa.THISSAMONEY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAMONEY) - sum(tbl_lgbsa.LASTSAMONEY)) / sum(tbl_lgbsa.LASTSAMONEY) * 100 END) > 0 THEN \n"); + executePluginSql.append(" CONCAT('🟢 ', ROUND((CASE WHEN sum(tbl_lgbsa.LASTSAMONEY) = 0 THEN IF(sum(tbl_lgbsa.THISSAMONEY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAMONEY) - sum(tbl_lgbsa.LASTSAMONEY)) / sum(tbl_lgbsa.LASTSAMONEY) * 100 END), 2), '%') \n"); + executePluginSql.append(" WHEN (CASE WHEN sum(tbl_lgbsa.LASTSAMONEY) = 0 THEN IF(sum(tbl_lgbsa.THISSAMONEY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAMONEY) - sum(tbl_lgbsa.LASTSAMONEY)) / sum(tbl_lgbsa.LASTSAMONEY) * 100 END) < 0 THEN \n"); + executePluginSql.append(" CONCAT('🔴 ', ROUND((CASE WHEN sum(tbl_lgbsa.LASTSAMONEY) = 0 THEN IF(sum(tbl_lgbsa.THISSAMONEY) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISSAMONEY) - sum(tbl_lgbsa.LASTSAMONEY)) / sum(tbl_lgbsa.LASTSAMONEY) * 100 END), 2), '%') \n"); + executePluginSql.append(" ELSE '0.00%' \n"); + executePluginSql.append(" END AS samoney_yoy, \n"); //销售收入同比 + executePluginSql.append(" max(tbl_lgbsa.MONTHPROFIT) as MONTHPROFIT, \n"); //本月毛利额(元) + executePluginSql.append(" max(tbl_lgbsa.THISPROFIT) as THISPROFIT, \n"); //本年毛利额(元) + executePluginSql.append(" max(tbl_lgbsa.LASTPROFIT) as LASTPROFIT, \n"); //上年毛利额(元) + executePluginSql.append(" -- 新增:毛利同比 \n"); + executePluginSql.append(" CASE \n"); + executePluginSql.append(" -- 正数:红色圆点emoji + 数值 + % \n"); + executePluginSql.append(" WHEN (CASE WHEN sum(tbl_lgbsa.LASTPROFIT) = 0 THEN IF(sum(tbl_lgbsa.THISPROFIT) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISPROFIT) - sum(tbl_lgbsa.LASTPROFIT)) / sum(tbl_lgbsa.LASTPROFIT) * 100 END) > 0 THEN \n"); + executePluginSql.append(" CONCAT('🟢 ', ROUND((CASE WHEN sum(tbl_lgbsa.LASTPROFIT) = 0 THEN IF(sum(tbl_lgbsa.THISPROFIT) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISPROFIT) - sum(tbl_lgbsa.LASTPROFIT)) / sum(tbl_lgbsa.LASTPROFIT) * 100 END), 2), '%') \n"); + executePluginSql.append(" -- 负数:绿色圆点emoji + 数值 + % \n"); + executePluginSql.append(" WHEN (CASE WHEN sum(tbl_lgbsa.LASTPROFIT) = 0 THEN IF(sum(tbl_lgbsa.THISPROFIT) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISPROFIT) - sum(tbl_lgbsa.LASTPROFIT)) / sum(tbl_lgbsa.LASTPROFIT) * 100 END) < 0 THEN \n"); + executePluginSql.append(" CONCAT('🔴 ', ROUND((CASE WHEN sum(tbl_lgbsa.LASTPROFIT) = 0 THEN IF(sum(tbl_lgbsa.THISPROFIT) > 0, 100, 0) \n"); + executePluginSql.append(" ELSE (sum(tbl_lgbsa.THISPROFIT) - sum(tbl_lgbsa.LASTPROFIT)) / sum(tbl_lgbsa.LASTPROFIT) * 100 END), 2), '%') \n"); + executePluginSql.append(" -- 0值:直接显示 \n"); + executePluginSql.append(" ELSE '0.00%' \n"); + executePluginSql.append(" END AS profit_yoy, \n"); //毛利同比 + executePluginSql.append(" sum(tbl_lgbsa.MONTHCOST) as MONTHCOST, \n"); //本月销售成本(元) + executePluginSql.append(" avg(tbl_lgbsa.PROFITCHANGE) as PROFITCHANGE, \n"); //毛利变动(元) + executePluginSql.append(" avg(tbl_lgbsa.PROFITGROWTH) as PROFITGROWTH, \n"); //毛利额增长率 + executePluginSql.append(" avg(tbl_lgbsa.THISPROFITRATE) as THISPROFITRATE, \n"); //本年毛利率 + executePluginSql.append(" avg(tbl_lgbsa.SAMONEYGROWTH) as SAMONEYGROWTH, \n"); //销售金额增长率 + executePluginSql.append(" max(tbl_lgbsa.LASTPROFITSHARE), \n"); //上年毛利额占比 + executePluginSql.append(" CONCAT(ROUND(avg(tbl_lgbsa.THISPROFITSHARE) * 100, 2), '%') AS THISPROFITSHARE, \n"); //本年毛利额占比 + executePluginSql.append(" CONCAT(ROUND(avg(tbl_lgbsa.MONTHPROFITSHARE) * 100, 2), '%') AS MONTHPROFITSHARE, \n"); //本月毛利额占比 + executePluginSql.append(" CONCAT(ROUND(avg(tbl_lgbsa.LASTSAMONEYSHARE) * 100, 2), '%') AS LASTSAMONEYSHARE, \n"); //上年销售金额占比 + executePluginSql.append(" CONCAT(ROUND(avg(tbl_lgbsa.THISSAMONEYSHARE) * 100, 2), '%') AS THISSAMONEYSHARE, \n"); //本年销售金额占比 + executePluginSql.append(" CONCAT(ROUND(avg(tbl_lgbsa.MONTHSAMONEYSHARE) * 100, 2), '%') AS MONTHSAMONEYSHARE \n"); //本月销售金额占比 + executePluginSql.append(" FROM \n"); + executePluginSql.append(" yunji_gr_bi_sa_agg tbl_lgbsa \n"); + executePluginSql.append(" GROUP BY \n"); + if (groupFieldList.contains("customname")) { + executePluginSql.append(" tbl_lgbsa.CUSTOMID,"); + executePluginSql.append(" tbl_lgbsa.CUSTOMNAME,"); + } + if (groupFieldList.contains("useyear")) { + executePluginSql.append(" tbl_lgbsa.USEYEAR,"); + } + if (groupFieldList.contains("usemonth")) { + executePluginSql.append(" tbl_lgbsa.USEMONTH,"); + } + if (groupFieldList.contains("zonename")) { + executePluginSql.append(" tbl_lgbsa.ZONEID,"); + executePluginSql.append(" tbl_lgbsa.ZONENAME,"); + } + if (groupFieldList.contains("saletypename")) { + executePluginSql.append(" tbl_lgbsa.SALETYPEID,"); + executePluginSql.append(" tbl_lgbsa.SALETYPENAME,"); + } + if (groupFieldList.contains("salername")) { + executePluginSql.append(" tbl_lgbsa.SALERID,"); + executePluginSql.append(" tbl_lgbsa.SALERNAME,"); + } + if (groupFieldList.contains("dosagename")) { + executePluginSql.append(" tbl_lgbsa.DOSAGEID,"); + executePluginSql.append(" tbl_lgbsa.DOSAGENAME,"); + } + executePluginSql.deleteCharAt(executePluginSql.length() - 1); + params.put("executePluginSql", executePluginSql.toString()); +// params.remove("Group by"); // 原有的逻辑注释了,这里也注释 + System.out.println(params); + } + } + +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/enhance/example/report/xtsy/zhxsqkPlugin.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/enhance/example/report/xtsy/zhxsqkPlugin.java new file mode 100644 index 0000000..6cddfc7 --- /dev/null +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/enhance/example/report/xtsy/zhxsqkPlugin.java @@ -0,0 +1,21 @@ + +package com.lideeyunji.core.framework.enhance.example.report.xtsy; + +import com.lideeyunji.core.framework.config.aspect.enhancereport.model.EnhanceReportContext; +import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportBeforeAdvicePlugin; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 报表-系统首页-单表 + */ +@Slf4j +@Component("zhxsqkPlugin") +public class zhxsqkPlugin implements ReportBeforeAdvicePlugin { + + + @Override + public void execute(EnhanceReportContext enhanceContext) { + + } +} diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/FrameServiceImpl.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/FrameServiceImpl.java index 3487195..dc31da2 100644 --- a/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/FrameServiceImpl.java +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/FrameServiceImpl.java @@ -1054,8 +1054,14 @@ public class FrameServiceImpl implements IFrameService { if (Func.isEmpty(dataSourceConfigModel) || Func.isEmpty(dataSourceConfigModel.getExecuteSql())) { return null; } - //直接执行数据源 - queryWrapper.setTableSql(dataSourceConfigModel.getExecuteSql()); + //默认从参数中取,参数中的是前置中塞的 + Object sqlObj = params.get("executePluginSql"); + if(sqlObj != null){ + queryWrapper.setTableSql(sqlObj.toString()); + }else{ + //直接执行数据源 + queryWrapper.setTableSql(dataSourceConfigModel.getExecuteSql()); + } //处理占位符参数 Func.replaceParam(dataSourceConfigModel.getExecuteSql(), params, null, lideeYunJiAdapter); diff --git a/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/Func.java b/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/Func.java index 348a2a1..54e63d3 100644 --- a/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/Func.java +++ b/lidee-core/src/main/java/com/lideeyunji/core/framework/utils/Func.java @@ -1147,10 +1147,10 @@ public class Func extends FuncBase { }); } } - if(params.containsKey("Group by")){ - String[] str=params.get("Group by").toString().split(","); - wrapper.groupByColumns(str); - } +// if(params.containsKey("Group by")){ +// String[] str=params.get("Group by").toString().split(","); +// wrapper.groupByColumns(str); +// } }