Jelajahi Sumber

对象类型 接口实现

yucheng 3 tahun lalu
induk
melakukan
bddc98757d

+ 47 - 0
dc-business/dc-digital/src/main/java/com/persagy/dc/basic/utils/DigitalMessageHelper.java

@@ -0,0 +1,47 @@
+package com.persagy.dc.basic.utils;
+
+import cn.hutool.json.JSONUtil;
+import com.persagy.dc.amqp.handler.RabbitMessageSender;
+import com.persagy.dc.basic.constant.DigitalMessageConstant;
+import com.persagy.dc.basic.model.DigitalManageMessage;
+import com.persagy.dc.common.model.entity.BaseEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 数据孪生消息发送助手
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Component
+public class DigitalMessageHelper {
+
+    @Autowired
+    private RabbitMessageSender messageSender;
+
+    /**
+     * 发送消息
+     * @param operator 操作类型
+     * @param oldVO 原数据
+     * @param newVO 现数据
+     * @param syncFlag 同步消息标识
+     */
+    public void sendMessage(String operator, BaseEntity oldVO, BaseEntity newVO, boolean syncFlag) {
+        DigitalManageMessage message = new DigitalManageMessage();
+        message.setOperatorType(operator);
+        message.setOperatorObj(newVO.getClass().getSimpleName());
+        message.setOldObj(oldVO);
+        message.setNewObj(newVO);
+        // 同步消息
+        if(syncFlag) {
+            messageSender.sendAndReceive(DigitalMessageConstant.MESSAGE_EXCHANGE,
+                    DigitalMessageConstant.MESSAGE_ROUTING,
+                    JSONUtil.toJsonStr(message));
+        } else {
+            // 异步消息
+            messageSender.send(DigitalMessageConstant.MESSAGE_EXCHANGE,
+                    DigitalMessageConstant.MESSAGE_ROUTING,
+                    JSONUtil.toJsonStr(message));
+        }
+    }
+}

+ 27 - 4
dc-business/dc-digital/src/main/java/com/persagy/dc/define/controller/ObjectInfoController.java

@@ -1,5 +1,6 @@
 package com.persagy.dc.define.controller;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.dc.basic.model.QueryCriteria;
@@ -17,6 +18,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
+import java.util.List;
+
 /**
  * 对象类型 Controller
  * @author Charlie Yu
@@ -44,19 +48,38 @@ public class ObjectInfoController {
     }
 
     @PostMapping("/create")
-    public CommonResult<ObjectInfo> create(@RequestBody ObjectInfo vo){
-        vo = service.insert(vo);
+    public CommonResult<ObjectInfo> create(@Valid @RequestBody ObjectInfo vo){
+        List<ObjectInfo> voList = CollUtil.newArrayList(vo);
+        service.insert(voList);
         return ResultHelper.single(vo);
     }
 
+    @PostMapping("/createBatch")
+    public CommonResult<PageList<ObjectInfo>> createBatch(@Valid @RequestBody List<ObjectInfo> voList){
+        voList = service.insert(voList);
+        return ResultHelper.multi(voList);
+    }
+
     @PostMapping("/update")
-    public CommonResult<ObjectInfo> update(@RequestBody ObjectInfo vo){
-        vo = service.update(vo);
+    public CommonResult<ObjectInfo> update(@Valid @RequestBody ObjectInfo vo){
+        List<ObjectInfo> voList = CollUtil.newArrayList(vo);
+        service.update(voList);
         return ResultHelper.single(vo);
     }
 
+    @PostMapping("/updateBatch")
+    public CommonResult<PageList<ObjectInfo>> updateBatch(@Valid @RequestBody List<ObjectInfo> voList){
+        voList = service.update(voList);
+        return ResultHelper.multi(voList);
+    }
+
     @PostMapping("/delete")
     public void delete(@RequestBody String id){
+        service.delete(CollUtil.newArrayList(id));
+    }
+
+    @PostMapping("/deleteBatch")
+    public void deleteBatch(@RequestBody List<String> id){
         service.delete(id);
     }
 }

+ 6 - 6
dc-business/dc-digital/src/main/java/com/persagy/dc/define/service/IObjectInfoService.java

@@ -30,21 +30,21 @@ public interface IObjectInfoService {
 
     /**
      * 新增
-     * @param vo 待新增数据
+     * @param voList 待新增数据
      * @return 新增后数据
      */
