diff --git a/ludu-module-sampling/ludu-module-sampling-api/pom.xml b/ludu-module-sampling/ludu-module-sampling-api/pom.xml
new file mode 100644
index 000000000..3dcc127fd
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-api/pom.xml
@@ -0,0 +1,47 @@
+
+
+
+ ludu-module-sampling
+ cn.iocoder.cloud
+ ${revision}
+
+ 4.0.0
+
+ ludu-module-sampling-api
+
+ ${project.artifactId}
+
+ ticket 模块 API,暴露给其它模块调用
+
+
+
+
+ cn.iocoder.cloud
+ yudao-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+
+
\ No newline at end of file
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/pom.xml b/ludu-module-sampling/ludu-module-sampling-biz/pom.xml
new file mode 100644
index 000000000..8b21dfc53
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/pom.xml
@@ -0,0 +1,152 @@
+
+
+
+ ludu-module-sampling
+ cn.iocoder.cloud
+ ${revision}
+
+ 4.0.0
+
+ ludu-module-sampling-biz
+
+ ${project.artifactId}
+
+ ticket 模块,我们票务业务。
+ 例如说:设备管理等等
+
+
+
+
+
+ cn.iocoder.cloud
+ ludu-module-sampling-api
+ ${revision}
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-env
+
+
+
+
+ cn.iocoder.cloud
+ yudao-module-system-api
+ ${revision}
+
+
+ cn.iocoder.cloud
+ yudao-module-infra-api
+ ${revision}
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-biz-tenant
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-security
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-mybatis
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-redis
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-rpc
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-mq
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-test
+ test
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-excel
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-biz-ip
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-monitor
+
+
+ com.xuxueli
+ xxl-job-core
+ 2.3.1
+
+
+
+
+
+ ${project.artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/SamplingServerApplication.java b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/SamplingServerApplication.java
new file mode 100644
index 000000000..a5777f585
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/SamplingServerApplication.java
@@ -0,0 +1,14 @@
+package cn.iocoder.yudao.module.sampling;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @Description TODO
+ */
+@SpringBootApplication
+public class SamplingServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SamplingServerApplication.class, args);
+ }
+}
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/config/XxlJobConfiguration.java b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/config/XxlJobConfiguration.java
new file mode 100644
index 000000000..c0c3cc9a9
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/config/XxlJobConfiguration.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.sampling.config;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Description TODO
+ */
+@Configuration
+public class XxlJobConfiguration {
+ @Value("${xxl.job.admin.addresses}")
+ private String adminAddresses;
+ @Value("${xxl.job.executor.appname}")
+ private String appName;
+ @Value("${xxl.job.executor.ip}")
+ private String ip;
+ @Value("${xxl.job.executor.port}")
+ private int port;
+ @Value("${xxl.job.accessToken}")
+ private String accessToken;
+ @Value("${xxl.job.executor.logpath}")
+ private String logPath;
+ @Value("${xxl.job.executor.logretentiondays}")
+ private int logRetentionDays;
+
+ @Bean
+ public XxlJobSpringExecutor xxlJobExecutor() {
+ // 创建 XxlJobSpringExecutor 执行器
+ XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+ xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+ xxlJobSpringExecutor.setAppname(appName);
+ xxlJobSpringExecutor.setIp(ip);
+ xxlJobSpringExecutor.setPort(port);
+ xxlJobSpringExecutor.setAccessToken(accessToken);
+ xxlJobSpringExecutor.setLogPath(logPath);
+ xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+ // 返回
+ return xxlJobSpringExecutor;
+ }
+}
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/framework/security/config/SecurityConfiguration.java b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/framework/security/config/SecurityConfiguration.java
new file mode 100644
index 000000000..c9e63afcd
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/framework/security/config/SecurityConfiguration.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.sampling.framework.security.config;
+
+import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
+import cn.iocoder.yudao.module.system.enums.ApiConstants;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
+
+/**
+ * Demo 模块的 Security 配置
+ */
+@Configuration(proxyBeanMethods = false)
+public class SecurityConfiguration {
+
+ @Bean
+ public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
+ return new AuthorizeRequestsCustomizer() {
+
+ @Override
+ public void customize(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) {
+ // Swagger 接口文档
+ registry.antMatchers("/v3/api-docs/**").permitAll() // 元数据
+ .antMatchers("/swagger-ui.html").permitAll(); // Swagger UI
+ // Druid 监控
+ registry.antMatchers("/druid/**").anonymous();
+ // Spring Boot Actuator 的安全配置
+ registry.antMatchers("/actuator").anonymous()
+ .antMatchers("/actuator/**").anonymous();
+ // RPC 服务的安全配置
+ registry.antMatchers(ApiConstants.PREFIX + "/**").permitAll();
+ }
+
+ };
+ }
+
+}
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/job/DemoJob.java b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/job/DemoJob.java
new file mode 100644
index 000000000..ac3679b8c
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/java/cn/iocoder/yudao/module/sampling/job/DemoJob.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.sampling.job;
+
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.IJobHandler;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Description TODO
+ */
+@Component
+public class DemoJob extends IJobHandler {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ private final AtomicInteger counts = new AtomicInteger();
+ @XxlJob("demoJob")
+ public ReturnT demoJobHandler(String param) throws Exception {
+ logger.info("XXL-JOB, Hello World.");
+ System.out.println("zxxxx");
+ logger.info("XXL-JOB, Hello World end.");
+ return ReturnT.SUCCESS;
+ }
+
+ @Override
+ public void execute() throws Exception {
+
+ }
+}
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application-dev.yaml b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application-dev.yaml
new file mode 100644
index 000000000..b4696be2d
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application-dev.yaml
@@ -0,0 +1,103 @@
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 5 # 初始连接数
+ min-idle: 10 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: 123456
+ slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: 123456
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ redis:
+ host: 400-infra.server.iocoder.cn # 地址
+ port: 6379 # 端口
+ database: 1 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+xxl:
+ job:
+ admin:
+ addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+ # Spring Boot Admin Server 服务端的相关配置
+ context-path: /admin # 配置 Spring
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ xss:
+ enable: false
+ web:
+ admin-ui:
+ url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
+ demo: true # 开启演示模式
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application-local.yaml b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application-local.yaml
new file mode 100644
index 000000000..74021e60a
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application-local.yaml
@@ -0,0 +1,127 @@
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+ - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 1 # 初始连接数
+ min-idle: 1 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+ min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+ max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://120.46.37.243:3306/ludu_ticket?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+ # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai # MySQL Connector/J 5.X 连接的示例
+ # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
+ # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
+ # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
+ # url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
+ username: root
+ password: xpower1234
+ # username: sa # SQL Server 连接的示例
+ # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
+ # username: SYSDBA # DM 连接的示例
+ # password: SYSDBA # DM 连接的示例
+ slave: # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+ username: root
+ password: 123456
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ redis:
+ host: 127.0.0.1 # 地址
+ port: 6379 # 端口
+ database: 0 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ enabled: false # 是否开启调度中心,默认为 true 开启
+ admin:
+ addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+
+# 日志文件配置
+logging:
+ level:
+ # 配置自己写的 MyBatis Mapper 打印日志
+ cn.iocoder.yudao.module.system.dal.mysql: debug
+ cn.iocoder.yudao.module.system.dal.mysql.sensitiveword.SensitiveWordMapper: INFO # 配置 SensitiveWordMapper 的日志级别为 info
+ cn.iocoder.yudao.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+yudao:
+ env: # 多环境的配置项
+ tag: ${HOSTNAME}
+ web:
+ admin-ui:
+ url: http://dashboard.yudao.iocoder.cn # Admin 管理后台 UI 的地址
+ security:
+ mock-enable: true
+ xss:
+ enable: false
+ access-log: # 访问日志的配置项
+ enable: false
+ demo: false # 关闭演示模式
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application.yaml b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application.yaml
new file mode 100644
index 000000000..a7b17c91b
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/application.yaml
@@ -0,0 +1,114 @@
+spring:
+ main:
+ allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
+ allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务
+
+ # Servlet 配置
+ servlet:
+ # 文件上传相关配置项
+ multipart:
+ max-file-size: 16MB # 单个文件大小
+ max-request-size: 32MB # 设置总上传的文件大小
+ mvc:
+ pathmatch:
+ matching-strategy: ANT_PATH_MATCHER # 解决 SpringFox 与 SpringBoot 2.6.x 不兼容的问题,参见 SpringFoxHandlerProviderBeanPostProcessor 类
+
+ # Jackson 配置项
+ jackson:
+ serialization:
+ write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳
+ write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
+ write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
+ fail-on-empty-beans: false # 允许序列化无属性的 Bean
+
+ # Cache 配置项
+ cache:
+ type: REDIS
+ redis:
+ time-to-live: 1h # 设置过期时间为 1 小时
+
+--- #################### 接口文档配置 ####################
+
+springdoc:
+ api-docs:
+ enabled: true # 1. 是否开启 Swagger 接文档的元数据
+ path: /v3/api-docs
+ swagger-ui:
+ enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面
+ path: /swagger-ui.html
+ default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档
+
+knife4j:
+ enable: true # 2.2 是否开启 Swagger 文档的 Knife4j UI 界面
+ setting:
+ language: zh_cn
+
+# MyBatis Plus 的配置项
+mybatis-plus:
+ configuration:
+ map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
+ global-config:
+ db-config:
+ id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。
+ # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库
+ # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库
+ # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解
+ logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+ logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+ banner: false # 关闭控制台的 Banner 打印
+ type-aliases-package: ${yudao.info.base-package}.dal.dataobject
+ encryptor:
+ password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成
+
+mybatis-plus-join:
+ banner: false # 关闭控制台的 Banner 打印
+
+# Spring Data Redis 配置
+spring:
+ data:
+ redis:
+ repositories:
+ enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度
+
+# VO 转换(数据翻译)相关
+easy-trans:
+ is-enable-global: true # 启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口
+ is-enable-cloud: false # 禁用 TransType.RPC 微服务模式
+
+--- #################### RPC 远程调用相关配置 ####################
+
+--- #################### MQ 消息队列相关配置 ####################
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ admin:
+ addresses: http://127.0.0.1:9090/xxl-job-admin
+ executor:
+ appname: ${spring.application.name} # 执行器 AppName
+ ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
+ port: 0 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
+ logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径
+ logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
+ accessToken: default_token # 执行器通讯TOKEN
+
+--- #################### 芋道相关配置 ####################
+
+yudao:
+ info:
+ version: 1.0.0
+ base-package: cn.iocoder.yudao.module.ticket
+ swagger:
+ title: 管理后台
+ description: 提供管理员管理的所有功能
+ version: ${yudao.info.version}
+ base-package: ${yudao.info.base-package}
+ captcha:
+ enable: true # 验证码的开关,默认为 true;
+ tenant: # 多租户相关配置项
+ enable: true
+ ignore-urls:
+ ignore-tables:
+
+debug: false
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/bootstrap-local.yaml b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/bootstrap-local.yaml
new file mode 100644
index 000000000..2de0efbf7
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/bootstrap-local.yaml
@@ -0,0 +1,23 @@
+--- #################### 注册中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: 127.0.0.1:8848
+ discovery:
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+
+--- #################### 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ # Nacos Config 配置项,对应 NacosConfigProperties 配置属性类
+ config:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+ namespace: dev # 命名空间 dev 的ID,不能直接使用 dev 名称。创建命名空间的时候需要指定ID为 dev,这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ name: ${spring.application.name} # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name
+ file-extension: yaml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/bootstrap.yaml b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/bootstrap.yaml
new file mode 100644
index 000000000..1cb6528e0
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/bootstrap.yaml
@@ -0,0 +1,14 @@
+spring:
+ application:
+ name: sampling-server
+
+ profiles:
+ active: local
+
+server:
+ port: 48089
+
+# 日志文件配置。注意,如果 logging.file.name 不放在 bootstrap.yaml 配置文件,而是放在 application.yaml 中,会导致出现 LOG_FILE_IS_UNDEFINED 文件
+logging:
+ file:
+ name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
diff --git a/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/logback-spring.xml b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000..b1b9f3faf
--- /dev/null
+++ b/ludu-module-sampling/ludu-module-sampling-biz/src/main/resources/logback-spring.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+ ${LOG_FILE}
+
+
+ ${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}
+
+ ${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}
+
+ ${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}
+
+ ${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}
+
+
+
+
+
+ 0
+
+ 256
+
+
+
+
+
+
+
+ ${PATTERN_DEFAULT}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ludu-module-sampling/pom.xml b/ludu-module-sampling/pom.xml
new file mode 100644
index 000000000..3d4a69439
--- /dev/null
+++ b/ludu-module-sampling/pom.xml
@@ -0,0 +1,25 @@
+
+
+
+ yudao
+ cn.iocoder.cloud
+ ${revision}
+
+ 4.0.0
+
+ ludu-module-sampling-api
+ ludu-module-sampling-biz
+
+
+ ludu-module-sampling
+
+ pom
+
+ ${project.artifactId}
+
+ sampling 模块,我们放抽数服务。
+
+
+
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/pom.xml b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/pom.xml
new file mode 100644
index 000000000..bad4d4944
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/pom.xml
@@ -0,0 +1,52 @@
+
+
+
+ ludu-module-ticket-manager
+ cn.iocoder.cloud
+ ${revision}
+
+ 4.0.0
+ ludu-module-ticket-manager-api
+ jar
+
+ ${project.artifactId}
+
+ ticket 模块 API,暴露给其它模块调用
+
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+ cn.iocoder.cloud
+ yudao-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-ui
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+
+
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/TicketAssetApi.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/TicketAssetApi.java
new file mode 100644
index 000000000..f96105e9a
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/TicketAssetApi.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.ticket.api.asset;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ticket.api.asset.dto.TicketAssetRespDTO;
+import cn.iocoder.yudao.module.ticket.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC 服务 - 票务设备管理")
+public interface TicketAssetApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/asset";
+ @GetMapping(PREFIX + "/type")
+ @Operation(summary = "获得所有设备名称和数量")
+ public CommonResult>> countAsset();
+
+ @GetMapping(PREFIX + "/name/{assettypename}")
+ @Operation(summary = "获取符合设备类型名的所有设备")
+ public CommonResult> nameAsset(@PathVariable("assettypename") String assettypename);
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/dto/TicketAssetRespDTO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/dto/TicketAssetRespDTO.java
new file mode 100644
index 000000000..eb55f5ec1
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/dto/TicketAssetRespDTO.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.ticket.api.asset.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Description TODO
+ */
+@Schema(description = "RPC 服务 - 设备管理 Response DTO")
+@Data
+public class TicketAssetRespDTO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30538")
+ private Long id;
+
+ @Schema(description = "数据ID", example = "15059")
+ private String dataId;
+
+ @Schema(description = "设备名称", example = "芋艿")
+ private String assetname;
+
+ @Schema(description = "设备类型ID", example = "2")
+ private String assettype;
+
+ @Schema(description = "设备类型名称", example = "芋艿")
+ private String assettypename;
+
+ @Schema(description = "设备状态")
+ private String isOnline;
+
+ @Schema(description = "最后一次反馈时间")
+ private Long lastfeedbacktime;
+
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/checkticket/TicketCheckTicketApi.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/checkticket/TicketCheckTicketApi.java
new file mode 100644
index 000000000..8e4592e7d
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/checkticket/TicketCheckTicketApi.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.ticket.api.checkticket;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ticket.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.util.List;
+import java.util.Map;
+
+
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC 服务 - 检票管理")
+public interface TicketCheckTicketApi {
+ String PREFIX = ApiConstants.PREFIX + "/checkticket";
+ @GetMapping(PREFIX + "/{day}")
+ @Operation(summary = "获得日期当天的检票人数")
+ public CommonResult checkTicketTotal(@PathVariable("day") String day);
+
+ @GetMapping(PREFIX + "/qushi/{day}")
+ @Operation(summary = "获取日期当天各个时段的检票人数")
+ public CommonResult>> findbytimetemp(@PathVariable("day") String day);
+
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/saledata/TicketSaleDataApi.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/saledata/TicketSaleDataApi.java
new file mode 100644
index 000000000..dc6645303
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/api/saledata/TicketSaleDataApi.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.ticket.api.saledata;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ticket.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC 服务 - 售票管理")
+public interface TicketSaleDataApi {
+ String PREFIX = ApiConstants.PREFIX + "/saledata";
+ @GetMapping(PREFIX + "/{day}")
+ @Operation(summary = "获得输入日期的当天总售票数")
+ public CommonResult checkTicketTotal(@PathVariable("day") String day);
+ @GetMapping(PREFIX + "/thisyear/{startTime}")
+ @Operation(summary = "获得今年日期往前十天内的数据")
+ public CommonResult>> thisyearNum(@PathVariable("startTime") String startTime);
+ @GetMapping(PREFIX + "/lastyear/{startTime}")
+ @Operation(summary = "获得去年日期往前推十天的数据")
+ public CommonResult>> lastyearNum(@PathVariable("startTime") String startTime);
+ @GetMapping(PREFIX + "/gender")
+ @Operation(summary = "获得所有数据的男女数量")
+ public CommonResult>> findByGender();
+ @GetMapping(PREFIX + "/age")
+ @Operation(summary = "获得所有数据的年龄分段和数量")
+ public CommonResult>> findByage();
+
+ @GetMapping(PREFIX + "/lastyear/region")
+ @Operation(summary = "查询去年各个省份的人数")
+ public CommonResult>> lastyearfindByregion();
+ @GetMapping(PREFIX + "/thisyear/region")
+ @Operation(summary = "查询今年各个省份的人数")
+ public CommonResult>> thisyearfindByregion();
+ @GetMapping(PREFIX + "/salemethod")
+ @Operation(summary = "查询各个销售渠道的购票人数")
+ public CommonResult>> findBysaleMethod();
+ @GetMapping(PREFIX + "/wuyi/{x}")
+ @Operation(summary = "查询最近前几年当年的五一期间的数据")
+ public CommonResult>> findByWuyi(@PathVariable("x") int x);
+ @GetMapping(PREFIX + "/guoqing/{x}")
+ @Operation(summary = "查询最近前几年当年的国庆期间的数据")
+ public CommonResult>> findByGuoqing(@PathVariable("x") int x);
+ @GetMapping(PREFIX + "/rijunthisyear/{startTime}")
+ @Operation(summary = "查询今年对应日期的近三十天日均售票数量")
+ public CommonResult findThisyearRijun(@PathVariable("startTime") String startTime);
+ @GetMapping(PREFIX + "/rijunlastyear/{startTime}")
+ @Operation(summary = "查询去年对应日期的近三十天日均售票数量")
+ public CommonResult findLastyearRijun(@PathVariable("startTime") String startTime);
+ @GetMapping(PREFIX + "/thisyear/nianjun")
+ @Operation(summary = "查询今年年度售票平均金额")
+ public CommonResult findmoneythisyear();
+ @GetMapping(PREFIX + "/lastyear/nianjun")
+ @Operation(summary = "查询去年年度售票平均金额")
+ public CommonResult findmoneylastyear();
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/enums/ApiConstants.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/enums/ApiConstants.java
new file mode 100644
index 000000000..64829f15d
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/enums/ApiConstants.java
@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.ticket.enums;
+
+import cn.iocoder.yudao.framework.common.enums.RpcConstants;
+
+/**
+ * API 相关的枚举
+ *
+ * @author 芋道源码
+ */
+public class ApiConstants {
+
+ /**
+ * 服务名
+ *
+ * 注意,需要保证和 spring.application.name 保持一致
+ */
+ public static final String NAME = "ticket-server";
+
+ public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/ticket";
+
+ public static final String VERSION = "1.0.0";
+
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/enums/ErrorCodeConstants.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/enums/ErrorCodeConstants.java
new file mode 100644
index 000000000..7ae20c9a5
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-api/src/main/java/cn/iocoder/yudao/module/ticket/enums/ErrorCodeConstants.java
@@ -0,0 +1,12 @@
+package cn.iocoder.yudao.module.ticket.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * @Description TODO
+ */
+public interface ErrorCodeConstants {
+ ErrorCode ASSET_NOT_EXISTS = new ErrorCode(1_005_001_000, "设备不存在");
+ ErrorCode CHECK_TICKET_NOT_EXISTS = new ErrorCode(1_005_001_001, "检票不存在");
+ ErrorCode SALE_DATA_NOT_EXISTS = new ErrorCode(1_005_001_002, "售票不存在");
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/pom.xml b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/pom.xml
new file mode 100644
index 000000000..84a2e8c57
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/pom.xml
@@ -0,0 +1,149 @@
+
+
+
+ ludu-module-ticket-manager
+ cn.iocoder.cloud
+ ${revision}
+
+ 4.0.0
+
+ ludu-module-ticket-manager-biz
+
+ jar
+
+ ${project.artifactId}
+
+ ticket 模块,我们票务业务。
+ 例如说:设备管理等等
+
+
+
+
+
+ cn.iocoder.cloud
+ ludu-module-ticket-manager-api
+ ${revision}
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-env
+
+
+
+
+ cn.iocoder.cloud
+ yudao-module-system-api
+ ${revision}
+
+
+ cn.iocoder.cloud
+ yudao-module-infra-api
+ ${revision}
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-biz-tenant
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-security
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-mybatis
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-redis
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-rpc
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-mq
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-test
+ test
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-excel
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-biz-ip
+
+
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-monitor
+
+
+
+
+
+ ${project.artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/TicketManagerServerApplication.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/TicketManagerServerApplication.java
new file mode 100644
index 000000000..9d7e0d2c0
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/TicketManagerServerApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.ticket;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @Description TODO
+ */
+
+@SpringBootApplication
+public class TicketManagerServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(TicketManagerServerApplication.class, args);
+ }
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/TicketAssetApiImpl.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/TicketAssetApiImpl.java
new file mode 100644
index 000000000..ac1cd1600
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/asset/TicketAssetApiImpl.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.ticket.api.asset;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ticket.api.asset.dto.TicketAssetRespDTO;
+import cn.iocoder.yudao.module.ticket.convert.asset.AssetConvert;
+import cn.iocoder.yudao.module.ticket.service.asset.AssetService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+/**
+ * @Description 票务设备API实现类
+ */
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class TicketAssetApiImpl implements TicketAssetApi {
+ @Resource
+ private AssetService assetService;
+
+ @Override
+ public CommonResult>> countAsset() {
+ return success(assetService.countAsset());
+ }
+
+ @Override
+ public CommonResult> nameAsset(String assettypename) {
+ return success(AssetConvert.INSTANCE.convertList02(assetService.nameAsset(assettypename)));
+ }
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/checkticket/TicketCheckTicketApiImpl.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/checkticket/TicketCheckTicketApiImpl.java
new file mode 100644
index 000000000..ba9eefa53
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/checkticket/TicketCheckTicketApiImpl.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.ticket.api.checkticket;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ticket.service.checkticket.CheckTicketService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+/**
+ * @Description 票务检票API实现类
+ */
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class TicketCheckTicketApiImpl implements TicketCheckTicketApi{
+ @Resource
+ private CheckTicketService checkTicketService;
+ @Override
+ public CommonResult checkTicketTotal(String day) {
+ return success(checkTicketService.checkTicketTotal(day));
+ }
+
+ @Override
+ public CommonResult>> findbytimetemp(String day) {
+ return success(checkTicketService.findbytimetemp(day));
+ }
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/saledata/TicketSaleDataApiImpl.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/saledata/TicketSaleDataApiImpl.java
new file mode 100644
index 000000000..3b056dcdf
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/api/saledata/TicketSaleDataApiImpl.java
@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.ticket.api.saledata;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.saledata.SaleDataDO;
+import cn.iocoder.yudao.module.ticket.service.saledata.SaleDataService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+/**
+ * @Description TODO
+ */
+@RestController // 提供 RESTful API 接口,给 Feign 调用
+@Validated
+public class TicketSaleDataApiImpl implements TicketSaleDataApi{
+ @Resource
+ private SaleDataService saleDataService;
+
+ @Override
+ public CommonResult checkTicketTotal(String day) {
+ return success(saleDataService.countBySddate(day));
+ }
+
+ @Override
+ public CommonResult>> thisyearNum(String startTime) {
+ return success(saleDataService.findCheckticketcountBytime(startTime));
+ }
+
+ @Override
+ public CommonResult>> lastyearNum(String startTime) {
+ return success(saleDataService.findCheckticketcountBytime(startTime));
+ }
+
+ @Override
+ public CommonResult>> findByGender() {
+ return success(saleDataService.findByGender());
+ }
+
+ @Override
+ public CommonResult>> findByage() {
+ return success(saleDataService.findByAge());
+ }
+
+ @Override
+ public CommonResult>> lastyearfindByregion() {
+ return success(saleDataService.findByregion(saleDataService.findEventsLastYear()));
+ }
+
+ @Override
+ public CommonResult>> thisyearfindByregion() {
+ return success(saleDataService.findByregion(saleDataService.findEventsThisYear()));
+ }
+
+ @Override
+ public CommonResult>> findBysaleMethod() {
+ return success(saleDataService.findBySaleMethod());
+ }
+
+ @Override
+ public CommonResult>> findByWuyi(int x) {
+ return success(saleDataService.findWuyi(x));
+ }
+
+ @Override
+ public CommonResult>> findByGuoqing(int x) {
+ return success(saleDataService.findGuoqing(x));
+ }
+
+ @Override
+ public CommonResult findThisyearRijun(String startTime) {
+ return success(saleDataService.findrijun(startTime));
+ }
+
+ @Override
+ public CommonResult findLastyearRijun(String startTime) {
+ return success(saleDataService.findrijun(startTime));
+ }
+
+ @Override
+ public CommonResult findmoneythisyear() {
+ return success(saleDataService.findyearJun(saleDataService.findEventsThisYear()));
+ }
+
+ @Override
+ public CommonResult findmoneylastyear() {
+ return success(saleDataService.findyearJun(saleDataService.findEventsLastYear()));
+ }
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/AssetController.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/AssetController.java
new file mode 100644
index 000000000..9ae59d02f
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/AssetController.java
@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.asset;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.ticket.controller.admin.asset.vo.*;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.asset.AssetDO;
+import cn.iocoder.yudao.module.ticket.service.asset.AssetService;
+
+@Tag(name = "管理后台 - 设备")
+@RestController
+@RequestMapping("/ticket/asset")
+@Validated
+public class AssetController {
+
+ @Resource
+ private AssetService assetService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建设备")
+ @PreAuthorize("@ss.hasPermission('ticket:asset:create')")
+ public CommonResult createAsset(@Valid @RequestBody AssetSaveReqVO createReqVO) {
+ return success(assetService.createAsset(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新设备")
+ @PreAuthorize("@ss.hasPermission('ticket:asset:update')")
+ public CommonResult updateAsset(@Valid @RequestBody AssetSaveReqVO updateReqVO) {
+ assetService.updateAsset(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除设备")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('ticket:asset:delete')")
+ public CommonResult deleteAsset(@RequestParam("id") Long id) {
+ assetService.deleteAsset(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得设备")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('ticket:asset:query')")
+ public CommonResult getAsset(@RequestParam("id") Long id) {
+ AssetDO asset = assetService.getAsset(id);
+ return success(BeanUtils.toBean(asset, AssetRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得设备分页")
+ @PreAuthorize("@ss.hasPermission('ticket:asset:query')")
+ public CommonResult> getAssetPage(@Valid AssetPageReqVO pageReqVO) {
+ PageResult pageResult = assetService.getAssetPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, AssetRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出设备 Excel")
+ @PreAuthorize("@ss.hasPermission('ticket:asset:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportAssetExcel(@Valid AssetPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = assetService.getAssetPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "设备.xls", "数据", AssetRespVO.class,
+ BeanUtils.toBean(list, AssetRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetPageReqVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetPageReqVO.java
new file mode 100644
index 000000000..7ac89ab52
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetPageReqVO.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.asset.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 设备分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AssetPageReqVO extends PageParam {
+
+ @Schema(description = "ID", example = "30538")
+ private Long id;
+
+ @Schema(description = "数据ID", example = "15059")
+ private String dataId;
+
+ @Schema(description = "设备名称", example = "芋艿")
+ private String assetname;
+
+ @Schema(description = "设备类型ID", example = "2")
+ private String assettype;
+
+ @Schema(description = "设备类型名称", example = "芋艿")
+ private String assettypename;
+
+ @Schema(description = "设备状态")
+ private String isOnline;
+
+ @Schema(description = "最后一次反馈时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private Long[] lastfeedbacktime;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetRespVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetRespVO.java
new file mode 100644
index 000000000..7f1cbb3f2
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetRespVO.java
@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.asset.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import com.alibaba.excel.annotation.*;
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 设备 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AssetRespVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30538")
+ @ExcelProperty("ID")
+ private Long id;
+
+ @Schema(description = "数据ID", example = "15059")
+ @ExcelProperty("数据ID")
+ private String dataId;
+
+ @Schema(description = "设备名称", example = "芋艿")
+ @ExcelProperty("设备名称")
+ private String assetname;
+
+ @Schema(description = "设备类型ID", example = "2")
+ @ExcelProperty("设备类型ID")
+ private String assettype;
+
+ @Schema(description = "设备类型名称", example = "芋艿")
+ @ExcelProperty("设备类型名称")
+ private String assettypename;
+
+ @Schema(description = "设备状态")
+ @ExcelProperty(value = "设备状态", converter = DictConvert.class)
+ @DictFormat("asset_status_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ private String isOnline;
+
+ @Schema(description = "最后一次反馈时间")
+ @ExcelProperty("最后一次反馈时间")
+ private Long lastfeedbacktime;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetSaveReqVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetSaveReqVO.java
new file mode 100644
index 000000000..0cacfd6c3
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/asset/vo/AssetSaveReqVO.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.asset.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 设备新增/修改 Request VO")
+@Data
+public class AssetSaveReqVO {
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16476")
+ private Long id;
+
+ @Schema(description = "数据ID", example = "15059")
+ private String dataId;
+
+ @Schema(description = "设备名称", example = "芋艿")
+ private String assetname;
+
+ @Schema(description = "设备类型ID", example = "2")
+ private String assettype;
+
+ @Schema(description = "设备类型名称", example = "芋艿")
+ private String assettypename;
+
+ @Schema(description = "设备状态")
+ private String isOnline;
+
+ @Schema(description = "最后一次反馈时间")
+ private Long lastfeedbacktime;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/CheckTicketController.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/CheckTicketController.java
new file mode 100644
index 000000000..4aa66992d
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/CheckTicketController.java
@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo;
+
+import cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo.CheckTicketPageReqVO;
+import cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo.CheckTicketRespVO;
+import cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo.CheckTicketSaveReqVO;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.ticket.dal.dataobject.checkticket.CheckTicketDO;
+import cn.iocoder.yudao.module.ticket.service.checkticket.CheckTicketService;
+
+@Tag(name = "管理后台 - 检票")
+@RestController
+@RequestMapping("/ticket/check-ticket")
+@Validated
+public class CheckTicketController {
+
+ @Resource
+ private CheckTicketService checkTicketService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建检票")
+ @PreAuthorize("@ss.hasPermission('ticket:check-ticket:create')")
+ public CommonResult createCheckTicket(@Valid @RequestBody CheckTicketSaveReqVO createReqVO) {
+ return success(checkTicketService.createCheckTicket(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新检票")
+ @PreAuthorize("@ss.hasPermission('ticket:check-ticket:update')")
+ public CommonResult updateCheckTicket(@Valid @RequestBody CheckTicketSaveReqVO updateReqVO) {
+ checkTicketService.updateCheckTicket(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除检票")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('ticket:check-ticket:delete')")
+ public CommonResult deleteCheckTicket(@RequestParam("id") Long id) {
+ checkTicketService.deleteCheckTicket(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得检票")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('ticket:check-ticket:query')")
+ public CommonResult getCheckTicket(@RequestParam("id") Long id) {
+ CheckTicketDO checkTicket = checkTicketService.getCheckTicket(id);
+ return success(BeanUtils.toBean(checkTicket, CheckTicketRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得检票分页")
+ @PreAuthorize("@ss.hasPermission('ticket:check-ticket:query')")
+ public CommonResult> getCheckTicketPage(@Valid CheckTicketPageReqVO pageReqVO) {
+ PageResult pageResult = checkTicketService.getCheckTicketPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, CheckTicketRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出检票 Excel")
+ @PreAuthorize("@ss.hasPermission('ticket:check-ticket:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportCheckTicketExcel(@Valid CheckTicketPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = checkTicketService.getCheckTicketPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "检票.xls", "数据", CheckTicketRespVO.class,
+ BeanUtils.toBean(list, CheckTicketRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketPageReqVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketPageReqVO.java
new file mode 100644
index 000000000..3a471f336
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketPageReqVO.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo;
+
+import lombok.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 检票分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class CheckTicketPageReqVO extends PageParam {
+
+ @Schema(description = "ID", example = "16476")
+ private Long id;
+
+ @Schema(description = "数据ID", example = "15422")
+ private String dataId;
+
+ @Schema(description = "检票点ID")
+ private String checkstation;
+
+ @Schema(description = "检票点名称", example = "李四")
+ private String checkstationname;
+
+ @Schema(description = "检票日期")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String[] checkticketdate;
+
+ @Schema(description = "检票时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String[] checktickettime;
+
+ @Schema(description = "人数", example = "23164")
+ private Integer personcount;
+
+ @Schema(description = "订单明细ID")
+ private String sdshipping;
+
+ @Schema(description = "票ID")
+ private String ticket;
+
+ @Schema(description = "销售特征名称(票种名称)", example = "张三")
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketRespVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketRespVO.java
new file mode 100644
index 000000000..c3c7612df
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketRespVO.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 检票 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class CheckTicketRespVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16476")
+ @ExcelProperty("ID")
+ private Long id;
+
+ @Schema(description = "数据ID", example = "15422")
+ @ExcelProperty("数据ID")
+ private String dataId;
+
+ @Schema(description = "检票点ID")
+ @ExcelProperty("检票点ID")
+ private String checkstation;
+
+ @Schema(description = "检票点名称", example = "李四")
+ @ExcelProperty("检票点名称")
+ private String checkstationname;
+
+ @Schema(description = "检票日期")
+ @ExcelProperty("检票日期")
+ private String checkticketdate;
+
+ @Schema(description = "检票时间")
+ @ExcelProperty("检票时间")
+ private String checktickettime;
+
+ @Schema(description = "人数", example = "23164")
+ @ExcelProperty("人数")
+ private Integer personcount;
+
+ @Schema(description = "订单明细ID")
+ @ExcelProperty("订单明细ID")
+ private String sdshipping;
+
+ @Schema(description = "票ID")
+ @ExcelProperty("票ID")
+ private String ticket;
+
+ @Schema(description = "销售特征名称(票种名称)", example = "张三")
+ @ExcelProperty("销售特征名称(票种名称)")
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketSaveReqVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketSaveReqVO.java
new file mode 100644
index 000000000..5267f30e3
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/checkticket/vo/vo/CheckTicketSaveReqVO.java
@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+@Schema(description = "管理后台 - 检票新增/修改 Request VO")
+@Data
+public class CheckTicketSaveReqVO {
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16476")
+ private Long id;
+ @Schema(description = "数据ID", example = "15422")
+ private String dataId;
+
+ @Schema(description = "检票点ID")
+ private String checkstation;
+
+ @Schema(description = "检票点名称", example = "李四")
+ private String checkstationname;
+
+ @Schema(description = "检票日期")
+ private String checkticketdate;
+
+ @Schema(description = "检票时间")
+ private String checktickettime;
+
+ @Schema(description = "人数", example = "23164")
+ private Integer personcount;
+
+ @Schema(description = "订单明细ID")
+ private String sdshipping;
+
+ @Schema(description = "票ID")
+ private String ticket;
+
+ @Schema(description = "销售特征名称(票种名称)", example = "张三")
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/SaleDataController.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/SaleDataController.java
new file mode 100644
index 000000000..61ad631d7
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/SaleDataController.java
@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.saledata;
+
+import cn.iocoder.yudao.module.ticket.dal.dataobject.saledata.SaleDataDO;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.ticket.controller.admin.saledata.vo.*;
+import cn.iocoder.yudao.module.ticket.service.saledata.SaleDataService;
+
+@Tag(name = "管理后台 - 售票")
+@RestController
+@RequestMapping("/ticket/sale-data")
+@Validated
+public class SaleDataController {
+
+ @Resource
+ private SaleDataService saleDataService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建售票")
+ @PreAuthorize("@ss.hasPermission('ticket:sale-data:create')")
+ public CommonResult createSaleData(@Valid @RequestBody SaleDataSaveReqVO createReqVO) {
+ return success(saleDataService.createSaleData(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新售票")
+ @PreAuthorize("@ss.hasPermission('ticket:sale-data:update')")
+ public CommonResult updateSaleData(@Valid @RequestBody SaleDataSaveReqVO updateReqVO) {
+ saleDataService.updateSaleData(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除售票")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('ticket:sale-data:delete')")
+ public CommonResult deleteSaleData(@RequestParam("id") Long id) {
+ saleDataService.deleteSaleData(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得售票")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('ticket:sale-data:query')")
+ public CommonResult getSaleData(@RequestParam("id") Long id) {
+ SaleDataDO saleData = saleDataService.getSaleData(id);
+ return success(BeanUtils.toBean(saleData, SaleDataRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得售票分页")
+ @PreAuthorize("@ss.hasPermission('ticket:sale-data:query')")
+ public CommonResult> getSaleDataPage(@Valid SaleDataPageReqVO pageReqVO) {
+ PageResult pageResult = saleDataService.getSaleDataPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, SaleDataRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出售票 Excel")
+ @PreAuthorize("@ss.hasPermission('ticket:sale-data:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportSaleDataExcel(@Valid SaleDataPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = saleDataService.getSaleDataPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "售票.xls", "数据", SaleDataRespVO.class,
+ BeanUtils.toBean(list, SaleDataRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataPageReqVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataPageReqVO.java
new file mode 100644
index 000000000..89a51a507
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataPageReqVO.java
@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.saledata.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 售票分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SaleDataPageReqVO extends PageParam {
+
+ @Schema(description = "ID", example = "20492")
+ private Long id;
+
+ @Schema(description = "数据id", example = "32044")
+ private String dataId;
+
+ @Schema(description = "金额")
+ private Long amount;
+
+ @Schema(description = "证件号")
+ private String certificateno;
+
+ @Schema(description = "证件类别", example = "2")
+ private String certificatetype;
+
+ @Schema(description = "产品ID")
+ private String item;
+
+ @Schema(description = "产品名称", example = "张三")
+ private String itemname;
+
+ @Schema(description = "产品类型ID", example = "2")
+ private String itemtype;
+
+ @Schema(description = "产品类型名称", example = "张三")
+ private String itemtypename;
+
+ @Schema(description = "出游日期")
+ private String productbatchno;
+
+ @Schema(description = "数量")
+ private Integer quantity;
+
+ @Schema(description = "销售日期")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String[] sddate;
+
+ @Schema(description = "订单号")
+ private String sdno;
+
+ @Schema(description = "销售时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String[] sdtime;
+
+ @Schema(description = "交易类别(订单类型)")
+ private String transactiontypeno;
+
+ @Schema(description = "销售特征名称(票种名称)", example = "赵六")
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataRespVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataRespVO.java
new file mode 100644
index 000000000..4358070ab
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataRespVO.java
@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.saledata.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 售票 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class SaleDataRespVO {
+
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20492")
+ @ExcelProperty("ID")
+ private Long id;
+
+ @Schema(description = "数据id", example = "32044")
+ @ExcelProperty("数据id")
+ private String dataId;
+
+ @Schema(description = "金额")
+ @ExcelProperty("金额")
+ private Long amount;
+
+ @Schema(description = "证件号")
+ @ExcelProperty("证件号")
+ private String certificateno;
+
+ @Schema(description = "证件类别", example = "2")
+ @ExcelProperty("证件类别")
+ private String certificatetype;
+
+ @Schema(description = "产品ID")
+ @ExcelProperty("产品ID")
+ private String item;
+
+ @Schema(description = "产品名称", example = "张三")
+ @ExcelProperty("产品名称")
+ private String itemname;
+
+ @Schema(description = "产品类型ID", example = "2")
+ @ExcelProperty("产品类型ID")
+ private String itemtype;
+
+ @Schema(description = "产品类型名称", example = "张三")
+ @ExcelProperty("产品类型名称")
+ private String itemtypename;
+
+ @Schema(description = "出游日期")
+ @ExcelProperty("出游日期")
+ private String productbatchno;
+
+ @Schema(description = "数量")
+ @ExcelProperty("数量")
+ private Integer quantity;
+
+ @Schema(description = "销售日期")
+ @ExcelProperty("销售日期")
+ private String sddate;
+
+ @Schema(description = "订单号")
+ @ExcelProperty("订单号")
+ private String sdno;
+
+ @Schema(description = "销售时间")
+ @ExcelProperty("销售时间")
+ private String sdtime;
+
+ @Schema(description = "交易类别(订单类型)")
+ @ExcelProperty("交易类别(订单类型)")
+ private String transactiontypeno;
+
+ @Schema(description = "销售特征名称(票种名称)", example = "赵六")
+ @ExcelProperty("销售特征名称(票种名称)")
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataSaveReqVO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataSaveReqVO.java
new file mode 100644
index 000000000..98ff56a7c
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/controller/admin/saledata/vo/SaleDataSaveReqVO.java
@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.ticket.controller.admin.saledata.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 售票新增/修改 Request VO")
+@Data
+public class SaleDataSaveReqVO {
+ @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16476")
+ private Long id;
+ @Schema(description = "数据id", example = "32044")
+ private String dataId;
+
+ @Schema(description = "金额")
+ private Long amount;
+
+ @Schema(description = "证件号")
+ private String certificateno;
+
+ @Schema(description = "证件类别", example = "2")
+ private String certificatetype;
+
+ @Schema(description = "产品ID")
+ private String item;
+
+ @Schema(description = "产品名称", example = "张三")
+ private String itemname;
+
+ @Schema(description = "产品类型ID", example = "2")
+ private String itemtype;
+
+ @Schema(description = "产品类型名称", example = "张三")
+ private String itemtypename;
+
+ @Schema(description = "出游日期")
+ private String productbatchno;
+
+ @Schema(description = "数量")
+ private Integer quantity;
+
+ @Schema(description = "销售日期")
+ private String sddate;
+
+ @Schema(description = "订单号")
+ private String sdno;
+
+ @Schema(description = "销售时间")
+ private String sdtime;
+
+ @Schema(description = "交易类别(订单类型)")
+ private String transactiontypeno;
+
+ @Schema(description = "销售特征名称(票种名称)", example = "赵六")
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/convert/asset/AssetConvert.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/convert/asset/AssetConvert.java
new file mode 100644
index 000000000..a33d9edff
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/convert/asset/AssetConvert.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.ticket.convert.asset;
+
+import cn.iocoder.yudao.module.ticket.api.asset.dto.TicketAssetRespDTO;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.asset.AssetDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @Description TODO
+ */
+@Mapper
+public interface AssetConvert {
+ AssetConvert INSTANCE = Mappers.getMapper(AssetConvert.class);
+ TicketAssetRespDTO convert02(AssetDO bean);
+ public List convertList02(List list);
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/convert/asset/AssetConvertImpl.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/convert/asset/AssetConvertImpl.java
new file mode 100644
index 000000000..bfc61c266
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/convert/asset/AssetConvertImpl.java
@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.ticket.convert.asset;
+
+import cn.iocoder.yudao.module.ticket.api.asset.dto.TicketAssetRespDTO;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.asset.AssetDO;
+
+import javax.annotation.Generated;
+import java.util.ArrayList;
+import java.util.List;
+
+@Generated(
+ value = "org.mapstruct.ap.MappingProcessor",
+ date = "2024-06-26T14:31:50+0800",
+ comments = "version: 1.5.5.Final, compiler: javac, environment: Java 1.8.0_291 (Oracle Corporation)"
+)
+public class AssetConvertImpl implements AssetConvert {
+ @Override
+ public TicketAssetRespDTO convert02(AssetDO bean) {
+ if (bean == null) {
+ return null;
+ }
+ TicketAssetRespDTO ticketAssetRespDTO = new TicketAssetRespDTO();
+ ticketAssetRespDTO.setId(bean.getId());
+ ticketAssetRespDTO.setAssettype(bean.getAssettype());
+ ticketAssetRespDTO.setAssetname(bean.getAssetname());
+ ticketAssetRespDTO.setAssettypename(bean.getAssettypename());
+ ticketAssetRespDTO.setDataId(bean.getDataId());
+ ticketAssetRespDTO.setIsOnline(bean.getIsOnline());
+ if (bean.getLastfeedbacktime() != null) {
+ ticketAssetRespDTO.setLastfeedbacktime(bean.getLastfeedbacktime());
+
+ }
+ return ticketAssetRespDTO;
+ }
+
+ @Override
+ public List convertList02(List list) {
+ if ( list == null ) {
+ return null;
+ }
+ List list1 = new ArrayList<>( list.size() );
+ for ( AssetDO assetDO : list ) {
+ list1.add( convert02( assetDO ) );
+ }
+ return list1;
+ }
+}
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/asset/AssetDO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/asset/AssetDO.java
new file mode 100644
index 000000000..3e425bb48
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/asset/AssetDO.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.ticket.dal.dataobject.asset;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 设备 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("asset")
+@KeySequence("asset_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssetDO extends BaseDO {
+
+ /**
+ * ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 数据ID
+ */
+ private String dataId;
+ /**
+ * 设备名称
+ */
+ private String assetname;
+ /**
+ * 设备类型ID
+ */
+ private String assettype;
+ /**
+ * 设备类型名称
+ */
+ private String assettypename;
+ /**
+ * 设备状态
+ *
+ * 枚举 {@link TODO asset_status_type 对应的类}
+ */
+ private String isOnline;
+ /**
+ * 最后一次反馈时间
+ */
+ private Long lastfeedbacktime;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/checkticket/CheckTicketDO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/checkticket/CheckTicketDO.java
new file mode 100644
index 000000000..ede1b5373
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/checkticket/CheckTicketDO.java
@@ -0,0 +1,67 @@
+package cn.iocoder.yudao.module.ticket.dal.dataobject.checkticket;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 检票 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("checkticket")
+@KeySequence("checkticket_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CheckTicketDO extends BaseDO {
+
+ /**
+ * ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 数据ID
+ */
+ private String dataId;
+ /**
+ * 检票点ID
+ */
+ private String checkstation;
+ /**
+ * 检票点名称
+ */
+ private String checkstationname;
+ /**
+ * 检票日期
+ */
+ private String checkticketdate;
+ /**
+ * 检票时间
+ */
+ private String checktickettime;
+ /**
+ * 人数
+ */
+ private Integer personcount;
+ /**
+ * 订单明细ID
+ */
+ private String sdshipping;
+ /**
+ * 票ID
+ */
+ private String ticket;
+ /**
+ * 销售特征名称(票种名称)
+ */
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/saledata/SaleDataDO.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/saledata/SaleDataDO.java
new file mode 100644
index 000000000..e01488b92
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/dataobject/saledata/SaleDataDO.java
@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.ticket.dal.dataobject.saledata;
+
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 售票 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("saledata")
+@KeySequence("saledata_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SaleDataDO extends BaseDO {
+
+ /**
+ * ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 数据id
+ */
+ private String dataId;
+ /**
+ * 金额
+ */
+ private BigDecimal amount;
+ /**
+ * 证件号
+ */
+ private String certificateno;
+ /**
+ * 证件类别
+ */
+ private String certificatetype;
+ /**
+ * 产品ID
+ */
+ private String item;
+ /**
+ * 产品名称
+ */
+ private String itemname;
+ /**
+ * 产品类型ID
+ */
+ private String itemtype;
+ /**
+ * 产品类型名称
+ */
+ private String itemtypename;
+ /**
+ * 出游日期
+ */
+ private String productbatchno;
+ /**
+ * 数量
+ */
+ private Integer quantity;
+ /**
+ * 销售日期
+ */
+ private String sddate;
+ /**
+ * 订单号
+ */
+ private String sdno;
+ /**
+ * 销售时间
+ */
+ private String sdtime;
+ /**
+ * 交易类别(订单类型)
+ */
+ private String transactiontypeno;
+ /**
+ * 销售特征名称(票种名称)
+ */
+ private String salepropetyvaluename;
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/asset/AssetMapper.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/asset/AssetMapper.java
new file mode 100644
index 000000000..53d5878a1
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/asset/AssetMapper.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.ticket.dal.mysql.asset;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.asset.AssetDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.ticket.controller.admin.asset.vo.*;
+
+/**
+ * 设备 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AssetMapper extends BaseMapperX {
+
+ default PageResult selectPage(AssetPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(AssetDO::getId, reqVO.getId())
+ .eqIfPresent(AssetDO::getDataId, reqVO.getDataId())
+ .likeIfPresent(AssetDO::getAssetname, reqVO.getAssetname())
+ .eqIfPresent(AssetDO::getAssettype, reqVO.getAssettype())
+ .likeIfPresent(AssetDO::getAssettypename, reqVO.getAssettypename())
+ .eqIfPresent(AssetDO::getIsOnline, reqVO.getIsOnline())
+ .betweenIfPresent(AssetDO::getLastfeedbacktime, reqVO.getLastfeedbacktime())
+ .orderByDesc(AssetDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/checkticket/CheckTicketMapper.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/checkticket/CheckTicketMapper.java
new file mode 100644
index 000000000..780f6de8a
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/checkticket/CheckTicketMapper.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.ticket.dal.mysql.checkticket;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.vo.CheckTicketPageReqVO;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.checkticket.CheckTicketDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.ticket.controller.admin.checkticket.vo.*;
+
+/**
+ * 检票 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface CheckTicketMapper extends BaseMapperX {
+
+ default PageResult selectPage(CheckTicketPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(CheckTicketDO::getId, reqVO.getId())
+ .eqIfPresent(CheckTicketDO::getDataId, reqVO.getDataId())
+ .eqIfPresent(CheckTicketDO::getCheckstation, reqVO.getCheckstation())
+ .likeIfPresent(CheckTicketDO::getCheckstationname, reqVO.getCheckstationname())
+ .betweenIfPresent(CheckTicketDO::getCheckticketdate, reqVO.getCheckticketdate())
+ .betweenIfPresent(CheckTicketDO::getChecktickettime, reqVO.getChecktickettime())
+ .eqIfPresent(CheckTicketDO::getPersoncount, reqVO.getPersoncount())
+ .eqIfPresent(CheckTicketDO::getSdshipping, reqVO.getSdshipping())
+ .eqIfPresent(CheckTicketDO::getTicket, reqVO.getTicket())
+ .likeIfPresent(CheckTicketDO::getSalepropetyvaluename, reqVO.getSalepropetyvaluename())
+ .orderByDesc(CheckTicketDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/saledata/SaleDataMapper.java b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/saledata/SaleDataMapper.java
new file mode 100644
index 000000000..706a41d47
--- /dev/null
+++ b/ludu-module-ticket-manager/ludu-module-ticket-manager-biz/src/main/java/cn/iocoder/yudao/module/ticket/dal/mysql/saledata/SaleDataMapper.java
@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.ticket.dal.mysql.saledata;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.ticket.dal.dataobject.saledata.SaleDataDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.ticket.controller.admin.saledata.vo.*;
+import org.apache.ibatis.annotations.Result;
+import org.apache.ibatis.annotations.Results;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 售票 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface SaleDataMapper extends BaseMapperX {
+
+ default PageResult selectPage(SaleDataPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(SaleDataDO::getId, reqVO.getId())
+ .eqIfPresent(SaleDataDO::getDataId, reqVO.getDataId())
+ .eqIfPresent(SaleDataDO::getAmount, reqVO.getAmount())
+ .eqIfPresent(SaleDataDO::getCertificateno, reqVO.getCertificateno())
+ .eqIfPresent(SaleDataDO::getCertificatetype, reqVO.getCertificatetype())
+ .eqIfPresent(SaleDataDO::getItem, reqVO.getItem())
+ .likeIfPresent(SaleDataDO::getItemname, reqVO.getItemname())
+ .eqIfPresent(SaleDataDO::getItemtype, reqVO.getItemtype())
+ .likeIfPresent(SaleDataDO::getItemtypename, reqVO.getItemtypename())
+ .eqIfPresent(SaleDataDO::getProductbatchno, reqVO.getProductbatchno())
+ .eqIfPresent(SaleDataDO::getQuantity, reqVO.getQuantity())
+ .betweenIfPresent(SaleDataDO::getSddate, reqVO.getSddate())
+ .eqIfPresent(SaleDataDO::getSdno, reqVO.getSdno())
+ .betweenIfPresent(SaleDataDO::getSdtime, reqVO.getSdtime())
+ .eqIfPresent(SaleDataDO::getTransactiontypeno, reqVO.getTransactiontypeno())
+ .likeIfPresent(SaleDataDO::getSalepropetyvaluename, reqVO.getSalepropetyvaluename())
+ .orderByDesc(SaleDataDO::getId));
+ }
+
+ /**
+ * 查询所有数据的性别分类和个数
+ */
+ @Select("SELECT " +
+ "CASE WHEN CAST(SUBSTRING(certificateno, LENGTH(certificateno) - 1, 1) AS SIGNED) % 2 = 1 THEN 'male' ELSE 'female' END AS gender, " +
+ "COUNT(*) AS count " +
+ "FROM saledata " +
+ "GROUP BY gender")
+ @Results({
+ @Result(property = "gender", column = "gender"),
+ @Result(property = "count", column = "count")
+ })
+ List