47 Commits

Author SHA1 Message Date
hardy.liu
8bae1cbd35 销售明细表定时任务 2026-03-06 15:00:08 +08:00
chy
ee7510f41e 修改统一身份认证 2026-03-02 15:15:41 +08:00
chy
44279d9637 修改统一身份认证 2026-03-02 10:34:45 +08:00
860afb9812 Merge pull request '新增字段' (#23) from dpx20260211 into master
Reviewed-on: #23
2026-02-28 08:44:07 +08:00
dongpx
0ef88ce81d 新增字段 2026-02-28 08:24:32 +08:00
1b81782767 Merge pull request '应用查询按字典排序值排序' (#21) from main_hhl0209 into master
Reviewed-on: #21
2026-02-25 14:01:54 +08:00
432feb11d2 Merge pull request 'dpx20260211' (#22) from dpx20260211 into master
Reviewed-on: #22
2026-02-25 14:01:28 +08:00
c4ea4650bf Merge branch 'master' into main_hhl0209 2026-02-25 14:00:25 +08:00
dongpx
1173de364c 新增字段 2026-02-25 10:06:15 +08:00
chy
79cb1297db 修改认证 2026-02-22 21:40:47 +08:00
dongpx
7fb9543604 新增字段 2026-02-14 00:38:17 +08:00
dongpx
bac75778ad 修改字段长度 2026-02-12 11:45:36 +08:00
dongpx
3dd11b9f37 新增字段 2026-02-12 08:38:19 +08:00
chy
f940b2a911 新增文档 2026-02-11 14:58:26 +08:00
huhanlin
0cc088c51b 应用查询按字典排序值排序 2026-02-11 14:42:09 +08:00
869ef2cd8b Merge pull request 'ceshi' (#20) from dpx20260211 into master
Reviewed-on: #20
2026-02-11 11:35:01 +08:00
dongpx
35d708612e ceshi 2026-02-11 11:33:57 +08:00
chy
dcb15b1aa7 是否隐藏列 2026-02-11 11:18:38 +08:00
chy
390172f426 合并hhl代码 2026-02-11 10:11:14 +08:00
chy
0f61e5b8f2 Merge remote-tracking branch '20260209/main_hhl0209'
# Conflicts:
#	lidee-admin/src/main/resources/application-local.yaml
2026-02-11 10:10:27 +08:00
huhanlin
909d9625cd 获得角色拥有的应用id接口权限修改 2026-02-10 15:21:16 +08:00
huhanlin
cd7bb5ccc5 应用权限功能 2026-02-10 14:22:55 +08:00
chy
bb986102f3 修改配置代码 2026-02-10 10:50:32 +08:00
chy
2cae542098 新增维度隐藏字段 2026-02-10 10:42:42 +08:00
chy
549da7ec80 应用表单增加回调url和应用分类字段,重定向url改为单个字符串 2026-02-10 10:35:11 +08:00
chy
8b9f4a5013 修改代码 2026-02-10 00:19:46 +08:00
chy
e0dd2a59ec 合并董潘祥冲突 2026-02-09 23:45:51 +08:00
chy
da95ddf810 合并董潘祥冲突 2026-02-09 23:44:07 +08:00
chy
c8b73763bb Merge branch 'main' of http://8.130.49.250:3000/admin/gr_report_java
# Conflicts:
#	lidee-admin/src/main/resources/application-local.yaml
#	lidee-admin/target/classes/application-local.yaml
#	lidee-service/lidee-service-system-biz/src/main/java/com/lideeyunji/service/system/entity/OAuth2ClientDO.java
#	lidee-service/lidee-service-system-biz/src/main/java/com/lideeyunji/service/system/service/impl/OAuth2ClientServiceImpl.java
2026-02-09 23:43:07 +08:00
chy
72331c5e1e 合并20260204分支 2026-02-09 23:34:56 +08:00
chy
fa8c84f349 Merge branch '20260204'
# Conflicts:
#	.idea/compiler.xml
#	.idea/vcs.xml
#	lidee-admin/src/main/resources/application-local.yaml
#	lidee-admin/target/classes/application-local.yaml
#	lidee-admin/target/lidee-admin.jar
#	lidee-admin/target/lidee-admin.jar.original
#	lidee-admin/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-core/src/main/java/com/lideeyunji/core/framework/entity/ReportFieldEntity.java
#	lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/ReportServiceImpl.java
#	lidee-core/target/classes/com/lideeyunji/core/framework/entity/ReportFieldEntity.class
#	lidee-core/target/classes/com/lideeyunji/core/framework/service/impl/ReportServiceImpl.class
#	lidee-core/target/lidee-core-2.2.4.jar
#	lidee-core/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-module/lidee-module-api/target/lidee-module-api-2.2.4.jar
#	lidee-module/lidee-module-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-module/lidee-module-biz/target/lidee-module-biz-2.2.4.jar
#	lidee-module/lidee-module-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-service/lidee-service-infra-api/target/lidee-service-infra-api-2.2.4.jar
#	lidee-service/lidee-service-infra-biz/target/lidee-service-infra-biz-2.2.4.jar
#	lidee-service/lidee-service-system-api/target/lidee-service-system-api-2.2.4.jar
#	lidee-service/lidee-service-system-biz/target/lidee-service-system-biz-2.2.4.jar
#	lidee-tool/tool-common/target/tool-common-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-ai/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-tool/tool-spring-boot-starter-ai/target/tool-spring-boot-starter-ai-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-captcha/target/tool-spring-boot-starter-captcha-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-dict/target/tool-spring-boot-starter-dict-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-excel/target/tool-spring-boot-starter-excel-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-exception/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-tool/tool-spring-boot-starter-exception/target/tool-spring-boot-starter-exception-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-tool/tool-spring-boot-starter-file/target/tool-spring-boot-starter-file-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-flowable/target/tool-spring-boot-starter-flowable-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-ip/target/tool-spring-boot-starter-ip-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-job/target/tool-spring-boot-starter-job-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-monitor/target/tool-spring-boot-starter-monitor-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-mybatis/target/tool-spring-boot-starter-mybatis-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-operatelog/target/tool-spring-boot-starter-operatelog-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-permission/target/tool-spring-boot-starter-permission-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-protection/target/tool-spring-boot-starter-protection-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-redis/target/tool-spring-boot-starter-redis-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-security/target/tool-spring-boot-starter-security-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-sql/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-tool/tool-spring-boot-starter-sql/target/tool-spring-boot-starter-sql-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-tool/tool-spring-boot-starter-tenant/target/tool-spring-boot-starter-tenant-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-test/target/tool-spring-boot-starter-test-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-web/target/tool-spring-boot-starter-web-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-websocket/target/tool-spring-boot-starter-websocket-2.2.4.jar
#	lidee-tool/tool-spring-boot-starter-yunji/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
#	lidee-tool/tool-spring-boot-starter-yunji/target/tool-spring-boot-starter-yunji-2.2.4.jar
#	logs/lideeyunji-error.log
#	logs/lideeyunji-info.log
2026-02-09 23:30:06 +08:00
e70fa733ef Merge pull request 'main_hhl0209' (#10) from main_hhl0209 into main
Reviewed-on: #10
2026-02-09 23:12:58 +08:00
dongpx
246591bb1c Signed-off-by: dongpx <2112323174@qq.com> 2026-02-09 20:12:51 +08:00
huhanlin
56e09151e4 应用表单增加回调url和应用分类字段,重定向url改为单个字符串 2026-02-09 14:50:42 +08:00
huhanlin
7a9ae35c18 测试提交 2026-02-09 12:17:06 +08:00
dongpx
8c97c0f934 Signed-off-by: dongpx <2112323174@qq.com> 2026-02-08 22:22:27 +08:00
dongpx
b629c574f1 Changes 2026-02-08 22:20:56 +08:00
dongpx
918ec6c498 Changes 2026-02-05 13:20:41 +08:00
chy
81bc9757eb Merge remote-tracking branch 'remotes/origin/20260204'
# Conflicts:
#	lidee-core/target/classes/com/lideeyunji/core/framework/service/impl/FrameServiceImpl.class
#	lidee-service/lidee-service-infra-biz/target/generated-sources/annotations/com/lideeyunji/service/infra/config/convert/codegen/CodegenConvertImpl.java
#	lidee-service/lidee-service-infra-biz/target/generated-sources/annotations/com/lideeyunji/service/infra/config/convert/config/ConfigConvertImpl.java
#	lidee-service/lidee-service-infra-biz/target/generated-sources/annotations/com/lideeyunji/service/infra/config/convert/file/FileConfigConvertImpl.java
#	lidee-service/lidee-service-infra-biz/target/generated-sources/annotations/com/lideeyunji/service/infra/config/convert/redis/RedisConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/auth/AuthConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/logger/OperateLogConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/mail/MailAccountConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/oauth2/OAuth2OpenConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/social/SocialUserConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/tenant/TenantConvertImpl.java
#	lidee-service/lidee-service-system-biz/target/generated-sources/annotations/com/lideeyunji/service/system/config/convert/user/UserConvertImpl.java
2026-02-05 13:15:03 +08:00
chy
92674cff52 Merge branch 'main' of http://8.130.49.250:3000/admin/gr_report_java
Signed-off-by: chy <chy@163.com>
2026-02-05 13:12:17 +08:00
dongpx
b7ebd3778d Signed-off-by: dongpx <2112323174@qq.com> 2026-02-05 10:37:57 +08:00
chy
4f0e1bc860 Merge branch 'main' of http://8.130.49.250:3000/admin/gr_report_java
# Conflicts:
#	lidee-core/src/main/java/com/lideeyunji/core/framework/entity/ReportFieldEntity.java
#	lidee-core/src/main/java/com/lideeyunji/core/framework/service/impl/ReportServiceImpl.java
#	lidee-core/target/classes/com/lideeyunji/core/framework/entity/ReportFieldEntity.class
#	lidee-core/target/classes/com/lideeyunji/core/framework/service/impl/ReportServiceImpl.class
2026-02-05 07:22:03 +08:00
dongpx
a1c91f2959 测试提交分支
Signed-off-by: dongpx <2112323174@qq.com>
2026-02-04 11:05:43 +08:00
dongpx
4cf2e2e90c 更新
Signed-off-by: dongpx <2112323174@qq.com>
2026-02-04 11:00:05 +08:00
dongpx
3c9eb35f2c Signed-off-by: dongpx <2112323174@qq.com> 2026-02-04 10:55:43 +08:00
chy
e392221045 更新董潘祥代码 2026-02-03 15:50:37 +08:00
chy
1c212fb3b3 Signed-off-by: chy <chy@163.com> 2026-02-02 23:21:53 +08:00
42 changed files with 848 additions and 51 deletions

View File

@@ -0,0 +1,36 @@
日期2026-02-20新增表
新增表xxx_demo附件表说明到doc内
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
日期2026-02-21新增字段
表名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 查询控件是否隐藏

View File

@@ -9,23 +9,43 @@ spring:
datasource:
master:
# 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
password: root
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
password: root
slave: # 日志库单独
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
password: root
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 连接的示例
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
password: root
# redis:
# host: 127.0.0.1 # 地址
# port: 6379 # 端口
# database: 2 # 数据库索引
# password: lidee@123 # 密码,建议生产环境开启
redis:
host: 127.0.0.1 # 地址
host: 192.168.126.128 # 地址
port: 6379 # 端口
database: 2 # 数据库索引
password: lidee@123 # 密码,建议生产环境开启
password: 123456 # 密码,建议生产环境开启
--- #################### 地代码平台相关配置 ####################

View File

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

View File

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

View File

@@ -45,8 +45,6 @@ public class FrameWorkAdapter implements IlideeYunjiAdapter {
@Autowired
private IFrameSqlService sqlService;
@Autowired
private AdapterMapper adapterMapper;

View File

@@ -7,7 +7,6 @@ import com.lideeyunji.core.framework.service.IFrameService;
import com.lideeyunji.tool.framework.yunji.model.ResultDataModel;
import com.lideeyunji.tool.framework.yunji.tool.spring.SpringUtils;
import java.util.List;
import java.util.Map;
/**
@@ -34,9 +33,6 @@ public class ButtonReceiverReportList implements IButtonCommandReceiver<ResultDa
String reportCode = param.getReportCode();
Page page = param.getPage();
Map<String, Object> params = param.getParams();
// 分组集合--测试数据
// String[] Groupbylist={"zonename","customname"};
// List<String> Groupbylist=param
IFrameService frameService = SpringUtils.getBean(IFrameService.class);
ResultDataModel reportDataPage = frameService.getReportDataList(reportCode, page, params);

View File

@@ -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
*/
@Component
@Slf4j
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;
}
}

View File

@@ -1,4 +1,3 @@
package com.lideeyunji.core.framework.controller;
import com.lideeyunji.core.framework.config.aspect.enhancereport.enums.RefreshPluginEnums;
@@ -57,7 +56,7 @@ public class ReportController extends BaseController {
@ApiOperationSupport(order = 2)
@Operation(tags = "报表统计",summary = "数据报表 - 修改")
public BaseWebResult updateDbFormConfig(@RequestBody ReportAddOrUpdateParam param) {
Long reportId = param.getReport().getId();
Long reportId = param.getReport().getId();
ReportEntity oldEntity = reportService.getReportEntityById(reportId);
String oldJavaConfig = oldEntity.getJavaConfig();
String newJavaConfig = param.getReport().getJavaConfig();

View File

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

View File

@@ -95,9 +95,29 @@ public class ReportFieldEntity extends BaseTenantEntity {
//父字段名称
private String parentFieldName;
//是否隐藏维度
private String isHideDimension;
//是否是固定列 Y|N
private String isFixedColumn;
//固定列的值
private String fixedColumnValue;
//隐藏列的,表单不显示该字段
private String isHideCol;
//是否动态分组 Y|N
private String isDynamicGroup;
//单元格宽度
private String width;
//查询控件默认值
private String searchDefaultValue;
//查询控件隐藏
private String isHideSearch;
}

View File

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

View File

@@ -59,5 +59,30 @@ public class ReportFieldVo extends ReportFieldIdVo {
//父字段名称
private String parentFieldName;
//是否隐藏维度
private String isHideDimension;
//是否是固定列 Y|N
private String isFixedColumn;
//固定列的值
private String fixedColumnValue;
//隐藏列的,表单不显示该字段
private String isHideCol;
//是否动态分组 Y|N
private String isDynamicGroup;
//单元格宽度
private String width;
//查询控件默认值
private String searchDefaultValue;
//查询控件隐藏
private String isHideSearch;
}

View File

@@ -7,7 +7,6 @@ import com.lideeyunji.tool.framework.yunji.model.ExecuteEnhanceModel;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.sf.jsqlparser.JSQLParserException;
import javax.swing.*;
import java.util.List;
import java.util.Map;
@@ -80,5 +79,4 @@ public interface IFrameService {
//获取数据表数据 -分页
ResultDataModel getReportDataList(String reportCode, Page page, Map<String, Object> params);
}

View File

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

View File

@@ -651,8 +651,6 @@ public class FrameServiceImpl implements IFrameService {
}
/**
* 单个保存
*

View File

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

View File

@@ -378,6 +378,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, ReportEntity> i
entity.setIsExport(vo.getIsExport());
entity.setIsShowSort(vo.getIsShowSort());
entity.setIsDimension(vo.getIsDimension());
entity.setIsHideDimension(vo.getIsHideDimension());
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());

View File

@@ -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",

View File

@@ -72,7 +72,7 @@ public class ConfigController {
@GetMapping(value = "/get-value-by-key")
@Operation(tags = "参数配置",summary = "根据参数键名查询参数值", description = "不可见的配置,不允许返回给前端")
@Parameter(name = "key", description = "参数键", required = true, example = "yunai.biz.username")
@Parameter(name = "key", description = "参数键", required = true, example = "lidee.biz.username")
public CommonResult<String> getConfigKey(@RequestParam("key") String key) {
ConfigDO config = configService.getConfigByKey(key);
if (config == null) {

View File

@@ -20,7 +20,7 @@ public class ConfigPageReqVO extends PageParam {
@Schema(description = "数据源名称,模糊匹配", example = "名称")
private String name;
@Schema(description = "参数键名,模糊匹配", example = "yunai.db.username")
@Schema(description = "参数键名,模糊匹配", example = "lidee.db.username")
private String key;
@Schema(description = "参数类型,参见 SysConfigTypeEnum 枚举", example = "1")

View File

@@ -27,7 +27,7 @@ public class ConfigRespVO {
@ExcelProperty("参数名称")
private String name;
@Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yunai.db.username")
@Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "lidee.db.username")
@ExcelProperty("参数键名")
private String key;

View File

@@ -25,7 +25,7 @@ public class ConfigSaveReqVO {
@Size(max = 100, message = "参数名称不能超过 100 个字符")
private String name;
@Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "yunai.db.username")
@Schema(description = "参数键名", requiredMode = Schema.RequiredMode.REQUIRED, example = "lidee.db.username")
@NotBlank(message = "参数键名长度不能为空")
@Size(max = 100, message = "参数键名长度不能超过 100 个字符")
private String key;

View File

@@ -120,6 +120,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>

View File

@@ -160,6 +160,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<AuthLoginRespVO> getUerInfo(@RequestParam("refreshToken") String refreshToken) {
return success(authService.refreshToken(refreshToken));
}
@GetMapping("/get-permission-info")
@Operation(tags = "授权管理",summary = "获取登录用户的权限信息")
public CommonResult<AuthPermissionInfoRespVO> getPermissionInfo() {

View File

@@ -1,13 +1,14 @@
package com.lideeyunji.service.system.controller;
import com.lideeyunji.tool.framework.common.pojo.CommonResult;
import com.lideeyunji.tool.framework.common.pojo.PageResult;
import com.lideeyunji.tool.framework.common.util.object.BeanUtils;
import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientPageReqVO;
import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientRespVO;
import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientSaveReqVO;
import com.lideeyunji.service.system.entity.OAuth2ClientDO;
import com.lideeyunji.service.system.service.IAdminUserService;
import com.lideeyunji.service.system.service.IOAuth2ClientService;
import com.lideeyunji.tool.framework.common.pojo.CommonResult;
import com.lideeyunji.tool.framework.common.pojo.PageResult;
import com.lideeyunji.tool.framework.common.util.object.BeanUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -70,4 +71,12 @@ public class OAuth2ClientController {
return success(BeanUtils.toBean(pageResult, OAuth2ClientRespVO.class));
}
@GetMapping("/myPage")
@Operation(tags = "OAuth2.0管理",summary = "获得用户角色下 OAuth2 客户端分页")
@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));
}
}

View File

@@ -1,6 +1,7 @@
package com.lideeyunji.service.system.controller;
import cn.hutool.core.collection.CollUtil;
import com.lideeyunji.service.system.service.IClientPermissionService;
import com.lideeyunji.tool.framework.common.pojo.CommonResult;
import com.lideeyunji.service.system.controller.vo.permission.permission.PermissionAssignRoleDataScopeReqVO;
import com.lideeyunji.service.system.controller.vo.permission.permission.PermissionAssignRoleMenuReqVO;
@@ -34,6 +35,8 @@ public class PermissionController {
private IPermissionService permissionService;
@Resource
private ITenantService tenantService;
@Resource
private IClientPermissionService clientPermissionService;
@Operation(tags = "菜单管理",summary = "获得角色拥有的菜单编号")
@Parameter(name = "roleId", description = "角色编号", required = true)
@@ -79,4 +82,20 @@ public class PermissionController {
return success(true);
}
@PostMapping("/assign-role-client")
@Operation(tags = "角色管理",summary = "赋予角色应用")
@PreAuthorize("@ss.hasPermission('system:permission:assign-role-app')")
public CommonResult<Boolean> assignRoleClient(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) {
permissionService.assignRoleClient(reqVO.getRoleId(), reqVO.getClientIds());
return success(true);
}
@Operation(tags = "角色管理",summary = "获得角色拥有的应用id")
@Parameter(name = "roleId", description = "角色编号", required = true)
@GetMapping("/list-role-clients")
@PreAuthorize("@ss.hasPermission('system:permission:assign-role-app')")
public CommonResult<Set<Long>> getRoleClientList(Long roleId) {
return success(clientPermissionService.getRoleClientListByRoleId(roleId));
}
}

View File

@@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import com.lideeyunji.tool.framework.common.pojo.PageParam;
import java.util.Set;
@Schema(description = "管理后台 - OAuth2 客户端分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@@ -16,4 +18,7 @@ public class OAuth2ClientPageReqVO extends PageParam {
@Schema(description = "状态,参见 CommonStatusEnum 枚举", example = "1")
private Integer status;
@Schema(description = "应用id", example = "[1]")
private Set<Long> ids;
}

View File

@@ -22,7 +22,10 @@ public class OAuth2ClientRespVO {
@Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆")
private String name;
@Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.lidee.cn/xx.png")
@Schema(description = "应用分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "category1")
private String category;
@Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png")
private String logo;
@Schema(description = "应用描述", example = "我是一个应用")
@@ -37,8 +40,11 @@ public class OAuth2ClientRespVO {
@Schema(description = "刷新令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640000")
private Integer refreshTokenValiditySeconds;
@Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.lidee.cn")
private List<String> redirectUris;
// @Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
// private List<String> redirectUris;
@Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
private String redirectUris;
@Schema(description = "授权类型,参见 OAuth2GrantTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "password")
private List<String> authorizedGrantTypes;
@@ -55,7 +61,10 @@ public class OAuth2ClientRespVO {
@Schema(description = "资源", example = "1024")
private List<String> resourceIds;
@Schema(description = "附加信息", example = "{yunai: true}")
@Schema(description = "回调URI地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
private String callbackUris;
@Schema(description = "附加信息", example = "{lidee: true}")
private String additionalInformation;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)

View File

@@ -30,7 +30,11 @@ public class OAuth2ClientSaveReqVO {
@NotNull(message = "应用名不能为空")
private String name;
@Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.lidee.cn/xx.png")
@Schema(description = "应用分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "category1")
@NotNull(message = "应用分类不能为空")
private String category;
@Schema(description = "应用图标", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png")
@NotNull(message = "应用图标不能为空")
@URL(message = "应用图标的地址不正确")
private String logo;
@@ -46,14 +50,18 @@ public class OAuth2ClientSaveReqVO {
@NotNull(message = "访问令牌的有效期不能为空")
private Integer accessTokenValiditySeconds;
@Schema(description = "刷新令牌的有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8640000")
@NotNull(message = "刷新令牌的有效期不能为空")
private Integer refreshTokenValiditySeconds;
@Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.lidee.cn")
// @Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
// @NotNull(message = "可重定向的 URI 地址不能为空")
// private List<@NotEmpty(message = "重定向的 URI 不能为空") @URL(message = "重定向的 URI 格式不正确") String> redirectUris;
@Schema(description = "可重定向的 URI 地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
@NotNull(message = "可重定向的 URI 地址不能为空")
private List<@NotEmpty(message = "重定向的 URI 不能为空") @URL(message = "重定向的 URI 格式不正确") String> redirectUris;
private String redirectUris;
@Schema(description = "授权类型,参见 OAuth2GrantTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "password")
@NotNull(message = "授权类型不能为空")
@@ -71,9 +79,12 @@ public class OAuth2ClientSaveReqVO {
@Schema(description = "资源", example = "1024")
private List<String> resourceIds;
@Schema(description = "附加信息", example = "{yunai: true}")
@Schema(description = "附加信息", example = "{lidee: true}")
private String additionalInformation;
@Schema(description = "回调URI地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
private String callbackUris;
@AssertTrue(message = "附加信息必须是 JSON 格式")
public boolean isAdditionalInformationJson() {
return StrUtil.isEmpty(additionalInformation) || JsonUtils.isJson(additionalInformation);

View File

@@ -18,4 +18,7 @@ public class PermissionAssignRoleMenuReqVO {
@Schema(description = "菜单编号列表", example = "1,3,5")
private Set<Long> menuIds = Collections.emptySet(); // 兜底
@Schema(description = "应用id列表", example = "1,3,5")
private Set<Long> clientIds = Collections.emptySet();
}

View File

@@ -43,6 +43,11 @@ public class OAuth2ClientDO extends BaseDO {
* 应用名
*/
private String name;
/**
* 应用分类
*/
private String category;
/**
* 应用图标
*/
@@ -65,11 +70,14 @@ public class OAuth2ClientDO extends BaseDO {
* 刷新令牌的有效期
*/
private Integer refreshTokenValiditySeconds;
/**
* 可重定向的 URI 地址
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> redirectUris;
// /**
// * 可重定向的 URI 地址
// */
// @TableField(typeHandler = JacksonTypeHandler.class)
// private List<String> redirectUris;
private String redirectUris;
/**
* 授权类型(模式)
*
@@ -99,6 +107,12 @@ public class OAuth2ClientDO extends BaseDO {
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> resourceIds;
/**
* 回调URI地址
*/
private String callbackUris;
/**
* 附加信息JSON 格式
*/

View File

@@ -0,0 +1,34 @@
package com.lideeyunji.service.system.entity;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.lideeyunji.tool.framework.mybatis.core.dataobject.BaseDO;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* OAuth2 客户端和角色关联
*
*/
@TableName(value = "system_role_oauth2_client", autoResultMap = true)
@KeySequence("system_role_oauth2_client_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
public class RoleOAuth2ClientDO extends BaseDO {
/**
* 自增主键
*/
@TableId
private Long id;
/**
* 角色ID
*/
private Long roleId;
/**
* 菜单ID
*/
private Long oauthClientId;
}

View File

@@ -0,0 +1,59 @@
package com.lideeyunji.service.system.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientPageReqVO;
import com.lideeyunji.service.system.entity.DictDataDO;
import com.lideeyunji.service.system.entity.OAuth2ClientDO;
import com.lideeyunji.tool.framework.common.pojo.PageResult;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OAuth2ClientJoinMapper extends MPJBaseMapper<OAuth2ClientDO> {
/**
* 分页查询(关联字典表)
*/
default PageResult<OAuth2ClientDO> selectPage(OAuth2ClientPageReqVO reqVO) {
MPJLambdaWrapper<OAuth2ClientDO> wrapper = buildQueryWrapper(reqVO);
com.baomidou.mybatisplus.extension.plugins.pagination.Page<OAuth2ClientDO> page =
new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(
reqVO.getPageNo(),
reqVO.getPageSize()
);
com.baomidou.mybatisplus.extension.plugins.pagination.Page<OAuth2ClientDO> resultPage =
selectJoinPage(page, OAuth2ClientDO.class, wrapper);
return new PageResult<>(resultPage.getRecords(), resultPage.getTotal());
}
default MPJLambdaWrapper<OAuth2ClientDO> buildQueryWrapper(OAuth2ClientPageReqVO reqVO) {
MPJLambdaWrapper<OAuth2ClientDO> wrapper = new MPJLambdaWrapper<OAuth2ClientDO>()
.selectAll(OAuth2ClientDO.class)
.leftJoin(DictDataDO.class, on -> on
.eq(DictDataDO::getValue, OAuth2ClientDO::getCategory)
.eq(DictDataDO::getDictType, "app_category"));
applyQueryConditions(wrapper, reqVO);
wrapper.orderByAsc(DictDataDO::getSort)
.orderByDesc(OAuth2ClientDO::getId);
return wrapper;
}
default void applyQueryConditions(MPJLambdaWrapper<OAuth2ClientDO> wrapper, OAuth2ClientPageReqVO reqVO) {
if (reqVO.getName() != null && !reqVO.getName().isEmpty()) {
wrapper.like(OAuth2ClientDO::getName, reqVO.getName());
}
if (reqVO.getStatus() != null) {
wrapper.eq(OAuth2ClientDO::getStatus, reqVO.getStatus());
}
if (reqVO.getIds() != null && !reqVO.getIds().isEmpty()) {
wrapper.in(OAuth2ClientDO::getId, reqVO.getIds());
}
}
}

View File

@@ -7,6 +7,8 @@ import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientPag
import com.lideeyunji.service.system.entity.OAuth2ClientDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* OAuth2 客户端 Mapper
@@ -20,6 +22,8 @@ public interface OAuth2ClientMapper extends BaseMapperX<OAuth2ClientDO> {
return selectPage(reqVO, new LambdaQueryWrapperX<OAuth2ClientDO>()
.likeIfPresent(OAuth2ClientDO::getName, reqVO.getName())
.eqIfPresent(OAuth2ClientDO::getStatus, reqVO.getStatus())
.neIfPresent(OAuth2ClientDO::getClientId, "default")
.inIfPresent(OAuth2ClientDO::getId, reqVO.getIds())
.orderByDesc(OAuth2ClientDO::getId));
}
@@ -27,4 +31,9 @@ public interface OAuth2ClientMapper extends BaseMapperX<OAuth2ClientDO> {
return selectOne(OAuth2ClientDO::getClientId, clientId);
}
default List<OAuth2ClientDO> selectEnableList() {
return selectList(new LambdaQueryWrapperX<OAuth2ClientDO>()
.eq(OAuth2ClientDO::getStatus, 0));
}
}

View File

@@ -0,0 +1,36 @@
package com.lideeyunji.service.system.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lideeyunji.service.system.entity.RoleOAuth2ClientDO;
import com.lideeyunji.tool.framework.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
import java.util.Collection;
import java.util.List;
@Mapper
public interface RoleOAuth2ClientMapper extends BaseMapperX<RoleOAuth2ClientDO> {
default List<RoleOAuth2ClientDO> selectListByRoleId(Long roleId) {
return selectList(RoleOAuth2ClientDO::getRoleId, roleId);
}
default List<RoleOAuth2ClientDO> selectListByRoleId(Collection<Long> roleIds) {
return selectList(RoleOAuth2ClientDO::getRoleId, roleIds);
}
default List<RoleOAuth2ClientDO> selectListByMenuId(Long clientId) {
return selectList(RoleOAuth2ClientDO::getOauthClientId, clientId);
}
default void deleteListByRoleIdAndOauthClientId(Long roleId, Collection<Long> clientIds) {
delete(new LambdaQueryWrapper<RoleOAuth2ClientDO>()
.eq(RoleOAuth2ClientDO::getRoleId, roleId)
.in(RoleOAuth2ClientDO::getOauthClientId, clientIds));
}
default void deleteListByRoleId(Long roleId) {
delete(new LambdaQueryWrapper<RoleOAuth2ClientDO>().eq(RoleOAuth2ClientDO::getRoleId, roleId));
}
}

View File

@@ -0,0 +1,20 @@
package com.lideeyunji.service.system.service;
import java.util.Collection;
import java.util.Set;
import static java.util.Collections.singleton;
/**
* 应用权限接口
*/
public interface IClientPermissionService {
/**
* 获得角色拥有的应用id集合
*
* @param roleId 角色编号
* @return 应用id集合
*/
default Set<Long> getRoleClientListByRoleId(Long roleId) {
return getRoleClientListByRoleId(singleton(roleId));
}
Set<Long> getRoleClientListByRoleId(Collection<Long> roleIds);
}

View File

@@ -7,6 +7,7 @@ import com.lideeyunji.service.system.entity.OAuth2ClientDO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
* OAuth2.0 Client Service 接口
@@ -63,6 +64,14 @@ public interface IOAuth2ClientService {
*/
PageResult<OAuth2ClientDO> getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO);
/**
* 获得 OAuth2 客户端分页
*
* @param pageReqVO 分页查询
* @return OAuth2 客户端分页
*/
PageResult<OAuth2ClientDO> getMyPage(OAuth2ClientPageReqVO pageReqVO);
/**
* 从缓存中,校验客户端是否合法
*
@@ -87,4 +96,10 @@ public interface IOAuth2ClientService {
OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, String authorizedGrantType,
Collection<String> scopes, String redirectUri);
/**
* 获取所有启用应用
* @return 应用列表
*/
List<OAuth2ClientDO> getAllEnableClient();
}

View File

@@ -152,4 +152,12 @@ public interface IPermissionService {
//清除缓存
Boolean clearCache(Long userId);
/**
* 设置角色应用
*
* @param roleId 角色编号
* @param clientIds 应用集合id
*/
void assignRoleClient(Long roleId, Set<Long> clientIds);
}

View File

@@ -0,0 +1,51 @@
package com.lideeyunji.service.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.lideeyunji.service.system.entity.OAuth2ClientDO;
import com.lideeyunji.service.system.entity.RoleOAuth2ClientDO;
import com.lideeyunji.service.system.mapper.RoleOAuth2ClientMapper;
import com.lideeyunji.service.system.service.IClientPermissionService;
import com.lideeyunji.service.system.service.IOAuth2ClientService;
import com.lideeyunji.service.system.service.IRoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static com.lideeyunji.tool.framework.common.util.collection.CollectionUtils.convertSet;
@Service
@Validated
@Slf4j
public class ClientPermissionServiceImpl implements IClientPermissionService {
@Resource
private RoleOAuth2ClientMapper roleOAuth2ClientMapper;
@Resource
private IRoleService roleService;
@Lazy
@Resource
private IOAuth2ClientService ioAuth2ClientService;
public Set<Long> getRoleClientListByRoleId(Collection<Long> roleIds) {
if (CollUtil.isEmpty(roleIds)) {
return Collections.emptySet();
}
if (roleService.hasAnySuperAdmin(roleIds)) {
List<OAuth2ClientDO> allEnableClient = ioAuth2ClientService.getAllEnableClient();
return Optional.ofNullable(allEnableClient)
.map(all -> all.stream()
.map(OAuth2ClientDO::getId)
.collect(Collectors.toSet()))
.orElse(new HashSet<>());
}
return convertSet(roleOAuth2ClientMapper.selectListByRoleId(roleIds),
RoleOAuth2ClientDO::getOauthClientId);
}
}

View File

@@ -4,17 +4,22 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.lideeyunji.tool.framework.common.enums.CommonStatusEnum;
import com.lideeyunji.tool.framework.common.pojo.PageResult;
import com.lideeyunji.tool.framework.common.util.object.BeanUtils;
import com.lideeyunji.tool.framework.common.util.string.StrUtils;
import com.google.common.annotations.VisibleForTesting;
import com.lideeyunji.service.system.config.redis.RedisKeyConstants;
import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientPageReqVO;
import com.lideeyunji.service.system.controller.vo.oauth2.client.OAuth2ClientSaveReqVO;
import com.lideeyunji.service.system.entity.OAuth2ClientDO;
import com.lideeyunji.service.system.entity.UserRoleDO;
import com.lideeyunji.service.system.mapper.OAuth2ClientJoinMapper;
import com.lideeyunji.service.system.mapper.OAuth2ClientMapper;
import com.lideeyunji.service.system.config.redis.RedisKeyConstants;
import com.lideeyunji.service.system.service.IAdminUserService;
import com.lideeyunji.service.system.service.IClientPermissionService;
import com.lideeyunji.service.system.service.IOAuth2ClientService;
import com.google.common.annotations.VisibleForTesting;
import com.lideeyunji.service.system.service.IPermissionService;
import com.lideeyunji.tool.framework.common.enums.CommonStatusEnum;
import com.lideeyunji.tool.framework.common.pojo.PageResult;
import com.lideeyunji.tool.framework.common.util.object.BeanUtils;
import com.lideeyunji.tool.framework.security.core.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
@@ -23,9 +28,14 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.lideeyunji.tool.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.lideeyunji.service.system.constant.ErrorCodeConstants.*;
import static com.lideeyunji.tool.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.lideeyunji.tool.framework.security.core.util.SecurityFrameworkUtils.*;
/**
* OAuth2.0 Client Service 实现类
@@ -40,6 +50,16 @@ public class OAuth2ClientServiceImpl implements IOAuth2ClientService {
@Resource
private OAuth2ClientMapper oauth2ClientMapper;
@Resource
private OAuth2ClientJoinMapper oAuth2ClientJoinMapper;
@Resource
private IClientPermissionService clientPermissionService;
@Resource
private IAdminUserService userService;
@Resource
private IPermissionService permissionService;
@Override
public Long createOAuth2Client(OAuth2ClientSaveReqVO createReqVO) {
validateClientIdExists(null, createReqVO.getClientId());
@@ -111,6 +131,41 @@ public class OAuth2ClientServiceImpl implements IOAuth2ClientService {
return oauth2ClientMapper.selectPage(pageReqVO);
}
@Override
public PageResult<OAuth2ClientDO> getMyPage(OAuth2ClientPageReqVO pageReqVO) {
LoginUser loginUser = getLoginUser();
if (loginUser == null) {
return new PageResult<>();
}
boolean supAdminFlag = userService.isSupAdmin(loginUser.getId());//是否是超级管理员
boolean tenantAdminFlag = userService.isTenantAdmin(loginUser.getId());//是否是租户管理员
//获取当前登录部门和角色
Long loginDeptId = getLoginDeptId();
Long loginRoleId = getLoginRoleId();
Set<Long> roleIds = new HashSet<>();
if (supAdminFlag || tenantAdminFlag) {//超级管理员 或者租户管理员,直接查自身的所有权限
roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId());
} else {
if (loginRoleId != null) {//当前登录有角色
if (loginRoleId == -1) {//该部门下的所有角色
List<UserRoleDO> userRoleList = userService.getUserRoleList(loginUser.getId(), loginDeptId);
roleIds = userRoleList.stream()
.map(UserRoleDO::getRoleId)
.collect(Collectors.toSet());
} else {
roleIds.add(loginRoleId);
}
}
}
if (!CollUtil.isEmpty(roleIds)) {
Set<Long> clientIds = clientPermissionService.getRoleClientListByRoleId(roleIds);
pageReqVO.setIds(clientIds);
}
return oAuth2ClientJoinMapper.selectPage(pageReqVO);
}
@Override
public OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, String authorizedGrantType,
Collection<String> scopes, String redirectUri) {
@@ -136,12 +191,20 @@ public class OAuth2ClientServiceImpl implements IOAuth2ClientService {
throw exception(OAUTH2_CLIENT_SCOPE_OVER);
}
// 校验回调地址
if (StrUtil.isNotEmpty(redirectUri) && !StrUtils.startWithAny(redirectUri, client.getRedirectUris())) {
// if (StrUtil.isNotEmpty(redirectUri) && !StrUtils.startWithAny(redirectUri, client.getRedirectUris())) {
// throw exception(OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH, redirectUri);
// }
if (StrUtil.isNotEmpty(redirectUri) && ObjectUtil.notEqual(client.getRedirectUris(), redirectUri)) {
throw exception(OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH, redirectUri);
}
return client;
}
@Override
public List<OAuth2ClientDO> getAllEnableClient() {
return oauth2ClientMapper.selectEnableList();
}
/**
* 获得自身的代理对象,解决 AOP 生效问题
*

View File

@@ -9,12 +9,10 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Sets;
import com.lideeyunji.service.system.config.redis.RedisKeyConstants;
import com.lideeyunji.service.system.dto.DeptDataPermissionRespDTO;
import com.lideeyunji.service.system.entity.MenuDO;
import com.lideeyunji.service.system.entity.RoleDO;
import com.lideeyunji.service.system.entity.RoleMenuDO;
import com.lideeyunji.service.system.entity.UserRoleDO;
import com.lideeyunji.service.system.entity.*;
import com.lideeyunji.service.system.enums.DataScopeEnum;
import com.lideeyunji.service.system.mapper.RoleMenuMapper;
import com.lideeyunji.service.system.mapper.RoleOAuth2ClientMapper;
import com.lideeyunji.service.system.mapper.UserRoleMapper;
import com.lideeyunji.service.system.service.*;
import com.lideeyunji.tool.framework.common.enums.CommonStatusEnum;
@@ -33,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static com.lideeyunji.tool.framework.common.util.collection.CollectionUtils.convertSet;
import static com.lideeyunji.tool.framework.common.util.json.JsonUtils.toJsonString;
@@ -50,6 +49,8 @@ public class PermissionServiceImpl implements IPermissionService {
private RoleMenuMapper roleMenuMapper;
@Resource
private UserRoleMapper userRoleMapper;
@Resource
private RoleOAuth2ClientMapper roleOAuth2ClientMapper;
@Resource
private IRoleService roleService;
@@ -409,6 +410,25 @@ public class PermissionServiceImpl implements IPermissionService {
return true;
}
@Override
@DSTransactional
public void assignRoleClient(Long roleId, Set<Long> clientIds) {
Set<Long> dbMenuIds = convertSet(roleOAuth2ClientMapper.selectListByRoleId(roleId), RoleOAuth2ClientDO::getOauthClientId);
Set<Long> menuIdList = CollUtil.emptyIfNull(clientIds);
Collection<Long> createMenuIds = CollUtil.subtract(menuIdList, dbMenuIds);
Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIdList);
if (CollUtil.isNotEmpty(createMenuIds)) {
roleOAuth2ClientMapper.insertBatch(CollectionUtils.convertList(createMenuIds, clientId -> {
RoleOAuth2ClientDO entity = new RoleOAuth2ClientDO();
entity.setRoleId(roleId);
entity.setOauthClientId(clientId);
return entity;
}));
}
if (CollUtil.isNotEmpty(deleteMenuIds)) {
roleOAuth2ClientMapper.deleteListByRoleIdAndOauthClientId(roleId, deleteMenuIds);
}
}
/**

View File

@@ -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";//公共包名称