feat: 安全回写档口入库码并支持核验恢复 (#234)
This commit is contained in:
@@ -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) != "" {
|
||||
|
||||
Reference in New Issue
Block a user