This commit is contained in:
张秉卓
2025-12-23 12:15:42 +08:00
7 changed files with 249 additions and 86 deletions

View File

@ -0,0 +1,43 @@
#FROM --platform=linux/arm64 docker.ges.bjgastx.com/openjdk-arm64:8-jre
FROM jdk8u112:v1
RUN mkdir -p /root/logs/java/ \
&& mkdir -p /scm/logs/ \
&& mkdir -p /opt/app/ \
&& mkdir -p /uploadFile/ \
&& mkdir -p /opt/libs/ \
&& mkdir -p /var/log/app \
&& mkdir -p /opt/app/logs \
&& mkdir -p /opt/agent/config
ENV TZ "Asia/Shanghai"
ADD ./skywalking-agent.jar /opt/agent/skywalking-agent.jar
ADD ./agent.config /opt/agent/config/agent.config
RUN echo "set fileencodings=utf-8,gbk,gb2312,gb18030,cp936,latin1 \n set fenc=utf-8 \n set tenc=utf-8 \n set enc=utf-8 \n" |tee ~/.vimrc
ARG JAR_FILE
ARG PRO_FILE
ARG SOURCE_NAME
ADD ./startApp.sh /opt/app/
RUN chmod u+x /opt/app/startApp.sh
ADD ./${SOURCE_NAME} /opt/app/app.jar
#RUN test -f /opt/app/app.jar || { echo "Error: JAR file not found at ${SOURCE_NAME}"; exit 1; }
#应用名称
ENV APP_NAME=itc-pcitc-mdm
#skywalking-oap-server地址
ENV SKYWALKING_SERVER=10.10.2.102:11800
ENV ENV_APP_FILE_PATH=/opt/app/app.jar
ENV ENV_APP_PRO_FILE=local
ENV LIB_SERVER_ADDR=http://10.10.2.102:9500/
ENV LIB_SERVER_USER=pcitc
ENV LIB_SERVER_PWD=K9$pQ3!zX7@rT2&w
EXPOSE 8096 5005
ENTRYPOINT ["/opt/app/startApp.sh"]

View File

@ -0,0 +1,126 @@
#!/bin/bash
# 定义变量
CONTAINER_NAME="itc-pcitc-mdm"
IMAGE_NAME="10.10.2.102/itc-pcitc-mdm"
IMAGE_VERSION="2025-10-22-0851"
IMAGE_FULL="$IMAGE_NAME:$IMAGE_VERSION"
PORT=8096 # 服务暴露端口
CONTAINER_PORT=8096 # 服务暴露端口
TZ="Asia/Shanghai" # 时区设置
# 环境变量配置
ENV_APP_PRO_FILE="local"
file="$CONTAINER_NAME-version.txt"
# 检查文件是否存在(假设 $file 是目标文件变量,已在别处定义)
if [ ! -f "$file" ]; then
echo "文件 $file 不存在"
touch "$file" # 变量加引号,处理含空格的文件名
echo "$IMAGE_FULL" >> "$file"
echo "记录版本【$IMAGE_FULL】到 $file"
else
# 检查参数数量(建议移到脚本开头统一检查)
if [ $# -eq 2 ]; then
IMAGE_FULL="$IMAGE_NAME:$2"
echo "$IMAGE_FULL" >> "$file"
echo "记录版本【$IMAGE_FULL】到 $file"
else
# 修正赋值语法:等号两侧无空格
last_version=$(tail -n 1 "$file")
IMAGE_FULL="$last_version"
# 建议添加对 $IMAGE_FULL 的后续处理(如使用该变量)
fi
fi
# 显示帮助信息
show_help() {
echo "使用方法: $0 [操作类型]"
echo "操作类型:"
echo " deploy - 部署并启动服务容器"
echo " remove - 停止并删除容器及数据/日志目录"
echo " logs - 查看容器日志"
echo " help - 显示帮助信息"
}
# 部署服务
deploy_service() {
echo "部署镜像【$IMAGE_FULL"
# 检查容器是否已存在,存在则停止并删除
if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
echo "停止并删除现有容器: $CONTAINER_NAME"
docker stop $CONTAINER_NAME >/dev/null
docker rm $CONTAINER_NAME >/dev/null
fi
# 启动服务容器
echo "启动服务容器..."
docker run -d --privileged --restart always \
--name $CONTAINER_NAME \
-p $PORT:$CONTAINER_PORT \
-e ENV_APP_PRO_FILE=$ENV_APP_PRO_FILE \
$IMAGE_FULL
# 检查启动状态
if [ "$(docker ps -aq -f name=$CONTAINER_NAME -f status=running)" ]; then
echo "服务启动成功!"
echo "容器名称: $CONTAINER_NAME"
echo "访问地址: http://localhost:$PORT"
echo "环境变量: ENV_APP_PRO_FILE=$ENV_APP_PRO_FILE"
else
echo "服务启动失败,日志如下:"
docker logs $CONTAINER_NAME
exit 1
fi
}
# 删除服务
remove_service() {
# 检查容器是否存在
if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
echo "停止容器: $CONTAINER_NAME"
docker stop $CONTAINER_NAME >/dev/null
echo "删除容器: $CONTAINER_NAME"
docker rm $CONTAINER_NAME >/dev/null
else
echo "容器 $CONTAINER_NAME 不存在"
fi
}
# 查看日志
show_logs() {
if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
echo "查看 $CONTAINER_NAME 容器日志 (按 Ctrl+C 退出)..."
docker logs -f --tail 200 $CONTAINER_NAME
else
echo "容器 $CONTAINER_NAME 不存在"
fi
}
# 主逻辑
if [ $# -lt 1 ]; then
show_help
exit 1
fi
case "$1" in
deploy)
deploy_service
;;
remove)
remove_service
;;
logs)
show_logs
;;
help)
show_help
;;
*)
echo "无效的操作类型: $1"
show_help
exit 1
;;
esac

