Quellcode durchsuchen

二维码处理

linhuili vor 3 Jahren
Ursprung
Commit
6d4b9c6756

+ 10 - 0
dmp-business/dmp-rwd/pom.xml

@@ -52,5 +52,15 @@
             <groupId>com.persagy</groupId>
             <artifactId>dmp-digital-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-file-starter</artifactId>
+        </dependency>
+        <!--生成二维码-->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.3</version>
+        </dependency>
     </dependencies>
 </project>

+ 28 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectDigitalController.java

@@ -478,4 +478,32 @@ public class ObjectDigitalController{
             }
         }
     }
+
+    @PostMapping("/createDefaultQrCode")
+    @Deprecated
+    public CommonResult createDefaultQrCode(@RequestBody QueryCriteria criteria) throws Exception {
+        //统计对象数据总数
+        criteria.setOnlyCount(true);
+        CommonResult<List<ObjectNode>> onlyCountResult = query(criteria);
+        Long total = onlyCountResult.getCount();
+        if(total <= 0){
+            return CommonResult.success("暂无可生成二维码的对象数据");
+        }
+        //分页处理:生成对象二维码
+        int pageNum =total.intValue() / 500;
+        for(int i=0 ; i< pageNum ; i++){
+            criteria.setOnlyCount(false);
+            criteria.setPage(Long.valueOf(i));
+            criteria.setSize(Long.valueOf(500));
+            CommonResult<List<ObjectNode>> commonResult = query(criteria);
+            if(commonResult.getCount()<=0){
+                continue;
+            }
+            service.createDefaultQrCode(commonResult.getData());
+        }
+        return CommonResult.success("创建成功");
+    }
+
+
+
 }

+ 104 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/handler/DigitalObjectMessageHandler.java

