Procházet zdrojové kódy

Merge remote-tracking branch 'origin/develop' into develop

lijie před 3 roky
rodič
revize
e5bbf967fc

+ 1 - 1
dmp-business/dmp-dic/src/main/resources/db/init/schema.sql

@@ -108,4 +108,4 @@ CREATE TABLE IF NOT EXISTS `dt_code_data`  (
   `valid` tinyint(0) DEFAULT NULL COMMENT '合法标识',
   `ts` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '乐观锁',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '码表数据' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB COMMENT = '码表数据' ROW_FORMAT = Dynamic;

+ 4 - 0
dmp-business/dmp-rwd-version/pom.xml

@@ -30,5 +30,9 @@
             <groupId>com.persagy</groupId>
             <artifactId>dmp-digital-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-file-starter</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 2
dmp-business/dmp-rwd-version/src/main/resources/db/init/schema.sql

@@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS `dt_define_version` (
   `valid` tinyint(4) DEFAULT NULL COMMENT '合法标识,0-无效,1-有效',
   `ts` timestamp NULL DEFAULT NULL COMMENT '乐观锁',
   PRIMARY KEY (`id`)
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '版本定义表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB COMMENT = '版本定义表' ROW_FORMAT = Dynamic;
 
 CREATE TABLE IF NOT EXISTS `dt_demand`  (
   `id` varchar(40) NOT NULL COMMENT '主键',
@@ -41,5 +41,5 @@ CREATE TABLE IF NOT EXISTS `dt_demand`  (
   `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁',
   PRIMARY KEY (`id`) USING BTREE,
   INDEX `idx_state`(`bill_state`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '字典需求' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB COMMENT = '字典需求' ROW_FORMAT = Dynamic;
 

+ 3 - 5
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/ObjectTypeServiceImpl.java

@@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dmp.common.constant.ValidEnum;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.model.entity.BaseEntity;
-import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.dmp.define.entity.ObjectTypeDefine;
 import com.persagy.dmp.mybatis.utils.ConditionUtil;
 import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
@@ -22,7 +21,6 @@ import com.persagy.dmp.rwd.define.service.IObjectTypeService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -45,7 +43,7 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
     private DigitalMessageHelper messageSender;
 
     @Override
-    @Cacheable(key = "targetClass + methodName + #p0 + #p1")
+//    @Cacheable(key = "targetClass + methodName + #p0 + #p1")
     public List<ObjectTypeDefine> queryByProjectAndApp(String projectId, String appId) {
         // TODO 指定条件查询使用Redis
         QueryWrapper<ObjectTypeDefine> wrapper = new QueryWrapper<>();
@@ -58,7 +56,7 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
     }
 
     @Override
-    @Cacheable(key = "targetClass + methodName")
+//    @Cacheable(key = "targetClass + methodName")
     public Map<String, String> queryCodeNameMap() {
         LambdaQueryWrapper<ObjectTypeDefine> wrapper = new LambdaQueryWrapper<>();
         wrapper.select(ObjectTypeDefine::getId, ObjectTypeDefine::getCode, ObjectTypeDefine::getName);
@@ -68,7 +66,7 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
     }
 
     @Override
-    @Cacheable(key = "targetClass + methodName")
+//    @Cacheable(key = "targetClass + methodName")
     public Map<String, String> queryObjTypeMap() {
         LambdaQueryWrapper<ObjectTypeDefine> wrapper = new LambdaQueryWrapper<>();
         wrapper.select(ObjectTypeDefine::getId, ObjectTypeDefine::getCode, ObjectTypeDefine::getObjType);

+ 120 - 144
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java

@@ -5,18 +5,15 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.CodeTableTypeEnum;
-import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.codetable.client.CodeTableDataFacade;
 import com.persagy.dmp.codetable.entity.CodeTableData;
 import com.persagy.dmp.common.constant.CommonConstant;
@@ -24,7 +21,6 @@ import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.constant.ValidEnum;
 import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
@@ -46,6 +42,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.lang.reflect.Field;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -119,10 +116,8 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
-        //获取$remove字段
-        Map<String, Object> removeMap = getRemoveInfo(voList);
-        //获取基础属性
-        Set<String> fieldSet = JsonNodeUtils.getFieldMap(ObjectDigital.class).keySet();
+        // 获取$remove字段
+        Map<String, Set<String>> removeMap = convertRemoveInfo(voList);
         //查询数据库中存在的数据
         List<String> idList = CollUtil.getFieldValues(voList, BaseEntity.PROP_ID, String.class);
         List<ObjectDigital> dbList = objectDigitalMapper.selectBatchIds(idList);
@@ -131,7 +126,7 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         //填充classCode
         fillClassCodeForUpdate(voList,dbMap);
         //信息点校验
-        Map<String, Map<String, ObjectInfoDefine>> allInfoMap = validateOnSave(voList, true);
+        validateOnSave(voList, true);
         List<ObjectDigital> resultList = new ArrayList<>();
         voList.forEach(vo -> {
             ObjectDigital dbVO = MapUtil.get(dbMap, vo.getId(), ObjectDigital.class);
@@ -139,29 +134,80 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
             if(dbVO == null) {
                 return;
             }
-
-            //数据合并
-            ObjectDigital newDbVO = dbVO;
-            // 合并通用信息点数据
-            if (!vo.getObjType().equals(vo.getClassCode())){
-                Map<String, ObjectInfoDefine> commonInfoMap = allInfoMap.getOrDefault(vo.getObjType(), new HashMap<>(16));
-                dataMerge(newDbVO,vo,commonInfoMap,fieldSet);
-            }
-            // 合并对象分类信息点数据
-            Map<String, ObjectInfoDefine> infoDefineMap = allInfoMap.getOrDefault(vo.getClassCode(),new HashMap<>(16));
-            dataMerge(newDbVO,vo,infoDefineMap,fieldSet);
-
-            //移除需要删除的信息点
-            Object remove = removeMap.get(newDbVO.getId());
-            remove(newDbVO,remove,fieldSet);
-
+            // 更新数据的属性合并和删除
+            ensureUpdateInfos(vo, dbVO, removeMap.get(vo.getId()));
             // 修改
-            objectDigitalMapper.updateById(newDbVO);
-            resultList.add(newDbVO);
+            objectDigitalMapper.updateById(vo);
             // 修改后消息
-            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_UPDATE, dbVO, newDbVO, false);
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_UPDATE, dbVO, vo, false);
         });
-        return resultList;
+        return voList;
+    }
+
+    /**
+     * 补充更新信息
+     * @param vo
+     * @param dbVO
+     * @param removeColumns
+     */
+    private void ensureUpdateInfos(ObjectDigital vo, ObjectDigital dbVO, Set<String> removeColumns) {
+        // 获取对象属性,不需要处理基类属性
+        Field[] fields = ReflectUtil.getFieldsDirectly(ObjectDigital.class, false);
+        // 按属性处理
+        for(Field field:fields) {
+            Object fieldValue = ReflectUtil.getFieldValue(vo, field);
+            Object dbValue = ReflectUtil.getFieldValue(dbVO, field);
+            if(fieldValue == null && dbValue == null) {
+                // 都为空不处理
+                continue;
+            }
+            // 如果不是扩展属性
+            if(!ObjectDigital.EXTRA_COLUMN.equalsIgnoreCase(field.getName())) {
+                // 如果待删除
+                if(CollUtil.contains(removeColumns, field.getName())) {
+                    ReflectUtil.setFieldValue(vo, field, null);
+                    continue;
+                }
+                // 如果vo里值为空,则将数据库值赋上
+                if(fieldValue == null) {
+                    ReflectUtil.setFieldValue(vo, field, dbValue);
+                }
+                continue;
+            }
+            // 如果是扩展属性
+            ObjectNode infos = vo.getInfos();
+            ObjectNode dbInfos = dbVO.getInfos();
+            // 如果数据库有值,则补充到vo的infos中
+            if(dbInfos != null) {
+                if(infos == null) {
+                    vo.setInfos(dbInfos);
+                } else {
+                    // 如果都不为空,则将dbVO的infos数据拷贝到vo中
+                    Iterator<String> infoFields = dbInfos.fieldNames();
+                    while(infoFields.hasNext()) {
+                        String infoField = infoFields.next();
+                        if(infos.has(infoField)) {
+                            // 如果已存在,则不需要
+                            continue;
+                        }
+                        infos.set(infoField, dbInfos.get(infoField));
+                    }
+                }
+            }
+            // 最后,处理vo的infos
+            Iterator<String> infoFields = infos.fieldNames();
+            while(infoFields.hasNext()) {
+                String infoField = infoFields.next();
+                // 如果需要删除,则删除
+                if(CollUtil.contains(removeColumns, infoField)) {
+                    infoFields.remove();
+                }
+            }
+            // 如果都删没了,则把infos置空
+            if(infos == null || infos.size() <= 0) {
+                vo.setInfos(null);
+            }
+        }
     }
 
     @Override
@@ -603,44 +649,46 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
      * @param voList
      * @param isUpdate
      */
-    private Map<String, Map<String, ObjectInfoDefine>> validateOnSave(List<ObjectDigital> voList, boolean isUpdate) {
-        return validateInfoCode(voList);
+    private void validateOnSave(List<ObjectDigital> voList, boolean isUpdate) {
+        validateInfoCode(voList);
     }
 
     /**
      * 信息点值校验
      * @param voList
      */
-    private Map<String, Map<String, ObjectInfoDefine>> validateInfoCode(List<ObjectDigital> voList) {
+    private void validateInfoCode(List<ObjectDigital> voList) {
+        if(CollUtil.isEmpty(voList)) {
+            return;
+        }
         //获取该信息点当前classCode
         List<String> typeCodeList = CollUtil.getFieldValues(voList, "classCode", String.class);
-
         //查询通用类型:equipment,building,floor,space等
         Map<String, String> objTypeMap = typeService.queryObjTypeMap();
-        queryParentClassCode(typeCodeList,objTypeMap);
-
+        addParentClassCode(typeCodeList,objTypeMap);
         // 查询信息点定义
         Map<String, Map<String, ObjectInfoDefine>> allInfoMap = infoService.queryByTypes(typeCodeList);
         // 信息点校验器
         for(ObjectDigital vo:voList) {
-            //设置自定义信息点
+            // 获取信息点列表 TODO 先这样处理,后续优化信息点接口后直接删掉此段即可
             Map<String, ObjectInfoDefine> infoMap = new HashMap<>(16);
-            if(CollUtil.isNotEmpty(allInfoMap)){
-                Map<String, ObjectInfoDefine> infoDefineMap = allInfoMap.get(vo.getClassCode());
-                if(CollUtil.isNotEmpty(infoDefineMap)){
-                    infoMap.putAll(infoDefineMap);
-                }
-            }
-            String objType = objTypeMap.getOrDefault(vo.getClassCode(),"");
             //设置通用信息点
+            String objType = objTypeMap.getOrDefault(vo.getClassCode(),"");
             if(!objType.equals(vo.getClassCode()) && MapUtil.isNotEmpty(allInfoMap)){
                 Map<String, ObjectInfoDefine> commonInfoDefineMap = allInfoMap.getOrDefault(objType,new HashMap<>(16));
-                if(null!=commonInfoDefineMap && commonInfoDefineMap.size()>0){
+                if(MapUtil.isNotEmpty(commonInfoDefineMap)){
                     infoMap.putAll(commonInfoDefineMap);
                 }
             }
+            //设置自定义信息点
+            if(MapUtil.isNotEmpty(allInfoMap)){
+                Map<String, ObjectInfoDefine> infoDefineMap = allInfoMap.get(vo.getClassCode());
+                if(MapUtil.isNotEmpty(infoDefineMap)){
+                    infoMap.putAll(infoDefineMap);
+                }
+            }
             if(MapUtil.isEmpty(infoMap)) {
-                continue;
+                throw new BusinessException(StrUtil.format("没有对象类型【{}】的信息点定义信息!", vo.getClassCode()));
             }
             // 信息点值对象
             ObjectNode infos = vo.getInfos();
@@ -653,137 +701,65 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
                 String infoCode = infoKeys.next();
                 // 如果信息点中不存在,移除
                 if(!infoMap.containsKey(infoCode)) {
-                    // infos.remove(infoCode);
                     infoKeys.remove();
                     continue;
                 }
                 // 校验信息点值
                 InfoDataFactory.parse(infoMap.get(infoCode), infos.get(infoCode));
-
             }
         }
-        return allInfoMap;
     }
 
     /**
      * 获取remove信息点
      * @param voList
-     * @return
+     * @return Map<id, Set<RemoveColumn>>
      */
-    private Map<String, Object> getRemoveInfo(List<ObjectDigital> voList){
-        Map<String, Object> removeMap = new HashMap<>(16);
-        for (ObjectDigital digital : voList) {
-            ObjectNode infos = digital.getInfos();
-            if(infos!=null){
-                removeMap.put(digital.getId(),infos.get("$remove"));
+    private Map<String, Set<String>> convertRemoveInfo(List<ObjectDigital> voList){
+        final String REMOVE_FIELD = "$remove";
+        Map<String, Set<String>> removeMap = new HashMap<>(16);
+        for (ObjectDigital vo : voList) {
+            ObjectNode infos = vo.getInfos();
+            // 没有此列时不处理
+            if(infos == null || infos.size() <= 0 || infos.get(REMOVE_FIELD) == null
+                || !infos.get(REMOVE_FIELD).isArray()) {
+                continue;
             }
+            // 收集删除列
+            ArrayNode removeNode = infos.withArray(REMOVE_FIELD);
+            Set<String> removeSet = new HashSet<>();
+            removeMap.put(vo.getId(), removeSet);
+            for(int i = 0,j = removeNode.size();i < j;i++) {
+                removeSet.add(removeNode.get(i).textValue());
+            }
+            // 处理完后,删除此项
+            infos.remove(REMOVE_FIELD);
         }
         return removeMap;
     }
 
     /**
-     * 查询对应的通用类型
+     * 添加对应的通用类型
      * @param typeCodeList
      */
-    private void  queryParentClassCode(List<String> typeCodeList,Map<String, String> objTypeMap){
+    private void addParentClassCode(List<String> typeCodeList,Map<String, String> objTypeMap){
         if(typeCodeList == null || typeCodeList.size()<=0){
             return;
         }
         //查询classCode对应点objType
-        List<String> parentCodes = new ArrayList<>();
+        Set<String> parentCodes = new HashSet<>();
         for (String classCode : typeCodeList) {
             String objType = objTypeMap.get(classCode);
             if(StringUtils.isEmpty(objType) || "0".equals(objType) || parentCodes.contains(objType)){
-                return ;
+                continue;
             }
             parentCodes.add(objType);
         }
+        parentCodes.addAll(typeCodeList);
+        // 将新Set值返给List
+        typeCodeList.clear();
         typeCodeList.addAll(parentCodes);
     }
-    /**
-     * 数据合并
-     * @param dbVO 源数据
-     * @param vo 目标数据
-     * @param vo 待删除待数据
-     */
-    private void dataMerge(ObjectDigital dbVO,ObjectDigital vo,Map<String, ObjectInfoDefine> infoDefineMap,Set<String> fieldSet){
-        //基础属性处理
-        handleBasicColumn(dbVO,vo);
-        //动态信息点处理
-        ObjectNode infos = vo.getInfos();
-        for (Map.Entry<String, ObjectInfoDefine> entry : infoDefineMap.entrySet()) {
-            String code = entry.getKey();
-            if(fieldSet.contains(code)){
-                //属于基础信息点
-                continue;
-            }
-            if (!infos.has(code)) {
-                continue;
-            }
-            JsonNode value = infos.get(code);
-            if (dbVO.getInfos() == null) {
-                dbVO.setInfos(JsonNodeFactory.instance.objectNode());
-            }
-            dbVO.getInfos().set(code, value);
-        }
-    }
-
-    /**
-     * 基础属性处理
-     * @param dbVO
-     * @param vo
-     */
-    private void handleBasicColumn(ObjectDigital dbVO,ObjectDigital vo){
-        if(StringUtils.isNotEmpty(vo.getName())){
-            dbVO.setName(vo.getName());
-        }
-        if(StringUtils.isNotEmpty(vo.getLocalId())){
-            dbVO.setLocalId(vo.getLocalId());
-        }
-        if(StringUtils.isNotEmpty(vo.getLocalName())){
-            dbVO.setLocalName(vo.getLocalName());
-        }
-        if(vo.getVirtualCodes()!=null){
-            dbVO.setVirtualCodes(vo.getVirtualCodes());
-        }
-        if(vo.getValid()!=null){
-            dbVO.setValid(vo.getValid());
-        }
-    }
-
-
-    /**
-     * 删除需要移除的信息点
-     * @param dbVO
-     * @param remove
-     * @param basicFieldSet
-     */
-    private void remove(ObjectDigital dbVO,Object remove,Set<String> basicFieldSet){
-        if(remove == null){
-            return;
-        }
-        JSONArray array = JSONArray.parseArray(remove.toString());
-        array.forEach(item->{
-            String removeCode = (String) item;
-            if(basicFieldSet.contains(removeCode)){
-                //基础信息
-                if("name".equals(removeCode)){
-                    dbVO.setName(null);
-                }
-                if("localId".equals(removeCode)){
-                    dbVO.setLocalId(null);
-                }
-                if("localName".equals(removeCode)){
-                    dbVO.setLocalName(null);
-                }
-                if("virtualCodes".equals(removeCode)){
-                    dbVO.setVirtualCodes(new ArrayList<>());
-                }
-                return;
-            }
-            dbVO.getInfos().remove(removeCode);
-        });
-    }
 
     /**
      * 修改时填充classCode

+ 2 - 2
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.BooleanUtil;
-import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
@@ -210,7 +209,8 @@ public class ObjectDigitalCriteriaHelper {
         // 如果值是对象
         if(value.isObject()) {
             ObjectNode obj = (ObjectNode) value;
-            if (obj.has("$like")) {
+            if (obj.has(QueryOperator.LIKE.getIndex()) || obj.has(QueryOperator.LIKE_LEFT.getIndex())
+                    || obj.has(QueryOperator.LIKE_RIGHT.getIndex())) {
                 format = "#JSON#json_unquote(json_extract({}, '$.{}'))";
             } else if (obj.has(QueryOperator.NULL.getIndex())) {
                 format = "#JSON#json_extract({}, '$.{}')";

+ 21 - 21
dmp-business/dmp-rwd/src/main/resources/db/init/schema.sql

@@ -24,7 +24,7 @@ CREATE TABLE IF NOT EXISTS `dt_define_type` (
   KEY `idx_parent_code` (`parent_code`) USING BTREE,
   KEY `idx_major_code` (`major_code`) USING BTREE,
   KEY `idx_code_1` (`group_code`,`project_id`,`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='对象类型定义';
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='对象类型定义';
 
 CREATE TABLE IF NOT EXISTS `dt_define_info` (
   `id` varchar(40) NOT NULL,
@@ -59,7 +59,7 @@ CREATE TABLE IF NOT EXISTS `dt_define_info` (
   `ts` timestamp default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
   PRIMARY KEY (`id`) USING BTREE,
   KEY `idx_class_1` (`class_code`,`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='信息点定义表';
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='信息点定义表';
 
 CREATE TABLE IF NOT EXISTS `dt_define_graph` (
   `id` varchar(40) NOT NULL,
@@ -78,7 +78,7 @@ CREATE TABLE IF NOT EXISTS `dt_define_graph` (
   `ts` timestamp default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
   PRIMARY KEY (`id`) USING BTREE,
   KEY `idx_code` (`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='图类型表';
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='图类型表';
 
 CREATE TABLE IF NOT EXISTS `dt_define_rel` (
   `id` varchar(40) NOT NULL,
@@ -92,8 +92,8 @@ CREATE TABLE IF NOT EXISTS `dt_define_rel` (
   `remark` varchar(45) DEFAULT NULL,
   `before_cal_rel` json NULL COMMENT '计算关系之前需要计算的关系',
   `cal_rule` json NULL COMMENT '计算器,就是计算规则',
-  `from_obj_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '边关系左侧的对象分类',
-  `to_obj_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关系右侧的对象分类',
+  `from_obj_type` varchar(50) NULL DEFAULT NULL COMMENT '边关系左侧的对象分类',
+  `to_obj_type` varchar(50) NULL DEFAULT NULL COMMENT '关系右侧的对象分类',
   `automatic_flag` tinyint(0) NULL DEFAULT NULL COMMENT '自动计算类型,0-手动计算,1-自动计算',
   `source_flag` tinyint(0) NULL DEFAULT NULL COMMENT '是否需要配置源末端',
   `manual` int(0) NULL DEFAULT NULL COMMENT '手动计算类型 1 禁用  2提示引导 3手动维护',
@@ -110,7 +110,7 @@ CREATE TABLE IF NOT EXISTS `dt_define_rel` (
   PRIMARY KEY (`id`) USING BTREE,
   KEY `idx_code` (`code`) USING BTREE,
   KEY `idx_graph_code` (`graph_code`,`code`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='边类型表';
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='边类型表';
 
 CREATE TABLE IF NOT EXISTS `dt_object` (
   `id` varchar(100) NOT NULL,
@@ -138,7 +138,7 @@ CREATE TABLE IF NOT EXISTS `dt_object` (
   KEY `idx_project_3` (`project_id`,`modified_time`) USING BTREE,
   KEY `idx_project_4` (`obj_type`) USING BTREE,
   KEY `idx_project_5` (`project_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='对象实例表';
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='对象实例表';
 
 CREATE TABLE IF NOT EXISTS `dt_relation` (
   `id` varchar(40) NOT NULL,
@@ -166,7 +166,7 @@ CREATE TABLE IF NOT EXISTS `dt_relation` (
   KEY `idx_4` (`graph_id`,`rel_code`,`obj_to`,`project_id`) USING BTREE,
   KEY `idx_5` (`obj_from`) USING BTREE,
   KEY `idx_6` (`obj_to`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='关系实例表';
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='关系实例表';
 
 -- ----------------------------
 -- Table structure for relation_project_cal
@@ -195,7 +195,7 @@ CREATE TABLE  IF NOT EXISTS `dt_relation_project_cal`  (
 `valid` tinyint(0) NULL DEFAULT NULL COMMENT '合法标识',
 `ts` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP  ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '乐观锁',
 PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT = Dynamic COMMENT='项目关系记录表';
+) ENGINE = InnoDB ROW_FORMAT = Dynamic COMMENT='项目关系记录表';
 
 CREATE TABLE IF NOT EXISTS `dt_equip_class_rel`  (
  `id` varchar(40) NOT NULL COMMENT '主键,32位UUID',
@@ -212,23 +212,23 @@ CREATE TABLE IF NOT EXISTS `dt_equip_class_rel`  (
  `valid` tinyint(0) NULL DEFAULT 1 COMMENT '合法标识',
  `ts` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '乐观锁',
  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '项目设备类边关系表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB COMMENT = '项目设备类边关系表' ROW_FORMAT = Dynamic;
 
 
 CREATE TABLE IF NOT EXISTS `dt_define_info_collect`  (
-`id` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
-`define_info_id` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-`project_id` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-`group_code` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '集团编码',
+`id` varchar(40) NOT NULL,
+`define_info_id` varchar(40) NULL DEFAULT NULL,
+`project_id` varchar(40) NULL DEFAULT NULL,
+`group_code` varchar(40) NULL DEFAULT NULL COMMENT '集团编码',
 `visiable` int NULL DEFAULT NULL COMMENT '是否可见 1- 可见 0-不可见',
-`code` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '信息点',
-`class_code` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型编码',
-`creator` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
-`creation_time` char(14) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建时间',
-`modifier` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最后修改人',
-`modified_time` char(14) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最后修改时间',
+`code` varchar(40) NULL DEFAULT NULL COMMENT '信息点',
+`class_code` varchar(40) NULL DEFAULT NULL COMMENT '类型编码',
+`creator` varchar(32) NULL DEFAULT NULL COMMENT '创建人',
+`creation_time` char(14) NULL DEFAULT NULL COMMENT '创建时间',
+`modifier` varchar(32) NULL DEFAULT NULL COMMENT '最后修改人',
+`modified_time` char(14) NULL DEFAULT NULL COMMENT '最后修改时间',
 `valid` tinyint NULL DEFAULT NULL COMMENT '合法标识',
 `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁',
 `key_word` int(1) DEFAULT NULL COMMENT '是否为关键信息点',
 PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB ROW_FORMAT = Dynamic COMMENT = '采集信息点配置表' ;

+ 2 - 2
dmp-business/dmp-rwd/src/main/resources/docs/根据现有mysql数据快速生成DML语句的sql记录.md

@@ -128,8 +128,8 @@ WHERE
 ```sql
 ALTER TABLE dt_define_rel ADD COLUMN  `before_cal_rel` json NULL COMMENT '计算关系之前需要计算的关系';
 ALTER TABLE dt_define_rel ADD COLUMN  `cal_rule` json NULL COMMENT '计算器,就是计算规则';
-ALTER TABLE dt_define_rel ADD COLUMN  `from_obj_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '边关系左侧的对象分类';
-ALTER TABLE dt_define_rel ADD COLUMN  `to_obj_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关系右侧的对象分类';
+ALTER TABLE dt_define_rel ADD COLUMN  `from_obj_type` varchar(50) NULL DEFAULT NULL COMMENT '边关系左侧的对象分类';
+ALTER TABLE dt_define_rel ADD COLUMN  `to_obj_type` varchar(50) NULL DEFAULT NULL COMMENT '关系右侧的对象分类';
 ALTER TABLE dt_define_rel ADD COLUMN  `automatic_flag` tinyint(0) NULL DEFAULT NULL COMMENT '自动计算类型,0-手动计算,1-自动计算';
 ALTER TABLE dt_define_rel ADD COLUMN  `source_flag` tinyint(0) NULL DEFAULT NULL COMMENT '是否需要配置源末端';
 ALTER TABLE dt_define_rel ADD COLUMN  `manual` int(0) NULL DEFAULT NULL COMMENT '手动计算类型 1 禁用  2提示引导 3手动维护';

+ 22 - 22
dmp-cloud/dmp-message/src/main/resources/db/init/schema.sql

@@ -2,49 +2,49 @@
 --  Data for `dt_message_send_register`
 -- ----------------------------
 CREATE TABLE IF NOT EXISTS "dt_message_send_register" (
-"id" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',
-"code" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '发送渠道编码',
-"name" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '发送渠道名称',
-"access_key" varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'accessKey',
-"access_secret" text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'accessSecret',
-"extra" text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '扩展参数',
-"clazz" varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '发送消息实现类',
-"creator" varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人',
-"creation_time" char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建时间',
-"modifier" varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '最后修改人',
-"modified_time" char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '最后修改时间',
+"id" varchar(40) NOT NULL COMMENT '主键id',
+"code" varchar(40) NOT NULL COMMENT '发送渠道编码',
+"name" varchar(40) NOT NULL COMMENT '发送渠道名称',
+"access_key" varchar(255) DEFAULT NULL COMMENT 'accessKey',
+"access_secret" text COMMENT 'accessSecret',
+"extra" text COMMENT '扩展参数',
+"clazz" varchar(255) NOT NULL COMMENT '发送消息实现类',
+"creator" varchar(32) DEFAULT NULL COMMENT '创建人',
+"creation_time" char(14) DEFAULT NULL COMMENT '创建时间',
+"modifier" varchar(32) DEFAULT NULL COMMENT '最后修改人',
+"modified_time" char(14) DEFAULT NULL COMMENT '最后修改时间',
 "valid" tinyint(1) DEFAULT NULL COMMENT '合法标识',
 "ts" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁',
 PRIMARY KEY ("id") USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+) ENGINE=InnoDB;
 
 
 -- ----------------------------
 --  Data for `dt_message_type`
 -- ----------------------------
 CREATE TABLE IF NOT EXISTS "dt_message_type" (
-"id" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',
+"id" varchar(40) NOT NULL COMMENT '主键id',
 "type_code" varchar(40) NOT NULL COMMENT '消息类型编码',
 "type_name" varchar(40) NOT NULL COMMENT '消息类型名称',
 "send_channel" varchar(255) NOT NULL,
 "remark" text COMMENT '备注',
-"creator" varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建人',
-"creation_time" char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '创建时间',
-"modifier" varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '最后修改人',
-"modified_time" char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '最后修改时间',
+"creator" varchar(32) DEFAULT NULL COMMENT '创建人',
+"creation_time" char(14) DEFAULT NULL COMMENT '创建时间',
+"modifier" varchar(32) DEFAULT NULL COMMENT '最后修改人',
+"modified_time" char(14) DEFAULT NULL COMMENT '最后修改时间',
 "valid" tinyint(1) DEFAULT NULL COMMENT '合法标识',
 "ts" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁',
 PRIMARY KEY ("id") USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
+) ENGINE=InnoDB;
 
 
 -- ----------------------------
 --  Data for `dt_message`
 -- ----------------------------
 CREATE TABLE IF NOT EXISTS "dt_message" (
-"id" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',
-"type_id" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '消息类型',
-"user_id" varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '接收用户',
+"id" varchar(40) NOT NULL COMMENT '主键id',
+"type_id" varchar(40) NOT NULL COMMENT '消息类型',
+"user_id" varchar(40) NOT NULL COMMENT '接收用户',
 "copy_to_user_id" text COMMENT '抄送用户,多个抄送者可以用逗号分隔,最多100个地址(主要用于邮箱发送)',
 "title" varchar(255) NOT NULL,
 "content" text NOT NULL,
@@ -61,4 +61,4 @@ CREATE TABLE IF NOT EXISTS "dt_message" (
 "valid" tinyint(1) DEFAULT NULL,
 "ts" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY ("id") USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
+) ENGINE=InnoDB

+ 14 - 0
dmp-comp/dmp-mybatis/README.md

@@ -168,6 +168,20 @@ spring:
 自定义DB数据格式转换器
 * 放入此目录中即可: com.persagy.**.typehandler
 * json类型自动转换,需要配置@TableName(value = "tableName", autoResultMap = true)和字段@TableField(typeHandler = JacksonTypeHandler.class)
+
 最新变化
 ---------------
 
+注意事项
+---------------
+字符集配置:DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
+* 在建库语句中标记字符集,代码中的建表语句不出现字符集相关的语句(导出时如果有则手动清除)。
+* 字符集不一致修复sql:
+```
+-- 数据库字符集修改
+ALTER DATABASE `${schema}` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
+-- 表字符集修改
+SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') 
+  FROM information_schema.TABLES WHERE TABLE_SCHEMA = '${schema}';
+-- 拷贝查询到的结果并执行即可
+```

+ 1 - 1
dmp-comp/dmp-mybatis/src/main/resources/mapper/DbDao.xml

@@ -5,7 +5,7 @@
 
 <mapper namespace="com.persagy.dmp.mybatis.dao.DbDao">
 	<select id="createDataBase">
-		create schema if not exists `${schema}` default character set utf8 collate utf8_general_ci
+		create schema if not exists `${schema}` default character set utf8mb4 collate utf8mb4_general_ci
 	</select>
 
 </mapper>