diff --git a/services/wecom/internal/logic/updateUserLogic.go b/services/wecom/internal/logic/updateUserLogic.go index 559e2ab..72d062c 100644 --- a/services/wecom/internal/logic/updateUserLogic.go +++ b/services/wecom/internal/logic/updateUserLogic.go @@ -37,22 +37,15 @@ func (l *UpdateUserLogic) UpdateUser(in *wecom.UpdateUserReq) (*wecom.Response, if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty { return outResponse(utils.ErrorParams, msg), nil } - if req.Id < utils.NumberOne && (req.UserId < utils.NumberOne || req.Type < utils.NumberOne) { - return outResponse(utils.ErrorParams, "请传入 id 或 user_id+type"), nil + if req.Id < utils.NumberOne { + return outResponse(utils.ErrorParams, "请传入 id"), nil } m := model.UserModel{}.Init() var row dao.WecomUser - w := modelbase.Params{Order: "id desc"} - if req.Id > utils.NumberZero { - w.Eq = map[string]string{"id": strconv.FormatInt(req.Id, utils.NumberTen)} - } else { - w.Eq = map[string]string{ - "user_id": strconv.FormatInt(req.UserId, utils.NumberTen), - "type": strconv.FormatUint(uint64(req.Type), utils.NumberTen), - } - } - if err := m.GetOne(w, &row); err != nil { + if err := m.GetOne(modelbase.Params{ + Eq: map[string]string{"id": strconv.FormatInt(req.Id, utils.NumberTen)}, + }, &row); err != nil { l.Errorf("wecom update user get: %v", err) return failResponse(utils.Fail), nil } @@ -60,6 +53,14 @@ func (l *UpdateUserLogic) UpdateUser(in *wecom.UpdateUserReq) (*wecom.Response, return failResponse(utils.ErrorNotFund), nil } + userId := row.UserId + if req.UserId > utils.NumberZero { + userId = req.UserId + } + typeVal := row.Type + if req.Type > utils.NumberZero { + typeVal = uint8(req.Type) + } name := row.Name if req.Name != utils.StringEmpty { name = req.Name @@ -68,12 +69,26 @@ func (l *UpdateUserLogic) UpdateUser(in *wecom.UpdateUserReq) (*wecom.Response, if req.Avatar != utils.StringEmpty { avatar = req.Avatar } - typeVal := row.Type - if req.Type > utils.NumberZero { - typeVal = uint8(req.Type) - } userStatus := resolveStatus(req.Status, row.Status) + // 更换 user_id / type 时校验是否与已有启用记录冲突 + if userId != row.UserId || typeVal != row.Type { + var existing dao.WecomUser + if err := m.GetOne(modelbase.Params{ + Eq: map[string]string{ + "user_id": strconv.FormatInt(userId, utils.NumberTen), + "type": strconv.FormatUint(uint64(typeVal), utils.NumberTen), + "status": strconv.Itoa(int(dao.StatusEnabled)), + }, + }, &existing); err != nil { + l.Errorf("wecom update user unique check: %v", err) + return failResponse(utils.Fail), nil + } + if existing.Id > utils.NumberZero && existing.Id != row.Id { + return failResponse(utils.ErrorDataIsExist), nil + } + } + plainMobile := utils.StringEmpty encryptMobile := row.Mobile if req.Mobile != utils.StringEmpty { @@ -93,6 +108,16 @@ func (l *UpdateUserLogic) UpdateUser(in *wecom.UpdateUserReq) (*wecom.Response, plainMobile = dec } + agentsJSON := row.AgentIds + if len(req.AgentIds) > utils.NumberZero { + built, aErr := buildAgentsJSON(req.AgentIds) + if aErr != nil { + l.Errorf("wecom update agents: %v", aErr) + return outResponse(utils.ErrorParams, aErr.Error()), nil + } + agentsJSON = built + } + if !utils.GetConfigBool("wecom.skip") { updateReq := wecomuser.UpdateRequest{ UserId: row.WecomUserId, @@ -109,25 +134,18 @@ func (l *UpdateUserLogic) UpdateUser(in *wecom.UpdateUserReq) (*wecom.Response, } } - data := map[string]interface{}{ + if _, err := m.Edit(modelbase.Params{ + Eq: map[string]string{"id": strconv.FormatInt(row.Id, utils.NumberTen)}, + }, map[string]interface{}{ + "user_id": userId, + "type": typeVal, "name": name, "mobile": encryptMobile, "avatar": avatar, "status": userStatus, - "type": typeVal, + "agent_ids": agentsJSON, "updated_at": utils.Now(), - } - if len(req.AgentIds) > utils.NumberZero { - agentsJSON, aErr := buildAgentsJSON(req.AgentIds) - if aErr != nil { - l.Errorf("wecom update agents: %v", aErr) - return outResponse(utils.ErrorParams, aErr.Error()), nil - } - data["agent_ids"] = agentsJSON - } - if _, err := m.Edit(modelbase.Params{ - Eq: map[string]string{"id": strconv.FormatInt(row.Id, utils.NumberTen)}, - }, data); err != nil { + }); err != nil { l.Errorf("wecom update user db: %v", err) return failResponse(utils.Fail), nil }