12 Commits

Author SHA1 Message Date
king
7fc21dcc9b SQL调整 金额已万为单位 2026-03-11 09:07:54 +08:00
king
affe6bfed5 分组SQL调整 2026-03-10 16:52:34 +08:00
king
8523b80eb3 分组SQL调整 2026-03-10 15:38:16 +08:00
king
b6a6ad88e7 分组SQL调整 2026-03-10 15:04:48 +08:00
king
3c1274c3d6 Merge branch 'master' into dev_js_20260309 2026-03-10 14:37:07 +08:00
king
b021d2ef01 删除打印 2026-03-10 14:36:06 +08:00
2fa40c266f Merge pull request '实现前置增强逻辑,再实现“综合销售情况表” 动态分组逻辑' (#25) from dev_js_20260309 into master
Reviewed-on: #25
2026-03-10 14:32:51 +08:00
chy
56cb31c616 根据tokne获取用户信息 2026-03-10 14:23:28 +08:00
king
1c9d3b831c 实现前置增强逻辑,再实现“综合销售情况表” 动态分组逻辑 2026-03-10 14:13:57 +08:00
chy
de1774b2d3 修改配置文件 2026-03-10 11:13:56 +08:00
chy
43e66ea9c6 根据ticket获取用户信息 2026-03-10 11:09:46 +08:00
f494611789 Merge pull request '销售明细表定时任务' (#24) from liug into master
Reviewed-on: #24
2026-03-06 23:01:12 +08:00
19 changed files with 295 additions and 36 deletions

View File

@@ -9,43 +9,33 @@ spring:
datasource: datasource:
master: master:
# MYSQL数据库 主库,业务库 # MYSQL数据库 主库,业务库
# url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://192.168.126.128:33306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: root password: root
lideeyunji: # 从库,框架库 lideeyunji: # 从库,框架库
# url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://192.168.126.128:33306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: root password: root
slave: # 日志库单独 slave: # 日志库单独
lazy: true # 开启懒加载,保证启动速度 lazy: true # 开启懒加载,保证启动速度
# url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://192.168.126.128:33306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: root password: root
oracle_gryybi: # 报表平台 oracle oracle_gryybi: # 报表平台 oracle
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@//192.168.1.247:1521/gryy?oracle.jdbc.defaultNChar=true&oracle.jdbc.convertNcharLiterals=true url: jdbc:oracle:thin:@//192.168.1.247:1521/gryy?oracle.jdbc.defaultNChar=true&oracle.jdbc.convertNcharLiterals=true
username: GRYYBI username: GRYYBI
password: xxb147258367 password: xxb147258367
# driver-class-name: oracle.jdbc.OracleDriver
driver-class-name: oracle.jdbc.driver.OracleDriver
erp_bi_data: # 报表平台 mysql erp_bi_data: # 报表平台 mysql
# url: jdbc:mysql://127.0.0.1:3306/erp_bi_data?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/erp_bi_data?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
url: jdbc:mysql://192.168.126.128:33306/erp_bi_data?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: root password: root
# redis:
# host: 127.0.0.1 # 地址
# port: 6379 # 端口
# database: 2 # 数据库索引
# password: lidee@123 # 密码,建议生产环境开启
redis: redis:
host: 192.168.126.128 # 地址 host: 127.0.0.1 # 地址
port: 6379 # 端口 port: 6379 # 端口
database: 2 # 数据库索引 database: 2 # 数据库索引
password: 123456 # 密码,建议生产环境开启 password: lidee@123 # 密码,建议生产环境开启
--- #################### 地代码平台相关配置 #################### --- #################### 地代码平台相关配置 ####################

View File

@@ -9,18 +9,28 @@ spring:
datasource: datasource:
master: master:
# MYSQL数据库 主库,业务库 # MYSQL数据库 主库,业务库
url: jdbc:mysql://127.0.0.1:3306/gr_repoort?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: gryy@8888 password: gryy@8888
lideeyunji: # 从库,框架库 lideeyunji: # 从库,框架库
url: jdbc:mysql://127.0.0.1:3306/gr_repoort?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: gryy@8888 password: gryy@8888
slave: # 日志库单独 slave: # 日志库单独
lazy: true # 开启懒加载,保证启动速度 lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://127.0.0.1:3306/gr_repoort?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 url: jdbc:mysql://127.0.0.1:3306/gr_report?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root username: root
password: gryy@8888 password: gryy@8888
oracle_gryybi: # 报表平台 oracle
url: jdbc:oracle:thin:@//192.168.1.247:1521/gryy?oracle.jdbc.defaultNChar=true&oracle.jdbc.convertNcharLiterals=true
username: GRYYBI
password: xxb147258367
# driver-class-name: oracle.jdbc.OracleDriver
driver-class-name: oracle.jdbc.driver.OracleDriver
erp_bi_data: # 报表平台 mysql
url: jdbc:mysql://127.0.0.1:3306/erp_bi_data?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
username: root
password: root
redis: redis:
host: 127.0.0.1 # 地址 host: 127.0.0.1 # 地址
port: 6379 # 端口 port: 6379 # 端口

View File

@@ -3,7 +3,7 @@ spring:
name: lideeyunji-server name: lideeyunji-server
profiles: profiles:
active: local # 读取配置 active: local # 读取配置
#active: prod # 读取配置 # active: prod # 读取配置
main: main:
allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。

View File

@@ -78,5 +78,10 @@
<artifactId>lidee-service-infra-api</artifactId> <artifactId>lidee-service-infra-api</artifactId>
<version>${lidee.version}</version> <version>${lidee.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>21.1.0.0</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -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.model.EnhanceReportParam;
import com.lideeyunji.core.framework.config.aspect.enhancereport.plugin.ReportAfterAdvicePlugin; 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.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.config.aspect.enhancereport.plugin.ReportPluginManager;
import com.lideeyunji.core.framework.entity.ReportEntity; import com.lideeyunji.core.framework.entity.ReportEntity;
import com.lideeyunji.core.framework.service.IReportService; 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.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component; 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) { private BuildEnhanceReportContext getContextAndPlugins(JoinPoint joinPoint) {
Map<String, Object> paramMap = super.getJoinPointParam(joinPoint); Map<String, Object> paramMap = super.getJoinPointParam(joinPoint);

View File

@@ -0,0 +1,9 @@
package com.lideeyunji.core.framework.config.aspect.enhancereport.plugin;
/**
* 报表统计 前置增强(报表统计专属)
*/
public interface ReportBeforeAdvicePlugin extends ReportBaseAdvicePlugin {
}

View File

@@ -13,8 +13,8 @@ import org.springframework.stereotype.Component;
* 同步销售明细表 * 同步销售明细表
* oracle gryybi GR_BI_SA_SETDTL --> mysql erp_bi_data GR_BI_SA_SETDTL * oracle gryybi GR_BI_SA_SETDTL --> mysql erp_bi_data GR_BI_SA_SETDTL
*/ */
@Component
@Slf4j @Slf4j
@Component("SaSetdtlSyncJob")
public class SaSetdtlSyncJob implements JobHandler { public class SaSetdtlSyncJob implements JobHandler {
@Autowired @Autowired

View File

@@ -60,9 +60,6 @@ public class anyToGrBiSasetdtl implements JobHandler {
while (rs.next()) { while (rs.next()) {
//写入到数据中台表 //写入到数据中台表
System.out.println(rs.getString("SASETTLEDTLID")); System.out.println(rs.getString("SASETTLEDTLID"));
} }

View File

@@ -0,0 +1,158 @@
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<String, Object> params = enhanceContext.getParam().getParams();
if (params.containsKey("Group by")) {
List<String> 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(" SUM(tbl_lgbsa.THISSAQTY) as THISSAQTY, \n"); //本年销量
executePluginSql.append(" SUM(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(" CONCAT(ROUND(SUM(tbl_lgbsa.MONTHSAMONEY) / 10000, 2), '万') as MONTHSAMONEY, \n"); //本月销售金额(元)
executePluginSql.append(" CONCAT(ROUND(SUM(tbl_lgbsa.THISSAMONEY) / 10000, 2), '万') as THISSAMONEY, \n"); //本年销售金额(元)
executePluginSql.append(" CONCAT(ROUND(SUM(tbl_lgbsa.LASTSAMONEY) / 10000, 2), '万') 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(" CONCAT(ROUND(SUM(tbl_lgbsa.MONTHPROFIT) / 10000, 2), '万') as MONTHPROFIT, \n"); //本月毛利额(元)
executePluginSql.append(" CONCAT(ROUND(SUM(tbl_lgbsa.THISPROFIT) / 10000, 2), '万') as THISPROFIT, \n"); //本年毛利额(元)
executePluginSql.append(" CONCAT(ROUND(SUM(tbl_lgbsa.LASTPROFIT) / 10000, 2), '万') 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(" CONCAT(ROUND(SUM(tbl_lgbsa.MONTHCOST) / 10000, 2), '万') as MONTHCOST, \n"); //本月销售成本(元)
executePluginSql.append(" ROUND(avg(tbl_lgbsa.PROFITCHANGE), 2) as PROFITCHANGE, \n"); //毛利变动(元)
executePluginSql.append(" ROUND(avg(tbl_lgbsa.PROFITGROWTH), 2) as PROFITGROWTH, \n"); //毛利额增长率
executePluginSql.append(" ROUND(avg(tbl_lgbsa.THISPROFITRATE), 2) as THISPROFITRATE, \n"); //本年毛利率
executePluginSql.append(" ROUND(avg(tbl_lgbsa.SAMONEYGROWTH), 2) as SAMONEYGROWTH, \n"); //销售金额增长率
executePluginSql.append(" ROUND(avg(tbl_lgbsa.LASTPROFITSHARE) * 100, 2) as 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"); // 原有的逻辑注释了,这里也注释
}
}
}

View File

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

View File

@@ -1054,8 +1054,14 @@ public class FrameServiceImpl implements IFrameService {
if (Func.isEmpty(dataSourceConfigModel) || Func.isEmpty(dataSourceConfigModel.getExecuteSql())) { if (Func.isEmpty(dataSourceConfigModel) || Func.isEmpty(dataSourceConfigModel.getExecuteSql())) {
return null; return null;
} }
//默认从参数中取,参数中的是前置中塞的
Object sqlObj = params.get("executePluginSql");
if(sqlObj != null){
queryWrapper.setTableSql(sqlObj.toString());
}else{
//直接执行数据源 //直接执行数据源
queryWrapper.setTableSql(dataSourceConfigModel.getExecuteSql()); queryWrapper.setTableSql(dataSourceConfigModel.getExecuteSql());
}
//处理占位符参数 //处理占位符参数
Func.replaceParam(dataSourceConfigModel.getExecuteSql(), params, null, lideeYunJiAdapter); Func.replaceParam(dataSourceConfigModel.getExecuteSql(), params, null, lideeYunJiAdapter);

View File

@@ -1147,10 +1147,10 @@ public class Func extends FuncBase {
}); });
} }
} }
if(params.containsKey("Group by")){ // if(params.containsKey("Group by")){
String[] str=params.get("Group by").toString().split(","); // String[] str=params.get("Group by").toString().split(",");
wrapper.groupByColumns(str); // wrapper.groupByColumns(str);
} // }
} }

