chore(backend): 落地 ADS 治理体系、升级日志并收录后端模板基线代码

This commit is contained in:
zhoulei
2026-08-19 14:39:18 +08:00
parent 1f84456421
commit 54c21876e4
113 changed files with 19953 additions and 0 deletions
@@ -0,0 +1,31 @@
##xxl-job
xxl:
job:
# admin:
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; http://localhost:9900/xxl-job-admin
# addresses: http://localhost:9900
# addresses: http://192.168.2.130:9900
executor:
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
# appname: example-test
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
# address:
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
# ip:
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
### 使用产品
appname: example
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
#因为使用docker部署,为了方便docker镜像映射,发布时固定使用“9001”作为定时任务执行器端口
port: 9061
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 7
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath: D:\apps\file\work\log\xxljob\
### 执行器通讯TOKEN [选填]:非空时启用;
# accessToken:
@@ -0,0 +1,100 @@
logging:
config: classpath:logback-spring.xml
maxhistory: 7
server:
port: 9060
max-http-header-size: 20480
servlet:
context-path: /example
session:
timeout: PT4H
spring:
data:
jpa:
repositories:
bootstrap-mode: lazy #jpa延迟启动
main:
lazy-initialization: true #bean延迟启动
servlet:
multipart:
max-file-size: 50MB #上传文件的大小限定
max-request-size: 50MB #上传请求数据的大小限定,限定请求的总数据大小
profiles:
active: xxljob
datasource:
druid:
#如果连接泄露,是否需要回收泄露的连接,默认false
removeAbandoned: true
#如果回收了泄露的连接,是否要打印一条log,默认false
logAbandoned: true
#连接回收的超时时间(单位:秒),默认5分钟
removeAbandonedTimeout: 300
#查询超时时间(单位:秒)
query-timeout: 300
#事务查询超时时间(单位:秒),如果小于或等于0,则取query-timeout配置
#transaction-query-timeout: 5
# 配置初始化大小、最小、最大
initial-size: 10
minIdle: 11
max-active: 60
# 配置获取连接等待超时的时间(单位:毫秒)
max-wait: 60000
#在线接口文档扫描类路径
springdoc:
packages-to-scan:
- abacus.springboot.example.api
paths-to-match:
abacus:
#在线数据字典扫描类路径
entitypackages:
- abacus.springboot.example.dao
#本系统Controller扫描类路径
controllerPackages:
- abacus.springboot.example.controller
#以下uri将不被统一响应体拦截包装器进行包装
responseExcludePath:
# acas系统编码
acas:
current:
number: example
feign:
client:
config:
#feign全局超时配置,单位:毫秒
default:
connectTimeout: 10000
readTimeout: 30000
#单个微服务超时配置,优先级高于全局
# abacus-oauth2:
# connectTimeout: 10000
# readTimeout: 10000
management:
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
startup:
enabled: true
endpoints:
web:
exposure:
include: "*"
base-path: /services/actuator
metrics:
export:
prometheus:
enabled: true
@@ -0,0 +1,31 @@
spring:
application:
name: example
cloud:
nacos:
username: v10dev
password: Abacus2022
config:
server-addr: 192.168.2.130:8848
namespace: 3d18c67a-d086-4c16-b377-a633c487eafb
file-extension: yml
group: DEFAULT_GROUP
extension-configs:
- data-id: abacus-database.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-discovery.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-acas.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-redis.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-actuator.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-xxljob.yml
group: COMMON_GROUP
refresh: false
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- always a good activate OnConsoleStatusListener -->
<statusListener
class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<springProperty name="LOGPATH" source="logging.path" />
<springProperty name="APPNAME" source="spring.application.name" />
<property name="log.path" value="F:/Eclipse/work/log/${APPNAME:-.}/${HOSTNAME:-.}" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/access/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${log.path}/access/access-%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>1</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%t{yyyy-MM-dd HH:mm:ss.SS} "%r" %s %b %D %h "%i{Referer}" "%i{User-Agent}" "%i{X-Request-ID}" "%i{X-Forwarded-For}"</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender-ref ref="FILE" />
</configuration>
@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true">
<contextName>logback</contextName>
<springProperty name="APPNAME" source="spring.application.name" />
<springProperty name="LOGMAXHISTORY" source="logging.maxhistory" />
<property name="log.path" value="F:/Eclipse/work//log/${APPNAME:-.}/${HOSTNAME:-.}" />
<property name="log.maxhistory" value="${LOGMAXHISTORY:-7}" />
<property name="log.maxfilesize" value="50MB" />
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%15.15t] %-40.40logger{39} [%X{traceId:-},%X{spanId:-}] : %m%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/warn/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--慢sql输出-->
<appender name="ABACUSSLOWSQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/slowsql/slowsql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/slowsql/slowsql.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="abacusslowsql" additivity="false" >
<appender-ref ref="ABACUSSLOWSQL_FILE"/>
</logger>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!--开发环境:打印控制台-->
</configuration>
@@ -0,0 +1,31 @@
##xxl-job
xxl:
job:
# admin:
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; http://localhost:9900/xxl-job-admin
# addresses: http://localhost:9900
# addresses: http://192.168.2.130:9900
executor:
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
# appname: example-test
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
# address:
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
# ip:
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
### 使用产品
appname: example
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
#因为使用docker部署,为了方便docker镜像映射,发布时固定使用“9001”作为定时任务执行器端口
port: 9061
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 7
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath: D:\apps\file\work\log\xxljob\
### 执行器通讯TOKEN [选填]:非空时启用;
# accessToken:
@@ -0,0 +1,71 @@
server:
port: 9000
max-http-header-size: 20480
servlet:
session:
timeout: PT4H
spring:
data:
jpa:
repositories:
bootstrap-mode: lazy #jpa延迟启动
main:
lazy-initialization: true #bean延迟启动
servlet:
multipart:
max-file-size: 50MB #上传文件的大小限定
max-request-size: 50MB #上传请求数据的大小限定,限定请求的总数据大小
profiles:
active: xxljob
datasource:
druid:
#如果连接泄露,是否需要回收泄露的连接,默认false
removeAbandoned: true
#如果回收了泄露的连接,是否要打印一条log,默认false
logAbandoned: true
#连接回收的超时时间,默认5分钟
#removeAbandonedTimeout: 10
#查询超时时间(单位:秒)
query-timeout: 300
#事务查询超时时间(单位:秒),如果小于或等于0,则取query-timeout配置
#transaction-query-timeout: 5
# 配置初始化大小、最小、最大
initial-size: 5
minIdle: 10
max-active: 30
# 配置获取连接等待超时的时间(单位:毫秒)
max-wait: 60000
# acas系统编码
acas:
current:
number: example
#在线接口文档扫描类路径
springdoc:
packages-to-scan:
- abacus.springboot.example.springdoc
paths-to-match:
abacus:
#在线数据字典扫描类路径
entitypackages:
- abacus.springboot.example
#本系统Controller扫描类路径
controllerPackages:
- abacus.springboot.example
#以下uri将不被统一响应体拦截包装器进行包装
responseExcludePath:
@@ -0,0 +1,31 @@
spring:
application:
name: example
cloud:
nacos:
username: v10dev
password: Abacus2022
config:
server-addr: 192.168.2.130:8848
namespace: 3d18c67a-d086-4c16-b377-a633c487eafb
file-extension: yml
group: DEFAULT_GROUP
extension-configs:
- data-id: abacus-database.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-discovery.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-acas.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-redis.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-actuator.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-xxljob.yml
group: COMMON_GROUP
refresh: false
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- always a good activate OnConsoleStatusListener -->
<statusListener
class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<springProperty name="LOGPATH" source="logging.path" />
<springProperty name="APPNAME" source="spring.application.name" />
<property name="log.path" value="/apps/log/${APPNAME:-.}/${HOSTNAME:-.}" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/access/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${log.path}/access/access-%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>1</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%t{yyyy-MM-dd HH:mm:ss.SSS} "%r" %s %b %D %h "%i{Referer}" "%i{User-Agent}" "%i{X-Request-ID}" "%i{X-Forwarded-For}" "%i{commonParam}" </pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender-ref ref="FILE" />
</configuration>
@@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true">
<contextName>logback</contextName>
<springProperty name="APPNAME" source="spring.application.name" />
<springProperty name="LOGMAXHISTORY" source="logging.maxhistory" />
<conversionRule conversionWord="menu" converterClass="abacus.commons.log.MenuConverter" />
<conversionRule conversionWord="module" converterClass="abacus.commons.log.ModuleConverter" />
<conversionRule conversionWord="rid" converterClass="abacus.commons.log.RequestIdConverter" />
<property name="log.path" value="/apps/log/${APPNAME:-.}/${HOSTNAME:-.}" />
<property name="log.maxhistory" value="${LOGMAXHISTORY:-365}" />
<property name="log.maxfilesize" value="100MB" />
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%15.15t] %-40.40logger{39} [%rid,%X{traceId:-},%X{spanId:-}] [%menu,%module] : %m%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/warn/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--慢sql输出-->
<appender name="ABACUSSLOWSQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/slowsql/slowsql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/slowsql/slowsql.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="abacusslowsql" additivity="false" >
<appender-ref ref="CONSOLE" />
<appender-ref ref="ABACUSSLOWSQL_FILE"/>
</logger>
<!--请求外部日志输出-->
<appender name="EXTERNALREQUESTLOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/resttemplate/resttemplate.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/resttemplate/resttemplate.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="externalrequestlog" additivity="false" >
<appender-ref ref="CONSOLE" />
<appender-ref ref="EXTERNALREQUESTLOG_FILE"/>
</logger>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!--开发环境:打印控制台-->
</configuration>
@@ -0,0 +1,17 @@
##xxl-job
xxl:
job:
executor:
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
### 使用产品
appname: example
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
#因为使用docker部署,为了方便docker镜像映射,发布时固定使用“9001”作为定时任务执行器端口
port: 9001
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 7
@@ -0,0 +1,50 @@
server:
port: 9000
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
profiles:
active: xxljob
jpa:
show-sql: false
datasource:
druid:
#如果连接泄露,是否需要回收泄露的连接,默认false
removeAbandoned: true
#如果回收了泄露的连接,是否要打印一条log,默认false
logAbandoned: true
#连接回收的超时时间,默认5分钟
#removeAbandonedTimeout: 10
#查询超时时间(单位:秒)
query-timeout: 300
#事务查询超时时间(单位:秒),如果小于或等于0,则取query-timeout配置
#transaction-query-timeout: 5
# 配置初始化大小、最小、最大
initial-size: 5
minIdle: 10
max-active: 30
# 配置获取连接等待超时的时间(单位:毫秒)
max-wait: 60000
acas:
current:
number: example
springdoc:
packages-to-scan:
- abacus.springboot.example.api
paths-to-match:
abacus:
entitypackages:
- abacus.springboot.example
@@ -0,0 +1,31 @@
spring:
application:
name: example
cloud:
nacos:
username: v10dev
password: Abacus2022
config:
server-addr: v10sys.abacus.private:8848
namespace: 3d18c67a-d086-4c16-b377-a633c487eafb
file-extension: yml
group: DEFAULT_GROUP
extension-configs:
- data-id: abacus-database.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-discovery.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-acas.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-redis.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-actuator.yml
group: COMMON_GROUP
refresh: false
- data-id: abacus-xxljob.yml
group: COMMON_GROUP
refresh: false
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- always a good activate OnConsoleStatusListener -->
<statusListener
class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<springProperty name="LOGPATH" source="logging.path" />
<springProperty name="APPNAME" source="spring.application.name" />
<property name="log.path" value="/apps/log/${APPNAME:-.}/${HOSTNAME:-.}" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/access/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${log.path}/access/access-%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>1</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%t{yyyy-MM-dd HH:mm:ss.SSS} "%r" %s %b %D %h "%i{Referer}" "%i{User-Agent}" "%i{X-Request-ID}" "%i{X-Forwarded-For}" "%i{commonParam}" </pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender-ref ref="FILE" />
</configuration>
@@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true">
<contextName>logback</contextName>
<springProperty name="APPNAME" source="spring.application.name" />
<springProperty name="LOGMAXHISTORY" source="logging.maxhistory" />
<conversionRule conversionWord="menu" converterClass="abacus.commons.log.MenuConverter" />
<conversionRule conversionWord="module" converterClass="abacus.commons.log.ModuleConverter" />
<conversionRule conversionWord="rid" converterClass="abacus.commons.log.RequestIdConverter" />
<property name="log.path" value="/apps/log/${APPNAME:-.}/${HOSTNAME:-.}" />
<property name="log.maxhistory" value="${LOGMAXHISTORY:-7}" />
<property name="log.maxfilesize" value="50MB" />
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%15.15t] %-40.40logger{39} [%rid,%X{traceId:-},%X{spanId:-}] [%menu,%module] : %m%n" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/warn/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/debug/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log.maxhistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--慢sql输出-->
<appender name="ABACUSSLOWSQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/slowsql/slowsql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/slowsql/slowsql.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="abacusslowsql" additivity="false" >
<appender-ref ref="CONSOLE" />
<appender-ref ref="ABACUSSLOWSQL_FILE"/>
</logger>
<!--请求外部日志输出-->
<appender name="EXTERNALREQUESTLOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/resttemplate/resttemplate.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/resttemplate/resttemplate.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.maxfilesize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="externalrequestlog" additivity="false" >
<appender-ref ref="CONSOLE" />
<appender-ref ref="EXTERNALREQUESTLOG_FILE"/>
</logger>
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!--开发环境:打印控制台-->
</configuration>
@@ -0,0 +1,16 @@
# 子系统中文名称(负责人姓名)
## 1.0.1(2024-04-12)
**依赖子系统**
**前置条件**
**更新说明**
- 2026-08-18 M2 示例净化(示范即正确):D1 `JcBillAccess` 原生 SQL 全量参数化(86 处 `?` 占位符,0 处字符串拼参);D2 `JcBillController` 业务编排下沉至新建 `esb/JcBillBizService`(含 `saveJcBill`/`updateJcbill`/`hgAnalyze` 等 5 方法),并移除死代码 `jcAnalyze`D3 包名 `repositroy``repository`(含 7 个接口文件名重命名)。详见 `docs/log/2026-08-18-m2-example-purify.md`
## 1.0.2(2026-08-19)
**依赖子系统**
**前置条件**
**更新说明**
- 治理体系落地(ADS Retrofit):新增 `.project.agents/`CLAUDE/AGENTS/SELF_CONSTRAINTS/VIBECODING_GUIDE/settings + context 四文档),前后端共享约束单源化于工作区 `docs/``coding-standards.md`/`architecture.md`/`agent-guide.md`),本仓库文档以指针引用。
- 分层约定与 `docs/coding-standards.md` 对齐(api/controller/dao/esb/pi/impl/repository/wsi/config/util/vo);`util``vo` 包冻结(既有兼容、新增禁止)。
- 工作区纳入单一 git 仓库(`D:\workBuddySpace\member`)。
@@ -0,0 +1,259 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置说明: 节点<abacus> 属性[id],系统唯一标识 数据库语法翻译器属性[translator],配置为“false”,则不开启对各个数据库的翻译功能,不配置或配置其他值默认为“true”;
当[translator]为true时,升级sql使用mssqlserver数据库的语法进行配置;列如,ERP的各个系统,需要满足不同数据库的部署需求;
当[translator]为false时,升级sql使用那种数据库语法由开发者自己指定;例如,云商城相关各个系统,直接使用MySQL语法进行配置;
<abacus translator="true"> 节点<upgrade>,配置每个版本的升级sql,版本属性[version],值格式“yyyy-MM-dd”或"yyyy-MM-dd.count",
count代表次数,如日期相同,则对比次数 <upgrade id="example" version="2022-03-03"> 节点<sql>,配置该版本需要执行的sql,每条sql使用符号“;”分隔
<sql></sql> 以下为可选配置,并且晚于节点<sql>中的sql执行: 节点<oracle>,指定oracle数据库专用sql,例如有oracle专用关键字的sql
<oracle></oracle> 节点<sybase>,指定sybase数据库专用sql,例如有sybase专用关键字的sql <sybase></sybase>
节点<mysql>,指定mysql数据库专用sql,例如有mysql专用关键字的sql <mysql></mysql> </upgrade> </abacus>
注意事项: 1、应用第一次部署时,以当天日期作为初始版本 2、当一次升级有多个版本升级sql需要执行时,会以version值升序排序,从上到下执行
3、更新sql尽量配置产品功能升级的常规sql,例如建表、新增字段等等。 需要大量调整数据的sql、带有逻辑调整数据的sql、使用了列存储索引的表,单独联系项目人员执行。
4、不建议建表或者新增字段时使用“default”默认一个值,mssqlserver删除或者修改字段时,会因为DF约束执行失败,最好由程序指定默认值
5、自增关键字identity固定放在字段类型后面,否则在sybase数据库会执行失败 6、翻译器现支持mssqlserver转mysql、oracle、sybase的部分语法,具体语法参考语法测试用例 -->
<abacus id="example" translator="true">
<upgrade version="2026-08-18.2">
<sql>
-- 稽查主单
create table jc_bill (
id varchar(20) not null,
version int not null,
status int default (1) null,
goods varchar(120) null,
warehouse varchar(20) null,
warehousename varchar(120) null,
receivedt varchar(10) null,
quantity decimal(30,8) null,
subtotal decimal(30,2) null,
billin varchar(20) null,
billindt datetime null,
applicant varchar(20) null,
applicantname varchar(120) null,
applicantdt datetime null,
dt datetime default current_timestamp not null,
constraint pk_jc_bill primary key (id)
);
create index jc_bill_search on jc_bill(id, applicant, status, goods,
applicantdt, dt);
create index jc_bill_id on jc_bill(id, goods, dt);
create index jc_bill_dt on jc_bill(dt);
-- 稽查明细
create table jc_billsource_item (
id bigint auto_increment not null primary key, -- 自增长编码
version int not null,
indexno int null,
billid varchar(20) not null,
status int default (1) null,
recsource varchar(20) null,
recplatform varchar(20) null,
channel varchar(60) null,
price decimal(30,8) null,
quantity decimal(30,8) null,
numbers decimal(30,8) null,
subtotal decimal(30,2) null,
goodsid varchar(20) null,
logisticsid varchar(60) null,
billout varchar(600) null,
billoutdt datetime null,
billoutwh varchar(20) null,
billoutwhname varchar(60) null,
product varchar(20) null,
productname varchar(200) null,
account varchar(20) null,
accountname varchar(200) null,
operator varchar(20) null,
operatorname varchar(60) null,
groupid varchar(20) null,
groupname varchar(60) null,
salearea varchar(20) null,
saleareaname varchar(60) null,
source varchar(20) null,
reason varchar(300) null,
dt datetime default current_timestamp not null
);
create index jc_billsource_item_billid on jc_billsource_item(billid);
-- 溯源明细
create table jc_source_item (
id bigint auto_increment not null primary key, -- 自增长编码
version int not null,
billid varchar(20) not null,
srcitemid varchar(20) not null,
status int default (0) null,
goodsid varchar(20) null,
logisticsid varchar(60) null,
billout varchar(20) null,
billoutdt datetime null,
billoutwh varchar(20) null,
billoutwhname varchar(60) null,
product varchar(20) null,
productname varchar(200) null,
account varchar(20) null,
accountname varchar(200) null,
operator varchar(20) null,
operatorname varchar(60) null,
groupid varchar(20) null,
groupname varchar(60) null,
salearea varchar(20) null,
saleareaname varchar(60) null,
source varchar(20) null,
dt datetime default current_timestamp not null
);
create index jc_source_item_billid on jc_source_item(billid, source,
srcitemid);
create index jc_source_item_billid_status on jc_source_item(billid,
srcitemid, status);
-- 稽查入库(回购通知)明细(对溯源信息汇总的入库信息-待生成回购)
create table jc_billin_item (
id bigint auto_increment not null primary key, -- 自增长编码
version int not null,
billid varchar(20) not null,
billin varchar(20) null,
billhg varchar(20) null,
status int default (1) null,
channel varchar(60) null,
account varchar(20) null,
accountname varchar(200) null,
product varchar(20) null,
productname varchar(200) null,
price decimal(30,8) null,
quantity decimal(30,8) null,
numbers decimal(30,8) null,
hgprice decimal(30,8) null,
hgamount decimal(30,2) null,
operator varchar(20) null,
operatorname varchar(60) null,
groupid varchar(20) null,
groupname varchar(60) null,
salearea varchar(20) null,
saleareaname varchar(60) null,
fhquantity decimal(30,8) null,
fhnumbers decimal(30,8) null,
fhwarehouse varchar(20) null,
fhwarehousename varchar(120) null,
wdtorder varchar(20) null,
wdtbillout varchar(20) null,
wdtbillouttyp varchar(20) null,
wdtdt datetime null,
dt datetime default current_timestamp not null
);
create index jc_billin_item_billid on jc_billin_item(billhg, billid,
billin);
create index jc_billin_item_status on jc_billin_item(status);
-- 回购单-主单
create table jc_billhg (
id varchar(20) not null,
version int not null,
billid varchar(20) not null,
status int default (1) null,
source varchar(20) null,
account varchar(20) null,
accountname varchar(200) null,
quantity decimal(30,8) null,
subtotal decimal(30,2) null,
freight decimal(30,2) null,
manager varchar(20) null,
managername varchar(60) null,
consignee varchar(20) null,
consigneephone varchar(30) null,
province varchar(10) null,
provincename varchar(60) null,
city varchar(10) null,
cityname varchar(60) null,
area varchar(10) null,
areaname varchar(60) null,
address varchar(300) null,
receiveway varchar(20) null,
remark varchar(300) null,
remark1 varchar(300) null,
salearea varchar(20) null,
saleareaname varchar(60) null,
groupid varchar(20) null,
groupname varchar(60) null,
fhwarehouse varchar(20) null,
fhwarehousename varchar(120) null,
wdtorder varchar(20) null,
wdtbillout varchar(20) null,
wdtbillouttyp varchar(20) null,
wdtdt datetime null,
logisticsname varchar(60) null,
logisticscode varchar(60) null,
logisticstype varchar(60) null,
logisticsno varchar(20) null,
found varchar(20) null,
foundname varchar(60) null,
founddt datetime null,
submit varchar(20) null,
submitname varchar(60) null,
submitdt datetime null,
audit varchar(20) null,
auditname varchar(60) null,
auditdt datetime null,
dt datetime default current_timestamp not null,
constraint pk_jc_billhg primary key (id)
);
create index jc_billhg_founddt on jc_billhg(founddt, account, salearea,
billid, status, manager);
create index jc_billhg_billid on jc_billhg(billid);
create index jc_billhg_status_founddt on jc_billhg(status, founddt);
create index jc_billhg_consigneephone on jc_billhg(consigneephone, account,
accountname);
create index jc_billhg_dt on jc_billhg(dt);
-- 回购单-支付明细
create table jc_billhg_pay (
id bigint auto_increment not null primary key, -- 自增长编码
version int not null,
billid varchar(20) not null,
billhg varchar(20) not null,
payment varchar(20) not null,
amount decimal(30,2) null,
zhmc varchar(20) not null,
khyh varchar(150) not null,
yhzh varchar(60) not null,
dt datetime default current_timestamp not null
);
create index jc_billhg_pay_billhg on jc_billhg_pay(billhg, payment);
create index jc_billhg_pay_billid on jc_billhg_pay(billid);
create index jc_billhg_pay_dt on jc_billhg_pay(dt);
-- 图片
create table jc_bill_photo (
id bigint auto_increment not null primary key, -- 自增长编码
version int not null,
srcid varchar(20) not null,
srcitemid varchar(20) not null,
typephoto varchar(30) not null,
urlphoto varchar(200) not null,
dt datetime default current_timestamp not null
);
create index jc_bill_photo_srcitemid on jc_bill_photo(srcid, srcitemid,
typephoto);
create index jc_bill_photo_srcid on jc_bill_photo(srcid, typephoto);
-- 2025-03-14
alter table jc_billhg add column proofaccountname varchar(150) null;
alter table jc_billhg add column proofdt datetime null;
alter table jc_bill add column hgstatus int default 0 null;
-- 2025-01-22alter column 改为 modify column
alter table jc_billsource_item modify column billout varchar(600) null;
-- 2025-01-16
alter table jc_billin_item add column wdtoutdt datetime null;
alter table jc_billin_item add column wdtindt datetime null;
alter table jc_billhg add column wdtoutdt datetime null;
alter table jc_billhg add column wdtindt datetime null;
alter table jc_billsource_item modify column logisticsid varchar(600)
null;
alter table jc_source_item modify column logisticsid varchar(600) null;
-- 2025-01-06(原文件重复出现两次,已去重)
alter table jc_bill add column dept varchar(20) null;
</sql>
</upgrade>
</abacus>