Compare commits
23 Commits
main_hhl02
...
dev_js_202
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7fc21dcc9b | ||
|
|
affe6bfed5 | ||
|
|
8523b80eb3 | ||
|
|
b6a6ad88e7 | ||
|
|
3c1274c3d6 | ||
|
|
b021d2ef01 | ||
| 2fa40c266f | |||
| 56cb31c616 | |||
|
|
1c9d3b831c | ||
| de1774b2d3 | |||
| 43e66ea9c6 | |||
| f494611789 | |||
|
|
8bae1cbd35 | ||
| ee7510f41e | |||
| 44279d9637 | |||
| 860afb9812 | |||
|
|
0ef88ce81d | ||
| 1b81782767 | |||
| 432feb11d2 | |||
|
|
1173de364c | ||
|
|
7fb9543604 | ||
|
|
bac75778ad | ||
|
|
3dd11b9f37 |
@@ -7,4 +7,30 @@
|
||||
表名:xxx_demo
|
||||
字段 类型 长度
|
||||
xx_aa varchar 20
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
日期:2026-02-11(新增字段)
|
||||
表名:yunji_report_field
|
||||
字段 类型 长度 字段说明
|
||||
is_dynamic_group varchar 60 是否动态分组 Y|N
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
日期:2026-02-12(修改字段长度)
|
||||
表名:yunji_report_field
|
||||
字段 类型 长度 字段说明
|
||||
is_hide_dimension varchar 255
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
日期:2026-02-13(新增字段)
|
||||
表名:yunji_report_field
|
||||
字段 类型 长度 字段说明
|
||||
width varchar 60 单元格宽度
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
日期:2026-02-24(新增字段)
|
||||
表名:yunji_report_field
|
||||
字段 类型 长度 字段说明
|
||||
search_default_value varchar 150 查询控件默认值
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
日期:2026-02-27(新增字段)
|
||||
表名:yunji_report_field
|
||||
字段 类型 长度 字段说明
|
||||
is_hide_search varchar 60 查询控件是否隐藏
|
||||
@@ -21,6 +21,16 @@ spring:
|
||||
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
|
||||
password: root
|
||||
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
|
||||
username: GRYYBI
|
||||
password: xxb147258367
|
||||
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:
|
||||
host: 127.0.0.1 # 地址
|
||||
port: 6379 # 端口
|
||||
|
||||
@@ -9,18 +9,28 @@ spring:
|
||||
datasource:
|
||||
master:
|
||||
# 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
|
||||
password: gryy@8888
|
||||
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
|
||||
password: gryy@8888
|
||||
slave: # 日志库单独
|
||||
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
|
||||
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:
|
||||
host: 127.0.0.1 # 地址
|
||||
port: 6379 # 端口
|
||||
|
||||
@@ -3,6 +3,7 @@ spring:
|
||||
name: lideeyunji-server
|
||||
profiles:
|
||||
active: local # 读取配置
|
||||
# active: prod # 读取配置
|
||||
main:
|
||||
allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
|
||||
|
||||
|
||||
@@ -78,5 +78,10 @@
|
||||
<artifactId>lidee-service-infra-api</artifactId>
|
||||
<version>${lidee.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.oracle.database.nls</groupId>
|
||||
<artifactId>orai18n</artifactId>
|
||||
<version>21.1.0.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -92,5 +92,10 @@
|
||||
<artifactId>lidee-service-infra-api</artifactId>
|
||||
<version>${lidee.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.oracle.database.nls</groupId>
|
||||
<artifactId>orai18n</artifactId>
|
||||
<version>21.1.0.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -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<String, Object> paramMap = super.getJoinPointParam(joinPoint);
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
package com.lideeyunji.core.framework.config.aspect.enhancereport.plugin;
|
||||
|
||||
/**
|
||||
* 报表统计 前置增强(报表统计专属)
|
||||
*/
|
||||
public interface ReportBeforeAdvicePlugin extends ReportBaseAdvicePlugin {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.lideeyunji.core.framework.config.job;
|
||||
|
||||
|
||||
import com.lideeyunji.core.framework.service.IGrBiSaSetdtlService;
|
||||
import com.lideeyunji.core.framework.service.ILideeYunJiService;
|
||||
import com.lideeyunji.tool.framework.quartz.core.handler.JobHandler;
|
||||
import com.lideeyunji.tool.framework.tenant.core.aop.TenantIgnore;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 同步销售明细表
|
||||
* oracle gryybi GR_BI_SA_SETDTL --> mysql erp_bi_data GR_BI_SA_SETDTL
|
||||
*/
|
||||
@Slf4j
|
||||
@Component("SaSetdtlSyncJob")
|
||||
public class SaSetdtlSyncJob implements JobHandler {
|
||||
|
||||
@Autowired
|
||||
private ILideeYunJiService lideeYunJiService;
|
||||
|
||||
@Autowired
|
||||
private IGrBiSaSetdtlService grBiSaSetdtlService;
|
||||
|
||||
|
||||
@Override
|
||||
@TenantIgnore
|
||||
public String execute(String param) throws Exception {
|
||||
log.info("*********** 开始同步销售明细表 ************");
|
||||
// Integer cou = this.lideeYunJiService.saSetdtlSyncJob();
|
||||
Integer cou = this.grBiSaSetdtlService.saSetdtlSyncJob();
|
||||
String resultStr = "*********** 同步销售明细表,共保存了" + cou + "条数据 ************";
|
||||
log.info(resultStr);
|
||||
return resultStr;
|
||||
}
|
||||
}
|
||||
@@ -60,9 +60,6 @@ public class anyToGrBiSasetdtl implements JobHandler {
|
||||
while (rs.next()) {
|
||||
//写入到数据中台表
|
||||
|
||||
|
||||
|
||||
|
||||
System.out.println(rs.getString("SASETTLEDTLID"));
|
||||
|
||||
}
|
||||
|
||||
@@ -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"); // 原有的逻辑注释了,这里也注释
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
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("GR_BI_SA_SETDTL")
|
||||
@Data
|
||||
@EqualsAndHashCode
|
||||
public class GrBiSaSetdtl implements Serializable {
|
||||
private final static long serialVersionUID = 1L;
|
||||
@TableId(value = "SASETTLEDTLID", type = IdType.INPUT)
|
||||
private Integer SASETTLEDTLID;
|
||||
@TableField(value = "SASETTLEID")
|
||||
private Integer SASETTLEID;
|
||||
@TableField(value = "USESTATUS")
|
||||
private Integer USESTATUS;
|
||||
@TableField(value = "UPDATE_TIME")
|
||||
private String UPDATETIME;
|
||||
@TableField(value = "USEDATE")
|
||||
private Date USEDATE;
|
||||
@TableField(value = "USEYEAR")
|
||||
private Integer USEYEAR;
|
||||
@TableField(value = "USEMONTH")
|
||||
private Integer USEMONTH;
|
||||
@TableField(value = "SALEZONEID")
|
||||
private Integer SALEZONEID;
|
||||
@TableField(value = "SALEZONENAME")
|
||||
private String SALEZONENAME;
|
||||
@TableField(value = "PROVINCEID")
|
||||
private Integer PROVINCEID;
|
||||
@TableField(value = "PROVINCENAME")
|
||||
private String PROVINCENAME;
|
||||
@TableField(value = "SALETYPE")
|
||||
private Integer SALETYPE;
|
||||
@TableField(value = "SALETYPENAME")
|
||||
private String SALETYPENAME;
|
||||
@TableField(value = "CUSTOMID")
|
||||
private Integer CUSTOMID;
|
||||
@TableField(value = "CUSTOMNAME")
|
||||
private String CUSTOMNAME;
|
||||
@TableField(value = "SALERID")
|
||||
private Integer SALERID;
|
||||
@TableField(value = "SALERNAME")
|
||||
private String SALERNAME;
|
||||
@TableField(value = "DOSAGEID")
|
||||
private Integer DOSAGEID;
|
||||
@TableField(value = "DOSAGENAME")
|
||||
private String DOSAGENAME;
|
||||
@TableField(value = "STDGOODSNAME")
|
||||
private String STDGOODSNAME;
|
||||
@TableField(value = "GOODSID")
|
||||
private Integer GOODSID;
|
||||
@TableField(value = "GOODSNAME")
|
||||
private String GOODSNAME;
|
||||
@TableField(value = "GOODSTYPE")
|
||||
private String GOODSTYPE;
|
||||
@TableField(value = "GOODSUNIT")
|
||||
private String GOODSUNIT;
|
||||
@TableField(value = "SAQTY")
|
||||
private Integer SAQTY;
|
||||
@TableField(value = "SAMONEY")
|
||||
private Integer SAMONEY;
|
||||
@TableField(value = "SAMONEYTX")
|
||||
private Integer SAMONEYTX;
|
||||
@TableField(value = "COST")
|
||||
private Integer COST;
|
||||
@TableField(value = "PROFIT")
|
||||
private Integer PROFIT;
|
||||
}
|
||||
@@ -107,5 +107,17 @@ public class ReportFieldEntity extends BaseTenantEntity {
|
||||
//隐藏列的,表单不显示该字段
|
||||
private String isHideCol;
|
||||
|
||||
//是否动态分组 Y|N
|
||||
private String isDynamicGroup;
|
||||
|
||||
//单元格宽度
|
||||
private String width;
|
||||
|
||||
//查询控件默认值
|
||||
private String searchDefaultValue;
|
||||
|
||||
//查询控件隐藏
|
||||
private String isHideSearch;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.lideeyunji.core.framework.mapper;
|
||||
|
||||
import com.baomidou.dynamic.datasource.annotation.DS;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.lideeyunji.core.framework.entity.GrBiSaSetdtl;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public interface GrBiSaSetdtlMapper extends BaseMapper<GrBiSaSetdtl> {
|
||||
|
||||
@DS(value = "#dataSourceType")
|
||||
default GrBiSaSetdtl getLastUpdated(@Param("dataSourceType") String dataSourceType) {
|
||||
QueryWrapper<GrBiSaSetdtl> wrapper = new QueryWrapper<>();
|
||||
wrapper.orderByDesc("UPDATE_TIME");
|
||||
wrapper.last("limit 1");
|
||||
return this.selectOne(wrapper);
|
||||
}
|
||||
|
||||
@DS(value = "#dataSourceType")
|
||||
default List<GrBiSaSetdtl> getByUpdateTime(@Param("dataSourceType") String dataSourceType, String updateTime) {
|
||||
try {
|
||||
// 假设 updateTime 格式为 "yyyy-MM-dd HH:mm:ss"
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
Date startTime = sdf.parse(updateTime);
|
||||
QueryWrapper<GrBiSaSetdtl> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.gt("UPDATE_TIME", startTime);
|
||||
return this.selectList(queryWrapper);
|
||||
} catch (Exception e) {
|
||||
// 处理异常
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
@DS(value = "#dataSourceType")
|
||||
default List<GrBiSaSetdtl> queryByIds(@Param("dataSourceType") String dataSourceType, Set<Integer> ids) {
|
||||
return this.selectBatchIds(ids);
|
||||
}
|
||||
|
||||
@DS(value = "#dataSourceType")
|
||||
default int save(@Param("dataSourceType") String dataSourceType, GrBiSaSetdtl grBiSaSetdtl) {
|
||||
return this.insert(grBiSaSetdtl);
|
||||
}
|
||||
|
||||
@DS(value = "#dataSourceType")
|
||||
default int update(@Param("dataSourceType") String dataSourceType, GrBiSaSetdtl grBiSaSetdtl) {
|
||||
return this.updateById(grBiSaSetdtl);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -72,5 +72,17 @@ public class ReportFieldVo extends ReportFieldIdVo {
|
||||
//隐藏列的,表单不显示该字段
|
||||
private String isHideCol;
|
||||
|
||||
//是否动态分组 Y|N
|
||||
private String isDynamicGroup;
|
||||
|
||||
//单元格宽度
|
||||
private String width;
|
||||
|
||||
//查询控件默认值
|
||||
private String searchDefaultValue;
|
||||
|
||||
//查询控件隐藏
|
||||
private String isHideSearch;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.lideeyunji.core.framework.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.lideeyunji.core.framework.entity.GrBiSaSetdtl;
|
||||
|
||||
public interface IGrBiSaSetdtlService extends IService<GrBiSaSetdtl> {
|
||||
|
||||
//同步销售明细表
|
||||
Integer saSetdtlSyncJob();
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
package com.lideeyunji.core.framework.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.lideeyunji.core.framework.entity.GrBiSaSetdtl;
|
||||
import com.lideeyunji.core.framework.mapper.GrBiSaSetdtlMapper;
|
||||
import com.lideeyunji.core.framework.service.IGrBiSaSetdtlService;
|
||||
import com.lideeyunji.tool.framework.common.constant.lideeYunJiBaseConstant;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class GrBiSaSetdtlServiceImpl extends ServiceImpl<GrBiSaSetdtlMapper, GrBiSaSetdtl> implements IGrBiSaSetdtlService {
|
||||
|
||||
/**
|
||||
* 同步销售明细表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Integer saSetdtlSyncJob() {
|
||||
//获取本地mysql数据库中表中UPDATE_TIME最新的数据
|
||||
GrBiSaSetdtl grBiSaSetdtl = this.baseMapper.getLastUpdated(lideeYunJiBaseConstant.DS_ERP_BI_DATA);
|
||||
|
||||
//本地不存在空的情况 之前会手动导入的情况
|
||||
//查询大于本地最大更新时间的oracle里的数据
|
||||
List<GrBiSaSetdtl> grBiSaSetdtlList = this.baseMapper.getByUpdateTime(lideeYunJiBaseConstant.DS_ORACLE_GRYYBI, grBiSaSetdtl.getUPDATETIME());
|
||||
|
||||
if (CollUtil.isEmpty(grBiSaSetdtlList)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//保存数据
|
||||
return this.saveSyncData(grBiSaSetdtlList);
|
||||
}
|
||||
|
||||
|
||||
//保存同步数据到本地
|
||||
@Transactional
|
||||
public Integer saveSyncData(List<GrBiSaSetdtl> grBiSaSetdtlList) {
|
||||
|
||||
//需要新增的数据
|
||||
List<GrBiSaSetdtl> needSaveList = grBiSaSetdtlList;
|
||||
List<GrBiSaSetdtl> needUpdateList = null;
|
||||
//校验哪些数据已经存在需要更新
|
||||
List<GrBiSaSetdtl> existList = this.baseMapper.queryByIds(lideeYunJiBaseConstant.DS_ERP_BI_DATA, grBiSaSetdtlList.stream().map(GrBiSaSetdtl::getSASETTLEDTLID).collect(Collectors.toSet()));
|
||||
if (CollUtil.isNotEmpty(existList)) {
|
||||
Set<Integer> needUpdateIdSet = existList.stream().map(GrBiSaSetdtl::getSASETTLEDTLID).collect(Collectors.toSet());
|
||||
needSaveList = grBiSaSetdtlList
|
||||
.stream()
|
||||
.filter(grBiSaSetdtl -> {
|
||||
return !needUpdateIdSet.contains(grBiSaSetdtl.getSASETTLEDTLID());
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
needUpdateList = grBiSaSetdtlList
|
||||
.stream()
|
||||
.filter(grBiSaSetdtl -> {
|
||||
return needUpdateIdSet.contains(grBiSaSetdtl.getSASETTLEDTLID());
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
//将orcale数据集合分割成100条一组、
|
||||
Integer result = 0;
|
||||
if (CollUtil.isNotEmpty(needSaveList)) {
|
||||
result += this.saveBatch(needSaveList);
|
||||
}
|
||||
if (CollUtil.isNotEmpty(needUpdateList)) {
|
||||
result += this.updateBatch(needUpdateList);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
//批量新增
|
||||
@Transactional
|
||||
public Integer saveBatch(List<GrBiSaSetdtl> grBiSaSetdtlList) {
|
||||
Integer result = 0;
|
||||
for (GrBiSaSetdtl grBiSaSetdtl : grBiSaSetdtlList) {
|
||||
int re = this.baseMapper.save(lideeYunJiBaseConstant.DS_ERP_BI_DATA, grBiSaSetdtl);
|
||||
if (re < 1) {
|
||||
throw new RuntimeException("批量新增异常");
|
||||
}
|
||||
result += re;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//批量更新
|
||||
@Transactional
|
||||
public Integer updateBatch(List<GrBiSaSetdtl> grBiSaSetdtlList) {
|
||||
Integer result = 0;
|
||||
for (GrBiSaSetdtl grBiSaSetdtl : grBiSaSetdtlList) {
|
||||
int re = this.baseMapper.update(lideeYunJiBaseConstant.DS_ERP_BI_DATA, grBiSaSetdtl);
|
||||
if (re < 1) {
|
||||
throw new RuntimeException("批量新增异常");
|
||||
}
|
||||
result += re;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -382,6 +382,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, ReportEntity> i
|
||||
entity.setIsFixedColumn(vo.getIsFixedColumn()); //2026-02-10 新增
|
||||
entity.setFixedColumnValue(vo.getFixedColumnValue()); //2026-02-10 新增
|
||||
entity.setIsHideCol(vo.getIsHideCol()); //2026.2.10 新增
|
||||
entity.setSearchDefaultValue(vo.getSearchDefaultValue());
|
||||
entity.setIsHideSearch(vo.getIsHideSearch());
|
||||
entity.setWidth(vo.getWidth());
|
||||
entity.setIsDynamicGroup(vo.getIsDynamicGroup());
|
||||
entity.setHasChildren(vo.getHasChildren());
|
||||
entity.setParentFieldCode(vo.getParentFieldCode());
|
||||
entity.setParentFieldName(vo.getParentFieldName());
|
||||
|
||||
@@ -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);
|
||||
// }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -70,13 +70,14 @@
|
||||
WHERE
|
||||
report.is_deleted = 0
|
||||
AND field.is_deleted = 0
|
||||
AND field.query_is_db = 'Y'
|
||||
-- AND field.query_is_db = 'Y'
|
||||
AND report.id = #{reportId}
|
||||
ORDER BY
|
||||
field.sort_num ASC,
|
||||
field.id ASC
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getExcelExportFieldList" resultType="map">
|
||||
SELECT
|
||||
df.field_code as "field_code",
|
||||
|
||||
@@ -97,6 +97,11 @@
|
||||
<groupId>com.tencentcloudapi</groupId>
|
||||
<artifactId>tencentcloud-sdk-java-sms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.yulichang</groupId>
|
||||
<artifactId>mybatis-plus-join-boot-starter</artifactId>
|
||||
<version>1.4.11</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.lideeyunji</groupId>
|
||||
<artifactId>lidee-module-api</artifactId>
|
||||
|
||||
@@ -6,7 +6,6 @@ import cn.hutool.core.util.StrUtil;
|
||||
import com.lideeyunji.service.system.config.convert.auth.AuthConvert;
|
||||
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.user.user.UserRespVO;
|
||||
import com.lideeyunji.service.system.entity.AdminUserDO;
|
||||
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.core.util.SecurityFrameworkUtils;
|
||||
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.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Parameters;
|
||||
@@ -160,6 +158,15 @@ public class AuthController {
|
||||
return success(authService.refreshToken(refreshToken));
|
||||
}
|
||||
|
||||
@PostMapping("/user-info")
|
||||
@PermitAll
|
||||
@Operation(tags = "根据token获取用户信息",summary = "根据token获取用户信息")
|
||||
@Parameter(name = "refreshToken", description = "根据token获取用户信息", required = true)
|
||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
||||
public CommonResult<AdminUserDO> getUerInfo(@RequestParam("refreshToken") String refreshToken) {
|
||||
return success(authService.getTokenTouserInfo(refreshToken));
|
||||
}
|
||||
|
||||
@GetMapping("/get-permission-info")
|
||||
@Operation(tags = "授权管理",summary = "获取登录用户的权限信息")
|
||||
public CommonResult<AuthPermissionInfoRespVO> getPermissionInfo() {
|
||||
|
||||
@@ -73,7 +73,7 @@ public class OAuth2ClientController {
|
||||
|
||||
@GetMapping("/myPage")
|
||||
@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) {
|
||||
PageResult<OAuth2ClientDO> pageResult = oAuth2ClientService.getMyPage(pageVO);
|
||||
return success(BeanUtils.toBean(pageResult, OAuth2ClientRespVO.class));
|
||||
|
||||
@@ -78,4 +78,6 @@ public interface IAdminAuthService {
|
||||
*/
|
||||
AuthLoginRespVO refreshToken(String refreshToken);
|
||||
|
||||
AdminUserDO getTokenTouserInfo(String refreshToken);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.lideeyunji.service.system.service;
|
||||
|
||||
import com.lideeyunji.service.system.entity.AdminUserDO;
|
||||
import com.lideeyunji.tool.framework.common.pojo.PageResult;
|
||||
import com.lideeyunji.service.system.controller.vo.oauth2.token.OAuth2AccessTokenPageReqVO;
|
||||
import com.lideeyunji.service.system.entity.OAuth2AccessTokenDO;
|
||||
@@ -41,6 +42,10 @@ public interface IOAuth2TokenService {
|
||||
*/
|
||||
OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId);
|
||||
|
||||
AdminUserDO getTokenTouserInfo(String refreshToken);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 获得访问令牌
|
||||
*
|
||||
|
||||
@@ -362,6 +362,15 @@ public class AdminAuthServiceImpl implements IAdminAuthService {
|
||||
return AuthConvert.INSTANCE.convert(accessTokenDO);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public AdminUserDO getTokenTouserInfo(String refreshToken) {
|
||||
AdminUserDO user= oauth2TokenService.getTokenTouserInfo(refreshToken);
|
||||
return user;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void logout(String token, Integer logType) {
|
||||
// 删除访问令牌
|
||||
|
||||
@@ -61,6 +61,7 @@ public class OAuth2TokenServiceImpl implements IOAuth2TokenService {
|
||||
@Lazy // 懒加载,避免循环依赖
|
||||
private IAdminUserService adminUserService;
|
||||
|
||||
|
||||
@Override
|
||||
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);
|
||||
@@ -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
|
||||
public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) {
|
||||
boolean supAdmin = SecurityFrameworkUtils.isSupAdmin();
|
||||
@@ -110,6 +121,12 @@ public class OAuth2TokenServiceImpl implements IOAuth2TokenService {
|
||||
return createOAuth2AccessToken(refreshTokenDO, clientDO, supAdmin);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public OAuth2AccessTokenDO getAccessToken(String accessToken) {
|
||||
// 优先从 Redis 中获取
|
||||
|
||||
@@ -9,6 +9,8 @@ public interface lideeYunJiBaseConstant {
|
||||
//多数据源
|
||||
String DS_lideeyunji="lideeyunji";//低代码
|
||||
String DS_MASTER="master";//主服务
|
||||
String DS_ORACLE_GRYYBI="oracle_gryybi";//报表平台 oracle
|
||||
String DS_ERP_BI_DATA="erp_bi_data";//报表平台 mysql
|
||||
|
||||
String REQUEST_URL_START="/lideeyunji";//公共请求
|
||||
String BASE_PACKAGES="com.lideeyunji";//公共包名称
|
||||
|
||||
Reference in New Issue
Block a user