View File

@@ -97,6 +97,11 @@
<groupId>com.tencentcloudapi</groupId> <groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-sms</artifactId> <artifactId>tencentcloud-sdk-java-sms</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-boot-starter</artifactId>
<version>1.4.11</version>
</dependency>
<dependency> <dependency>
<groupId>com.lideeyunji</groupId> <groupId>com.lideeyunji</groupId>
<artifactId>lidee-module-api</artifactId> <artifactId>lidee-module-api</artifactId>

View File

@@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil;
import com.lideeyunji.service.system.config.convert.auth.AuthConvert; import com.lideeyunji.service.system.config.convert.auth.AuthConvert;
import com.lideeyunji.service.system.constant.ErrorCodeConstants; import com.lideeyunji.service.system.constant.ErrorCodeConstants;
import com.lideeyunji.service.system.controller.vo.auth.*; import com.lideeyunji.service.system.controller.vo.auth.*;
import com.lideeyunji.service.system.controller.vo.auth.*;
import com.lideeyunji.service.system.controller.vo.user.user.UserRespVO; import com.lideeyunji.service.system.controller.vo.user.user.UserRespVO;
import com.lideeyunji.service.system.entity.AdminUserDO; import com.lideeyunji.service.system.entity.AdminUserDO;
import com.lideeyunji.service.system.entity.MenuDO; import com.lideeyunji.service.system.entity.MenuDO;
@@ -23,7 +22,6 @@ import com.lideeyunji.tool.framework.operatelog.core.annotations.OperateLog;
import com.lideeyunji.tool.framework.security.config.SecurityProperties; import com.lideeyunji.tool.framework.security.config.SecurityProperties;
import com.lideeyunji.tool.framework.security.core.util.SecurityFrameworkUtils; import com.lideeyunji.tool.framework.security.core.util.SecurityFrameworkUtils;
import com.lideeyunji.tool.framework.tenant.core.context.TenantContextHolder; import com.lideeyunji.tool.framework.tenant.core.context.TenantContextHolder;
import com.lideeyunji.service.system.service.*;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
@@ -165,8 +163,8 @@ public class AuthController {
@Operation(tags = "根据token获取用户信息",summary = "根据token获取用户信息") @Operation(tags = "根据token获取用户信息",summary = "根据token获取用户信息")
@Parameter(name = "refreshToken", description = "根据token获取用户信息", required = true) @Parameter(name = "refreshToken", description = "根据token获取用户信息", required = true)
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志 @OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<AuthLoginRespVO> getUerInfo(@RequestParam("refreshToken") String refreshToken) { public CommonResult<AdminUserDO> getUerInfo(@RequestParam("refreshToken") String refreshToken) {
return success(authService.refreshToken(refreshToken)); return success(authService.getTokenTouserInfo(refreshToken));
} }
@GetMapping("/get-permission-info") @GetMapping("/get-permission-info")

View File

@@ -73,7 +73,7 @@ public class OAuth2ClientController {
@GetMapping("/myPage") @GetMapping("/myPage")
@Operation(tags = "OAuth2.0管理",summary = "获得用户角色下 OAuth2 客户端分页") @Operation(tags = "OAuth2.0管理",summary = "获得用户角色下 OAuth2 客户端分页")
@PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") // @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')")
public CommonResult<PageResult<OAuth2ClientRespVO>> getMyPage(@Valid OAuth2ClientPageReqVO pageVO) { public CommonResult<PageResult<OAuth2ClientRespVO>> getMyPage(@Valid OAuth2ClientPageReqVO pageVO) {
PageResult<OAuth2ClientDO> pageResult = oAuth2ClientService.getMyPage(pageVO); PageResult<OAuth2ClientDO> pageResult = oAuth2ClientService.getMyPage(pageVO);
return success(BeanUtils.toBean(pageResult, OAuth2ClientRespVO.class)); return success(BeanUtils.toBean(pageResult, OAuth2ClientRespVO.class));

View File

@@ -78,4 +78,6 @@ public interface IAdminAuthService {
*/ */
AuthLoginRespVO refreshToken(String refreshToken); AuthLoginRespVO refreshToken(String refreshToken);
AdminUserDO getTokenTouserInfo(String refreshToken);
} }

View File

@@ -1,5 +1,6 @@
package com.lideeyunji.service.system.service; package com.lideeyunji.service.system.service;
import com.lideeyunji.service.system.entity.AdminUserDO;
import com.lideeyunji.tool.framework.common.pojo.PageResult; import com.lideeyunji.tool.framework.common.pojo.PageResult;
import com.lideeyunji.service.system.controller.vo.oauth2.token.OAuth2AccessTokenPageReqVO; import com.lideeyunji.service.system.controller.vo.oauth2.token.OAuth2AccessTokenPageReqVO;
import com.lideeyunji.service.system.entity.OAuth2AccessTokenDO; import com.lideeyunji.service.system.entity.OAuth2AccessTokenDO;
@@ -41,6 +42,10 @@ public interface IOAuth2TokenService {
*/ */
OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId); OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId);
AdminUserDO getTokenTouserInfo(String refreshToken);
/** /**
* 获得访问令牌 * 获得访问令牌
* *

View File

@@ -362,6 +362,15 @@ public class AdminAuthServiceImpl implements IAdminAuthService {
return AuthConvert.INSTANCE.convert(accessTokenDO); return AuthConvert.INSTANCE.convert(accessTokenDO);
} }
@Override
public AdminUserDO getTokenTouserInfo(String refreshToken) {
AdminUserDO user= oauth2TokenService.getTokenTouserInfo(refreshToken);
return user;
}
@Override @Override
public void logout(String token, Integer logType) { public void logout(String token, Integer logType) {
// 删除访问令牌 // 删除访问令牌

View File

@@ -61,6 +61,7 @@ public class OAuth2TokenServiceImpl implements IOAuth2TokenService {
@Lazy // 懒加载,避免循环依赖 @Lazy // 懒加载,避免循环依赖
private IAdminUserService adminUserService; private IAdminUserService adminUserService;
@Override @Override
public OAuth2AccessTokenDO createAccessToken(Long userId, Long lastLoginDeptId, Long lastLoginRoleId, Integer userType, String clientId, List<String> scopes) { public OAuth2AccessTokenDO createAccessToken(Long userId, Long lastLoginDeptId, Long lastLoginRoleId, Integer userType, String clientId, List<String> scopes) {
return createAccessToken(userId, lastLoginDeptId, lastLoginRoleId, userType, clientId, scopes,false); return createAccessToken(userId, lastLoginDeptId, lastLoginRoleId, userType, clientId, scopes,false);
@@ -77,6 +78,16 @@ public class OAuth2TokenServiceImpl implements IOAuth2TokenService {
} }
@Override
public AdminUserDO getTokenTouserInfo(String refreshToken ) {
// 获得用户基本信息
OAuth2AccessTokenDO accessTokenDO= oauth2AccessTokenMapper.selectByAccessToken(refreshToken);
AdminUserDO user = adminUserService.getUser(accessTokenDO.getUserId());
return user;
}
@Override @Override
public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) { public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) {
boolean supAdmin = SecurityFrameworkUtils.isSupAdmin(); boolean supAdmin = SecurityFrameworkUtils.isSupAdmin();
@@ -110,6 +121,12 @@ public class OAuth2TokenServiceImpl implements IOAuth2TokenService {
return createOAuth2AccessToken(refreshTokenDO, clientDO, supAdmin); return createOAuth2AccessToken(refreshTokenDO, clientDO, supAdmin);
} }
@Override @Override
public OAuth2AccessTokenDO getAccessToken(String accessToken) { public OAuth2AccessTokenDO getAccessToken(String accessToken) {
// 优先从 Redis 中获取 // 优先从 Redis 中获取