Prechádzať zdrojové kódy

add
眼视光医院添加 数字签名

lifang 2 mesiacov pred
rodič
commit
27fb64aabe

+ 2 - 1
nb-admin/src/main/resources/application.yml

@@ -82,7 +82,8 @@ mybatis-plus:
       logic-not-delete-value: 0
       logic-delete-value: 1
   configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
     default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
     cache-enabled: false
   type-aliases-package: com.nb.bus.entity

+ 33 - 20
nb-service/web-service/src/main/java/com/nb/web/service/bus/YiXinQian/YixinqianService.java

@@ -2,17 +2,21 @@ package com.nb.web.service.bus.YiXinQian;
 
 import cn.hutool.cache.Cache;
 import cn.hutool.cache.CacheUtil;
+import cn.hutool.core.io.IORuntimeException;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
+import com.nb.core.exception.CustomException;
 import lombok.RequiredArgsConstructor;
 import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import java.rmi.ConnectException;
+import java.rmi.server.ServerCloneException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -54,28 +58,36 @@ public class YixinqianService {
         tokenParam.put("appkey", yixinqianConfig.getAppKey());
 
         // 发送POST请求(JSON格式)
-        String tokenRespStr = HttpUtil.post(tokenUrl, JSONUtil.toJsonStr(tokenParam));
-        // 解析返回结果
-        RespResult<AccessTokenData> tokenResp = JSONUtil.toBean(
-                tokenRespStr,
-                new cn.hutool.core.lang.TypeReference<RespResult<AccessTokenData>>() {},
-                false
-        );
+        try {
+            String tokenRespStr = HttpUtil.post(tokenUrl, JSONUtil.toJsonStr(tokenParam));
+            // 解析返回结果
+            RespResult<AccessTokenData> tokenResp = JSONUtil.toBean(
+                    tokenRespStr,
+                    new cn.hutool.core.lang.TypeReference<RespResult<AccessTokenData>>() {},
+                    false
+            );
+
+            // 校验请求结果
+            if (!tokenResp.isSuccess()) {
+                throw new RuntimeException("获取AccessToken失败:" + tokenResp.getMessage() + "(状态码:" + tokenResp.getStatus() + ")");
+            }
+
+            // 3. 提取AccessToken并存入缓存
+            AccessTokenData tokenData = tokenResp.getData();
+            if (tokenData == null || tokenData.getAccessToken() == null || StrUtil.isBlank(tokenData.getAccessToken())) {
+                throw new RuntimeException("获取AccessToken失败:返回Token为空");
+            }
+            accessToken = tokenData.getAccessToken();
+            accessTokenCache.put(CACHE_KEY_ACCESS_TOKEN, accessToken); // 存入缓存(自动过期)
 
-        // 校验请求结果
-        if (!tokenResp.isSuccess()) {
-            throw new RuntimeException("获取AccessToken失败:" + tokenResp.getMessage() + "(状态码:" + tokenResp.getStatus() + ")");
-        }
-
-        // 3. 提取AccessToken并存入缓存
-        AccessTokenData tokenData = tokenResp.getData();
-        if (tokenData == null || tokenData.getAccessToken() == null || StrUtil.isBlank(tokenData.getAccessToken())) {
-            throw new RuntimeException("获取AccessToken失败:返回Token为空");
+            return accessToken;
+        }catch (Exception e){
+            if(e instanceof IORuntimeException){
+                throw new CustomException("连接CA系统失败,请检查网络");
+            }
+            throw e;
         }
-        accessToken = tokenData.getAccessToken();
-        accessTokenCache.put(CACHE_KEY_ACCESS_TOKEN, accessToken); // 存入缓存(自动过期)
 
-        return accessToken;
     }
 
     /**
@@ -98,7 +110,8 @@ public class YixinqianService {
         HttpResponse userInfoResp = HttpRequest.post(userInfoUrl)
                 .header("Content-Type", "application/json") // 传参格式:JSON
                 .header("Accept", "application/json")       // 返回格式:JSON
-                .body(JSONUtil.toJsonStr(queryParam))        // 请求体(JSON字符串)
+                .body(JSONUtil.toJsonStr(queryParam))// 请求体(JSON字符串)
+                .timeout(3000)
                 .execute();
 
         // 5. 解析返回结果

+ 0 - 1
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusLiquidController.java

@@ -2,7 +2,6 @@ package com.nb.web.service.bus.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;

+ 6 - 2
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusYixinQianController.java

@@ -57,10 +57,14 @@ public class BusYixinQianController {
 
     @GetMapping("/get/{userId}")
     @ApiOperation(value = "根据工号查询签名信息",notes = "权限  无")
-    @SaIgnore
     public R<String> page(@PathVariable("userId") String userId) {
         UserInfoQueryParam userInfoQueryParam = new UserInfoQueryParam();
         userInfoQueryParam.setUserId(userId);
-        return R.success(localBusUserCertInfoService.queryUserBase64Info(userInfoQueryParam));
+        try {
+            String s = localBusUserCertInfoService.queryUserBase64Info(userInfoQueryParam);
+            return R.success(s);
+        }catch (Exception e){
+            return R.success();
+        }
     }
 }

+ 77 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/Base64ImageConverter.java

@@ -0,0 +1,77 @@
+package com.nb.web.service.bus.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+import java.io.IOException;
+import java.util.Base64;
+import java.util.regex.Pattern;
+
+/**
+ * Base64字符串和图片转换器
+ */
+public class Base64ImageConverter implements Converter<String> {
+
+    // Base64正则表达式模式
+    private static final Pattern BASE64_PATTERN =
+            Pattern.compile("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$");
+
+    @Override
+    public Class<?> supportJavaTypeKey() {
+        return String.class;
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
+                                               GlobalConfiguration globalConfiguration) throws IOException {
+
+        if (value == null || value.isEmpty()) {
+            return new WriteCellData<>(new byte[0]);
+        }
+
+        try {
+            byte[] imageBytes;
+
+            // 判断是否为Base64字符串
+            if (isBase64String(value)) {
+                // 如果是data:image开头的Base64字符串,需要去掉前缀
+                String base64Data = value;
+                if (value.startsWith("data:image")) {
+                    base64Data = value.substring(value.indexOf(",") + 1);
+                }
+                imageBytes = Base64.getDecoder().decode(base64Data);
+            } else {
+                // 如果不是Base64,可能是一个文件路径
+                // 注意:这里需要根据实际需求决定是否保留文件读取逻辑
+                // imageBytes = FileUtils.readFileToByteArray(new File(value));
+                imageBytes = new byte[0]; // 或者抛出异常
+            }
+
+            return new WriteCellData<>(imageBytes);
+        } catch (Exception e) {
+            // 如果解析失败,返回空字节数组
+            return new WriteCellData<>(value);
+        }
+    }
+
+    /**
+     * 判断字符串是否为Base64编码
+     * @param str 待判断的字符串
+     * @return true表示是Base64编码,false表示不是
+     */
+    private boolean isBase64String(String str) {
+        if (str == null || str.isEmpty()) {
+            return false;
+        }
+
+        // 先检查是否包含data:image前缀
+        if (str.startsWith("data:image")) {
+            str = str.substring(str.indexOf(",") + 1);
+        }
+
+        // 使用正则表达式判断
+        return BASE64_PATTERN.matcher(str).matches();
+    }
+}

+ 157 - 19
nb-service/web-service/src/main/java/com/nb/web/service/bus/excel/LiquidExcelMergeWriteHandler.java

@@ -7,10 +7,16 @@ import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
 import com.nb.web.service.bus.service.dto.BusLiquidExcelVO;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.IOUtils;
 
 import java.util.List;
 import java.util.Set;
 import java.util.HashSet;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.io.ByteArrayInputStream;
+import java.util.Base64;
 
 /**
  * @ClassName : LiquidExcelMergeWriteHandler
@@ -18,11 +24,10 @@ import java.util.HashSet;
  * @Author :
  * @Date: 2025年09月11日
  */
-
 public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
     // 最小行索引
     private int minRowIndex = 0;
-    // 需要合并的列索引(根据ExcelProperty的order值)
+    // 需要合并的列索引(根据ExcelProperty的order值,排除图片列
     private Set<Integer> includeColumnIndexes = new HashSet<Integer>() {{
         add(0);  // 序号 (num) - order = 1
         add(1);  // 手术名称 (clinicName) - order = 1
@@ -35,13 +40,18 @@ public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
         add(8);  // 撤泵时间 (undoTime) - order = 8
         add(15); // 总量 (totalDose) - order = 14
         add(16); // 剩余量 (remainDose) - order = 15
-        add(17); // 废液检查人 (liquidChecker) - order = 17
-        add(18); // 废液核对备注 (liquidRemark) - order = 18
+        add(17); // 废液核对备注 (liquidRemark) - order = 18
+        add(18); // 废液核对时间 (liquidTime) - order = 19
         add(19); // 废液核对时间 (liquidTime) - order = 19
         add(20); // 废液核对时间 (liquidTime) - order = 19
-        add(21); // 废液执行人 (liquidExecutor) - order = 16
+        add(21); // 废液核对时间 (liquidTime) - order = 19
+        // 21(废液检查人) 和 22(废液执行人) 不包含在内,因为它们是图片列
     }};
 
+    // 图片列索引
+    private static final int LIQUID_EXECUTOR_COLUMN = 17; // 废液执行人 - order = 21
+    private static final int LIQUID_CHECKER_COLUMN = 18;  // 废液检查人 - order = 23
+
     private List<BusLiquidExcelVO> source;
 
     public LiquidExcelMergeWriteHandler(List<BusLiquidExcelVO> source) {
@@ -56,32 +66,154 @@ public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
             return;
         }
 
-        // 设置表头字体和大小
-        setHeaderStyle(context.getWriteSheetHolder().getSheet());
+        Sheet sheet = context.getWriteSheetHolder().getSheet();
+        setHeaderStyle(sheet);
+
         // 设置所有单元格垂直居中
-        setVerticalAlignment(context.getWriteSheetHolder().getSheet());
+        setVerticalAlignment(sheet);
         // 自适应列宽
-        autoSizeColumns(context.getWriteSheetHolder().getSheet());
+        autoSizeColumns(sheet);
+        // 先执行合并操作
+        performCellMerge(sheet);
 
-        Integer lastRowIndex = rowIndex;
+        // 再处理图片显示
+//        handleImageColumnsAfterMerge(sheet);
+    }
+
+    /**
+     * 执行单元格合并
+     */
+    private void performCellMerge(Sheet sheet) {
+//        Integer lastRowIndex = CollectionUtil.size(source) + 1;
+        Integer lastRowIndex = CollectionUtil.size(source) ;
         int lastMergeIndex = lastRowIndex;
         int currentIndex = lastRowIndex;
+
         while (currentIndex >= 1) {
-            BusLiquidExcelVO curSource = CollectionUtil.get(source, currentIndex -1 );
-            BusLiquidExcelVO preSource = CollectionUtil.get(source, currentIndex -2);
+            BusLiquidExcelVO curSource = CollectionUtil.get(source, currentIndex - 1);
+            BusLiquidExcelVO preSource = CollectionUtil.get(source, currentIndex - 2);
             if (!StrUtil.equals(curSource.getClinicId(), preSource.getClinicId()) || currentIndex == 1) {
                 // 合并指定的列
                 for (Integer i : includeColumnIndexes) {
-                    mergeCell(context.getWriteSheetHolder().getSheet(), currentIndex, lastMergeIndex, i, i);
+                    mergeCell(sheet, currentIndex, lastMergeIndex, i, i);
                 }
                 currentIndex--;
                 lastMergeIndex = currentIndex;
-            }else {
+            } else {
                 currentIndex--;
             }
         }
     }
 
