feat: 安全回写档口入库码并支持核验恢复 (#234)

This commit is contained in:
chengma
2026-08-15 09:10:10 +08:00
parent 15ebda23e3
commit 2778eed29f
11 changed files with 782 additions and 4 deletions
+64
View File
@@ -155,6 +155,70 @@ func (h *Handler) InnerCodeMatch(c *gin.Context) {
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, message)
}
// InnerCodeApply 在操作员确认后逐条执行安全回写。
func (h *Handler) InnerCodeApply(c *gin.Context) {
businessDate, status, keyword := c.PostForm("date"), c.PostForm("status"), c.PostForm("q")
pageNumber := service.ParsePage(c.PostForm("page"))
ids := make([]int64, 0)
for _, raw := range c.PostFormArray("ids") {
if id, err := strconv.ParseInt(strings.TrimSpace(raw), 10, 64); err == nil && id > 0 {
ids = append(ids, id)
}
}
client, message := h.innerCodeSybClient()
if message != "" {
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, message)
return
}
result, err := service.ApplyInnerCodes(c.Request.Context(), h.db, client, ids, currentUser(c).UserID)
if err != nil {
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, "回写未完成:"+err.Error())
return
}
message = fmt.Sprintf("回写完成:选择 %d 条,成功 %d 条,已存在 %d 条,跳过 %d 条,失败 %d 条,需核对 %d 条。",
result.Requested, result.Updated, result.AlreadyFilled, result.Skipped, result.Failed, result.NeedsCheck)
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, message)
}
// InnerCodeRecheck 只重新读取未知结果,绝不再次发送删除或写入。
func (h *Handler) InnerCodeRecheck(c *gin.Context) {
businessDate, status, keyword := c.PostForm("date"), c.PostForm("status"), c.PostForm("q")
pageNumber := service.ParsePage(c.PostForm("page"))
id, err := strconv.ParseInt(strings.TrimSpace(c.PostForm("id")), 10, 64)
if err != nil || id <= 0 {
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, "记录编号无效,没有执行核对。")
return
}
client, message := h.innerCodeSybClient()
if message != "" {
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, message)
return
}
_, message, err = service.RecheckInnerCode(c.Request.Context(), h.db, client, id)
if err != nil {
message = "重新核对失败:" + err.Error()
}
h.innerCodeRedirect(c, businessDate, status, keyword, pageNumber, message)
}
func (h *Handler) innerCodeSybClient() (*syb.Client, string) {
cfg, err := config.Load()
if err != nil {
return nil, "顺运宝配置不可用,没有发送远端请求。"
}
client, err := syb.New(cfg.Syb.BaseURL)
if err != nil {
return nil, "顺运宝地址配置有误,没有发送远端请求。"
}
if err := service.EnsureSybSession(h.db, client, cfg.Syb.Username, time.Now()); err != nil {
if errors.Is(err, service.ErrSybLoginRequired) {
return nil, "顺运宝会话已过期,请先到“顺运宝数据”页面登录。"
}
return nil, "校验顺运宝会话失败,没有发送远端请求。"
}
return client, ""
}
func (h *Handler) innerCodeRedirect(c *gin.Context, businessDate, status, keyword string, pageNumber int, message string) {
values := url.Values{"date": {businessDate}, "page": {strconv.Itoa(pageNumber)}, "message": {message}}
if strings.TrimSpace(status) != "" {