1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.ruoyi.inspect.util;
 
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
import java.util.Base64;
 
/**
 * Author: yuan
 * Date: 2024-12-17 星期二 10:35:50
 * Description: User工具类
 */
@Component
public class UserUtils {
    private static UserMapper userMapper;
 
    private static String imgUrl;
 
    @Autowired
    public void setUserMapper(UserMapper userMapper) {
        UserUtils.userMapper = userMapper;
    }
 
    @Autowired
    public void setImgUrl(@Value("${file.path}") String imgUrl) {
        UserUtils.imgUrl = imgUrl;
    }
 
    /**
     * 通过人员id获取用户签名地址
     * @param userId 人员id
     * @return 用户签名地址
     */
    public static String getUserSignatureUrl(Integer userId) {
        String userSignatureUrl = null;
        if (userId != null) {
            userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getId, userId))
                    .getSignatureUrl();
            if (StringUtils.isBlank(userSignatureUrl)) {
                throw new ErrorException("找不到该人员签名");
            }
            return imgUrl + "\\" + userSignatureUrl;
        } else {
            return null;
        }
    }
 
    /**
     * 通过人员id获取渲染Word用户签名对象
     * @param userId 人员id
     * @return 用户签名对象 or null
     */
    public static PictureRenderData getFinalUserSignatureUrl(Integer userId) {
        String userSignatureUrl = null;
        if (userId != null) {
            userSignatureUrl = userMapper.selectById(userId)
                    .getSignatureUrl();
            if (StringUtils.isBlank(userSignatureUrl)) {
                throw new ErrorException("找不到该人员签名");
            }
        }
        return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
    }
 
 
    /**
     * 通过名字获取渲染Word用户签名对象
     * @param userName 人员名字
     * @return 用户签名对象 or null
     */
    public static PictureRenderData getFinalUserSignatureUrl(String userName) {
        String userSignatureUrl = null;
        if (userName != null) {
            userSignatureUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getName, userName))
                    .getSignatureUrl();
            if (StringUtils.isBlank(userSignatureUrl)) {
                throw new ErrorException("找不到该人员签名");
            }
        }
        return StringUtils.isNotBlank(userSignatureUrl) ? Pictures.ofLocal(imgUrl + "/" + userSignatureUrl).create() : null;
    }
 
    /**
     * 全透明 1x1 PNG, 签名未配置/签名文件缺失时的兜底图片
     */
    private static final byte[] TRANSPARENT_PNG = Base64.getDecoder().decode(
            "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAANSURBVBhXY2BgYGAAAAAFAAGKM+MAAAAAAElFTkSuQmCC");
 
    /**
     * 图片值兜底: null 或本地图片读取失败(如签名文件缺失)时返回透明图片
     */
    public static PictureRenderData orTransparentPicture(PictureRenderData picture) {
        if (picture != null) {
            try {
                byte[] data = picture.readPictureData();
                if (data != null && data.length > 0) {
                    return picture;
                }
            } catch (Exception ignored) {
            }
        }
        return Pictures.ofBytes(TRANSPARENT_PNG).create();
    }
 
    /**
     * 渲染Word用户签名对象(按人员id, 带兜底): 人员不存在或签名未配置/文件缺失时返回透明图片, 不抛错
     */
    public static PictureRenderData getFinalUserSignatureOrTransparent(Integer userId) {
        try {
            return orTransparentPicture(getFinalUserSignatureUrl(userId));
        } catch (Exception e) {
            return Pictures.ofBytes(TRANSPARENT_PNG).create();
        }
    }
 
    /**
     * 渲染Word用户签名对象(按人员姓名, 带兜底): 人员不存在或签名未配置/文件缺失时返回透明图片, 不抛错
     */
    public static PictureRenderData getFinalUserSignatureOrTransparent(String userName) {
        try {
            return orTransparentPicture(getFinalUserSignatureUrl(userName));
        } catch (Exception e) {
            return Pictures.ofBytes(TRANSPARENT_PNG).create();
        }
    }
}