+    /**
+     * 合并后处理图片显示
+     */
+    private void handleImageColumnsAfterMerge(Sheet sheet) {
+        Drawing<?> drawing = sheet.createDrawingPatriarch();
+
+        // 按clinicId分组处理,每组只在第一行显示图片
+        Map<String, List<Integer>> groupRows = new HashMap<>();
+
+        for (int i = 0; i < source.size(); i++) {
+            BusLiquidExcelVO record = source.get(i);
+            String clinicId = record.getClinicId();
+            int rowIndex = i + 1;
+
+            groupRows.computeIfAbsent(clinicId, k -> new ArrayList<>()).add(rowIndex);
+        }
+
+        // 每组只在第一行插入图片
+        for (Map.Entry<String, List<Integer>> entry : groupRows.entrySet()) {
+            List<Integer> rows = entry.getValue();
+            Integer firstRow = rows.get(0); // 获取该组的第一行
+            BusLiquidExcelVO record = source.get(firstRow - 1);
+            if (StrUtil.isNotEmpty(record.getLiquidExecutor())) {
+                insertImage(drawing, sheet, firstRow, LIQUID_EXECUTOR_COLUMN, record.getLiquidExecutor());
+            }
+
+            // 在合并区域的第一行插入图片
+            if (StrUtil.isNotEmpty(record.getLiquidChecker())) {
+                insertImage(drawing, sheet, firstRow, LIQUID_CHECKER_COLUMN, record.getLiquidChecker());
+            }
+
+        }
+    }
+
+    private void insertImage(Drawing<?> drawing, Sheet sheet, int rowIndex, int columnIndex, String base64Image) {
+        try {
+            // 解析Base64图片数据
+            String base64Data = base64Image;
+            if (base64Image.startsWith("data:image")) {
+                // 移除data:image前缀
+                base64Data = base64Image.substring(base64Image.indexOf(",") + 1);
+            }
+
+            byte[] imageBytes = Base64.getDecoder().decode(base64Data);
+            ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
+
+            // 创建图片
+            int pictureIdx = sheet.getWorkbook().addPicture(IOUtils.toByteArray(bis), Workbook.PICTURE_TYPE_PNG);
+            bis.close();
+
+            // 获取合并区域的大小
+            int endRow = getMergedRegionEndRow(sheet, rowIndex, columnIndex);
+            int endCol = columnIndex + 1; // 默认向右扩展一列
+
+            // 创建锚点(图片位置),覆盖整个合并区域
+            ClientAnchor anchor = drawing.createAnchor(
+                    0, 0, 0, 0,  // dx1, dy1, dx2, dy2
+                    columnIndex, rowIndex,  // col1, row1 (起始列, 起始行)
+                    endCol, endRow + 1      // col2, row2 (结束列, 结束行+1)
+            );
+
+            // 设置锚点类型为移动和随单元格大小调整
+            anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+
+            // 插入图片
+            drawing.createPicture(anchor, pictureIdx);
+
+            // 设置单元格样式
+            Row row = sheet.getRow(rowIndex);
+            if (row == null) {
+                row = sheet.createRow(rowIndex);
+            }
+            Cell cell = row.getCell(columnIndex);
+            if (cell == null) {
+                cell = row.createCell(columnIndex);
+            }
+
+            CellStyle style = sheet.getWorkbook().createCellStyle();
+            style.setAlignment(HorizontalAlignment.CENTER);
+            style.setVerticalAlignment(VerticalAlignment.CENTER);
+            cell.setCellStyle(style);
+
+        } catch (Exception e) {
+            // 如果图片处理失败,设置单元格为文本提示
+            Row row = sheet.getRow(rowIndex);
+            if (row == null) {
+                row = sheet.createRow(rowIndex);
+            }
+            Cell cell = row.getCell(columnIndex);
+            if (cell == null) {
+                cell = row.createCell(columnIndex);
+            }
+            cell.setCellValue("图片加载失败");
+        }
+    }
+
+    /**
+     * 获取指定单元格所在合并区域的结束行号
+     */
+    private int getMergedRegionEndRow(Sheet sheet, int rowIndex, int columnIndex) {
+        for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
+            CellRangeAddress range = sheet.getMergedRegion(i);
+            if (range.isInRange(rowIndex, columnIndex)) {
+                return range.getLastRow();
+            }
+        }
+        return rowIndex; // 如果没有合并区域,返回当前行
+    }
+
     private void setVerticalAlignment(Sheet sheet) {
         CellStyle style = sheet.getWorkbook().createCellStyle();
         // 设置垂直居中
@@ -93,11 +225,15 @@ public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
         style.setBorderBottom(BorderStyle.THIN);
         style.setBorderLeft(BorderStyle.THIN);
         style.setBorderRight(BorderStyle.THIN);
-        // 应用到所有单元格
+        // 应用到所有单元格(排除图片列)
         for (int i = 1; i <= sheet.getLastRowNum(); i++) {
             Row row = sheet.getRow(i);
             if (row != null) {
                 for (int j = 0; j < row.getLastCellNum(); j++) {
+                    // 跳过图片列
+                    if (j == LIQUID_CHECKER_COLUMN || j == LIQUID_EXECUTOR_COLUMN) {
+                        continue;
+                    }
                     Cell cell = row.getCell(j);
                     if (cell != null) {
                         cell.setCellStyle(style);
@@ -110,11 +246,12 @@ public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
         }
     }
 
-
     private void autoSizeColumns(Sheet sheet) {
-        // 自适应列宽
-        for (int i = 0; i < 20; i++) { // 20列
-//            sheet.autoSizeColumn(i);
+        // 自适应列宽(排除图片列)
+        for (int i = 0; i < 22; i++) { // 总共22列
+            if (i != LIQUID_CHECKER_COLUMN && i != LIQUID_EXECUTOR_COLUMN) {
+//                sheet.autoSizeColumn(i);
+            }
         }
     }
 
@@ -147,6 +284,7 @@ public class LiquidExcelMergeWriteHandler implements RowWriteHandler {
             }
         }
     }
+
     private void mergeCell(Sheet sheet, int startRowIndex, int endRowIndex, int startColumnIndex, int endColumnIndex) {
         // 开始和结束行数一样
         if (startRowIndex == endRowIndex) {

+ 25 - 5
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusClinicService.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.nb.core.exception.CustomException;
 import com.nb.web.api.bean.FormulaDrugDetailDomain;
 import com.nb.web.api.entity.BusDeviceEntity;
 import com.nb.web.api.entity.BusEvaluationEntity;
@@ -446,14 +447,33 @@ public class LocalBusClinicService extends BaseService<BusClinicMapper, BusClini
     }
 
     public void batchHandleLiquid(LiquidBatchHandleDTO source) {
+        if(StrUtil.isBlank(source.getLiquidExecutor())&&
+                StrUtil.isBlank(source.getLiquidChecker())&&
+                ObjectUtil.isNull(source.getLiquidTime())&&
+                StrUtil.isBlank(source.getLiquidMethod())){
+            return;
+        }
+        if(StrUtil.isNotBlank(source.getLiquidChecker())||
+                ObjectUtil.isNotNull(source.getLiquidTime())||
+                StrUtil.isNotBlank(source.getLiquidMethod())){
+            if(StrUtil.isBlank(source.getLiquidExecutor())){
+                throw new CustomException("废液处理执行人不能为空");
+            }
+            if(StrUtil.isBlank(source.getLiquidMethod())){
+                throw new CustomException("废液处理方式不能为空");
+            }
+            if(ObjectUtil.isNull(source.getLiquidTime())){
+                throw new CustomException("废液处理时间不能为空");
+            }
+        }
         List<String> clinicIds = source.getClinicIds();
         this.baseMapper.update(null,new LambdaUpdateWrapper<BusClinicEntity>()
                 .in(BusClinicEntity::getId,clinicIds)
-                .set(BusClinicEntity::getLiquidExecutor,source.getLiquidExecutor())
-                .set(BusClinicEntity::getLiquidChecker,source.getLiquidChecker())
-                .set(BusClinicEntity::getLiquidTime,source.getLiquidTime())
-                .set(BusClinicEntity::getLiquidMethod,source.getLiquidMethod())
-                .set(BusClinicEntity::getLiquidRemark,source.getLiquidRemark()));
+                .set(StrUtil.isNotBlank(source.getLiquidExecutor()),BusClinicEntity::getLiquidExecutor,source.getLiquidExecutor())
+                .set(StrUtil.isNotBlank(source.getLiquidChecker()),BusClinicEntity::getLiquidChecker,source.getLiquidChecker())
+                .set(ObjectUtil.isNotNull(source.getLiquidTime()),BusClinicEntity::getLiquidTime,source.getLiquidTime())
+                .set(StrUtil.isNotBlank(source.getLiquidMethod()),BusClinicEntity::getLiquidMethod,source.getLiquidMethod())
+                .set(StrUtil.isNotBlank(source.getLiquidRemark()),BusClinicEntity::getLiquidRemark,source.getLiquidRemark()));
     }
 
     public List<BusLiquidListVO> selectLiquidByIds(Collection<String> ids) {

+ 2 - 3
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusUserCertInfoService.java

@@ -50,13 +50,12 @@ public class LocalBusUserCertInfoService extends BaseService<BusUserCertInfoMapp
             if (!ObjectUtil.isNull(busUserCertInfo)) {
                 baseMapper.deleteById(userId);
             }
-
             // 从接口重新查询
             UserInfoData userInfoData = yixinqianService.queryUserInfo(query);
             busUserCertInfo = convertToBusUserCertInfo(userInfoData);
             baseMapper.insert(busUserCertInfo);
         }
-        return busUserCertInfo.getSignCert();
+        return busUserCertInfo.getSignatureImg();
     }
 
     /**
@@ -100,7 +99,7 @@ public class LocalBusUserCertInfoService extends BaseService<BusUserCertInfoMapp
         certInfo.setCertSn(userInfoData.getCertSN());
         certInfo.setCertDn(userInfoData.getCertDN());
         certInfo.setCertIssuer(userInfoData.getCertIssuer());
-        certInfo.setSignatureImg(userInfoData.getSignatureImg());
+        certInfo.setSignatureImg("data:image/png;base64,"+userInfoData.getSignatureImg());
         certInfo.setDepName(userInfoData.getDepName());
         certInfo.setIsAuthValid(userInfoData.getIsAuthValid());
         certInfo.setSignCert(userInfoData.getSignCert());

+ 3 - 7
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/dto/BusLiquidExcelVO.java

@@ -1,19 +1,15 @@
 package com.nb.web.service.bus.service.dto;
 
-import cn.hutool.core.date.DateUtil;
 import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.nb.web.service.bus.excel.Base64ImageConverter;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.ToString;
 
-import javax.validation.constraints.NotNull;
 import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
 
 /**
  * @author lifang
@@ -103,11 +99,11 @@ public class BusLiquidExcelVO implements Serializable {
     private String remainDose;
 
     @ApiModelProperty(value = "废液执行人")
-    @ExcelProperty(value = "废液执行人", order = 17)
+    @ExcelProperty(value = "废液执行人", order = 17,converter = Base64ImageConverter.class)
     private String liquidExecutor;
 
     @ApiModelProperty(value = "废液检查人")
-    @ExcelProperty(value = "废液检查人", order = 18)
+    @ExcelProperty(value = "废液检查人", order = 18,converter = Base64ImageConverter.class)
     private String liquidChecker;
 
     @ApiModelProperty(value = "废液处理方式")