diff --git a/itc-pcitc-demo/itc-pcitc-demo-service/src/main/docker/Dockerfile b/itc-pcitc-demo/itc-pcitc-demo-service/src/main/docker/Dockerfile new file mode 100644 index 0000000..2976016 --- /dev/null +++ b/itc-pcitc-demo/itc-pcitc-demo-service/src/main/docker/Dockerfile @@ -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"] \ No newline at end of file diff --git a/itc-pcitc-demo/itc-pcitc-demo-service/src/main/docker/docker-mdm.sh b/itc-pcitc-demo/itc-pcitc-demo-service/src/main/docker/docker-mdm.sh new file mode 100644 index 0000000..9be2f03 --- /dev/null +++ b/itc-pcitc-demo/itc-pcitc-demo-service/src/main/docker/docker-mdm.sh @@ -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 diff --git a/itc-pcitc-demo/itc-pcitc-demo-service/src/test/java/com/xjrsoft/ClassTest.java b/itc-pcitc-demo/itc-pcitc-demo-service/src/test/java/com/xjrsoft/ClassTest.java new file mode 100644 index 0000000..4276257 --- /dev/null +++ b/itc-pcitc-demo/itc-pcitc-demo-service/src/test/java/com/xjrsoft/ClassTest.java @@ -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 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(); + } + } + +} diff --git a/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/datalog/LogTableInfo.java b/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/datalog/LogTableInfo.java index 8296ebd..80a19af 100644 --- a/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/datalog/LogTableInfo.java +++ b/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/datalog/LogTableInfo.java @@ -136,6 +136,15 @@ public class LogTableInfo { 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) { if(entity==null) return null; diff --git a/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/utils/DataLogTools.java b/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/utils/DataLogTools.java index 8620dc4..06ea03b 100644 --- a/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/utils/DataLogTools.java +++ b/itc-pcitc-dependencies/itc-pcitc-dependencies-service/src/main/java/com/pictc/utils/DataLogTools.java @@ -5,8 +5,10 @@ import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSON; import com.alibaba.nacos.shaded.com.google.common.collect.Lists; 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.toolkit.IdWorker; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper; import com.pictc.annotations.datalog.*; import com.pictc.converts.ConverUtil; @@ -399,6 +401,7 @@ public class DataLogTools { T old = findById(klazz, id); if(old==null || tabInfo.isEnable(old)) return null; DataOperationContent content = null; + //具体的数据修改是通过函数去处理的后台不用单独处理 if(listener!=null) { content = DataOperationContent.of(tabInfo,OperationType.ENABLE,old,old); listener.before(content); @@ -410,6 +413,8 @@ public class DataLogTools { content.setObj(entity); DataChangeLog datalog = createLog(klazz,OperationType.ENABLE); datalog.setEntityId(id); + tabInfo.setEnable(entity); + mapper.updateById(tabInfo.toEntity(entity)); buildFields(datalog,tabInfo,entity,old); logs.add(datalog); if(listener!=null) { @@ -448,6 +453,7 @@ public class DataLogTools { T old = findById(klazz, id); if(old==null || tabInfo.isDisable(old)) return null; DataOperationContent content = null; + //具体的数据修改是通过函数去处理的后台不用单独处理 if(listener!=null) { content = DataOperationContent.of(tabInfo,OperationType.DISABLE,old,old); listener.before(content); @@ -460,6 +466,8 @@ public class DataLogTools { content.setObj(entity); DataChangeLog datalog = createLog(klazz,OperationType.DISABLE); datalog.setEntityId(id); + tabInfo.setDisable(entity); + mapper.updateById(tabInfo.toEntity(entity)); buildFields(datalog,tabInfo,entity,old); logs.add(datalog); if(listener!=null) { @@ -677,6 +685,7 @@ public class DataLogTools { //进行修改或者删除时,级联对象为空时,需要删除旧数据 List oldList = getJoinList(joinTable, join, mapper, parentInfo, entity); if(oldList!=null) { + log.info("关联属性【{}】=>{}",join.getField().getName(),JSON.toJSONString(oldList)); for (Object item : oldList) { Long idValue = joinTable.getIdValue(item); DataChangeLog datalog = createLog(join.getTargetClass(),OperationType.DELETE,parent); @@ -733,37 +742,46 @@ public class DataLogTools { LogTableInfo parentInfo,Object parent) { LogJoin joinAnnotation = join.getJoin(); 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) { if(joinCol.valueType()==JoinValueType.FEILD) { Object value = parentInfo.getFieldValue(parent,joinCol.field()); - if(value==null) return null; - queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),value); + String column = joinTable.getColumn(joinCol.relatedField()); + 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 { if(StringUtils.isNotEmpty(joinCol.relatedField())) { queryWrapper.eq(joinTable.getColumn(joinCol.relatedField()),ConverUtil.jsonToValue(joinCol.staticType(),joinCol.staticValue())); } } } - return mapper.selectList(queryWrapper); - } - - 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); + Object object = mapper.selectOne(queryWrapper); + return object==null?null:joinTable.toDto(object); } diff --git a/itc-pcitc-mdm/itc-pcitc-mdm-api/src/main/java/com/xjrsoft/module/mdm/dto/UpdateLngBFeeDto.java b/itc-pcitc-mdm/itc-pcitc-mdm-api/src/main/java/com/xjrsoft/module/mdm/dto/UpdateLngBFeeDto.java index a9f8155..02bccfd 100644 --- a/itc-pcitc-mdm/itc-pcitc-mdm-api/src/main/java/com/xjrsoft/module/mdm/dto/UpdateLngBFeeDto.java +++ b/itc-pcitc-mdm/itc-pcitc-mdm-api/src/main/java/com/xjrsoft/module/mdm/dto/UpdateLngBFeeDto.java @@ -17,6 +17,7 @@ import com.pictc.annotations.datalog.LogJoinColumn; import com.pictc.annotations.datalog.JoinCaseType; import com.pictc.annotations.datalog.JoinType; import com.pictc.annotations.datalog.ValueDirectionType; +import com.xjrsoft.common.model.base.BaseModel; @@ -29,7 +30,7 @@ import com.pictc.annotations.datalog.ValueDirectionType; */ @Data @LogTable(source="lng_b_fee",name="费用名称") -public class UpdateLngBFeeDto implements Serializable { +public class UpdateLngBFeeDto extends BaseModel { private static final long serialVersionUID = 1L; diff --git a/itc-pcitc-mdm/itc-pcitc-mdm-service/src/main/java/com/xjrsoft/module/mdm/entity/LngBBank.java b/itc-pcitc-mdm/itc-pcitc-mdm-service/src/main/java/com/xjrsoft/module/mdm/entity/LngBBank.java index 8fba883..c2b0fcc 100644 --- a/itc-pcitc-mdm/itc-pcitc-mdm-service/src/main/java/com/xjrsoft/module/mdm/entity/LngBBank.java +++ b/itc-pcitc-mdm/itc-pcitc-mdm-service/src/main/java/com/xjrsoft/module/mdm/entity/LngBBank.java @@ -1,17 +1,15 @@ 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.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; +import com.xjrsoft.common.model.base.BaseModel; import io.swagger.annotations.ApiModel; 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 * @Version 1.0 */ -@Data +@Getter +@Setter +@ToString +@Accessors(chain = true) @TableName("lng_b_bank") @ApiModel(value = "银行对象", description = "银行") -public class LngBBank implements Serializable { +public class LngBBank extends BaseModel { private static final long serialVersionUID = 1L; @@ -106,61 +107,7 @@ public class LngBBank implements Serializable { @ApiModelProperty("备注") 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;