刘光辉
14 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
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
137
138
139
package jnpf.limsController;
 
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jnpf.base.UserInfo;
import jnpf.exception.DataException;
import jnpf.limsEntity.LimsModifySignPasswordParam;
import jnpf.limsEntity.LimsSignEntity;
import jnpf.limsEntity.LimsSignVerifyParam;
import jnpf.limsService.LimsSignService;
import jnpf.util.R;
import jnpf.util.UserProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 * LIMS 电子签名接口。
 */
@Slf4j
@Tag(name = "lims电子签名", description = "签名校验 + 签名密码批量初始化")
@RestController
@RequestMapping("/lims/biz/sign")
public class LimsSignController {
 
    @Autowired
    private LimsSignService limsSignService;
 
    /**
     * 校验账户 + 签名密码,通过后落 lims_sign 一条,返回主键作为 biz_sign 给前端。
     *
     * <p>请求体(snake_case):
     * <pre>
     * {
     *   "data_id": "&lt;业务主键,可空&gt;",
     *   "op_type": "baogao_reject",
     *   "account_name": "admin",
     *   "password": "123456",
     *   "note": "退回原因 / 操作说明",
     *   "meta_data": "调用方业务元数据"
     * }
     * </pre>
     *
     * <p>响应:
     * <pre>{ "data": { "biz_sign": "&lt;lims_sign.f_id&gt;" } }</pre>
     */
    @Operation(summary = "电子签名校验")
    @PostMapping("/verify")
    public R<Map<String, String>> verify(@RequestBody LimsSignVerifyParam param) {
        try {
            String signId = limsSignService.verifyAndRecord(param);
            Map<String, String> data = new HashMap<>();
            data.put("biz_sign", signId);
            return R.success("签名成功", data);
        } catch (DataException e) {
            return R.error(e.getMessage());
        }
    }
 
    /**
     * 校验指定用户账户 + 签名密码,通过后落 lims_sign 一条。
     *
     * <p>与 /verify 的差异:
     * <ul>
     *   <li>allow_self 不为 yes 时,account_name 不允许为当前登录用户</li>
     *   <li>响应额外返回 biz_user_id,即下发签名账户对应的用户 id</li>
     * </ul>
     */
    @Operation(summary = "指定用户电子签名校验")
    @PostMapping("/verify_user")
    public R<Map<String, String>> verifyUser(@RequestBody LimsSignVerifyParam param) {
        try {
            LimsSignEntity sign = limsSignService.verifyUserAndRecord(param);
            Map<String, String> data = new HashMap<>();
            data.put("biz_sign", sign.getId());
            data.put("biz_user_id", sign.getCreatorUserId());
            return R.success("签名成功", data);
        } catch (DataException e) {
            return R.error(e.getMessage());
        }
    }
 
    /**
     * 当前登录用户修改 / 初始化自己的签名密码。
     *
     * <p>请求体(snake_case):
     * <pre>
     * {
     *   "account_password": "&lt;Md5(账户登录密码明文)&gt;",
     *   "password": "&lt;新签名密码明文&gt;",
     *   "repeat_password": "&lt;重复新签名密码&gt;",
     *   "code": "&lt;图形验证码&gt;",
     *   "timestamp": "&lt;图形验证码 redis key&gt;"
     * }
     * </pre>
     *
     * <p>校验顺序见 {@link LimsSignService#modifySignPassword}:先验证码 → 账户密码 → 新密码一致性。
     */
    @Operation(summary = "修改 / 初始化签名密码")
    @PostMapping("/modify-password")
    public R<Object> modifyPassword(@RequestBody LimsModifySignPasswordParam param) {
        try {
            limsSignService.modifySignPassword(param);
            return R.success("签名密码修改成功", null);
        } catch (DataException e) {
            return R.error(e.getMessage());
        }
    }
 
    /**
     * 给所有未软删 base_user 批量初始化签名密码 = "123456"。
     * 已有记录跳过;幂等可重复调。仅 admin 可调。
     *
     * <p>响应:
     * <pre>{ "data": { "inserted": 240, "skipped": 4 } }</pre>
     */
    @Operation(summary = "批量初始化签名密码(admin)")
    @PostMapping("/init-all")
    public R<Map<String, Integer>> initAll() {
        UserInfo userInfo = UserProvider.getUser();
        if (userInfo == null) {
            return R.error("当前未登录");
        }
        if (!userInfo.getIsAdministrator()) {
            return R.error("仅管理员可执行批量初始化");
        }
        int[] result = limsSignService.initAllUsers();
        Map<String, Integer> data = new HashMap<>();
        data.put("inserted", result[0]);
        data.put("skipped", result[1]);
        return R.success("初始化完成", data);
    }
}