Files
lone-services/services/product/internal/logic/verifystatuslogic.go
T
gjs be8f89f449
CI / changes (push) Successful in 5s
CI / docker-bff (push) Failing after 7s
CI / docker-product (push) Failing after 5s
CI / docker-admin (push) Failing after 4s
CI / docker-user (push) Failing after 6s
change layout
2026-08-20 15:41:44 +08:00

198 lines
5.4 KiB
Go

package logic
import (
"context"
"encoding/json"
"lone-services/pkg/log"
"lone-services/pkg/modelbase"
"lone-services/pkg/utils"
"lone-services/pkg/validate"
product "lone-services/rpc/product/pb"
"lone-services/services/product/internal/dao"
"lone-services/services/product/internal/model"
"lone-services/services/product/internal/svc"
"lone-services/services/product/internal/wecom"
"lone-services/services/product/validator"
"strconv"
"time"
jsoniter "github.com/json-iterator/go"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
)
type VerifyStatusLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewVerifyStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *VerifyStatusLogic {
return &VerifyStatusLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *VerifyStatusLogic) VerifyFirst(in *product.VerifyStatusReq) (*product.Response, error) {
return l.verifyStatus(dao.VerifyStatusChecking, in)
}
func (l *VerifyStatusLogic) VerifySecond(in *product.VerifyStatusReq) (*product.Response, error) {
return l.verifyStatus(dao.VerifyStatusSecond, in)
}
func (l *VerifyStatusLogic) verifyStatus(expectStatus uint8, in *product.VerifyStatusReq) (*product.Response, error) {
var req validator.ProductVerifyStatusValidator
if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty {
return outResponse(utils.ErrorParams, msg), nil
}
if req.Status == uint32(dao.VerifyActionReject) && len(req.Reason) < 1 {
return failResponse(utils.ErrorReasonParams), nil
}
var info dao.VerifyStatusRow
w := modelbase.Params{
Eq: map[string]string{
"id": strconv.FormatInt(req.Id, 10),
"verify_status": strconv.Itoa(int(expectStatus)),
},
}
err := model.VerifyModel{}.Init().GetOne(w, &info)
if err != nil {
log.Errorf("verify status get: %v", err)
return failResponse(utils.Fail), nil
}
if info.Id < 1 {
return failResponse(utils.ErrorNotFund), nil
}
adminInfo := utils.GetUserFromCtx(l.ctx)
if adminInfo.ID < utils.NumberOne {
return failResponse(utils.ErrorNoLoginInfo), nil
}
adminId := int(adminInfo.ID)
adminName := adminInfo.Name
nextStatus := dao.VerifyStatusPass
reason := req.Reason
if req.Status == uint32(dao.VerifyActionReject) {
nextStatus = dao.VerifyStatusRefuse
} else if expectStatus == dao.VerifyStatusChecking {
nextStatus = dao.VerifyStatusSecond
}
productWhere := modelbase.Params{Eq: map[string]string{"id": info.VerifyId}}
var productExist dao.ProductCheckExist
err = model.ProductModel{}.Init().GetOne(productWhere, &productExist)
if err != nil {
log.Errorf("verify product get: %v", err)
return failResponse(utils.Fail), nil
}
if productExist.Id < 1 {
return outResponse(utils.ErrorNotFund, "没有找到产品信息"), nil
}
err = l.svcCtx.DB.WithContext(l.ctx).Transaction(func(tx *gorm.DB) error {
vm := model.VerifyModel{}.Init().WithTX(tx)
pm := model.ProductModel{}.Init().WithTX(tx)
now := time.Now().Format(time.DateTime)
if expectStatus == dao.VerifyStatusChecking {
if _, err := vm.Edit(w, &dao.VerifyFirstUpdate{
AdminId: adminId,
AdminName: adminName,
VerifyStatus: nextStatus,
VerifyReason: reason,
VerifyTime: now,
}); err != nil {
return err
}
_, err := pm.Edit(productWhere, &dao.ProductVerifyFirstStatus{
VerifyStatus: nextStatus,
VerifyId: adminId,
VerifyName: adminName,
Reason: reason,
})
return err
}
if _, err := vm.Edit(w, &dao.VerifySecondUpdate{
AdminSecondId: adminId,
AdminSecondName: adminName,
VerifyStatus: nextStatus,
VerifyReason: reason,
VerifyTime: now,
}); err != nil {
return err
}
if nextStatus == dao.VerifyStatusPass {
var content dao.ProductVerify
if err := jsoniter.Unmarshal([]byte(info.Content), &content); err != nil {
log.Errorf("product verify content json: %v content=%s", err, info.Content)
return err
}
_, err := pm.Edit(productWhere, &dao.ProductVerifySecondOkStatus{
ModelCode: content.ModelCode,
Price: content.Price,
StorePrice: content.StorePrice,
SalePrice: content.SalePrice,
SharePrice: content.SharePrice,
AgentPrice: content.AgentPrice,
SaleReward: content.SaleReward,
Type: content.Type,
NormsNumber: content.NormsNumber,
BoxNumber: content.BoxNumber,
VerifyStatus: nextStatus,
VerifySecondId: adminId,
VerifySecondName: adminName,
Reason: reason,
})
return err
}
_, err := pm.Edit(productWhere, &dao.ProductVerifySecondStatus{
VerifyStatus: nextStatus,
VerifySecondId: adminId,
VerifySecondName: adminName,
Reason: reason,
})
return err
})
if err != nil {
log.Errorf("verify status tx: %v", err)
if isJSONError(err) {
return failResponse(utils.ErrorFormatDataError), nil
}
return failResponse(utils.Fail), nil
}
notifyType := wecom.ProductFirstReview
if expectStatus == dao.VerifyStatusSecond {
notifyType = wecom.ProductSecondReview
}
objID, _ := strconv.Atoi(info.VerifyId)
wecom.NotifyProduct(wecom.NotifyJob{
ObjId: objID,
ObjType: dao.VerifyTypeProduct,
Type: notifyType,
Action: uint8(req.Status),
Reason: reason,
})
return okResponse(utils.StringEmpty), nil
}
func isJSONError(err error) bool {
switch err.(type) {
case *json.SyntaxError, *json.UnmarshalTypeError:
return true
default:
return false
}
}