View File

@ -0,0 +1,19 @@
package com.xjrsoft;
import java.util.List;
import cn.hutool.core.util.ClassUtil;
public class ClassTest {
public static void main(String[] args) {
List<Object> list = java.util.Collections.synchronizedList(new java.util.ArrayList<>());
try {
boolean isNorm = ClassUtil.isNormalClass(list.getClass());
System.out.println("Class isNormalClass: " + isNorm);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -136,6 +136,15 @@ public class LogTableInfo {
return YesOrNoEnum.NO.getTextCode().equals(val); return YesOrNoEnum.NO.getTextCode().equals(val);
} }
public void setEnable(Object entity) {
if(entity==null) return;
setFieldValue(entity,GlobalConstant.VALID_PROPERTY,YesOrNoEnum.YES.getTextCode());
}
public void setDisable(Object entity) {
if(entity==null) return;
setFieldValue(entity,GlobalConstant.VALID_PROPERTY,YesOrNoEnum.NO.getTextCode());
}
public Object getFieldValue(Object entity,String field) { public Object getFieldValue(Object entity,String field) {
if(entity==null) return null; if(entity==null) return null;

View File

@ -5,8 +5,10 @@ import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.shaded.com.google.common.collect.Lists; import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.alibaba.nacos.shaded.com.google.common.collect.Maps; import com.alibaba.nacos.shaded.com.google.common.collect.Maps;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
import com.pictc.annotations.datalog.*; import com.pictc.annotations.datalog.*;
import com.pictc.converts.ConverUtil; import com.pictc.converts.ConverUtil;
@ -399,6 +401,7 @@ public class DataLogTools {
T old = findById(klazz, id); T old = findById(klazz, id);
if(old==null || tabInfo.isEnable(old)) return null; if(old==null || tabInfo.isEnable(old)) return null;
DataOperationContent<T> content = null; DataOperationContent<T> content = null;
//具体的数据修改是通过函数去处理的后台不用单独处理
if(listener!=null) { if(listener!=null) {
content = DataOperationContent.of(tabInfo,OperationType.ENABLE,old,old); content = DataOperationContent.of(tabInfo,OperationType.ENABLE,old,old);
listener.before(content); listener.before(content);
@ -410,6 +413,8 @@ public class DataLogTools {
content.setObj(entity); content.setObj(entity);
DataChangeLog datalog = createLog(klazz,OperationType.ENABLE); DataChangeLog datalog = createLog(klazz,OperationType.ENABLE);
datalog.setEntityId(id); datalog.setEntityId(id);
tabInfo.setEnable(entity);
mapper.updateById(tabInfo.toEntity(entity));
buildFields(datalog,tabInfo,entity,old); buildFields(datalog,tabInfo,entity,old);
logs.add(datalog); logs.add(datalog);
if(listener!=null) { if(listener!=null) {
@ -448,6 +453,7 @@ public class DataLogTools {
T old = findById(klazz, id); T old = findById(klazz, id);
if(old==null || tabInfo.isDisable(old)) return null; if(old==null || tabInfo.isDisable(old)) return null;
DataOperationContent<T> content = null; DataOperationContent<T> content = null;
//具体的数据修改是通过函数去处理的后台不用单独处理
if(listener!=null) { if(listener!=null) {
content = DataOperationContent.of(tabInfo,OperationType.DISABLE,old,old); content = DataOperationContent.of(tabInfo,OperationType.DISABLE,old,old);
listener.before(content); listener.before(content);
@ -460,6 +466,8 @@ public class DataLogTools {
content.setObj(entity); content.setObj(entity);
DataChangeLog datalog = createLog(klazz,OperationType.DISABLE); DataChangeLog datalog = createLog(klazz,OperationType.DISABLE);
datalog.setEntityId(id); datalog.setEntityId(id);
tabInfo.setDisable(entity);
mapper.updateById(tabInfo.toEntity(entity));
buildFields(datalog,tabInfo,entity,old); buildFields(datalog,tabInfo,entity,old);
logs.add(datalog); logs.add(datalog);
if(listener!=null) { if(listener!=null) {
@ -677,6 +685,7 @@ public class DataLogTools {
//进行修改或者删除时,级联对象为空时,需要删除旧数据 //进行修改或者删除时,级联对象为空时,需要删除旧数据
List oldList = getJoinList(joinTable, join, mapper, parentInfo, entity); List oldList = getJoinList(joinTable, join, mapper, parentInfo, entity);
if(oldList!=null) { if(oldList!=null) {
log.info("关联属性【{}】=>{}",join.getField().getName(),JSON.toJSONString(oldList));
for (Object item : oldList) { for (Object item : oldList) {
Long idValue = joinTable.getIdValue(item); Long idValue = joinTable.getIdValue(item);
DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent); DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent);
@ -733,37 +742,46 @@ public class DataLogTools {
LogTableInfo parentInfo,Object parent) { LogTableInfo parentInfo,Object parent) {
LogJoin joinAnnotation = join.getJoin(); LogJoin joinAnnotation = join.getJoin();
LogJoinColumn[] columns = joinAnnotation.columns(); LogJoinColumn[] columns = joinAnnotation.columns();
QueryChainWrapper queryWrapper = new QueryChainWrapper(mapper); Object joinBean = parentInfo.getFieldValue(parent,join.getField());
QueryWrapper<?> queryWrapper = Wrappers.query(joinTable.getEntityType());
for (LogJoinColumn joinCol : columns) { for (LogJoinColumn joinCol : columns) {
if(joinCol.valueType()==JoinValueType.FEILD) { if(joinCol.valueType()==JoinValueType.FEILD) {
Object value = parentInfo.getFieldValue(parent,joinCol.field()); Object value = parentInfo.getFieldValue(parent,joinCol.field());
if(value==null) return null; String column = joinTable.getColumn(joinCol.relatedField());
queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),value); queryWrapper.eq(column,value);
}else {
queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue()));
}
}
List list = mapper.selectList(queryWrapper);
if(CollectionUtils.isEmpty(list)) {
return null;
}
List result = CollectionUtils.newArrayList();
for (Object item : list) {
result.add(joinTable.toDto(item));
}
return result;
}
private static Object getJoinObj(LogTableInfo joinTable,LogJoinInfo join,BaseMapper mapper,LogTableInfo parentInfo,Object parent) {
LogJoin joinAnnotation = join.getJoin();
LogJoinColumn[] columns = joinAnnotation.columns();
Object joinBean = parentInfo.getFieldValue(parent,join.getField());
QueryWrapper<?> queryWrapper = Wrappers.query(joinTable.getEntityType());
for (LogJoinColumn joinCol : columns) {
if(joinCol.valueType()==JoinValueType.FEILD) {
Object value = parentInfo.getFieldValue(parent,joinCol.field());
String column = joinTable.getColumn(joinCol.relatedField());
queryWrapper.eq(column,value);
}else { }else {
if(StringUtils.isNotEmpty(joinCol.relatedField())) { if(StringUtils.isNotEmpty(joinCol.relatedField())) {
queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue())); queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue()));
} }
} }
} }
return mapper.selectList(queryWrapper); Object object = mapper.selectOne(queryWrapper);
} return object==null?null:joinTable.toDto(object);
private static Object getJoinObj(LogTableInfo joinTable,LogJoinInfo join,BaseMapper mapper,LogTableInfo parentInfo,Object parent) {
LogJoin joinAnnotation = join.getJoin();
LogJoinColumn[] columns = joinAnnotation.columns();
QueryChainWrapper query = new QueryChainWrapper(mapper);
for (LogJoinColumn joinCol : columns) {
if(joinCol.valueType()==JoinValueType.FEILD) {
Object value = parentInfo.getFieldValue(parent,joinCol.field());
if(value==null) return null;
query.eq(joinTable.getColumn(joinCol.relatedField()),value);
}else {
if(StringUtils.isNotEmpty(joinCol.relatedField())) {
query.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue()));
}
}
}
return mapper.selectObjs(query);
} }

View File

@ -17,6 +17,7 @@ import com.pictc.annotations.datalog.LogJoinColumn;
import com.pictc.annotations.datalog.JoinCaseType; import com.pictc.annotations.datalog.JoinCaseType;
import com.pictc.annotations.datalog.JoinType; import com.pictc.annotations.datalog.JoinType;
import com.pictc.annotations.datalog.ValueDirectionType; import com.pictc.annotations.datalog.ValueDirectionType;
import com.xjrsoft.common.model.base.BaseModel;
@ -29,7 +30,7 @@ import com.pictc.annotations.datalog.ValueDirectionType;
*/ */
@Data @Data
@LogTable(source="lng_b_fee",name="费用名称") @LogTable(source="lng_b_fee",name="费用名称")
public class UpdateLngBFeeDto implements Serializable { public class UpdateLngBFeeDto extends BaseModel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -1,17 +1,15 @@
package com.xjrsoft.module.mdm.entity; package com.xjrsoft.module.mdm.entity;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.xjrsoft.common.model.base.BaseModel;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
/** /**
@ -20,10 +18,13 @@ import lombok.Data;
* @Date: 2025-10-22 * @Date: 2025-10-22
* @Version 1.0 * @Version 1.0
*/ */
@Data @Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("lng_b_bank") @TableName("lng_b_bank")
@ApiModel(value = "银行对象", description = "银行") @ApiModel(value = "银行对象", description = "银行")
public class LngBBank implements Serializable { public class LngBBank extends BaseModel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -106,61 +107,7 @@ public class LngBBank implements Serializable {
@ApiModelProperty("备注") @ApiModelProperty("备注")
private String note; private String note;
/**
* 创建人id
*/
@ApiModelProperty("创建人id")
@TableField(fill = FieldFill.INSERT)
private Long createUserId;
/**
* 创建时间
*/
@ApiModelProperty("创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createDate;
/**
* 修改人id
*/
@ApiModelProperty("修改人id")
@TableField(fill = FieldFill.UPDATE)
private Long modifyUserId;
/**
* 修改时间
*/
@ApiModelProperty("修改时间")
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime modifyDate;
/**
* 逻辑删除
*/
@ApiModelProperty("逻辑删除")
@TableField(fill = FieldFill.INSERT)
@TableLogic
private Integer deleteMark;
/**
* 租户id
*/
@ApiModelProperty("租户id")
private Long tenantId;
/**
* 部门id
*/
@ApiModelProperty("部门id")
@TableField(fill = FieldFill.INSERT)
private Long deptId;
/**
* 数据权限id
*/
@ApiModelProperty("数据权限id")
@TableField(fill = FieldFill.INSERT)
private Long ruleUserId;