Merge branch '0.8.X' of https://gitee.com/hdka/klp-oa into 0.8.X

This commit is contained in:
砂糖
2025-08-15 17:41:59 +08:00
17 changed files with 7861 additions and 214 deletions

View File

@@ -10,7 +10,8 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
* @author klp
*/
@SpringBootApplication
//@SpringBootApplication
@SpringBootApplication(exclude = org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.class)
public class KLPApplication {
public static void main(String[] args) {

View File

@@ -1,3 +1,12 @@
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /klp/server/temp
--- # WMS文件管理配置
klp:
file:
# 开发环境文件存储目录
directory-path: testDirectory
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
@@ -104,6 +113,10 @@ spring:
# 多久检查一次连接的活性
keepaliveTime: 30000
flyway:
baseline-on-migrate: true # 第一次运行时建立记录,不执行历史脚本
clean-disabled: true # 禁止清空库
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
redis:

View File

@@ -107,6 +107,10 @@ spring:
# 多久检查一次连接的活性
keepaliveTime: 30000
flyway:
baseline-on-migrate: true # 第一次运行时建立记录,不执行历史脚本
clean-disabled: true # 禁止清空库
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
redis:

View File

@@ -1,180 +0,0 @@
--- # 临时文件存储位置 避免临时文件被系统清理报错
spring.servlet.multipart.location: /klp/server/temp
--- # WMS文件管理配置
klp:
file:
# 开发环境文件存储目录
directory-path: testDirectory
--- # 监控中心配置
spring.boot.admin.client:
# 增加客户端开关
enabled: true
url: http://localhost:9090/admin
instance:
service-host-type: IP
username: klp
password: 123456
--- # xxl-job 配置
xxl.job:
# 执行器开关
enabled: false
# 调度中心地址:如调度中心集群部署存在多个地址则用逗号分隔。
admin-addresses: http://localhost:9100/xxl-job-admin
# 执行器通讯TOKEN非空时启用
access-token: xxl-job
executor:
# 执行器AppName执行器心跳注册分组依据为空则关闭自动注册
appname: xxl-job-executor
# 执行器端口号 执行器从9101开始往后写
port: 9101
# 执行器注册默认IP:PORT
address:
# 执行器IP默认自动获取IP
ip:
# 执行器运行日志文件存储磁盘路径
logpath: ./logs/xxl-job
# 执行器日志文件保存天数大于3生效
logretentiondays: 30
--- # 数据源配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: false
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错
strict: true
datasource:
# 主库数据源
master:
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://140.143.206.120:3306/klp-oa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: klp
password: KeLunPu123@
# 从库数据源
slave:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username:
password:
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@//localhost:1521/XE
# username: ROOT
# password: root
# hikari:
# connectionTestQuery: SELECT 1 FROM DUAL
# postgres:
# type: ${spring.datasource.type}
# driverClassName: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
# username: root
# password: root
# sqlserver:
# type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
# username: SA
# password: root
hikari:
# 最大连接池数量
maxPoolSize: 20
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间默认10分钟
idleTimeout: 600000
# 此属性控制池中连接的最长生命周期值0表示无限生命周期默认30分钟
maxLifetime: 1800000
# 连接测试query配置检测连接是否有效
connectionTestQuery: SELECT 1
# 多久检查一次连接的活性
keepaliveTime: 30000
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring:
redis:
# 地址
host: 140.143.206.120
# 端口默认为6379
port: 6379
# 数据库索引
database: 0
# 密码(如没有密码请注释掉)
password: KeLunPu123!
# 连接超时时间
timeout: 10s
# 是否开启ssl
ssl: false
redisson:
# redis key前缀
keyPrefix:
# 线程池数量
threads: 16
# Netty线程池数量
nettyThreads: 32
# 单节点配置
singleServerConfig:
# 客户端名称
clientName: ${klp.name}
# 最小空闲连接数
connectionMinimumIdleSize: 32
# 连接池大小
connectionPoolSize: 64
# 连接空闲超时,单位:毫秒
idleConnectionTimeout: 10000
# 命令等待超时,单位:毫秒
timeout: 3000
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
--- # mail 邮件发送
mail:
enabled: false
host: smtp.163.com
port: 465
# 是否需要用户名密码验证
auth: true
# 发送方遵循RFC-822标准
from: xxx@163.com
# 用户名注意如果使用foxmail邮箱此处user为qq号
user: xxx@163.com
# 密码注意某些邮箱需要为SMTP服务单独设置密码详情查看相关帮助
pass: xxxxxxxxxx
# 使用 STARTTLS安全连接STARTTLS是对纯文本通信协议的扩展。
starttlsEnable: true
# 使用SSL安全连接
sslEnable: true
# SMTP超时时长单位毫秒缺省值不超时
timeout: 0
# Socket连接超时值单位毫秒缺省值不超时
connectionTimeout: 0
--- # sms 短信
sms:
enabled: false
# 阿里云 dysmsapi.aliyuncs.com
# 腾讯云 sms.tencentcloudapi.com
endpoint: "dysmsapi.aliyuncs.com"
accessKeyId: xxxxxxx
accessKeySecret: xxxxxx
signName: 测试
# 腾讯专用
sdkAppId:

View File

@@ -101,6 +101,11 @@ spring:
deserialization:
# 允许对象忽略json中不存在的属性
fail_on_unknown_properties: false
# 实时更新数据库结构
flyway:
enabled: true
locations: classpath:db/migration
table: flyway_schema_history
# Sa-Token配置
sa-token:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
CREATE TABLE test_flyway (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 文件格式:
-- V{版本号}__{描述}.sql

View File

@@ -170,6 +170,17 @@
<artifactId>ip2region</artifactId>
</dependency>
<!-- 引入flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,68 @@
package com.klp.common.config;
import javax.annotation.Resource;
import javax.sql.DataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.output.MigrateResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FlywayConfig {
@Value("${spring.profiles.active}")
private String activeProfile;
@Value("${spring.flyway.baseline-on-migrate}")
private boolean baselineOnMigrate;
@Value("${spring.flyway.locations}")
private String locations;
@Value("${spring.flyway.table}")
private String table;
@Resource
private DataSource dataSource;
@Bean
public Flyway flyway() {
DataSource masterDataSource = ((DynamicRoutingDataSource) dataSource).getDataSource("master");
System.out.println("masterDataSource class: " + masterDataSource.getClass().getName());
// // 如果想显式拿底层 HikariDataSource
// if (masterDataSource instanceof ItemDataSource) {
// masterDataSource = ((ItemDataSource) masterDataSource).getRealDataSource();
// }
System.out.println("masterDataSource class: " + masterDataSource.getClass().getName());
return Flyway.configure()
.dataSource(masterDataSource) // 注意这里是真实主库 DataSource
.baselineOnMigrate(baselineOnMigrate)
.locations(locations)
.table(table)
.load();
}
@Bean
public CommandLineRunner flywayRunner(Flyway flyway) {
return args -> {
System.out.println("========== 当前环境: " + activeProfile + " ==========");
System.out.println("========== 开始执行 Flyway 数据库迁移 ==========");
MigrateResult result = flyway.migrate();
System.out.println("迁移成功版本数: " + result.migrationsExecuted);
result.migrations.forEach(m -> {
System.out.println("执行版本: " + m.version + ",描述: " + m.description);
});
System.out.println("========== Flyway 数据库迁移完成 ==========");
};
}
}

View File

@@ -12,8 +12,6 @@
<result property="storageTime" column="storage_time"/>
<result property="expirationDate" column="expiration_date"/>
<result property="status" column="status"/>
<result property="operatorId" column="operator_id"/>
<result property="lastUpdate" column="last_update"/>
<result property="delFlag" column="del_flag"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
@@ -62,12 +60,6 @@
<if test="bo.status != null and bo.status != ''">
AND s.status = #{bo.status}
</if>
<if test="bo.operatorId != null">
AND s.operator_id = #{bo.operatorId}
</if>
<if test="bo.lastUpdate != null">
AND s.last_update = #{bo.lastUpdate}
</if>
</where>
</select>

View File

@@ -1,10 +1,13 @@
package com.klp.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 排产计划对象 wms_schedule_plan
@@ -60,4 +63,13 @@ public class WmsSchedulePlan extends BaseEntity {
// * 工艺路线
// */
// private String processRoute;
/**
* 计划开始日期
*/
private Date startDate;
/**
* 计划结束日期
*/
private Date endDate;
}

View File

@@ -1,9 +1,11 @@
package com.klp.domain.bo;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
/**
@@ -52,6 +54,18 @@ public class WmsSchedulePlanBo extends BaseEntity {
*/
private Long priority;
/**
* 计划开始日期
*/
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private Date startDate;
/**
* 计划结束日期
*/
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private Date endDate;
// /**
// * 工艺路线
// */

View File

@@ -1,11 +1,10 @@
package com.klp.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.klp.domain.WmsProductSalesScript;
import com.klp.domain.bo.WmsProductSalesScriptBo;
import com.klp.domain.vo.WmsProductSalesScriptVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
/**
@@ -16,5 +15,5 @@ import org.apache.ibatis.annotations.Param;
*/
public interface WmsProductSalesScriptMapper extends BaseMapperPlus<WmsProductSalesScriptMapper, WmsProductSalesScript, WmsProductSalesScriptVo> {
Page<WmsProductSalesScriptVo> selectVoPagePlus(Page<Object> build,@Param("ew") LambdaQueryWrapper<WmsProductSalesScript> lqw);
Page<WmsProductSalesScriptVo> selectVoPagePlus(Page<Object> build,@Param("bo") WmsProductSalesScriptBo bo);
}

View File

@@ -55,8 +55,7 @@ public class WmsProductSalesScriptServiceImpl implements IWmsProductSalesScriptS
*/
@Override
public TableDataInfo<WmsProductSalesScriptVo> queryPageList(WmsProductSalesScriptBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsProductSalesScript> lqw = buildQueryWrapper(bo);
Page<WmsProductSalesScriptVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), lqw);
Page<WmsProductSalesScriptVo> result = baseMapper.selectVoPagePlus(pageQuery.build(),bo);
return TableDataInfo.build(result);
}

View File

@@ -54,7 +54,7 @@ public class WmsSchedulePlanServiceImpl implements IWmsSchedulePlanService {
public TableDataInfo<WmsSchedulePlanVo> queryPageList(WmsSchedulePlanBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsSchedulePlan> lqw = buildQueryWrapper(bo);
Page<WmsSchedulePlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 查排产计划总的开始结束时间
/*// 查排产计划总的开始结束时间
// 获取所有planId
List<Long> planIds = result.getRecords().stream()
.map(WmsSchedulePlanVo::getPlanId)
@@ -72,7 +72,7 @@ public class WmsSchedulePlanServiceImpl implements IWmsSchedulePlanService {
vo.setEndDate(agg.getEndDate());
}
}
}
}*/
return TableDataInfo.build(result);
}

View File

@@ -21,8 +21,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectVoPagePlus" resultType="com.klp.domain.vo.WmsProductSalesScriptVo">
SELECT s.*, p.product_code, p.product_name
FROM wms_product_sales_script s
LEFT JOIN wms_product p ON s.product_id = p.product_id
${ew.customSqlSegment}
LEFT JOIN wms_product p ON s.product_id = p.product_id and p.del_flag = 0
<where>
s.del_flag = 0
<if test="bo.scriptId!= null">
AND s.script_id = #{bo.scriptId}
</if>
<if test="bo.productId!= null">
AND s.product_id = #{bo.productId}
</if>
<if test="bo.scriptTitle!= null and bo.scriptTitle!= ''">
AND s.script_title LIKE CONCAT('%', #{bo.scriptTitle}, '%')
</if>
<if test="bo.scriptContent!= null and bo.scriptContent!= ''">
AND s.script_content LIKE CONCAT('%', #{bo.scriptContent}, '%')
</if>
<if test="bo.featurePoint!= null">
AND s.feature_point = #{bo.featurePoint}
</if>
<if test="bo.isEnabled!= null">
AND s.is_enabled = #{bo.isEnabled}
</if>
<if test="bo.keyword!= null and bo.keyword!= ''">
AND (s.script_title LIKE CONCAT('%', #{bo.keyword}, '%')
OR s.script_content LIKE CONCAT('%', #{bo.keyword}, '%'))
</if>
</where>
</select>

30
pom.xml
View File

@@ -52,14 +52,6 @@
</properties>
<profiles>
<profile>
<id>local</id>
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>local</profiles.active>
<logging.level>debug</logging.level>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
@@ -79,13 +71,6 @@
<logging.level>warn</logging.level>
</properties>
</profile>
<profile>
<id>stage</id>
<properties>
<profiles.active>stage</profiles.active>
<logging.level>warn</logging.level>
</properties>
</profile>
</profiles>
<!-- 依赖声明 -->
@@ -363,7 +348,8 @@
<artifactId>klp-demo</artifactId>
<version>${klp-flowable-plus.version}</version>
</dependency>
<!-- demo模块 -->
<!-- wms模块 -->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-wms</artifactId>
@@ -376,12 +362,24 @@
<artifactId>klp-reader</artifactId>
<version>${klp-flowable-plus.version}</version>
</dependency>
<!-- mes模块 -->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-mes</artifactId>
<version>${klp-flowable-plus.version}</version>
</dependency>
<!-- 引入flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>8.5.13</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>