-    ObjectInfo insert(ObjectInfo vo);
+    List<ObjectInfo> insert(List<ObjectInfo> voList);
 
     /**
      * 修改
-     * @param vo 待修改数据
+     * @param voList 待修改数据
      * @return 修改后数据
      */
-    ObjectInfo update(ObjectInfo vo);
+    List<ObjectInfo> update(List<ObjectInfo> voList);
 
     /**
      * 删除
-     * @param id 主键
+     * @param idList 主键
      */
-    void delete(String id);
+    void delete(List<String> idList);
 }

+ 108 - 11
dc-business/dc-digital/src/main/java/com/persagy/dc/define/service/impl/ObjectInfoServiceImpl.java

@@ -1,16 +1,26 @@
 package com.persagy.dc.define.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.text.StrFormatter;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.persagy.dc.basic.constant.DigitalMessageConstant;
+import com.persagy.dc.basic.utils.DigitalMessageHelper;
 import com.persagy.dc.common.constant.ValidEnum;
+import com.persagy.dc.common.exception.BusinessException;
+import com.persagy.dc.common.model.entity.BaseEntity;
 import com.persagy.dc.define.dao.ObjectInfoMapper;
 import com.persagy.dc.define.entity.ObjectInfo;
 import com.persagy.dc.define.service.IObjectInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.util.*;
 
 /**
  * 信息点 实现类
@@ -23,6 +33,8 @@ public class ObjectInfoServiceImpl implements IObjectInfoService {
 
     @Resource
     private ObjectInfoMapper dao;
+    @Autowired
+    private DigitalMessageHelper messageSender;
 
     @Override
     public List<ObjectInfo> queryByCondition(Wrapper<ObjectInfo> queryWrapper) {
@@ -35,21 +47,106 @@ public class ObjectInfoServiceImpl implements IObjectInfoService {
     }
 
     @Override
-    public ObjectInfo insert(ObjectInfo vo) {
-        dao.insert(vo);
-        return vo;
+    public List<ObjectInfo> insert(List<ObjectInfo> voList) {
+        if(CollUtil.isEmpty(voList)) {
+            return null;
+        }
+        validateOnSave(voList, false);
+        voList.forEach(vo -> {
+            // 新增前消息
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_BEFORE_INSERT, null, vo, true);
+            // 新增
+            dao.insert(vo);
+            // 新增后消息
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_INSERT, null, vo, false);
+        });
+        return voList;
     }
 
     @Override
-    public ObjectInfo update(ObjectInfo vo) {
-        dao.updateById(vo);
-        return vo;
+    public List<ObjectInfo> update(List<ObjectInfo> voList) {
+        if(CollUtil.isEmpty(voList)) {
+            return null;
+        }
+        validateOnSave(voList, true);
+        List<String> idList = CollUtil.getFieldValues(voList, BaseEntity.PROP_ID, String.class);
+        List<ObjectInfo> dbList = dao.selectBatchIds(idList);
+        Map<String, ObjectInfo> dbMap = CollectionUtil.fieldValueMap(dbList, BaseEntity.PROP_ID);
+        voList.forEach(vo -> {
+            ObjectInfo dbVO = MapUtil.get(dbMap, vo.getId(), ObjectInfo.class);
+            // 容错处理
+            if(dbVO == null) {
+                return;
+            }
+            // 修改前消息
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_BEFORE_UPDATE, dbVO, vo, true);
+            // 修改
+            dao.updateById(vo);
+            // 修改后消息
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_UPDATE, dbVO, vo, false);
+        });
+        return voList;
+    }
+
+    /**
+     * 保存校验
+     * 编码全局唯一
+     * @param voList
+     * @param isUpdate
+     */
+    private void validateOnSave(List<ObjectInfo> voList, boolean isUpdate) {
+        Set<String> codeSet = new HashSet<>();
+        List<String> idList = new ArrayList<>();
+        for(ObjectInfo vo:voList) {
+            // 编码重复
+            if(!codeSet.add(vo.getCode())) {
+                throw new BusinessException(StrFormatter.format("存在重复编码{},不允许保存!", vo.getCode()));
+            }
+            // 修改时,收集待排除的主键
+            if(isUpdate) {
+                idList.add(vo.getId());
+            }
+        }
+        // 查询条件
+        LambdaQueryWrapper<ObjectInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(ObjectInfo::getCode);
+        queryWrapper.in(ObjectInfo::getValid, ValidEnum.TRUE.getType());
+        queryWrapper.in(ObjectInfo::getCode, codeSet);
+        if(isUpdate) {
+            queryWrapper.notIn(ObjectInfo::getId, idList);
+        }
+        // 查询重复的编码
+        List<ObjectInfo> dbList = dao.selectList(queryWrapper);
+        if(CollUtil.isEmpty(dbList)) {
+            return;
+        }
+        List<String> codes = CollUtil.getFieldValues(voList, "code", String.class);
+        throw new BusinessException(StrFormatter.format("存在重复编码{},不允许保存!", codes));
     }
 
     @Override
