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 给前端。 * *

请求体(snake_case): *

     * {
     *   "data_id": "<业务主键,可空>",
     *   "op_type": "baogao_reject",
     *   "account_name": "admin",
     *   "password": "123456",
     *   "note": "退回原因 / 操作说明",
     *   "meta_data": "调用方业务元数据"
     * }
     * 
* *

响应: *

{ "data": { "biz_sign": "<lims_sign.f_id>" } }
*/ @Operation(summary = "电子签名校验") @PostMapping("/verify") public R> verify(@RequestBody LimsSignVerifyParam param) { try { String signId = limsSignService.verifyAndRecord(param); Map data = new HashMap<>(); data.put("biz_sign", signId); return R.success("签名成功", data); } catch (DataException e) { return R.error(e.getMessage()); } } /** * 校验指定用户账户 + 签名密码,通过后落 lims_sign 一条。 * *

与 /verify 的差异: *

*/ @Operation(summary = "指定用户电子签名校验") @PostMapping("/verify_user") public R> verifyUser(@RequestBody LimsSignVerifyParam param) { try { LimsSignEntity sign = limsSignService.verifyUserAndRecord(param); Map 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()); } } /** * 当前登录用户修改 / 初始化自己的签名密码。 * *

请求体(snake_case): *

     * {
     *   "account_password": "<Md5(账户登录密码明文)>",
     *   "password": "<新签名密码明文>",
     *   "repeat_password": "<重复新签名密码>",
     *   "code": "<图形验证码>",
     *   "timestamp": "<图形验证码 redis key>"
     * }
     * 
* *

校验顺序见 {@link LimsSignService#modifySignPassword}:先验证码 → 账户密码 → 新密码一致性。 */ @Operation(summary = "修改 / 初始化签名密码") @PostMapping("/modify-password") public R modifyPassword(@RequestBody LimsModifySignPasswordParam param) { try { limsSignService.modifySignPassword(param); return R.success("签名密码修改成功", null); } catch (DataException e) { return R.error(e.getMessage()); } } /** * 给所有未软删 base_user 批量初始化签名密码 = "123456"。 * 已有记录跳过;幂等可重复调。仅 admin 可调。 * *

响应: *

{ "data": { "inserted": 240, "skipped": 4 } }
*/ @Operation(summary = "批量初始化签名密码(admin)") @PostMapping("/init-all") public R> initAll() { UserInfo userInfo = UserProvider.getUser(); if (userInfo == null) { return R.error("当前未登录"); } if (!userInfo.getIsAdministrator()) { return R.error("仅管理员可执行批量初始化"); } int[] result = limsSignService.initAllUsers(); Map data = new HashMap<>(); data.put("inserted", result[0]); data.put("skipped", result[1]); return R.success("初始化完成", data); } }