@@ -0,0 +1,104 @@
+package com.persagy.dmp.rwd.digital.handler;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.amqp.handler.AbstractRabbitHandlerTemplate;
+import com.persagy.dmp.basic.model.DigitalManageMessage;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.file.model.UploadMes;
+import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.rwd.digital.service.impl.ObjectDigitalServiceImpl;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.DataInput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author:linhuili
+ * @date:2021/11/8
+ */
+@Slf4j
+@Component
+@RabbitListener(queues = "queue-dmp-rwd")
+public class DigitalObjectMessageHandler extends AbstractRabbitHandlerTemplate {
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    @Autowired
+    private ObjectDigitalServiceImpl objectDigitalService;
+
+    @Override
+    protected void handler(String message, Channel channel, Message vo) {
+          try {
+            log.info("接收对象消息:{}", message);
+            //接收对象消息
+            DigitalManageMessage messageVO = objectMapper.readValue(message, DigitalManageMessage.class);
+            ObjectNode objectDigital = messageVO.getNewObj();
+            if(objectDigital == null || StringUtils.isEmpty(messageVO.getOperatorType())){
+                log.info("新增消息格式有误:{}"+ messageVO);
+            }
+            ObjectDigital objectDigitalVO = objectMapper.readValue((DataInput) objectDigital, ObjectDigital.class);
+            //创建二维码图片
+            if(DigitalMessageConstant.OPERATE_AFTER_INSERT.equals(messageVO.getOperatorType())){
+                createObjectQrCode(objectDigitalVO);
+            }
+            //删除二维码信息
+            if(DigitalMessageConstant.OPERATE_AFTER_DELETE.equals(messageVO.getOperatorType())){
+                removeObjectQrCode(objectDigitalVO);
+            }
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+            throw new BusinessException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 生成二维码信息
+     * @param digital
+     */
+    private void createObjectQrCode(ObjectDigital digital){
+        //生成二维码图片并上传到文件服务器
+        UploadMes objectQrCode = objectDigitalService.createObjectQrCode(digital);
+        if(objectQrCode == null){
+            log.info("生成二维码失败");
+            return;
+        }
+        //设置对象二维码信息
+        objectDigitalService.setObjectQrCode(digital,objectQrCode);
+        //更新对象二维码信息
+        List<ObjectDigital> list = new ArrayList<>();
+        list.add(digital);
+        objectDigitalService.update(list);
+    }
+
+    /**
+     * 移除对象二维码信息点
+     * @param digital
+     */
+    public void removeObjectQrCode(ObjectDigital digital){
+        ObjectNode infos = JsonNodeFactory.instance.objectNode();
+        //删除二维码信息点
+        ArrayNode removeInfos = JsonNodeFactory.instance.arrayNode();
+        removeInfos.add(CommonConstant.QR_CODE_PIC_INFO);
+        infos.put(CommonConstant.REMOVE_FIELD, removeInfos);
+        digital.setInfos(infos);
+
+        List<ObjectDigital> list = new ArrayList<>();
+        list.add(digital);
+        objectDigitalService.update(list);
+    }
+}

+ 7 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/IObjectDigitalService.java

@@ -3,6 +3,7 @@ package com.persagy.dmp.rwd.digital.service;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.digital.entity.ObjectDigital;
@@ -147,4 +148,10 @@ public interface IObjectDigitalService extends IService<ObjectDigital> {
      * Update By lijie 2021/9/27 17:46
      */
     CommonResult<List<ObjectDigital>> batchUpdateClassCodesByIds(List<ObjectDigital> objectDigitals);
+
+    /**
+     * 生成默认二维码
+     * @param objectDigitals
+     */
+    void createDefaultQrCode(List<ObjectNode> objectDigitals);
 }

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

@@ -2,15 +2,21 @@ package com.persagy.dmp.rwd.digital.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
 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.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.CodeTableTypeEnum;
@@ -27,6 +33,9 @@ import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.dmp.file.client.FileClientFacade;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
 import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.basic.constant.DigitalRelCode;
@@ -39,11 +48,14 @@ import com.persagy.dmp.rwd.digital.dao.ObjectRelationMapper;
 import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
 import com.persagy.dmp.rwd.parser.service.InfoDataFactory;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
 import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -55,6 +67,7 @@ import java.util.stream.Collectors;
 @Service
 @Transactional(rollbackFor = Exception.class)
 @RequiredArgsConstructor
+@Slf4j
 public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, ObjectDigital> implements IObjectDigitalService {
 
     private final ObjectDigitalMapper objectDigitalMapper;
@@ -454,6 +467,7 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         return ResultHelper.multi(new ArrayList<>());
     }
 
+
     /***
      * Description: 通用处理分页数据方法
      * @param dataResult : 分页数据
@@ -811,4 +825,76 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         return CollUtil.fieldValueAsMap(objectDigitals, "id", "virtual_codes");
     }
 
+
+    /**
+     * 生成默认二维码
+     * @param objectDigitals
+     */
+    @Override
+    public void createDefaultQrCode(List<ObjectNode> objectDigitals) {
+        if(CollUtil.isEmpty(objectDigitals)){
+            return;
+        }
+        List<ObjectDigital> list = new ArrayList<>();
+        for (ObjectNode objectDigital : objectDigitals) {
+            //生成二维码图片,并上传到文件服务器
+            ObjectDigital digital = new ObjectDigital();
+            digital.setId(objectDigital.get("id").textValue());
+            UploadMes objectQrCode = createObjectQrCode(digital);
+            if(objectQrCode == null){
+                log.info("生成二维码失败");
+                continue;
+            }
+            //设置对象二维码信息
+            setObjectQrCode(digital,objectQrCode);
+            list.add(digital);
+        }
+        //更新对象二维码信息
+        update(list);
+    }
+
+    /**
+     * 设置二维码图片
+     * @param digital
+     */
+    public void setObjectQrCode(ObjectDigital digital, UploadMes objectQrCode){
+        //设置二维码信息
+        ArrayNode qrCodePics = JsonNodeFactory.instance.arrayNode();
+        ObjectNode qrCodePic = JsonNodeFactory.instance.objectNode();
+        qrCodePic.put("key", objectQrCode.getId());
+        qrCodePics.add(qrCodePic);
+
+        ObjectNode infos = JsonNodeFactory.instance.objectNode();
+        infos.put(CommonConstant.QR_CODE_PIC_INFO,qrCodePics);
+        digital.setInfos(infos);
+    }
+
+    /**
+     * 生成二维码信息并上传到文件服务器
+     * @param objectDigitalVO
+     */
+    public UploadMes createObjectQrCode(ObjectDigital objectDigitalVO){
+        //获取基础参数
+        String projectId = objectDigitalVO.getProjectId();
+        String groupCode = objectDigitalVO.getGroupCode();
+        String objId = objectDigitalVO.getId();
+        String key = CommonConstant.QRCODE_KEY_PREFIX +"_"+ objId;
+        //生成二维码
+        QrConfig qrConfig = new QrConfig(300, 300);
+        File qrCodeFile = QrCodeUtil.generate(objId, qrConfig, FileUtil.file("/image"));
+        //上传到文件服务器
+        FileRequestData fileRequestData = new FileRequestData();
+        fileRequestData.setFileName(key);
+        fileRequestData.setFileMd5(SecureUtil.md5(qrCodeFile));
+        fileRequestData.setGroupCode(objectDigitalVO.getGroupCode());
+        fileRequestData.setFileBucket(CommonConstant.FILE_BUCKET_NAME);
+        fileRequestData.setFileSize(qrCodeFile.length());
+        CommonResult<UploadMes> uploadMesCommonResult = FileClientFacade.initSingleUploadPrototype(groupCode,projectId,null,null,fileRequestData);
+        if(!CommonConstant.QUERY_SUCCESS.equals(uploadMesCommonResult.getResult())){
+            log.info("上传文件失败:"+uploadMesCommonResult.getMessage());
+            return new UploadMes();
+        }
+        log.info("生成二维码信息"+uploadMesCommonResult.getMessage());
+        return uploadMesCommonResult.getData();
+    }
 }

+ 12 - 0
dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java

@@ -40,4 +40,16 @@ public interface CommonConstant {
     CharSequence RELATION_UNIQUE_KEY_FORMAT = "{}_{}_{}_{}";
     /** 新中台已移除的旧中台数据表字段 */
     String TYPE = "type";;
+
+    /** 二维码图片key前缀 */
+    String QRCODE_KEY_PREFIX = "QrCode";
+
+    /** 文件存储桶名称 */
+    String FILE_BUCKET_NAME = "dmp-rwd";
+
+    /** 二维码图片信息点 */
+    String QR_CODE_PIC_INFO ="qrCodePic";
+
+    /** remove字段 */
+    String REMOVE_FIELD ="$remove";
 }