-    public void delete(String id) {
-        ObjectInfo vo = dao.selectById(id);
-        vo.setValid(ValidEnum.FALSE.getType());
-        dao.updateById(vo);
+    public void delete(List<String> idList) {
+        if(CollUtil.isEmpty(idList)) {
+            return;
+        }
+        List<ObjectInfo> dbList = dao.selectBatchIds(idList);
+        Map<String, ObjectInfo> dbMap = CollectionUtil.fieldValueMap(dbList, BaseEntity.PROP_ID);
+        idList.forEach(id -> {
+            ObjectInfo dbVO = MapUtil.get(dbMap, id, ObjectInfo.class);
+            // 容错处理
+            if(dbVO == null) {
+                return;
+            }
+            // 删除前消息
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_BEFORE_DELETE, null, dbVO, true);
+            // 删除
+            ObjectInfo vo = new ObjectInfo();
+            vo.setId(id);
+            vo.setValid(ValidEnum.FALSE.getType());
+            dao.updateById(vo);
+            // 删除后消息
+            dbVO.setValid(ValidEnum.FALSE.getType());
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_DELETE, null, dbVO, false);
+        });
     }
 }

+ 62 - 49
dc-business/dc-digital/src/main/java/com/persagy/dc/define/service/impl/ObjectTypeServiceImpl.java

@@ -3,13 +3,14 @@ package com.persagy.dc.define.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
-import cn.hutool.json.JSONUtil;
+import cn.hutool.core.text.StrFormatter;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.persagy.dc.amqp.handler.RabbitMessageSender;
 import com.persagy.dc.basic.constant.DigitalMessageConstant;
-import com.persagy.dc.basic.model.DigitalManageMessage;
+import com.persagy.dc.basic.utils.DigitalMessageHelper;
 import com.persagy.dc.common.constant.ValidEnum;
+import com.persagy.dc.common.exception.BusinessException;
 import com.persagy.dc.common.model.entity.BaseEntity;
 import com.persagy.dc.define.dao.ObjectTypeMapper;
 import com.persagy.dc.define.entity.ObjectType;
@@ -19,8 +20,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 对象类型 实现类
@@ -34,7 +34,7 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
     @Resource
     private ObjectTypeMapper dao;
     @Autowired
-    private RabbitMessageSender messageSender;
+    private DigitalMessageHelper messageSender;
 
     @Override
     public List<ObjectType> queryByCondition(Wrapper<ObjectType> queryWrapper) {
@@ -51,18 +51,14 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
+        validateOnSave(voList, false);
         voList.forEach(vo -> {
             // 新增前消息
-            DigitalManageMessage message = new DigitalManageMessage();
-            message.setOperatorType(DigitalMessageConstant.OPERATE_BEFORE_INSERT);
-            message.setOperatorObj(vo.getClass().getSimpleName());
-            message.setNewObj(vo);
-            sendMessage(message, true);
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_BEFORE_INSERT, null, vo, true);
             // 新增
             dao.insert(vo);
             // 新增后消息
-            message.setOperatorType(DigitalMessageConstant.OPERATE_AFTER_INSERT);
-            sendMessage(message, false);
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_INSERT, null, vo, false);
         });
         return voList;
     }
@@ -72,26 +68,62 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
+        validateOnSave(voList, true);
         List<String> idList = CollUtil.getFieldValues(voList, BaseEntity.PROP_ID, String.class);
         List<ObjectType> dbList = dao.selectBatchIds(idList);
         Map<String, ObjectType> dbMap = CollectionUtil.fieldValueMap(dbList, BaseEntity.PROP_ID);
         voList.forEach(vo -> {
+            ObjectType dbVO = MapUtil.get(dbMap, vo.getId(), ObjectType.class);
+            // 容错处理
+            if(dbVO == null) {
+                return;
+            }
             // 修改前消息
-            DigitalManageMessage message = new DigitalManageMessage();
-            message.setOperatorType(DigitalMessageConstant.OPERATE_BEFORE_UPDATE);
-            message.setOperatorObj(vo.getClass().getSimpleName());
-            message.setOldObj(MapUtil.get(dbMap, vo.getId(), ObjectType.class));
-            message.setNewObj(vo);
-            sendMessage(message, true);
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_BEFORE_UPDATE, dbVO, vo, true);
             // 修改
             dao.updateById(vo);
             // 修改后消息
-            message.setOperatorType(DigitalMessageConstant.OPERATE_AFTER_UPDATE);
-            sendMessage(message, false);
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_UPDATE, dbVO, vo, false);
         });
         return voList;
     }
 
