2026-02-27 15:46:12 +08:00
|
|
|
|
package agent
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
2026-02-27 17:18:20 +08:00
|
|
|
|
"strings"
|
2026-02-27 15:46:12 +08:00
|
|
|
|
|
|
|
|
|
|
"bdqr-server/app/main/api/internal/svc"
|
|
|
|
|
|
"bdqr-server/app/main/api/internal/types"
|
2026-02-27 17:18:20 +08:00
|
|
|
|
"bdqr-server/common/xerr"
|
|
|
|
|
|
"bdqr-server/app/main/model"
|
2026-02-27 15:46:12 +08:00
|
|
|
|
|
2026-02-27 17:18:20 +08:00
|
|
|
|
"github.com/pkg/errors"
|
2026-02-27 15:46:12 +08:00
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type CheckFeatureWhitelistStatusLogic struct {
|
|
|
|
|
|
logx.Logger
|
|
|
|
|
|
ctx context.Context
|
|
|
|
|
|
svcCtx *svc.ServiceContext
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func NewCheckFeatureWhitelistStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckFeatureWhitelistStatusLogic {
|
|
|
|
|
|
return &CheckFeatureWhitelistStatusLogic{
|
|
|
|
|
|
Logger: logx.WithContext(ctx),
|
|
|
|
|
|
ctx: ctx,
|
|
|
|
|
|
svcCtx: svcCtx,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (l *CheckFeatureWhitelistStatusLogic) CheckFeatureWhitelistStatus(req *types.CheckFeatureWhitelistStatusReq) (resp *types.CheckFeatureWhitelistStatusResp, err error) {
|
2026-02-27 17:18:20 +08:00
|
|
|
|
// 1. 验证参数
|
|
|
|
|
|
if req.IdCard == "" {
|
|
|
|
|
|
return nil, errors.Wrapf(xerr.NewErrMsg("身份证号不能为空"), "")
|
|
|
|
|
|
}
|
|
|
|
|
|
if req.FeatureApiId == "" {
|
|
|
|
|
|
return nil, errors.Wrapf(xerr.NewErrMsg("模块API标识不能为空"), "")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 提取主模块ID(去掉下划线后的部分)
|
|
|
|
|
|
mainApiId := req.FeatureApiId
|
|
|
|
|
|
if idx := strings.Index(req.FeatureApiId, "_"); idx > 0 {
|
|
|
|
|
|
mainApiId = req.FeatureApiId[:idx]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 查询feature信息(使用主模块ID)
|
|
|
|
|
|
feature, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, mainApiId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
if errors.Is(err, model.ErrNotFound) {
|
|
|
|
|
|
return nil, errors.Wrapf(xerr.NewErrMsg("模块不存在"), "")
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询模块信息失败, %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 4. 检查是否在白名单中(使用主模块ID)
|
|
|
|
|
|
whitelistBuilder := l.svcCtx.UserFeatureWhitelistModel.SelectBuilder().
|
|
|
|
|
|
Where("id_card = ? AND feature_api_id = ? AND status = ?", req.IdCard, mainApiId, 1)
|
|
|
|
|
|
whitelists, err := l.svcCtx.UserFeatureWhitelistModel.FindAll(l.ctx, whitelistBuilder, "")
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询白名单记录失败, %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
isWhitelisted := len(whitelists) > 0
|
|
|
|
|
|
|
|
|
|
|
|
// 5. 如果提供了 queryId,检查当前报告数据是否已删除
|
|
|
|
|
|
dataDeleted := false
|
|
|
|
|
|
if req.QueryId != "" {
|
|
|
|
|
|
containsFeature, err := l.svcCtx.WhitelistService.CheckQueryDataContainsFeature(l.ctx, req.QueryId, req.FeatureApiId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
// 检查失败不影响主流程,记录日志即可
|
|
|
|
|
|
logx.Errorf("检查报告数据是否包含模块失败:查询记录 %s,模块 %s,错误:%v", req.QueryId, req.FeatureApiId, err)
|
|
|
|
|
|
// 默认认为数据已删除(保守处理)
|
|
|
|
|
|
dataDeleted = true
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 如果数据中不包含该模块,说明已删除
|
|
|
|
|
|
dataDeleted = !containsFeature
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 未提供 queryId,无法判断数据是否已删除,默认认为已删除(保守处理)
|
|
|
|
|
|
dataDeleted = true
|
|
|
|
|
|
}
|
2026-02-27 15:46:12 +08:00
|
|
|
|
|
2026-02-27 17:18:20 +08:00
|
|
|
|
return &types.CheckFeatureWhitelistStatusResp{
|
|
|
|
|
|
IsWhitelisted: isWhitelisted,
|
|
|
|
|
|
WhitelistPrice: feature.WhitelistPrice,
|
|
|
|
|
|
FeatureId: feature.Id,
|
|
|
|
|
|
DataDeleted: dataDeleted,
|
|
|
|
|
|
}, nil
|
2026-02-27 15:46:12 +08:00
|
|
|
|
}
|