+    /**
+     * 保存校验
+     * 编码全局唯一
+     * @param voList
+     * @param isUpdate
+     */
+    private void validateOnSave(List<ObjectType> voList, boolean isUpdate) {
+        Set<String> codeSet = new HashSet<>();
+        List<String> idList = new ArrayList<>();
+        for(ObjectType vo:voList) {
+            // 编码重复
+            if(!codeSet.add(vo.getCode())) {
+                throw new BusinessException(StrFormatter.format("存在重复编码{},不允许保存!", vo.getCode()));
+            }
+            // 修改时,收集待排除的主键
+            if(isUpdate) {
+                idList.add(vo.getId());
+            }
+        }
+        // 查询条件
+        LambdaQueryWrapper<ObjectType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(ObjectType::getCode);
+        queryWrapper.in(ObjectType::getValid, ValidEnum.TRUE.getType());
+        queryWrapper.in(ObjectType::getCode, codeSet);
+        if(isUpdate) {
+            queryWrapper.notIn(ObjectType::getId, idList);
+        }
+        // 查询重复的编码
+        List<ObjectType> dbList = dao.selectList(queryWrapper);
+        if(CollUtil.isEmpty(dbList)) {
+            return;
+        }
+        List<String> codes = CollUtil.getFieldValues(voList, "code", String.class);
+        throw new BusinessException(StrFormatter.format("存在重复编码{},不允许保存!", codes));
+    }
+
     @Override
     public void delete(List<String> idList) {
         if(CollUtil.isEmpty(idList)) {
@@ -100,40 +132,21 @@ public class ObjectTypeServiceImpl implements IObjectTypeService {
         List<ObjectType> dbList = dao.selectBatchIds(idList);
         Map<String, ObjectType> dbMap = CollectionUtil.fieldValueMap(dbList, BaseEntity.PROP_ID);
         idList.forEach(id -> {
+            ObjectType dbVO = MapUtil.get(dbMap, id, ObjectType.class);
+            // 容错处理
+            if(dbVO == null) {
+                return;
+            }
             // 删除前消息
-            DigitalManageMessage message = new DigitalManageMessage();
-            message.setOperatorType(DigitalMessageConstant.OPERATE_BEFORE_DELETE);
-            message.setOperatorObj(ObjectType.class.getSimpleName());
-            message.setNewObj(MapUtil.get(dbMap, id, ObjectType.class));
-            sendMessage(message, true);
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_BEFORE_DELETE, null, dbVO, true);
+            // 删除
             ObjectType vo = new ObjectType();
             vo.setId(id);
             vo.setValid(ValidEnum.FALSE.getType());
-            // 删除
             dao.updateById(vo);
             // 删除后消息
-            message.setOperatorType(DigitalMessageConstant.OPERATE_AFTER_DELETE);
-            message.getNewObj().setValid(ValidEnum.FALSE.getType());
-            sendMessage(message, true);
+            dbVO.setValid(ValidEnum.FALSE.getType());
+            messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_DELETE, null, dbVO, false);
         });
     }
-
-    /**
-     * 发送消息
-     * @param message
-     * @param syncFlag
-     */
-    private void sendMessage(DigitalManageMessage message, boolean syncFlag) {
-        // 同步消息
-        if(syncFlag) {
-            messageSender.sendAndReceive(DigitalMessageConstant.MESSAGE_EXCHANGE,
-                    DigitalMessageConstant.MESSAGE_ROUTING,
-                    JSONUtil.toJsonStr(message));
-        } else {
-            // 异步消息
-            messageSender.send(DigitalMessageConstant.MESSAGE_EXCHANGE,
-                    DigitalMessageConstant.MESSAGE_ROUTING,
-                    JSONUtil.toJsonStr(message));
-        }
-    }
 }