diff --git a/.cursor/rules/api.mdc b/.cursor/rules/api.mdc new file mode 100644 index 0000000..c55f0bf --- /dev/null +++ b/.cursor/rules/api.mdc @@ -0,0 +1,186 @@ +# Cursor 工作流程和规范 + +## 目录结构说明 + +### API 定义目录 (`app/main/api/desc/`) +``` +desc/ +├── admin/ # 后台管理接口 +│ ├── admin_user.api # 管理员用户相关接口 +│ ├── platform_user.api # 平台用户相关接口 +│ ├── order.api # 订单管理接口 +│ ├── promotion.api # 促销活动接口 +│ ├── menu.api # 菜单管理接口 +│ ├── role.api # 角色权限接口 +│ └── auth.api # 后台认证接口 +│ +├── front/ # 前台业务接口 +│ ├── user.api # 用户相关接口 +│ ├── product.api # 产品相关接口 +│ ├── pay.api # 支付相关接口 +│ ├── query.api # 查询相关接口 +│ ├── auth/ # 前台认证相关子模块 +│ ├── product/ # 产品相关子模块 +│ ├── query/ # 查询相关子模块 +│ ├── user/ # 用户相关子模块 +│ └── pay/ # 支付相关子模块 +│ +└── main.api # API 主入口文件,用于引入所有子模块 +``` + +### 目录规范 +1. 后台管理接口统一放在 `admin/` 目录下 + - 所有后台管理相关的 API 定义文件都放在此目录 + - 文件名应清晰表明模块功能,如 `order.api`、`user.api` 等 + - 后台接口统一使用 `/api/v1/admin/` 前缀 + +2. 前台业务接口统一放在 `front/` 目录下 + - 所有面向用户的 API 定义文件都放在此目录 + - 可以根据业务模块创建子目录,如 `user/`、`product/` 等 + - 前台接口统一使用 `/api/v1/` 前缀 + +3. 主入口文件 `main.api` + - 用于引入所有子模块的 API 定义 + - 保持清晰的模块分类和注释 + +## API 开发流程 + +### 1. API 定义 +- 根据业务类型选择正确的目录: + - 后台管理接口:`app/main/api/desc/admin/` 目录 + - 前台业务接口:`app/main/api/desc/front/` 目录 +- 创建新的 `.api` 文件,遵循以下命名规范: + - 后台接口:`[模块名].api`,如 `order.api`、`user.api` + - 前台接口:`[模块名].api`,如 `product.api`、`pay.api` +- API 定义规范: + - 使用 RESTful 风格 + - 请求/响应结构体命名规范:`[模块名][操作名][Req/Resp]` + - 字段类型使用 string 而不是 int64 来存储枚举值 + - 添加必要的注释说明 + - 请求/响应参数定义规范: + ```go + type ( + // 创建类请求(必填字段) + AdminCreateXXXReq { + Field1 string `json:"field1"` // 字段1说明 + Field2 int64 `json:"field2"` // 字段2说明 + Field3 string `json:"field3"` // 字段3说明 + } + + // 更新类请求(可选字段使用指针类型) + AdminUpdateXXXReq { + Id int64 `path:"id"` // ID(路径参数) + Field1 *string `json:"field1,optional"` // 字段1说明(可选) + Field2 *int64 `json:"field2,optional"` // 字段2说明(可选) + Field3 *string `json:"field3,optional"` // 字段3说明(可选) + } + + // 查询列表请求(分页参数 + 可选查询条件) + AdminGetXXXListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + Field1 *string `form:"field1,optional"` // 查询条件1(可选) + Field2 *int64 `form:"field2,optional"` // 查询条件2(可选) + Field3 *string `form:"field3,optional"` // 查询条件3(可选) + } + + // 列表项结构体(用于列表响应) + XXXListItem { + Id int64 `json:"id"` // ID + Field1 string `json:"field1"` // 字段1 + Field2 string `json:"field2"` // 字段2 + Field3 string `json:"field3"` // 字段3 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 列表响应 + AdminGetXXXListResp { + Total int64 `json:"total"` // 总数 + Items []XXXListItem `json:"items"` // 列表数据 + } + ) + ``` + + - 参数定义注意事项: + 1. 创建类请求(Create): + - 所有字段都是必填的,使用普通类型(非指针) + - 使用 `json` 标签,不需要 `optional` 标记 + - 必须添加字段说明注释 + + 2. 更新类请求(Update): + - 除 ID 外的所有字段都是可选的,使用指针类型(如 `*string`、`*int64`) + - 使用 `json` 标签,并添加 `optional` 标记 + - ID 字段使用 `path` 标签,因为是路径参数 + - 必须添加字段说明注释 + + 3. 查询列表请求(GetList): + - 分页参数(page、pageSize)使用普通类型 + - 查询条件字段都是可选的,使用指针类型 + - 使用 `form` 标签,并添加 `optional` 标记 + - 必须添加字段说明注释 + + 4. 响应结构体: + - 列表响应使用 `Total` 和 `Items` 字段 + - 列表项使用单独的结构体定义 + - 时间字段统一使用 string 类型 + - 必须添加字段说明注释 + + 5. 标签使用规范: + - 路径参数:`path:"id"` + - JSON 参数:`json:"field_name"` + - 表单参数:`form:"field_name"` + - 可选字段:添加 `optional` 标记 + - 所有字段必须添加说明注释 + + - 示例: + ```go + // 通知管理接口 + @server( + prefix: /api/v1/admin/notification + group: admin_notification + ) + service main { + // 创建通知 + @handler AdminCreateNotification + post /create (AdminCreateNotificationReq) returns (AdminCreateNotificationResp) + + // 更新通知 + @handler AdminUpdateNotification + put /update/:id (AdminUpdateNotificationReq) returns (AdminUpdateNotificationResp) + + // 获取通知列表 + @handler AdminGetNotificationList + get /list (AdminGetNotificationListReq) returns (AdminGetNotificationListResp) + } + ``` + +### 2. 引入 API +- 在 `app/main/api/main.api` 中引入新定义的 API 文件: + ```go + import "desc/order.api" + ``` + +### 3. 生成代码 +- 在项目根目录运行 `gen_api.ps1` 脚本生成相关代码: + ```powershell + ./gen_api.ps1 + ``` +- 生成的文件包括: + - `app/main/api/internal/handler/` - 处理器 + - `app/main/api/internal/logic/` - 业务逻辑 + - `app/main/api/internal/svc/` - 服务上下文 + - `app/main/api/internal/types/` - 类型定义 + +### 4. 实现业务逻辑 +- 在 `app/main/api/internal/logic/` 目录下实现各个接口的业务逻辑 +- 具体实现规范请参考 `logic.mdc` 文件 + +## 注意事项 +1. 所有枚举类型使用 string 而不是 int64 +2. 错误处理必须使用 errors.Wrapf 和 xerr 包 +3. 涉及多表操作时使用事务 +4. 并发操作时注意使用互斥锁保护共享资源 +5. 时间类型统一使用 "2006-01-02 15:04:05" 格式 +6. 代码生成后需要检查并完善业务逻辑实现 +7. 保持代码风格统一,添加必要的注释 \ No newline at end of file diff --git a/.cursor/rules/logic.mdc b/.cursor/rules/logic.mdc new file mode 100644 index 0000000..ac4eaf0 --- /dev/null +++ b/.cursor/rules/logic.mdc @@ -0,0 +1,270 @@ +# Your rule content + +- You can @ files here +- You can use markdown but dont have to + +# Logic 实现规范 + +## 目录结构 +``` +app/main/api/internal/logic/ +├── admin_notification/ # 通知管理模块 +│ ├── admincreatenotificationlogic.go # 创建通知 +│ ├── admindeletnotificationlogic.go # 删除通知 +│ ├── admingetnotificationdetaillogic.go # 获取通知详情 +│ ├── admingetnotificationlistlogic.go # 获取通知列表 +│ └── adminupdatenotificationlogic.go # 更新通知 +└── [其他模块]/ +``` + +## Logic 实现规范 + +### 1. 基础结构 +每个 Logic 文件都应包含以下基础结构: +```go +package [模块名] + +import ( + "context" + "tyc-server/app/main/api/internal/svc" + "tyc-server/app/main/api/internal/types" + "tyc-server/common/xerr" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type [操作名]Logic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func New[操作名]Logic(ctx context.Context, svcCtx *svc.ServiceContext) *[操作名]Logic { + return &[操作名]Logic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} +``` + +### 2. 增删改查实现规范 + +#### 2.1 创建操作(Create) +```go +func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) { + // 1. 数据转换和验证 + data := &model.[表名]{ + Field1: req.Field1, + Field2: req.Field2, + // ... 其他字段映射 + } + + // 2. 数据库操作 + result, err := l.svcCtx.[表名]Model.Insert(l.ctx, nil, data) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "创建[操作对象]失败, err: %v, req: %+v", err, req) + } + + // 3. 返回结果 + id, _ := result.LastInsertId() + return &types.[操作名]Resp{Id: id}, nil +} +``` + +#### 2.2 删除操作(Delete) +```go +func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) { + // 1. 查询记录是否存在 + record, err := l.svcCtx.[表名]Model.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找[操作对象]失败, err: %v, id: %d", err, req.Id) + } + + // 2. 执行删除操作(软删除) + err = l.svcCtx.[表名]Model.DeleteSoft(l.ctx, nil, record) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "删除[操作对象]失败, err: %v, id: %d", err, req.Id) + } + + // 3. 返回结果 + return &types.[操作名]Resp{Success: true}, nil +} +``` + +#### 2.3 更新操作(Update) +```go +func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) { + // 1. 查询记录是否存在 + record, err := l.svcCtx.[表名]Model.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找[操作对象]失败, err: %v, id: %d", err, req.Id) + } + + // 2. 更新字段(使用指针判断是否更新) + if req.Field1 != nil { + record.Field1 = *req.Field1 + } + if req.Field2 != nil { + record.Field2 = *req.Field2 + } + // ... 其他字段更新 + + // 3. 执行更新操作 + _, err = l.svcCtx.[表名]Model.Update(l.ctx, nil, record) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "更新[操作对象]失败, err: %v, req: %+v", err, req) + } + + // 4. 返回结果 + return &types.[操作名]Resp{Success: true}, nil +} +``` + +#### 2.4 查询详情(GetDetail) +```go +func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) { + // 1. 查询记录 + record, err := l.svcCtx.[表名]Model.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找[操作对象]失败, err: %v, id: %d", err, req.Id) + } + + // 2. 构建响应 + resp = &types.[操作名]Resp{ + Id: record.Id, + Field1: record.Field1, + Field2: record.Field2, + CreateTime: record.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: record.UpdateTime.Format("2006-01-02 15:04:05"), + } + + // 3. 处理可选字段(如时间字段) + if record.OptionalField.Valid { + resp.OptionalField = record.OptionalField.Time.Format("2006-01-02") + } + + return resp, nil +} +``` + +#### 2.5 查询列表(GetList) +```go +func (l *[操作名]Logic) [操作名](req *types.[操作名]Req) (resp *types.[操作名]Resp, err error) { + // 1. 构建查询条件 + builder := l.svcCtx.[表名]Model.SelectBuilder() + + // 2. 添加查询条件(使用指针判断是否添加条件) + if req.Field1 != nil { + builder = builder.Where("field1 LIKE ?", "%"+*req.Field1+"%") + } + if req.Field2 != nil { + builder = builder.Where("field2 = ?", *req.Field2) + } + // ... 其他查询条件 + + // 3. 执行分页查询 + list, total, err := l.svcCtx.[表名]Model.FindPageListByPageWithTotal( + l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查询[操作对象]列表失败, err: %v, req: %+v", err, req) + } + + // 4. 构建响应列表 + items := make([]types.[列表项类型], 0, len(list)) + for _, item := range list { + listItem := types.[列表项类型]{ + Id: item.Id, + Field1: item.Field1, + Field2: item.Field2, + CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"), + } + // 处理可选字段 + if item.OptionalField.Valid { + listItem.OptionalField = item.OptionalField.Time.Format("2006-01-02") + } + items = append(items, listItem) + } + + // 5. 返回结果 + return &types.[操作名]Resp{ + Total: total, + Items: items, + }, nil +} +``` + +### 3. 错误处理规范 +1. 使用 `errors.Wrapf` 包装错误 +2. 使用 `xerr.NewErrCode` 创建业务错误 +3. 错误信息应包含: + - 操作类型(创建/更新/删除/查询) + - 具体错误描述 + - 相关参数信息(ID、请求参数等) + +### 4. 时间处理规范 +1. 时间格式化: + - 日期时间:`"2006-01-02 15:04:05"` + - 仅日期:`"2006-01-02"` +2. 可选时间字段处理: + ```go + if field.Valid { + resp.Field = field.Time.Format("2006-01-02") + } + ``` + +### 5. 数据库操作规范 +1. 查询条件构建: + ```go + builder := l.svcCtx.[表名]Model.SelectBuilder() + builder = builder.Where("field = ?", value) + ``` +2. 分页查询: + ```go + list, total, err := l.svcCtx.[表名]Model.FindPageListByPageWithTotal( + ctx, builder, page, pageSize, "id DESC") + ``` +3. 事务处理: + ```go + err = l.svcCtx.[表名]Model.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 事务操作 + return nil + }) + ``` + +### 6. 并发处理规范 +```go +var mu sync.Mutex +err = mr.MapReduceVoid(func(source chan<- interface{}) { + // 并发处理 +}, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { + // 处理单个项目 +}, func(pipe <-chan struct{}, cancel func(error)) { + // 完成处理 +}) +``` + +### 7. 注意事项 +1. 所有数据库操作必须进行错误处理 +2. 更新操作必须使用指针类型判断字段是否更新 +3. 查询列表必须支持分页 +4. 时间字段必须统一格式化 +5. 可选字段必须进行空值判断 +6. 保持代码风格统一,添加必要的注释 +7. 涉及多表操作时使用事务 +8. 并发操作时注意使用互斥锁保护共享资源 +9. 错误处理必须使用 errors.Wrapf 和 xerr 包 +10. 时间类型统一使用 "2006-01-02 15:04:05" 格式 + +# Your rule content + +- You can @ files here +- You can use markdown but dont have to diff --git a/app/main/api/Dockerfile b/app/main/api/Dockerfile index 5cf7de0..403ef84 100644 --- a/app/main/api/Dockerfile +++ b/app/main/api/Dockerfile @@ -15,7 +15,7 @@ ADD go.sum . RUN go mod download COPY . . COPY app/user/cmd/api/etc /app/etc -RUN go build -ldflags="-s -w" -o /app/user app/user/cmd/api/main.go +RUN go build -ldflags="-s -w" -o /app/main app/main/cmd/api/main.go FROM scratch @@ -25,7 +25,7 @@ COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/S ENV TZ Asia/Shanghai WORKDIR /app -COPY --from=builder /app/user /app/user +COPY --from=builder /app/main /app/main COPY --from=builder /app/etc /app/etc -CMD ["./user", "-f", "etc/main.yaml"] +CMD ["./main", "-f", "etc/main.yaml"] diff --git a/app/main/api/desc/admin/admin_agent.api b/app/main/api/desc/admin/admin_agent.api new file mode 100644 index 0000000..516c03f --- /dev/null +++ b/app/main/api/desc/admin/admin_agent.api @@ -0,0 +1,385 @@ +syntax = "v1" + +info ( + title: "后台代理管理服务" + desc: "后台代理相关接口" + author: "team" + version: "v1" +) + +// 代理管理接口 +@server( + prefix: /api/v1/admin/agent + group: admin_agent +) +service main { + // 代理分页查询 + @handler AdminGetAgentList + get /list (AdminGetAgentListReq) returns (AdminGetAgentListResp) + + // 代理推广链接分页查询 + @handler AdminGetAgentLinkList + get /agent-link/list (AdminGetAgentLinkListReq) returns (AdminGetAgentLinkListResp) + + // 代理佣金分页查询 + @handler AdminGetAgentCommissionList + get /agent-commission/list (AdminGetAgentCommissionListReq) returns (AdminGetAgentCommissionListResp) + + // 代理奖励分页查询 + @handler AdminGetAgentRewardList + get /agent-reward/list (AdminGetAgentRewardListReq) returns (AdminGetAgentRewardListResp) + + // 代理提现分页查询 + @handler AdminGetAgentWithdrawalList + get /agent-withdrawal/list (AdminGetAgentWithdrawalListReq) returns (AdminGetAgentWithdrawalListResp) + + // 代理上级抽佣分页查询 + @handler AdminGetAgentCommissionDeductionList + get /agent-commission-deduction/list (AdminGetAgentCommissionDeductionListReq) returns (AdminGetAgentCommissionDeductionListResp) + + // 平台抽佣分页查询 + @handler AdminGetAgentPlatformDeductionList + get /agent-platform-deduction/list (AdminGetAgentPlatformDeductionListReq) returns (AdminGetAgentPlatformDeductionListResp) + + // 代理产品配置分页查询 + @handler AdminGetAgentProductionConfigList + get /agent-production-config/list (AdminGetAgentProductionConfigListReq) returns (AdminGetAgentProductionConfigListResp) + + // 代理产品配置编辑 + @handler AdminUpdateAgentProductionConfig + post /agent-production-config/update (AdminUpdateAgentProductionConfigReq) returns (AdminUpdateAgentProductionConfigResp) + + // 代理会员充值订单分页查询 + @handler AdminGetAgentMembershipRechargeOrderList + get /agent-membership-recharge-order/list (AdminGetAgentMembershipRechargeOrderListReq) returns (AdminGetAgentMembershipRechargeOrderListResp) + + // 代理会员配置分页查询 + @handler AdminGetAgentMembershipConfigList + get /agent-membership-config/list (AdminGetAgentMembershipConfigListReq) returns (AdminGetAgentMembershipConfigListResp) + + // 代理会员配置编辑 + @handler AdminUpdateAgentMembershipConfig + post /agent-membership-config/update (AdminUpdateAgentMembershipConfigReq) returns (AdminUpdateAgentMembershipConfigResp) +} + +type ( + // 代理分页查询请求 + AdminGetAgentListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + Mobile *string `form:"mobile,optional"` // 手机号(可选) + Region *string `form:"region,optional"` // 区域(可选) + ParentAgentId *int64 `form:"parent_agent_id,optional"` // 上级代理ID(可选) + } + + // 代理列表项 + AgentListItem { + Id int64 `json:"id"` // 主键 + UserId int64 `json:"user_id"` // 用户ID + ParentAgentId int64 `json:"parent_agent_id"` // 上级代理ID + LevelName string `json:"level_name"` // 等级名称 + Region string `json:"region"` // 区域 + Mobile string `json:"mobile"` // 手机号 + MembershipExpiryTime string `json:"membership_expiry_time"` // 会员到期时间 + Balance float64 `json:"balance"` // 钱包余额 + TotalEarnings float64 `json:"total_earnings"` // 累计收益 + FrozenBalance float64 `json:"frozen_balance"` // 冻结余额 + WithdrawnAmount float64 `json:"withdrawn_amount"` // 提现总额 + CreateTime string `json:"create_time"` // 创建时间 + IsRealNameVerified bool `json:"is_real_name_verified"` // 是否已实名认证 + RealName string `json:"real_name"` // 实名姓名 + IdCard string `json:"id_card"` // 身份证号 + RealNameStatus string `json:"real_name_status"` // 实名状态(pending/approved/rejected) + } + + // 代理分页查询响应 + AdminGetAgentListResp { + Total int64 `json:"total"` // 总数 + Items []AgentListItem `json:"items"` // 列表数据 + } + + // 代理推广链接分页查询请求 + AdminGetAgentLinkListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名(可选) + LinkIdentifier *string `form:"link_identifier,optional"` // 推广码(可选) + } + + // 代理推广链接列表项 + AgentLinkListItem { + AgentId int64 `json:"agent_id"` // 代理ID + ProductName string `json:"product_name"` // 产品名 + Price float64 `json:"price"` // 价格 + LinkIdentifier string `json:"link_identifier"` // 推广码 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理推广链接分页查询响应 + AdminGetAgentLinkListResp { + Total int64 `json:"total"` // 总数 + Items []AgentLinkListItem `json:"items"` // 列表数据 + } + + // 代理佣金分页查询请求 + AdminGetAgentCommissionListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名(可选) + Status *int64 `form:"status,optional"` // 状态(可选) + } + + // 代理佣金列表项 + AgentCommissionListItem { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + OrderId int64 `json:"order_id"` // 订单ID + Amount float64 `json:"amount"` // 金额 + ProductName string `json:"product_name"` // 产品名 + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理佣金分页查询响应 + AdminGetAgentCommissionListResp { + Total int64 `json:"total"` // 总数 + Items []AgentCommissionListItem `json:"items"` // 列表数据 + } + + // 代理奖励分页查询请求 + AdminGetAgentRewardListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + RelationAgentId *int64 `form:"relation_agent_id,optional"` // 关联代理ID(可选) + Type *string `form:"type,optional"` // 奖励类型(可选) + } + + // 代理奖励列表项 + AgentRewardListItem { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + RelationAgentId int64 `json:"relation_agent_id"` // 关联代理ID + Amount float64 `json:"amount"` // 金额 + Type string `json:"type"` // 奖励类型 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理奖励分页查询响应 + AdminGetAgentRewardListResp { + Total int64 `json:"total"` // 总数 + Items []AgentRewardListItem `json:"items"` // 列表数据 + } + + // 代理提现分页查询请求 + AdminGetAgentWithdrawalListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + Status *int64 `form:"status,optional"` // 状态(可选) + WithdrawNo *string `form:"withdraw_no,optional"` // 提现单号(可选) + } + + // 代理提现列表项 + AgentWithdrawalListItem { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + WithdrawNo string `json:"withdraw_no"` // 提现单号 + Amount float64 `json:"amount"` // 金额 + Status int64 `json:"status"` // 状态 + PayeeAccount string `json:"payee_account"` // 收款账户 + Remark string `json:"remark"` // 备注 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理提现分页查询响应 + AdminGetAgentWithdrawalListResp { + Total int64 `json:"total"` // 总数 + Items []AgentWithdrawalListItem `json:"items"` // 列表数据 + } + + // 代理抽佣分页查询请求 + AdminGetAgentCommissionDeductionListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名(可选) + Type *string `form:"type,optional"` // 类型(cost/pricing,可选) + Status *int64 `form:"status,optional"` // 状态(可选) + } + + // 代理抽佣列表项 + AgentCommissionDeductionListItem { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + DeductedAgentId int64 `json:"deducted_agent_id"` // 被扣代理ID + Amount float64 `json:"amount"` // 金额 + ProductName string `json:"product_name"` // 产品名 + Type string `json:"type"` // 类型(cost/pricing) + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理抽佣分页查询响应 + AdminGetAgentCommissionDeductionListResp { + Total int64 `json:"total"` // 总数 + Items []AgentCommissionDeductionListItem `json:"items"` // 列表数据 + } + + // 平台抽佣分页查询请求 + AdminGetAgentPlatformDeductionListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + Type *string `form:"type,optional"` // 类型(cost/pricing,可选) + Status *int64 `form:"status,optional"` // 状态(可选) + } + + // 平台抽佣列表项 + AgentPlatformDeductionListItem { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + Amount float64 `json:"amount"` // 金额 + Type string `json:"type"` // 类型(cost/pricing) + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 平台抽佣分页查询响应 + AdminGetAgentPlatformDeductionListResp { + Total int64 `json:"total"` // 总数 + Items []AgentPlatformDeductionListItem `json:"items"` // 列表数据 + } + + // 代理产品配置分页查询请求 + AdminGetAgentProductionConfigListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ProductName *string `form:"product_name,optional"` // 产品名(可选) + Id *int64 `form:"id,optional"` // 配置ID(可选) + } + + // 代理产品配置分页查询响应 + AdminGetAgentProductionConfigListResp { + Total int64 `json:"total"` // 总数 + Items []AgentProductionConfigItem `json:"items"` // 列表数据 + } + + // 代理产品配置列表项 + AgentProductionConfigItem { + Id int64 `json:"id"` // 主键 + ProductName string `json:"product_name"` // 产品名 + CostPrice float64 `json:"cost_price"` // 成本 + PriceRangeMin float64 `json:"price_range_min"` // 最低定价 + PriceRangeMax float64 `json:"price_range_max"` // 最高定价 + PricingStandard float64 `json:"pricing_standard"` // 定价标准 + OverpricingRatio float64 `json:"overpricing_ratio"` // 超价比例 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理产品配置编辑请求 + AdminUpdateAgentProductionConfigReq { + Id int64 `json:"id"` // 主键 + CostPrice float64 `json:"cost_price"` // 成本 + PriceRangeMin float64 `json:"price_range_min"` // 最低定价 + PriceRangeMax float64 `json:"price_range_max"` // 最高定价 + PricingStandard float64 `json:"pricing_standard"` // 定价标准 + OverpricingRatio float64 `json:"overpricing_ratio"` // 超价比例 + } + + // 代理产品配置编辑响应 + AdminUpdateAgentProductionConfigResp { + Success bool `json:"success"` // 是否成功 + } + + // 代理会员充值订单分页查询请求 + AdminGetAgentMembershipRechargeOrderListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + UserId *int64 `form:"user_id,optional"` // 用户ID(可选) + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + OrderNo *string `form:"order_no,optional"` // 订单号(可选) + PlatformOrderId *string `form:"platform_order_id,optional"` // 平台订单号(可选) + Status *string `form:"status,optional"` // 状态(可选) + PaymentMethod *string `form:"payment_method,optional"` // 支付方式(可选) + } + + // 代理会员充值订单列表项 + AgentMembershipRechargeOrderListItem { + Id int64 `json:"id"` // 主键 + UserId int64 `json:"user_id"` // 用户ID + AgentId int64 `json:"agent_id"` // 代理ID + LevelName string `json:"level_name"` // 等级名称 + Amount float64 `json:"amount"` // 金额 + PaymentMethod string `json:"payment_method"` // 支付方式 + OrderNo string `json:"order_no"` // 订单号 + PlatformOrderId string `json:"platform_order_id"` // 平台订单号 + Status string `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理会员充值订单分页查询响应 + AdminGetAgentMembershipRechargeOrderListResp { + Total int64 `json:"total"` // 总数 + Items []AgentMembershipRechargeOrderListItem `json:"items"` // 列表数据 + } + + // 代理会员配置分页查询请求 + AdminGetAgentMembershipConfigListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + LevelName *string `form:"level_name,optional"` // 会员级别名称(可选) + } + + // 代理会员配置分页查询响应 + AdminGetAgentMembershipConfigListResp { + Total int64 `json:"total"` // 总数 + Items []AgentMembershipConfigListItem `json:"items"` // 列表数据 + } + + // 代理会员配置列表项 + AgentMembershipConfigListItem { + Id int64 `json:"id"` // 主键 + LevelName string `json:"level_name"` // 会员级别名称 + Price *float64 `json:"price"` // 会员年费 + ReportCommission *float64 `json:"report_commission"` // 直推报告收益 + LowerActivityReward *float64 `json:"lower_activity_reward"` // 下级活跃奖励金额 + NewActivityReward *float64 `json:"new_activity_reward"` // 新增活跃奖励金额 + LowerStandardCount *int64 `json:"lower_standard_count"` // 活跃下级达标个数 + NewLowerStandardCount *int64 `json:"new_lower_standard_count"` // 新增活跃下级达标个数 + LowerWithdrawRewardRatio *float64 `json:"lower_withdraw_reward_ratio"` // 下级提现奖励比例 + LowerConvertVipReward *float64 `json:"lower_convert_vip_reward"` // 下级转化VIP奖励 + LowerConvertSvipReward *float64 `json:"lower_convert_svip_reward"` // 下级转化SVIP奖励 + ExemptionAmount *float64 `json:"exemption_amount"` // 免责金额 + PriceIncreaseMax *float64 `json:"price_increase_max"` // 提价最高金额 + PriceRatio *float64 `json:"price_ratio"` // 提价区间收取比例 + PriceIncreaseAmount *float64 `json:"price_increase_amount"` // 在原本成本上加价的金额 + CreateTime string `json:"create_time"` // 创建时间 + } + + // 代理会员配置编辑请求 + AdminUpdateAgentMembershipConfigReq { + Id int64 `json:"id"` // 主键 + LevelName string `json:"level_name"` // 会员级别名称 + Price float64 `json:"price"` // 会员年费 + ReportCommission float64 `json:"report_commission"` // 直推报告收益 + LowerActivityReward *float64 `json:"lower_activity_reward,optional,omitempty"` // 下级活跃奖励金额 + NewActivityReward *float64 `json:"new_activity_reward,optional,omitempty"` // 新增活跃奖励金额 + LowerStandardCount *int64 `json:"lower_standard_count,optional,omitempty"` // 活跃下级达标个数 + NewLowerStandardCount *int64 `json:"new_lower_standard_count,optional,omitempty"` // 新增活跃下级达标个数 + LowerWithdrawRewardRatio *float64 `json:"lower_withdraw_reward_ratio,optional,omitempty"` // 下级提现奖励比例 + LowerConvertVipReward *float64 `json:"lower_convert_vip_reward,optional,omitempty"` // 下级转化VIP奖励 + LowerConvertSvipReward *float64 `json:"lower_convert_svip_reward,optional,omitempty"` // 下级转化SVIP奖励 + ExemptionAmount *float64 `json:"exemption_amount,optional,omitempty"` // 免责金额 + PriceIncreaseMax *float64 `json:"price_increase_max,optional,omitempty"` // 提价最高金额 + PriceRatio *float64 `json:"price_ratio,optional,omitempty"` // 提价区间收取比例 + PriceIncreaseAmount *float64 `json:"price_increase_amount,optional,omitempty"` // 在原本成本上加价的金额 + } + + // 代理会员配置编辑响应 + AdminUpdateAgentMembershipConfigResp { + Success bool `json:"success"` // 是否成功 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/admin_feature.api b/app/main/api/desc/admin/admin_feature.api new file mode 100644 index 0000000..3249c38 --- /dev/null +++ b/app/main/api/desc/admin/admin_feature.api @@ -0,0 +1,108 @@ +syntax = "v1" + +info ( + title: "后台功能管理服务" + desc: "后台功能管理相关接口" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +// 功能管理接口 +@server( + prefix: /api/v1/admin/feature + group: admin_feature +) +service main { + // 创建功能 + @handler AdminCreateFeature + post /create (AdminCreateFeatureReq) returns (AdminCreateFeatureResp) + + // 更新功能 + @handler AdminUpdateFeature + put /update/:id (AdminUpdateFeatureReq) returns (AdminUpdateFeatureResp) + + // 删除功能 + @handler AdminDeleteFeature + delete /delete/:id (AdminDeleteFeatureReq) returns (AdminDeleteFeatureResp) + + // 获取功能列表 + @handler AdminGetFeatureList + get /list (AdminGetFeatureListReq) returns (AdminGetFeatureListResp) + + // 获取功能详情 + @handler AdminGetFeatureDetail + get /detail/:id (AdminGetFeatureDetailReq) returns (AdminGetFeatureDetailResp) +} + +type ( + // 创建功能请求 + AdminCreateFeatureReq { + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 描述 + } + + // 创建功能响应 + AdminCreateFeatureResp { + Id int64 `json:"id"` // 功能ID + } + + // 更新功能请求 + AdminUpdateFeatureReq { + Id int64 `path:"id"` // 功能ID + ApiId *string `json:"api_id,optional"` // API标识 + Name *string `json:"name,optional"` // 描述 + } + + // 更新功能响应 + AdminUpdateFeatureResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除功能请求 + AdminDeleteFeatureReq { + Id int64 `path:"id"` // 功能ID + } + + // 删除功能响应 + AdminDeleteFeatureResp { + Success bool `json:"success"` // 是否成功 + } + + // 获取功能列表请求 + AdminGetFeatureListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ApiId *string `form:"api_id,optional"` // API标识 + Name *string `form:"name,optional"` // 描述 + } + + // 功能列表项 + FeatureListItem { + Id int64 `json:"id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 描述 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 获取功能列表响应 + AdminGetFeatureListResp { + Total int64 `json:"total"` // 总数 + Items []FeatureListItem `json:"items"` // 列表数据 + } + + // 获取功能详情请求 + AdminGetFeatureDetailReq { + Id int64 `path:"id"` // 功能ID + } + + // 获取功能详情响应 + AdminGetFeatureDetailResp { + Id int64 `json:"id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 描述 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/admin_product.api b/app/main/api/desc/admin/admin_product.api new file mode 100644 index 0000000..d748ad2 --- /dev/null +++ b/app/main/api/desc/admin/admin_product.api @@ -0,0 +1,175 @@ +syntax = "v1" + +info ( + title: "后台产品管理服务" + desc: "后台产品管理相关接口" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +// 产品管理接口 +@server( + prefix: /api/v1/admin/product + group: admin_product +) +service main { + // 创建产品 + @handler AdminCreateProduct + post /create (AdminCreateProductReq) returns (AdminCreateProductResp) + + // 更新产品 + @handler AdminUpdateProduct + put /update/:id (AdminUpdateProductReq) returns (AdminUpdateProductResp) + + // 删除产品 + @handler AdminDeleteProduct + delete /delete/:id (AdminDeleteProductReq) returns (AdminDeleteProductResp) + + // 获取产品列表 + @handler AdminGetProductList + get /list (AdminGetProductListReq) returns (AdminGetProductListResp) + + // 获取产品详情 + @handler AdminGetProductDetail + get /detail/:id (AdminGetProductDetailReq) returns (AdminGetProductDetailResp) + + // 获取产品功能列表 + @handler AdminGetProductFeatureList + get /feature/list/:product_id (AdminGetProductFeatureListReq) returns ([]AdminGetProductFeatureListResp) + + // 更新产品功能关联(批量) + @handler AdminUpdateProductFeatures + put /feature/update/:product_id (AdminUpdateProductFeaturesReq) returns (AdminUpdateProductFeaturesResp) +} + +type ( + // 创建产品请求 + AdminCreateProductReq { + ProductName string `json:"product_name"` // 服务名 + ProductEn string `json:"product_en"` // 英文名 + Description string `json:"description"` // 描述 + Notes string `json:"notes,optional"` // 备注 + CostPrice float64 `json:"cost_price"` // 成本 + SellPrice float64 `json:"sell_price"` // 售价 + } + + // 创建产品响应 + AdminCreateProductResp { + Id int64 `json:"id"` // 产品ID + } + + // 更新产品请求 + AdminUpdateProductReq { + Id int64 `path:"id"` // 产品ID + ProductName *string `json:"product_name,optional"` // 服务名 + ProductEn *string `json:"product_en,optional"` // 英文名 + Description *string `json:"description,optional"` // 描述 + Notes *string `json:"notes,optional"` // 备注 + CostPrice *float64 `json:"cost_price,optional"` // 成本 + SellPrice *float64 `json:"sell_price,optional"` // 售价 + } + + // 更新产品响应 + AdminUpdateProductResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除产品请求 + AdminDeleteProductReq { + Id int64 `path:"id"` // 产品ID + } + + // 删除产品响应 + AdminDeleteProductResp { + Success bool `json:"success"` // 是否成功 + } + + // 获取产品列表请求 + AdminGetProductListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ProductName *string `form:"product_name,optional"` // 服务名 + ProductEn *string `form:"product_en,optional"` // 英文名 + } + + // 产品列表项 + ProductListItem { + Id int64 `json:"id"` // 产品ID + ProductName string `json:"product_name"` // 服务名 + ProductEn string `json:"product_en"` // 英文名 + Description string `json:"description"` // 描述 + Notes string `json:"notes"` // 备注 + CostPrice float64 `json:"cost_price"` // 成本 + SellPrice float64 `json:"sell_price"` // 售价 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 获取产品列表响应 + AdminGetProductListResp { + Total int64 `json:"total"` // 总数 + Items []ProductListItem `json:"items"` // 列表数据 + } + + // 获取产品详情请求 + AdminGetProductDetailReq { + Id int64 `path:"id"` // 产品ID + } + + // 获取产品详情响应 + AdminGetProductDetailResp { + Id int64 `json:"id"` // 产品ID + ProductName string `json:"product_name"` // 服务名 + ProductEn string `json:"product_en"` // 英文名 + Description string `json:"description"` // 描述 + Notes string `json:"notes"` // 备注 + CostPrice float64 `json:"cost_price"` // 成本 + SellPrice float64 `json:"sell_price"` // 售价 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 获取产品功能列表请求 + AdminGetProductFeatureListReq { + ProductId int64 `path:"product_id"` // 产品ID + } + + // 获取产品功能列表响应Item + AdminGetProductFeatureListResp { + Id int64 `json:"id"` // 关联ID + ProductId int64 `json:"product_id"` // 产品ID + FeatureId int64 `json:"feature_id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 功能描述 + Sort int64 `json:"sort"` // 排序 + Enable int64 `json:"enable"` // 是否启用 + IsImportant int64 `json:"is_important"` // 是否重要 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // // 获取产品功能列表响应 + // AdminGetProductFeatureListResp { + // Items []ProductFeatureListItem `json:"items"` // 列表数据 + // } + + // 产品功能关联项 + ProductFeatureItem { + FeatureId int64 `json:"feature_id"` // 功能ID + Sort int64 `json:"sort"` // 排序 + Enable int64 `json:"enable"` // 是否启用 + IsImportant int64 `json:"is_important"` // 是否重要 + } + + // 更新产品功能关联请求(批量) + AdminUpdateProductFeaturesReq { + ProductId int64 `path:"product_id"` // 产品ID + Features []ProductFeatureItem `json:"features"` // 功能列表 + } + + // 更新产品功能关联响应 + AdminUpdateProductFeaturesResp { + Success bool `json:"success"` // 是否成功 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/admin_query.api b/app/main/api/desc/admin/admin_query.api new file mode 100644 index 0000000..a2e06d0 --- /dev/null +++ b/app/main/api/desc/admin/admin_query.api @@ -0,0 +1,135 @@ +syntax = "v1" + +info ( + title: "查询服务" + desc: "查询服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/query + group: admin_query + jwt: JwtAuth +) +service main { + @doc "获取查询详情" + @handler AdminGetQueryDetailByOrderId + get /detail/:order_id (AdminGetQueryDetailByOrderIdReq) returns (AdminGetQueryDetailByOrderIdResp) + + @doc "获取清理日志列表" + @handler AdminGetQueryCleanupLogList + get /cleanup/logs (AdminGetQueryCleanupLogListReq) returns (AdminGetQueryCleanupLogListResp) + + @doc "获取清理详情列表" + @handler AdminGetQueryCleanupDetailList + get /cleanup/details/:log_id (AdminGetQueryCleanupDetailListReq) returns (AdminGetQueryCleanupDetailListResp) + + @doc "获取清理配置列表" + @handler AdminGetQueryCleanupConfigList + get /cleanup/configs (AdminGetQueryCleanupConfigListReq) returns (AdminGetQueryCleanupConfigListResp) + + @doc "更新清理配置" + @handler AdminUpdateQueryCleanupConfig + put /cleanup/config (AdminUpdateQueryCleanupConfigReq) returns (AdminUpdateQueryCleanupConfigResp) +} + +type AdminGetQueryDetailByOrderIdReq { + OrderId int64 `path:"order_id"` +} + +type AdminGetQueryDetailByOrderIdResp { + Id int64 `json:"id"` // 主键ID + OrderId int64 `json:"order_id"` // 订单ID + UserId int64 `json:"user_id"` // 用户ID + ProductName string `json:"product_name"` // 产品ID + QueryParams map[string]interface{} `json:"query_params"` + QueryData []AdminQueryItem `json:"query_data"` + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + QueryState string `json:"query_state"` // 查询状态 +} + +type AdminQueryItem { + Feature interface{} `json:"feature"` + Data interface{} `json:"data"` // 这里可以是 map 或 具体的 struct +} + +// 清理日志相关请求响应定义 +type AdminGetQueryCleanupLogListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"page_size,default=20"` // 每页数量 + Status int64 `form:"status,optional"` // 状态:1-成功,2-失败 + StartTime string `form:"start_time,optional"` // 开始时间 + EndTime string `form:"end_time,optional"` // 结束时间 +} + +type AdminGetQueryCleanupLogListResp { + Total int64 `json:"total"` // 总数 + Items []QueryCleanupLogItem `json:"items"` // 列表 +} + +type QueryCleanupLogItem { + Id int64 `json:"id"` // 主键ID + CleanupTime string `json:"cleanup_time"` // 清理时间 + CleanupBefore string `json:"cleanup_before"` // 清理截止时间 + Status int64 `json:"status"` // 状态:1-成功,2-失败 + AffectedRows int64 `json:"affected_rows"` // 影响行数 + ErrorMsg string `json:"error_msg"` // 错误信息 + Remark string `json:"remark"` // 备注 + CreateTime string `json:"create_time"` // 创建时间 +} + +// 清理详情相关请求响应定义 +type AdminGetQueryCleanupDetailListReq { + LogId int64 `path:"log_id"` // 清理日志ID + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"page_size,default=20"` // 每页数量 +} + +type AdminGetQueryCleanupDetailListResp { + Total int64 `json:"total"` // 总数 + Items []QueryCleanupDetailItem `json:"items"` // 列表 +} + +type QueryCleanupDetailItem { + Id int64 `json:"id"` // 主键ID + CleanupLogId int64 `json:"cleanup_log_id"` // 清理日志ID + QueryId int64 `json:"query_id"` // 查询ID + OrderId int64 `json:"order_id"` // 订单ID + UserId int64 `json:"user_id"` // 用户ID + ProductName string `json:"product_name"` // 产品名称 + QueryState string `json:"query_state"` // 查询状态 + CreateTimeOld string `json:"create_time_old"` // 原创建时间 + CreateTime string `json:"create_time"` // 创建时间 +} + +// 清理配置相关请求响应定义 +type AdminGetQueryCleanupConfigListReq { + Status int64 `form:"status,optional"` // 状态:1-启用,0-禁用 +} + +type AdminGetQueryCleanupConfigListResp { + Items []QueryCleanupConfigItem `json:"items"` // 配置列表 +} + +type QueryCleanupConfigItem { + Id int64 `json:"id"` // 主键ID + ConfigKey string `json:"config_key"` // 配置键 + ConfigValue string `json:"config_value"` // 配置值 + ConfigDesc string `json:"config_desc"` // 配置描述 + Status int64 `json:"status"` // 状态:1-启用,0-禁用 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminUpdateQueryCleanupConfigReq { + Id int64 `json:"id"` // 主键ID + ConfigValue string `json:"config_value"` // 配置值 + Status int64 `json:"status"` // 状态:1-启用,0-禁用 +} + +type AdminUpdateQueryCleanupConfigResp { + Success bool `json:"success"` // 是否成功 +} \ No newline at end of file diff --git a/app/main/api/desc/admin/admin_user.api b/app/main/api/desc/admin/admin_user.api new file mode 100644 index 0000000..a83014d --- /dev/null +++ b/app/main/api/desc/admin/admin_user.api @@ -0,0 +1,131 @@ +syntax = "v1" + +info ( + title: "后台用户中心服务" + desc: "后台用户中心服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/user + group: admin_user + jwt: JwtAuth +) +service main { + @doc "获取用户列表" + @handler AdminGetUserList + get /list (AdminGetUserListReq) returns (AdminGetUserListResp) + + @doc "获取用户详情" + @handler AdminGetUserDetail + get /detail/:id (AdminGetUserDetailReq) returns (AdminGetUserDetailResp) + + @doc "创建用户" + @handler AdminCreateUser + post /create (AdminCreateUserReq) returns (AdminCreateUserResp) + + @doc "更新用户" + @handler AdminUpdateUser + put /update/:id (AdminUpdateUserReq) returns (AdminUpdateUserResp) + + @doc "删除用户" + @handler AdminDeleteUser + delete /delete/:id (AdminDeleteUserReq) returns (AdminDeleteUserResp) + + @doc "用户信息" + @handler AdminUserInfo + get /info (AdminUserInfoReq) returns (AdminUserInfoResp) +} + +type ( + // 列表请求 + AdminGetUserListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Username string `form:"username,optional"` // 用户名 + RealName string `form:"real_name,optional"` // 真实姓名 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + } + + // 列表响应 + AdminGetUserListResp { + Total int64 `json:"total"` // 总数 + Items []AdminUserListItem `json:"items"` // 列表 + } + + // 列表项 + AdminUserListItem { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 + } + + // 详情请求 + AdminGetUserDetailReq { + Id int64 `path:"id"` // 用户ID + } + + // 详情响应 + AdminGetUserDetailResp { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 + } + + // 创建请求 + AdminCreateUserReq { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 + } + + // 创建响应 + AdminCreateUserResp { + Id int64 `json:"id"` // 用户ID + } + + // 更新请求 + AdminUpdateUserReq { + Id int64 `path:"id"` // 用户ID + Username *string `json:"username,optional"` // 用户名 + RealName *string `json:"real_name,optional"` // 真实姓名 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids,optional"` // 关联的角色ID列表 + } + + // 更新响应 + AdminUpdateUserResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + AdminDeleteUserReq { + Id int64 `path:"id"` // 用户ID + } + + // 删除响应 + AdminDeleteUserResp { + Success bool `json:"success"` // 是否成功 + } + + // 用户信息请求 + AdminUserInfoReq { + } + + // 用户信息响应 + AdminUserInfoResp { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Roles []string `json:"roles"` // 角色编码列表 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/auth.api b/app/main/api/desc/admin/auth.api new file mode 100644 index 0000000..e8be573 --- /dev/null +++ b/app/main/api/desc/admin/auth.api @@ -0,0 +1,34 @@ +syntax = "v1" + +info ( + title: "认证中心服务" + desc: "认证中心服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/auth + group: admin_auth +) +service main { + @doc "登录" + @handler AdminLogin + post /login (AdminLoginReq) returns (AdminLoginResp) + +} + +type ( + AdminLoginReq { + Username string `json:"username" validate:"required"` + Password string `json:"password" validate:"required"` + Captcha bool `json:"captcha" validate:"required"` + } + AdminLoginResp { + AccessToken string `json:"access_token"` + AccessExpire int64 `json:"access_expire"` + RefreshAfter int64 `json:"refresh_after"` + Roles []string `json:"roles"` + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/menu.api b/app/main/api/desc/admin/menu.api new file mode 100644 index 0000000..52d87be --- /dev/null +++ b/app/main/api/desc/admin/menu.api @@ -0,0 +1,149 @@ +syntax = "v1" + +info ( + title: "菜单中心服务" + desc: "菜单中心服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/menu + group: admin_menu + jwt: JwtAuth +) +service main { + @doc "获取菜单列表" + @handler GetMenuList + get /list (GetMenuListReq) returns ([]MenuListItem) + + @doc "获取菜单详情" + @handler GetMenuDetail + get /detail/:id (GetMenuDetailReq) returns (GetMenuDetailResp) + + @doc "创建菜单" + @handler CreateMenu + post /create (CreateMenuReq) returns (CreateMenuResp) + + @doc "更新菜单" + @handler UpdateMenu + put /update/:id (UpdateMenuReq) returns (UpdateMenuResp) + + @doc "删除菜单" + @handler DeleteMenu + delete /delete/:id (DeleteMenuReq) returns (DeleteMenuResp) + + @doc "获取所有菜单(树形结构)" + @handler GetMenuAll + get /all (GetMenuAllReq) returns ([]GetMenuAllResp) +} + +type ( + // 列表请求 + GetMenuListReq { + Name string `form:"name,optional"` // 菜单名称 + Path string `form:"path,optional"` // 路由路径 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + Type string `form:"type,optional"` // 类型 + } + + // 列表项 + MenuListItem { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + Children []MenuListItem `json:"children"` // 子菜单 + } + + // 详情请求 + GetMenuDetailReq { + Id int64 `path:"id"` // 菜单ID + } + + // 详情响应 + GetMenuDetailResp { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + UpdateTime string `json:"updateTime"` // 更新时间 + } + + // 创建请求 + CreateMenuReq { + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional,default=1"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 + } + + // 创建响应 + CreateMenuResp { + Id int64 `json:"id"` // 菜单ID + } + + // 更新请求 + UpdateMenuReq { + Id int64 `path:"id"` // 菜单ID + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 + } + + // 更新响应 + UpdateMenuResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + DeleteMenuReq { + Id int64 `path:"id"` // 菜单ID + } + + // 删除响应 + DeleteMenuResp { + Success bool `json:"success"` // 是否成功 + } + + // 获取所有菜单请求 + GetMenuAllReq { + } + + // 获取所有菜单响应 + GetMenuAllResp { + Name string `json:"name"` + Path string `json:"path"` + Redirect string `json:"redirect,omitempty"` + Component string `json:"component,omitempty"` + Sort int64 `json:"sort"` + Meta map[string]interface{} `json:"meta"` + Children []GetMenuAllResp `json:"children"` + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/notification.api b/app/main/api/desc/admin/notification.api new file mode 100644 index 0000000..169f60d --- /dev/null +++ b/app/main/api/desc/admin/notification.api @@ -0,0 +1,127 @@ +syntax = "v1" + +type ( + // 创建通知请求 + AdminCreateNotificationReq { + Title string `json:"title"` // 通知标题 + NotificationPage string `json:"notification_page"` // 通知页面 + Content string `json:"content"` // 通知内容 + StartDate string `json:"start_date"` // 生效开始日期(yyyy-MM-dd) + StartTime string `json:"start_time"` // 生效开始时间(HH:mm:ss) + EndDate string `json:"end_date"` // 生效结束日期(yyyy-MM-dd) + EndTime string `json:"end_time"` // 生效结束时间(HH:mm:ss) + Status int64 `json:"status"` // 状态:1-启用,0-禁用 + } + + // 创建通知响应 + AdminCreateNotificationResp { + Id int64 `json:"id"` // 通知ID + } + + // 更新通知请求 + AdminUpdateNotificationReq { + Id int64 `path:"id"` // 通知ID + Title *string `json:"title,optional"` // 通知标题 + Content *string `json:"content,optional"` // 通知内容 + NotificationPage *string `json:"notification_page,optional"` // 通知页面 + StartDate *string `json:"start_date,optional"` // 生效开始日期 + StartTime *string `json:"start_time,optional"` // 生效开始时间 + EndDate *string `json:"end_date,optional"` // 生效结束日期 + EndTime *string `json:"end_time,optional"` // 生效结束时间 + Status *int64 `json:"status,optional"` // 状态 + } + + // 更新通知响应 + AdminUpdateNotificationResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除通知请求 + AdminDeleteNotificationReq { + Id int64 `path:"id"` // 通知ID + } + + // 删除通知响应 + AdminDeleteNotificationResp { + Success bool `json:"success"` // 是否成功 + } + + // 获取通知详情请求 + AdminGetNotificationDetailReq { + Id int64 `path:"id"` // 通知ID + } + + // 获取通知详情响应 + AdminGetNotificationDetailResp { + Id int64 `json:"id"` // 通知ID + Title string `json:"title"` // 通知标题 + Content string `json:"content"` // 通知内容 + NotificationPage string `json:"notification_page"` // 通知页面 + StartDate string `json:"start_date"` // 生效开始日期 + StartTime string `json:"start_time"` // 生效开始时间 + EndDate string `json:"end_date"` // 生效结束日期 + EndTime string `json:"end_time"` // 生效结束时间 + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 获取通知列表请求 + AdminGetNotificationListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + Title *string `form:"title,optional"` // 通知标题(可选) + NotificationPage *string `form:"notification_page,optional"` // 通知页面(可选) + Status *int64 `form:"status,optional"` // 状态(可选) + StartDate *string `form:"start_date,optional"` // 开始日期范围(可选) + EndDate *string `form:"end_date,optional"` // 结束日期范围(可选) + } + + // 通知列表项 + NotificationListItem { + Id int64 `json:"id"` // 通知ID + Title string `json:"title"` // 通知标题 + NotificationPage string `json:"notification_page"` // 通知页面 + Content string `json:"content"` // 通知内容 + StartDate string `json:"start_date"` // 生效开始日期 + StartTime string `json:"start_time"` // 生效开始时间 + EndDate string `json:"end_date"` // 生效结束日期 + EndTime string `json:"end_time"` // 生效结束时间 + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 获取通知列表响应 + AdminGetNotificationListResp { + Total int64 `json:"total"` // 总数 + Items []NotificationListItem `json:"items"` // 列表数据 + } +) + +// 通知管理接口 +@server( + prefix: /api/v1/admin/notification + group: admin_notification +) +service main { + // 创建通知 + @handler AdminCreateNotification + post /create (AdminCreateNotificationReq) returns (AdminCreateNotificationResp) + + // 更新通知 + @handler AdminUpdateNotification + put /update/:id (AdminUpdateNotificationReq) returns (AdminUpdateNotificationResp) + + // 删除通知 + @handler AdminDeleteNotification + delete /delete/:id (AdminDeleteNotificationReq) returns (AdminDeleteNotificationResp) + + // 获取通知详情 + @handler AdminGetNotificationDetail + get /detail/:id (AdminGetNotificationDetailReq) returns (AdminGetNotificationDetailResp) + + // 获取通知列表 + @handler AdminGetNotificationList + get /list (AdminGetNotificationListReq) returns (AdminGetNotificationListResp) +} \ No newline at end of file diff --git a/app/main/api/desc/admin/order.api b/app/main/api/desc/admin/order.api new file mode 100644 index 0000000..73a9f65 --- /dev/null +++ b/app/main/api/desc/admin/order.api @@ -0,0 +1,169 @@ +syntax = "v1" + +info ( + title: "订单服务" + desc: "订单服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/order + group: admin_order + jwt: JwtAuth +) +service main { + @doc "获取订单列表" + @handler AdminGetOrderList + get /list (AdminGetOrderListReq) returns (AdminGetOrderListResp) + + @doc "获取订单详情" + @handler AdminGetOrderDetail + get /detail/:id (AdminGetOrderDetailReq) returns (AdminGetOrderDetailResp) + + @doc "创建订单" + @handler AdminCreateOrder + post /create (AdminCreateOrderReq) returns (AdminCreateOrderResp) + + @doc "更新订单" + @handler AdminUpdateOrder + put /update/:id (AdminUpdateOrderReq) returns (AdminUpdateOrderResp) + + @doc "删除订单" + @handler AdminDeleteOrder + delete /delete/:id (AdminDeleteOrderReq) returns (AdminDeleteOrderResp) + + @doc "订单退款" + @handler AdminRefundOrder + post /refund/:id (AdminRefundOrderReq) returns (AdminRefundOrderResp) +} + +type ( + // 列表请求 + AdminGetOrderListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + OrderNo string `form:"order_no,optional"` // 商户订单号 + PlatformOrderId string `form:"platform_order_id,optional"` // 支付订单号 + ProductName string `form:"product_name,optional"` // 产品名称 + PaymentPlatform string `form:"payment_platform,optional"` // 支付方式 + PaymentScene string `form:"payment_scene,optional"` // 支付平台 + Amount float64 `form:"amount,optional"` // 金额 + Status string `form:"status,optional"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + IsPromotion int64 `form:"is_promotion,optional,default=-1"` // 是否推广订单:0-否,1-是 + CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始 + CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束 + PayTimeStart string `form:"pay_time_start,optional"` // 支付时间开始 + PayTimeEnd string `form:"pay_time_end,optional"` // 支付时间结束 + RefundTimeStart string `form:"refund_time_start,optional"` // 退款时间开始 + RefundTimeEnd string `form:"refund_time_end,optional"` // 退款时间结束 + } + + // 列表响应 + AdminGetOrderListResp { + Total int64 `json:"total"` // 总数 + Items []OrderListItem `json:"items"` // 列表 + } + + // 列表项 + OrderListItem { + Id int64 `json:"id"` // 订单ID + OrderNo string `json:"order_no"` // 商户订单号 + PlatformOrderId string `json:"platform_order_id"` // 支付订单号 + ProductName string `json:"product_name"` // 产品名称 + PaymentPlatform string `json:"payment_platform"` // 支付方式 + PaymentScene string `json:"payment_scene"` // 支付平台 + Amount float64 `json:"amount"` // 金额 + Status string `json:"status"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + QueryState string `json:"query_state"` // 查询状态:pending-待查询,success-查询成功,failed-查询失败 processing-查询中 + CreateTime string `json:"create_time"` // 创建时间 + PayTime string `json:"pay_time"` // 支付时间 + RefundTime string `json:"refund_time"` // 退款时间 + IsPromotion int64 `json:"is_promotion"` // 是否推广订单:0-否,1-是 + } + + // 详情请求 + AdminGetOrderDetailReq { + Id int64 `path:"id"` // 订单ID + } + + // 详情响应 + AdminGetOrderDetailResp { + Id int64 `json:"id"` // 订单ID + OrderNo string `json:"order_no"` // 商户订单号 + PlatformOrderId string `json:"platform_order_id"` // 支付订单号 + ProductName string `json:"product_name"` // 产品名称 + PaymentPlatform string `json:"payment_platform"` // 支付方式 + PaymentScene string `json:"payment_scene"` // 支付平台 + Amount float64 `json:"amount"` // 金额 + Status string `json:"status"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + QueryState string `json:"query_state"` // 查询状态:pending-待查询,success-查询成功,failed-查询失败 processing-查询中 + CreateTime string `json:"create_time"` // 创建时间 + PayTime string `json:"pay_time"` // 支付时间 + RefundTime string `json:"refund_time"` // 退款时间 + IsPromotion int64 `json:"is_promotion"` // 是否推广订单:0-否,1-是 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 创建请求 + AdminCreateOrderReq { + OrderNo string `json:"order_no"` // 商户订单号 + PlatformOrderId string `json:"platform_order_id"` // 支付订单号 + ProductName string `json:"product_name"` // 产品名称 + PaymentPlatform string `json:"payment_platform"` // 支付方式 + PaymentScene string `json:"payment_scene"` // 支付平台 + Amount float64 `json:"amount"` // 金额 + Status string `json:"status,default=pending"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + IsPromotion int64 `json:"is_promotion,default=0"` // 是否推广订单:0-否,1-是 + } + + // 创建响应 + AdminCreateOrderResp { + Id int64 `json:"id"` // 订单ID + } + + // 更新请求 + AdminUpdateOrderReq { + Id int64 `path:"id"` // 订单ID + OrderNo *string `json:"order_no,optional"` // 商户订单号 + PlatformOrderId *string `json:"platform_order_id,optional"` // 支付订单号 + ProductName *string `json:"product_name,optional"` // 产品名称 + PaymentPlatform *string `json:"payment_platform,optional"` // 支付方式 + PaymentScene *string `json:"payment_scene,optional"` // 支付平台 + Amount *float64 `json:"amount,optional"` // 金额 + Status *string `json:"status,optional"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + PayTime *string `json:"pay_time,optional"` // 支付时间 + RefundTime *string `json:"refund_time,optional"` // 退款时间 + IsPromotion *int64 `json:"is_promotion,optional"` // 是否推广订单:0-否,1-是 + } + + // 更新响应 + AdminUpdateOrderResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + AdminDeleteOrderReq { + Id int64 `path:"id"` // 订单ID + } + + // 删除响应 + AdminDeleteOrderResp { + Success bool `json:"success"` // 是否成功 + } + + // 退款请求 + AdminRefundOrderReq { + Id int64 `path:"id"` // 订单ID + RefundAmount float64 `json:"refund_amount"` // 退款金额 + RefundReason string `json:"refund_reason"` // 退款原因 + } + + // 退款响应 + AdminRefundOrderResp { + Status string `json:"status"` // 退款状态 + RefundNo string `json:"refund_no"` // 退款单号 + Amount float64 `json:"amount"` // 退款金额 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/platform_user.api b/app/main/api/desc/admin/platform_user.api new file mode 100644 index 0000000..d63abfc --- /dev/null +++ b/app/main/api/desc/admin/platform_user.api @@ -0,0 +1,124 @@ +syntax = "v1" + +info ( + title: "平台用户管理" + desc: "平台用户管理" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +// 平台用户管理接口 +@server( + prefix: /api/v1/admin/platform_user + group: admin_platform_user + jwt: JwtAuth +) +service main { + // 创建平台用户 + @handler AdminCreatePlatformUser + post /create (AdminCreatePlatformUserReq) returns (AdminCreatePlatformUserResp) + + // 更新平台用户 + @handler AdminUpdatePlatformUser + put /update/:id (AdminUpdatePlatformUserReq) returns (AdminUpdatePlatformUserResp) + + // 删除平台用户 + @handler AdminDeletePlatformUser + delete /delete/:id (AdminDeletePlatformUserReq) returns (AdminDeletePlatformUserResp) + + // 获取平台用户分页列表 + @handler AdminGetPlatformUserList + get /list (AdminGetPlatformUserListReq) returns (AdminGetPlatformUserListResp) + + // 获取平台用户详情 + @handler AdminGetPlatformUserDetail + get /detail/:id (AdminGetPlatformUserDetailReq) returns (AdminGetPlatformUserDetailResp) +} + +type ( + // 分页列表请求 + AdminGetPlatformUserListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Mobile string `form:"mobile,optional"` // 手机号 + Nickname string `form:"nickname,optional"` // 昵称 + Inside int64 `form:"inside,optional"` // 是否内部用户 1-是 0-否 + CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始 + CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束 + OrderBy string `form:"order_by,optional"` // 排序字段 + OrderType string `form:"order_type,optional"` // 排序类型 + } + + // 分页列表响应 + AdminGetPlatformUserListResp { + Total int64 `json:"total"` // 总数 + Items []PlatformUserListItem `json:"items"` // 列表 + } + + // 列表项 + PlatformUserListItem { + Id int64 `json:"id"` // 用户ID + Mobile string `json:"mobile"` // 手机号 + Nickname string `json:"nickname"` // 昵称 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 详情请求 + AdminGetPlatformUserDetailReq { + Id int64 `path:"id"` // 用户ID + } + + // 详情响应 + AdminGetPlatformUserDetailResp { + Id int64 `json:"id"` // 用户ID + Mobile string `json:"mobile"` // 手机号 + Nickname string `json:"nickname"` // 昵称 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } + + // 创建请求 + AdminCreatePlatformUserReq { + Mobile string `json:"mobile"` // 手机号 + Password string `json:"password"` // 密码 + Nickname string `json:"nickname"` // 昵称 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 + } + + // 创建响应 + AdminCreatePlatformUserResp { + Id int64 `json:"id"` // 用户ID + } + + // 更新请求 + AdminUpdatePlatformUserReq { + Id int64 `path:"id"` // 用户ID + Mobile *string `json:"mobile,optional"` // 手机号 + Password *string `json:"password,optional"` // 密码 + Nickname *string `json:"nickname,optional"` // 昵称 + Info *string `json:"info,optional"` // 备注信息 + Inside *int64 `json:"inside,optional"` // 是否内部用户 1-是 0-否 + } + + // 更新响应 + AdminUpdatePlatformUserResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + AdminDeletePlatformUserReq { + Id int64 `path:"id"` // 用户ID + } + + // 删除响应 + AdminDeletePlatformUserResp { + Success bool `json:"success"` // 是否成功 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/promotion.api b/app/main/api/desc/admin/promotion.api new file mode 100644 index 0000000..b821b9b --- /dev/null +++ b/app/main/api/desc/admin/promotion.api @@ -0,0 +1,183 @@ +syntax = "v1" + +info ( + title: "推广服务" + desc: "推广服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/promotion/link + group: admin_promotion + jwt: JwtAuth +) +service main { + @doc "获取推广链接列表" + @handler GetPromotionLinkList + get /list (GetPromotionLinkListReq) returns (GetPromotionLinkListResp) + + @doc "获取推广链接详情" + @handler GetPromotionLinkDetail + get /detail/:id (GetPromotionLinkDetailReq) returns (GetPromotionLinkDetailResp) + + @doc "创建推广链接" + @handler CreatePromotionLink + post /create (CreatePromotionLinkReq) returns (CreatePromotionLinkResp) + + @doc "更新推广链接" + @handler UpdatePromotionLink + put /update/:id (UpdatePromotionLinkReq) returns (UpdatePromotionLinkResp) + + @doc "删除推广链接" + @handler DeletePromotionLink + delete /delete/:id (DeletePromotionLinkReq) returns (DeletePromotionLinkResp) +} + +type ( + // 列表请求 + GetPromotionLinkListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 链接名称 + Url string `form:"url,optional"` // 推广链接URL + } + + // 列表响应 + GetPromotionLinkListResp { + Total int64 `json:"total"` // 总数 + Items []PromotionLinkItem `json:"items"` // 列表 + } + + // 列表项 + PromotionLinkItem { + Id int64 `json:"id"` // 链接ID + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 + } + + // 详情请求 + GetPromotionLinkDetailReq { + Id int64 `path:"id"` // 链接ID + } + + // 详情响应 + GetPromotionLinkDetailResp { + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 + } + + // 创建请求 + CreatePromotionLinkReq { + Name string `json:"name"` // 链接名称 + } + + // 创建响应 + CreatePromotionLinkResp { + Id int64 `json:"id"` // 链接ID + Url string `json:"url"` // 生成的推广链接URL + } + + // 更新请求 + UpdatePromotionLinkReq { + Id int64 `path:"id"` // 链接ID + Name *string `json:"name,optional"` // 链接名称 + } + + // 更新响应 + UpdatePromotionLinkResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + DeletePromotionLinkReq { + Id int64 `path:"id"` // 链接ID + } + + // 删除响应 + DeletePromotionLinkResp { + Success bool `json:"success"` // 是否成功 + } +) + +@server ( + prefix: api/v1/admin/promotion/link + group: admin_promotion +) +service main { + @doc "记录链接点击" + @handler RecordLinkClick + get /record/:path (RecordLinkClickReq) returns (RecordLinkClickResp) +} + +type ( + // 记录链接点击请求 + RecordLinkClickReq { + Path string `path:"path"` // 链接路径 + } + + // 记录链接点击响应 + RecordLinkClickResp { + Success bool `json:"success"` // 是否成功 + } +) +@server ( + prefix: api/v1/admin/promotion/stats + group: admin_promotion + jwt: JwtAuth +) +service main { + @doc "获取推广历史记录" + @handler GetPromotionStatsHistory + get /history (GetPromotionStatsHistoryReq) returns ([]PromotionStatsHistoryItem) + + @doc "获取推广总统计" + @handler GetPromotionStatsTotal + get /total (GetPromotionStatsTotalReq) returns (GetPromotionStatsTotalResp) +} + +type ( + // 获取推广历史记录请求 + GetPromotionStatsHistoryReq { + StartDate string `form:"start_date"` // 开始日期,格式:YYYY-MM-DD + EndDate string `form:"end_date"` // 结束日期,格式:YYYY-MM-DD + } + + // 推广历史记录项 + PromotionStatsHistoryItem { + Id int64 `json:"id"` // 记录ID + LinkId int64 `json:"link_id"` // 链接ID + PayAmount float64 `json:"pay_amount"` // 金额 + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + StatsDate string `json:"stats_date"` // 统计日期 + } + + // 获取推广总统计请求 + GetPromotionStatsTotalReq { + } + + // 获取推广总统计响应 + GetPromotionStatsTotalResp { + TodayPayAmount float64 `json:"today_pay_amount"` // 今日金额 + TodayClickCount int64 `json:"today_click_count"` // 今日点击数 + TodayPayCount int64 `json:"today_pay_count"` // 今日付费次数 + TotalPayAmount float64 `json:"total_pay_amount"` // 总金额 + TotalClickCount int64 `json:"total_click_count"` // 总点击数 + TotalPayCount int64 `json:"total_pay_count"` // 总付费次数 + } +) \ No newline at end of file diff --git a/app/main/api/desc/admin/role.api b/app/main/api/desc/admin/role.api new file mode 100644 index 0000000..51a3de9 --- /dev/null +++ b/app/main/api/desc/admin/role.api @@ -0,0 +1,124 @@ +syntax = "v1" + +info ( + title: "角色服务" + desc: "角色服务" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +@server ( + prefix: api/v1/admin/role + group: admin_role + jwt: JwtAuth +) +service main { + @doc "获取角色列表" + @handler GetRoleList + get /list (GetRoleListReq) returns (GetRoleListResp) + + @doc "获取角色详情" + @handler GetRoleDetail + get /detail/:id (GetRoleDetailReq) returns (GetRoleDetailResp) + + @doc "创建角色" + @handler CreateRole + post /create (CreateRoleReq) returns (CreateRoleResp) + + @doc "更新角色" + @handler UpdateRole + put /update/:id (UpdateRoleReq) returns (UpdateRoleResp) + + @doc "删除角色" + @handler DeleteRole + delete /delete/:id (DeleteRoleReq) returns (DeleteRoleResp) +} + +type ( + // 列表请求 + GetRoleListReq { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 角色名称 + Code string `form:"code,optional"` // 角色编码 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + } + + // 列表响应 + GetRoleListResp { + Total int64 `json:"total"` // 总数 + Items []RoleListItem `json:"items"` // 列表 + } + + // 列表项 + RoleListItem { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 + } + + // 详情请求 + GetRoleDetailReq { + Id int64 `path:"id"` // 角色ID + } + + // 详情响应 + GetRoleDetailResp { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 + } + + // 创建请求 + CreateRoleReq { + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort,default=0"` // 排序 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 + } + + // 创建响应 + CreateRoleResp { + Id int64 `json:"id"` // 角色ID + } + + // 更新请求 + UpdateRoleReq { + Id int64 `path:"id"` // 角色ID + RoleName *string `json:"role_name,optional"` // 角色名称 + RoleCode *string `json:"role_code,optional"` // 角色编码 + Description *string `json:"description,optional"` // 角色描述 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Sort *int64 `json:"sort,optional"` // 排序 + MenuIds []int64 `json:"menu_ids,optional"` // 关联的菜单ID列表 + } + + // 更新响应 + UpdateRoleResp { + Success bool `json:"success"` // 是否成功 + } + + // 删除请求 + DeleteRoleReq { + Id int64 `path:"id"` // 角色ID + } + + // 删除响应 + DeleteRoleResp { + Success bool `json:"success"` // 是否成功 + } +) \ No newline at end of file diff --git a/app/main/api/desc/agent.api b/app/main/api/desc/front/agent.api similarity index 100% rename from app/main/api/desc/agent.api rename to app/main/api/desc/front/agent.api diff --git a/app/main/api/desc/app.api b/app/main/api/desc/front/app.api similarity index 100% rename from app/main/api/desc/app.api rename to app/main/api/desc/front/app.api diff --git a/app/main/api/desc/pay.api b/app/main/api/desc/front/pay.api similarity index 100% rename from app/main/api/desc/pay.api rename to app/main/api/desc/front/pay.api diff --git a/app/main/api/desc/product.api b/app/main/api/desc/front/product.api similarity index 100% rename from app/main/api/desc/product.api rename to app/main/api/desc/front/product.api diff --git a/app/main/api/desc/query.api b/app/main/api/desc/front/query.api similarity index 100% rename from app/main/api/desc/query.api rename to app/main/api/desc/front/query.api diff --git a/app/main/api/desc/user.api b/app/main/api/desc/front/user.api similarity index 100% rename from app/main/api/desc/user.api rename to app/main/api/desc/front/user.api diff --git a/app/main/api/desc/main.api b/app/main/api/desc/main.api index 70efd80..3928235 100644 --- a/app/main/api/desc/main.api +++ b/app/main/api/desc/main.api @@ -8,9 +8,23 @@ info ( version: "v1" ) -import "user.api" -import "query.api" -import "pay.api" -import "product.api" -import "agent.api" -import "app.api" +// 前台 +import "./front/user.api" +import "./front/query.api" +import "./front/pay.api" +import "./front/product.api" +import "./front/agent.api" +import "./front/app.api" +// 后台 +import "./admin/auth.api" +import "./admin/menu.api" +import "./admin/role.api" +import "./admin/promotion.api" +import "./admin/order.api" +import "./admin/admin_user.api" +import "./admin/platform_user.api" +import "./admin/notification.api" +import "./admin/admin_product.api" +import "./admin/admin_feature.api" +import "./admin/admin_query.api" +import "./admin/admin_agent.api" diff --git a/app/main/api/etc/main.dev.yaml b/app/main/api/etc/main.dev.yaml index efb6e3f..449fd8e 100644 --- a/app/main/api/etc/main.dev.yaml +++ b/app/main/api/etc/main.dev.yaml @@ -66,3 +66,9 @@ WechatH5: AppSecret: "ba37510206df321279222cecb8614e00" Query: ShareLinkExpire: 604800 # 7天 = 7 * 24 * 60 * 60 = 604800秒 +AdminConfig: + AccessSecret: "jK8nP3qR7tV2xZ5aB9cD1eF6gH4iJ0kL8mN5oP6qR7sT" + AccessExpire: 604800 + RefreshAfter: 302400 +AdminPromotion: + URLDomain: "https://tianyuandb.com/p" diff --git a/app/main/api/etc/main.yaml b/app/main/api/etc/main.yaml index 7d64c35..cc814b6 100644 --- a/app/main/api/etc/main.yaml +++ b/app/main/api/etc/main.yaml @@ -64,6 +64,12 @@ SystemConfig: ThreeVerify: true WechatH5: AppID: "wxa581992dc74d860e" - AppSecret: "ba37510206df321279222cecb8614e00" + AppSecret: "4de1fbf521712247542d49907fcd5dbf" Query: ShareLinkExpire: 604800 # 7天 = 7 * 24 * 60 * 60 = 604800秒 +AdminConfig: + AccessSecret: "jK8nP3qR7tV2xZ5aB9cD1eF6gH4iJ0kL8mN5oP6qR7sT" + AccessExpire: 604800 + RefreshAfter: 302400 +AdminPromotion: + URLDomain: "https://tianyuandb.com/p" diff --git a/app/main/api/internal/config/config.go b/app/main/api/internal/config/config.go index 2c09786..ec131a6 100644 --- a/app/main/api/internal/config/config.go +++ b/app/main/api/internal/config/config.go @@ -7,20 +7,22 @@ import ( type Config struct { rest.RestConf - DataSource string - CacheRedis cache.CacheConf - JwtAuth JwtAuth // JWT 鉴权相关配置 - VerifyCode VerifyCode - Encrypt Encrypt - Alipay AlipayConfig - Wxpay WxpayConfig - Applepay ApplepayConfig - Ali AliConfig - WestConfig WestConfig - YushanConfig YushanConfig - SystemConfig SystemConfig - WechatH5 WechatH5Config - Query QueryConfig + DataSource string + CacheRedis cache.CacheConf + JwtAuth JwtAuth // JWT 鉴权相关配置 + VerifyCode VerifyCode + Encrypt Encrypt + Alipay AlipayConfig + Wxpay WxpayConfig + Applepay ApplepayConfig + Ali AliConfig + WestConfig WestConfig + YushanConfig YushanConfig + SystemConfig SystemConfig + WechatH5 WechatH5Config + Query QueryConfig + AdminConfig AdminConfig + AdminPromotion AdminPromotion } // JwtAuth 用于 JWT 鉴权配置 @@ -96,3 +98,12 @@ type WechatH5Config struct { type QueryConfig struct { ShareLinkExpire int64 } +type AdminConfig struct { + AccessSecret string + AccessExpire int64 + RefreshAfter int64 +} + +type AdminPromotion struct { + URLDomain string +} diff --git a/app/main/api/internal/handler/admin_agent/admingetagentcommissiondeductionlisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentcommissiondeductionlisthandler.go new file mode 100644 index 0000000..ac8eab6 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentcommissiondeductionlisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentCommissionDeductionListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentCommissionDeductionListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentCommissionDeductionListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentCommissionDeductionList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_agent/admingetagentcommissionlisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentcommissionlisthandler.go new file mode 100644 index 0000000..d6f4036 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentcommissionlisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentCommissionListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentCommissionListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentCommissionListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentCommissionList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/query/queryprovisionalorderhandler.go b/app/main/api/internal/handler/admin_agent/admingetagentlinklisthandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/query/queryprovisionalorderhandler.go rename to app/main/api/internal/handler/admin_agent/admingetagentlinklisthandler.go index 3685f81..3afae36 100644 --- a/app/user/cmd/api/internal/handler/query/queryprovisionalorderhandler.go +++ b/app/main/api/internal/handler/admin_agent/admingetagentlinklisthandler.go @@ -1,20 +1,19 @@ -package query +package admin_agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QueryProvisionalOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetAgentLinkListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryProvisionalOrderReq + var req types.AdminGetAgentLinkListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QueryProvisionalOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryProvisionalOrderLogic(r.Context(), svcCtx) - resp, err := l.QueryProvisionalOrder(&req) + l := admin_agent.NewAdminGetAgentLinkListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentLinkList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/query/queryserviceagenthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentlisthandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/query/queryserviceagenthandler.go rename to app/main/api/internal/handler/admin_agent/admingetagentlisthandler.go index 5a105dd..a823c0c 100644 --- a/app/user/cmd/api/internal/handler/query/queryserviceagenthandler.go +++ b/app/main/api/internal/handler/admin_agent/admingetagentlisthandler.go @@ -1,20 +1,19 @@ -package query +package admin_agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QueryServiceAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetAgentListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryServiceReq + var req types.AdminGetAgentListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QueryServiceAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryServiceLogic(r.Context(), svcCtx) - resp, err := l.QueryService(&req) + l := admin_agent.NewAdminGetAgentListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_agent/admingetagentmembershipconfiglisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentmembershipconfiglisthandler.go new file mode 100644 index 0000000..ebac11d --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentmembershipconfiglisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentMembershipConfigListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentMembershipConfigListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentMembershipConfigListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentMembershipConfigList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_agent/admingetagentmembershiprechargeorderlisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentmembershiprechargeorderlisthandler.go new file mode 100644 index 0000000..d3b1253 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentmembershiprechargeorderlisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentMembershipRechargeOrderListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentMembershipRechargeOrderListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentMembershipRechargeOrderListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentMembershipRechargeOrderList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_agent/admingetagentplatformdeductionlisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentplatformdeductionlisthandler.go new file mode 100644 index 0000000..5d60a78 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentplatformdeductionlisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentPlatformDeductionListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentPlatformDeductionListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentPlatformDeductionListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentPlatformDeductionList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_agent/admingetagentproductionconfiglisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentproductionconfiglisthandler.go new file mode 100644 index 0000000..d7e0a18 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentproductionconfiglisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentProductionConfigListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentProductionConfigListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentProductionConfigListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentProductionConfigList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentsubordinatelisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentrewardlisthandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/agent/getagentsubordinatelisthandler.go rename to app/main/api/internal/handler/admin_agent/admingetagentrewardlisthandler.go index 1a632e9..d723683 100644 --- a/app/user/cmd/api/internal/handler/agent/getagentsubordinatelisthandler.go +++ b/app/main/api/internal/handler/admin_agent/admingetagentrewardlisthandler.go @@ -1,20 +1,19 @@ -package agent +package admin_agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetAgentSubordinateListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetAgentRewardListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetAgentSubordinateListReq + var req types.AdminGetAgentRewardListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetAgentSubordinateListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetAgentSubordinateListLogic(r.Context(), svcCtx) - resp, err := l.GetAgentSubordinateList(&req) + l := admin_agent.NewAdminGetAgentRewardListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentRewardList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_agent/admingetagentwithdrawallisthandler.go b/app/main/api/internal/handler/admin_agent/admingetagentwithdrawallisthandler.go new file mode 100644 index 0000000..5a69547 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/admingetagentwithdrawallisthandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetAgentWithdrawalListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetAgentWithdrawalListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminGetAgentWithdrawalListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetAgentWithdrawalList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_agent/adminupdateagentmembershipconfighandler.go b/app/main/api/internal/handler/admin_agent/adminupdateagentmembershipconfighandler.go new file mode 100644 index 0000000..0368f23 --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/adminupdateagentmembershipconfighandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateAgentMembershipConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateAgentMembershipConfigReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminUpdateAgentMembershipConfigLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateAgentMembershipConfig(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_agent/adminupdateagentproductionconfighandler.go b/app/main/api/internal/handler/admin_agent/adminupdateagentproductionconfighandler.go new file mode 100644 index 0000000..d41677c --- /dev/null +++ b/app/main/api/internal/handler/admin_agent/adminupdateagentproductionconfighandler.go @@ -0,0 +1,29 @@ +package admin_agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateAgentProductionConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateAgentProductionConfigReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_agent.NewAdminUpdateAgentProductionConfigLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateAgentProductionConfig(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/query/queryretryhandler.go b/app/main/api/internal/handler/admin_auth/adminloginhandler.go similarity index 56% rename from app/user/cmd/api/internal/handler/query/queryretryhandler.go rename to app/main/api/internal/handler/admin_auth/adminloginhandler.go index f4b5272..1473622 100644 --- a/app/user/cmd/api/internal/handler/query/queryretryhandler.go +++ b/app/main/api/internal/handler/admin_auth/adminloginhandler.go @@ -1,20 +1,19 @@ -package query +package admin_auth import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_auth" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QueryRetryHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryRetryReq + var req types.AdminLoginReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QueryRetryHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryRetryLogic(r.Context(), svcCtx) - resp, err := l.QueryRetry(&req) + l := admin_auth.NewAdminLoginLogic(r.Context(), svcCtx) + resp, err := l.AdminLogin(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/getagentwithdrawalhandler.go b/app/main/api/internal/handler/admin_feature/admincreatefeaturehandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/agent/getagentwithdrawalhandler.go rename to app/main/api/internal/handler/admin_feature/admincreatefeaturehandler.go index 057052c..b97e922 100644 --- a/app/user/cmd/api/internal/handler/agent/getagentwithdrawalhandler.go +++ b/app/main/api/internal/handler/admin_feature/admincreatefeaturehandler.go @@ -1,20 +1,19 @@ -package agent +package admin_feature import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_feature" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetAgentWithdrawalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminCreateFeatureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetWithdrawalReq + var req types.AdminCreateFeatureReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetAgentWithdrawalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetAgentWithdrawalLogic(r.Context(), svcCtx) - resp, err := l.GetAgentWithdrawal(&req) + l := admin_feature.NewAdminCreateFeatureLogic(r.Context(), svcCtx) + resp, err := l.AdminCreateFeature(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_feature/admindeletefeaturehandler.go b/app/main/api/internal/handler/admin_feature/admindeletefeaturehandler.go new file mode 100644 index 0000000..10c185e --- /dev/null +++ b/app/main/api/internal/handler/admin_feature/admindeletefeaturehandler.go @@ -0,0 +1,29 @@ +package admin_feature + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_feature" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminDeleteFeatureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminDeleteFeatureReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_feature.NewAdminDeleteFeatureLogic(r.Context(), svcCtx) + resp, err := l.AdminDeleteFeature(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_feature/admingetfeaturedetailhandler.go b/app/main/api/internal/handler/admin_feature/admingetfeaturedetailhandler.go new file mode 100644 index 0000000..cb8f5b6 --- /dev/null +++ b/app/main/api/internal/handler/admin_feature/admingetfeaturedetailhandler.go @@ -0,0 +1,29 @@ +package admin_feature + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_feature" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetFeatureDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetFeatureDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_feature.NewAdminGetFeatureDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetFeatureDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_feature/admingetfeaturelisthandler.go b/app/main/api/internal/handler/admin_feature/admingetfeaturelisthandler.go new file mode 100644 index 0000000..6ae8517 --- /dev/null +++ b/app/main/api/internal/handler/admin_feature/admingetfeaturelisthandler.go @@ -0,0 +1,29 @@ +package admin_feature + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_feature" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetFeatureListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetFeatureListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_feature.NewAdminGetFeatureListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetFeatureList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_feature/adminupdatefeaturehandler.go b/app/main/api/internal/handler/admin_feature/adminupdatefeaturehandler.go new file mode 100644 index 0000000..4993e05 --- /dev/null +++ b/app/main/api/internal/handler/admin_feature/adminupdatefeaturehandler.go @@ -0,0 +1,29 @@ +package admin_feature + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_feature" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateFeatureHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateFeatureReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_feature.NewAdminUpdateFeatureLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateFeature(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/user/bindmobilehandler.go b/app/main/api/internal/handler/admin_menu/createmenuhandler.go similarity index 56% rename from app/user/cmd/api/internal/handler/user/bindmobilehandler.go rename to app/main/api/internal/handler/admin_menu/createmenuhandler.go index d1380ef..5fc375e 100644 --- a/app/user/cmd/api/internal/handler/user/bindmobilehandler.go +++ b/app/main/api/internal/handler/admin_menu/createmenuhandler.go @@ -1,20 +1,19 @@ -package user +package admin_menu import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_menu" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func BindMobileHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func CreateMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.BindMobileReq + var req types.CreateMenuReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func BindMobileHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := user.NewBindMobileLogic(r.Context(), svcCtx) - resp, err := l.BindMobile(&req) + l := admin_menu.NewCreateMenuLogic(r.Context(), svcCtx) + resp, err := l.CreateMenu(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/user/wxminiauthhandler.go b/app/main/api/internal/handler/admin_menu/deletemenuhandler.go similarity index 56% rename from app/user/cmd/api/internal/handler/user/wxminiauthhandler.go rename to app/main/api/internal/handler/admin_menu/deletemenuhandler.go index 32f14c6..2b80cdf 100644 --- a/app/user/cmd/api/internal/handler/user/wxminiauthhandler.go +++ b/app/main/api/internal/handler/admin_menu/deletemenuhandler.go @@ -1,20 +1,19 @@ -package user +package admin_menu import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_menu" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func WxMiniAuthHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func DeleteMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.WXMiniAuthReq + var req types.DeleteMenuReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func WxMiniAuthHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := user.NewWxMiniAuthLogic(r.Context(), svcCtx) - resp, err := l.WxMiniAuth(&req) + l := admin_menu.NewDeleteMenuLogic(r.Context(), svcCtx) + resp, err := l.DeleteMenu(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/query/querylisthandler.go b/app/main/api/internal/handler/admin_menu/getmenuallhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/query/querylisthandler.go rename to app/main/api/internal/handler/admin_menu/getmenuallhandler.go index 970ef29..0e99af4 100644 --- a/app/user/cmd/api/internal/handler/query/querylisthandler.go +++ b/app/main/api/internal/handler/admin_menu/getmenuallhandler.go @@ -1,20 +1,19 @@ -package query +package admin_menu import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_menu" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QueryListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetMenuAllHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryListReq + var req types.GetMenuAllReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QueryListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryListLogic(r.Context(), svcCtx) - resp, err := l.QueryList(&req) + l := admin_menu.NewGetMenuAllLogic(r.Context(), svcCtx) + resp, err := l.GetMenuAll(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/agentrealnamehandler.go b/app/main/api/internal/handler/admin_menu/getmenudetailhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/agent/agentrealnamehandler.go rename to app/main/api/internal/handler/admin_menu/getmenudetailhandler.go index 83ddb4d..18dd56a 100644 --- a/app/user/cmd/api/internal/handler/agent/agentrealnamehandler.go +++ b/app/main/api/internal/handler/admin_menu/getmenudetailhandler.go @@ -1,19 +1,19 @@ -package agent +package admin_menu import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/admin_menu" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func AgentRealNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetMenuDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.AgentRealNameReq + var req types.GetMenuDetailReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func AgentRealNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewAgentRealNameLogic(r.Context(), svcCtx) - resp, err := l.AgentRealName(&req) + l := admin_menu.NewGetMenuDetailLogic(r.Context(), svcCtx) + resp, err := l.GetMenuDetail(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/getlinkdatahandler.go b/app/main/api/internal/handler/admin_menu/getmenulisthandler.go similarity index 56% rename from app/user/cmd/api/internal/handler/agent/getlinkdatahandler.go rename to app/main/api/internal/handler/admin_menu/getmenulisthandler.go index 02f0406..1b341fe 100644 --- a/app/user/cmd/api/internal/handler/agent/getlinkdatahandler.go +++ b/app/main/api/internal/handler/admin_menu/getmenulisthandler.go @@ -1,20 +1,19 @@ -package agent +package admin_menu import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_menu" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetLinkDataHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetMenuListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetLinkDataReq + var req types.GetMenuListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetLinkDataHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetLinkDataLogic(r.Context(), svcCtx) - resp, err := l.GetLinkData(&req) + l := admin_menu.NewGetMenuListLogic(r.Context(), svcCtx) + resp, err := l.GetMenuList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_menu/updatemenuhandler.go b/app/main/api/internal/handler/admin_menu/updatemenuhandler.go new file mode 100644 index 0000000..eba818e --- /dev/null +++ b/app/main/api/internal/handler/admin_menu/updatemenuhandler.go @@ -0,0 +1,29 @@ +package admin_menu + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_menu" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func UpdateMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.UpdateMenuReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_menu.NewUpdateMenuLogic(r.Context(), svcCtx) + resp, err := l.UpdateMenu(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/activateagentmembershiphandler.go b/app/main/api/internal/handler/admin_notification/admincreatenotificationhandler.go similarity index 52% rename from app/user/cmd/api/internal/handler/agent/activateagentmembershiphandler.go rename to app/main/api/internal/handler/admin_notification/admincreatenotificationhandler.go index 72c3e85..2c6dfd1 100644 --- a/app/user/cmd/api/internal/handler/agent/activateagentmembershiphandler.go +++ b/app/main/api/internal/handler/admin_notification/admincreatenotificationhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_notification import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_notification" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func ActivateAgentMembershipHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminCreateNotificationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.AgentActivateMembershipReq + var req types.AdminCreateNotificationReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func ActivateAgentMembershipHandler(svcCtx *svc.ServiceContext) http.HandlerFunc result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewActivateAgentMembershipLogic(r.Context(), svcCtx) - resp, err := l.ActivateAgentMembership(&req) + l := admin_notification.NewAdminCreateNotificationLogic(r.Context(), svcCtx) + resp, err := l.AdminCreateNotification(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go b/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go new file mode 100644 index 0000000..fa7f84a --- /dev/null +++ b/app/main/api/internal/handler/admin_notification/admindeletenotificationhandler.go @@ -0,0 +1,29 @@ +package admin_notification + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_notification" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminDeleteNotificationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminDeleteNotificationReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_notification.NewAdminDeleteNotificationLogic(r.Context(), svcCtx) + resp, err := l.AdminDeleteNotification(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_notification/admingetnotificationdetailhandler.go b/app/main/api/internal/handler/admin_notification/admingetnotificationdetailhandler.go new file mode 100644 index 0000000..8554892 --- /dev/null +++ b/app/main/api/internal/handler/admin_notification/admingetnotificationdetailhandler.go @@ -0,0 +1,29 @@ +package admin_notification + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_notification" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetNotificationDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetNotificationDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_notification.NewAdminGetNotificationDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetNotificationDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_notification/admingetnotificationlisthandler.go b/app/main/api/internal/handler/admin_notification/admingetnotificationlisthandler.go new file mode 100644 index 0000000..bd8ea2b --- /dev/null +++ b/app/main/api/internal/handler/admin_notification/admingetnotificationlisthandler.go @@ -0,0 +1,29 @@ +package admin_notification + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_notification" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetNotificationListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetNotificationListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_notification.NewAdminGetNotificationListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetNotificationList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go b/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go new file mode 100644 index 0000000..8a4b9cd --- /dev/null +++ b/app/main/api/internal/handler/admin_notification/adminupdatenotificationhandler.go @@ -0,0 +1,29 @@ +package admin_notification + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_notification" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateNotificationHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateNotificationReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_notification.NewAdminUpdateNotificationLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateNotification(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/generatinglinkhandler.go b/app/main/api/internal/handler/admin_order/admincreateorderhandler.go similarity index 53% rename from app/user/cmd/api/internal/handler/agent/generatinglinkhandler.go rename to app/main/api/internal/handler/admin_order/admincreateorderhandler.go index ae803d3..780686e 100644 --- a/app/user/cmd/api/internal/handler/agent/generatinglinkhandler.go +++ b/app/main/api/internal/handler/admin_order/admincreateorderhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_order import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_order" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GeneratingLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminCreateOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.AgentGeneratingLinkReq + var req types.AdminCreateOrderReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GeneratingLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGeneratingLinkLogic(r.Context(), svcCtx) - resp, err := l.GeneratingLink(&req) + l := admin_order.NewAdminCreateOrderLogic(r.Context(), svcCtx) + resp, err := l.AdminCreateOrder(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_order/admindeleteorderhandler.go b/app/main/api/internal/handler/admin_order/admindeleteorderhandler.go new file mode 100644 index 0000000..b0947cb --- /dev/null +++ b/app/main/api/internal/handler/admin_order/admindeleteorderhandler.go @@ -0,0 +1,29 @@ +package admin_order + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_order" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminDeleteOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminDeleteOrderReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_order.NewAdminDeleteOrderLogic(r.Context(), svcCtx) + resp, err := l.AdminDeleteOrder(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentrevenueinfohandler.go b/app/main/api/internal/handler/admin_order/admingetorderdetailhandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/agent/getagentrevenueinfohandler.go rename to app/main/api/internal/handler/admin_order/admingetorderdetailhandler.go index 5392352..f30aeef 100644 --- a/app/user/cmd/api/internal/handler/agent/getagentrevenueinfohandler.go +++ b/app/main/api/internal/handler/admin_order/admingetorderdetailhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_order import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_order" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetAgentRevenueInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetOrderDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetAgentRevenueInfoReq + var req types.AdminGetOrderDetailReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetAgentRevenueInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetAgentRevenueInfoLogic(r.Context(), svcCtx) - resp, err := l.GetAgentRevenueInfo(&req) + l := admin_order.NewAdminGetOrderDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetOrderDetail(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/product/getproductappbyenhandler.go b/app/main/api/internal/handler/admin_order/admingetorderlisthandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/product/getproductappbyenhandler.go rename to app/main/api/internal/handler/admin_order/admingetorderlisthandler.go index db6ed43..7121a18 100644 --- a/app/user/cmd/api/internal/handler/product/getproductappbyenhandler.go +++ b/app/main/api/internal/handler/admin_order/admingetorderlisthandler.go @@ -1,20 +1,19 @@ -package product +package admin_order import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/product" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_order" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetProductAppByEnHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetOrderListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetProductByEnRequest + var req types.AdminGetOrderListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetProductAppByEnHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := product.NewGetProductAppByEnLogic(r.Context(), svcCtx) - resp, err := l.GetProductAppByEn(&req) + l := admin_order.NewAdminGetOrderListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetOrderList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go b/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go new file mode 100644 index 0000000..977a2ba --- /dev/null +++ b/app/main/api/internal/handler/admin_order/adminrefundorderhandler.go @@ -0,0 +1,29 @@ +package admin_order + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_order" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminRefundOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminRefundOrderReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_order.NewAdminRefundOrderLogic(r.Context(), svcCtx) + resp, err := l.AdminRefundOrder(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_order/adminupdateorderhandler.go b/app/main/api/internal/handler/admin_order/adminupdateorderhandler.go new file mode 100644 index 0000000..ee354c7 --- /dev/null +++ b/app/main/api/internal/handler/admin_order/adminupdateorderhandler.go @@ -0,0 +1,29 @@ +package admin_order + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_order" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateOrderHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateOrderReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_order.NewAdminUpdateOrderLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateOrder(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go b/app/main/api/internal/handler/admin_platform_user/admincreateplatformuserhandler.go similarity index 50% rename from app/user/cmd/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go rename to app/main/api/internal/handler/admin_platform_user/admincreateplatformuserhandler.go index 53b63c3..67f07c6 100644 --- a/app/user/cmd/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go +++ b/app/main/api/internal/handler/admin_platform_user/admincreateplatformuserhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_platform_user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_platform_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetAgentSubordinateContributionDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminCreatePlatformUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetAgentSubordinateContributionDetailReq + var req types.AdminCreatePlatformUserReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetAgentSubordinateContributionDetailHandler(svcCtx *svc.ServiceContext) ht result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetAgentSubordinateContributionDetailLogic(r.Context(), svcCtx) - resp, err := l.GetAgentSubordinateContributionDetail(&req) + l := admin_platform_user.NewAdminCreatePlatformUserLogic(r.Context(), svcCtx) + resp, err := l.AdminCreatePlatformUser(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_platform_user/admindeleteplatformuserhandler.go b/app/main/api/internal/handler/admin_platform_user/admindeleteplatformuserhandler.go new file mode 100644 index 0000000..743a38e --- /dev/null +++ b/app/main/api/internal/handler/admin_platform_user/admindeleteplatformuserhandler.go @@ -0,0 +1,29 @@ +package admin_platform_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_platform_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminDeletePlatformUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminDeletePlatformUserReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_platform_user.NewAdminDeletePlatformUserLogic(r.Context(), svcCtx) + resp, err := l.AdminDeletePlatformUser(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_platform_user/admingetplatformuserdetailhandler.go b/app/main/api/internal/handler/admin_platform_user/admingetplatformuserdetailhandler.go new file mode 100644 index 0000000..ec6fc47 --- /dev/null +++ b/app/main/api/internal/handler/admin_platform_user/admingetplatformuserdetailhandler.go @@ -0,0 +1,29 @@ +package admin_platform_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_platform_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetPlatformUserDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetPlatformUserDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_platform_user.NewAdminGetPlatformUserDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetPlatformUserDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go b/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go new file mode 100644 index 0000000..20ad931 --- /dev/null +++ b/app/main/api/internal/handler/admin_platform_user/admingetplatformuserlisthandler.go @@ -0,0 +1,29 @@ +package admin_platform_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_platform_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetPlatformUserListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetPlatformUserListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_platform_user.NewAdminGetPlatformUserListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetPlatformUserList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_platform_user/adminupdateplatformuserhandler.go b/app/main/api/internal/handler/admin_platform_user/adminupdateplatformuserhandler.go new file mode 100644 index 0000000..574a42e --- /dev/null +++ b/app/main/api/internal/handler/admin_platform_user/adminupdateplatformuserhandler.go @@ -0,0 +1,29 @@ +package admin_platform_user + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_platform_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdatePlatformUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdatePlatformUserReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_platform_user.NewAdminUpdatePlatformUserLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdatePlatformUser(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/admincreateproducthandler.go b/app/main/api/internal/handler/admin_product/admincreateproducthandler.go new file mode 100644 index 0000000..413fcfe --- /dev/null +++ b/app/main/api/internal/handler/admin_product/admincreateproducthandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminCreateProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminCreateProductReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminCreateProductLogic(r.Context(), svcCtx) + resp, err := l.AdminCreateProduct(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/admindeleteproducthandler.go b/app/main/api/internal/handler/admin_product/admindeleteproducthandler.go new file mode 100644 index 0000000..697680f --- /dev/null +++ b/app/main/api/internal/handler/admin_product/admindeleteproducthandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminDeleteProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminDeleteProductReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminDeleteProductLogic(r.Context(), svcCtx) + resp, err := l.AdminDeleteProduct(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/admingetproductdetailhandler.go b/app/main/api/internal/handler/admin_product/admingetproductdetailhandler.go new file mode 100644 index 0000000..9511af5 --- /dev/null +++ b/app/main/api/internal/handler/admin_product/admingetproductdetailhandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetProductDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetProductDetailReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminGetProductDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetProductDetail(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/admingetproductfeaturelisthandler.go b/app/main/api/internal/handler/admin_product/admingetproductfeaturelisthandler.go new file mode 100644 index 0000000..f0a934d --- /dev/null +++ b/app/main/api/internal/handler/admin_product/admingetproductfeaturelisthandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetProductFeatureListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetProductFeatureListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminGetProductFeatureListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetProductFeatureList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/admingetproductlisthandler.go b/app/main/api/internal/handler/admin_product/admingetproductlisthandler.go new file mode 100644 index 0000000..9924cec --- /dev/null +++ b/app/main/api/internal/handler/admin_product/admingetproductlisthandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetProductListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetProductListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminGetProductListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetProductList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/adminupdateproductfeatureshandler.go b/app/main/api/internal/handler/admin_product/adminupdateproductfeatureshandler.go new file mode 100644 index 0000000..755a159 --- /dev/null +++ b/app/main/api/internal/handler/admin_product/adminupdateproductfeatureshandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateProductFeaturesHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateProductFeaturesReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminUpdateProductFeaturesLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateProductFeatures(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_product/adminupdateproducthandler.go b/app/main/api/internal/handler/admin_product/adminupdateproducthandler.go new file mode 100644 index 0000000..eb5f2be --- /dev/null +++ b/app/main/api/internal/handler/admin_product/adminupdateproducthandler.go @@ -0,0 +1,29 @@ +package admin_product + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateProductHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateProductReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_product.NewAdminUpdateProductLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateProduct(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/createpromotionlinkhandler.go b/app/main/api/internal/handler/admin_promotion/createpromotionlinkhandler.go new file mode 100644 index 0000000..673dc6a --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/createpromotionlinkhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func CreatePromotionLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.CreatePromotionLinkReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewCreatePromotionLinkLogic(r.Context(), svcCtx) + resp, err := l.CreatePromotionLink(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/auth/sendsmshandler.go b/app/main/api/internal/handler/admin_promotion/deletepromotionlinkhandler.go similarity index 52% rename from app/user/cmd/api/internal/handler/auth/sendsmshandler.go rename to app/main/api/internal/handler/admin_promotion/deletepromotionlinkhandler.go index be5fc83..f6e7162 100644 --- a/app/user/cmd/api/internal/handler/auth/sendsmshandler.go +++ b/app/main/api/internal/handler/admin_promotion/deletepromotionlinkhandler.go @@ -1,20 +1,20 @@ -package auth +package admin_promotion import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/auth" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" "github.com/zeromicro/go-zero/rest/httpx" ) -func SendSmsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func DeletePromotionLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.SendSmsReq + var req types.DeletePromotionLinkReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +23,8 @@ func SendSmsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := auth.NewSendSmsLogic(r.Context(), svcCtx) - err := l.SendSms(&req) + l := admin_promotion.NewDeletePromotionLinkLogic(r.Context(), svcCtx) + err := l.DeletePromotionLink(&req) result.HttpResult(r, w, nil, err) } } diff --git a/app/user/cmd/api/internal/handler/query/querygeneratesharelinkhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionlinkdetailhandler.go similarity index 53% rename from app/user/cmd/api/internal/handler/query/querygeneratesharelinkhandler.go rename to app/main/api/internal/handler/admin_promotion/getpromotionlinkdetailhandler.go index 887756e..959d570 100644 --- a/app/user/cmd/api/internal/handler/query/querygeneratesharelinkhandler.go +++ b/app/main/api/internal/handler/admin_promotion/getpromotionlinkdetailhandler.go @@ -1,19 +1,19 @@ -package query +package admin_promotion import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func QueryGenerateShareLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetPromotionLinkDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryGenerateShareLinkReq + var req types.GetPromotionLinkDetailReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func QueryGenerateShareLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryGenerateShareLinkLogic(r.Context(), svcCtx) - resp, err := l.QueryGenerateShareLink(&req) + l := admin_promotion.NewGetPromotionLinkDetailLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionLinkDetail(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/query/querydetailbyorderidhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionlinklisthandler.go similarity index 53% rename from app/user/cmd/api/internal/handler/query/querydetailbyorderidhandler.go rename to app/main/api/internal/handler/admin_promotion/getpromotionlinklisthandler.go index 4c35f19..32f18e7 100644 --- a/app/user/cmd/api/internal/handler/query/querydetailbyorderidhandler.go +++ b/app/main/api/internal/handler/admin_promotion/getpromotionlinklisthandler.go @@ -1,20 +1,19 @@ -package query +package admin_promotion import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QueryDetailByOrderIdHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetPromotionLinkListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryDetailByOrderIdReq + var req types.GetPromotionLinkListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QueryDetailByOrderIdHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryDetailByOrderIdLogic(r.Context(), svcCtx) - resp, err := l.QueryDetailByOrderId(&req) + l := admin_promotion.NewGetPromotionLinkListLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionLinkList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_promotion/getpromotionstatshistoryhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionstatshistoryhandler.go new file mode 100644 index 0000000..d7ae3ca --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/getpromotionstatshistoryhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func GetPromotionStatsHistoryHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionStatsHistoryReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewGetPromotionStatsHistoryLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionStatsHistory(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_promotion/getpromotionstatstotalhandler.go b/app/main/api/internal/handler/admin_promotion/getpromotionstatstotalhandler.go new file mode 100644 index 0000000..1e41452 --- /dev/null +++ b/app/main/api/internal/handler/admin_promotion/getpromotionstatstotalhandler.go @@ -0,0 +1,29 @@ +package admin_promotion + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func GetPromotionStatsTotalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionStatsTotalReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_promotion.NewGetPromotionStatsTotalLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionStatsTotal(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/query/querysingletesthandler.go b/app/main/api/internal/handler/admin_promotion/recordlinkclickhandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/query/querysingletesthandler.go rename to app/main/api/internal/handler/admin_promotion/recordlinkclickhandler.go index d3e59e1..a09a596 100644 --- a/app/user/cmd/api/internal/handler/query/querysingletesthandler.go +++ b/app/main/api/internal/handler/admin_promotion/recordlinkclickhandler.go @@ -1,20 +1,19 @@ -package query +package admin_promotion import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QuerySingleTestHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func RecordLinkClickHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QuerySingleTestReq + var req types.RecordLinkClickReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QuerySingleTestHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQuerySingleTestLogic(r.Context(), svcCtx) - resp, err := l.QuerySingleTest(&req) + l := admin_promotion.NewRecordLinkClickLogic(r.Context(), svcCtx) + resp, err := l.RecordLinkClick(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/pay/iapcallbackhandler.go b/app/main/api/internal/handler/admin_promotion/updatepromotionlinkhandler.go similarity index 52% rename from app/user/cmd/api/internal/handler/pay/iapcallbackhandler.go rename to app/main/api/internal/handler/admin_promotion/updatepromotionlinkhandler.go index 7613d67..798a485 100644 --- a/app/user/cmd/api/internal/handler/pay/iapcallbackhandler.go +++ b/app/main/api/internal/handler/admin_promotion/updatepromotionlinkhandler.go @@ -1,20 +1,20 @@ -package pay +package admin_promotion import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/admin_promotion" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" "github.com/zeromicro/go-zero/rest/httpx" ) -func IapCallbackHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func UpdatePromotionLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.IapCallbackReq + var req types.UpdatePromotionLinkReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +23,8 @@ func IapCallbackHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := pay.NewIapCallbackLogic(r.Context(), svcCtx) - err := l.IapCallback(&req) + l := admin_promotion.NewUpdatePromotionLinkLogic(r.Context(), svcCtx) + err := l.UpdatePromotionLink(&req) result.HttpResult(r, w, nil, err) } } diff --git a/app/main/api/internal/handler/admin_query/admingetquerycleanupconfiglisthandler.go b/app/main/api/internal/handler/admin_query/admingetquerycleanupconfiglisthandler.go new file mode 100644 index 0000000..a0d55a6 --- /dev/null +++ b/app/main/api/internal/handler/admin_query/admingetquerycleanupconfiglisthandler.go @@ -0,0 +1,29 @@ +package admin_query + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetQueryCleanupConfigListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetQueryCleanupConfigListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_query.NewAdminGetQueryCleanupConfigListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetQueryCleanupConfigList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_query/admingetquerycleanupdetaillisthandler.go b/app/main/api/internal/handler/admin_query/admingetquerycleanupdetaillisthandler.go new file mode 100644 index 0000000..be2a21a --- /dev/null +++ b/app/main/api/internal/handler/admin_query/admingetquerycleanupdetaillisthandler.go @@ -0,0 +1,29 @@ +package admin_query + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetQueryCleanupDetailListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetQueryCleanupDetailListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_query.NewAdminGetQueryCleanupDetailListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetQueryCleanupDetailList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_query/admingetquerycleanuploglisthandler.go b/app/main/api/internal/handler/admin_query/admingetquerycleanuploglisthandler.go new file mode 100644 index 0000000..d832b70 --- /dev/null +++ b/app/main/api/internal/handler/admin_query/admingetquerycleanuploglisthandler.go @@ -0,0 +1,29 @@ +package admin_query + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetQueryCleanupLogListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetQueryCleanupLogListReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_query.NewAdminGetQueryCleanupLogListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetQueryCleanupLogList(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_query/admingetquerydetailbyorderidhandler.go b/app/main/api/internal/handler/admin_query/admingetquerydetailbyorderidhandler.go new file mode 100644 index 0000000..a658451 --- /dev/null +++ b/app/main/api/internal/handler/admin_query/admingetquerydetailbyorderidhandler.go @@ -0,0 +1,29 @@ +package admin_query + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminGetQueryDetailByOrderIdHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminGetQueryDetailByOrderIdReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_query.NewAdminGetQueryDetailByOrderIdLogic(r.Context(), svcCtx) + resp, err := l.AdminGetQueryDetailByOrderId(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_query/adminupdatequerycleanupconfighandler.go b/app/main/api/internal/handler/admin_query/adminupdatequerycleanupconfighandler.go new file mode 100644 index 0000000..c6fd33b --- /dev/null +++ b/app/main/api/internal/handler/admin_query/adminupdatequerycleanupconfighandler.go @@ -0,0 +1,29 @@ +package admin_query + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func AdminUpdateQueryCleanupConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AdminUpdateQueryCleanupConfigReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_query.NewAdminUpdateQueryCleanupConfigLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateQueryCleanupConfig(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/createrolehandler.go b/app/main/api/internal/handler/admin_role/createrolehandler.go new file mode 100644 index 0000000..4859658 --- /dev/null +++ b/app/main/api/internal/handler/admin_role/createrolehandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_role" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func CreateRoleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.CreateRoleReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewCreateRoleLogic(r.Context(), svcCtx) + resp, err := l.CreateRole(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/admin_role/deleterolehandler.go b/app/main/api/internal/handler/admin_role/deleterolehandler.go new file mode 100644 index 0000000..66e728b --- /dev/null +++ b/app/main/api/internal/handler/admin_role/deleterolehandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_role" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func DeleteRoleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteRoleReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewDeleteRoleLogic(r.Context(), svcCtx) + resp, err := l.DeleteRole(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/applyforagenthandler.go b/app/main/api/internal/handler/admin_role/getroledetailhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/agent/applyforagenthandler.go rename to app/main/api/internal/handler/admin_role/getroledetailhandler.go index b052b4a..1766209 100644 --- a/app/user/cmd/api/internal/handler/agent/applyforagenthandler.go +++ b/app/main/api/internal/handler/admin_role/getroledetailhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_role import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_role" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func ApplyForAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetRoleDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.AgentApplyReq + var req types.GetRoleDetailReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func ApplyForAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewApplyForAgentLogic(r.Context(), svcCtx) - resp, err := l.ApplyForAgent(&req) + l := admin_role.NewGetRoleDetailLogic(r.Context(), svcCtx) + resp, err := l.GetRoleDetail(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/user/mobileloginhandler.go b/app/main/api/internal/handler/admin_role/getrolelisthandler.go similarity index 56% rename from app/user/cmd/api/internal/handler/user/mobileloginhandler.go rename to app/main/api/internal/handler/admin_role/getrolelisthandler.go index fbf6c84..c75e742 100644 --- a/app/user/cmd/api/internal/handler/user/mobileloginhandler.go +++ b/app/main/api/internal/handler/admin_role/getrolelisthandler.go @@ -1,20 +1,19 @@ -package user +package admin_role import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_role" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func MobileLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetRoleListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.MobileLoginReq + var req types.GetRoleListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func MobileLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := user.NewMobileLoginLogic(r.Context(), svcCtx) - resp, err := l.MobileLogin(&req) + l := admin_role.NewGetRoleListLogic(r.Context(), svcCtx) + resp, err := l.GetRoleList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/admin_role/updaterolehandler.go b/app/main/api/internal/handler/admin_role/updaterolehandler.go new file mode 100644 index 0000000..cd13184 --- /dev/null +++ b/app/main/api/internal/handler/admin_role/updaterolehandler.go @@ -0,0 +1,29 @@ +package admin_role + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_role" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func UpdateRoleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.UpdateRoleReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := admin_role.NewUpdateRoleLogic(r.Context(), svcCtx) + resp, err := l.UpdateRole(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/agentwithdrawalhandler.go b/app/main/api/internal/handler/admin_user/admincreateuserhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/agent/agentwithdrawalhandler.go rename to app/main/api/internal/handler/admin_user/admincreateuserhandler.go index ea53b1d..d504eb2 100644 --- a/app/user/cmd/api/internal/handler/agent/agentwithdrawalhandler.go +++ b/app/main/api/internal/handler/admin_user/admincreateuserhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func AgentWithdrawalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminCreateUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.WithdrawalReq + var req types.AdminCreateUserReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func AgentWithdrawalHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewAgentWithdrawalLogic(r.Context(), svcCtx) - resp, err := l.AgentWithdrawal(&req) + l := admin_user.NewAdminCreateUserLogic(r.Context(), svcCtx) + resp, err := l.AdminCreateUser(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/getagentrewardshandler.go b/app/main/api/internal/handler/admin_user/admindeleteuserhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/agent/getagentrewardshandler.go rename to app/main/api/internal/handler/admin_user/admindeleteuserhandler.go index 243b9df..1af08be 100644 --- a/app/user/cmd/api/internal/handler/agent/getagentrewardshandler.go +++ b/app/main/api/internal/handler/admin_user/admindeleteuserhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetAgentRewardsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminDeleteUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetRewardsReq + var req types.AdminDeleteUserReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetAgentRewardsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetAgentRewardsLogic(r.Context(), svcCtx) - resp, err := l.GetAgentRewards(&req) + l := admin_user.NewAdminDeleteUserLogic(r.Context(), svcCtx) + resp, err := l.AdminDeleteUser(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/getagentcommissionhandler.go b/app/main/api/internal/handler/admin_user/admingetuserdetailhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/agent/getagentcommissionhandler.go rename to app/main/api/internal/handler/admin_user/admingetuserdetailhandler.go index dbbe627..2481474 100644 --- a/app/user/cmd/api/internal/handler/agent/getagentcommissionhandler.go +++ b/app/main/api/internal/handler/admin_user/admingetuserdetailhandler.go @@ -1,20 +1,19 @@ -package agent +package admin_user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func GetAgentCommissionHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetUserDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.GetCommissionReq + var req types.AdminGetUserDetailReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func GetAgentCommissionHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := agent.NewGetAgentCommissionLogic(r.Context(), svcCtx) - resp, err := l.GetAgentCommission(&req) + l := admin_user.NewAdminGetUserDetailLogic(r.Context(), svcCtx) + resp, err := l.AdminGetUserDetail(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/query/querysharedetailhandler.go b/app/main/api/internal/handler/admin_user/admingetuserlisthandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/query/querysharedetailhandler.go rename to app/main/api/internal/handler/admin_user/admingetuserlisthandler.go index d676e14..b026c0c 100644 --- a/app/user/cmd/api/internal/handler/query/querysharedetailhandler.go +++ b/app/main/api/internal/handler/admin_user/admingetuserlisthandler.go @@ -1,19 +1,19 @@ -package query +package admin_user import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/admin_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func QueryShareDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminGetUserListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryShareDetailReq + var req types.AdminGetUserListReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func QueryShareDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryShareDetailLogic(r.Context(), svcCtx) - resp, err := l.QueryShareDetail(&req) + l := admin_user.NewAdminGetUserListLogic(r.Context(), svcCtx) + resp, err := l.AdminGetUserList(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/query/queryserviceapphandler.go b/app/main/api/internal/handler/admin_user/adminupdateuserhandler.go similarity index 55% rename from app/user/cmd/api/internal/handler/query/queryserviceapphandler.go rename to app/main/api/internal/handler/admin_user/adminupdateuserhandler.go index f4fc614..55ba020 100644 --- a/app/user/cmd/api/internal/handler/query/queryserviceapphandler.go +++ b/app/main/api/internal/handler/admin_user/adminupdateuserhandler.go @@ -1,20 +1,19 @@ -package query +package admin_user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func QueryServiceAppHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminUpdateUserHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryServiceReq + var req types.AdminUpdateUserReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func QueryServiceAppHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewQueryServiceLogic(r.Context(), svcCtx) - resp, err := l.QueryService(&req) + l := admin_user.NewAdminUpdateUserLogic(r.Context(), svcCtx) + resp, err := l.AdminUpdateUser(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/pay/paymentcheckhandler.go b/app/main/api/internal/handler/admin_user/adminuserinfohandler.go similarity index 54% rename from app/user/cmd/api/internal/handler/pay/paymentcheckhandler.go rename to app/main/api/internal/handler/admin_user/adminuserinfohandler.go index b52f3c9..3ba6529 100644 --- a/app/user/cmd/api/internal/handler/pay/paymentcheckhandler.go +++ b/app/main/api/internal/handler/admin_user/adminuserinfohandler.go @@ -1,20 +1,19 @@ -package pay +package admin_user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/main/api/internal/logic/admin_user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" ) -func PaymentCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AdminUserInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.PaymentCheckReq + var req types.AdminUserInfoReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -23,8 +22,8 @@ func PaymentCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := pay.NewPaymentCheckLogic(r.Context(), svcCtx) - resp, err := l.PaymentCheck(&req) + l := admin_user.NewAdminUserInfoLogic(r.Context(), svcCtx) + resp, err := l.AdminUserInfo(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/main/api/internal/handler/agent/activateagentmembershiphandler.go b/app/main/api/internal/handler/agent/activateagentmembershiphandler.go index 72c3e85..a0e5b41 100644 --- a/app/main/api/internal/handler/agent/activateagentmembershiphandler.go +++ b/app/main/api/internal/handler/agent/activateagentmembershiphandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/agentrealnamehandler.go b/app/main/api/internal/handler/agent/agentrealnamehandler.go index 83ddb4d..9fa1643 100644 --- a/app/main/api/internal/handler/agent/agentrealnamehandler.go +++ b/app/main/api/internal/handler/agent/agentrealnamehandler.go @@ -3,12 +3,13 @@ package agent import ( "net/http" - "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" ) func AgentRealNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { diff --git a/app/main/api/internal/handler/agent/agentwithdrawalhandler.go b/app/main/api/internal/handler/agent/agentwithdrawalhandler.go index ea53b1d..c6a073d 100644 --- a/app/main/api/internal/handler/agent/agentwithdrawalhandler.go +++ b/app/main/api/internal/handler/agent/agentwithdrawalhandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/applyforagenthandler.go b/app/main/api/internal/handler/agent/applyforagenthandler.go index b052b4a..314d9d4 100644 --- a/app/main/api/internal/handler/agent/applyforagenthandler.go +++ b/app/main/api/internal/handler/agent/applyforagenthandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/generatinglinkhandler.go b/app/main/api/internal/handler/agent/generatinglinkhandler.go index ae803d3..e71277b 100644 --- a/app/main/api/internal/handler/agent/generatinglinkhandler.go +++ b/app/main/api/internal/handler/agent/generatinglinkhandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentauditstatushandler.go b/app/main/api/internal/handler/agent/getagentauditstatushandler.go index 0435a34..5dbd95b 100644 --- a/app/main/api/internal/handler/agent/getagentauditstatushandler.go +++ b/app/main/api/internal/handler/agent/getagentauditstatushandler.go @@ -3,8 +3,8 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/agent/getagentcommissionhandler.go b/app/main/api/internal/handler/agent/getagentcommissionhandler.go index dbbe627..0a9b320 100644 --- a/app/main/api/internal/handler/agent/getagentcommissionhandler.go +++ b/app/main/api/internal/handler/agent/getagentcommissionhandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentinfohandler.go b/app/main/api/internal/handler/agent/getagentinfohandler.go index 157d16b..a01573d 100644 --- a/app/main/api/internal/handler/agent/getagentinfohandler.go +++ b/app/main/api/internal/handler/agent/getagentinfohandler.go @@ -3,8 +3,8 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/agent/getagentmembershipproductconfighandler.go b/app/main/api/internal/handler/agent/getagentmembershipproductconfighandler.go index d2dfbcc..a8ab69b 100644 --- a/app/main/api/internal/handler/agent/getagentmembershipproductconfighandler.go +++ b/app/main/api/internal/handler/agent/getagentmembershipproductconfighandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentproductconfighandler.go b/app/main/api/internal/handler/agent/getagentproductconfighandler.go index af0a0f1..5ace57c 100644 --- a/app/main/api/internal/handler/agent/getagentproductconfighandler.go +++ b/app/main/api/internal/handler/agent/getagentproductconfighandler.go @@ -3,8 +3,8 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/agent/getagentrevenueinfohandler.go b/app/main/api/internal/handler/agent/getagentrevenueinfohandler.go index 5392352..2574d57 100644 --- a/app/main/api/internal/handler/agent/getagentrevenueinfohandler.go +++ b/app/main/api/internal/handler/agent/getagentrevenueinfohandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentrewardshandler.go b/app/main/api/internal/handler/agent/getagentrewardshandler.go index 243b9df..3122037 100644 --- a/app/main/api/internal/handler/agent/getagentrewardshandler.go +++ b/app/main/api/internal/handler/agent/getagentrewardshandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go b/app/main/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go index 53b63c3..3460c9b 100644 --- a/app/main/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go +++ b/app/main/api/internal/handler/agent/getagentsubordinatecontributiondetailhandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentsubordinatelisthandler.go b/app/main/api/internal/handler/agent/getagentsubordinatelisthandler.go index 1a632e9..534ee24 100644 --- a/app/main/api/internal/handler/agent/getagentsubordinatelisthandler.go +++ b/app/main/api/internal/handler/agent/getagentsubordinatelisthandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getagentwithdrawalhandler.go b/app/main/api/internal/handler/agent/getagentwithdrawalhandler.go index 057052c..ad197c4 100644 --- a/app/main/api/internal/handler/agent/getagentwithdrawalhandler.go +++ b/app/main/api/internal/handler/agent/getagentwithdrawalhandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/getlinkdatahandler.go b/app/main/api/internal/handler/agent/getlinkdatahandler.go index 02f0406..dab9763 100644 --- a/app/main/api/internal/handler/agent/getlinkdatahandler.go +++ b/app/main/api/internal/handler/agent/getlinkdatahandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/agent/saveagentmembershipuserconfighandler.go b/app/main/api/internal/handler/agent/saveagentmembershipuserconfighandler.go index a4fca85..382b032 100644 --- a/app/main/api/internal/handler/agent/saveagentmembershipuserconfighandler.go +++ b/app/main/api/internal/handler/agent/saveagentmembershipuserconfighandler.go @@ -3,9 +3,9 @@ package agent import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/agent" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/app/getappversionhandler.go b/app/main/api/internal/handler/app/getappversionhandler.go index 18dd185..81a6764 100644 --- a/app/main/api/internal/handler/app/getappversionhandler.go +++ b/app/main/api/internal/handler/app/getappversionhandler.go @@ -3,8 +3,8 @@ package app import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/app" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/app" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/app/healthcheckhandler.go b/app/main/api/internal/handler/app/healthcheckhandler.go index b8902dc..3e3ccb9 100644 --- a/app/main/api/internal/handler/app/healthcheckhandler.go +++ b/app/main/api/internal/handler/app/healthcheckhandler.go @@ -3,8 +3,8 @@ package app import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/app" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/app" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/auth/sendsmshandler.go b/app/main/api/internal/handler/auth/sendsmshandler.go index be5fc83..313fc7c 100644 --- a/app/main/api/internal/handler/auth/sendsmshandler.go +++ b/app/main/api/internal/handler/auth/sendsmshandler.go @@ -3,9 +3,9 @@ package auth import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/auth" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/auth" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/notification/getnotificationshandler.go b/app/main/api/internal/handler/notification/getnotificationshandler.go index c87d12a..333478d 100644 --- a/app/main/api/internal/handler/notification/getnotificationshandler.go +++ b/app/main/api/internal/handler/notification/getnotificationshandler.go @@ -3,8 +3,8 @@ package notification import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/notification" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/notification" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/pay/alipaycallbackhandler.go b/app/main/api/internal/handler/pay/alipaycallbackhandler.go index 3c66039..85957fd 100644 --- a/app/main/api/internal/handler/pay/alipaycallbackhandler.go +++ b/app/main/api/internal/handler/pay/alipaycallbackhandler.go @@ -3,8 +3,8 @@ package pay import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/pay" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/pay/iapcallbackhandler.go b/app/main/api/internal/handler/pay/iapcallbackhandler.go index 7613d67..db1a9b4 100644 --- a/app/main/api/internal/handler/pay/iapcallbackhandler.go +++ b/app/main/api/internal/handler/pay/iapcallbackhandler.go @@ -3,9 +3,9 @@ package pay import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/pay" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/pay/paymentcheckhandler.go b/app/main/api/internal/handler/pay/paymentcheckhandler.go index b52f3c9..1818232 100644 --- a/app/main/api/internal/handler/pay/paymentcheckhandler.go +++ b/app/main/api/internal/handler/pay/paymentcheckhandler.go @@ -3,9 +3,9 @@ package pay import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/pay" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/pay/paymenthandler.go b/app/main/api/internal/handler/pay/paymenthandler.go index 091a383..78feb56 100644 --- a/app/main/api/internal/handler/pay/paymenthandler.go +++ b/app/main/api/internal/handler/pay/paymenthandler.go @@ -3,9 +3,9 @@ package pay import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/pay" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/pay/wechatpaycallbackhandler.go b/app/main/api/internal/handler/pay/wechatpaycallbackhandler.go index ba70209..1cd3b7f 100644 --- a/app/main/api/internal/handler/pay/wechatpaycallbackhandler.go +++ b/app/main/api/internal/handler/pay/wechatpaycallbackhandler.go @@ -3,8 +3,8 @@ package pay import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/pay" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/pay/wechatpayrefundcallbackhandler.go b/app/main/api/internal/handler/pay/wechatpayrefundcallbackhandler.go index 892c37e..f857f54 100644 --- a/app/main/api/internal/handler/pay/wechatpayrefundcallbackhandler.go +++ b/app/main/api/internal/handler/pay/wechatpayrefundcallbackhandler.go @@ -3,8 +3,8 @@ package pay import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/pay" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/product/getproductappbyenhandler.go b/app/main/api/internal/handler/product/getproductappbyenhandler.go index db6ed43..1d880f1 100644 --- a/app/main/api/internal/handler/product/getproductappbyenhandler.go +++ b/app/main/api/internal/handler/product/getproductappbyenhandler.go @@ -3,9 +3,9 @@ package product import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/product" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/product/getproductbyenhandler.go b/app/main/api/internal/handler/product/getproductbyenhandler.go index 74287c4..8b6e7a6 100644 --- a/app/main/api/internal/handler/product/getproductbyenhandler.go +++ b/app/main/api/internal/handler/product/getproductbyenhandler.go @@ -3,9 +3,9 @@ package product import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/product" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/product/getproductbyidhandler.go b/app/main/api/internal/handler/product/getproductbyidhandler.go index 644c646..f37ba66 100644 --- a/app/main/api/internal/handler/product/getproductbyidhandler.go +++ b/app/main/api/internal/handler/product/getproductbyidhandler.go @@ -3,9 +3,9 @@ package product import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/product" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/product" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/querydetailbyorderidhandler.go b/app/main/api/internal/handler/query/querydetailbyorderidhandler.go index 4c35f19..084f3b6 100644 --- a/app/main/api/internal/handler/query/querydetailbyorderidhandler.go +++ b/app/main/api/internal/handler/query/querydetailbyorderidhandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/querydetailbyordernohandler.go b/app/main/api/internal/handler/query/querydetailbyordernohandler.go index 67146e5..e920590 100644 --- a/app/main/api/internal/handler/query/querydetailbyordernohandler.go +++ b/app/main/api/internal/handler/query/querydetailbyordernohandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/queryexamplehandler.go b/app/main/api/internal/handler/query/queryexamplehandler.go index 11b215c..4cb0fb0 100644 --- a/app/main/api/internal/handler/query/queryexamplehandler.go +++ b/app/main/api/internal/handler/query/queryexamplehandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/querygeneratesharelinkhandler.go b/app/main/api/internal/handler/query/querygeneratesharelinkhandler.go index 887756e..4f8905d 100644 --- a/app/main/api/internal/handler/query/querygeneratesharelinkhandler.go +++ b/app/main/api/internal/handler/query/querygeneratesharelinkhandler.go @@ -3,12 +3,13 @@ package query import ( "net/http" - "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" ) func QueryGenerateShareLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { diff --git a/app/main/api/internal/handler/query/querylisthandler.go b/app/main/api/internal/handler/query/querylisthandler.go index 970ef29..3ab2547 100644 --- a/app/main/api/internal/handler/query/querylisthandler.go +++ b/app/main/api/internal/handler/query/querylisthandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/queryprovisionalorderhandler.go b/app/main/api/internal/handler/query/queryprovisionalorderhandler.go index 3685f81..2801772 100644 --- a/app/main/api/internal/handler/query/queryprovisionalorderhandler.go +++ b/app/main/api/internal/handler/query/queryprovisionalorderhandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/queryretryhandler.go b/app/main/api/internal/handler/query/queryretryhandler.go index f4b5272..92e14a3 100644 --- a/app/main/api/internal/handler/query/queryretryhandler.go +++ b/app/main/api/internal/handler/query/queryretryhandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/queryserviceagenthandler.go b/app/main/api/internal/handler/query/queryserviceagenthandler.go index 5a105dd..0033dda 100644 --- a/app/main/api/internal/handler/query/queryserviceagenthandler.go +++ b/app/main/api/internal/handler/query/queryserviceagenthandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/queryserviceapphandler.go b/app/main/api/internal/handler/query/queryserviceapphandler.go index f4fc614..7a8ad42 100644 --- a/app/main/api/internal/handler/query/queryserviceapphandler.go +++ b/app/main/api/internal/handler/query/queryserviceapphandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/queryservicehandler.go b/app/main/api/internal/handler/query/queryservicehandler.go index 4fce0d5..e74af1f 100644 --- a/app/main/api/internal/handler/query/queryservicehandler.go +++ b/app/main/api/internal/handler/query/queryservicehandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "github.com/zeromicro/go-zero/rest/httpx" diff --git a/app/main/api/internal/handler/query/querysharedetailhandler.go b/app/main/api/internal/handler/query/querysharedetailhandler.go index d676e14..714ec14 100644 --- a/app/main/api/internal/handler/query/querysharedetailhandler.go +++ b/app/main/api/internal/handler/query/querysharedetailhandler.go @@ -3,12 +3,13 @@ package query import ( "net/http" - "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" ) func QueryShareDetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { diff --git a/app/main/api/internal/handler/query/querysingletesthandler.go b/app/main/api/internal/handler/query/querysingletesthandler.go index d3e59e1..51710b4 100644 --- a/app/main/api/internal/handler/query/querysingletesthandler.go +++ b/app/main/api/internal/handler/query/querysingletesthandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/query/updatequerydatahandler.go b/app/main/api/internal/handler/query/updatequerydatahandler.go index 457e4a2..675927a 100644 --- a/app/main/api/internal/handler/query/updatequerydatahandler.go +++ b/app/main/api/internal/handler/query/updatequerydatahandler.go @@ -3,9 +3,9 @@ package query import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/query" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/routes.go b/app/main/api/internal/handler/routes.go index b6ee60f..8c589e5 100644 --- a/app/main/api/internal/handler/routes.go +++ b/app/main/api/internal/handler/routes.go @@ -4,20 +4,516 @@ package handler import ( "net/http" - agent "tydata-server/app/user/cmd/api/internal/handler/agent" - app "tydata-server/app/user/cmd/api/internal/handler/app" - auth "tydata-server/app/user/cmd/api/internal/handler/auth" - notification "tydata-server/app/user/cmd/api/internal/handler/notification" - pay "tydata-server/app/user/cmd/api/internal/handler/pay" - product "tydata-server/app/user/cmd/api/internal/handler/product" - query "tydata-server/app/user/cmd/api/internal/handler/query" - user "tydata-server/app/user/cmd/api/internal/handler/user" - "tydata-server/app/user/cmd/api/internal/svc" + admin_agent "tydata-server/app/main/api/internal/handler/admin_agent" + admin_auth "tydata-server/app/main/api/internal/handler/admin_auth" + admin_feature "tydata-server/app/main/api/internal/handler/admin_feature" + admin_menu "tydata-server/app/main/api/internal/handler/admin_menu" + admin_notification "tydata-server/app/main/api/internal/handler/admin_notification" + admin_order "tydata-server/app/main/api/internal/handler/admin_order" + admin_platform_user "tydata-server/app/main/api/internal/handler/admin_platform_user" + admin_product "tydata-server/app/main/api/internal/handler/admin_product" + admin_promotion "tydata-server/app/main/api/internal/handler/admin_promotion" + admin_query "tydata-server/app/main/api/internal/handler/admin_query" + admin_role "tydata-server/app/main/api/internal/handler/admin_role" + admin_user "tydata-server/app/main/api/internal/handler/admin_user" + agent "tydata-server/app/main/api/internal/handler/agent" + app "tydata-server/app/main/api/internal/handler/app" + auth "tydata-server/app/main/api/internal/handler/auth" + notification "tydata-server/app/main/api/internal/handler/notification" + pay "tydata-server/app/main/api/internal/handler/pay" + product "tydata-server/app/main/api/internal/handler/product" + query "tydata-server/app/main/api/internal/handler/query" + user "tydata-server/app/main/api/internal/handler/user" + "tydata-server/app/main/api/internal/svc" "github.com/zeromicro/go-zero/rest" ) func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodGet, + Path: "/agent-commission-deduction/list", + Handler: admin_agent.AdminGetAgentCommissionDeductionListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-commission/list", + Handler: admin_agent.AdminGetAgentCommissionListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-link/list", + Handler: admin_agent.AdminGetAgentLinkListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-membership-config/list", + Handler: admin_agent.AdminGetAgentMembershipConfigListHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/agent-membership-config/update", + Handler: admin_agent.AdminUpdateAgentMembershipConfigHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-membership-recharge-order/list", + Handler: admin_agent.AdminGetAgentMembershipRechargeOrderListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-platform-deduction/list", + Handler: admin_agent.AdminGetAgentPlatformDeductionListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-production-config/list", + Handler: admin_agent.AdminGetAgentProductionConfigListHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/agent-production-config/update", + Handler: admin_agent.AdminUpdateAgentProductionConfigHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-reward/list", + Handler: admin_agent.AdminGetAgentRewardListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/agent-withdrawal/list", + Handler: admin_agent.AdminGetAgentWithdrawalListHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/list", + Handler: admin_agent.AdminGetAgentListHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/agent"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 登录 + Method: http.MethodPost, + Path: "/login", + Handler: admin_auth.AdminLoginHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/auth"), + ) + + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/create", + Handler: admin_feature.AdminCreateFeatureHandler(serverCtx), + }, + { + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_feature.AdminDeleteFeatureHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_feature.AdminGetFeatureDetailHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/list", + Handler: admin_feature.AdminGetFeatureListHandler(serverCtx), + }, + { + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_feature.AdminUpdateFeatureHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/feature"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 获取所有菜单(树形结构) + Method: http.MethodGet, + Path: "/all", + Handler: admin_menu.GetMenuAllHandler(serverCtx), + }, + { + // 创建菜单 + Method: http.MethodPost, + Path: "/create", + Handler: admin_menu.CreateMenuHandler(serverCtx), + }, + { + // 删除菜单 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_menu.DeleteMenuHandler(serverCtx), + }, + { + // 获取菜单详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_menu.GetMenuDetailHandler(serverCtx), + }, + { + // 获取菜单列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_menu.GetMenuListHandler(serverCtx), + }, + { + // 更新菜单 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_menu.UpdateMenuHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/menu"), + ) + + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/create", + Handler: admin_notification.AdminCreateNotificationHandler(serverCtx), + }, + { + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_notification.AdminDeleteNotificationHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_notification.AdminGetNotificationDetailHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/list", + Handler: admin_notification.AdminGetNotificationListHandler(serverCtx), + }, + { + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_notification.AdminUpdateNotificationHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/notification"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建订单 + Method: http.MethodPost, + Path: "/create", + Handler: admin_order.AdminCreateOrderHandler(serverCtx), + }, + { + // 删除订单 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_order.AdminDeleteOrderHandler(serverCtx), + }, + { + // 获取订单详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_order.AdminGetOrderDetailHandler(serverCtx), + }, + { + // 获取订单列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_order.AdminGetOrderListHandler(serverCtx), + }, + { + // 订单退款 + Method: http.MethodPost, + Path: "/refund/:id", + Handler: admin_order.AdminRefundOrderHandler(serverCtx), + }, + { + // 更新订单 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_order.AdminUpdateOrderHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/order"), + ) + + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/create", + Handler: admin_platform_user.AdminCreatePlatformUserHandler(serverCtx), + }, + { + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_platform_user.AdminDeletePlatformUserHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_platform_user.AdminGetPlatformUserDetailHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/list", + Handler: admin_platform_user.AdminGetPlatformUserListHandler(serverCtx), + }, + { + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_platform_user.AdminUpdatePlatformUserHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/platform_user"), + ) + + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/create", + Handler: admin_product.AdminCreateProductHandler(serverCtx), + }, + { + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_product.AdminDeleteProductHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_product.AdminGetProductDetailHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/feature/list/:product_id", + Handler: admin_product.AdminGetProductFeatureListHandler(serverCtx), + }, + { + Method: http.MethodPut, + Path: "/feature/update/:product_id", + Handler: admin_product.AdminUpdateProductFeaturesHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/list", + Handler: admin_product.AdminGetProductListHandler(serverCtx), + }, + { + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_product.AdminUpdateProductHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/product"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建推广链接 + Method: http.MethodPost, + Path: "/create", + Handler: admin_promotion.CreatePromotionLinkHandler(serverCtx), + }, + { + // 删除推广链接 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_promotion.DeletePromotionLinkHandler(serverCtx), + }, + { + // 获取推广链接详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_promotion.GetPromotionLinkDetailHandler(serverCtx), + }, + { + // 获取推广链接列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_promotion.GetPromotionLinkListHandler(serverCtx), + }, + { + // 更新推广链接 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_promotion.UpdatePromotionLinkHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/promotion/link"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 记录链接点击 + Method: http.MethodGet, + Path: "/record/:path", + Handler: admin_promotion.RecordLinkClickHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/admin/promotion/link"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 获取推广历史记录 + Method: http.MethodGet, + Path: "/history", + Handler: admin_promotion.GetPromotionStatsHistoryHandler(serverCtx), + }, + { + // 获取推广总统计 + Method: http.MethodGet, + Path: "/total", + Handler: admin_promotion.GetPromotionStatsTotalHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/promotion/stats"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 更新清理配置 + Method: http.MethodPut, + Path: "/cleanup/config", + Handler: admin_query.AdminUpdateQueryCleanupConfigHandler(serverCtx), + }, + { + // 获取清理配置列表 + Method: http.MethodGet, + Path: "/cleanup/configs", + Handler: admin_query.AdminGetQueryCleanupConfigListHandler(serverCtx), + }, + { + // 获取清理详情列表 + Method: http.MethodGet, + Path: "/cleanup/details/:log_id", + Handler: admin_query.AdminGetQueryCleanupDetailListHandler(serverCtx), + }, + { + // 获取清理日志列表 + Method: http.MethodGet, + Path: "/cleanup/logs", + Handler: admin_query.AdminGetQueryCleanupLogListHandler(serverCtx), + }, + { + // 获取查询详情 + Method: http.MethodGet, + Path: "/detail/:order_id", + Handler: admin_query.AdminGetQueryDetailByOrderIdHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/query"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建角色 + Method: http.MethodPost, + Path: "/create", + Handler: admin_role.CreateRoleHandler(serverCtx), + }, + { + // 删除角色 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_role.DeleteRoleHandler(serverCtx), + }, + { + // 获取角色详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_role.GetRoleDetailHandler(serverCtx), + }, + { + // 获取角色列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_role.GetRoleListHandler(serverCtx), + }, + { + // 更新角色 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_role.UpdateRoleHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/role"), + ) + + server.AddRoutes( + []rest.Route{ + { + // 创建用户 + Method: http.MethodPost, + Path: "/create", + Handler: admin_user.AdminCreateUserHandler(serverCtx), + }, + { + // 删除用户 + Method: http.MethodDelete, + Path: "/delete/:id", + Handler: admin_user.AdminDeleteUserHandler(serverCtx), + }, + { + // 获取用户详情 + Method: http.MethodGet, + Path: "/detail/:id", + Handler: admin_user.AdminGetUserDetailHandler(serverCtx), + }, + { + // 用户信息 + Method: http.MethodGet, + Path: "/info", + Handler: admin_user.AdminUserInfoHandler(serverCtx), + }, + { + // 获取用户列表 + Method: http.MethodGet, + Path: "/list", + Handler: admin_user.AdminGetUserListHandler(serverCtx), + }, + { + // 更新用户 + Method: http.MethodPut, + Path: "/update/:id", + Handler: admin_user.AdminUpdateUserHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/admin/user"), + ) + server.AddRoutes( []rest.Route{ { diff --git a/app/main/api/internal/handler/user/agentmobilecodeloginhandler.go b/app/main/api/internal/handler/user/agentmobilecodeloginhandler.go index ceec8da..e85ff33 100644 --- a/app/main/api/internal/handler/user/agentmobilecodeloginhandler.go +++ b/app/main/api/internal/handler/user/agentmobilecodeloginhandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/user/bindmobilehandler.go b/app/main/api/internal/handler/user/bindmobilehandler.go index d1380ef..f8a23a9 100644 --- a/app/main/api/internal/handler/user/bindmobilehandler.go +++ b/app/main/api/internal/handler/user/bindmobilehandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/user/cancelouthandler.go b/app/main/api/internal/handler/user/cancelouthandler.go index 863e584..f404237 100644 --- a/app/main/api/internal/handler/user/cancelouthandler.go +++ b/app/main/api/internal/handler/user/cancelouthandler.go @@ -3,8 +3,8 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/user/detailhandler.go b/app/main/api/internal/handler/user/detailhandler.go index b344bc1..8de6538 100644 --- a/app/main/api/internal/handler/user/detailhandler.go +++ b/app/main/api/internal/handler/user/detailhandler.go @@ -3,8 +3,8 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/user/gettokenhandler.go b/app/main/api/internal/handler/user/gettokenhandler.go index b8bf7d6..0509980 100644 --- a/app/main/api/internal/handler/user/gettokenhandler.go +++ b/app/main/api/internal/handler/user/gettokenhandler.go @@ -3,8 +3,8 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" "tydata-server/common/result" ) diff --git a/app/main/api/internal/handler/user/mobilecodeloginhandler.go b/app/main/api/internal/handler/user/mobilecodeloginhandler.go index 7a1d684..0fd8138 100644 --- a/app/main/api/internal/handler/user/mobilecodeloginhandler.go +++ b/app/main/api/internal/handler/user/mobilecodeloginhandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/user/mobileloginhandler.go b/app/main/api/internal/handler/user/mobileloginhandler.go index fbf6c84..acba9c2 100644 --- a/app/main/api/internal/handler/user/mobileloginhandler.go +++ b/app/main/api/internal/handler/user/mobileloginhandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/user/registerhandler.go b/app/main/api/internal/handler/user/registerhandler.go index edf425d..2cabf91 100644 --- a/app/main/api/internal/handler/user/registerhandler.go +++ b/app/main/api/internal/handler/user/registerhandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/user/wxh5authhandler.go b/app/main/api/internal/handler/user/wxh5authhandler.go index ad864d1..3769919 100644 --- a/app/main/api/internal/handler/user/wxh5authhandler.go +++ b/app/main/api/internal/handler/user/wxh5authhandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/handler/user/wxminiauthhandler.go b/app/main/api/internal/handler/user/wxminiauthhandler.go index 32f14c6..d4b179e 100644 --- a/app/main/api/internal/handler/user/wxminiauthhandler.go +++ b/app/main/api/internal/handler/user/wxminiauthhandler.go @@ -3,9 +3,9 @@ package user import ( "net/http" - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/logic/user" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" diff --git a/app/main/api/internal/logic/admin_agent/admingetagentcommissiondeductionlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentcommissiondeductionlistlogic.go new file mode 100644 index 0000000..aa8f694 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentcommissiondeductionlistlogic.go @@ -0,0 +1,84 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentCommissionDeductionListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentCommissionDeductionListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentCommissionDeductionListLogic { + return &AdminGetAgentCommissionDeductionListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentCommissionDeductionListLogic) AdminGetAgentCommissionDeductionList(req *types.AdminGetAgentCommissionDeductionListReq) (resp *types.AdminGetAgentCommissionDeductionListResp, err error) { + builder := l.svcCtx.AgentCommissionDeductionModel.SelectBuilder() + if req.AgentId != nil { + builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId}) + } + if req.Type != nil && *req.Type != "" { + builder = builder.Where(squirrel.Eq{"type": *req.Type}) + } + if req.Status != nil { + builder = builder.Where(squirrel.Eq{"status": *req.Status}) + } + // 产品名筛选需先查product_id + if req.ProductName != nil && *req.ProductName != "" { + products, err := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"product_name": *req.ProductName}), "") + if err != nil || len(products) == 0 { + return &types.AdminGetAgentCommissionDeductionListResp{Total: 0, Items: []types.AgentCommissionDeductionListItem{}}, nil + } + builder = builder.Where("product_id = ?", products[0].Id) + } + + list, total, err := l.svcCtx.AgentCommissionDeductionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + + // 批量查product_id->name + productIds := make(map[int64]struct{}) + for _, v := range list { + productIds[v.ProductId] = struct{}{} + } + productIdArr := make([]int64, 0, len(productIds)) + for id := range productIds { + productIdArr = append(productIdArr, id) + } + productNameMap := make(map[int64]string) + if len(productIdArr) > 0 { + build := l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"id": productIdArr}) + products, _ := l.svcCtx.ProductModel.FindAll(l.ctx, build, "") + for _, p := range products { + productNameMap[p.Id] = p.ProductName + } + } + + items := make([]types.AgentCommissionDeductionListItem, 0, len(list)) + for _, v := range list { + item := types.AgentCommissionDeductionListItem{} + _ = copier.Copy(&item, v) + item.ProductName = productNameMap[v.ProductId] + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentCommissionDeductionListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go new file mode 100644 index 0000000..3d75b6c --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go @@ -0,0 +1,84 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentCommissionListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentCommissionListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentCommissionListLogic { + return &AdminGetAgentCommissionListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentCommissionListLogic) AdminGetAgentCommissionList(req *types.AdminGetAgentCommissionListReq) (resp *types.AdminGetAgentCommissionListResp, err error) { + builder := l.svcCtx.AgentCommissionModel.SelectBuilder() + if req.AgentId != nil { + builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId}) + } + if req.Status != nil { + builder = builder.Where(squirrel.Eq{"status": *req.Status}) + } + // 先查出所有product_id对应的product_name(如有product_name筛选,需反查id) + var productIdFilter int64 + if req.ProductName != nil && *req.ProductName != "" { + // 只支持精确匹配,如需模糊可扩展 + products, err := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"product_name": *req.ProductName}), "") + if err != nil || len(products) == 0 { + return &types.AdminGetAgentCommissionListResp{Total: 0, Items: []types.AgentCommissionListItem{}}, nil + } + productIdFilter = products[0].Id + builder = builder.Where("product_id = ?", productIdFilter) + } + + list, total, err := l.svcCtx.AgentCommissionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + + // 批量查product_name + productIds := make(map[int64]struct{}) + for _, v := range list { + productIds[v.ProductId] = struct{}{} + } + productNameMap := make(map[int64]string) + if len(productIds) > 0 { + ids := make([]int64, 0, len(productIds)) + for id := range productIds { + ids = append(ids, id) + } + builder := l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"id": ids}) + products, _ := l.svcCtx.ProductModel.FindAll(l.ctx, builder, "") + for _, p := range products { + productNameMap[p.Id] = p.ProductName + } + } + + items := make([]types.AgentCommissionListItem, 0, len(list)) + for _, v := range list { + item := types.AgentCommissionListItem{} + _ = copier.Copy(&item, v) + item.ProductName = productNameMap[v.ProductId] + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentCommissionListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go new file mode 100644 index 0000000..68c4c19 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go @@ -0,0 +1,86 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentLinkListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentLinkListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentLinkListLogic { + return &AdminGetAgentLinkListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentLinkListLogic) AdminGetAgentLinkList(req *types.AdminGetAgentLinkListReq) (resp *types.AdminGetAgentLinkListResp, err error) { + builder := l.svcCtx.AgentLinkModel.SelectBuilder() + if req.AgentId != nil { + builder = builder.Where("agent_id = ?", *req.AgentId) + } + if req.LinkIdentifier != nil && *req.LinkIdentifier != "" { + builder = builder.Where("link_identifier = ?", *req.LinkIdentifier) + } + + // 先查出所有product_id对应的product_name(如有product_name筛选,需反查id) + var productIdFilter int64 + if req.ProductName != nil && *req.ProductName != "" { + // 只支持精确匹配,如需模糊可扩展 + products, err := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"product_name": *req.ProductName}), "") + if err != nil || len(products) == 0 { + return &types.AdminGetAgentLinkListResp{Total: 0, Items: []types.AgentLinkListItem{}}, nil + } + productIdFilter = products[0].Id + builder = builder.Where("product_id = ?", productIdFilter) + } + + links, total, err := l.svcCtx.AgentLinkModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, err + } + + // 批量查product_id->name,避免N+1 + productIdSet := make(map[int64]struct{}) + for _, link := range links { + productIdSet[link.ProductId] = struct{}{} + } + productIdList := make([]int64, 0, len(productIdSet)) + for id := range productIdSet { + productIdList = append(productIdList, id) + } + productNameMap := make(map[int64]string) + if len(productIdList) > 0 { + products, _ := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"id": productIdList}), "") + for _, p := range products { + productNameMap[p.Id] = p.ProductName + } + } + + items := make([]types.AgentLinkListItem, 0, len(links)) + for _, link := range links { + items = append(items, types.AgentLinkListItem{ + AgentId: link.AgentId, + ProductName: productNameMap[link.ProductId], + Price: link.Price, + LinkIdentifier: link.LinkIdentifier, + CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), + }) + } + + resp = &types.AdminGetAgentLinkListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go new file mode 100644 index 0000000..400a4a3 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go @@ -0,0 +1,115 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentListLogic { + return &AdminGetAgentListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListReq) (resp *types.AdminGetAgentListResp, err error) { + builder := l.svcCtx.AgentModel.SelectBuilder() + if req.Mobile != nil && *req.Mobile != "" { + builder = builder.Where("mobile = ?", *req.Mobile) + } + if req.Region != nil && *req.Region != "" { + builder = builder.Where("region = ?", *req.Region) + } + + // 新增:如果传入ParentAgentId,则查找其所有1级下级代理 + if req.ParentAgentId != nil { + closureBuilder := l.svcCtx.AgentClosureModel.SelectBuilder().Where("ancestor_id = ? AND depth = 1", *req.ParentAgentId) + closures, cerr := l.svcCtx.AgentClosureModel.FindAll(l.ctx, closureBuilder, "") + if cerr != nil { + return nil, cerr + } + if len(closures) == 0 { + resp = &types.AdminGetAgentListResp{Total: 0, Items: []types.AgentListItem{}} + return resp, nil + } + ids := make([]int64, 0, len(closures)) + for _, c := range closures { + ids = append(ids, c.DescendantId) + } + builder = builder.Where("id IN (?)", ids) + } + + agents, total, err := l.svcCtx.AgentModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, err + } + + items := make([]types.AgentListItem, 0, len(agents)) + + for _, agent := range agents { + item := types.AgentListItem{ + Id: agent.Id, + UserId: agent.UserId, + LevelName: agent.LevelName, + Region: agent.Region, + CreateTime: agent.CreateTime.Format("2006-01-02 15:04:05"), + } + if req.ParentAgentId != nil { + item.ParentAgentId = *req.ParentAgentId + } + agent.Mobile, err = crypto.DecryptMobile(agent.Mobile, l.svcCtx.Config.Encrypt.SecretKey) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理信息, 解密手机号失败: %v", err) + } + item.Mobile = agent.Mobile + if agent.MembershipExpiryTime.Valid { + item.MembershipExpiryTime = agent.MembershipExpiryTime.Time.Format("2006-01-02 15:04:05") + } + + // 查询钱包信息 + wallet, _ := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agent.Id) + if wallet != nil { + item.Balance = wallet.Balance + item.TotalEarnings = wallet.TotalEarnings + item.FrozenBalance = wallet.FrozenBalance + item.WithdrawnAmount = wallet.WithdrawnAmount + } + + // 查询实名认证信息 + realNameInfo, _ := l.svcCtx.AgentRealNameModel.FindOneByAgentId(l.ctx, agent.Id) + if realNameInfo != nil { + item.IsRealNameVerified = realNameInfo.Status == model.AgentRealNameStatusApproved + item.RealName = realNameInfo.Name + item.IdCard = realNameInfo.IdCard + item.RealNameStatus = realNameInfo.Status + } else { + item.IsRealNameVerified = false + item.RealName = "" + item.IdCard = "" + item.RealNameStatus = "" + } + + items = append(items, item) + } + + resp = &types.AdminGetAgentListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentmembershipconfiglistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentmembershipconfiglistlogic.go new file mode 100644 index 0000000..0014a65 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentmembershipconfiglistlogic.go @@ -0,0 +1,51 @@ +package admin_agent + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentMembershipConfigListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentMembershipConfigListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentMembershipConfigListLogic { + return &AdminGetAgentMembershipConfigListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentMembershipConfigListLogic) AdminGetAgentMembershipConfigList(req *types.AdminGetAgentMembershipConfigListReq) (resp *types.AdminGetAgentMembershipConfigListResp, err error) { + builder := l.svcCtx.AgentMembershipConfigModel.SelectBuilder() + if req.LevelName != nil && *req.LevelName != "" { + builder = builder.Where(squirrel.Eq{"level_name": *req.LevelName}) + } + list, total, err := l.svcCtx.AgentMembershipConfigModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, err + } + items := make([]types.AgentMembershipConfigListItem, 0, len(list)) + for _, v := range list { + var item types.AgentMembershipConfigListItem + if err := copier.Copy(&item, v); err != nil { + l.Logger.Errorf("copy error: %v", err) + continue + } + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentMembershipConfigListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentmembershiprechargeorderlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentmembershiprechargeorderlistlogic.go new file mode 100644 index 0000000..6476d82 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentmembershiprechargeorderlistlogic.go @@ -0,0 +1,64 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentMembershipRechargeOrderListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentMembershipRechargeOrderListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentMembershipRechargeOrderListLogic { + return &AdminGetAgentMembershipRechargeOrderListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentMembershipRechargeOrderListLogic) AdminGetAgentMembershipRechargeOrderList(req *types.AdminGetAgentMembershipRechargeOrderListReq) (resp *types.AdminGetAgentMembershipRechargeOrderListResp, err error) { + builder := l.svcCtx.AgentMembershipRechargeOrderModel.SelectBuilder() + if req.UserId != nil { + builder = builder.Where(squirrel.Eq{"user_id": *req.UserId}) + } + if req.AgentId != nil { + builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId}) + } + if req.OrderNo != nil && *req.OrderNo != "" { + builder = builder.Where(squirrel.Eq{"order_no": *req.OrderNo}) + } + if req.PlatformOrderId != nil && *req.PlatformOrderId != "" { + builder = builder.Where(squirrel.Eq{"platform_order_id": *req.PlatformOrderId}) + } + if req.Status != nil && *req.Status != "" { + builder = builder.Where(squirrel.Eq{"status": *req.Status}) + } + if req.PaymentMethod != nil && *req.PaymentMethod != "" { + builder = builder.Where(squirrel.Eq{"payment_method": *req.PaymentMethod}) + } + list, total, err := l.svcCtx.AgentMembershipRechargeOrderModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + items := make([]types.AgentMembershipRechargeOrderListItem, 0, len(list)) + for _, v := range list { + item := types.AgentMembershipRechargeOrderListItem{} + _ = copier.Copy(&item, v) + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentMembershipRechargeOrderListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentplatformdeductionlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentplatformdeductionlistlogic.go new file mode 100644 index 0000000..b163e5a --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentplatformdeductionlistlogic.go @@ -0,0 +1,57 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentPlatformDeductionListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentPlatformDeductionListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentPlatformDeductionListLogic { + return &AdminGetAgentPlatformDeductionListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentPlatformDeductionListLogic) AdminGetAgentPlatformDeductionList(req *types.AdminGetAgentPlatformDeductionListReq) (resp *types.AdminGetAgentPlatformDeductionListResp, err error) { + builder := l.svcCtx.AgentPlatformDeductionModel.SelectBuilder() + if req.AgentId != nil { + builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId}) + } + if req.Type != nil && *req.Type != "" { + builder = builder.Where(squirrel.Eq{"type": *req.Type}) + } + if req.Status != nil { + builder = builder.Where(squirrel.Eq{"status": *req.Status}) + } + + list, total, err := l.svcCtx.AgentPlatformDeductionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + + items := make([]types.AgentPlatformDeductionListItem, 0, len(list)) + for _, v := range list { + item := types.AgentPlatformDeductionListItem{} + _ = copier.Copy(&item, v) + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentPlatformDeductionListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentproductionconfiglistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentproductionconfiglistlogic.go new file mode 100644 index 0000000..6473707 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentproductionconfiglistlogic.go @@ -0,0 +1,74 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentProductionConfigListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentProductionConfigListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentProductionConfigListLogic { + return &AdminGetAgentProductionConfigListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentProductionConfigListLogic) AdminGetAgentProductionConfigList(req *types.AdminGetAgentProductionConfigListReq) (resp *types.AdminGetAgentProductionConfigListResp, err error) { + builder := l.svcCtx.AgentProductConfigModel.SelectBuilder() + if req.ProductName != nil && *req.ProductName != "" { + products, err := l.svcCtx.ProductModel.FindAll(l.ctx, l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"product_name": *req.ProductName}), "") + if err != nil || len(products) == 0 { + return &types.AdminGetAgentProductionConfigListResp{Total: 0, Items: []types.AgentProductionConfigItem{}}, nil + } + builder = builder.Where(squirrel.Eq{"product_id": products[0].Id}) + } + if req.Id != nil { + builder = builder.Where(squirrel.Eq{"id": *req.Id}) + } + list, total, err := l.svcCtx.AgentProductConfigModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + // 查询所有涉及到的product_id对应的product_name + productIdSet := make(map[int64]struct{}) + for _, v := range list { + productIdSet[v.ProductId] = struct{}{} + } + productIdArr := make([]int64, 0, len(productIdSet)) + for id := range productIdSet { + productIdArr = append(productIdArr, id) + } + productNameMap := make(map[int64]string) + if len(productIdArr) > 0 { + build := l.svcCtx.ProductModel.SelectBuilder().Where(squirrel.Eq{"id": productIdArr}) + products, _ := l.svcCtx.ProductModel.FindAll(l.ctx, build, "") + for _, p := range products { + productNameMap[p.Id] = p.ProductName + } + } + items := make([]types.AgentProductionConfigItem, 0, len(list)) + for _, v := range list { + item := types.AgentProductionConfigItem{} + _ = copier.Copy(&item, v) + item.ProductName = productNameMap[v.ProductId] + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentProductionConfigListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentrewardlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentrewardlistlogic.go new file mode 100644 index 0000000..2621ebd --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentrewardlistlogic.go @@ -0,0 +1,58 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentRewardListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentRewardListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentRewardListLogic { + return &AdminGetAgentRewardListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentRewardListLogic) AdminGetAgentRewardList(req *types.AdminGetAgentRewardListReq) (resp *types.AdminGetAgentRewardListResp, err error) { + builder := l.svcCtx.AgentRewardsModel.SelectBuilder() + if req.AgentId != nil { + builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId}) + } + if req.RelationAgentId != nil { + builder = builder.Where(squirrel.Eq{"relation_agent_id": *req.RelationAgentId}) + } + if req.Type != nil && *req.Type != "" { + builder = builder.Where(squirrel.Eq{"type": *req.Type}) + } + list, total, err := l.svcCtx.AgentRewardsModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + items := make([]types.AgentRewardListItem, 0, len(list)) + for _, v := range list { + item := types.AgentRewardListItem{} + _ = copier.Copy(&item, v) + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + if v.RelationAgentId.Valid { + item.RelationAgentId = v.RelationAgentId.Int64 + } + items = append(items, item) + } + resp = &types.AdminGetAgentRewardListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/admingetagentwithdrawallistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentwithdrawallistlogic.go new file mode 100644 index 0000000..8bdac3e --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/admingetagentwithdrawallistlogic.go @@ -0,0 +1,59 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetAgentWithdrawalListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetAgentWithdrawalListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentWithdrawalListLogic { + return &AdminGetAgentWithdrawalListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetAgentWithdrawalListLogic) AdminGetAgentWithdrawalList(req *types.AdminGetAgentWithdrawalListReq) (resp *types.AdminGetAgentWithdrawalListResp, err error) { + builder := l.svcCtx.AgentWithdrawalModel.SelectBuilder() + if req.AgentId != nil { + builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId}) + } + if req.Status != nil { + builder = builder.Where(squirrel.Eq{"status": *req.Status}) + } + if req.WithdrawNo != nil && *req.WithdrawNo != "" { + builder = builder.Where(squirrel.Eq{"withdraw_no": *req.WithdrawNo}) + } + list, total, err := l.svcCtx.AgentWithdrawalModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, err + } + items := make([]types.AgentWithdrawalListItem, 0, len(list)) + for _, v := range list { + item := types.AgentWithdrawalListItem{} + _ = copier.Copy(&item, v) + item.Remark = "" + if v.Remark.Valid { + item.Remark = v.Remark.String + } + item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05") + items = append(items, item) + } + resp = &types.AdminGetAgentWithdrawalListResp{ + Total: total, + Items: items, + } + return +} diff --git a/app/main/api/internal/logic/admin_agent/adminupdateagentmembershipconfiglogic.go b/app/main/api/internal/logic/admin_agent/adminupdateagentmembershipconfiglogic.go new file mode 100644 index 0000000..e642863 --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/adminupdateagentmembershipconfiglogic.go @@ -0,0 +1,96 @@ +package admin_agent + +import ( + "context" + "database/sql" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUpdateAgentMembershipConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateAgentMembershipConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateAgentMembershipConfigLogic { + return &AdminUpdateAgentMembershipConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateAgentMembershipConfigLogic) AdminUpdateAgentMembershipConfig(req *types.AdminUpdateAgentMembershipConfigReq) (resp *types.AdminUpdateAgentMembershipConfigResp, err error) { + cfg, err := l.svcCtx.AgentMembershipConfigModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, err + } + cfg.LevelName = req.LevelName + cfg.Price = sql.NullFloat64{Float64: req.Price, Valid: true} + cfg.ReportCommission = sql.NullFloat64{Float64: req.ReportCommission, Valid: true} + if req.LowerActivityReward == nil { + cfg.LowerActivityReward = sql.NullFloat64{Valid: false} + } else { + cfg.LowerActivityReward = sql.NullFloat64{Float64: *req.LowerActivityReward, Valid: true} + } + if req.NewActivityReward == nil { + cfg.NewActivityReward = sql.NullFloat64{Valid: false} + } else { + cfg.NewActivityReward = sql.NullFloat64{Float64: *req.NewActivityReward, Valid: true} + } + if req.LowerStandardCount == nil { + cfg.LowerStandardCount = sql.NullInt64{Valid: false} + } else { + cfg.LowerStandardCount = sql.NullInt64{Int64: *req.LowerStandardCount, Valid: true} + } + if req.NewLowerStandardCount == nil { + cfg.NewLowerStandardCount = sql.NullInt64{Valid: false} + } else { + cfg.NewLowerStandardCount = sql.NullInt64{Int64: *req.NewLowerStandardCount, Valid: true} + } + if req.LowerWithdrawRewardRatio == nil { + cfg.LowerWithdrawRewardRatio = sql.NullFloat64{Valid: false} + } else { + cfg.LowerWithdrawRewardRatio = sql.NullFloat64{Float64: *req.LowerWithdrawRewardRatio, Valid: true} + } + if req.LowerConvertVipReward == nil { + cfg.LowerConvertVipReward = sql.NullFloat64{Valid: false} + } else { + cfg.LowerConvertVipReward = sql.NullFloat64{Float64: *req.LowerConvertVipReward, Valid: true} + } + if req.LowerConvertSvipReward == nil { + cfg.LowerConvertSvipReward = sql.NullFloat64{Valid: false} + } else { + cfg.LowerConvertSvipReward = sql.NullFloat64{Float64: *req.LowerConvertSvipReward, Valid: true} + } + if req.ExemptionAmount == nil { + cfg.ExemptionAmount = sql.NullFloat64{Valid: false} + } else { + cfg.ExemptionAmount = sql.NullFloat64{Float64: *req.ExemptionAmount, Valid: true} + } + if req.PriceIncreaseMax == nil { + cfg.PriceIncreaseMax = sql.NullFloat64{Valid: false} + } else { + cfg.PriceIncreaseMax = sql.NullFloat64{Float64: *req.PriceIncreaseMax, Valid: true} + } + if req.PriceRatio == nil { + cfg.PriceRatio = sql.NullFloat64{Valid: false} + } else { + cfg.PriceRatio = sql.NullFloat64{Float64: *req.PriceRatio, Valid: true} + } + if req.PriceIncreaseAmount == nil { + cfg.PriceIncreaseAmount = sql.NullFloat64{Valid: false} + } else { + cfg.PriceIncreaseAmount = sql.NullFloat64{Float64: *req.PriceIncreaseAmount, Valid: true} + } + _, err = l.svcCtx.AgentMembershipConfigModel.Update(l.ctx, nil, cfg) + if err != nil { + return nil, err + } + resp = &types.AdminUpdateAgentMembershipConfigResp{Success: true} + return +} diff --git a/app/main/api/internal/logic/admin_agent/adminupdateagentproductionconfiglogic.go b/app/main/api/internal/logic/admin_agent/adminupdateagentproductionconfiglogic.go new file mode 100644 index 0000000..9a4787a --- /dev/null +++ b/app/main/api/internal/logic/admin_agent/adminupdateagentproductionconfiglogic.go @@ -0,0 +1,42 @@ +package admin_agent + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUpdateAgentProductionConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateAgentProductionConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateAgentProductionConfigLogic { + return &AdminUpdateAgentProductionConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateAgentProductionConfigLogic) AdminUpdateAgentProductionConfig(req *types.AdminUpdateAgentProductionConfigReq) (resp *types.AdminUpdateAgentProductionConfigResp, err error) { + cfg, err := l.svcCtx.AgentProductConfigModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, err + } + cfg.CostPrice = req.CostPrice + cfg.PriceRangeMin = req.PriceRangeMin + cfg.PriceRangeMax = req.PriceRangeMax + cfg.PricingStandard = req.PricingStandard + cfg.OverpricingRatio = req.OverpricingRatio + _, err = l.svcCtx.AgentProductConfigModel.Update(l.ctx, nil, cfg) + if err != nil { + return nil, err + } + resp = &types.AdminUpdateAgentProductionConfigResp{Success: true} + return +} diff --git a/app/main/api/internal/logic/admin_auth/adminloginlogic.go b/app/main/api/internal/logic/admin_auth/adminloginlogic.go new file mode 100644 index 0000000..caaeb3b --- /dev/null +++ b/app/main/api/internal/logic/admin_auth/adminloginlogic.go @@ -0,0 +1,85 @@ +package admin_auth + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + jwtx "tydata-server/common/jwt" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminLoginLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminLoginLogic { + return &AdminLoginLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminLoginLogic) AdminLogin(req *types.AdminLoginReq) (resp *types.AdminLoginResp, err error) { + // 1. 验证验证码 + if !req.Captcha { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码错误"), "用户登录, 验证码错误, 验证码: %v", req.Captcha) + } + + // 2. 验证用户名和密码 + user, err := l.svcCtx.AdminUserModel.FindOneByUsername(l.ctx, req.Username) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名或密码错误"), "用户登录, 用户名或密码错误, 用户名: %s", req.Username) + } + + // 3. 验证密码 + if !crypto.PasswordVerify(req.Password, user.Password) { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名或密码错误"), "用户登录, 用户名或密码错误, 用户名: %s", req.Username) + } + + // 4. 获取权限 + adminUserRoleBuilder := l.svcCtx.AdminUserRoleModel.SelectBuilder().Where(squirrel.Eq{"user_id": user.Id}) + permissions, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, adminUserRoleBuilder, "role_id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("获取权限失败"), "用户登录, 获取权限失败, 用户名: %s", req.Username) + } + + // 获取角色ID数组 + roleIds := make([]int64, 0) + for _, permission := range permissions { + roleIds = append(roleIds, permission.RoleId) + } + + // 获取角色名称 + roles := make([]string, 0) + for _, roleId := range roleIds { + role, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, roleId) + if err != nil { + continue + } + roles = append(roles, role.RoleCode) + } + + // 5. 生成token + refreshToken := l.svcCtx.Config.JwtAuth.RefreshAfter + expiresAt := l.svcCtx.Config.JwtAuth.AccessExpire + token, err := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, expiresAt) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("生成token失败"), "用户登录, 生成token失败, 用户名: %s", req.Username) + } + + return &types.AdminLoginResp{ + AccessToken: token, + AccessExpire: expiresAt, + RefreshAfter: refreshToken, + Roles: roles, + }, nil +} diff --git a/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go b/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go new file mode 100644 index 0000000..efdd011 --- /dev/null +++ b/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go @@ -0,0 +1,46 @@ +package admin_feature + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminCreateFeatureLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreateFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateFeatureLogic { + return &AdminCreateFeatureLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreateFeatureLogic) AdminCreateFeature(req *types.AdminCreateFeatureReq) (resp *types.AdminCreateFeatureResp, err error) { + // 1. 数据转换 + data := &model.Feature{ + ApiId: req.ApiId, + Name: req.Name, + } + + // 2. 数据库操作 + result, err := l.svcCtx.FeatureModel.Insert(l.ctx, nil, data) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "创建功能失败, err: %v, req: %+v", err, req) + } + + // 3. 返回结果 + id, _ := result.LastInsertId() + return &types.AdminCreateFeatureResp{Id: id}, nil +} diff --git a/app/main/api/internal/logic/admin_feature/admindeletefeaturelogic.go b/app/main/api/internal/logic/admin_feature/admindeletefeaturelogic.go new file mode 100644 index 0000000..6a0cca3 --- /dev/null +++ b/app/main/api/internal/logic/admin_feature/admindeletefeaturelogic.go @@ -0,0 +1,45 @@ +package admin_feature + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminDeleteFeatureLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeleteFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteFeatureLogic { + return &AdminDeleteFeatureLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeleteFeatureLogic) AdminDeleteFeature(req *types.AdminDeleteFeatureReq) (resp *types.AdminDeleteFeatureResp, err error) { + // 1. 查询记录是否存在 + record, err := l.svcCtx.FeatureModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找功能失败, err: %v, id: %d", err, req.Id) + } + + // 2. 执行软删除 + err = l.svcCtx.FeatureModel.DeleteSoft(l.ctx, nil, record) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "删除功能失败, err: %v, id: %d", err, req.Id) + } + + // 3. 返回结果 + return &types.AdminDeleteFeatureResp{Success: true}, nil +} diff --git a/app/main/api/internal/logic/admin_feature/admingetfeaturedetaillogic.go b/app/main/api/internal/logic/admin_feature/admingetfeaturedetaillogic.go new file mode 100644 index 0000000..3738c25 --- /dev/null +++ b/app/main/api/internal/logic/admin_feature/admingetfeaturedetaillogic.go @@ -0,0 +1,46 @@ +package admin_feature + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetFeatureDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetFeatureDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetFeatureDetailLogic { + return &AdminGetFeatureDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetFeatureDetailLogic) AdminGetFeatureDetail(req *types.AdminGetFeatureDetailReq) (resp *types.AdminGetFeatureDetailResp, err error) { + // 1. 查询记录 + record, err := l.svcCtx.FeatureModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找功能失败, err: %v, id: %d", err, req.Id) + } + + // 2. 构建响应 + resp = &types.AdminGetFeatureDetailResp{ + Id: record.Id, + ApiId: record.ApiId, + Name: record.Name, + CreateTime: record.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: record.UpdateTime.Format("2006-01-02 15:04:05"), + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_feature/admingetfeaturelistlogic.go b/app/main/api/internal/logic/admin_feature/admingetfeaturelistlogic.go new file mode 100644 index 0000000..186fd0a --- /dev/null +++ b/app/main/api/internal/logic/admin_feature/admingetfeaturelistlogic.go @@ -0,0 +1,66 @@ +package admin_feature + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetFeatureListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetFeatureListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetFeatureListLogic { + return &AdminGetFeatureListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetFeatureListLogic) AdminGetFeatureList(req *types.AdminGetFeatureListReq) (resp *types.AdminGetFeatureListResp, err error) { + // 1. 构建查询条件 + builder := l.svcCtx.FeatureModel.SelectBuilder() + + // 2. 添加查询条件 + if req.ApiId != nil && *req.ApiId != "" { + builder = builder.Where("api_id LIKE ?", "%"+*req.ApiId+"%") + } + if req.Name != nil && *req.Name != "" { + builder = builder.Where("name LIKE ?", "%"+*req.Name+"%") + } + + // 3. 执行分页查询 + list, total, err := l.svcCtx.FeatureModel.FindPageListByPageWithTotal( + l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查询功能列表失败, err: %v, req: %+v", err, req) + } + + // 4. 构建响应列表 + items := make([]types.FeatureListItem, 0, len(list)) + for _, item := range list { + listItem := types.FeatureListItem{ + Id: item.Id, + ApiId: item.ApiId, + Name: item.Name, + CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"), + } + items = append(items, listItem) + } + + // 5. 返回结果 + return &types.AdminGetFeatureListResp{ + Total: total, + Items: items, + }, nil +} diff --git a/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go b/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go new file mode 100644 index 0000000..d7458e4 --- /dev/null +++ b/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go @@ -0,0 +1,30 @@ +package admin_feature + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUpdateFeatureLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateFeatureLogic { + return &AdminUpdateFeatureLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateFeatureLogic) AdminUpdateFeature(req *types.AdminUpdateFeatureReq) (resp *types.AdminUpdateFeatureResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/app/main/api/internal/logic/admin_menu/createmenulogic.go b/app/main/api/internal/logic/admin_menu/createmenulogic.go new file mode 100644 index 0000000..7c03cae --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/createmenulogic.go @@ -0,0 +1,97 @@ +package admin_menu + +import ( + "context" + "database/sql" + "encoding/json" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type CreateMenuLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCreateMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateMenuLogic { + return &CreateMenuLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *CreateMenuLogic) CreateMenu(req *types.CreateMenuReq) (resp *types.CreateMenuResp, err error) { + // 1. 参数验证 + if req.Name == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("菜单名称不能为空"), "菜单名称不能为空") + } + if req.Type == "menu" && req.Component == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("组件路径不能为空"), "组件路径不能为空") + } + + // 2. 检查名称和路径是否重复 + exists, err := l.svcCtx.AdminMenuModel.FindOneByNamePath(l.ctx, req.Name, req.Path) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, err: %v", err) + } + if exists != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("菜单名称或路径已存在"), "菜单名称或路径已存在") + } + + // 3. 检查父菜单是否存在(如果不是根菜单) + if req.Pid > 0 { + parentMenu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Pid) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询父菜单失败, id: %d, err: %v", req.Pid, err) + } + if parentMenu == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %d", req.Pid) + } + } + + // 4. 将类型标签转换为值 + typeValue, err := l.svcCtx.DictService.GetDictValue(l.ctx, "admin_menu_type", req.Type) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "菜单类型无效: %v", err) + } + + // 5. 创建菜单记录 + menu := &model.AdminMenu{ + Pid: req.Pid, + Name: req.Name, + Path: req.Path, + Component: req.Component, + Redirect: sql.NullString{String: req.Redirect, Valid: req.Redirect != ""}, + Status: req.Status, + Type: typeValue, + Sort: req.Sort, + CreateTime: time.Now(), + UpdateTime: time.Now(), + } + + // 将Meta转换为JSON字符串 + metaJson, err := json.Marshal(req.Meta) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "Meta数据格式错误: %v", err) + } + menu.Meta = string(metaJson) + + // 6. 保存到数据库 + _, err = l.svcCtx.AdminMenuModel.Insert(l.ctx, nil, menu) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建菜单失败, err: %v", err) + } + + return &types.CreateMenuResp{ + Id: menu.Id, + }, nil +} diff --git a/app/main/api/internal/logic/admin_menu/deletemenulogic.go b/app/main/api/internal/logic/admin_menu/deletemenulogic.go new file mode 100644 index 0000000..769b26c --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/deletemenulogic.go @@ -0,0 +1,30 @@ +package admin_menu + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type DeleteMenuLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteMenuLogic { + return &DeleteMenuLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *DeleteMenuLogic) DeleteMenu(req *types.DeleteMenuReq) (resp *types.DeleteMenuResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/app/main/api/internal/logic/admin_menu/getmenualllogic.go b/app/main/api/internal/logic/admin_menu/getmenualllogic.go new file mode 100644 index 0000000..64af203 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/getmenualllogic.go @@ -0,0 +1,250 @@ +package admin_menu + +import ( + "context" + "sort" + "strconv" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/Masterminds/squirrel" + "github.com/bytedance/sonic" + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetMenuAllLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetMenuAllLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMenuAllLogic { + return &GetMenuAllLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.GetMenuAllResp, err error) { + userId, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败, %+v", err) + } + + // 使用MapReduceVoid并发获取用户角色 + var roleIds []int64 + var permissions []*struct { + RoleId int64 + } + + type UserRoleResult struct { + RoleId int64 + } + + err = mr.MapReduceVoid( + func(source chan<- interface{}) { + adminUserRoleBuilder := l.svcCtx.AdminUserRoleModel.SelectBuilder().Where(squirrel.Eq{"user_id": userId}) + source <- adminUserRoleBuilder + }, + func(item interface{}, writer mr.Writer[*UserRoleResult], cancel func(error)) { + builder := item.(squirrel.SelectBuilder) + result, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, builder, "role_id DESC") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户角色信息失败, %+v", err)) + return + } + + for _, r := range result { + writer.Write(&UserRoleResult{RoleId: r.RoleId}) + } + }, + func(pipe <-chan *UserRoleResult, cancel func(error)) { + for item := range pipe { + permissions = append(permissions, &struct{ RoleId int64 }{RoleId: item.RoleId}) + } + }, + ) + if err != nil { + return nil, err + } + + for _, permission := range permissions { + roleIds = append(roleIds, permission.RoleId) + } + + // 使用MapReduceVoid并发获取角色菜单 + var menuIds []int64 + var roleMenus []*struct { + MenuId int64 + } + + type RoleMenuResult struct { + MenuId int64 + } + + err = mr.MapReduceVoid( + func(source chan<- interface{}) { + getRoleMenuBuilder := l.svcCtx.AdminRoleMenuModel.SelectBuilder().Where(squirrel.Eq{"role_id": roleIds}) + source <- getRoleMenuBuilder + }, + func(item interface{}, writer mr.Writer[*RoleMenuResult], cancel func(error)) { + builder := item.(squirrel.SelectBuilder) + result, err := l.svcCtx.AdminRoleMenuModel.FindAll(l.ctx, builder, "id DESC") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取角色菜单信息失败, %+v", err)) + return + } + + for _, r := range result { + writer.Write(&RoleMenuResult{MenuId: r.MenuId}) + } + }, + func(pipe <-chan *RoleMenuResult, cancel func(error)) { + for item := range pipe { + roleMenus = append(roleMenus, &struct{ MenuId int64 }{MenuId: item.MenuId}) + } + }, + ) + if err != nil { + return nil, err + } + + for _, roleMenu := range roleMenus { + menuIds = append(menuIds, roleMenu.MenuId) + } + + // 使用MapReduceVoid并发获取菜单 + type AdminMenuStruct struct { + Id int64 + Pid int64 + Name string + Path string + Component string + Redirect struct { + String string + Valid bool + } + Meta string + Sort int64 + Type int64 + Status int64 + } + + var menus []*AdminMenuStruct + + err = mr.MapReduceVoid( + func(source chan<- interface{}) { + adminMenuBuilder := l.svcCtx.AdminMenuModel.SelectBuilder().Where(squirrel.Eq{"id": menuIds}) + source <- adminMenuBuilder + }, + func(item interface{}, writer mr.Writer[*AdminMenuStruct], cancel func(error)) { + builder := item.(squirrel.SelectBuilder) + result, err := l.svcCtx.AdminMenuModel.FindAll(l.ctx, builder, "sort ASC") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取菜单信息失败, %+v", err)) + return + } + + for _, r := range result { + menu := &AdminMenuStruct{ + Id: r.Id, + Pid: r.Pid, + Name: r.Name, + Path: r.Path, + Component: r.Component, + Redirect: r.Redirect, + Meta: r.Meta, + Sort: r.Sort, + Type: r.Type, + Status: r.Status, + } + writer.Write(menu) + } + }, + func(pipe <-chan *AdminMenuStruct, cancel func(error)) { + for item := range pipe { + menus = append(menus, item) + } + }, + ) + if err != nil { + return nil, err + } + + // 转换为types.Menu结构并存储到映射表 + menuMap := make(map[string]types.GetMenuAllResp) + for _, menu := range menus { + // 只处理状态正常的菜单 + if menu.Status != 1 { + continue + } + + meta := make(map[string]interface{}) + err = sonic.Unmarshal([]byte(menu.Meta), &meta) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解析菜单Meta信息失败, %+v", err) + } + + redirect := func() string { + if menu.Redirect.Valid { + return menu.Redirect.String + } + return "" + }() + + menuId := strconv.FormatInt(menu.Id, 10) + menuMap[menuId] = types.GetMenuAllResp{ + Name: menu.Name, + Path: menu.Path, + Redirect: redirect, + Component: menu.Component, + Sort: menu.Sort, + Meta: meta, + Children: make([]types.GetMenuAllResp, 0), + } + } + + // 按ParentId将菜单分组 + menuGroups := lo.GroupBy(menus, func(item *AdminMenuStruct) int64 { + return item.Pid + }) + + // 递归构建菜单树 + var buildMenuTree func(parentId int64) []types.GetMenuAllResp + buildMenuTree = func(parentId int64) []types.GetMenuAllResp { + children := make([]types.GetMenuAllResp, 0) + + childMenus, ok := menuGroups[parentId] + if !ok { + return children + } + + // 按Sort排序 + sort.Slice(childMenus, func(i, j int) bool { + return childMenus[i].Sort < childMenus[j].Sort + }) + + for _, childMenu := range childMenus { + menuId := strconv.FormatInt(childMenu.Id, 10) + if menu, exists := menuMap[menuId]; exists && childMenu.Status == 1 { + // 递归构建子菜单 + menu.Children = buildMenuTree(childMenu.Id) + children = append(children, menu) + } + } + + return children + } + + // 从根菜单开始构建(ParentId为0的是根菜单) + menuTree := buildMenuTree(0) + + return &menuTree, nil +} diff --git a/app/main/api/internal/logic/admin_menu/getmenudetaillogic.go b/app/main/api/internal/logic/admin_menu/getmenudetaillogic.go new file mode 100644 index 0000000..c48c118 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/getmenudetaillogic.go @@ -0,0 +1,30 @@ +package admin_menu + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetMenuDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetMenuDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMenuDetailLogic { + return &GetMenuDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMenuDetailLogic) GetMenuDetail(req *types.GetMenuDetailReq) (resp *types.GetMenuDetailResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/app/main/api/internal/logic/admin_menu/getmenulistlogic.go b/app/main/api/internal/logic/admin_menu/getmenulistlogic.go new file mode 100644 index 0000000..b919ded --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/getmenulistlogic.go @@ -0,0 +1,109 @@ +package admin_menu + +import ( + "context" + "encoding/json" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type GetMenuListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetMenuListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMenuListLogic { + return &GetMenuListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMenuListLogic) GetMenuList(req *types.GetMenuListReq) (resp []types.MenuListItem, err error) { + // 构建查询条件 + builder := l.svcCtx.AdminMenuModel.SelectBuilder() + + // 添加筛选条件 + if len(req.Name) > 0 { + builder = builder.Where("name LIKE ?", "%"+req.Name+"%") + } + if len(req.Path) > 0 { + builder = builder.Where("path LIKE ?", "%"+req.Path+"%") + } + if req.Status != -1 { + builder = builder.Where("status = ?", req.Status) + } + if req.Type != "" { + builder = builder.Where("type = ?", req.Type) + } + + // 排序但不分页,获取所有符合条件的菜单 + builder = builder.OrderBy("sort ASC") + + // 获取所有菜单 + menus, err := l.svcCtx.AdminMenuModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, err: %v", err) + } + + // 将菜单按ID存入map + menuMap := make(map[int64]types.MenuListItem) + for _, menu := range menus { + var meta map[string]interface{} + err := json.Unmarshal([]byte(menu.Meta), &meta) + if err != nil { + logx.Errorf("解析Meta字段失败: %v", err) + meta = make(map[string]interface{}) + } + menuType, err := l.svcCtx.DictService.GetDictLabel(l.ctx, "admin_menu_type", menu.Type) + if err != nil { + logx.Errorf("获取菜单类型失败: %v", err) + menuType = "" + } + item := types.MenuListItem{ + Id: menu.Id, + Pid: menu.Pid, + Name: menu.Name, + Path: menu.Path, + Component: menu.Component, + Redirect: menu.Redirect.String, + Meta: meta, + Status: menu.Status, + Type: menuType, + Sort: menu.Sort, + CreateTime: menu.CreateTime.Format("2006-01-02 15:04:05"), + Children: make([]types.MenuListItem, 0), + } + menuMap[menu.Id] = item + } + + // 构建父子关系 + for _, menu := range menus { + if menu.Pid > 0 { + // 找到父菜单 + if parent, exists := menuMap[menu.Pid]; exists { + // 添加当前菜单到父菜单的子菜单列表 + children := append(parent.Children, menuMap[menu.Id]) + parent.Children = children + menuMap[menu.Pid] = parent + } + } + } + + // 提取顶级菜单(ParentId为0)到响应列表 + result := make([]types.MenuListItem, 0) + for _, menu := range menus { + if menu.Pid == 0 { + result = append(result, menuMap[menu.Id]) + } + } + + return result, nil +} diff --git a/app/main/api/internal/logic/admin_menu/updatemenulogic.go b/app/main/api/internal/logic/admin_menu/updatemenulogic.go new file mode 100644 index 0000000..bddf006 --- /dev/null +++ b/app/main/api/internal/logic/admin_menu/updatemenulogic.go @@ -0,0 +1,96 @@ +package admin_menu + +import ( + "context" + "database/sql" + "encoding/json" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdateMenuLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdateMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateMenuLogic { + return &UpdateMenuLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdateMenuLogic) UpdateMenu(req *types.UpdateMenuReq) (resp *types.UpdateMenuResp, err error) { + // 1. 检查菜单是否存在 + menu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, id: %d, err: %v", req.Id, err) + } + if menu == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "菜单不存在, id: %d", req.Id) + } + + // 2. 将类型标签转换为值 + typeValue, err := l.svcCtx.DictService.GetDictValue(l.ctx, "admin_menu_type", req.Type) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "菜单类型无效: %v", err) + } + + // 3. 检查父菜单是否存在(如果不是根菜单) + if req.Pid > 0 { + parentMenu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Pid) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询父菜单失败, id: %d, err: %v", req.Pid, err) + } + if parentMenu == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %d", req.Pid) + } + } + + // 4. 检查名称和路径是否重复 + if req.Name != menu.Name || req.Path != menu.Path { + exists, err := l.svcCtx.AdminMenuModel.FindOneByNamePath(l.ctx, req.Name, req.Path) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询菜单失败, err: %v", err) + } + if exists != nil && exists.Id != req.Id { + return nil, errors.Wrapf(xerr.NewErrMsg("菜单名称或路径已存在"), "菜单名称或路径已存在") + } + } + + // 5. 更新菜单信息 + + menu.Pid = req.Pid + menu.Name = req.Name + menu.Path = req.Path + menu.Component = req.Component + menu.Redirect = sql.NullString{String: req.Redirect, Valid: req.Redirect != ""} + menu.Status = req.Status + menu.Type = typeValue + menu.Sort = req.Sort + + // 将Meta转换为JSON字符串 + metaJson, err := json.Marshal(req.Meta) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "Meta数据格式错误: %v", err) + } + menu.Meta = string(metaJson) + + // 6. 保存更新 + _, err = l.svcCtx.AdminMenuModel.Update(l.ctx, nil, menu) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新菜单失败, err: %v", err) + } + + return &types.UpdateMenuResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go b/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go new file mode 100644 index 0000000..1a15d69 --- /dev/null +++ b/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go @@ -0,0 +1,50 @@ +package admin_notification + +import ( + "context" + "database/sql" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminCreateNotificationLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreateNotificationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateNotificationLogic { + return &AdminCreateNotificationLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreateNotificationLogic) AdminCreateNotification(req *types.AdminCreateNotificationReq) (resp *types.AdminCreateNotificationResp, err error) { + startDate, _ := time.Parse("2006-01-02", req.StartDate) + endDate, _ := time.Parse("2006-01-02", req.EndDate) + data := &model.GlobalNotifications{ + Title: req.Title, + Content: req.Content, + NotificationPage: req.NotificationPage, + StartDate: sql.NullTime{Time: startDate, Valid: req.StartDate != ""}, + EndDate: sql.NullTime{Time: endDate, Valid: req.EndDate != ""}, + StartTime: req.StartTime, + EndTime: req.EndTime, + Status: req.Status, + } + result, err := l.svcCtx.GlobalNotificationsModel.Insert(l.ctx, nil, data) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建通知失败, err: %v, req: %+v", err, req) + } + id, _ := result.LastInsertId() + return &types.AdminCreateNotificationResp{Id: id}, nil +} diff --git a/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go b/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go new file mode 100644 index 0000000..76f3994 --- /dev/null +++ b/app/main/api/internal/logic/admin_notification/admindeletenotificationlogic.go @@ -0,0 +1,38 @@ +package admin_notification + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminDeleteNotificationLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeleteNotificationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteNotificationLogic { + return &AdminDeleteNotificationLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeleteNotificationLogic) AdminDeleteNotification(req *types.AdminDeleteNotificationReq) (resp *types.AdminDeleteNotificationResp, err error) { + notification, err := l.svcCtx.GlobalNotificationsModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找通知失败, err: %v, id: %d", err, req.Id) + } + err = l.svcCtx.GlobalNotificationsModel.DeleteSoft(l.ctx, nil, notification) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除通知失败, err: %v, id: %d", err, req.Id) + } + return &types.AdminDeleteNotificationResp{Success: true}, nil +} diff --git a/app/main/api/internal/logic/admin_notification/admingetnotificationdetaillogic.go b/app/main/api/internal/logic/admin_notification/admingetnotificationdetaillogic.go new file mode 100644 index 0000000..8b2df52 --- /dev/null +++ b/app/main/api/internal/logic/admin_notification/admingetnotificationdetaillogic.go @@ -0,0 +1,53 @@ +package admin_notification + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetNotificationDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetNotificationDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetNotificationDetailLogic { + return &AdminGetNotificationDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetNotificationDetailLogic) AdminGetNotificationDetail(req *types.AdminGetNotificationDetailReq) (resp *types.AdminGetNotificationDetailResp, err error) { + notification, err := l.svcCtx.GlobalNotificationsModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找通知失败, err: %v, id: %d", err, req.Id) + } + resp = &types.AdminGetNotificationDetailResp{ + Id: notification.Id, + Title: notification.Title, + Content: notification.Content, + NotificationPage: notification.NotificationPage, + StartDate: "", + StartTime: notification.StartTime, + EndDate: "", + EndTime: notification.EndTime, + Status: notification.Status, + CreateTime: notification.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: notification.UpdateTime.Format("2006-01-02 15:04:05"), + } + if notification.StartDate.Valid { + resp.StartDate = notification.StartDate.Time.Format("2006-01-02") + } + if notification.EndDate.Valid { + resp.EndDate = notification.EndDate.Time.Format("2006-01-02") + } + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_notification/admingetnotificationlistlogic.go b/app/main/api/internal/logic/admin_notification/admingetnotificationlistlogic.go new file mode 100644 index 0000000..671466a --- /dev/null +++ b/app/main/api/internal/logic/admin_notification/admingetnotificationlistlogic.go @@ -0,0 +1,82 @@ +package admin_notification + +import ( + "context" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetNotificationListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetNotificationListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetNotificationListLogic { + return &AdminGetNotificationListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetNotificationListLogic) AdminGetNotificationList(req *types.AdminGetNotificationListReq) (resp *types.AdminGetNotificationListResp, err error) { + builder := l.svcCtx.GlobalNotificationsModel.SelectBuilder() + if req.Title != nil { + builder = builder.Where("title LIKE ?", "%"+*req.Title+"%") + } + if req.NotificationPage != nil { + builder = builder.Where("notification_page = ?", *req.NotificationPage) + } + if req.Status != nil { + builder = builder.Where("status = ?", *req.Status) + } + if req.StartDate != nil { + if t, err := time.Parse("2006-01-02", *req.StartDate); err == nil { + builder = builder.Where("start_date >= ?", t) + } + } + if req.EndDate != nil { + if t, err := time.Parse("2006-01-02", *req.EndDate); err == nil { + builder = builder.Where("end_date <= ?", t) + } + } + list, total, err := l.svcCtx.GlobalNotificationsModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询通知列表失败, err: %v, req: %+v", err, req) + } + items := make([]types.NotificationListItem, 0, len(list)) + for _, n := range list { + item := types.NotificationListItem{ + Id: n.Id, + Title: n.Title, + NotificationPage: n.NotificationPage, + Content: n.Content, + StartDate: "", + StartTime: n.StartTime, + EndDate: "", + EndTime: n.EndTime, + Status: n.Status, + CreateTime: n.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: n.UpdateTime.Format("2006-01-02 15:04:05"), + } + if n.StartDate.Valid { + item.StartDate = n.StartDate.Time.Format("2006-01-02") + } + if n.EndDate.Valid { + item.EndDate = n.EndDate.Time.Format("2006-01-02") + } + items = append(items, item) + } + resp = &types.AdminGetNotificationListResp{ + Total: total, + Items: items, + } + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go b/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go new file mode 100644 index 0000000..3c00dee --- /dev/null +++ b/app/main/api/internal/logic/admin_notification/adminupdatenotificationlogic.go @@ -0,0 +1,66 @@ +package admin_notification + +import ( + "context" + "database/sql" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUpdateNotificationLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateNotificationLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateNotificationLogic { + return &AdminUpdateNotificationLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateNotificationLogic) AdminUpdateNotification(req *types.AdminUpdateNotificationReq) (resp *types.AdminUpdateNotificationResp, err error) { + notification, err := l.svcCtx.GlobalNotificationsModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找通知失败, err: %v, id: %d", err, req.Id) + } + if req.StartDate != nil { + startDate, _ := time.Parse("2006-01-02", *req.StartDate) + notification.StartDate = sql.NullTime{Time: startDate, Valid: true} + } + if req.EndDate != nil { + endDate, _ := time.Parse("2006-01-02", *req.EndDate) + notification.EndDate = sql.NullTime{Time: endDate, Valid: true} + } + if req.Title != nil { + notification.Title = *req.Title + } + if req.Content != nil { + notification.Content = *req.Content + } + if req.NotificationPage != nil { + notification.NotificationPage = *req.NotificationPage + } + if req.StartTime != nil { + notification.StartTime = *req.StartTime + } + if req.EndTime != nil { + notification.EndTime = *req.EndTime + } + if req.Status != nil { + notification.Status = *req.Status + } + _, err = l.svcCtx.GlobalNotificationsModel.Update(l.ctx, nil, notification) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新通知失败, err: %v, req: %+v", err, req) + } + return &types.AdminUpdateNotificationResp{Success: true}, nil +} diff --git a/app/main/api/internal/logic/admin_order/admincreateorderlogic.go b/app/main/api/internal/logic/admin_order/admincreateorderlogic.go new file mode 100644 index 0000000..d2dc75f --- /dev/null +++ b/app/main/api/internal/logic/admin_order/admincreateorderlogic.go @@ -0,0 +1,99 @@ +package admin_order + +import ( + "context" + "database/sql" + "fmt" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminCreateOrderLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreateOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateOrderLogic { + return &AdminCreateOrderLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreateOrderLogic) AdminCreateOrder(req *types.AdminCreateOrderReq) (resp *types.AdminCreateOrderResp, err error) { + // 生成订单号 + orderNo := fmt.Sprintf("%dADMIN", time.Now().UnixNano()) + + // 根据产品名称查询产品ID + builder := l.svcCtx.ProductModel.SelectBuilder() + builder = builder.Where("product_name = ? AND del_state = ?", req.ProductName, 0) + products, err := l.svcCtx.ProductModel.FindAll(l.ctx, builder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 查询产品失败 err: %v", err) + } + if len(products) == 0 { + return nil, errors.Wrapf(xerr.NewErrMsg(fmt.Sprintf("产品不存在: %s", req.ProductName)), "AdminCreateOrder, 查询产品失败 err: %v", err) + } + product := products[0] + + // 创建订单对象 + order := &model.Order{ + OrderNo: orderNo, + PlatformOrderId: sql.NullString{String: req.PlatformOrderId, Valid: req.PlatformOrderId != ""}, + ProductId: product.Id, + PaymentPlatform: req.PaymentPlatform, + PaymentScene: req.PaymentScene, + Amount: req.Amount, + Status: req.Status, + } + + // 使用事务处理订单创建 + var orderId int64 + err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 插入订单 + result, err := l.svcCtx.OrderModel.Insert(ctx, session, order) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 创建订单失败 err: %v", err) + } + + // 获取订单ID + orderId, err = result.LastInsertId() + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 获取订单ID失败 err: %v", err) + } + + // 如果是推广订单,创建推广订单记录 + if req.IsPromotion == 1 { + promotionOrder := &model.AdminPromotionOrder{ + OrderId: orderId, + Version: 1, + CreateTime: time.Now(), + UpdateTime: time.Now(), + } + _, err = l.svcCtx.AdminPromotionOrderModel.Insert(ctx, session, promotionOrder) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminCreateOrder, 创建推广订单失败 err: %v", err) + } + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &types.AdminCreateOrderResp{ + Id: orderId, + }, nil +} diff --git a/app/main/api/internal/logic/admin_order/admindeleteorderlogic.go b/app/main/api/internal/logic/admin_order/admindeleteorderlogic.go new file mode 100644 index 0000000..2ad7dae --- /dev/null +++ b/app/main/api/internal/logic/admin_order/admindeleteorderlogic.go @@ -0,0 +1,63 @@ +package admin_order + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminDeleteOrderLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeleteOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteOrderLogic { + return &AdminDeleteOrderLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeleteOrderLogic) AdminDeleteOrder(req *types.AdminDeleteOrderReq) (resp *types.AdminDeleteOrderResp, err error) { + // 获取订单信息 + order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminDeleteOrder, 查询订单失败 err: %v", err) + } + + // 使用事务删除订单 + err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 软删除订单 + err := l.svcCtx.OrderModel.DeleteSoft(ctx, session, order) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminDeleteOrder, 删除订单失败 err: %v", err) + } + + // 删除关联的推广订单记录 + promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(ctx, order.Id) + if err == nil && promotionOrder != nil { + err = l.svcCtx.AdminPromotionOrderModel.DeleteSoft(ctx, session, promotionOrder) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminDeleteOrder, 删除推广订单失败 err: %v", err) + } + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &types.AdminDeleteOrderResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_order/admingetorderdetaillogic.go b/app/main/api/internal/logic/admin_order/admingetorderdetaillogic.go new file mode 100644 index 0000000..41caf37 --- /dev/null +++ b/app/main/api/internal/logic/admin_order/admingetorderdetaillogic.go @@ -0,0 +1,104 @@ +package admin_order + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/globalkey" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetOrderDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetOrderDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetOrderDetailLogic { + return &AdminGetOrderDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetOrderDetailLogic) AdminGetOrderDetail(req *types.AdminGetOrderDetailReq) (resp *types.AdminGetOrderDetailResp, err error) { + // 获取订单信息 + order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderDetail, 查询订单失败 err: %v", err) + } + + // 获取产品信息 + product, err := l.svcCtx.ProductModel.FindOne(l.ctx, order.ProductId) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderDetail, 查询产品失败 err: %v", err) + } + + // 判断是否为推广订单 + var isPromotion int64 + promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(l.ctx, order.Id) + if err == nil && promotionOrder != nil { + isPromotion = 1 + } + + // 获取查询状态 + var queryState string + builder := l.svcCtx.QueryModel.SelectBuilder().Where("order_id = ?", order.Id).Columns("query_state") + queries, err := l.svcCtx.QueryModel.FindAll(l.ctx, builder, "") + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderDetail, 查询查询状态失败 err: %v", err) + } + + if len(queries) > 0 { + queryState = queries[0].QueryState + } else { + // 查询清理日志 + cleanupBuilder := l.svcCtx.QueryCleanupDetailModel.SelectBuilder(). + Where("order_id = ?", order.Id). + Where("del_state = ?", globalkey.DelStateNo). + OrderBy("create_time DESC"). + Limit(1) + cleanupDetails, err := l.svcCtx.QueryCleanupDetailModel.FindAll(l.ctx, cleanupBuilder, "") + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderDetail, 查询清理日志失败 err: %v", err) + } + + if len(cleanupDetails) > 0 { + queryState = model.QueryStateCleaned + } else { + queryState = "" + } + } + + // 构建响应 + resp = &types.AdminGetOrderDetailResp{ + Id: order.Id, + OrderNo: order.OrderNo, + PlatformOrderId: order.PlatformOrderId.String, + ProductName: product.ProductName, + PaymentPlatform: order.PaymentPlatform, + PaymentScene: order.PaymentScene, + Amount: order.Amount, + Status: order.Status, + CreateTime: order.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: order.UpdateTime.Format("2006-01-02 15:04:05"), + IsPromotion: isPromotion, + QueryState: queryState, + } + + // 处理可选字段 + if order.PayTime.Valid { + resp.PayTime = order.PayTime.Time.Format("2006-01-02 15:04:05") + } + if order.RefundTime.Valid { + resp.RefundTime = order.RefundTime.Time.Format("2006-01-02 15:04:05") + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go b/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go new file mode 100644 index 0000000..4026782 --- /dev/null +++ b/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go @@ -0,0 +1,229 @@ +package admin_order + +import ( + "context" + "sync" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/globalkey" + "tydata-server/common/xerr" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetOrderListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetOrderListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetOrderListLogic { + return &AdminGetOrderListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetOrderListLogic) AdminGetOrderList(req *types.AdminGetOrderListReq) (resp *types.AdminGetOrderListResp, err error) { + // 构建查询条件 + builder := l.svcCtx.OrderModel.SelectBuilder() + if req.OrderNo != "" { + builder = builder.Where("order_no = ?", req.OrderNo) + } + if req.PlatformOrderId != "" { + builder = builder.Where("platform_order_id = ?", req.PlatformOrderId) + } + if req.ProductName != "" { + builder = builder.Where("product_id IN (SELECT id FROM product WHERE product_name LIKE ?)", "%"+req.ProductName+"%") + } + if req.PaymentPlatform != "" { + builder = builder.Where("payment_platform = ?", req.PaymentPlatform) + } + if req.PaymentScene != "" { + builder = builder.Where("payment_scene = ?", req.PaymentScene) + } + if req.Amount > 0 { + builder = builder.Where("amount = ?", req.Amount) + } + if req.Status != "" { + builder = builder.Where("status = ?", req.Status) + } + if req.IsPromotion != -1 { + builder = builder.Where("id IN (SELECT order_id FROM admin_promotion_order WHERE del_state = 0)") + } + // 时间范围查询 + if req.CreateTimeStart != "" { + builder = builder.Where("create_time >= ?", req.CreateTimeStart) + } + if req.CreateTimeEnd != "" { + builder = builder.Where("create_time <= ?", req.CreateTimeEnd) + } + if req.PayTimeStart != "" { + builder = builder.Where("pay_time >= ?", req.PayTimeStart) + } + if req.PayTimeEnd != "" { + builder = builder.Where("pay_time <= ?", req.PayTimeEnd) + } + if req.RefundTimeStart != "" { + builder = builder.Where("refund_time >= ?", req.RefundTimeStart) + } + if req.RefundTimeEnd != "" { + builder = builder.Where("refund_time <= ?", req.RefundTimeEnd) + } + + // 并发获取总数和列表 + var total int64 + var orders []*model.Order + err = mr.Finish(func() error { + var err error + total, err = l.svcCtx.OrderModel.FindCount(l.ctx, builder, "id") + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询订单总数失败 err: %v", err) + } + return nil + }, func() error { + var err error + orders, err = l.svcCtx.OrderModel.FindPageListByPage(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询订单列表失败 err: %v", err) + } + return nil + }) + if err != nil { + return nil, err + } + + // 并发获取产品信息和查询状态 + productMap := make(map[int64]string) + queryStateMap := make(map[int64]string) + var mu sync.Mutex + + // 批量获取查询状态 + if len(orders) > 0 { + orderIds := make([]int64, 0, len(orders)) + for _, order := range orders { + orderIds = append(orderIds, order.Id) + } + + // 1. 先查询当前查询状态 + builder := l.svcCtx.QueryModel.SelectBuilder(). + Where(squirrel.Eq{"order_id": orderIds}). + Columns("order_id", "query_state") + queries, err := l.svcCtx.QueryModel.FindAll(l.ctx, builder, "") + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 批量查询查询状态失败 err: %v", err) + } + + // 2. 记录已找到查询状态的订单ID + foundOrderIds := make(map[int64]bool) + for _, query := range queries { + queryStateMap[query.OrderId] = query.QueryState + foundOrderIds[query.OrderId] = true + } + + // 3. 查找未找到查询状态的订单是否在清理日志中 + notFoundOrderIds := make([]int64, 0) + for _, orderId := range orderIds { + if !foundOrderIds[orderId] { + notFoundOrderIds = append(notFoundOrderIds, orderId) + } + } + + if len(notFoundOrderIds) > 0 { + // 查询清理日志 + cleanupBuilder := l.svcCtx.QueryCleanupDetailModel.SelectBuilder(). + Where(squirrel.Eq{"order_id": notFoundOrderIds}). + Where("del_state = ?", globalkey.DelStateNo). + OrderBy("create_time DESC") + cleanupDetails, err := l.svcCtx.QueryCleanupDetailModel.FindAll(l.ctx, cleanupBuilder, "") + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询清理日志失败 err: %v", err) + } + + // 记录已清理的订单状态 + for _, detail := range cleanupDetails { + if _, exists := queryStateMap[detail.OrderId]; !exists { + queryStateMap[detail.OrderId] = model.QueryStateCleaned // 使用常量标记为已清除状态 + } + } + + // 对于既没有查询状态也没有清理记录的订单,不设置状态(保持为空字符串) + for _, orderId := range notFoundOrderIds { + if _, exists := queryStateMap[orderId]; !exists { + queryStateMap[orderId] = "" // 未知状态保持为空字符串 + } + } + } + } + + // 并发获取产品信息 + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, order := range orders { + source <- order + } + }, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { + order := item.(*model.Order) + + // 获取产品信息 + product, err := l.svcCtx.ProductModel.FindOne(l.ctx, order.ProductId) + if err != nil && !errors.Is(err, model.ErrNotFound) { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminGetOrderList, 查询产品信息失败 err: %v", err)) + return + } + mu.Lock() + if product != nil { + productMap[product.Id] = product.ProductName + } else { + productMap[order.ProductId] = "" // 产品不存在时设置为空字符串 + } + mu.Unlock() + writer.Write(struct{}{}) + }, func(pipe <-chan struct{}, cancel func(error)) { + for range pipe { + } + }) + if err != nil { + return nil, err + } + + // 构建响应 + resp = &types.AdminGetOrderListResp{ + Total: total, + Items: make([]types.OrderListItem, 0, len(orders)), + } + + for _, order := range orders { + item := types.OrderListItem{ + Id: order.Id, + OrderNo: order.OrderNo, + PlatformOrderId: order.PlatformOrderId.String, + ProductName: productMap[order.ProductId], + PaymentPlatform: order.PaymentPlatform, + PaymentScene: order.PaymentScene, + Amount: order.Amount, + Status: order.Status, + CreateTime: order.CreateTime.Format("2006-01-02 15:04:05"), + QueryState: queryStateMap[order.Id], + } + if order.PayTime.Valid { + item.PayTime = order.PayTime.Time.Format("2006-01-02 15:04:05") + } + if order.RefundTime.Valid { + item.RefundTime = order.RefundTime.Time.Format("2006-01-02 15:04:05") + } + // 判断是否为推广订单 + promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(l.ctx, order.Id) + if err == nil && promotionOrder != nil { + item.IsPromotion = 1 + } + resp.Items = append(resp.Items, item) + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go b/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go new file mode 100644 index 0000000..065c6b8 --- /dev/null +++ b/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go @@ -0,0 +1,92 @@ +package admin_order + +import ( + "context" + "database/sql" + "fmt" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminRefundOrderLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminRefundOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminRefundOrderLogic { + return &AdminRefundOrderLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminRefundOrderLogic) AdminRefundOrder(req *types.AdminRefundOrderReq) (resp *types.AdminRefundOrderResp, err error) { + // 获取订单信息 + order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminRefundOrder, 查询订单失败 err: %v", err) + } + + // 检查订单状态 + if order.Status != "paid" { + return nil, errors.Wrapf(xerr.NewErrMsg("订单状态不正确,无法退款"), "AdminRefundOrder, 订单状态不正确,无法退款 err: %v", err) + } + + // 检查退款金额 + if req.RefundAmount > order.Amount { + return nil, errors.Wrapf(xerr.NewErrMsg("退款金额不能大于订单金额"), "AdminRefundOrder, 退款金额不能大于订单金额 err: %v", err) + } + refundResp, err := l.svcCtx.AlipayService.AliRefund(l.ctx, order.OrderNo, req.RefundAmount) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 退款失败 err: %v", err) + } + if refundResp.IsSuccess() { + err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 创建退款记录 + refund := &model.OrderRefund{ + RefundNo: fmt.Sprintf("refund-%s", order.OrderNo), + PlatformRefundId: sql.NullString{String: refundResp.TradeNo, Valid: true}, + OrderId: order.Id, + UserId: order.UserId, + ProductId: order.ProductId, + RefundAmount: req.RefundAmount, + RefundReason: sql.NullString{String: req.RefundReason, Valid: true}, + Status: model.OrderRefundStatusPending, + RefundTime: sql.NullTime{Time: time.Now(), Valid: true}, + } + + if _, err := l.svcCtx.OrderRefundModel.Insert(ctx, session, refund); err != nil { + return fmt.Errorf("创建退款记录失败: %v", err) + } + + // 更新订单状态 + order.Status = model.OrderStatusRefunded + order.RefundTime = sql.NullTime{Time: time.Now(), Valid: true} + if _, err := l.svcCtx.OrderModel.Update(ctx, session, order); err != nil { + return fmt.Errorf("更新订单状态失败: %v", err) + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "AdminRefundOrder, 退款失败 err: %v", err) + } + return &types.AdminRefundOrderResp{ + Status: model.OrderStatusRefunded, + RefundNo: fmt.Sprintf("refund-%s", order.OrderNo), + Amount: req.RefundAmount, + }, nil + } else { + return nil, errors.Wrapf(xerr.NewErrMsg(fmt.Sprintf("退款失败, : %v", refundResp.Msg)), "AdminRefundOrder, 退款失败 err: %v", err) + } + +} diff --git a/app/main/api/internal/logic/admin_order/adminupdateorderlogic.go b/app/main/api/internal/logic/admin_order/adminupdateorderlogic.go new file mode 100644 index 0000000..c581e87 --- /dev/null +++ b/app/main/api/internal/logic/admin_order/adminupdateorderlogic.go @@ -0,0 +1,113 @@ +package admin_order + +import ( + "context" + "database/sql" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminUpdateOrderLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateOrderLogic { + return &AdminUpdateOrderLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateOrderLogic) AdminUpdateOrder(req *types.AdminUpdateOrderReq) (resp *types.AdminUpdateOrderResp, err error) { + // 获取原订单信息 + order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 查询订单失败 err: %v", err) + } + + // 更新订单字段 + if req.OrderNo != nil { + order.OrderNo = *req.OrderNo + } + if req.PlatformOrderId != nil { + order.PlatformOrderId = sql.NullString{String: *req.PlatformOrderId, Valid: true} + } + if req.PaymentPlatform != nil { + order.PaymentPlatform = *req.PaymentPlatform + } + if req.PaymentScene != nil { + order.PaymentScene = *req.PaymentScene + } + if req.Amount != nil { + order.Amount = *req.Amount + } + if req.Status != nil { + order.Status = *req.Status + } + if req.PayTime != nil { + payTime, err := time.Parse("2006-01-02 15:04:05", *req.PayTime) + if err == nil { + order.PayTime = sql.NullTime{Time: payTime, Valid: true} + } + } + if req.RefundTime != nil { + refundTime, err := time.Parse("2006-01-02 15:04:05", *req.RefundTime) + if err == nil { + order.RefundTime = sql.NullTime{Time: refundTime, Valid: true} + } + } + + // 使用事务更新订单 + err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 更新订单 + _, err := l.svcCtx.OrderModel.Update(ctx, session, order) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 更新订单失败 err: %v", err) + } + + // 处理推广订单状态 + if req.IsPromotion != nil { + promotionOrder, err := l.svcCtx.AdminPromotionOrderModel.FindOneByOrderId(ctx, order.Id) + if err == nil && promotionOrder != nil { + // 如果存在推广订单记录但不需要推广,则删除 + if *req.IsPromotion == 0 { + err = l.svcCtx.AdminPromotionOrderModel.DeleteSoft(ctx, session, promotionOrder) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 删除推广订单失败 err: %v", err) + } + } + } else if *req.IsPromotion == 1 { + // 如果需要推广但不存在记录,则创建 + newPromotionOrder := &model.AdminPromotionOrder{ + OrderId: order.Id, + Version: 1, + } + _, err = l.svcCtx.AdminPromotionOrderModel.Insert(ctx, session, newPromotionOrder) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminUpdateOrder, 创建推广订单失败 err: %v", err) + } + } + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &types.AdminUpdateOrderResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_platform_user/admincreateplatformuserlogic.go b/app/main/api/internal/logic/admin_platform_user/admincreateplatformuserlogic.go new file mode 100644 index 0000000..e9067a5 --- /dev/null +++ b/app/main/api/internal/logic/admin_platform_user/admincreateplatformuserlogic.go @@ -0,0 +1,57 @@ +package admin_platform_user + +import ( + "context" + "database/sql" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminCreatePlatformUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreatePlatformUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreatePlatformUserLogic { + return &AdminCreatePlatformUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreatePlatformUserLogic) AdminCreatePlatformUser(req *types.AdminCreatePlatformUserReq) (resp *types.AdminCreatePlatformUserResp, err error) { + // 校验手机号唯一性 + _, err = l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: req.Mobile, Valid: req.Mobile != ""}) + if err == nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机号已存在: %s", req.Mobile) + } + if err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询手机号失败: %v", err) + } + + user := &model.User{ + Mobile: sql.NullString{String: req.Mobile, Valid: req.Mobile != ""}, + Password: sql.NullString{String: req.Password, Valid: req.Password != ""}, + Nickname: sql.NullString{String: req.Nickname, Valid: req.Nickname != ""}, + Info: req.Info, + Inside: req.Inside, + } + result, err := l.svcCtx.UserModel.Insert(l.ctx, nil, user) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + id, err := result.LastInsertId() + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取用户ID失败: %v", err) + } + resp = &types.AdminCreatePlatformUserResp{Id: id} + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_platform_user/admindeleteplatformuserlogic.go b/app/main/api/internal/logic/admin_platform_user/admindeleteplatformuserlogic.go new file mode 100644 index 0000000..1f0073d --- /dev/null +++ b/app/main/api/internal/logic/admin_platform_user/admindeleteplatformuserlogic.go @@ -0,0 +1,43 @@ +package admin_platform_user + +import ( + "context" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminDeletePlatformUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeletePlatformUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeletePlatformUserLogic { + return &AdminDeletePlatformUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeletePlatformUserLogic) AdminDeletePlatformUser(req *types.AdminDeletePlatformUserReq) (resp *types.AdminDeletePlatformUserResp, err error) { + user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %d, err: %v", req.Id, err) + } + user.DelState = 1 + user.DeleteTime.Time = time.Now() + user.DeleteTime.Valid = true + err = l.svcCtx.UserModel.DeleteSoft(l.ctx, nil, user) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "软删除用户失败: %v", err) + } + resp = &types.AdminDeletePlatformUserResp{Success: true} + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_platform_user/admingetplatformuserdetaillogic.go b/app/main/api/internal/logic/admin_platform_user/admingetplatformuserdetaillogic.go new file mode 100644 index 0000000..a9e6201 --- /dev/null +++ b/app/main/api/internal/logic/admin_platform_user/admingetplatformuserdetaillogic.go @@ -0,0 +1,53 @@ +package admin_platform_user + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetPlatformUserDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetPlatformUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetPlatformUserDetailLogic { + return &AdminGetPlatformUserDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetPlatformUserDetailLogic) AdminGetPlatformUserDetail(req *types.AdminGetPlatformUserDetailReq) (resp *types.AdminGetPlatformUserDetailResp, err error) { + user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %d, err: %v", req.Id, err) + } + key := l.svcCtx.Config.Encrypt.SecretKey + DecryptMobile, err := crypto.DecryptMobile(user.Mobile.String, key) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解密手机号失败: %v", err) + } + // 查询平台类型(取第一个user_auth) + resp = &types.AdminGetPlatformUserDetailResp{ + Id: user.Id, + Mobile: DecryptMobile, + Nickname: "", + Info: user.Info, + Inside: user.Inside, + CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: user.UpdateTime.Format("2006-01-02 15:04:05"), + } + if user.Nickname.Valid { + resp.Nickname = user.Nickname.String + } + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go b/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go new file mode 100644 index 0000000..7507da0 --- /dev/null +++ b/app/main/api/internal/logic/admin_platform_user/admingetplatformuserlistlogic.go @@ -0,0 +1,88 @@ +package admin_platform_user + +import ( + "context" + "database/sql" + "fmt" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetPlatformUserListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetPlatformUserListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetPlatformUserListLogic { + return &AdminGetPlatformUserListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetPlatformUserListLogic) AdminGetPlatformUserList(req *types.AdminGetPlatformUserListReq) (resp *types.AdminGetPlatformUserListResp, err error) { + builder := l.svcCtx.UserModel.SelectBuilder() + if req.Mobile != "" { + builder = builder.Where("mobile = ?", req.Mobile) + } + if req.Nickname != "" { + builder = builder.Where("nickname = ?", req.Nickname) + } + if req.Inside != 0 { + builder = builder.Where("inside = ?", req.Inside) + } + if req.CreateTimeStart != "" { + builder = builder.Where("create_time >= ?", req.CreateTimeStart) + } + if req.CreateTimeEnd != "" { + builder = builder.Where("create_time <= ?", req.CreateTimeEnd) + } + + orderBy := "id DESC" + if req.OrderBy != "" && req.OrderType != "" { + orderBy = fmt.Sprintf("%s %s", req.OrderBy, req.OrderType) + } + users, total, err := l.svcCtx.UserModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, orderBy) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户分页失败: %v", err) + } + var items []types.PlatformUserListItem + secretKey := l.svcCtx.Config.Encrypt.SecretKey + + for _, user := range users { + mobile := user.Mobile + if mobile.Valid { + encryptedMobile, err := crypto.DecryptMobile(mobile.String, secretKey) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 解密手机号失败: %+v", err) + } + mobile = sql.NullString{String: encryptedMobile, Valid: true} + } + itemData := types.PlatformUserListItem{ + Id: user.Id, + Mobile: mobile.String, + Nickname: "", + Info: user.Info, + Inside: user.Inside, + CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: user.UpdateTime.Format("2006-01-02 15:04:05"), + } + if user.Nickname.Valid { + itemData.Nickname = user.Nickname.String + } + items = append(items, itemData) + } + resp = &types.AdminGetPlatformUserListResp{ + Total: total, + Items: items, + } + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_platform_user/adminupdateplatformuserlogic.go b/app/main/api/internal/logic/admin_platform_user/adminupdateplatformuserlogic.go new file mode 100644 index 0000000..d4e6baa --- /dev/null +++ b/app/main/api/internal/logic/admin_platform_user/adminupdateplatformuserlogic.go @@ -0,0 +1,64 @@ +package admin_platform_user + +import ( + "context" + "database/sql" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUpdatePlatformUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdatePlatformUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdatePlatformUserLogic { + return &AdminUpdatePlatformUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdatePlatformUserLogic) AdminUpdatePlatformUser(req *types.AdminUpdatePlatformUserReq) (resp *types.AdminUpdatePlatformUserResp, err error) { + user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %d, err: %v", req.Id, err) + } + if req.Mobile != nil { + key := l.svcCtx.Config.Encrypt.SecretKey + EncryptMobile, err := crypto.EncryptMobile(*req.Mobile, key) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err) + } + user.Mobile = sql.NullString{String: EncryptMobile, Valid: true} + } + if req.Nickname != nil { + user.Nickname = sql.NullString{String: *req.Nickname, Valid: *req.Nickname != ""} + } + if req.Info != nil { + user.Info = *req.Info + } + if req.Inside != nil { + if *req.Inside != 1 && *req.Inside != 0 { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "内部用户状态错误: %d", *req.Inside) + } + user.Inside = *req.Inside + } + if req.Password != nil { + user.Password = sql.NullString{String: *req.Password, Valid: *req.Password != ""} + } + _, err = l.svcCtx.UserModel.Update(l.ctx, nil, user) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新用户失败: %v", err) + } + resp = &types.AdminUpdatePlatformUserResp{Success: true} + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_product/admincreateproductlogic.go b/app/main/api/internal/logic/admin_product/admincreateproductlogic.go new file mode 100644 index 0000000..dcf44aa --- /dev/null +++ b/app/main/api/internal/logic/admin_product/admincreateproductlogic.go @@ -0,0 +1,50 @@ +package admin_product + +import ( + "context" + "database/sql" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminCreateProductLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateProductLogic { + return &AdminCreateProductLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreateProductLogic) AdminCreateProduct(req *types.AdminCreateProductReq) (resp *types.AdminCreateProductResp, err error) { + // 1. 数据转换 + data := &model.Product{ + ProductName: req.ProductName, + ProductEn: req.ProductEn, + Description: req.Description, + Notes: sql.NullString{String: req.Notes, Valid: req.Notes != ""}, + CostPrice: req.CostPrice, + SellPrice: req.SellPrice, + } + + // 2. 数据库操作 + result, err := l.svcCtx.ProductModel.Insert(l.ctx, nil, data) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "创建产品失败, err: %v, req: %+v", err, req) + } + + // 3. 返回结果 + id, _ := result.LastInsertId() + return &types.AdminCreateProductResp{Id: id}, nil +} diff --git a/app/main/api/internal/logic/admin_product/admindeleteproductlogic.go b/app/main/api/internal/logic/admin_product/admindeleteproductlogic.go new file mode 100644 index 0000000..1ba6c72 --- /dev/null +++ b/app/main/api/internal/logic/admin_product/admindeleteproductlogic.go @@ -0,0 +1,44 @@ +package admin_product + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminDeleteProductLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeleteProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteProductLogic { + return &AdminDeleteProductLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeleteProductLogic) AdminDeleteProduct(req *types.AdminDeleteProductReq) (resp *types.AdminDeleteProductResp, err error) { + // 1. 查询记录是否存在 + record, err := l.svcCtx.ProductModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找产品失败, err: %v, id: %d", err, req.Id) + } + + // 2. 执行软删除 + err = l.svcCtx.ProductModel.DeleteSoft(l.ctx, nil, record) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "删除产品失败, err: %v, id: %d", err, req.Id) + } + + // 3. 返回结果 + return &types.AdminDeleteProductResp{Success: true}, nil +} diff --git a/app/main/api/internal/logic/admin_product/admingetproductdetaillogic.go b/app/main/api/internal/logic/admin_product/admingetproductdetaillogic.go new file mode 100644 index 0000000..4993fcc --- /dev/null +++ b/app/main/api/internal/logic/admin_product/admingetproductdetaillogic.go @@ -0,0 +1,49 @@ +package admin_product + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetProductDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetProductDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetProductDetailLogic { + return &AdminGetProductDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetProductDetailLogic) AdminGetProductDetail(req *types.AdminGetProductDetailReq) (resp *types.AdminGetProductDetailResp, err error) { + // 1. 查询记录 + record, err := l.svcCtx.ProductModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找产品失败, err: %v, id: %d", err, req.Id) + } + + // 2. 构建响应 + resp = &types.AdminGetProductDetailResp{ + Id: record.Id, + ProductName: record.ProductName, + ProductEn: record.ProductEn, + Description: record.Description, + Notes: record.Notes.String, + CostPrice: record.CostPrice, + SellPrice: record.SellPrice, + CreateTime: record.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: record.UpdateTime.Format("2006-01-02 15:04:05"), + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go b/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go new file mode 100644 index 0000000..764ddff --- /dev/null +++ b/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go @@ -0,0 +1,119 @@ +package admin_product + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetProductFeatureListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetProductFeatureListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetProductFeatureListLogic { + return &AdminGetProductFeatureListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetProductFeatureListLogic) AdminGetProductFeatureList(req *types.AdminGetProductFeatureListReq) (resp *[]types.AdminGetProductFeatureListResp, err error) { + // 1. 构建查询条件 + builder := l.svcCtx.ProductFeatureModel.SelectBuilder(). + Where("product_id = ?", req.ProductId) + + // 2. 执行查询 + list, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "sort ASC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查询产品功能列表失败, err: %v, product_id: %d", err, req.ProductId) + } + + // 3. 获取所有功能ID + featureIds := make([]int64, 0, len(list)) + for _, item := range list { + featureIds = append(featureIds, item.FeatureId) + } + + // 4. 并发查询功能详情 + type featureResult struct { + feature *model.Feature + err error + } + + results := make([]featureResult, len(featureIds)) + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for i, id := range featureIds { + source <- struct { + index int + id int64 + }{i, id} + } + }, func(item interface{}, writer mr.Writer[featureResult], cancel func(error)) { + data := item.(struct { + index int + id int64 + }) + feature, err := l.svcCtx.FeatureModel.FindOne(l.ctx, data.id) + writer.Write(featureResult{ + feature: feature, + err: err, + }) + }, func(pipe <-chan featureResult, cancel func(error)) { + for result := range pipe { + if result.err != nil { + l.Logger.Errorf("查询功能详情失败, feature_id: %d, err: %v", result.feature.Id, result.err) + continue + } + results = append(results, result) + } + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), + "并发查询功能详情失败, err: %v", err) + } + + // 5. 构建功能ID到详情的映射 + featureMap := make(map[int64]*model.Feature) + for _, result := range results { + if result.feature != nil { + featureMap[result.feature.Id] = result.feature + } + } + + // 6. 构建响应列表 + items := make([]types.AdminGetProductFeatureListResp, 0, len(list)) + for _, item := range list { + feature, exists := featureMap[item.FeatureId] + if !exists { + continue // 跳过不存在的功能 + } + + listItem := types.AdminGetProductFeatureListResp{ + Id: item.Id, + ProductId: item.ProductId, + FeatureId: item.FeatureId, + ApiId: feature.ApiId, + Name: feature.Name, + Sort: item.Sort, + Enable: item.Enable, + IsImportant: item.IsImportant, + CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"), + } + items = append(items, listItem) + } + + // 7. 返回结果 + return &items, nil +} diff --git a/app/main/api/internal/logic/admin_product/admingetproductlistlogic.go b/app/main/api/internal/logic/admin_product/admingetproductlistlogic.go new file mode 100644 index 0000000..6aa44b0 --- /dev/null +++ b/app/main/api/internal/logic/admin_product/admingetproductlistlogic.go @@ -0,0 +1,69 @@ +package admin_product + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetProductListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetProductListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetProductListLogic { + return &AdminGetProductListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetProductListLogic) AdminGetProductList(req *types.AdminGetProductListReq) (resp *types.AdminGetProductListResp, err error) { + // 1. 构建查询条件 + builder := l.svcCtx.ProductModel.SelectBuilder() + + // 2. 添加查询条件 + if req.ProductName != nil && *req.ProductName != "" { + builder = builder.Where("product_name LIKE ?", "%"+*req.ProductName+"%") + } + if req.ProductEn != nil && *req.ProductEn != "" { + builder = builder.Where("product_en LIKE ?", "%"+*req.ProductEn+"%") + } + + // 3. 执行分页查询 + list, total, err := l.svcCtx.ProductModel.FindPageListByPageWithTotal( + l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查询产品列表失败, err: %v, req: %+v", err, req) + } + + // 4. 构建响应列表 + items := make([]types.ProductListItem, 0, len(list)) + for _, item := range list { + listItem := types.ProductListItem{ + Id: item.Id, + ProductName: item.ProductName, + ProductEn: item.ProductEn, + Description: item.Description, + Notes: item.Notes.String, + CostPrice: item.CostPrice, + SellPrice: item.SellPrice, + CreateTime: item.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: item.UpdateTime.Format("2006-01-02 15:04:05"), + } + items = append(items, listItem) + } + + // 5. 返回结果 + return &types.AdminGetProductListResp{ + Total: total, + Items: items, + }, nil +} diff --git a/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go b/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go new file mode 100644 index 0000000..d16bf21 --- /dev/null +++ b/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go @@ -0,0 +1,159 @@ +package admin_product + +import ( + "context" + "sync" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminUpdateProductFeaturesLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateProductFeaturesLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateProductFeaturesLogic { + return &AdminUpdateProductFeaturesLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types.AdminUpdateProductFeaturesReq) (resp *types.AdminUpdateProductFeaturesResp, err error) { + // 1. 查询现有关联 + builder := l.svcCtx.ProductFeatureModel.SelectBuilder(). + Where("product_id = ?", req.ProductId) + existingList, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查询现有产品功能关联失败, err: %v, product_id: %d", err, req.ProductId) + } + + // 2. 构建现有关联的映射 + existingMap := make(map[int64]*model.ProductFeature) + for _, item := range existingList { + existingMap[item.FeatureId] = item + } + + // 3. 构建新关联的映射 + newMap := make(map[int64]*types.ProductFeatureItem) + for _, item := range req.Features { + newMap[item.FeatureId] = &item + } + + // 4. 在事务中执行更新操作 + err = l.svcCtx.ProductFeatureModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 4.1 处理需要删除的关联 + var mu sync.Mutex + var deleteIds []int64 + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for featureId, existing := range existingMap { + if _, exists := newMap[featureId]; !exists { + source <- existing.Id + } + } + }, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { + id := item.(int64) + mu.Lock() + deleteIds = append(deleteIds, id) + mu.Unlock() + }, func(pipe <-chan struct{}, cancel func(error)) { + // 等待所有ID收集完成 + }) + + if err != nil { + return errors.Wrapf(err, "收集待删除ID失败") + } + + // 批量删除 + if len(deleteIds) > 0 { + for _, id := range deleteIds { + err = l.svcCtx.ProductFeatureModel.Delete(ctx, session, id) + if err != nil { + return errors.Wrapf(err, "删除产品功能关联失败, product_id: %d, id: %d", + req.ProductId, id) + } + } + } + + // 4.2 并发处理需要新增或更新的关联 + var updateErr error + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for featureId, newItem := range newMap { + source <- struct { + featureId int64 + newItem *types.ProductFeatureItem + existing *model.ProductFeature + }{ + featureId: featureId, + newItem: newItem, + existing: existingMap[featureId], + } + } + }, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { + data := item.(struct { + featureId int64 + newItem *types.ProductFeatureItem + existing *model.ProductFeature + }) + + if data.existing != nil { + // 更新现有关联 + data.existing.Sort = data.newItem.Sort + data.existing.Enable = data.newItem.Enable + data.existing.IsImportant = data.newItem.IsImportant + _, err = l.svcCtx.ProductFeatureModel.Update(ctx, session, data.existing) + if err != nil { + updateErr = errors.Wrapf(err, "更新产品功能关联失败, product_id: %d, feature_id: %d", + req.ProductId, data.featureId) + cancel(updateErr) + return + } + } else { + // 新增关联 + newFeature := &model.ProductFeature{ + ProductId: req.ProductId, + FeatureId: data.featureId, + Sort: data.newItem.Sort, + Enable: data.newItem.Enable, + IsImportant: data.newItem.IsImportant, + } + _, err = l.svcCtx.ProductFeatureModel.Insert(ctx, session, newFeature) + if err != nil { + updateErr = errors.Wrapf(err, "新增产品功能关联失败, product_id: %d, feature_id: %d", + req.ProductId, data.featureId) + cancel(updateErr) + return + } + } + }, func(pipe <-chan struct{}, cancel func(error)) { + // 等待所有更新完成 + }) + + if err != nil { + return errors.Wrapf(err, "并发更新产品功能关联失败") + } + if updateErr != nil { + return updateErr + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "更新产品功能关联失败, err: %v, req: %+v", err, req) + } + + // 5. 返回结果 + return &types.AdminUpdateProductFeaturesResp{Success: true}, nil +} diff --git a/app/main/api/internal/logic/admin_product/adminupdateproductlogic.go b/app/main/api/internal/logic/admin_product/adminupdateproductlogic.go new file mode 100644 index 0000000..cf32b18 --- /dev/null +++ b/app/main/api/internal/logic/admin_product/adminupdateproductlogic.go @@ -0,0 +1,65 @@ +package admin_product + +import ( + "context" + "database/sql" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUpdateProductLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateProductLogic { + return &AdminUpdateProductLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateProductLogic) AdminUpdateProduct(req *types.AdminUpdateProductReq) (resp *types.AdminUpdateProductResp, err error) { + // 1. 查询记录是否存在 + record, err := l.svcCtx.ProductModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "查找产品失败, err: %v, id: %d", err, req.Id) + } + + // 2. 更新字段 + if req.ProductName != nil { + record.ProductName = *req.ProductName + } + if req.ProductEn != nil { + record.ProductEn = *req.ProductEn + } + if req.Description != nil { + record.Description = *req.Description + } + if req.Notes != nil { + record.Notes = sql.NullString{String: *req.Notes, Valid: *req.Notes != ""} + } + if req.CostPrice != nil { + record.CostPrice = *req.CostPrice + } + if req.SellPrice != nil { + record.SellPrice = *req.SellPrice + } + + // 3. 执行更新操作 + _, err = l.svcCtx.ProductModel.Update(l.ctx, nil, record) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), + "更新产品失败, err: %v, req: %+v", err, req) + } + + // 4. 返回结果 + return &types.AdminUpdateProductResp{Success: true}, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/createpromotionlinklogic.go b/app/main/api/internal/logic/admin_promotion/createpromotionlinklogic.go new file mode 100644 index 0000000..27f5eb7 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/createpromotionlinklogic.go @@ -0,0 +1,136 @@ +package admin_promotion + +import ( + "context" + "crypto/rand" + "fmt" + "math/big" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type CreatePromotionLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCreatePromotionLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreatePromotionLinkLogic { + return &CreatePromotionLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +// 生成6位随机字符串(大小写字母和数字) +func generateRandomString() (string, error) { + const ( + chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + length = 6 + ) + + result := make([]byte, length) + for i := 0; i < length; i++ { + num, err := rand.Int(rand.Reader, big.NewInt(int64(len(chars)))) + if err != nil { + return "", err + } + result[i] = chars[num.Int64()] + } + return string(result), nil +} + +func (l *CreatePromotionLinkLogic) CreatePromotionLink(req *types.CreatePromotionLinkReq) (resp *types.CreatePromotionLinkResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建推广链接, 获取用户信息失败, %+v", getUidErr) + } + + // 生成唯一URL + var url string + maxRetries := 5 // 最大重试次数 + for i := 0; i < maxRetries; i++ { + // 生成6位随机字符串 + randomStr, err := generateRandomString() + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建推广链接, 生成随机字符串失败, %+v", err) + } + + // 检查URL是否已存在 + existLink, err := l.svcCtx.AdminPromotionLinkModel.FindOneByUrl(l.ctx, randomStr) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建推广链接, 检查URL是否存在失败, %+v", err) + } + + if existLink != nil { + continue // URL已存在,继续尝试 + } + + // URL可用 + url = randomStr + break + } + + if url == "" { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建推广链接失败, 多次尝试生成唯一URL均失败") + } + url = fmt.Sprintf("%s/%s", l.svcCtx.Config.AdminPromotion.URLDomain, url) + // 创建推广链接 + link := &model.AdminPromotionLink{ + Name: req.Name, + Url: url, + AdminUserId: adminUserId, + } + + var linkId int64 + err = l.svcCtx.AdminPromotionLinkModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + result, err := l.svcCtx.AdminPromotionLinkModel.Insert(l.ctx, session, link) + if err != nil { + return fmt.Errorf("创建推广链接失败, %+v", err) + } + + linkId, err = result.LastInsertId() + if err != nil { + return fmt.Errorf("获取推广链接ID失败, %+v", err) + } + + // 创建总统计记录 + totalStats := &model.AdminPromotionLinkStatsTotal{ + LinkId: linkId, + } + _, err = l.svcCtx.AdminPromotionLinkStatsTotalModel.Insert(l.ctx, session, totalStats) + if err != nil { + return fmt.Errorf("创建推广链接总统计记录失败, %+v", err) + } + + // 创建统计历史记录 + historyStats := &model.AdminPromotionLinkStatsHistory{ + LinkId: linkId, + StatsDate: time.Now().Truncate(24 * time.Hour), + } + _, err = l.svcCtx.AdminPromotionLinkStatsHistoryModel.Insert(l.ctx, session, historyStats) + if err != nil { + return fmt.Errorf("创建推广链接统计历史记录失败, %+v", err) + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建推广链接失败, %+v", err) + } + + return &types.CreatePromotionLinkResp{ + Id: linkId, + Url: url, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/deletepromotionlinklogic.go b/app/main/api/internal/logic/admin_promotion/deletepromotionlinklogic.go new file mode 100644 index 0000000..e6cfacb --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/deletepromotionlinklogic.go @@ -0,0 +1,91 @@ +package admin_promotion + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type DeletePromotionLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeletePromotionLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeletePromotionLinkLogic { + return &DeletePromotionLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *DeletePromotionLinkLogic) DeletePromotionLink(req *types.DeletePromotionLinkReq) error { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "删除推广链接, 获取用户信息失败, %+v", getUidErr) + } + + // 获取链接信息 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, req.Id) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 获取链接信息失败, %+v", err) + } + + // 验证用户权限 + if link.AdminUserId != adminUserId { + return errors.Wrapf(xerr.NewErrMsg("无权限删除此链接"), "删除推广链接, 无权限删除此链接, %+v", link) + } + + // 在事务中执行所有删除操作 + err = l.svcCtx.AdminPromotionLinkModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 软删除链接 + err = l.svcCtx.AdminPromotionLinkModel.DeleteSoft(l.ctx, session, link) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 软删除链接失败, %+v", err) + } + + // 软删除总统计记录 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, link.Id) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return errors.Wrapf(err, "删除推广链接, 获取总统计记录失败, %+v", err) + } + if totalStats != nil { + err = l.svcCtx.AdminPromotionLinkStatsTotalModel.DeleteSoft(l.ctx, session, totalStats) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 软删除总统计记录失败, %+v", err) + } + } + + // 软删除历史统计记录 + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + builder = builder.Where("link_id = ?", link.Id) + historyStats, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "") + if err != nil { + return errors.Wrapf(err, "删除推广链接, 获取历史统计记录失败, %+v", err) + } + for _, stat := range historyStats { + err = l.svcCtx.AdminPromotionLinkStatsHistoryModel.DeleteSoft(l.ctx, session, stat) + if err != nil { + return errors.Wrapf(err, "删除推广链接, 软删除历史统计记录失败, %+v", err) + } + } + + return nil + }) + + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除推广链接失败, %+v", err) + } + + return nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionlinkdetaillogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionlinkdetaillogic.go new file mode 100644 index 0000000..df59da8 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionlinkdetaillogic.go @@ -0,0 +1,65 @@ +package admin_promotion + +import ( + "context" + "fmt" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type GetPromotionLinkDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionLinkDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionLinkDetailLogic { + return &GetPromotionLinkDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionLinkDetailLogic) GetPromotionLinkDetail(req *types.GetPromotionLinkDetailReq) (resp *types.GetPromotionLinkDetailResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + + // 获取链接信息 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(err, "获取链接信息失败, %+v", err) + } + + // 验证用户权限 + if link.AdminUserId != adminUserId { + return nil, errors.Wrapf(xerr.NewErrMsg("无权限访问此链接"), "获取链接信息失败, 无权限访问此链接, %+v", link) + } + + // 获取总统计 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOne(l.ctx, link.Id) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(err, "获取总统计失败, %+v", err) + } + return &types.GetPromotionLinkDetailResp{ + Name: link.Name, + Url: link.Url, + ClickCount: totalStats.ClickCount, + PayCount: totalStats.PayCount, + PayAmount: fmt.Sprintf("%.2f", totalStats.PayAmount), + CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: link.UpdateTime.Format("2006-01-02 15:04:05"), + LastClickTime: totalStats.LastClickTime.Time.Format("2006-01-02 15:04:05"), + LastPayTime: totalStats.LastPayTime.Time.Format("2006-01-02 15:04:05"), + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionlinklistlogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionlinklistlogic.go new file mode 100644 index 0000000..44d57ee --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionlinklistlogic.go @@ -0,0 +1,104 @@ +package admin_promotion + +import ( + "context" + "fmt" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetPromotionLinkListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionLinkListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionLinkListLogic { + return &GetPromotionLinkListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionLinkListLogic) GetPromotionLinkList(req *types.GetPromotionLinkListReq) (resp *types.GetPromotionLinkListResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + + // 构建查询条件 + builder := l.svcCtx.AdminPromotionLinkModel.SelectBuilder() + builder = builder.Where("admin_user_id = ?", adminUserId) + if req.Name != "" { + builder = builder.Where("name LIKE ?", "%"+req.Name+"%") + } + if req.Url != "" { + builder = builder.Where("url LIKE ?", "%"+req.Url+"%") + } + + // 获取列表和总数 + links, total, err := l.svcCtx.AdminPromotionLinkModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, errors.Wrapf(err, "获取推广链接列表失败, %+v", err) + } + + // 使用MapReduce并发获取统计数据 + items := make([]types.PromotionLinkItem, len(links)) + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, link := range links { + source <- link + } + }, func(item interface{}, writer mr.Writer[types.PromotionLinkItem], cancel func(error)) { + link := item.(*model.AdminPromotionLink) + // 获取总统计 + totalStats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, link.Id) + if err != nil && !errors.Is(err, model.ErrNotFound) { + cancel(errors.Wrapf(err, "获取总统计失败, linkId: %d, %+v", link.Id, err)) + return + } + writer.Write(types.PromotionLinkItem{ + Id: link.Id, + Name: link.Name, + Url: link.Url, + ClickCount: totalStats.ClickCount, + PayCount: totalStats.PayCount, + PayAmount: fmt.Sprintf("%.2f", totalStats.PayAmount), + CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), + LastClickTime: func() string { + if totalStats.LastClickTime.Valid { + return totalStats.LastClickTime.Time.Format("2006-01-02 15:04:05") + } + return "" + }(), + LastPayTime: func() string { + if totalStats.LastPayTime.Valid { + return totalStats.LastPayTime.Time.Format("2006-01-02 15:04:05") + } + return "" + }(), + }) + }, func(pipe <-chan types.PromotionLinkItem, cancel func(error)) { + for i := 0; i < len(links); i++ { + item := <-pipe + items[i] = item + } + }) + if err != nil { + return nil, errors.Wrapf(err, "获取推广链接统计数据失败, %+v", err) + } + + return &types.GetPromotionLinkListResp{ + Total: total, + Items: items, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionstatshistorylogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionstatshistorylogic.go new file mode 100644 index 0000000..11d2251 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionstatshistorylogic.go @@ -0,0 +1,83 @@ +package admin_promotion + +import ( + "context" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type GetPromotionStatsHistoryLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionStatsHistoryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionStatsHistoryLogic { + return &GetPromotionStatsHistoryLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionStatsHistoryLogic) GetPromotionStatsHistory(req *types.GetPromotionStatsHistoryReq) (resp []types.PromotionStatsHistoryItem, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + // 构建查询条件 + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + + // 如果有日期范围,添加日期过滤 + if req.StartDate != "" && req.EndDate != "" { + startDate, err := time.Parse("2006-01-02", req.StartDate) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "开始日期格式错误") + } + endDate, err := time.Parse("2006-01-02", req.EndDate) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "结束日期格式错误") + } + // 将结束日期设置为当天的最后一刻 + endDate = endDate.Add(24*time.Hour - time.Second) + builder = builder.Where("stats_date BETWEEN ? AND ?", startDate, endDate) + } + + // 获取历史统计数据 + historyStats, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "stats_date DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取历史统计数据失败") + } + + // 转换为响应格式 + resp = make([]types.PromotionStatsHistoryItem, 0, len(historyStats)) + for _, stat := range historyStats { + // 验证链接是否属于当前用户 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, stat.LinkId) + if err != nil { + continue // 如果链接不存在,跳过该记录 + } + if link.AdminUserId != adminUserId { + continue // 如果链接不属于当前用户,跳过该记录 + } + + resp = append(resp, types.PromotionStatsHistoryItem{ + Id: stat.Id, + LinkId: stat.LinkId, + PayAmount: stat.PayAmount, + ClickCount: stat.ClickCount, + PayCount: stat.PayCount, + StatsDate: stat.StatsDate.Format("2006-01-02"), + }) + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/getpromotionstatstotallogic.go b/app/main/api/internal/logic/admin_promotion/getpromotionstatstotallogic.go new file mode 100644 index 0000000..6ad7c56 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/getpromotionstatstotallogic.go @@ -0,0 +1,166 @@ +package admin_promotion + +import ( + "context" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetPromotionStatsTotalLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionStatsTotalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionStatsTotalLogic { + return &GetPromotionStatsTotalLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionStatsTotalLogic) GetPromotionStatsTotal(req *types.GetPromotionStatsTotalReq) (resp *types.GetPromotionStatsTotalResp, err error) { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取当前用户ID失败, %+v", getUidErr) + } + + // 获取用户的所有推广链接 + linkBuilder := l.svcCtx.AdminPromotionLinkModel.SelectBuilder() + linkBuilder = linkBuilder.Where("admin_user_id = ?", adminUserId) + links, err := l.svcCtx.AdminPromotionLinkModel.FindAll(l.ctx, linkBuilder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广链接列表失败, %+v", err) + } + + // 如果没有推广链接,返回空统计 + if len(links) == 0 { + return &types.GetPromotionStatsTotalResp{}, nil + } + + // 构建链接ID列表 + linkIds := make([]int64, len(links)) + for i, link := range links { + linkIds[i] = link.Id + } + + // 获取并计算总统计数据 + var totalClickCount, totalPayCount int64 + var totalPayAmount float64 + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, linkId := range linkIds { + source <- linkId + } + }, func(item interface{}, writer mr.Writer[struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }], cancel func(error)) { + linkId := item.(int64) + stats, err := l.svcCtx.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(l.ctx, linkId) + if err != nil && !errors.Is(err, model.ErrNotFound) { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取总统计数据失败, linkId: %d, %+v", linkId, err)) + return + } + if stats != nil { + writer.Write(struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }{ + ClickCount: stats.ClickCount, + PayCount: stats.PayCount, + PayAmount: stats.PayAmount, + }) + } + }, func(pipe <-chan struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }, cancel func(error)) { + for stats := range pipe { + totalClickCount += stats.ClickCount + totalPayCount += stats.PayCount + totalPayAmount += stats.PayAmount + } + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取总统计数据失败, %+v", err) + } + + // 获取今日统计数据 + now := time.Now() + today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local) + var todayClickCount, todayPayCount int64 + var todayPayAmount float64 + + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, linkId := range linkIds { + source <- linkId + } + }, func(item interface{}, writer mr.Writer[struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }], cancel func(error)) { + linkId := item.(int64) + builder := l.svcCtx.AdminPromotionLinkStatsHistoryModel.SelectBuilder() + builder = builder.Where("link_id = ? AND DATE(stats_date) = DATE(?)", linkId, today) + histories, err := l.svcCtx.AdminPromotionLinkStatsHistoryModel.FindAll(l.ctx, builder, "") + if err != nil { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取今日统计数据失败, linkId: %d, %+v", linkId, err)) + return + } + + var clickCount, payCount int64 + var payAmount float64 + for _, history := range histories { + clickCount += history.ClickCount + payCount += history.PayCount + payAmount += history.PayAmount + } + + writer.Write(struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }{ + ClickCount: clickCount, + PayCount: payCount, + PayAmount: payAmount, + }) + }, func(pipe <-chan struct { + ClickCount int64 + PayCount int64 + PayAmount float64 + }, cancel func(error)) { + for stats := range pipe { + todayClickCount += stats.ClickCount + todayPayCount += stats.PayCount + todayPayAmount += stats.PayAmount + } + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取今日统计数据失败, %+v", err) + } + + return &types.GetPromotionStatsTotalResp{ + TodayClickCount: int64(todayClickCount), + TodayPayCount: int64(todayPayCount), + TodayPayAmount: todayPayAmount, + TotalClickCount: int64(totalClickCount), + TotalPayCount: int64(totalPayCount), + TotalPayAmount: totalPayAmount, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/recordlinkclicklogic.go b/app/main/api/internal/logic/admin_promotion/recordlinkclicklogic.go new file mode 100644 index 0000000..7988e95 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/recordlinkclicklogic.go @@ -0,0 +1,57 @@ +package admin_promotion + +import ( + "context" + "fmt" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type RecordLinkClickLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewRecordLinkClickLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RecordLinkClickLogic { + return &RecordLinkClickLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *RecordLinkClickLogic) RecordLinkClick(req *types.RecordLinkClickReq) (resp *types.RecordLinkClickResp, err error) { + // 校验路径格式 + if len(req.Path) != 6 { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的推广链接路径") + } + + // 检查是否只包含大小写字母和数字 + for _, char := range req.Path { + if !((char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || (char >= '0' && char <= '9')) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的推广链接路径") + } + } + url := fmt.Sprintf("%s/%s", l.svcCtx.Config.AdminPromotion.URLDomain, req.Path) + + link, err := l.svcCtx.AdminPromotionLinkModel.FindOneByUrl(l.ctx, url) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "无效的推广链接路径") + } + + // 使用 statsService 更新点击统计 + err = l.svcCtx.AdminPromotionLinkStatsService.UpdateLinkStats(l.ctx, link.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新点击统计失败: %+v", err) + } + + return &types.RecordLinkClickResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_promotion/updatepromotionlinklogic.go b/app/main/api/internal/logic/admin_promotion/updatepromotionlinklogic.go new file mode 100644 index 0000000..d876f87 --- /dev/null +++ b/app/main/api/internal/logic/admin_promotion/updatepromotionlinklogic.go @@ -0,0 +1,57 @@ +package admin_promotion + +import ( + "context" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdatePromotionLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdatePromotionLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdatePromotionLinkLogic { + return &UpdatePromotionLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdatePromotionLinkLogic) UpdatePromotionLink(req *types.UpdatePromotionLinkReq) error { + // 获取当前用户ID + adminUserId, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "更新推广链接, 获取用户信息失败, %+v", getUidErr) + } + + // 获取链接信息 + link, err := l.svcCtx.AdminPromotionLinkModel.FindOne(l.ctx, req.Id) + if err != nil { + return errors.Wrapf(err, "更新推广链接, 获取链接信息失败, %+v", err) + } + + // 验证用户权限 + if link.AdminUserId != adminUserId { + return errors.Wrapf(xerr.NewErrMsg("无权限修改此链接"), "更新推广链接, 无权限修改此链接, %+v", link) + } + + // 更新链接信息 + link.Name = *req.Name + link.UpdateTime = time.Now() + + _, err = l.svcCtx.AdminPromotionLinkModel.Update(l.ctx, nil, link) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新推广链接, 更新链接信息失败, %+v", err) + } + return nil +} diff --git a/app/main/api/internal/logic/admin_query/admingetquerycleanupconfiglistlogic.go b/app/main/api/internal/logic/admin_query/admingetquerycleanupconfiglistlogic.go new file mode 100644 index 0000000..117eea4 --- /dev/null +++ b/app/main/api/internal/logic/admin_query/admingetquerycleanupconfiglistlogic.go @@ -0,0 +1,62 @@ +package admin_query + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/globalkey" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminGetQueryCleanupConfigListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetQueryCleanupConfigListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetQueryCleanupConfigListLogic { + return &AdminGetQueryCleanupConfigListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetQueryCleanupConfigListLogic) AdminGetQueryCleanupConfigList(req *types.AdminGetQueryCleanupConfigListReq) (resp *types.AdminGetQueryCleanupConfigListResp, err error) { + // 构建查询条件 + builder := l.svcCtx.QueryCleanupConfigModel.SelectBuilder(). + Where("del_state = ?", globalkey.DelStateNo) + + if req.Status > 0 { + builder = builder.Where("status = ?", req.Status) + } + + // 查询配置列表 + configs, err := l.svcCtx.QueryCleanupConfigModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询清理配置列表失败 err: %v", err) + } + + // 构建响应 + resp = &types.AdminGetQueryCleanupConfigListResp{ + Items: make([]types.QueryCleanupConfigItem, 0, len(configs)), + } + + for _, config := range configs { + item := types.QueryCleanupConfigItem{ + Id: config.Id, + ConfigKey: config.ConfigKey, + ConfigValue: config.ConfigValue, + ConfigDesc: config.ConfigDesc, + Status: config.Status, + CreateTime: config.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: config.UpdateTime.Format("2006-01-02 15:04:05"), + } + resp.Items = append(resp.Items, item) + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go b/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go new file mode 100644 index 0000000..d988d39 --- /dev/null +++ b/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go @@ -0,0 +1,126 @@ +package admin_query + +import ( + "context" + "sync" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/globalkey" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetQueryCleanupDetailListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetQueryCleanupDetailListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetQueryCleanupDetailListLogic { + return &AdminGetQueryCleanupDetailListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetQueryCleanupDetailListLogic) AdminGetQueryCleanupDetailList(req *types.AdminGetQueryCleanupDetailListReq) (resp *types.AdminGetQueryCleanupDetailListResp, err error) { + // 1. 验证清理日志是否存在 + _, err = l.svcCtx.QueryCleanupLogModel.FindOne(l.ctx, req.LogId) + if err != nil { + if err == model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "清理日志不存在, log_id: %d", req.LogId) + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询清理日志失败, log_id: %d, err: %v", req.LogId, err) + } + + // 2. 构建查询条件 + builder := l.svcCtx.QueryCleanupDetailModel.SelectBuilder(). + Where("cleanup_log_id = ?", req.LogId). + Where("del_state = ?", globalkey.DelStateNo) + + // 3. 并发获取总数和列表 + var total int64 + var details []*model.QueryCleanupDetail + err = mr.Finish(func() error { + var err error + total, err = l.svcCtx.QueryCleanupDetailModel.FindCount(l.ctx, builder, "id") + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询清理详情总数失败 err: %v", err) + } + return nil + }, func() error { + var err error + details, err = l.svcCtx.QueryCleanupDetailModel.FindPageListByPage(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询清理详情列表失败 err: %v", err) + } + return nil + }) + if err != nil { + return nil, err + } + + // 4. 获取所有产品ID + productIds := make([]int64, 0, len(details)) + for _, detail := range details { + productIds = append(productIds, detail.ProductId) + } + + // 5. 并发获取产品信息 + productMap := make(map[int64]string) + var mu sync.Mutex + err = mr.MapReduceVoid(func(source chan<- interface{}) { + for _, productId := range productIds { + source <- productId + } + }, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { + productId := item.(int64) + product, err := l.svcCtx.ProductModel.FindOne(l.ctx, productId) + if err != nil && !errors.Is(err, model.ErrNotFound) { + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询产品信息失败, product_id: %d, err: %v", productId, err)) + return + } + mu.Lock() + if product != nil { + productMap[productId] = product.ProductName + } else { + productMap[productId] = "" // 产品不存在时设置为空字符串 + } + mu.Unlock() + writer.Write(struct{}{}) + }, func(pipe <-chan struct{}, cancel func(error)) { + for range pipe { + } + }) + if err != nil { + return nil, err + } + + // 6. 构建响应 + resp = &types.AdminGetQueryCleanupDetailListResp{ + Total: total, + Items: make([]types.QueryCleanupDetailItem, 0, len(details)), + } + + for _, detail := range details { + item := types.QueryCleanupDetailItem{ + Id: detail.Id, + CleanupLogId: detail.CleanupLogId, + QueryId: detail.QueryId, + OrderId: detail.OrderId, + UserId: detail.UserId, + ProductName: productMap[detail.ProductId], + QueryState: detail.QueryState, + CreateTimeOld: detail.CreateTimeOld.Format("2006-01-02 15:04:05"), + CreateTime: detail.CreateTime.Format("2006-01-02 15:04:05"), + } + resp.Items = append(resp.Items, item) + } + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_query/admingetquerycleanuploglistlogic.go b/app/main/api/internal/logic/admin_query/admingetquerycleanuploglistlogic.go new file mode 100644 index 0000000..c6ee238 --- /dev/null +++ b/app/main/api/internal/logic/admin_query/admingetquerycleanuploglistlogic.go @@ -0,0 +1,88 @@ +package admin_query + +import ( + "context" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/globalkey" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetQueryCleanupLogListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetQueryCleanupLogListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetQueryCleanupLogListLogic { + return &AdminGetQueryCleanupLogListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetQueryCleanupLogListLogic) AdminGetQueryCleanupLogList(req *types.AdminGetQueryCleanupLogListReq) (resp *types.AdminGetQueryCleanupLogListResp, err error) { + // 构建查询条件 + builder := l.svcCtx.QueryCleanupLogModel.SelectBuilder(). + Where("del_state = ?", globalkey.DelStateNo) + + if req.Status > 0 { + builder = builder.Where("status = ?", req.Status) + } + if req.StartTime != "" { + builder = builder.Where("cleanup_time >= ?", req.StartTime) + } + if req.EndTime != "" { + builder = builder.Where("cleanup_time <= ?", req.EndTime) + } + + // 并发获取总数和列表 + var total int64 + var logs []*model.QueryCleanupLog + err = mr.Finish(func() error { + var err error + total, err = l.svcCtx.QueryCleanupLogModel.FindCount(l.ctx, builder, "id") + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询清理日志总数失败 err: %v", err) + } + return nil + }, func() error { + var err error + logs, err = l.svcCtx.QueryCleanupLogModel.FindPageListByPage(l.ctx, builder, req.Page, req.PageSize, "id DESC") + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询清理日志列表失败 err: %v", err) + } + return nil + }) + if err != nil { + return nil, err + } + + // 构建响应 + resp = &types.AdminGetQueryCleanupLogListResp{ + Total: total, + Items: make([]types.QueryCleanupLogItem, 0, len(logs)), + } + + for _, log := range logs { + item := types.QueryCleanupLogItem{ + Id: log.Id, + CleanupTime: log.CleanupTime.Format("2006-01-02 15:04:05"), + CleanupBefore: log.CleanupBefore.Format("2006-01-02 15:04:05"), + Status: log.Status, + AffectedRows: log.AffectedRows, + ErrorMsg: log.ErrorMsg.String, + Remark: log.Remark.String, + CreateTime: log.CreateTime.Format("2006-01-02 15:04:05"), + } + resp.Items = append(resp.Items, item) + } + + return resp, nil +} diff --git a/app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go b/app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go similarity index 71% rename from app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go rename to app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go index a947745..4267ec6 100644 --- a/app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go +++ b/app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go @@ -1,4 +1,4 @@ -package query +package admin_query import ( "context" @@ -6,73 +6,41 @@ import ( "encoding/hex" "encoding/json" "fmt" - "tydata-server/common/ctxdata" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" "tydata-server/pkg/lzkit/lzUtils" "github.com/jinzhu/copier" "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "github.com/zeromicro/go-zero/core/logx" ) -type QueryDetailByOrderIdLogic struct { +type AdminGetQueryDetailByOrderIdLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } -func NewQueryDetailByOrderIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryDetailByOrderIdLogic { - return &QueryDetailByOrderIdLogic{ +func NewAdminGetQueryDetailByOrderIdLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetQueryDetailByOrderIdLogic { + return &AdminGetQueryDetailByOrderIdLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } -func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailByOrderIdReq) (resp *types.QueryDetailByOrderIdResp, err error) { - // 获取当前用户ID - userId, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败: %v", err) - } - - // 获取订单信息 - order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.OrderId) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "报告查询, 订单不存在: %v", err) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) - } - user, err := l.svcCtx.UserModel.FindOne(l.ctx, userId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找用户错误: %v", err) - } - if user.Inside != 1 { - // 安全验证:确保订单属于当前用户 - if order.UserId != userId { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "无权查看此订单报告") - } - } - - // 检查订单状态 - if order.Status != "paid" { - return nil, errors.Wrapf(xerr.NewErrMsg("订单未支付,无法查看报告"), "") - } +func (l *AdminGetQueryDetailByOrderIdLogic) AdminGetQueryDetailByOrderId(req *types.AdminGetQueryDetailByOrderIdReq) (resp *types.AdminGetQueryDetailByOrderIdResp, err error) { // 获取报告信息 queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, req.OrderId) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) } - var query types.Query + var query types.AdminGetQueryDetailByOrderIdResp query.CreateTime = queryModel.CreateTime.Format("2006-01-02 15:04:05") query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") @@ -80,7 +48,7 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %+v", err) } processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) if processParamsErr != nil { @@ -104,13 +72,21 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) } query.ProductName = product.ProductName - return &types.QueryDetailByOrderIdResp{ - Query: query, + return &types.AdminGetQueryDetailByOrderIdResp{ + Id: query.Id, + OrderId: query.OrderId, + UserId: query.UserId, + ProductName: query.ProductName, + QueryParams: query.QueryParams, + QueryData: query.QueryData, + CreateTime: query.CreateTime, + UpdateTime: query.UpdateTime, + QueryState: query.QueryState, }, nil } // ProcessQueryData 解密和反序列化 QueryData -func ProcessQueryData(queryData sql.NullString, target *[]types.QueryItem, key []byte) error { +func ProcessQueryData(queryData sql.NullString, target *[]types.AdminQueryItem, key []byte) error { queryDataStr := lzUtils.NullStringToString(queryData) if queryDataStr == "" { return nil @@ -131,7 +107,7 @@ func ProcessQueryData(queryData sql.NullString, target *[]types.QueryItem, key [ // 确保 target 具有正确的长度 if len(*target) == 0 { - *target = make([]types.QueryItem, len(decryptedArray)) + *target = make([]types.AdminQueryItem, len(decryptedArray)) } // 填充解密后的数据到 target @@ -141,7 +117,25 @@ func ProcessQueryData(queryData sql.NullString, target *[]types.QueryItem, key [ } return nil } -func (l *QueryDetailByOrderIdLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.QueryItem) error { + +// ProcessQueryParams解密和反序列化 QueryParams +func ProcessQueryParams(QueryParams string, target *map[string]interface{}, key []byte) error { + // 解密 QueryParams + decryptedData, decryptErr := crypto.AesDecrypt(QueryParams, key) + if decryptErr != nil { + return decryptErr + } + + // 反序列化解密后的数据 + unmarshalErr := json.Unmarshal(decryptedData, target) + if unmarshalErr != nil { + return unmarshalErr + } + + return nil +} + +func (l *AdminGetQueryDetailByOrderIdLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.AdminQueryItem) error { // 遍历 target 数组,使用倒序遍历,以便删除元素时不影响索引 for i := len(*target) - 1; i >= 0; i-- { queryItem := &(*target)[i] @@ -175,7 +169,6 @@ func (l *QueryDetailByOrderIdLogic) UpdateFeatureAndProductFeature(productID int // 遍历 productFeatures,找到与 feature.ID 关联且 enable == 1 的项 var featureData map[string]interface{} - // foundFeature := false sort := 0 for _, pf := range productFeatures { if pf.FeatureId == feature.Id { // 确保和 Feature 关联 @@ -194,20 +187,3 @@ func (l *QueryDetailByOrderIdLogic) UpdateFeatureAndProductFeature(productID int return nil } - -// ProcessQueryParams解密和反序列化 QueryParams -func ProcessQueryParams(QueryParams string, target *map[string]interface{}, key []byte) error { - // 解密 QueryParams - decryptedData, decryptErr := crypto.AesDecrypt(QueryParams, key) - if decryptErr != nil { - return decryptErr - } - - // 反序列化解密后的数据 - unmarshalErr := json.Unmarshal(decryptedData, target) - if unmarshalErr != nil { - return unmarshalErr - } - - return nil -} diff --git a/app/main/api/internal/logic/admin_query/adminupdatequerycleanupconfiglogic.go b/app/main/api/internal/logic/admin_query/adminupdatequerycleanupconfiglogic.go new file mode 100644 index 0000000..3e2359d --- /dev/null +++ b/app/main/api/internal/logic/admin_query/adminupdatequerycleanupconfiglogic.go @@ -0,0 +1,63 @@ +package admin_query + +import ( + "context" + "time" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminUpdateQueryCleanupConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateQueryCleanupConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateQueryCleanupConfigLogic { + return &AdminUpdateQueryCleanupConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateQueryCleanupConfigLogic) AdminUpdateQueryCleanupConfig(req *types.AdminUpdateQueryCleanupConfigReq) (resp *types.AdminUpdateQueryCleanupConfigResp, err error) { + // 使用事务处理更新操作 + err = l.svcCtx.QueryCleanupConfigModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 1. 查询配置是否存在 + config, err := l.svcCtx.QueryCleanupConfigModel.FindOne(ctx, req.Id) + if err != nil { + if err == model.ErrNotFound { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "配置不存在, id: %d", req.Id) + } + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询配置失败, id: %d, err: %v", req.Id, err) + } + + // 2. 更新配置 + config.ConfigValue = req.ConfigValue + config.Status = req.Status + config.UpdateTime = time.Now() + + _, err = l.svcCtx.QueryCleanupConfigModel.Update(ctx, session, config) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新配置失败, id: %d, err: %v", req.Id, err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &types.AdminUpdateQueryCleanupConfigResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/createrolelogic.go b/app/main/api/internal/logic/admin_role/createrolelogic.go new file mode 100644 index 0000000..afde811 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/createrolelogic.go @@ -0,0 +1,83 @@ +package admin_role + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type CreateRoleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewCreateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateRoleLogic { + return &CreateRoleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *CreateRoleLogic) CreateRole(req *types.CreateRoleReq) (resp *types.CreateRoleResp, err error) { + // 检查角色编码是否已存在 + roleModel, err := l.svcCtx.AdminRoleModel.FindOneByRoleCode(l.ctx, req.RoleCode) + if err != nil && err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建角色失败: %v", err) + } + if roleModel != nil && roleModel.RoleName == req.RoleName { + return nil, errors.Wrapf(xerr.NewErrMsg("角色名称已存在"), "创建角色失败, 角色名称已存在: %v", err) + } + // 创建角色 + role := &model.AdminRole{ + RoleName: req.RoleName, + RoleCode: req.RoleCode, + Description: req.Description, + Status: req.Status, + Sort: req.Sort, + } + var roleId int64 + // 使用事务创建角色和关联菜单 + err = l.svcCtx.AdminRoleModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 创建角色 + result, err := l.svcCtx.AdminRoleModel.Insert(ctx, session, role) + if err != nil { + return errors.New("插入新角色失败") + } + roleId, err = result.LastInsertId() + if err != nil { + return errors.New("获取新角色ID失败") + } + + // 创建角色菜单关联 + if len(req.MenuIds) > 0 { + for _, menuId := range req.MenuIds { + roleMenu := &model.AdminRoleMenu{ + RoleId: roleId, + MenuId: menuId, + } + _, err = l.svcCtx.AdminRoleMenuModel.Insert(ctx, session, roleMenu) + if err != nil { + return errors.New("插入角色菜单关联失败") + } + } + } + + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建角色失败: %v", err) + } + + return &types.CreateRoleResp{ + Id: roleId, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/deleterolelogic.go b/app/main/api/internal/logic/admin_role/deleterolelogic.go new file mode 100644 index 0000000..7380233 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/deleterolelogic.go @@ -0,0 +1,84 @@ +package admin_role + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type DeleteRoleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteRoleLogic { + return &DeleteRoleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *DeleteRoleLogic) DeleteRole(req *types.DeleteRoleReq) (resp *types.DeleteRoleResp, err error) { + // 检查角色是否存在 + _, err = l.svcCtx.AdminRoleModel.FindOne(l.ctx, req.Id) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrMsg("角色不存在"), "删除角色失败, 角色不存在err: %v", err) + } + return nil, err + } + + // 使用事务删除角色和关联数据 + err = l.svcCtx.AdminRoleModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 删除角色菜单关联 + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", req.Id) + menus, err := l.svcCtx.AdminRoleMenuModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + for _, menu := range menus { + err = l.svcCtx.AdminRoleMenuModel.Delete(ctx, session, menu.Id) + if err != nil { + return err + } + } + + // 删除角色用户关联 + builder = l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("role_id = ?", req.Id) + users, err := l.svcCtx.AdminUserRoleModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + for _, user := range users { + err = l.svcCtx.AdminUserRoleModel.Delete(ctx, session, user.Id) + if err != nil { + return err + } + } + + // 删除角色 + err = l.svcCtx.AdminRoleModel.Delete(ctx, session, req.Id) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除角色失败err: %v", err) + } + + return &types.DeleteRoleResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/getroledetaillogic.go b/app/main/api/internal/logic/admin_role/getroledetaillogic.go new file mode 100644 index 0000000..1b98926 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/getroledetaillogic.go @@ -0,0 +1,91 @@ +package admin_role + +import ( + "context" + "sync" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetRoleDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetRoleDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleDetailLogic { + return &GetRoleDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetRoleDetailLogic) GetRoleDetail(req *types.GetRoleDetailReq) (resp *types.GetRoleDetailResp, err error) { + // 使用MapReduceVoid并发获取角色信息和菜单ID + var role *model.AdminRole + var menuIds []int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取角色信息 + source <- 2 // 获取菜单ID + }, func(item interface{}, writer mr.Writer[interface{}], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, req.Id) + if err != nil { + cancel(err) + return + } + mutex.Lock() + role = result + mutex.Unlock() + } else if taskType == 2 { + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", req.Id) + menus, err := l.svcCtx.AdminRoleMenuModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + menuIds = lo.Map(menus, func(item *model.AdminRoleMenu, _ int) int64 { + return item.MenuId + }) + mutex.Unlock() + } + }, func(pipe <-chan interface{}, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + if role == nil { + return nil, errors.Wrapf(xerr.NewErrMsg("角色不存在"), "获取角色详情失败, 角色不存在err: %v", err) + } + + return &types.GetRoleDetailResp{ + Id: role.Id, + RoleName: role.RoleName, + RoleCode: role.RoleCode, + Description: role.Description, + Status: role.Status, + Sort: role.Sort, + CreateTime: role.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: role.UpdateTime.Format("2006-01-02 15:04:05"), + MenuIds: menuIds, + }, nil +} diff --git a/app/main/api/internal/logic/admin_role/getrolelistlogic.go b/app/main/api/internal/logic/admin_role/getrolelistlogic.go new file mode 100644 index 0000000..80acb44 --- /dev/null +++ b/app/main/api/internal/logic/admin_role/getrolelistlogic.go @@ -0,0 +1,148 @@ +package admin_role + +import ( + "context" + "sync" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type GetRoleListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetRoleListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleListLogic { + return &GetRoleListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} +func (l *GetRoleListLogic) GetRoleList(req *types.GetRoleListReq) (resp *types.GetRoleListResp, err error) { + resp = &types.GetRoleListResp{ + Items: make([]types.RoleListItem, 0), + Total: 0, + } + + // 构建查询条件 + builder := l.svcCtx.AdminRoleModel.SelectBuilder() + if len(req.Name) > 0 { + builder = builder.Where("role_name LIKE ?", "%"+req.Name+"%") + } + if len(req.Code) > 0 { + builder = builder.Where("role_code LIKE ?", "%"+req.Code+"%") + } + if req.Status != -1 { + builder = builder.Where("status = ?", req.Status) + } + + // 设置分页 + offset := (req.Page - 1) * req.PageSize + builder = builder.OrderBy("sort ASC").Limit(uint64(req.PageSize)).Offset(uint64(offset)) + + // 使用MapReduceVoid并发获取总数和列表数据 + var roles []*model.AdminRole + var total int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取角色列表 + source <- 2 // 获取总数 + }, func(item interface{}, writer mr.Writer[*model.AdminRole], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminRoleModel.FindAll(l.ctx, builder, "id DESC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + roles = result + mutex.Unlock() + } else if taskType == 2 { + countBuilder := l.svcCtx.AdminRoleModel.SelectBuilder() + if len(req.Name) > 0 { + countBuilder = countBuilder.Where("role_name LIKE ?", "%"+req.Name+"%") + } + if len(req.Code) > 0 { + countBuilder = countBuilder.Where("role_code LIKE ?", "%"+req.Code+"%") + } + if req.Status != -1 { + countBuilder = countBuilder.Where("status = ?", req.Status) + } + + count, err := l.svcCtx.AdminRoleModel.FindCount(l.ctx, countBuilder, "id") + if err != nil { + cancel(err) + return + } + mutex.Lock() + total = count + mutex.Unlock() + } + }, func(pipe <-chan *model.AdminRole, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + // 并发获取每个角色的菜单ID + var roleItems []types.RoleListItem + var roleItemsMutex sync.Mutex + + mr.MapReduceVoid(func(source chan<- interface{}) { + for _, role := range roles { + source <- role + } + }, func(item interface{}, writer mr.Writer[[]int64], cancel func(error)) { + role := item.(*model.AdminRole) + + // 获取角色关联的菜单ID + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", role.Id) + menus, err := l.svcCtx.AdminRoleMenuModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + menuIds := lo.Map(menus, func(item *model.AdminRoleMenu, _ int) int64 { + return item.MenuId + }) + + writer.Write(menuIds) + }, func(pipe <-chan []int64, cancel func(error)) { + for _, role := range roles { + menuIds := <-pipe + item := types.RoleListItem{ + Id: role.Id, + RoleName: role.RoleName, + RoleCode: role.RoleCode, + Description: role.Description, + Status: role.Status, + Sort: role.Sort, + CreateTime: role.CreateTime.Format("2006-01-02 15:04:05"), + MenuIds: menuIds, + } + roleItemsMutex.Lock() + roleItems = append(roleItems, item) + roleItemsMutex.Unlock() + } + }) + + resp.Items = roleItems + resp.Total = total + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_role/updaterolelogic.go b/app/main/api/internal/logic/admin_role/updaterolelogic.go new file mode 100644 index 0000000..4246dcb --- /dev/null +++ b/app/main/api/internal/logic/admin_role/updaterolelogic.go @@ -0,0 +1,148 @@ +package admin_role + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type UpdateRoleLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateRoleLogic { + return &UpdateRoleLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdateRoleLogic) UpdateRole(req *types.UpdateRoleReq) (resp *types.UpdateRoleResp, err error) { + // 检查角色是否存在 + role, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, req.Id) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrMsg("角色不存在"), "更新角色失败, 角色不存在err: %v", err) + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新角色失败err: %v", err) + } + + // 检查角色编码是否重复 + if req.RoleCode != nil && *req.RoleCode != role.RoleCode { + roleModel, err := l.svcCtx.AdminRoleModel.FindOneByRoleCode(l.ctx, *req.RoleCode) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新角色失败err: %v", err) + } + if roleModel != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("角色编码已存在"), "更新角色失败, 角色编码已存在err: %v", err) + } + } + + // 更新角色信息 + if req.RoleName != nil { + role.RoleName = *req.RoleName + } + if req.RoleCode != nil { + role.RoleCode = *req.RoleCode + } + if req.Description != nil { + role.Description = *req.Description + } + if req.Status != nil { + role.Status = *req.Status + } + if req.Sort != nil { + role.Sort = *req.Sort + } + + // 使用事务更新角色和关联菜单 + err = l.svcCtx.AdminRoleModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 更新角色 + _, err = l.svcCtx.AdminRoleModel.Update(ctx, session, role) + if err != nil { + return err + } + if req.MenuIds != nil { + // 1. 获取当前关联的菜单ID + builder := l.svcCtx.AdminRoleMenuModel.SelectBuilder(). + Where("role_id = ?", req.Id) + currentMenus, err := l.svcCtx.AdminRoleMenuModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + + // 2. 转换为map便于查找 + currentMenuMap := make(map[int64]*model.AdminRoleMenu) + for _, menu := range currentMenus { + currentMenuMap[menu.MenuId] = menu + } + + // 3. 检查新的菜单ID是否存在 + for _, menuId := range req.MenuIds { + exists, err := l.svcCtx.AdminMenuModel.FindOne(ctx, menuId) + if err != nil || exists == nil { + return errors.Wrapf(xerr.NewErrMsg("菜单不存在"), "菜单ID: %d", menuId) + } + } + + // 4. 找出需要删除和新增的关联 + var toDelete []*model.AdminRoleMenu + var toInsert []int64 + + // 需要删除的:当前存在但新列表中没有的 + for menuId, roleMenu := range currentMenuMap { + if !lo.Contains(req.MenuIds, menuId) { + toDelete = append(toDelete, roleMenu) + } + } + + // 需要新增的:新列表中有但当前不存在的 + for _, menuId := range req.MenuIds { + if _, exists := currentMenuMap[menuId]; !exists { + toInsert = append(toInsert, menuId) + } + } + + // 5. 删除需要移除的关联 + for _, roleMenu := range toDelete { + err = l.svcCtx.AdminRoleMenuModel.Delete(ctx, session, roleMenu.Id) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除角色菜单关联失败: %v", err) + } + } + + // 6. 添加新的关联 + for _, menuId := range toInsert { + roleMenu := &model.AdminRoleMenu{ + RoleId: req.Id, + MenuId: menuId, + } + _, err = l.svcCtx.AdminRoleMenuModel.Insert(ctx, session, roleMenu) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "添加角色菜单关联失败: %v", err) + } + } + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新角色失败err: %v", err) + } + + return &types.UpdateRoleResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admincreateuserlogic.go b/app/main/api/internal/logic/admin_user/admincreateuserlogic.go new file mode 100644 index 0000000..5f3ef9e --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admincreateuserlogic.go @@ -0,0 +1,88 @@ +package admin_user + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminCreateUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminCreateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminCreateUserLogic { + return &AdminCreateUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminCreateUserLogic) AdminCreateUser(req *types.AdminCreateUserReq) (resp *types.AdminCreateUserResp, err error) { + // 检查用户名是否已存在 + exists, err := l.svcCtx.AdminUserModel.FindOneByUsername(l.ctx, req.Username) + if err != nil && err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + if exists != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名已存在"), "创建用户失败") + } + password, err := crypto.PasswordHash("123456") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建用户失败, 加密密码失败: %v", err) + } + // 创建用户 + user := &model.AdminUser{ + Username: req.Username, + Password: password, // 注意:实际应用中需要加密密码 + RealName: req.RealName, + Status: req.Status, + } + + // 使用事务创建用户和关联角色 + err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 创建用户 + result, err := l.svcCtx.AdminUserModel.Insert(ctx, session, user) + if err != nil { + return err + } + userId, err := result.LastInsertId() + if err != nil { + return err + } + + // 创建用户角色关联 + if len(req.RoleIds) > 0 { + for _, roleId := range req.RoleIds { + userRole := &model.AdminUserRole{ + UserId: userId, + RoleId: roleId, + } + _, err = l.svcCtx.AdminUserRoleModel.Insert(ctx, session, userRole) + if err != nil { + return err + } + } + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + + return &types.AdminCreateUserResp{ + Id: user.Id, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admindeleteuserlogic.go b/app/main/api/internal/logic/admin_user/admindeleteuserlogic.go new file mode 100644 index 0000000..d98237f --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admindeleteuserlogic.go @@ -0,0 +1,68 @@ +package admin_user + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminDeleteUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminDeleteUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDeleteUserLogic { + return &AdminDeleteUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminDeleteUserLogic) AdminDeleteUser(req *types.AdminDeleteUserReq) (resp *types.AdminDeleteUserResp, err error) { + // 检查用户是否存在 + _, err = l.svcCtx.AdminUserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %v", err) + } + + // 使用事务删除用户和关联数据 + err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 删除用户角色关联 + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", req.Id) + roles, err := l.svcCtx.AdminUserRoleModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + for _, role := range roles { + err = l.svcCtx.AdminUserRoleModel.Delete(ctx, session, role.Id) + if err != nil { + return err + } + } + + // 删除用户 + err = l.svcCtx.AdminUserModel.Delete(ctx, session, req.Id) + if err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除用户失败: %v", err) + } + + return &types.AdminDeleteUserResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go b/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go new file mode 100644 index 0000000..6a0a004 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go @@ -0,0 +1,88 @@ +package admin_user + +import ( + "context" + "errors" + "sync" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetUserDetailLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetUserDetailLogic { + return &AdminGetUserDetailLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetUserDetailLogic) AdminGetUserDetail(req *types.AdminGetUserDetailReq) (resp *types.AdminGetUserDetailResp, err error) { + // 使用MapReduceVoid并发获取用户信息和角色ID + var user *model.AdminUser + var roleIds []int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取用户信息 + source <- 2 // 获取角色ID + }, func(item interface{}, writer mr.Writer[interface{}], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminUserModel.FindOne(l.ctx, req.Id) + if err != nil { + cancel(err) + return + } + mutex.Lock() + user = result + mutex.Unlock() + } else if taskType == 2 { + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", req.Id) + roles, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + roleIds = lo.Map(roles, func(item *model.AdminUserRole, _ int) int64 { + return item.RoleId + }) + mutex.Unlock() + } + }, func(pipe <-chan interface{}, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + if user == nil { + return nil, errors.New("用户不存在") + } + + return &types.AdminGetUserDetailResp{ + Id: user.Id, + Username: user.Username, + RealName: user.RealName, + Status: user.Status, + CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"), + UpdateTime: user.UpdateTime.Format("2006-01-02 15:04:05"), + RoleIds: roleIds, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go b/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go new file mode 100644 index 0000000..17b2195 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go @@ -0,0 +1,149 @@ +package admin_user + +import ( + "context" + "sync" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/mr" +) + +type AdminGetUserListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminGetUserListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetUserListLogic { + return &AdminGetUserListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq) (resp *types.AdminGetUserListResp, err error) { + resp = &types.AdminGetUserListResp{ + Items: make([]types.AdminUserListItem, 0), + Total: 0, + } + + // 构建查询条件 + builder := l.svcCtx.AdminUserModel.SelectBuilder(). + Where("del_state = ?", 0) + if len(req.Username) > 0 { + builder = builder.Where("username LIKE ?", "%"+req.Username+"%") + } + if len(req.RealName) > 0 { + builder = builder.Where("real_name LIKE ?", "%"+req.RealName+"%") + } + if req.Status != -1 { + builder = builder.Where("status = ?", req.Status) + } + + // 设置分页 + offset := (req.Page - 1) * req.PageSize + builder = builder.OrderBy("id DESC").Limit(uint64(req.PageSize)).Offset(uint64(offset)) + + // 使用MapReduceVoid并发获取总数和列表数据 + var users []*model.AdminUser + var total int64 + var mutex sync.Mutex + var wg sync.WaitGroup + + mr.MapReduceVoid(func(source chan<- interface{}) { + source <- 1 // 获取用户列表 + source <- 2 // 获取总数 + }, func(item interface{}, writer mr.Writer[*model.AdminUser], cancel func(error)) { + taskType := item.(int) + wg.Add(1) + defer wg.Done() + + if taskType == 1 { + result, err := l.svcCtx.AdminUserModel.FindAll(l.ctx, builder, "id DESC") + if err != nil { + cancel(err) + return + } + mutex.Lock() + users = result + mutex.Unlock() + } else if taskType == 2 { + countBuilder := l.svcCtx.AdminUserModel.SelectBuilder(). + Where("del_state = ?", 0) + if len(req.Username) > 0 { + countBuilder = countBuilder.Where("username LIKE ?", "%"+req.Username+"%") + } + if len(req.RealName) > 0 { + countBuilder = countBuilder.Where("real_name LIKE ?", "%"+req.RealName+"%") + } + if req.Status != -1 { + countBuilder = countBuilder.Where("status = ?", req.Status) + } + + count, err := l.svcCtx.AdminUserModel.FindCount(l.ctx, countBuilder, "id") + if err != nil { + cancel(err) + return + } + mutex.Lock() + total = count + mutex.Unlock() + } + }, func(pipe <-chan *model.AdminUser, cancel func(error)) { + // 不需要处理pipe中的数据 + }) + + wg.Wait() + + // 并发获取每个用户的角色ID + var userItems []types.AdminUserListItem + var userItemsMutex sync.Mutex + + mr.MapReduceVoid(func(source chan<- interface{}) { + for _, user := range users { + source <- user + } + }, func(item interface{}, writer mr.Writer[[]int64], cancel func(error)) { + user := item.(*model.AdminUser) + + // 获取用户关联的角色ID + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", user.Id) + roles, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, builder, "id ASC") + if err != nil { + cancel(err) + return + } + roleIds := lo.Map(roles, func(item *model.AdminUserRole, _ int) int64 { + return item.RoleId + }) + + writer.Write(roleIds) + }, func(pipe <-chan []int64, cancel func(error)) { + for _, user := range users { + roleIds := <-pipe + item := types.AdminUserListItem{ + Id: user.Id, + Username: user.Username, + RealName: user.RealName, + Status: user.Status, + CreateTime: user.CreateTime.Format("2006-01-02 15:04:05"), + RoleIds: roleIds, + } + userItemsMutex.Lock() + userItems = append(userItems, item) + userItemsMutex.Unlock() + } + }) + + resp.Items = userItems + resp.Total = total + + return resp, nil +} diff --git a/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go b/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go new file mode 100644 index 0000000..7f3bf03 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go @@ -0,0 +1,141 @@ +package admin_user + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminUpdateUserLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUpdateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateUserLogic { + return &AdminUpdateUserLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUpdateUserLogic) AdminUpdateUser(req *types.AdminUpdateUserReq) (resp *types.AdminUpdateUserResp, err error) { + // 检查用户是否存在 + user, err := l.svcCtx.AdminUserModel.FindOne(l.ctx, req.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户不存在: %v", err) + } + + // 检查用户名是否重复 + if req.Username != nil && *req.Username != user.Username { + exists, err := l.svcCtx.AdminUserModel.FindOneByUsername(l.ctx, *req.Username) + if err != nil && err != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新用户失败: %v", err) + } + if exists != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("用户名已存在"), "更新用户失败") + } + } + + // 更新用户信息 + if req.Username != nil { + user.Username = *req.Username + } + if req.RealName != nil { + user.RealName = *req.RealName + } + if req.Status != nil { + user.Status = *req.Status + } + + // 使用事务更新用户和关联角色 + err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 更新用户 + _, err = l.svcCtx.AdminUserModel.Update(ctx, session, user) + if err != nil { + return err + } + + // 只有当RoleIds不为nil时才更新角色关联 + if req.RoleIds != nil { + // 1. 获取当前关联的角色ID + builder := l.svcCtx.AdminUserRoleModel.SelectBuilder(). + Where("user_id = ?", req.Id) + currentRoles, err := l.svcCtx.AdminUserRoleModel.FindAll(ctx, builder, "id ASC") + if err != nil { + return err + } + + // 2. 转换为map便于查找 + currentRoleMap := make(map[int64]*model.AdminUserRole) + for _, role := range currentRoles { + currentRoleMap[role.RoleId] = role + } + + // 3. 检查新的角色ID是否存在 + for _, roleId := range req.RoleIds { + exists, err := l.svcCtx.AdminRoleModel.FindOne(ctx, roleId) + if err != nil || exists == nil { + return errors.Wrapf(xerr.NewErrMsg("角色不存在"), "角色ID: %d", roleId) + } + } + + // 4. 找出需要删除和新增的关联 + var toDelete []*model.AdminUserRole + var toInsert []int64 + + // 需要删除的:当前存在但新列表中没有的 + for roleId, userRole := range currentRoleMap { + if !lo.Contains(req.RoleIds, roleId) { + toDelete = append(toDelete, userRole) + } + } + + // 需要新增的:新列表中有但当前不存在的 + for _, roleId := range req.RoleIds { + if _, exists := currentRoleMap[roleId]; !exists { + toInsert = append(toInsert, roleId) + } + } + + // 5. 删除需要移除的关联 + for _, userRole := range toDelete { + err = l.svcCtx.AdminUserRoleModel.Delete(ctx, session, userRole.Id) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除用户角色关联失败: %v", err) + } + } + + // 6. 添加新的关联 + for _, roleId := range toInsert { + userRole := &model.AdminUserRole{ + UserId: req.Id, + RoleId: roleId, + } + _, err = l.svcCtx.AdminUserRoleModel.Insert(ctx, session, userRole) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "添加用户角色关联失败: %v", err) + } + } + } + + return nil + }) + + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新用户失败: %v", err) + } + + return &types.AdminUpdateUserResp{ + Success: true, + }, nil +} diff --git a/app/main/api/internal/logic/admin_user/adminuserinfologic.go b/app/main/api/internal/logic/admin_user/adminuserinfologic.go new file mode 100644 index 0000000..4170678 --- /dev/null +++ b/app/main/api/internal/logic/admin_user/adminuserinfologic.go @@ -0,0 +1,67 @@ +package admin_user + +import ( + "context" + + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" +) + +type AdminUserInfoLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAdminUserInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUserInfoLogic { + return &AdminUserInfoLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AdminUserInfoLogic) AdminUserInfo(req *types.AdminUserInfoReq) (resp *types.AdminUserInfoResp, err error) { + userId, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败, %+v", err) + } + + user, err := l.svcCtx.AdminUserModel.FindOne(l.ctx, userId) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID信息失败, %+v", err) + } + // 获取权限 + adminUserRoleBuilder := l.svcCtx.AdminUserRoleModel.SelectBuilder().Where(squirrel.Eq{"user_id": user.Id}) + permissions, err := l.svcCtx.AdminUserRoleModel.FindAll(l.ctx, adminUserRoleBuilder, "role_id DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("获取权限失败"), "用户登录, 获取权限失败, 用户名: %s", user.Username) + } + + // 获取角色ID数组 + roleIds := make([]int64, 0) + for _, permission := range permissions { + roleIds = append(roleIds, permission.RoleId) + } + + // 获取角色名称 + roles := make([]string, 0) + for _, roleId := range roleIds { + role, err := l.svcCtx.AdminRoleModel.FindOne(l.ctx, roleId) + if err != nil { + continue + } + roles = append(roles, role.RoleCode) + } + return &types.AdminUserInfoResp{ + Username: user.Username, + RealName: user.RealName, + Roles: roles, + }, nil +} diff --git a/app/main/api/internal/logic/agent/activateagentmembershiplogic.go b/app/main/api/internal/logic/agent/activateagentmembershiplogic.go index efee472..4123bc6 100644 --- a/app/main/api/internal/logic/agent/activateagentmembershiplogic.go +++ b/app/main/api/internal/logic/agent/activateagentmembershiplogic.go @@ -10,9 +10,9 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/agentrealnamelogic.go b/app/main/api/internal/logic/agent/agentrealnamelogic.go index 8c63cf6..82e5300 100644 --- a/app/main/api/internal/logic/agent/agentrealnamelogic.go +++ b/app/main/api/internal/logic/agent/agentrealnamelogic.go @@ -6,10 +6,10 @@ import ( "fmt" "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/service" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/agent/agentwithdrawallogic.go b/app/main/api/internal/logic/agent/agentwithdrawallogic.go index aa218ce..ed32f44 100644 --- a/app/main/api/internal/logic/agent/agentwithdrawallogic.go +++ b/app/main/api/internal/logic/agent/agentwithdrawallogic.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "time" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/lzUtils" @@ -14,8 +14,8 @@ import ( "github.com/smartwalle/alipay/v3" "github.com/zeromicro/go-zero/core/stores/sqlx" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/applyforagentlogic.go b/app/main/api/internal/logic/agent/applyforagentlogic.go index e0343a5..9b60316 100644 --- a/app/main/api/internal/logic/agent/applyforagentlogic.go +++ b/app/main/api/internal/logic/agent/applyforagentlogic.go @@ -5,7 +5,7 @@ import ( "database/sql" "fmt" "time" - "tydata-server/app/user/model" + "tydata-server/app/main/model" jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" @@ -14,8 +14,8 @@ import ( "github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/sqlx" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) @@ -64,8 +64,8 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type } if user == nil { user = &model.User{Mobile: sql.NullString{String: encryptedMobile, Valid: true}} - // if len(user.Nickname) == 0 { - // user.Nickname = encryptedMobile + // if len(main.Nickname) == 0 { + // main.Nickname = encryptedMobile // } insertResult, userInsertErr := l.svcCtx.UserModel.Insert(transCtx, session, user) if userInsertErr != nil { @@ -73,7 +73,7 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type } lastId, lastInsertIdErr := insertResult.LastInsertId() if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 获取新用户ID失败, err:%+v, main:%+v", lastInsertIdErr, user) } user.Id = lastId userID = lastId diff --git a/app/main/api/internal/logic/agent/generatinglinklogic.go b/app/main/api/internal/logic/agent/generatinglinklogic.go index 4af774f..06d0cfd 100644 --- a/app/main/api/internal/logic/agent/generatinglinklogic.go +++ b/app/main/api/internal/logic/agent/generatinglinklogic.go @@ -5,7 +5,7 @@ import ( "encoding/hex" "encoding/json" "strconv" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" @@ -13,8 +13,8 @@ import ( "github.com/Masterminds/squirrel" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentauditstatuslogic.go b/app/main/api/internal/logic/agent/getagentauditstatuslogic.go index 4386173..3971b53 100644 --- a/app/main/api/internal/logic/agent/getagentauditstatuslogic.go +++ b/app/main/api/internal/logic/agent/getagentauditstatuslogic.go @@ -8,8 +8,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentcommissionlogic.go b/app/main/api/internal/logic/agent/getagentcommissionlogic.go index 1e1c4cf..50e9aad 100644 --- a/app/main/api/internal/logic/agent/getagentcommissionlogic.go +++ b/app/main/api/internal/logic/agent/getagentcommissionlogic.go @@ -9,8 +9,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentinfologic.go b/app/main/api/internal/logic/agent/getagentinfologic.go index 6856899..0758e69 100644 --- a/app/main/api/internal/logic/agent/getagentinfologic.go +++ b/app/main/api/internal/logic/agent/getagentinfologic.go @@ -9,9 +9,9 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentmembershipproductconfiglogic.go b/app/main/api/internal/logic/agent/getagentmembershipproductconfiglogic.go index ec48c44..4e53d70 100644 --- a/app/main/api/internal/logic/agent/getagentmembershipproductconfiglogic.go +++ b/app/main/api/internal/logic/agent/getagentmembershipproductconfiglogic.go @@ -2,7 +2,7 @@ package agent import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/lzUtils" @@ -10,8 +10,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentproductconfiglogic.go b/app/main/api/internal/logic/agent/getagentproductconfiglogic.go index 41f3203..b61797e 100644 --- a/app/main/api/internal/logic/agent/getagentproductconfiglogic.go +++ b/app/main/api/internal/logic/agent/getagentproductconfiglogic.go @@ -2,15 +2,15 @@ package agent import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/mr" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentrevenueinfologic.go b/app/main/api/internal/logic/agent/getagentrevenueinfologic.go index ba33ace..570e95c 100644 --- a/app/main/api/internal/logic/agent/getagentrevenueinfologic.go +++ b/app/main/api/internal/logic/agent/getagentrevenueinfologic.go @@ -3,15 +3,15 @@ package agent import ( "context" "time" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "github.com/Masterminds/squirrel" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentrewardslogic.go b/app/main/api/internal/logic/agent/getagentrewardslogic.go index 0f949e8..c45df0e 100644 --- a/app/main/api/internal/logic/agent/getagentrewardslogic.go +++ b/app/main/api/internal/logic/agent/getagentrewardslogic.go @@ -9,8 +9,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go b/app/main/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go index 52d0530..d1d5908 100644 --- a/app/main/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go +++ b/app/main/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go @@ -3,8 +3,8 @@ package agent import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/agent/getagentsubordinatelistlogic.go b/app/main/api/internal/logic/agent/getagentsubordinatelistlogic.go index eeb13b8..2e08cb8 100644 --- a/app/main/api/internal/logic/agent/getagentsubordinatelistlogic.go +++ b/app/main/api/internal/logic/agent/getagentsubordinatelistlogic.go @@ -5,9 +5,9 @@ import ( "strings" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/agent/getagentwithdrawallogic.go b/app/main/api/internal/logic/agent/getagentwithdrawallogic.go index f6a5e8d..f47b947 100644 --- a/app/main/api/internal/logic/agent/getagentwithdrawallogic.go +++ b/app/main/api/internal/logic/agent/getagentwithdrawallogic.go @@ -9,8 +9,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/getlinkdatalogic.go b/app/main/api/internal/logic/agent/getlinkdatalogic.go index bdb4ae6..8111b63 100644 --- a/app/main/api/internal/logic/agent/getlinkdatalogic.go +++ b/app/main/api/internal/logic/agent/getlinkdatalogic.go @@ -7,8 +7,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go b/app/main/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go index 07e85bf..e5ec17d 100644 --- a/app/main/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go +++ b/app/main/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go @@ -2,14 +2,14 @@ package agent import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/app/getappversionlogic.go b/app/main/api/internal/logic/app/getappversionlogic.go index 3129392..fb8ed4b 100644 --- a/app/main/api/internal/logic/app/getappversionlogic.go +++ b/app/main/api/internal/logic/app/getappversionlogic.go @@ -3,8 +3,8 @@ package app import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/app/healthchecklogic.go b/app/main/api/internal/logic/app/healthchecklogic.go index 07fd63e..31d9453 100644 --- a/app/main/api/internal/logic/app/healthchecklogic.go +++ b/app/main/api/internal/logic/app/healthchecklogic.go @@ -3,8 +3,8 @@ package app import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/auth/sendsmslogic.go b/app/main/api/internal/logic/auth/sendsmslogic.go index 5cd1974..8933fa5 100644 --- a/app/main/api/internal/logic/auth/sendsmslogic.go +++ b/app/main/api/internal/logic/auth/sendsmslogic.go @@ -10,8 +10,8 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" dysmsapi "github.com/alibabacloud-go/dysmsapi-20170525/v3/client" diff --git a/app/main/api/internal/logic/notification/getnotificationslogic.go b/app/main/api/internal/logic/notification/getnotificationslogic.go index 949180f..9b921db 100644 --- a/app/main/api/internal/logic/notification/getnotificationslogic.go +++ b/app/main/api/internal/logic/notification/getnotificationslogic.go @@ -8,8 +8,8 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/pay/alipaycallbacklogic.go b/app/main/api/internal/logic/pay/alipaycallbacklogic.go index eb16430..ab5f184 100644 --- a/app/main/api/internal/logic/pay/alipaycallbacklogic.go +++ b/app/main/api/internal/logic/pay/alipaycallbacklogic.go @@ -10,8 +10,8 @@ import ( "github.com/smartwalle/alipay/v3" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/model" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" diff --git a/app/main/api/internal/logic/pay/iapcallbacklogic.go b/app/main/api/internal/logic/pay/iapcallbacklogic.go index 4958073..6398fe0 100644 --- a/app/main/api/internal/logic/pay/iapcallbacklogic.go +++ b/app/main/api/internal/logic/pay/iapcallbacklogic.go @@ -3,8 +3,8 @@ package pay import ( "context" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/lzUtils" diff --git a/app/main/api/internal/logic/pay/paymentchecklogic.go b/app/main/api/internal/logic/pay/paymentchecklogic.go index 26a0962..78ec11c 100644 --- a/app/main/api/internal/logic/pay/paymentchecklogic.go +++ b/app/main/api/internal/logic/pay/paymentchecklogic.go @@ -4,8 +4,8 @@ import ( "context" "strings" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/xerr" "github.com/pkg/errors" diff --git a/app/main/api/internal/logic/pay/paymentlogic.go b/app/main/api/internal/logic/pay/paymentlogic.go index ccc33cd..5d86422 100644 --- a/app/main/api/internal/logic/pay/paymentlogic.go +++ b/app/main/api/internal/logic/pay/paymentlogic.go @@ -5,9 +5,9 @@ import ( "encoding/hex" "encoding/json" "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go b/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go index 6f5a11d..679e88e 100644 --- a/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go +++ b/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go @@ -6,11 +6,11 @@ import ( "net/http" "strings" "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/service" + "tydata-server/app/main/model" "tydata-server/pkg/lzkit/lzUtils" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/svc" "github.com/wechatpay-apiv3/wechatpay-go/services/payments" "github.com/zeromicro/go-zero/core/logx" diff --git a/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go b/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go index 16ef28c..d6a4ba3 100644 --- a/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go +++ b/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go @@ -3,7 +3,7 @@ package pay import ( "context" "net/http" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/svc" "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" "github.com/zeromicro/go-zero/core/logx" diff --git a/app/main/api/internal/logic/product/getproductappbyenlogic.go b/app/main/api/internal/logic/product/getproductappbyenlogic.go index 16688d9..51c0525 100644 --- a/app/main/api/internal/logic/product/getproductappbyenlogic.go +++ b/app/main/api/internal/logic/product/getproductappbyenlogic.go @@ -2,7 +2,7 @@ package product import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/xerr" "github.com/Masterminds/squirrel" @@ -10,8 +10,8 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/mr" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/product/getproductbyenlogic.go b/app/main/api/internal/logic/product/getproductbyenlogic.go index b980710..3a52146 100644 --- a/app/main/api/internal/logic/product/getproductbyenlogic.go +++ b/app/main/api/internal/logic/product/getproductbyenlogic.go @@ -2,7 +2,7 @@ package product import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/xerr" "github.com/Masterminds/squirrel" @@ -10,8 +10,8 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/mr" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/product/getproductbyidlogic.go b/app/main/api/internal/logic/product/getproductbyidlogic.go index 634c747..fe3ae64 100644 --- a/app/main/api/internal/logic/product/getproductbyidlogic.go +++ b/app/main/api/internal/logic/product/getproductbyidlogic.go @@ -3,8 +3,8 @@ package product import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/querydetailbyorderidlogic.go b/app/main/api/internal/logic/query/querydetailbyorderidlogic.go index a947745..313052c 100644 --- a/app/main/api/internal/logic/query/querydetailbyorderidlogic.go +++ b/app/main/api/internal/logic/query/querydetailbyorderidlogic.go @@ -14,9 +14,9 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/querydetailbyordernologic.go b/app/main/api/internal/logic/query/querydetailbyordernologic.go index 0ef26bb..2570630 100644 --- a/app/main/api/internal/logic/query/querydetailbyordernologic.go +++ b/app/main/api/internal/logic/query/querydetailbyordernologic.go @@ -10,9 +10,9 @@ import ( "github.com/jinzhu/copier" "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/queryexamplelogic copy.go b/app/main/api/internal/logic/query/queryexamplelogic copy.go index 7e3b370..58a77e4 100644 --- a/app/main/api/internal/logic/query/queryexamplelogic copy.go +++ b/app/main/api/internal/logic/query/queryexamplelogic copy.go @@ -4,8 +4,8 @@ package query // "context" // "encoding/hex" // "fmt" -// "tydata-server/app/user/cmd/api/internal/svc" -// "tydata-server/app/user/cmd/api/internal/types" +// "tydata-server/app/main/api/internal/svc" +// "tydata-server/app/main/api/internal/types" // "tydata-server/common/xerr" // "github.com/jinzhu/copier" diff --git a/app/main/api/internal/logic/query/queryexamplelogic.go b/app/main/api/internal/logic/query/queryexamplelogic.go index 98e857d..5c1b720 100644 --- a/app/main/api/internal/logic/query/queryexamplelogic.go +++ b/app/main/api/internal/logic/query/queryexamplelogic.go @@ -3,8 +3,8 @@ package query import ( "context" "encoding/hex" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/query/querygeneratesharelinklogic.go b/app/main/api/internal/logic/query/querygeneratesharelinklogic.go index 5deb818..8fbc8d3 100644 --- a/app/main/api/internal/logic/query/querygeneratesharelinklogic.go +++ b/app/main/api/internal/logic/query/querygeneratesharelinklogic.go @@ -6,9 +6,9 @@ import ( "encoding/json" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/query/querylistlogic.go b/app/main/api/internal/logic/query/querylistlogic.go index 748de85..b586c37 100644 --- a/app/main/api/internal/logic/query/querylistlogic.go +++ b/app/main/api/internal/logic/query/querylistlogic.go @@ -2,8 +2,8 @@ package query import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/ctxdata" "tydata-server/common/xerr" diff --git a/app/main/api/internal/logic/query/queryprovisionalorderlogic.go b/app/main/api/internal/logic/query/queryprovisionalorderlogic.go index 491bd24..df1a599 100644 --- a/app/main/api/internal/logic/query/queryprovisionalorderlogic.go +++ b/app/main/api/internal/logic/query/queryprovisionalorderlogic.go @@ -4,8 +4,8 @@ import ( "context" "encoding/json" "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "tydata-server/common/ctxdata" "tydata-server/common/xerr" diff --git a/app/main/api/internal/logic/query/queryretrylogic.go b/app/main/api/internal/logic/query/queryretrylogic.go index 1457019..184741d 100644 --- a/app/main/api/internal/logic/query/queryretrylogic.go +++ b/app/main/api/internal/logic/query/queryretrylogic.go @@ -6,8 +6,8 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/queryserviceagentlogic.go b/app/main/api/internal/logic/query/queryserviceagentlogic.go index 8d8e652..089007d 100644 --- a/app/main/api/internal/logic/query/queryserviceagentlogic.go +++ b/app/main/api/internal/logic/query/queryserviceagentlogic.go @@ -2,8 +2,8 @@ package query import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/queryserviceapplogic.go b/app/main/api/internal/logic/query/queryserviceapplogic.go index 0b544df..47043c7 100644 --- a/app/main/api/internal/logic/query/queryserviceapplogic.go +++ b/app/main/api/internal/logic/query/queryserviceapplogic.go @@ -3,8 +3,8 @@ package query import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/queryservicelogic.go b/app/main/api/internal/logic/query/queryservicelogic.go index 9bf659a..a92fb94 100644 --- a/app/main/api/internal/logic/query/queryservicelogic.go +++ b/app/main/api/internal/logic/query/queryservicelogic.go @@ -6,7 +6,7 @@ import ( "encoding/json" "fmt" "time" - "tydata-server/app/user/cmd/api/internal/service" + "tydata-server/app/main/api/internal/service" "tydata-server/common/ctxdata" jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" @@ -16,8 +16,8 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/redis" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/querysharedetaillogic.go b/app/main/api/internal/logic/query/querysharedetaillogic.go index 090ec09..51811e3 100644 --- a/app/main/api/internal/logic/query/querysharedetaillogic.go +++ b/app/main/api/internal/logic/query/querysharedetaillogic.go @@ -6,9 +6,9 @@ import ( "fmt" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/query/querysingletestlogic.go b/app/main/api/internal/logic/query/querysingletestlogic.go index 04ba0fe..0f51c98 100644 --- a/app/main/api/internal/logic/query/querysingletestlogic.go +++ b/app/main/api/internal/logic/query/querysingletestlogic.go @@ -7,8 +7,8 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/query/updatequerydatalogic.go b/app/main/api/internal/logic/query/updatequerydatalogic.go index d09a8a2..9dd986b 100644 --- a/app/main/api/internal/logic/query/updatequerydatalogic.go +++ b/app/main/api/internal/logic/query/updatequerydatalogic.go @@ -5,9 +5,9 @@ import ( "database/sql" "encoding/hex" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/user/agentmobilecodeloginlogic.go b/app/main/api/internal/logic/user/agentmobilecodeloginlogic.go index c9d90cd..2ba1db6 100644 --- a/app/main/api/internal/logic/user/agentmobilecodeloginlogic.go +++ b/app/main/api/internal/logic/user/agentmobilecodeloginlogic.go @@ -5,9 +5,9 @@ import ( "database/sql" "fmt" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" @@ -58,8 +58,8 @@ func (l *AgentMobileCodeLoginLogic) AgentMobileCodeLogin(req *types.MobileCodeLo } if user == nil { user = &model.User{Mobile: sql.NullString{String: encryptedMobile, Valid: true}} - // if len(user.Nickname) == 0 { - // user.Nickname = "" + // if len(main.Nickname) == 0 { + // main.Nickname = "" // } if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, user) @@ -68,7 +68,7 @@ func (l *AgentMobileCodeLoginLogic) AgentMobileCodeLogin(req *types.MobileCodeLo } lastId, lastInsertIdErr := insertResult.LastInsertId() if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, main:%+v", lastInsertIdErr, user) } user.Id = lastId diff --git a/app/main/api/internal/logic/user/bindmobilelogic.go b/app/main/api/internal/logic/user/bindmobilelogic.go index 2246902..28e1fd4 100644 --- a/app/main/api/internal/logic/user/bindmobilelogic.go +++ b/app/main/api/internal/logic/user/bindmobilelogic.go @@ -5,9 +5,9 @@ import ( "database/sql" "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/user/canceloutlogic.go b/app/main/api/internal/logic/user/canceloutlogic.go index 1fbc8e1..445934d 100644 --- a/app/main/api/internal/logic/user/canceloutlogic.go +++ b/app/main/api/internal/logic/user/canceloutlogic.go @@ -2,7 +2,7 @@ package user import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" @@ -11,7 +11,7 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/sqlx" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/svc" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/user/detaillogic.go b/app/main/api/internal/logic/user/detaillogic.go index fa03b5e..7c76df9 100644 --- a/app/main/api/internal/logic/user/detaillogic.go +++ b/app/main/api/internal/logic/user/detaillogic.go @@ -2,9 +2,9 @@ package user import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" diff --git a/app/main/api/internal/logic/user/gettokenlogic.go b/app/main/api/internal/logic/user/gettokenlogic.go index 601239e..8c76840 100644 --- a/app/main/api/internal/logic/user/gettokenlogic.go +++ b/app/main/api/internal/logic/user/gettokenlogic.go @@ -9,8 +9,8 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/user/mobilecodeloginlogic.go b/app/main/api/internal/logic/user/mobilecodeloginlogic.go index c74c2bf..643a8e7 100644 --- a/app/main/api/internal/logic/user/mobilecodeloginlogic.go +++ b/app/main/api/internal/logic/user/mobilecodeloginlogic.go @@ -5,9 +5,9 @@ import ( "database/sql" "fmt" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" @@ -60,8 +60,8 @@ func (l *MobileCodeLoginLogic) MobileCodeLogin(req *types.MobileCodeLoginReq) (r } if user == nil { user = &model.User{Mobile: sql.NullString{String: encryptedMobile, Valid: true}} - // if len(user.Nickname) == 0 { - // user.Nickname = encryptedMobile + // if len(main.Nickname) == 0 { + // main.Nickname = encryptedMobile // } if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, user) @@ -70,7 +70,7 @@ func (l *MobileCodeLoginLogic) MobileCodeLogin(req *types.MobileCodeLoginReq) (r } lastId, lastInsertIdErr := insertResult.LastInsertId() if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, main:%+v", lastInsertIdErr, user) } user.Id = lastId diff --git a/app/main/api/internal/logic/user/mobileloginlogic.go b/app/main/api/internal/logic/user/mobileloginlogic.go index 4c214fb..dbfa4ac 100644 --- a/app/main/api/internal/logic/user/mobileloginlogic.go +++ b/app/main/api/internal/logic/user/mobileloginlogic.go @@ -4,7 +4,7 @@ import ( "context" "database/sql" "time" - "tydata-server/app/user/model" + "tydata-server/app/main/model" jwtx "tydata-server/common/jwt" "tydata-server/common/tool" "tydata-server/common/xerr" @@ -13,8 +13,8 @@ import ( "github.com/pkg/errors" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/logic/user/registerlogic.go b/app/main/api/internal/logic/user/registerlogic.go index 48e5ff0..894c5ca 100644 --- a/app/main/api/internal/logic/user/registerlogic.go +++ b/app/main/api/internal/logic/user/registerlogic.go @@ -5,9 +5,9 @@ import ( "database/sql" "fmt" "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" jwtx "tydata-server/common/jwt" "tydata-server/common/tool" "tydata-server/common/xerr" @@ -64,8 +64,8 @@ func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.RegisterRe if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { user := new(model.User) user.Mobile = sql.NullString{String: encryptedMobile, Valid: true} - // if len(user.Nickname) == 0 { - // user.Nickname = encryptedMobile + // if len(main.Nickname) == 0 { + // main.Nickname = encryptedMobile // } if len(req.Password) > 0 { user.Password = lzUtils.StringToNullString(tool.Md5ByString(req.Password)) @@ -76,7 +76,7 @@ func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.RegisterRe } lastId, lastInsertIdErr := insertResult.LastInsertId() if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, main:%+v", lastInsertIdErr, user) } userId = lastId diff --git a/app/main/api/internal/logic/user/wxh5authlogic.go b/app/main/api/internal/logic/user/wxh5authlogic.go index 124cdbc..b39ada2 100644 --- a/app/main/api/internal/logic/user/wxh5authlogic.go +++ b/app/main/api/internal/logic/user/wxh5authlogic.go @@ -7,15 +7,15 @@ import ( "io" "net/http" "time" - "tydata-server/app/user/model" + "tydata-server/app/main/model" jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/sqlx" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) @@ -67,7 +67,7 @@ func (l *WxH5AuthLogic) WxH5Auth(req *types.WXH5AuthReq) (resp *types.WXH5AuthRe if insertErr != nil { return errors.Wrapf(insertErr, "创建新用户失败,openid: %s", accessTokenResp.Openid) } - // 获取插入后生成的 user.Id + // 获取插入后生成的 main.Id lastInsertId, lastInsertIdErr := insertResult.LastInsertId() if lastInsertIdErr != nil { return errors.Wrapf(lastInsertIdErr, "获取新用户ID失败,openid: %s", accessTokenResp.Openid) diff --git a/app/main/api/internal/logic/user/wxminiauthlogic.go b/app/main/api/internal/logic/user/wxminiauthlogic.go index 904644d..af5c021 100644 --- a/app/main/api/internal/logic/user/wxminiauthlogic.go +++ b/app/main/api/internal/logic/user/wxminiauthlogic.go @@ -3,8 +3,8 @@ package user import ( "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/zeromicro/go-zero/core/logx" ) diff --git a/app/main/api/internal/middleware/authinterceptormiddleware.go b/app/main/api/internal/middleware/authinterceptormiddleware.go index 3bf8160..d7703bc 100644 --- a/app/main/api/internal/middleware/authinterceptormiddleware.go +++ b/app/main/api/internal/middleware/authinterceptormiddleware.go @@ -6,7 +6,7 @@ import ( "fmt" "net/http" - "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/main/api/internal/config" "tydata-server/common/ctxdata" jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" diff --git a/app/main/api/internal/queue/cleanQueryData.go b/app/main/api/internal/queue/cleanQueryData.go index 3403928..1e15ba2 100644 --- a/app/main/api/internal/queue/cleanQueryData.go +++ b/app/main/api/internal/queue/cleanQueryData.go @@ -2,11 +2,17 @@ package queue import ( "context" + "database/sql" + "fmt" + "strconv" "time" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/model" + "tydata-server/common/globalkey" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" ) // TASKTIME 定义为每天凌晨3点执行 @@ -22,20 +28,140 @@ func NewCleanQueryDataHandler(svcCtx *svc.ServiceContext) *CleanQueryDataHandler } } -func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) error { - now := time.Now().Format("2006-01-02 15:04:05") - logx.Infof("%s - 开始执行查询数据清理任务", now) - - // 计算3天前的时间 - threeDaysAgo := time.Now().AddDate(0, 0, -30) - - // 调用QueryModel删除3天前的数据 - result, err := l.svcCtx.QueryModel.DeleteBefore(ctx, threeDaysAgo) +// 获取配置值 +func (l *CleanQueryDataHandler) getConfigValue(ctx context.Context, key string) (string, error) { + // 通过缓存获取配置 + config, err := l.svcCtx.QueryCleanupConfigModel.FindOneByConfigKey(ctx, key) + if err != nil { + if err == model.ErrNotFound { + return "", fmt.Errorf("配置项 %s 不存在", key) + } + return "", err + } + + // 检查配置状态 + if config.Status != 1 { + return "", fmt.Errorf("配置项 %s 已禁用或已删除", key) + } + + return config.ConfigValue, nil +} + +func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) error { + now := time.Now() + logx.Infof("%s - 开始执行查询数据清理任务", now.Format("2006-01-02 15:04:05")) + + // 1. 检查是否启用清理 + enableCleanup, err := l.getConfigValue(ctx, "enable_cleanup") + if err != nil { + return err + } + if enableCleanup != "1" { + logx.Infof("查询数据清理任务已禁用") + return nil + } + + // 2. 获取保留天数 + retentionDaysStr, err := l.getConfigValue(ctx, "retention_days") + if err != nil { + return err + } + retentionDays, err := strconv.Atoi(retentionDaysStr) if err != nil { - logx.Errorf("%s - 清理查询数据失败: %v", time.Now().Format("2006-01-02 15:04:05"), err) return err } - logx.Infof("%s - 查询数据清理完成,共删除 %d 条记录", time.Now().Format("2006-01-02 15:04:05"), result) + // 3. 获取批次大小 + batchSizeStr, err := l.getConfigValue(ctx, "batch_size") + if err != nil { + return err + } + batchSize, err := strconv.Atoi(batchSizeStr) + if err != nil { + return err + } + + // 计算清理截止时间 + cleanupBefore := now.AddDate(0, 0, -retentionDays) + + // 创建清理日志记录 + cleanupLog := &model.QueryCleanupLog{ + CleanupTime: now, + CleanupBefore: cleanupBefore, + Status: 1, + Remark: sql.NullString{String: "定时清理数据", Valid: true}, + } + + // 使用事务处理清理操作和日志记录 + err = l.svcCtx.QueryModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { + // 分批处理 + for { + // 1. 查询一批要删除的记录 + builder := l.svcCtx.QueryModel.SelectBuilder(). + Where("create_time < ?", cleanupBefore). + Where("del_state = ?", globalkey.DelStateNo). + Limit(uint64(batchSize)) + + queries, err := l.svcCtx.QueryModel.FindAll(ctx, builder, "") + if err != nil { + cleanupLog.Status = 2 + cleanupLog.ErrorMsg = sql.NullString{String: err.Error(), Valid: true} + return err + } + + if len(queries) == 0 { + break // 没有更多数据需要清理 + } + + // 2. 执行清理 + for _, query := range queries { + err = l.svcCtx.QueryModel.DeleteSoft(ctx, session, query) + if err != nil { + cleanupLog.Status = 2 + cleanupLog.ErrorMsg = sql.NullString{String: err.Error(), Valid: true} + return err + } + } + + // 3. 更新影响行数 + cleanupLog.AffectedRows += int64(len(queries)) + + // 4. 保存清理日志(每批次都记录) + cleanupLogInsertResult, err := l.svcCtx.QueryCleanupLogModel.Insert(ctx, session, cleanupLog) + if err != nil { + return err + } + cleanupLogId, err := cleanupLogInsertResult.LastInsertId() + if err != nil { + return err + } + + // 5. 保存清理明细 + for _, query := range queries { + detail := &model.QueryCleanupDetail{ + CleanupLogId: cleanupLogId, + QueryId: query.Id, + OrderId: query.OrderId, + UserId: query.UserId, + ProductId: query.ProductId, + QueryState: query.QueryState, + CreateTimeOld: query.CreateTime, + } + _, err = l.svcCtx.QueryCleanupDetailModel.Insert(ctx, session, detail) + if err != nil { + return err + } + } + } + + return nil + }) + + if err != nil { + logx.Errorf("%s - 清理查询数据失败: %v", now.Format("2006-01-02 15:04:05"), err) + return err + } + + logx.Infof("%s - 查询数据清理完成,共删除 %d 条记录", now.Format("2006-01-02 15:04:05"), cleanupLog.AffectedRows) return nil } diff --git a/app/main/api/internal/queue/paySuccessNotify.go b/app/main/api/internal/queue/paySuccessNotify.go index 0a5dfd2..caa36cc 100644 --- a/app/main/api/internal/queue/paySuccessNotify.go +++ b/app/main/api/internal/queue/paySuccessNotify.go @@ -8,9 +8,9 @@ import ( "os" "regexp" "strings" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" + "tydata-server/app/main/model" "tydata-server/pkg/lzkit/crypto" "tydata-server/pkg/lzkit/lzUtils" @@ -251,7 +251,7 @@ func (l *PaySuccessNotifyUserHandler) desensitizeParams(data []byte) ([]byte, er func isNameField(key string) bool { key = strings.ToLower(key) return strings.Contains(key, "name") || strings.Contains(key, "姓名") || - strings.Contains(key, "owner") || strings.Contains(key, "user") + strings.Contains(key, "owner") || strings.Contains(key, "main") } // 判断是否为身份证字段 diff --git a/app/main/api/internal/queue/routes.go b/app/main/api/internal/queue/routes.go index 18033b7..88bacfc 100644 --- a/app/main/api/internal/queue/routes.go +++ b/app/main/api/internal/queue/routes.go @@ -3,8 +3,8 @@ package queue import ( "context" "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/svc" + "tydata-server/app/main/api/internal/types" "github.com/hibiken/asynq" ) diff --git a/app/main/api/internal/service/adminPromotionLinkStatsService.go b/app/main/api/internal/service/adminPromotionLinkStatsService.go new file mode 100644 index 0000000..ff8f0f6 --- /dev/null +++ b/app/main/api/internal/service/adminPromotionLinkStatsService.go @@ -0,0 +1,211 @@ +package service + +import ( + "context" + "database/sql" + "time" + + "tydata-server/app/main/model" + "tydata-server/common/xerr" + + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +type AdminPromotionLinkStatsService struct { + logx.Logger + AdminPromotionLinkModel model.AdminPromotionLinkModel + AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel + AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel +} + +func NewAdminPromotionLinkStatsService( + AdminPromotionLinkModel model.AdminPromotionLinkModel, + AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel, + AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel, +) *AdminPromotionLinkStatsService { + return &AdminPromotionLinkStatsService{ + Logger: logx.WithContext(context.Background()), + AdminPromotionLinkModel: AdminPromotionLinkModel, + AdminPromotionLinkStatsTotalModel: AdminPromotionLinkStatsTotalModel, + AdminPromotionLinkStatsHistoryModel: AdminPromotionLinkStatsHistoryModel, + } +} + +// ensureTotalStats 确保总统计记录存在,如果不存在则创建 +func (s *AdminPromotionLinkStatsService) ensureTotalStats(ctx context.Context, session sqlx.Session, linkId int64) (*model.AdminPromotionLinkStatsTotal, error) { + totalStats, err := s.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(ctx, linkId) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + // 如果记录不存在,创建新记录 + totalStats = &model.AdminPromotionLinkStatsTotal{ + LinkId: linkId, + ClickCount: 0, + PayCount: 0, + PayAmount: 0, + } + _, err = s.AdminPromotionLinkStatsTotalModel.Insert(ctx, session, totalStats) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建总统计记录失败: %+v", err) + } + // 重新获取创建后的记录 + totalStats, err = s.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(ctx, linkId) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取新创建的总统计记录失败: %+v", err) + } + } else { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询总统计失败: %+v", err) + } + } + return totalStats, nil +} + +// ensureHistoryStats 确保历史统计记录存在,如果不存在则创建 +func (s *AdminPromotionLinkStatsService) ensureHistoryStats(ctx context.Context, session sqlx.Session, linkId int64, today time.Time) (*model.AdminPromotionLinkStatsHistory, error) { + historyStats, err := s.AdminPromotionLinkStatsHistoryModel.FindOneByLinkIdStatsDate(ctx, linkId, today) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + // 如果记录不存在,创建新记录 + historyStats = &model.AdminPromotionLinkStatsHistory{ + LinkId: linkId, + StatsDate: today, + ClickCount: 0, + PayCount: 0, + PayAmount: 0, + } + _, err = s.AdminPromotionLinkStatsHistoryModel.Insert(ctx, session, historyStats) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建今日统计记录失败: %+v", err) + } + // 重新获取创建后的记录 + historyStats, err = s.AdminPromotionLinkStatsHistoryModel.FindOneByLinkIdStatsDate(ctx, linkId, today) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取新创建的今日统计记录失败: %+v", err) + } + } else { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询今日统计记录失败: %+v", err) + } + } + return historyStats, nil +} + +// UpdateLinkStats 更新推广链接统计 +func (s *AdminPromotionLinkStatsService) UpdateLinkStats(ctx context.Context, linkId int64) error { + return s.AdminPromotionLinkStatsTotalModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { + // 确保总统计记录存在 + totalStats, err := s.ensureTotalStats(ctx, session, linkId) + if err != nil { + return err + } + + // 更新总统计 + totalStats.ClickCount++ + totalStats.LastClickTime = sql.NullTime{Time: time.Now(), Valid: true} + err = s.AdminPromotionLinkStatsTotalModel.UpdateWithVersion(ctx, session, totalStats) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新总统计失败: %+v", err) + } + + // 确保历史统计记录存在 + now := time.Now() + today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local) + historyStats, err := s.ensureHistoryStats(ctx, session, linkId, today) + if err != nil { + return err + } + + // 更新历史统计 + historyStats.ClickCount++ + historyStats.LastClickTime = sql.NullTime{Time: time.Now(), Valid: true} + err = s.AdminPromotionLinkStatsHistoryModel.UpdateWithVersion(ctx, session, historyStats) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新历史统计失败: %+v", err) + } + + return nil + }) +} + +// UpdatePaymentStats 更新付费统计 +func (s *AdminPromotionLinkStatsService) UpdatePaymentStats(ctx context.Context, linkId int64, amount float64) error { + return s.AdminPromotionLinkStatsTotalModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { + // 确保总统计记录存在 + totalStats, err := s.ensureTotalStats(ctx, session, linkId) + if err != nil { + return err + } + + // 更新总统计 + totalStats.PayCount++ + totalStats.PayAmount += amount + totalStats.LastPayTime = sql.NullTime{Time: time.Now(), Valid: true} + err = s.AdminPromotionLinkStatsTotalModel.UpdateWithVersion(ctx, session, totalStats) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新总统计失败: %+v", err) + } + + // 确保历史统计记录存在 + now := time.Now() + today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local) + historyStats, err := s.ensureHistoryStats(ctx, session, linkId, today) + if err != nil { + return err + } + + // 更新历史统计 + historyStats.PayCount++ + historyStats.PayAmount += amount + historyStats.LastPayTime = sql.NullTime{Time: time.Now(), Valid: true} + err = s.AdminPromotionLinkStatsHistoryModel.UpdateWithVersion(ctx, session, historyStats) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新历史统计失败: %+v", err) + } + + return nil + }) +} + +// CreateLinkStats 创建新的推广链接统计记录 +func (s *AdminPromotionLinkStatsService) CreateLinkStats(ctx context.Context, linkId int64) error { + return s.AdminPromotionLinkStatsTotalModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { + // 检查总统计记录是否已存在 + _, err := s.AdminPromotionLinkStatsTotalModel.FindOneByLinkId(ctx, linkId) + if err == nil { + // 记录已存在,不需要创建 + return nil + } + if err != model.ErrNotFound { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询总统计记录失败: %+v", err) + } + + // 创建总统计记录 + totalStats := &model.AdminPromotionLinkStatsTotal{ + LinkId: linkId, + ClickCount: 0, + PayCount: 0, + PayAmount: 0, + } + _, err = s.AdminPromotionLinkStatsTotalModel.Insert(ctx, session, totalStats) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建总统计记录失败: %+v", err) + } + + // 创建今日历史统计记录 + now := time.Now() + today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local) + historyStats := &model.AdminPromotionLinkStatsHistory{ + LinkId: linkId, + StatsDate: today, + ClickCount: 0, + PayCount: 0, + PayAmount: 0, + } + _, err = s.AdminPromotionLinkStatsHistoryModel.Insert(ctx, session, historyStats) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建历史统计记录失败: %+v", err) + } + + return nil + }) +} diff --git a/app/main/api/internal/service/agentService.go b/app/main/api/internal/service/agentService.go index bae3dbb..156c3b5 100644 --- a/app/main/api/internal/service/agentService.go +++ b/app/main/api/internal/service/agentService.go @@ -2,8 +2,8 @@ package service import ( "context" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/config" + "tydata-server/app/main/model" "tydata-server/pkg/lzkit/lzUtils" "github.com/pkg/errors" diff --git a/app/main/api/internal/service/alipayService.go b/app/main/api/internal/service/alipayService.go index b233cbb..1e9a89b 100644 --- a/app/main/api/internal/service/alipayService.go +++ b/app/main/api/internal/service/alipayService.go @@ -9,7 +9,7 @@ import ( "strconv" "sync/atomic" "time" - "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/main/api/internal/config" "tydata-server/pkg/lzkit/lzUtils" "github.com/smartwalle/alipay/v3" @@ -120,7 +120,7 @@ func (a *AliPayService) AliRefund(ctx context.Context, outTradeNo string, refund refund := alipay.TradeRefund{ OutTradeNo: outTradeNo, RefundAmount: lzUtils.ToAlipayAmount(refundAmount), - OutRequestNo: fmt.Sprintf("%s-refund", outTradeNo), + OutRequestNo: fmt.Sprintf("refund-%s", outTradeNo), } // 发起退款请求 diff --git a/app/main/api/internal/service/apirequestService.go b/app/main/api/internal/service/apirequestService.go index e292f56..941bf30 100644 --- a/app/main/api/internal/service/apirequestService.go +++ b/app/main/api/internal/service/apirequestService.go @@ -13,8 +13,8 @@ import ( "sync" "sync/atomic" "time" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/config" + "tydata-server/app/main/model" "tydata-server/pkg/lzkit/crypto" "tydata-server/pkg/lzkit/lzUtils" diff --git a/app/main/api/internal/service/applepayService.go b/app/main/api/internal/service/applepayService.go index 3425d57..53188e9 100644 --- a/app/main/api/internal/service/applepayService.go +++ b/app/main/api/internal/service/applepayService.go @@ -11,7 +11,7 @@ import ( "net/http" "strconv" "time" - "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/main/api/internal/config" "github.com/golang-jwt/jwt/v4" ) diff --git a/app/main/api/internal/service/asynqService.go b/app/main/api/internal/service/asynqService.go index d19256b..ff01e19 100644 --- a/app/main/api/internal/service/asynqService.go +++ b/app/main/api/internal/service/asynqService.go @@ -4,8 +4,8 @@ package service import ( "encoding/json" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/main/api/internal/config" + "tydata-server/app/main/api/internal/types" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" diff --git a/app/main/api/internal/service/dictService.go b/app/main/api/internal/service/dictService.go new file mode 100644 index 0000000..4c8acc1 --- /dev/null +++ b/app/main/api/internal/service/dictService.go @@ -0,0 +1,47 @@ +package service + +import ( + "context" + "errors" + "tydata-server/app/main/model" +) + +type DictService struct { + adminDictTypeModel model.AdminDictTypeModel + adminDictDataModel model.AdminDictDataModel +} + +func NewDictService(adminDictTypeModel model.AdminDictTypeModel, adminDictDataModel model.AdminDictDataModel) *DictService { + return &DictService{adminDictTypeModel: adminDictTypeModel, adminDictDataModel: adminDictDataModel} +} +func (s *DictService) GetDictLabel(ctx context.Context, dictType string, dictValue int64) (string, error) { + dictTypeModel, err := s.adminDictTypeModel.FindOneByDictType(ctx, dictType) + if err != nil { + return "", err + } + if dictTypeModel.Status != 1 { + return "", errors.New("字典类型未启用") + } + dictData, err := s.adminDictDataModel.FindOneByDictTypeDictValue(ctx, dictTypeModel.DictType, dictValue) + if err != nil { + return "", err + } + if dictData.Status != 1 { + return "", errors.New("字典数据未启用") + } + return dictData.DictLabel, nil +} +func (s *DictService) GetDictValue(ctx context.Context, dictType string, dictLabel string) (int64, error) { + dictTypeModel, err := s.adminDictTypeModel.FindOneByDictType(ctx, dictType) + if err != nil { + return 0, err + } + if dictTypeModel.Status != 1 { + return 0, errors.New("字典类型未启用") + } + dictData, err := s.adminDictDataModel.FindOneByDictTypeDictLabel(ctx, dictTypeModel.DictType, dictLabel) + if err != nil { + return 0, err + } + return dictData.DictValue, nil +} diff --git a/app/main/api/internal/service/userService.go b/app/main/api/internal/service/userService.go index bac9aa6..f5c7bab 100644 --- a/app/main/api/internal/service/userService.go +++ b/app/main/api/internal/service/userService.go @@ -2,7 +2,7 @@ package service import ( "context" - "tydata-server/app/user/model" + "tydata-server/app/main/model" "github.com/google/uuid" "github.com/zeromicro/go-zero/core/stores/sqlx" diff --git a/app/main/api/internal/service/verificationService.go b/app/main/api/internal/service/verificationService.go index 4b4fb5f..0b380a3 100644 --- a/app/main/api/internal/service/verificationService.go +++ b/app/main/api/internal/service/verificationService.go @@ -7,7 +7,7 @@ import ( "net/http" "net/url" "strings" - "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/main/api/internal/config" "tydata-server/pkg/lzkit/crypto" "github.com/tidwall/gjson" diff --git a/app/main/api/internal/service/wechatpayService.go b/app/main/api/internal/service/wechatpayService.go index 68b22d9..7c4a684 100644 --- a/app/main/api/internal/service/wechatpayService.go +++ b/app/main/api/internal/service/wechatpayService.go @@ -6,8 +6,8 @@ import ( "net/http" "strconv" "time" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/config" + "tydata-server/app/main/model" "tydata-server/common/ctxdata" "tydata-server/pkg/lzkit/lzUtils" diff --git a/app/main/api/internal/service/westdexService.go b/app/main/api/internal/service/westdexService.go index e3f635e..3f4bfae 100644 --- a/app/main/api/internal/service/westdexService.go +++ b/app/main/api/internal/service/westdexService.go @@ -8,7 +8,7 @@ import ( "net/http" "strconv" "time" - "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/main/api/internal/config" "tydata-server/pkg/lzkit/crypto" "github.com/pkg/errors" diff --git a/app/main/api/internal/service/yushanService.go b/app/main/api/internal/service/yushanService.go index 33b5be8..9c53f9b 100644 --- a/app/main/api/internal/service/yushanService.go +++ b/app/main/api/internal/service/yushanService.go @@ -13,7 +13,7 @@ import ( "net/http" "strings" "time" - "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/main/api/internal/config" "github.com/tidwall/gjson" ) diff --git a/app/main/api/internal/svc/servicecontext.go b/app/main/api/internal/svc/servicecontext.go index 001dbb0..0fecf0b 100644 --- a/app/main/api/internal/svc/servicecontext.go +++ b/app/main/api/internal/svc/servicecontext.go @@ -1,30 +1,46 @@ package svc import ( - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/cmd/api/internal/middleware" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/model" + "tydata-server/app/main/api/internal/config" + "tydata-server/app/main/api/internal/middleware" + "tydata-server/app/main/api/internal/service" + "tydata-server/app/main/model" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest" ) +// ServiceContext 服务上下文 type ServiceContext struct { - Config config.Config - Redis *redis.Redis - SourceInterceptor rest.Middleware - AuthInterceptor rest.Middleware - UserModel model.UserModel - UserAuthModel model.UserAuthModel - ProductModel model.ProductModel - FeatureModel model.FeatureModel - ProductFeatureModel model.ProductFeatureModel - OrderModel model.OrderModel - QueryModel model.QueryModel + Config config.Config + Redis *redis.Redis + + // 中间件 + SourceInterceptor rest.Middleware + AuthInterceptor rest.Middleware + + // 用户相关模型 + UserModel model.UserModel + UserAuthModel model.UserAuthModel + + // 产品相关模型 + ProductModel model.ProductModel + FeatureModel model.FeatureModel + ProductFeatureModel model.ProductFeatureModel + + // 订单相关模型 + OrderModel model.OrderModel + OrderRefundModel model.OrderRefundModel + QueryModel model.QueryModel + QueryCleanupLogModel model.QueryCleanupLogModel + QueryCleanupDetailModel model.QueryCleanupDetailModel + QueryCleanupConfigModel model.QueryCleanupConfigModel + + // 代理相关模型 AgentModel model.AgentModel AgentAuditModel model.AgentAuditModel AgentClosureModel model.AgentClosureModel @@ -42,30 +58,221 @@ type ServiceContext struct { AgentActiveStatModel model.AgentActiveStatModel AgentWithdrawalModel model.AgentWithdrawalModel AgentRealNameModel model.AgentRealNameModel - ExampleModel model.ExampleModel - GlobalNotificationsModel model.GlobalNotificationsModel - AlipayService *service.AliPayService - WechatPayService *service.WechatPayService - ApplePayService *service.ApplePayService - WestDexService *service.WestDexService - YushanService *service.YushanService - ApiRequestService *service.ApiRequestService - AsynqServer *asynq.Server // 服务端 - AsynqService *service.AsynqService // 客户端 - VerificationService *service.VerificationService - AgentService *service.AgentService - UserService *service.UserService + + // 管理后台相关模型 + AdminApiModel model.AdminApiModel + AdminMenuModel model.AdminMenuModel + AdminRoleModel model.AdminRoleModel + AdminRoleApiModel model.AdminRoleApiModel + AdminRoleMenuModel model.AdminRoleMenuModel + AdminUserModel model.AdminUserModel + AdminUserRoleModel model.AdminUserRoleModel + AdminDictDataModel model.AdminDictDataModel + AdminDictTypeModel model.AdminDictTypeModel + AdminPromotionLinkModel model.AdminPromotionLinkModel + AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel + AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel + AdminPromotionOrderModel model.AdminPromotionOrderModel + + // 其他模型 + ExampleModel model.ExampleModel + GlobalNotificationsModel model.GlobalNotificationsModel + + // 服务 + AlipayService *service.AliPayService + WechatPayService *service.WechatPayService + ApplePayService *service.ApplePayService + WestDexService *service.WestDexService + YushanService *service.YushanService + ApiRequestService *service.ApiRequestService + AsynqServer *asynq.Server + AsynqService *service.AsynqService + VerificationService *service.VerificationService + AgentService *service.AgentService + UserService *service.UserService + DictService *service.DictService + AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService } -func NewServiceContext(c config.Config) *ServiceContext { - db := sqlx.NewMysql(c.DataSource) +// 用户相关模型初始化 +type userModels struct { + UserModel model.UserModel + UserAuthModel model.UserAuthModel +} - redisConf := redis.RedisConf{ - Host: c.CacheRedis[0].Host, - Pass: c.CacheRedis[0].Pass, - Type: c.CacheRedis[0].Type, +func initUserModels(db sqlx.SqlConn, redis cache.CacheConf) userModels { + return userModels{ + UserModel: model.NewUserModel(db, redis), + UserAuthModel: model.NewUserAuthModel(db, redis), } +} +// 产品相关模型初始化 +type productModels struct { + ProductModel model.ProductModel + FeatureModel model.FeatureModel + ProductFeatureModel model.ProductFeatureModel +} + +func initProductModels(db sqlx.SqlConn, redis cache.CacheConf) productModels { + return productModels{ + ProductModel: model.NewProductModel(db, redis), + FeatureModel: model.NewFeatureModel(db, redis), + ProductFeatureModel: model.NewProductFeatureModel(db, redis), + } +} + +// 订单相关模型初始化 +type orderModels struct { + OrderModel model.OrderModel + QueryModel model.QueryModel + OrderRefundModel model.OrderRefundModel + QueryCleanupLogModel model.QueryCleanupLogModel + QueryCleanupDetailModel model.QueryCleanupDetailModel + QueryCleanupConfigModel model.QueryCleanupConfigModel +} + +func initOrderModels(db sqlx.SqlConn, redis cache.CacheConf) orderModels { + return orderModels{ + OrderModel: model.NewOrderModel(db, redis), + QueryModel: model.NewQueryModel(db, redis), + OrderRefundModel: model.NewOrderRefundModel(db, redis), + QueryCleanupLogModel: model.NewQueryCleanupLogModel(db, redis), + QueryCleanupDetailModel: model.NewQueryCleanupDetailModel(db, redis), + QueryCleanupConfigModel: model.NewQueryCleanupConfigModel(db, redis), + } +} + +// 代理相关模型初始化 +type agentModels struct { + AgentModel model.AgentModel + AgentAuditModel model.AgentAuditModel + AgentClosureModel model.AgentClosureModel + AgentCommissionModel model.AgentCommissionModel + AgentCommissionDeductionModel model.AgentCommissionDeductionModel + AgentWalletModel model.AgentWalletModel + AgentLinkModel model.AgentLinkModel + AgentOrderModel model.AgentOrderModel + AgentRewardsModel model.AgentRewardsModel + AgentMembershipConfigModel model.AgentMembershipConfigModel + AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel + AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel + AgentProductConfigModel model.AgentProductConfigModel + AgentPlatformDeductionModel model.AgentPlatformDeductionModel + AgentActiveStatModel model.AgentActiveStatModel + AgentWithdrawalModel model.AgentWithdrawalModel + AgentRealNameModel model.AgentRealNameModel +} + +func initAgentModels(db sqlx.SqlConn, redis cache.CacheConf) agentModels { + return agentModels{ + AgentModel: model.NewAgentModel(db, redis), + AgentAuditModel: model.NewAgentAuditModel(db, redis), + AgentClosureModel: model.NewAgentClosureModel(db, redis), + AgentCommissionModel: model.NewAgentCommissionModel(db, redis), + AgentCommissionDeductionModel: model.NewAgentCommissionDeductionModel(db, redis), + AgentWalletModel: model.NewAgentWalletModel(db, redis), + AgentLinkModel: model.NewAgentLinkModel(db, redis), + AgentOrderModel: model.NewAgentOrderModel(db, redis), + AgentRewardsModel: model.NewAgentRewardsModel(db, redis), + AgentMembershipConfigModel: model.NewAgentMembershipConfigModel(db, redis), + AgentMembershipRechargeOrderModel: model.NewAgentMembershipRechargeOrderModel(db, redis), + AgentMembershipUserConfigModel: model.NewAgentMembershipUserConfigModel(db, redis), + AgentProductConfigModel: model.NewAgentProductConfigModel(db, redis), + AgentPlatformDeductionModel: model.NewAgentPlatformDeductionModel(db, redis), + AgentActiveStatModel: model.NewAgentActiveStatModel(db, redis), + AgentWithdrawalModel: model.NewAgentWithdrawalModel(db, redis), + AgentRealNameModel: model.NewAgentRealNameModel(db, redis), + } +} + +// 管理后台相关模型初始化 +type adminModels struct { + AdminApiModel model.AdminApiModel + AdminMenuModel model.AdminMenuModel + AdminRoleModel model.AdminRoleModel + AdminRoleApiModel model.AdminRoleApiModel + AdminRoleMenuModel model.AdminRoleMenuModel + AdminUserModel model.AdminUserModel + AdminUserRoleModel model.AdminUserRoleModel + AdminDictDataModel model.AdminDictDataModel + AdminDictTypeModel model.AdminDictTypeModel + AdminPromotionLinkModel model.AdminPromotionLinkModel + AdminPromotionLinkStatsTotalModel model.AdminPromotionLinkStatsTotalModel + AdminPromotionLinkStatsHistoryModel model.AdminPromotionLinkStatsHistoryModel + AdminPromotionOrderModel model.AdminPromotionOrderModel +} + +func initAdminModels(db sqlx.SqlConn, redis cache.CacheConf) adminModels { + return adminModels{ + AdminApiModel: model.NewAdminApiModel(db, redis), + AdminMenuModel: model.NewAdminMenuModel(db, redis), + AdminRoleModel: model.NewAdminRoleModel(db, redis), + AdminRoleApiModel: model.NewAdminRoleApiModel(db, redis), + AdminRoleMenuModel: model.NewAdminRoleMenuModel(db, redis), + AdminUserModel: model.NewAdminUserModel(db, redis), + AdminUserRoleModel: model.NewAdminUserRoleModel(db, redis), + AdminDictDataModel: model.NewAdminDictDataModel(db, redis), + AdminDictTypeModel: model.NewAdminDictTypeModel(db, redis), + AdminPromotionLinkModel: model.NewAdminPromotionLinkModel(db, redis), + AdminPromotionLinkStatsTotalModel: model.NewAdminPromotionLinkStatsTotalModel(db, redis), + AdminPromotionLinkStatsHistoryModel: model.NewAdminPromotionLinkStatsHistoryModel(db, redis), + AdminPromotionOrderModel: model.NewAdminPromotionOrderModel(db, redis), + } +} + +// 其他模型初始化 +type otherModels struct { + ExampleModel model.ExampleModel + GlobalNotificationsModel model.GlobalNotificationsModel +} + +func initOtherModels(db sqlx.SqlConn, redis cache.CacheConf) otherModels { + return otherModels{ + ExampleModel: model.NewExampleModel(db, redis), + GlobalNotificationsModel: model.NewGlobalNotificationsModel(db, redis), + } +} + +// 服务初始化 +type services struct { + AlipayService *service.AliPayService + WechatPayService *service.WechatPayService + ApplePayService *service.ApplePayService + WestDexService *service.WestDexService + YushanService *service.YushanService + ApiRequestService *service.ApiRequestService + AsynqServer *asynq.Server + AsynqService *service.AsynqService + VerificationService *service.VerificationService + AgentService *service.AgentService + UserService *service.UserService + DictService *service.DictService + AdminPromotionLinkStatsService *service.AdminPromotionLinkStatsService +} + +func initServices(c config.Config, userAuthModel model.UserAuthModel, westDexService *service.WestDexService, + yushanService *service.YushanService, featureModel model.FeatureModel, + productFeatureModel model.ProductFeatureModel, agentModels agentModels, + userModels userModels, adminModels adminModels) services { + + alipayService := service.NewAliPayService(c) + wechatPayService := service.NewWechatPayService(c, userAuthModel, service.InitTypeWxPayPubKey) + applePayService := service.NewApplePayService(c) + apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel) + verificationService := service.NewVerificationService(c, westDexService, apiRequestService) + asynqService := service.NewAsynqService(c) + agentService := service.NewAgentService(c, agentModels.AgentModel, agentModels.AgentAuditModel, + agentModels.AgentClosureModel, agentModels.AgentCommissionModel, + agentModels.AgentCommissionDeductionModel, agentModels.AgentWalletModel, + agentModels.AgentLinkModel, agentModels.AgentOrderModel, agentModels.AgentRewardsModel, + agentModels.AgentMembershipConfigModel, agentModels.AgentMembershipRechargeOrderModel, + agentModels.AgentMembershipUserConfigModel, agentModels.AgentProductConfigModel, + agentModels.AgentPlatformDeductionModel, agentModels.AgentActiveStatModel, + agentModels.AgentWithdrawalModel) + userService := service.NewUserService(userModels.UserModel, userModels.UserAuthModel) + dictService := service.NewDictService(adminModels.AdminDictTypeModel, adminModels.AdminDictDataModel) + AdminPromotionLinkStatsService := service.NewAdminPromotionLinkStatsService(adminModels.AdminPromotionLinkModel, adminModels.AdminPromotionLinkStatsTotalModel, adminModels.AdminPromotionLinkStatsHistoryModel) asynqServer := asynq.NewServer( asynq.RedisClientOpt{Addr: c.CacheRedis[0].Host, Password: c.CacheRedis[0].Pass}, asynq.Config{ @@ -77,90 +284,128 @@ func NewServiceContext(c config.Config) *ServiceContext { }, ) + return services{ + AlipayService: alipayService, + WechatPayService: wechatPayService, + ApplePayService: applePayService, + WestDexService: westDexService, + YushanService: yushanService, + ApiRequestService: apiRequestService, + AsynqServer: asynqServer, + AsynqService: asynqService, + VerificationService: verificationService, + AgentService: agentService, + UserService: userService, + DictService: dictService, + AdminPromotionLinkStatsService: AdminPromotionLinkStatsService, + } +} + +// NewServiceContext 创建服务上下文 +func NewServiceContext(c config.Config) *ServiceContext { + db := sqlx.NewMysql(c.DataSource) + + // 使用配置中的CacheRedis配置 + cacheConf := c.CacheRedis + + // 初始化Redis客户端(用于异步任务等) + redisConf := redis.RedisConf{ + Host: cacheConf[0].Host, + Pass: cacheConf[0].Pass, + Type: cacheConf[0].Type, + } + redisClient := redis.MustNewRedis(redisConf) + + // 初始化各个模块的模型 + userModels := initUserModels(db, cacheConf) + productModels := initProductModels(db, cacheConf) + orderModels := initOrderModels(db, cacheConf) + agentModels := initAgentModels(db, cacheConf) + adminModels := initAdminModels(db, cacheConf) + otherModels := initOtherModels(db, cacheConf) + + // 初始化第三方服务 westDexService := service.NewWestDexService(c) yushanService := service.NewYushanService(c) - productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis) - featureModel := model.NewFeatureModel(db, c.CacheRedis) - userAuthModel := model.NewUserAuthModel(db, c.CacheRedis) - userModel := model.NewUserModel(db, c.CacheRedis) - productModel := model.NewProductModel(db, c.CacheRedis) - orderModel := model.NewOrderModel(db, c.CacheRedis) - queryModel := model.NewQueryModel(db, c.CacheRedis) - globalNotificationsModel := model.NewGlobalNotificationsModel(db, c.CacheRedis) + // 初始化所有服务 + services := initServices(c, userModels.UserAuthModel, westDexService, yushanService, + productModels.FeatureModel, productModels.ProductFeatureModel, agentModels, userModels, adminModels) - agentModel := model.NewAgentModel(db, c.CacheRedis) - agentAuditModel := model.NewAgentAuditModel(db, c.CacheRedis) - agentCommissionModel := model.NewAgentCommissionModel(db, c.CacheRedis) - agentCommissionDeductionModel := model.NewAgentCommissionDeductionModel(db, c.CacheRedis) - agentWalletModel := model.NewAgentWalletModel(db, c.CacheRedis) - agentClosureModel := model.NewAgentClosureModel(db, c.CacheRedis) - agentLinkModel := model.NewAgentLinkModel(db, c.CacheRedis) - agentOrderModel := model.NewAgentOrderModel(db, c.CacheRedis) - agentRewardsModel := model.NewAgentRewardsModel(db, c.CacheRedis) - agentMembershipConfigModel := model.NewAgentMembershipConfigModel(db, c.CacheRedis) - agentMembershipRechargeOrderModel := model.NewAgentMembershipRechargeOrderModel(db, c.CacheRedis) - agentMembershipUserConfigModel := model.NewAgentMembershipUserConfigModel(db, c.CacheRedis) - agentProductConfigModel := model.NewAgentProductConfigModel(db, c.CacheRedis) - agentPlatformDeductionModel := model.NewAgentPlatformDeductionModel(db, c.CacheRedis) - agentActiveStatModel := model.NewAgentActiveStatModel(db, c.CacheRedis) - agentWithdrawalModel := model.NewAgentWithdrawalModel(db, c.CacheRedis) - agentRealNameModel := model.NewAgentRealNameModel(db, c.CacheRedis) - exampleModel := model.NewExampleModel(db, c.CacheRedis) - - alipayService := service.NewAliPayService(c) - wechatPayService := service.NewWechatPayService(c, userAuthModel, service.InitTypeWxPayPubKey) - applePayService := service.NewApplePayService(c) - apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel) - verificationService := service.NewVerificationService(c, westDexService, apiRequestService) - asynqService := service.NewAsynqService(c) - agentService := service.NewAgentService(c, agentModel, agentAuditModel, agentClosureModel, agentCommissionModel, - agentCommissionDeductionModel, agentWalletModel, agentLinkModel, agentOrderModel, agentRewardsModel, - agentMembershipConfigModel, agentMembershipRechargeOrderModel, agentMembershipUserConfigModel, - agentProductConfigModel, agentPlatformDeductionModel, agentActiveStatModel, agentWithdrawalModel) - userService := service.NewUserService(userModel, userAuthModel) return &ServiceContext{ - Config: c, - Redis: redis.MustNewRedis(redisConf), - SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle, - AuthInterceptor: middleware.NewAuthInterceptorMiddleware(c).Handle, - AlipayService: alipayService, - WechatPayService: wechatPayService, - ApplePayService: applePayService, - WestDexService: westDexService, - YushanService: yushanService, - VerificationService: verificationService, - AsynqServer: asynqServer, - ApiRequestService: apiRequestService, - AsynqService: asynqService, - AgentService: agentService, - UserModel: userModel, - UserAuthModel: userAuthModel, - ProductModel: productModel, - OrderModel: orderModel, - QueryModel: queryModel, - GlobalNotificationsModel: globalNotificationsModel, - FeatureModel: featureModel, - ProductFeatureModel: productFeatureModel, - AgentModel: agentModel, - AgentAuditModel: agentAuditModel, - AgentCommissionModel: agentCommissionModel, - AgentCommissionDeductionModel: agentCommissionDeductionModel, - AgentWalletModel: agentWalletModel, - AgentClosureModel: agentClosureModel, - AgentLinkModel: agentLinkModel, - AgentOrderModel: agentOrderModel, - AgentRewardsModel: agentRewardsModel, - AgentMembershipConfigModel: agentMembershipConfigModel, - AgentMembershipRechargeOrderModel: agentMembershipRechargeOrderModel, - AgentMembershipUserConfigModel: agentMembershipUserConfigModel, - AgentProductConfigModel: agentProductConfigModel, - AgentPlatformDeductionModel: agentPlatformDeductionModel, - AgentActiveStatModel: agentActiveStatModel, - AgentWithdrawalModel: agentWithdrawalModel, - AgentRealNameModel: agentRealNameModel, - ExampleModel: exampleModel, - UserService: userService, + Config: c, + Redis: redisClient, + SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle, + AuthInterceptor: middleware.NewAuthInterceptorMiddleware(c).Handle, + + // 用户相关模型 + UserModel: userModels.UserModel, + UserAuthModel: userModels.UserAuthModel, + + // 产品相关模型 + ProductModel: productModels.ProductModel, + FeatureModel: productModels.FeatureModel, + ProductFeatureModel: productModels.ProductFeatureModel, + + // 订单相关模型 + OrderModel: orderModels.OrderModel, + QueryModel: orderModels.QueryModel, + OrderRefundModel: orderModels.OrderRefundModel, + QueryCleanupLogModel: orderModels.QueryCleanupLogModel, + QueryCleanupDetailModel: orderModels.QueryCleanupDetailModel, + QueryCleanupConfigModel: orderModels.QueryCleanupConfigModel, + // 代理相关模型 + AgentModel: agentModels.AgentModel, + AgentAuditModel: agentModels.AgentAuditModel, + AgentClosureModel: agentModels.AgentClosureModel, + AgentCommissionModel: agentModels.AgentCommissionModel, + AgentCommissionDeductionModel: agentModels.AgentCommissionDeductionModel, + AgentWalletModel: agentModels.AgentWalletModel, + AgentLinkModel: agentModels.AgentLinkModel, + AgentOrderModel: agentModels.AgentOrderModel, + AgentRewardsModel: agentModels.AgentRewardsModel, + AgentMembershipConfigModel: agentModels.AgentMembershipConfigModel, + AgentMembershipRechargeOrderModel: agentModels.AgentMembershipRechargeOrderModel, + AgentMembershipUserConfigModel: agentModels.AgentMembershipUserConfigModel, + AgentProductConfigModel: agentModels.AgentProductConfigModel, + AgentPlatformDeductionModel: agentModels.AgentPlatformDeductionModel, + AgentActiveStatModel: agentModels.AgentActiveStatModel, + AgentWithdrawalModel: agentModels.AgentWithdrawalModel, + AgentRealNameModel: agentModels.AgentRealNameModel, + + // 管理后台相关模型 + AdminApiModel: adminModels.AdminApiModel, + AdminMenuModel: adminModels.AdminMenuModel, + AdminRoleModel: adminModels.AdminRoleModel, + AdminRoleApiModel: adminModels.AdminRoleApiModel, + AdminRoleMenuModel: adminModels.AdminRoleMenuModel, + AdminUserModel: adminModels.AdminUserModel, + AdminUserRoleModel: adminModels.AdminUserRoleModel, + AdminDictDataModel: adminModels.AdminDictDataModel, + AdminDictTypeModel: adminModels.AdminDictTypeModel, + AdminPromotionLinkModel: adminModels.AdminPromotionLinkModel, + AdminPromotionLinkStatsTotalModel: adminModels.AdminPromotionLinkStatsTotalModel, + AdminPromotionLinkStatsHistoryModel: adminModels.AdminPromotionLinkStatsHistoryModel, + AdminPromotionOrderModel: adminModels.AdminPromotionOrderModel, + + // 其他模型 + ExampleModel: otherModels.ExampleModel, + GlobalNotificationsModel: otherModels.GlobalNotificationsModel, + + // 服务 + AlipayService: services.AlipayService, + WechatPayService: services.WechatPayService, + ApplePayService: services.ApplePayService, + WestDexService: services.WestDexService, + YushanService: services.YushanService, + ApiRequestService: services.ApiRequestService, + AsynqServer: services.AsynqServer, + AsynqService: services.AsynqService, + VerificationService: services.VerificationService, + AgentService: services.AgentService, + UserService: services.UserService, + DictService: services.DictService, + AdminPromotionLinkStatsService: services.AdminPromotionLinkStatsService, } } diff --git a/app/main/api/internal/types/types.go b/app/main/api/internal/types/types.go index 637703e..ff6e586 100644 --- a/app/main/api/internal/types/types.go +++ b/app/main/api/internal/types/types.go @@ -15,6 +15,698 @@ type ActiveRewardData struct { SubWithdrawReward float64 `json:"sub_withdraw_reward"` } +type AdminCreateFeatureReq struct { + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 描述 +} + +type AdminCreateFeatureResp struct { + Id int64 `json:"id"` // 功能ID +} + +type AdminCreateNotificationReq struct { + Title string `json:"title"` // 通知标题 + NotificationPage string `json:"notification_page"` // 通知页面 + Content string `json:"content"` // 通知内容 + StartDate string `json:"start_date"` // 生效开始日期(yyyy-MM-dd) + StartTime string `json:"start_time"` // 生效开始时间(HH:mm:ss) + EndDate string `json:"end_date"` // 生效结束日期(yyyy-MM-dd) + EndTime string `json:"end_time"` // 生效结束时间(HH:mm:ss) + Status int64 `json:"status"` // 状态:1-启用,0-禁用 +} + +type AdminCreateNotificationResp struct { + Id int64 `json:"id"` // 通知ID +} + +type AdminCreateOrderReq struct { + OrderNo string `json:"order_no"` // 商户订单号 + PlatformOrderId string `json:"platform_order_id"` // 支付订单号 + ProductName string `json:"product_name"` // 产品名称 + PaymentPlatform string `json:"payment_platform"` // 支付方式 + PaymentScene string `json:"payment_scene"` // 支付平台 + Amount float64 `json:"amount"` // 金额 + Status string `json:"status,default=pending"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + IsPromotion int64 `json:"is_promotion,default=0"` // 是否推广订单:0-否,1-是 +} + +type AdminCreateOrderResp struct { + Id int64 `json:"id"` // 订单ID +} + +type AdminCreatePlatformUserReq struct { + Mobile string `json:"mobile"` // 手机号 + Password string `json:"password"` // 密码 + Nickname string `json:"nickname"` // 昵称 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 +} + +type AdminCreatePlatformUserResp struct { + Id int64 `json:"id"` // 用户ID +} + +type AdminCreateProductReq struct { + ProductName string `json:"product_name"` // 服务名 + ProductEn string `json:"product_en"` // 英文名 + Description string `json:"description"` // 描述 + Notes string `json:"notes,optional"` // 备注 + CostPrice float64 `json:"cost_price"` // 成本 + SellPrice float64 `json:"sell_price"` // 售价 +} + +type AdminCreateProductResp struct { + Id int64 `json:"id"` // 产品ID +} + +type AdminCreateUserReq struct { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 +} + +type AdminCreateUserResp struct { + Id int64 `json:"id"` // 用户ID +} + +type AdminDeleteFeatureReq struct { + Id int64 `path:"id"` // 功能ID +} + +type AdminDeleteFeatureResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminDeleteNotificationReq struct { + Id int64 `path:"id"` // 通知ID +} + +type AdminDeleteNotificationResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminDeleteOrderReq struct { + Id int64 `path:"id"` // 订单ID +} + +type AdminDeleteOrderResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminDeletePlatformUserReq struct { + Id int64 `path:"id"` // 用户ID +} + +type AdminDeletePlatformUserResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminDeleteProductReq struct { + Id int64 `path:"id"` // 产品ID +} + +type AdminDeleteProductResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminDeleteUserReq struct { + Id int64 `path:"id"` // 用户ID +} + +type AdminDeleteUserResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminGetAgentCommissionDeductionListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名(可选) + Type *string `form:"type,optional"` // 类型(cost/pricing,可选) + Status *int64 `form:"status,optional"` // 状态(可选) +} + +type AdminGetAgentCommissionDeductionListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentCommissionDeductionListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentCommissionListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名(可选) + Status *int64 `form:"status,optional"` // 状态(可选) +} + +type AdminGetAgentCommissionListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentCommissionListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentLinkListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名(可选) + LinkIdentifier *string `form:"link_identifier,optional"` // 推广码(可选) +} + +type AdminGetAgentLinkListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentLinkListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + Mobile *string `form:"mobile,optional"` // 手机号(可选) + Region *string `form:"region,optional"` // 区域(可选) + ParentAgentId *int64 `form:"parent_agent_id,optional"` // 上级代理ID(可选) +} + +type AdminGetAgentListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentMembershipConfigListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + LevelName *string `form:"level_name,optional"` // 会员级别名称(可选) +} + +type AdminGetAgentMembershipConfigListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentMembershipConfigListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentMembershipRechargeOrderListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + UserId *int64 `form:"user_id,optional"` // 用户ID(可选) + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + OrderNo *string `form:"order_no,optional"` // 订单号(可选) + PlatformOrderId *string `form:"platform_order_id,optional"` // 平台订单号(可选) + Status *string `form:"status,optional"` // 状态(可选) + PaymentMethod *string `form:"payment_method,optional"` // 支付方式(可选) +} + +type AdminGetAgentMembershipRechargeOrderListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentMembershipRechargeOrderListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentPlatformDeductionListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + Type *string `form:"type,optional"` // 类型(cost/pricing,可选) + Status *int64 `form:"status,optional"` // 状态(可选) +} + +type AdminGetAgentPlatformDeductionListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentPlatformDeductionListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentProductionConfigListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ProductName *string `form:"product_name,optional"` // 产品名(可选) + Id *int64 `form:"id,optional"` // 配置ID(可选) +} + +type AdminGetAgentProductionConfigListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentProductionConfigItem `json:"items"` // 列表数据 +} + +type AdminGetAgentRewardListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + RelationAgentId *int64 `form:"relation_agent_id,optional"` // 关联代理ID(可选) + Type *string `form:"type,optional"` // 奖励类型(可选) +} + +type AdminGetAgentRewardListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentRewardListItem `json:"items"` // 列表数据 +} + +type AdminGetAgentWithdrawalListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + Status *int64 `form:"status,optional"` // 状态(可选) + WithdrawNo *string `form:"withdraw_no,optional"` // 提现单号(可选) +} + +type AdminGetAgentWithdrawalListResp struct { + Total int64 `json:"total"` // 总数 + Items []AgentWithdrawalListItem `json:"items"` // 列表数据 +} + +type AdminGetFeatureDetailReq struct { + Id int64 `path:"id"` // 功能ID +} + +type AdminGetFeatureDetailResp struct { + Id int64 `json:"id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 描述 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminGetFeatureListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ApiId *string `form:"api_id,optional"` // API标识 + Name *string `form:"name,optional"` // 描述 +} + +type AdminGetFeatureListResp struct { + Total int64 `json:"total"` // 总数 + Items []FeatureListItem `json:"items"` // 列表数据 +} + +type AdminGetNotificationDetailReq struct { + Id int64 `path:"id"` // 通知ID +} + +type AdminGetNotificationDetailResp struct { + Id int64 `json:"id"` // 通知ID + Title string `json:"title"` // 通知标题 + Content string `json:"content"` // 通知内容 + NotificationPage string `json:"notification_page"` // 通知页面 + StartDate string `json:"start_date"` // 生效开始日期 + StartTime string `json:"start_time"` // 生效开始时间 + EndDate string `json:"end_date"` // 生效结束日期 + EndTime string `json:"end_time"` // 生效结束时间 + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminGetNotificationListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + Title *string `form:"title,optional"` // 通知标题(可选) + NotificationPage *string `form:"notification_page,optional"` // 通知页面(可选) + Status *int64 `form:"status,optional"` // 状态(可选) + StartDate *string `form:"start_date,optional"` // 开始日期范围(可选) + EndDate *string `form:"end_date,optional"` // 结束日期范围(可选) +} + +type AdminGetNotificationListResp struct { + Total int64 `json:"total"` // 总数 + Items []NotificationListItem `json:"items"` // 列表数据 +} + +type AdminGetOrderDetailReq struct { + Id int64 `path:"id"` // 订单ID +} + +type AdminGetOrderDetailResp struct { + Id int64 `json:"id"` // 订单ID + OrderNo string `json:"order_no"` // 商户订单号 + PlatformOrderId string `json:"platform_order_id"` // 支付订单号 + ProductName string `json:"product_name"` // 产品名称 + PaymentPlatform string `json:"payment_platform"` // 支付方式 + PaymentScene string `json:"payment_scene"` // 支付平台 + Amount float64 `json:"amount"` // 金额 + Status string `json:"status"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + QueryState string `json:"query_state"` // 查询状态:pending-待查询,success-查询成功,failed-查询失败 processing-查询中 + CreateTime string `json:"create_time"` // 创建时间 + PayTime string `json:"pay_time"` // 支付时间 + RefundTime string `json:"refund_time"` // 退款时间 + IsPromotion int64 `json:"is_promotion"` // 是否推广订单:0-否,1-是 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminGetOrderListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + OrderNo string `form:"order_no,optional"` // 商户订单号 + PlatformOrderId string `form:"platform_order_id,optional"` // 支付订单号 + ProductName string `form:"product_name,optional"` // 产品名称 + PaymentPlatform string `form:"payment_platform,optional"` // 支付方式 + PaymentScene string `form:"payment_scene,optional"` // 支付平台 + Amount float64 `form:"amount,optional"` // 金额 + Status string `form:"status,optional"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + IsPromotion int64 `form:"is_promotion,optional,default=-1"` // 是否推广订单:0-否,1-是 + CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始 + CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束 + PayTimeStart string `form:"pay_time_start,optional"` // 支付时间开始 + PayTimeEnd string `form:"pay_time_end,optional"` // 支付时间结束 + RefundTimeStart string `form:"refund_time_start,optional"` // 退款时间开始 + RefundTimeEnd string `form:"refund_time_end,optional"` // 退款时间结束 +} + +type AdminGetOrderListResp struct { + Total int64 `json:"total"` // 总数 + Items []OrderListItem `json:"items"` // 列表 +} + +type AdminGetPlatformUserDetailReq struct { + Id int64 `path:"id"` // 用户ID +} + +type AdminGetPlatformUserDetailResp struct { + Id int64 `json:"id"` // 用户ID + Mobile string `json:"mobile"` // 手机号 + Nickname string `json:"nickname"` // 昵称 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminGetPlatformUserListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Mobile string `form:"mobile,optional"` // 手机号 + Nickname string `form:"nickname,optional"` // 昵称 + Inside int64 `form:"inside,optional"` // 是否内部用户 1-是 0-否 + CreateTimeStart string `form:"create_time_start,optional"` // 创建时间开始 + CreateTimeEnd string `form:"create_time_end,optional"` // 创建时间结束 + OrderBy string `form:"order_by,optional"` // 排序字段 + OrderType string `form:"order_type,optional"` // 排序类型 +} + +type AdminGetPlatformUserListResp struct { + Total int64 `json:"total"` // 总数 + Items []PlatformUserListItem `json:"items"` // 列表 +} + +type AdminGetProductDetailReq struct { + Id int64 `path:"id"` // 产品ID +} + +type AdminGetProductDetailResp struct { + Id int64 `json:"id"` // 产品ID + ProductName string `json:"product_name"` // 服务名 + ProductEn string `json:"product_en"` // 英文名 + Description string `json:"description"` // 描述 + Notes string `json:"notes"` // 备注 + CostPrice float64 `json:"cost_price"` // 成本 + SellPrice float64 `json:"sell_price"` // 售价 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminGetProductFeatureListReq struct { + ProductId int64 `path:"product_id"` // 产品ID +} + +type AdminGetProductFeatureListResp struct { + Id int64 `json:"id"` // 关联ID + ProductId int64 `json:"product_id"` // 产品ID + FeatureId int64 `json:"feature_id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 功能描述 + Sort int64 `json:"sort"` // 排序 + Enable int64 `json:"enable"` // 是否启用 + IsImportant int64 `json:"is_important"` // 是否重要 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type AdminGetProductListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ProductName *string `form:"product_name,optional"` // 服务名 + ProductEn *string `form:"product_en,optional"` // 英文名 +} + +type AdminGetProductListResp struct { + Total int64 `json:"total"` // 总数 + Items []ProductListItem `json:"items"` // 列表数据 +} + +type AdminGetQueryCleanupConfigListReq struct { + Status int64 `form:"status,optional"` // 状态:1-启用,0-禁用 +} + +type AdminGetQueryCleanupConfigListResp struct { + Items []QueryCleanupConfigItem `json:"items"` // 配置列表 +} + +type AdminGetQueryCleanupDetailListReq struct { + LogId int64 `path:"log_id"` // 清理日志ID + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"page_size,default=20"` // 每页数量 +} + +type AdminGetQueryCleanupDetailListResp struct { + Total int64 `json:"total"` // 总数 + Items []QueryCleanupDetailItem `json:"items"` // 列表 +} + +type AdminGetQueryCleanupLogListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"page_size,default=20"` // 每页数量 + Status int64 `form:"status,optional"` // 状态:1-成功,2-失败 + StartTime string `form:"start_time,optional"` // 开始时间 + EndTime string `form:"end_time,optional"` // 结束时间 +} + +type AdminGetQueryCleanupLogListResp struct { + Total int64 `json:"total"` // 总数 + Items []QueryCleanupLogItem `json:"items"` // 列表 +} + +type AdminGetQueryDetailByOrderIdReq struct { + OrderId int64 `path:"order_id"` +} + +type AdminGetQueryDetailByOrderIdResp struct { + Id int64 `json:"id"` // 主键ID + OrderId int64 `json:"order_id"` // 订单ID + UserId int64 `json:"user_id"` // 用户ID + ProductName string `json:"product_name"` // 产品ID + QueryParams map[string]interface{} `json:"query_params"` + QueryData []AdminQueryItem `json:"query_data"` + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + QueryState string `json:"query_state"` // 查询状态 +} + +type AdminGetUserDetailReq struct { + Id int64 `path:"id"` // 用户ID +} + +type AdminGetUserDetailResp struct { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 +} + +type AdminGetUserListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Username string `form:"username,optional"` // 用户名 + RealName string `form:"real_name,optional"` // 真实姓名 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 +} + +type AdminGetUserListResp struct { + Total int64 `json:"total"` // 总数 + Items []AdminUserListItem `json:"items"` // 列表 +} + +type AdminLoginReq struct { + Username string `json:"username" validate:"required"` + Password string `json:"password" validate:"required"` + Captcha bool `json:"captcha" validate:"required"` +} + +type AdminLoginResp struct { + AccessToken string `json:"access_token"` + AccessExpire int64 `json:"access_expire"` + RefreshAfter int64 `json:"refresh_after"` + Roles []string `json:"roles"` +} + +type AdminQueryItem struct { + Feature interface{} `json:"feature"` + Data interface{} `json:"data"` // 这里可以是 map 或 具体的 struct +} + +type AdminRefundOrderReq struct { + Id int64 `path:"id"` // 订单ID + RefundAmount float64 `json:"refund_amount"` // 退款金额 + RefundReason string `json:"refund_reason"` // 退款原因 +} + +type AdminRefundOrderResp struct { + Status string `json:"status"` // 退款状态 + RefundNo string `json:"refund_no"` // 退款单号 + Amount float64 `json:"amount"` // 退款金额 +} + +type AdminUpdateAgentMembershipConfigReq struct { + Id int64 `json:"id"` // 主键 + LevelName string `json:"level_name"` // 会员级别名称 + Price float64 `json:"price"` // 会员年费 + ReportCommission float64 `json:"report_commission"` // 直推报告收益 + LowerActivityReward *float64 `json:"lower_activity_reward,optional,omitempty"` // 下级活跃奖励金额 + NewActivityReward *float64 `json:"new_activity_reward,optional,omitempty"` // 新增活跃奖励金额 + LowerStandardCount *int64 `json:"lower_standard_count,optional,omitempty"` // 活跃下级达标个数 + NewLowerStandardCount *int64 `json:"new_lower_standard_count,optional,omitempty"` // 新增活跃下级达标个数 + LowerWithdrawRewardRatio *float64 `json:"lower_withdraw_reward_ratio,optional,omitempty"` // 下级提现奖励比例 + LowerConvertVipReward *float64 `json:"lower_convert_vip_reward,optional,omitempty"` // 下级转化VIP奖励 + LowerConvertSvipReward *float64 `json:"lower_convert_svip_reward,optional,omitempty"` // 下级转化SVIP奖励 + ExemptionAmount *float64 `json:"exemption_amount,optional,omitempty"` // 免责金额 + PriceIncreaseMax *float64 `json:"price_increase_max,optional,omitempty"` // 提价最高金额 + PriceRatio *float64 `json:"price_ratio,optional,omitempty"` // 提价区间收取比例 + PriceIncreaseAmount *float64 `json:"price_increase_amount,optional,omitempty"` // 在原本成本上加价的金额 +} + +type AdminUpdateAgentMembershipConfigResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateAgentProductionConfigReq struct { + Id int64 `json:"id"` // 主键 + CostPrice float64 `json:"cost_price"` // 成本 + PriceRangeMin float64 `json:"price_range_min"` // 最低定价 + PriceRangeMax float64 `json:"price_range_max"` // 最高定价 + PricingStandard float64 `json:"pricing_standard"` // 定价标准 + OverpricingRatio float64 `json:"overpricing_ratio"` // 超价比例 +} + +type AdminUpdateAgentProductionConfigResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateFeatureReq struct { + Id int64 `path:"id"` // 功能ID + ApiId *string `json:"api_id,optional"` // API标识 + Name *string `json:"name,optional"` // 描述 +} + +type AdminUpdateFeatureResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateNotificationReq struct { + Id int64 `path:"id"` // 通知ID + Title *string `json:"title,optional"` // 通知标题 + Content *string `json:"content,optional"` // 通知内容 + NotificationPage *string `json:"notification_page,optional"` // 通知页面 + StartDate *string `json:"start_date,optional"` // 生效开始日期 + StartTime *string `json:"start_time,optional"` // 生效开始时间 + EndDate *string `json:"end_date,optional"` // 生效结束日期 + EndTime *string `json:"end_time,optional"` // 生效结束时间 + Status *int64 `json:"status,optional"` // 状态 +} + +type AdminUpdateNotificationResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateOrderReq struct { + Id int64 `path:"id"` // 订单ID + OrderNo *string `json:"order_no,optional"` // 商户订单号 + PlatformOrderId *string `json:"platform_order_id,optional"` // 支付订单号 + ProductName *string `json:"product_name,optional"` // 产品名称 + PaymentPlatform *string `json:"payment_platform,optional"` // 支付方式 + PaymentScene *string `json:"payment_scene,optional"` // 支付平台 + Amount *float64 `json:"amount,optional"` // 金额 + Status *string `json:"status,optional"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + PayTime *string `json:"pay_time,optional"` // 支付时间 + RefundTime *string `json:"refund_time,optional"` // 退款时间 + IsPromotion *int64 `json:"is_promotion,optional"` // 是否推广订单:0-否,1-是 +} + +type AdminUpdateOrderResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdatePlatformUserReq struct { + Id int64 `path:"id"` // 用户ID + Mobile *string `json:"mobile,optional"` // 手机号 + Password *string `json:"password,optional"` // 密码 + Nickname *string `json:"nickname,optional"` // 昵称 + Info *string `json:"info,optional"` // 备注信息 + Inside *int64 `json:"inside,optional"` // 是否内部用户 1-是 0-否 +} + +type AdminUpdatePlatformUserResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateProductFeaturesReq struct { + ProductId int64 `path:"product_id"` // 产品ID + Features []ProductFeatureItem `json:"features"` // 功能列表 +} + +type AdminUpdateProductFeaturesResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateProductReq struct { + Id int64 `path:"id"` // 产品ID + ProductName *string `json:"product_name,optional"` // 服务名 + ProductEn *string `json:"product_en,optional"` // 英文名 + Description *string `json:"description,optional"` // 描述 + Notes *string `json:"notes,optional"` // 备注 + CostPrice *float64 `json:"cost_price,optional"` // 成本 + SellPrice *float64 `json:"sell_price,optional"` // 售价 +} + +type AdminUpdateProductResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateQueryCleanupConfigReq struct { + Id int64 `json:"id"` // 主键ID + ConfigValue string `json:"config_value"` // 配置值 + Status int64 `json:"status"` // 状态:1-启用,0-禁用 +} + +type AdminUpdateQueryCleanupConfigResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUpdateUserReq struct { + Id int64 `path:"id"` // 用户ID + Username *string `json:"username,optional"` // 用户名 + RealName *string `json:"real_name,optional"` // 真实姓名 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + RoleIds []int64 `json:"role_ids,optional"` // 关联的角色ID列表 +} + +type AdminUpdateUserResp struct { + Success bool `json:"success"` // 是否成功 +} + +type AdminUserInfoReq struct { +} + +type AdminUserInfoResp struct { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Roles []string `json:"roles"` // 角色编码列表 +} + +type AdminUserListItem struct { + Id int64 `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + RoleIds []int64 `json:"role_ids"` // 关联的角色ID列表 +} + type AgentActivateMembershipReq struct { Type string `json:"type,oneof=VIP SVIP"` // 会员类型:vip/svip } @@ -41,6 +733,27 @@ type AgentAuditStatusResp struct { AuditReason string `json:"audit_reason"` } +type AgentCommissionDeductionListItem struct { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + DeductedAgentId int64 `json:"deducted_agent_id"` // 被扣代理ID + Amount float64 `json:"amount"` // 金额 + ProductName string `json:"product_name"` // 产品名 + Type string `json:"type"` // 类型(cost/pricing) + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 +} + +type AgentCommissionListItem struct { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + OrderId int64 `json:"order_id"` // 订单ID + Amount float64 `json:"amount"` // 金额 + ProductName string `json:"product_name"` // 产品名 + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 +} + type AgentGeneratingLinkReq struct { Product string `json:"product"` Price string `json:"price"` @@ -61,6 +774,52 @@ type AgentInfoResp struct { IsRealName bool `json:"is_real_name"` } +type AgentLinkListItem struct { + AgentId int64 `json:"agent_id"` // 代理ID + ProductName string `json:"product_name"` // 产品名 + Price float64 `json:"price"` // 价格 + LinkIdentifier string `json:"link_identifier"` // 推广码 + CreateTime string `json:"create_time"` // 创建时间 +} + +type AgentListItem struct { + Id int64 `json:"id"` // 主键 + UserId int64 `json:"user_id"` // 用户ID + ParentAgentId int64 `json:"parent_agent_id"` // 上级代理ID + LevelName string `json:"level_name"` // 等级名称 + Region string `json:"region"` // 区域 + Mobile string `json:"mobile"` // 手机号 + MembershipExpiryTime string `json:"membership_expiry_time"` // 会员到期时间 + Balance float64 `json:"balance"` // 钱包余额 + TotalEarnings float64 `json:"total_earnings"` // 累计收益 + FrozenBalance float64 `json:"frozen_balance"` // 冻结余额 + WithdrawnAmount float64 `json:"withdrawn_amount"` // 提现总额 + CreateTime string `json:"create_time"` // 创建时间 + IsRealNameVerified bool `json:"is_real_name_verified"` // 是否已实名认证 + RealName string `json:"real_name"` // 实名姓名 + IdCard string `json:"id_card"` // 身份证号 + RealNameStatus string `json:"real_name_status"` // 实名状态(pending/approved/rejected) +} + +type AgentMembershipConfigListItem struct { + Id int64 `json:"id"` // 主键 + LevelName string `json:"level_name"` // 会员级别名称 + Price *float64 `json:"price"` // 会员年费 + ReportCommission *float64 `json:"report_commission"` // 直推报告收益 + LowerActivityReward *float64 `json:"lower_activity_reward"` // 下级活跃奖励金额 + NewActivityReward *float64 `json:"new_activity_reward"` // 新增活跃奖励金额 + LowerStandardCount *int64 `json:"lower_standard_count"` // 活跃下级达标个数 + NewLowerStandardCount *int64 `json:"new_lower_standard_count"` // 新增活跃下级达标个数 + LowerWithdrawRewardRatio *float64 `json:"lower_withdraw_reward_ratio"` // 下级提现奖励比例 + LowerConvertVipReward *float64 `json:"lower_convert_vip_reward"` // 下级转化VIP奖励 + LowerConvertSvipReward *float64 `json:"lower_convert_svip_reward"` // 下级转化SVIP奖励 + ExemptionAmount *float64 `json:"exemption_amount"` // 免责金额 + PriceIncreaseMax *float64 `json:"price_increase_max"` // 提价最高金额 + PriceRatio *float64 `json:"price_ratio"` // 提价区间收取比例 + PriceIncreaseAmount *float64 `json:"price_increase_amount"` // 在原本成本上加价的金额 + CreateTime string `json:"create_time"` // 创建时间 +} + type AgentMembershipProductConfigReq struct { ProductID int64 `form:"product_id"` } @@ -73,6 +832,19 @@ type AgentMembershipProductConfigResp struct { PriceRatio float64 `json:"price_ratio"` } +type AgentMembershipRechargeOrderListItem struct { + Id int64 `json:"id"` // 主键 + UserId int64 `json:"user_id"` // 用户ID + AgentId int64 `json:"agent_id"` // 代理ID + LevelName string `json:"level_name"` // 等级名称 + Amount float64 `json:"amount"` // 金额 + PaymentMethod string `json:"payment_method"` // 支付方式 + OrderNo string `json:"order_no"` // 订单号 + PlatformOrderId string `json:"platform_order_id"` // 平台订单号 + Status string `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 +} + type AgentMembershipUserConfig struct { ProductID int64 `json:"product_id"` PriceIncreaseAmount float64 `json:"price_increase_amount"` @@ -81,6 +853,15 @@ type AgentMembershipUserConfig struct { PriceRatio float64 `json:"price_ratio"` } +type AgentPlatformDeductionListItem struct { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + Amount float64 `json:"amount"` // 金额 + Type string `json:"type"` // 类型(cost/pricing) + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 +} + type AgentProductConfig struct { ProductID int64 `json:"product_id"` CostPrice float64 `json:"cost_price"` @@ -97,6 +878,17 @@ type AgentProductConfigResp struct { AgentProductConfig []AgentProductConfig } +type AgentProductionConfigItem struct { + Id int64 `json:"id"` // 主键 + ProductName string `json:"product_name"` // 产品名 + CostPrice float64 `json:"cost_price"` // 成本 + PriceRangeMin float64 `json:"price_range_min"` // 最低定价 + PriceRangeMax float64 `json:"price_range_max"` // 最高定价 + PricingStandard float64 `json:"pricing_standard"` // 定价标准 + OverpricingRatio float64 `json:"overpricing_ratio"` // 超价比例 + CreateTime string `json:"create_time"` // 创建时间 +} + type AgentRealNameReq struct { Name string `json:"name"` IDCard string `json:"id_card"` @@ -108,6 +900,15 @@ type AgentRealNameResp struct { Status string `json:"status"` } +type AgentRewardListItem struct { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + RelationAgentId int64 `json:"relation_agent_id"` // 关联代理ID + Amount float64 `json:"amount"` // 金额 + Type string `json:"type"` // 奖励类型 + CreateTime string `json:"create_time"` // 创建时间 +} + type AgentSubordinateContributionDetail struct { ID int64 `json:"id"` CreateTime string `json:"create_time"` @@ -144,6 +945,17 @@ type AgentSubordinateList struct { TotalContribution float64 `json:"total_contribution"` // 总贡献 } +type AgentWithdrawalListItem struct { + Id int64 `json:"id"` // 主键 + AgentId int64 `json:"agent_id"` // 代理ID + WithdrawNo string `json:"withdraw_no"` // 提现单号 + Amount float64 `json:"amount"` // 金额 + Status int64 `json:"status"` // 状态 + PayeeAccount string `json:"payee_account"` // 收款账户 + Remark string `json:"remark"` // 备注 + CreateTime string `json:"create_time"` // 创建时间 +} + type BindMobileReq struct { Mobile string `json:"mobile" validate:"required,mobile"` Code string `json:"code" validate:"required"` @@ -158,6 +970,68 @@ type Commission struct { CreateTime string `json:"create_time"` } +type CreateMenuReq struct { + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional,default=1"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 +} + +type CreateMenuResp struct { + Id int64 `json:"id"` // 菜单ID +} + +type CreatePromotionLinkReq struct { + Name string `json:"name"` // 链接名称 +} + +type CreatePromotionLinkResp struct { + Id int64 `json:"id"` // 链接ID + Url string `json:"url"` // 生成的推广链接URL +} + +type CreateRoleReq struct { + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort,default=0"` // 排序 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 +} + +type CreateRoleResp struct { + Id int64 `json:"id"` // 角色ID +} + +type DeleteMenuReq struct { + Id int64 `path:"id"` // 菜单ID +} + +type DeleteMenuResp struct { + Success bool `json:"success"` // 是否成功 +} + +type DeletePromotionLinkReq struct { + Id int64 `path:"id"` // 链接ID +} + +type DeletePromotionLinkResp struct { + Success bool `json:"success"` // 是否成功 +} + +type DeleteRoleReq struct { + Id int64 `path:"id"` // 角色ID +} + +type DeleteRoleResp struct { + Success bool `json:"success"` // 是否成功 +} + type DirectPushReport struct { TotalCommission float64 `json:"total_commission"` TotalReport int `json:"total_report"` @@ -172,6 +1046,14 @@ type Feature struct { Name string `json:"name"` // 功能描述 } +type FeatureListItem struct { + Id int64 `json:"id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Name string `json:"name"` // 描述 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + type GetAgentRevenueInfoReq struct { } @@ -229,6 +1111,45 @@ type GetLinkDataResp struct { Product } +type GetMenuAllReq struct { +} + +type GetMenuAllResp struct { + Name string `json:"name"` + Path string `json:"path"` + Redirect string `json:"redirect,omitempty"` + Component string `json:"component,omitempty"` + Sort int64 `json:"sort"` + Meta map[string]interface{} `json:"meta"` + Children []GetMenuAllResp `json:"children"` +} + +type GetMenuDetailReq struct { + Id int64 `path:"id"` // 菜单ID +} + +type GetMenuDetailResp struct { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + UpdateTime string `json:"updateTime"` // 更新时间 +} + +type GetMenuListReq struct { + Name string `form:"name,optional"` // 菜单名称 + Path string `form:"path,optional"` // 路由路径 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 + Type string `form:"type,optional"` // 类型 +} + type GetNotificationsResp struct { Notifications []Notification `json:"notifications"` // 通知列表 Total int64 `json:"total"` // 总记录数 @@ -242,6 +1163,51 @@ type GetProductByIDRequest struct { Id int64 `path:"id"` } +type GetPromotionLinkDetailReq struct { + Id int64 `path:"id"` // 链接ID +} + +type GetPromotionLinkDetailResp struct { + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 +} + +type GetPromotionLinkListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 链接名称 + Url string `form:"url,optional"` // 推广链接URL +} + +type GetPromotionLinkListResp struct { + Total int64 `json:"total"` // 总数 + Items []PromotionLinkItem `json:"items"` // 列表 +} + +type GetPromotionStatsHistoryReq struct { + StartDate string `form:"start_date"` // 开始日期,格式:YYYY-MM-DD + EndDate string `form:"end_date"` // 结束日期,格式:YYYY-MM-DD +} + +type GetPromotionStatsTotalReq struct { +} + +type GetPromotionStatsTotalResp struct { + TodayPayAmount float64 `json:"today_pay_amount"` // 今日金额 + TodayClickCount int64 `json:"today_click_count"` // 今日点击数 + TodayPayCount int64 `json:"today_pay_count"` // 今日付费次数 + TotalPayAmount float64 `json:"total_pay_amount"` // 总金额 + TotalClickCount int64 `json:"total_click_count"` // 总点击数 + TotalPayCount int64 `json:"total_pay_count"` // 总付费次数 +} + type GetRewardsReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"page_size"` // 每页数据量 @@ -252,6 +1218,35 @@ type GetRewardsResp struct { List []Rewards `json:"list"` // 查询列表 } +type GetRoleDetailReq struct { + Id int64 `path:"id"` // 角色ID +} + +type GetRoleDetailResp struct { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 +} + +type GetRoleListReq struct { + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"pageSize,default=20"` // 每页数量 + Name string `form:"name,optional"` // 角色名称 + Code string `form:"code,optional"` // 角色编码 + Status int64 `form:"status,optional,default=-1"` // 状态:0-禁用,1-启用 +} + +type GetRoleListResp struct { + Total int64 `json:"total"` // 总数 + Items []RoleListItem `json:"items"` // 列表 +} + type GetWithdrawalReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"page_size"` // 每页数据量 @@ -272,6 +1267,21 @@ type IapCallbackReq struct { TransactionReceipt string `json:"transaction_receipt" validate:"required"` } +type MenuListItem struct { + Id int64 `json:"id"` // 菜单ID + Pid int64 `json:"pid"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path"` // 路由路径 + Component string `json:"component"` // 组件路径 + Redirect string `json:"redirect"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"createTime"` // 创建时间 + Children []MenuListItem `json:"children"` // 子菜单 +} + type MobileCodeLoginReq struct { Mobile string `json:"mobile"` Code string `json:"code" validate:"required"` @@ -304,6 +1314,36 @@ type Notification struct { EndTime string `json:"endTime"` // 每天通知结束时间,格式 "HH:MM:SS" } +type NotificationListItem struct { + Id int64 `json:"id"` // 通知ID + Title string `json:"title"` // 通知标题 + NotificationPage string `json:"notification_page"` // 通知页面 + Content string `json:"content"` // 通知内容 + StartDate string `json:"start_date"` // 生效开始日期 + StartTime string `json:"start_time"` // 生效开始时间 + EndDate string `json:"end_date"` // 生效结束日期 + EndTime string `json:"end_time"` // 生效结束时间 + Status int64 `json:"status"` // 状态 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type OrderListItem struct { + Id int64 `json:"id"` // 订单ID + OrderNo string `json:"order_no"` // 商户订单号 + PlatformOrderId string `json:"platform_order_id"` // 支付订单号 + ProductName string `json:"product_name"` // 产品名称 + PaymentPlatform string `json:"payment_platform"` // 支付方式 + PaymentScene string `json:"payment_scene"` // 支付平台 + Amount float64 `json:"amount"` // 金额 + Status string `json:"status"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 + QueryState string `json:"query_state"` // 查询状态:pending-待查询,success-查询成功,failed-查询失败 processing-查询中 + CreateTime string `json:"create_time"` // 创建时间 + PayTime string `json:"pay_time"` // 支付时间 + RefundTime string `json:"refund_time"` // 退款时间 + IsPromotion int64 `json:"is_promotion"` // 是否推广订单:0-否,1-是 +} + type PaymentCheckReq struct { OrderNo string `json:"order_no" validate:"required"` } @@ -325,6 +1365,16 @@ type PaymentResp struct { OrderNo string `json:"order_no"` } +type PlatformUserListItem struct { + Id int64 `json:"id"` // 用户ID + Mobile string `json:"mobile"` // 手机号 + Nickname string `json:"nickname"` // 昵称 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + type Product struct { ProductName string `json:"product_name"` ProductEn string `json:"product_en"` @@ -341,10 +1391,50 @@ type ProductConfig struct { PriceRangeMax float64 `json:"price_range_max"` } +type ProductFeatureItem struct { + FeatureId int64 `json:"feature_id"` // 功能ID + Sort int64 `json:"sort"` // 排序 + Enable int64 `json:"enable"` // 是否启用 + IsImportant int64 `json:"is_important"` // 是否重要 +} + +type ProductListItem struct { + Id int64 `json:"id"` // 产品ID + ProductName string `json:"product_name"` // 服务名 + ProductEn string `json:"product_en"` // 英文名 + Description string `json:"description"` // 描述 + Notes string `json:"notes"` // 备注 + CostPrice float64 `json:"cost_price"` // 成本 + SellPrice float64 `json:"sell_price"` // 售价 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + type ProductResponse struct { Product } +type PromotionLinkItem struct { + Id int64 `json:"id"` // 链接ID + Name string `json:"name"` // 链接名称 + Url string `json:"url"` // 推广链接URL + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + PayAmount string `json:"pay_amount"` // 付费金额 + CreateTime string `json:"create_time"` // 创建时间 + LastClickTime string `json:"last_click_time,optional"` // 最后点击时间 + LastPayTime string `json:"last_pay_time,optional"` // 最后付费时间 +} + +type PromotionStatsHistoryItem struct { + Id int64 `json:"id"` // 记录ID + LinkId int64 `json:"link_id"` // 链接ID + PayAmount float64 `json:"pay_amount"` // 金额 + ClickCount int64 `json:"click_count"` // 点击数 + PayCount int64 `json:"pay_count"` // 付费次数 + StatsDate string `json:"stats_date"` // 统计日期 +} + type Query struct { Id int64 `json:"id"` // 主键ID OrderId int64 `json:"order_id"` // 订单ID @@ -357,6 +1447,39 @@ type Query struct { QueryState string `json:"query_state"` // 查询状态 } +type QueryCleanupConfigItem struct { + Id int64 `json:"id"` // 主键ID + ConfigKey string `json:"config_key"` // 配置键 + ConfigValue string `json:"config_value"` // 配置值 + ConfigDesc string `json:"config_desc"` // 配置描述 + Status int64 `json:"status"` // 状态:1-启用,0-禁用 + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 +} + +type QueryCleanupDetailItem struct { + Id int64 `json:"id"` // 主键ID + CleanupLogId int64 `json:"cleanup_log_id"` // 清理日志ID + QueryId int64 `json:"query_id"` // 查询ID + OrderId int64 `json:"order_id"` // 订单ID + UserId int64 `json:"user_id"` // 用户ID + ProductName string `json:"product_name"` // 产品名称 + QueryState string `json:"query_state"` // 查询状态 + CreateTimeOld string `json:"create_time_old"` // 原创建时间 + CreateTime string `json:"create_time"` // 创建时间 +} + +type QueryCleanupLogItem struct { + Id int64 `json:"id"` // 主键ID + CleanupTime string `json:"cleanup_time"` // 清理时间 + CleanupBefore string `json:"cleanup_before"` // 清理截止时间 + Status int64 `json:"status"` // 状态:1-成功,2-失败 + AffectedRows int64 `json:"affected_rows"` // 影响行数 + ErrorMsg string `json:"error_msg"` // 错误信息 + Remark string `json:"remark"` // 备注 + CreateTime string `json:"create_time"` // 创建时间 +} + type QueryDetailByOrderIdReq struct { OrderId int64 `path:"order_id"` } @@ -465,6 +1588,14 @@ type QuerySingleTestResp struct { Api string `json:"api"` } +type RecordLinkClickReq struct { + Path string `path:"path"` // 链接路径 +} + +type RecordLinkClickResp struct { + Success bool `json:"success"` // 是否成功 +} + type RegisterReq struct { Mobile string `json:"mobile" validate:"required,mobile"` Password string `json:"password" validate:"required,min=11,max=11,password"` @@ -483,6 +1614,17 @@ type Rewards struct { CreateTime string `json:"create_time"` } +type RoleListItem struct { + Id int64 `json:"id"` // 角色ID + RoleName string `json:"role_name"` // 角色名称 + RoleCode string `json:"role_code"` // 角色编码 + Description string `json:"description"` // 角色描述 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + Sort int64 `json:"sort"` // 排序 + CreateTime string `json:"create_time"` // 创建时间 + MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 +} + type SaveAgentMembershipUserConfigReq struct { ProductID int64 `json:"product_id"` PriceIncreaseAmount float64 `json:"price_increase_amount"` @@ -496,6 +1638,32 @@ type TimeRangeReport struct { Report int `json:"report"` // 报告量 } +type UpdateMenuReq struct { + Id int64 `path:"id"` // 菜单ID + Pid int64 `json:"pid,optional"` // 父菜单ID + Name string `json:"name"` // 路由名称 + Path string `json:"path,optional"` // 路由路径 + Component string `json:"component,optional"` // 组件路径 + Redirect string `json:"redirect,optional"` // 重定向路径 + Meta map[string]interface{} `json:"meta"` // 路由元数据 + Status int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Type string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 +} + +type UpdateMenuResp struct { + Success bool `json:"success"` // 是否成功 +} + +type UpdatePromotionLinkReq struct { + Id int64 `path:"id"` // 链接ID + Name *string `json:"name,optional"` // 链接名称 +} + +type UpdatePromotionLinkResp struct { + Success bool `json:"success"` // 是否成功 +} + type UpdateQueryDataReq struct { Id int64 `json:"id"` // 查询ID QueryData string `json:"query_data"` // 查询数据(未加密的JSON) @@ -506,6 +1674,20 @@ type UpdateQueryDataResp struct { UpdatedAt string `json:"updated_at"` // 更新时间 } +type UpdateRoleReq struct { + Id int64 `path:"id"` // 角色ID + RoleName *string `json:"role_name,optional"` // 角色名称 + RoleCode *string `json:"role_code,optional"` // 角色编码 + Description *string `json:"description,optional"` // 角色描述 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + Sort *int64 `json:"sort,optional"` // 排序 + MenuIds []int64 `json:"menu_ids,optional"` // 关联的菜单ID列表 +} + +type UpdateRoleResp struct { + Success bool `json:"success"` // 是否成功 +} + type User struct { Id int64 `json:"id"` Mobile string `json:"mobile"` diff --git a/app/main/api/main.go b/app/main/api/main.go index 7dfaaa5..736b221 100644 --- a/app/main/api/main.go +++ b/app/main/api/main.go @@ -5,10 +5,10 @@ import ( "flag" "fmt" "os" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/cmd/api/internal/handler" - "tydata-server/app/user/cmd/api/internal/queue" - "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/main/api/internal/config" + "tydata-server/app/main/api/internal/handler" + "tydata-server/app/main/api/internal/queue" + "tydata-server/app/main/api/internal/svc" "github.com/zeromicro/go-zero/core/logx" @@ -26,7 +26,7 @@ func main() { // 根据 ENV 加载不同的配置文件 var defaultConfigFile string if env == "development" { - defaultConfigFile = "app/user/cmd/api/etc/main.dev.yaml" + defaultConfigFile = "app/main/cmd/api/etc/main.dev.yaml" } else { defaultConfigFile = "etc/main.yaml" } diff --git a/app/main/model/adminApiModel.go b/app/main/model/adminApiModel.go new file mode 100644 index 0000000..6ed3633 --- /dev/null +++ b/app/main/model/adminApiModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminApiModel = (*customAdminApiModel)(nil) + +type ( + // AdminApiModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminApiModel. + AdminApiModel interface { + adminApiModel + } + + customAdminApiModel struct { + *defaultAdminApiModel + } +) + +// NewAdminApiModel returns a model for the database table. +func NewAdminApiModel(conn sqlx.SqlConn, c cache.CacheConf) AdminApiModel { + return &customAdminApiModel{ + defaultAdminApiModel: newAdminApiModel(conn, c), + } +} diff --git a/app/main/model/adminApiModel_gen.go b/app/main/model/adminApiModel_gen.go new file mode 100644 index 0000000..204c6ed --- /dev/null +++ b/app/main/model/adminApiModel_gen.go @@ -0,0 +1,411 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminApiFieldNames = builder.RawFieldNames(&AdminApi{}) + adminApiRows = strings.Join(adminApiFieldNames, ",") + adminApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminApiFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminApiRowsWithPlaceHolder = strings.Join(stringx.Remove(adminApiFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminApiIdPrefix = "cache:tydata:adminApi:id:" + cacheTydataAdminApiApiCodePrefix = "cache:tydata:adminApi:apiCode:" +) + +type ( + adminApiModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminApi, error) + FindOneByApiCode(ctx context.Context, apiCode string) (*AdminApi, error) + Update(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminApi) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminApi) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminApi, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminApi, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminApi, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminApiModel struct { + sqlc.CachedConn + table string + } + + AdminApi struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + ApiName string `db:"api_name"` // 接口名称 + ApiCode string `db:"api_code"` // 接口编码 + Method string `db:"method"` // 请求方法:GET、POST等 + Url string `db:"url"` // 接口URL + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Description string `db:"description"` // 接口描述 + } +) + +func newAdminApiModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminApiModel { + return &defaultAdminApiModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_api`", + } +} + +func (m *defaultAdminApiModel) Insert(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminApiApiCodePrefix, data.ApiCode) + tydataAdminApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminApiIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminApiRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiName, data.ApiCode, data.Method, data.Url, data.Status, data.Description) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiName, data.ApiCode, data.Method, data.Url, data.Status, data.Description) + }, tydataAdminApiApiCodeKey, tydataAdminApiIdKey) +} + +func (m *defaultAdminApiModel) FindOne(ctx context.Context, id int64) (*AdminApi, error) { + tydataAdminApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminApiIdPrefix, id) + var resp AdminApi + err := m.QueryRowCtx(ctx, &resp, tydataAdminApiIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindOneByApiCode(ctx context.Context, apiCode string) (*AdminApi, error) { + tydataAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminApiApiCodePrefix, apiCode) + var resp AdminApi + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminApiApiCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `api_code` = ? and del_state = ? limit 1", adminApiRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, apiCode, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) Update(ctx context.Context, session sqlx.Session, newData *AdminApi) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminApiApiCodePrefix, data.ApiCode) + tydataAdminApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminApiIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id) + }, tydataAdminApiApiCodeKey, tydataAdminApiIdKey) +} + +func (m *defaultAdminApiModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminApi) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminApiApiCodePrefix, data.ApiCode) + tydataAdminApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminApiIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiName, newData.ApiCode, newData.Method, newData.Url, newData.Status, newData.Description, newData.Id, oldVersion) + }, tydataAdminApiApiCodeKey, tydataAdminApiIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminApiModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminApi) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminApiModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminApiModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminApiModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminApiModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminApi, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminApiModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminApi, error) { + + builder = builder.Columns(adminApiRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminApiModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminApiModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminApiModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminApiApiCodePrefix, data.ApiCode) + tydataAdminApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminApiIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminApiApiCodeKey, tydataAdminApiIdKey) + return err +} +func (m *defaultAdminApiModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminApiIdPrefix, primary) +} +func (m *defaultAdminApiModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminApiModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminDictDataModel.go b/app/main/model/adminDictDataModel.go new file mode 100644 index 0000000..cbec9c9 --- /dev/null +++ b/app/main/model/adminDictDataModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminDictDataModel = (*customAdminDictDataModel)(nil) + +type ( + // AdminDictDataModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminDictDataModel. + AdminDictDataModel interface { + adminDictDataModel + } + + customAdminDictDataModel struct { + *defaultAdminDictDataModel + } +) + +// NewAdminDictDataModel returns a model for the database table. +func NewAdminDictDataModel(conn sqlx.SqlConn, c cache.CacheConf) AdminDictDataModel { + return &customAdminDictDataModel{ + defaultAdminDictDataModel: newAdminDictDataModel(conn, c), + } +} diff --git a/app/main/model/adminDictDataModel_gen.go b/app/main/model/adminDictDataModel_gen.go new file mode 100644 index 0000000..e57e854 --- /dev/null +++ b/app/main/model/adminDictDataModel_gen.go @@ -0,0 +1,437 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminDictDataFieldNames = builder.RawFieldNames(&AdminDictData{}) + adminDictDataRows = strings.Join(adminDictDataFieldNames, ",") + adminDictDataRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictDataFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminDictDataRowsWithPlaceHolder = strings.Join(stringx.Remove(adminDictDataFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminDictDataIdPrefix = "cache:tydata:adminDictData:id:" + cacheTydataAdminDictDataDictTypeDictLabelPrefix = "cache:tydata:adminDictData:dictType:dictLabel:" + cacheTydataAdminDictDataDictTypeDictValuePrefix = "cache:tydata:adminDictData:dictType:dictValue:" +) + +type ( + adminDictDataModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminDictData, error) + FindOneByDictTypeDictLabel(ctx context.Context, dictType string, dictLabel string) (*AdminDictData, error) + FindOneByDictTypeDictValue(ctx context.Context, dictType string, dictValue int64) (*AdminDictData, error) + Update(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminDictData) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictData) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminDictData, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictData, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictData, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminDictDataModel struct { + sqlc.CachedConn + table string + } + + AdminDictData struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + DictType string `db:"dict_type"` // 字典类型编码 + DictLabel string `db:"dict_label"` // 字典标签 + DictValue int64 `db:"dict_value"` // 字典键值 + DictSort int64 `db:"dict_sort"` // 字典排序 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Remark sql.NullString `db:"remark"` // 备注 + } +) + +func newAdminDictDataModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminDictDataModel { + return &defaultAdminDictDataModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_dict_data`", + } +} + +func (m *defaultAdminDictDataModel) Insert(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tydataAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tydataAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictDataIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminDictDataRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictLabel, data.DictValue, data.DictSort, data.Status, data.Remark) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictLabel, data.DictValue, data.DictSort, data.Status, data.Remark) + }, tydataAdminDictDataDictTypeDictLabelKey, tydataAdminDictDataDictTypeDictValueKey, tydataAdminDictDataIdKey) +} + +func (m *defaultAdminDictDataModel) FindOne(ctx context.Context, id int64) (*AdminDictData, error) { + tydataAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictDataIdPrefix, id) + var resp AdminDictData + err := m.QueryRowCtx(ctx, &resp, tydataAdminDictDataIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindOneByDictTypeDictLabel(ctx context.Context, dictType string, dictLabel string) (*AdminDictData, error) { + tydataAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictLabelPrefix, dictType, dictLabel) + var resp AdminDictData + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminDictDataDictTypeDictLabelKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `dict_type` = ? and `dict_label` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, dictType, dictLabel, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindOneByDictTypeDictValue(ctx context.Context, dictType string, dictValue int64) (*AdminDictData, error) { + tydataAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictValuePrefix, dictType, dictValue) + var resp AdminDictData + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminDictDataDictTypeDictValueKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `dict_type` = ? and `dict_value` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, dictType, dictValue, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) Update(ctx context.Context, session sqlx.Session, newData *AdminDictData) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tydataAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tydataAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictDataIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminDictDataRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id) + }, tydataAdminDictDataDictTypeDictLabelKey, tydataAdminDictDataDictTypeDictValueKey, tydataAdminDictDataIdKey) +} + +func (m *defaultAdminDictDataModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminDictData) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tydataAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tydataAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictDataIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminDictDataRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictLabel, newData.DictValue, newData.DictSort, newData.Status, newData.Remark, newData.Id, oldVersion) + }, tydataAdminDictDataDictTypeDictLabelKey, tydataAdminDictDataDictTypeDictValueKey, tydataAdminDictDataIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminDictDataModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictData) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminDictDataModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminDictDataModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictDataModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictDataModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictData, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminDictDataRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictData, error) { + + builder = builder.Columns(adminDictDataRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictData + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictDataModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminDictDataModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminDictDataModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + tydataAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + tydataAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictDataIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminDictDataDictTypeDictLabelKey, tydataAdminDictDataDictTypeDictValueKey, tydataAdminDictDataIdKey) + return err +} +func (m *defaultAdminDictDataModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminDictDataIdPrefix, primary) +} +func (m *defaultAdminDictDataModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictDataRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminDictDataModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminDictTypeModel.go b/app/main/model/adminDictTypeModel.go new file mode 100644 index 0000000..1153feb --- /dev/null +++ b/app/main/model/adminDictTypeModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminDictTypeModel = (*customAdminDictTypeModel)(nil) + +type ( + // AdminDictTypeModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminDictTypeModel. + AdminDictTypeModel interface { + adminDictTypeModel + } + + customAdminDictTypeModel struct { + *defaultAdminDictTypeModel + } +) + +// NewAdminDictTypeModel returns a model for the database table. +func NewAdminDictTypeModel(conn sqlx.SqlConn, c cache.CacheConf) AdminDictTypeModel { + return &customAdminDictTypeModel{ + defaultAdminDictTypeModel: newAdminDictTypeModel(conn, c), + } +} diff --git a/app/main/model/adminDictTypeModel_gen.go b/app/main/model/adminDictTypeModel_gen.go new file mode 100644 index 0000000..259180e --- /dev/null +++ b/app/main/model/adminDictTypeModel_gen.go @@ -0,0 +1,409 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminDictTypeFieldNames = builder.RawFieldNames(&AdminDictType{}) + adminDictTypeRows = strings.Join(adminDictTypeFieldNames, ",") + adminDictTypeRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminDictTypeRowsWithPlaceHolder = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminDictTypeIdPrefix = "cache:tydata:adminDictType:id:" + cacheTydataAdminDictTypeDictTypePrefix = "cache:tydata:adminDictType:dictType:" +) + +type ( + adminDictTypeModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminDictType, error) + FindOneByDictType(ctx context.Context, dictType string) (*AdminDictType, error) + Update(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminDictType) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictType) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminDictType, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictType, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictType, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminDictTypeModel struct { + sqlc.CachedConn + table string + } + + AdminDictType struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + DictType string `db:"dict_type"` // 字典类型编码 + DictName string `db:"dict_name"` // 字典类型名称 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Remark sql.NullString `db:"remark"` // 备注 + } +) + +func newAdminDictTypeModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminDictTypeModel { + return &defaultAdminDictTypeModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_dict_type`", + } +} + +func (m *defaultAdminDictTypeModel) Insert(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeDictTypePrefix, data.DictType) + tydataAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, adminDictTypeRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictName, data.Status, data.Remark) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictName, data.Status, data.Remark) + }, tydataAdminDictTypeDictTypeKey, tydataAdminDictTypeIdKey) +} + +func (m *defaultAdminDictTypeModel) FindOne(ctx context.Context, id int64) (*AdminDictType, error) { + tydataAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeIdPrefix, id) + var resp AdminDictType + err := m.QueryRowCtx(ctx, &resp, tydataAdminDictTypeIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictTypeRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindOneByDictType(ctx context.Context, dictType string) (*AdminDictType, error) { + tydataAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeDictTypePrefix, dictType) + var resp AdminDictType + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminDictTypeDictTypeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `dict_type` = ? and del_state = ? limit 1", adminDictTypeRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, dictType, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) Update(ctx context.Context, session sqlx.Session, newData *AdminDictType) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeDictTypePrefix, data.DictType) + tydataAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminDictTypeRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id) + }, tydataAdminDictTypeDictTypeKey, tydataAdminDictTypeIdKey) +} + +func (m *defaultAdminDictTypeModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminDictType) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeDictTypePrefix, data.DictType) + tydataAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminDictTypeRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.DictType, newData.DictName, newData.Status, newData.Remark, newData.Id, oldVersion) + }, tydataAdminDictTypeDictTypeKey, tydataAdminDictTypeIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminDictTypeModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminDictType) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminDictTypeModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminDictTypeModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictTypeModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminDictTypeModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminDictType, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminDictTypeRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminDictType, error) { + + builder = builder.Columns(adminDictTypeRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminDictType + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminDictTypeModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminDictTypeModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminDictTypeModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeDictTypePrefix, data.DictType) + tydataAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheTydataAdminDictTypeIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminDictTypeDictTypeKey, tydataAdminDictTypeIdKey) + return err +} +func (m *defaultAdminDictTypeModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminDictTypeIdPrefix, primary) +} +func (m *defaultAdminDictTypeModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminDictTypeRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminDictTypeModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminMenuModel.go b/app/main/model/adminMenuModel.go new file mode 100644 index 0000000..c2dc171 --- /dev/null +++ b/app/main/model/adminMenuModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminMenuModel = (*customAdminMenuModel)(nil) + +type ( + // AdminMenuModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminMenuModel. + AdminMenuModel interface { + adminMenuModel + } + + customAdminMenuModel struct { + *defaultAdminMenuModel + } +) + +// NewAdminMenuModel returns a model for the database table. +func NewAdminMenuModel(conn sqlx.SqlConn, c cache.CacheConf) AdminMenuModel { + return &customAdminMenuModel{ + defaultAdminMenuModel: newAdminMenuModel(conn, c), + } +} diff --git a/app/main/model/adminMenuModel_gen.go b/app/main/model/adminMenuModel_gen.go new file mode 100644 index 0000000..594ab19 --- /dev/null +++ b/app/main/model/adminMenuModel_gen.go @@ -0,0 +1,414 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminMenuFieldNames = builder.RawFieldNames(&AdminMenu{}) + adminMenuRows = strings.Join(adminMenuFieldNames, ",") + adminMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminMenuFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminMenuRowsWithPlaceHolder = strings.Join(stringx.Remove(adminMenuFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminMenuIdPrefix = "cache:tydata:adminMenu:id:" + cacheTydataAdminMenuNamePathPrefix = "cache:tydata:adminMenu:name:path:" +) + +type ( + adminMenuModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminMenu, error) + FindOneByNamePath(ctx context.Context, name string, path string) (*AdminMenu, error) + Update(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminMenu) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminMenu) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminMenu, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminMenu, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminMenu, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminMenuModel struct { + sqlc.CachedConn + table string + } + + AdminMenu struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + Pid int64 `db:"pid"` // 父菜单ID + Name string `db:"name"` // 路由名称 + Path string `db:"path"` // 路由路径 + Component string `db:"component"` // 组件路径 + Redirect sql.NullString `db:"redirect"` // 重定向路径 + Meta string `db:"meta"` // 路由元数据配置 + Status int64 `db:"status"` // 状态: 0-禁用, 1-启用 + Type int64 `db:"type"` + Sort int64 `db:"sort"` // 排序号 + } +) + +func newAdminMenuModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminMenuModel { + return &defaultAdminMenuModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_menu`", + } +} + +func (m *defaultAdminMenuModel) Insert(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminMenuIdPrefix, data.Id) + tydataAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminMenuNamePathPrefix, data.Name, data.Path) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminMenuRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Pid, data.Name, data.Path, data.Component, data.Redirect, data.Meta, data.Status, data.Type, data.Sort) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Pid, data.Name, data.Path, data.Component, data.Redirect, data.Meta, data.Status, data.Type, data.Sort) + }, tydataAdminMenuIdKey, tydataAdminMenuNamePathKey) +} + +func (m *defaultAdminMenuModel) FindOne(ctx context.Context, id int64) (*AdminMenu, error) { + tydataAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminMenuIdPrefix, id) + var resp AdminMenu + err := m.QueryRowCtx(ctx, &resp, tydataAdminMenuIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindOneByNamePath(ctx context.Context, name string, path string) (*AdminMenu, error) { + tydataAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminMenuNamePathPrefix, name, path) + var resp AdminMenu + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminMenuNamePathKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `name` = ? and `path` = ? and del_state = ? limit 1", adminMenuRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, name, path, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) Update(ctx context.Context, session sqlx.Session, newData *AdminMenu) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminMenuIdPrefix, data.Id) + tydataAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminMenuNamePathPrefix, data.Name, data.Path) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id) + }, tydataAdminMenuIdKey, tydataAdminMenuNamePathKey) +} + +func (m *defaultAdminMenuModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminMenu) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminMenuIdPrefix, data.Id) + tydataAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminMenuNamePathPrefix, data.Name, data.Path) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Pid, newData.Name, newData.Path, newData.Component, newData.Redirect, newData.Meta, newData.Status, newData.Type, newData.Sort, newData.Id, oldVersion) + }, tydataAdminMenuIdKey, tydataAdminMenuNamePathKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminMenuModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminMenu) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminMenuModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminMenuModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminMenuModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminMenuModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminMenu, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminMenu, error) { + + builder = builder.Columns(adminMenuRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminMenuModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminMenuModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminMenuModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminMenuIdPrefix, id) + tydataAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminMenuNamePathPrefix, data.Name, data.Path) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminMenuIdKey, tydataAdminMenuNamePathKey) + return err +} +func (m *defaultAdminMenuModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminMenuIdPrefix, primary) +} +func (m *defaultAdminMenuModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminMenuModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionLinkModel.go b/app/main/model/adminPromotionLinkModel.go new file mode 100644 index 0000000..d82c42e --- /dev/null +++ b/app/main/model/adminPromotionLinkModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionLinkModel = (*customAdminPromotionLinkModel)(nil) + +type ( + // AdminPromotionLinkModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionLinkModel. + AdminPromotionLinkModel interface { + adminPromotionLinkModel + } + + customAdminPromotionLinkModel struct { + *defaultAdminPromotionLinkModel + } +) + +// NewAdminPromotionLinkModel returns a model for the database table. +func NewAdminPromotionLinkModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionLinkModel { + return &customAdminPromotionLinkModel{ + defaultAdminPromotionLinkModel: newAdminPromotionLinkModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionLinkModel_gen.go b/app/main/model/adminPromotionLinkModel_gen.go new file mode 100644 index 0000000..e04074f --- /dev/null +++ b/app/main/model/adminPromotionLinkModel_gen.go @@ -0,0 +1,408 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminPromotionLinkFieldNames = builder.RawFieldNames(&AdminPromotionLink{}) + adminPromotionLinkRows = strings.Join(adminPromotionLinkFieldNames, ",") + adminPromotionLinkRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionLinkFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionLinkRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionLinkFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminPromotionLinkIdPrefix = "cache:tydata:adminPromotionLink:id:" + cacheTydataAdminPromotionLinkUrlPrefix = "cache:tydata:adminPromotionLink:url:" +) + +type ( + adminPromotionLinkModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionLink, error) + FindOneByUrl(ctx context.Context, url string) (*AdminPromotionLink, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLink, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLink, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLink, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionLinkModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionLink struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + Url string `db:"url"` // 推广链接URL + Name string `db:"name"` // 推广链接名称 + AdminUserId int64 `db:"admin_user_id"` // 推广者账号ID + } +) + +func newAdminPromotionLinkModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionLinkModel { + return &defaultAdminPromotionLinkModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_link`", + } +} + +func (m *defaultAdminPromotionLinkModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkIdPrefix, data.Id) + tydataAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkUrlPrefix, data.Url) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, adminPromotionLinkRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Url, data.Name, data.AdminUserId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Url, data.Name, data.AdminUserId) + }, tydataAdminPromotionLinkIdKey, tydataAdminPromotionLinkUrlKey) +} + +func (m *defaultAdminPromotionLinkModel) FindOne(ctx context.Context, id int64) (*AdminPromotionLink, error) { + tydataAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkIdPrefix, id) + var resp AdminPromotionLink + err := m.QueryRowCtx(ctx, &resp, tydataAdminPromotionLinkIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindOneByUrl(ctx context.Context, url string) (*AdminPromotionLink, error) { + tydataAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkUrlPrefix, url) + var resp AdminPromotionLink + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminPromotionLinkUrlKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `url` = ? and del_state = ? limit 1", adminPromotionLinkRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, url, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionLink) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkIdPrefix, data.Id) + tydataAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkUrlPrefix, data.Url) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionLinkRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id) + }, tydataAdminPromotionLinkIdKey, tydataAdminPromotionLinkUrlKey) +} + +func (m *defaultAdminPromotionLinkModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionLink) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkIdPrefix, data.Id) + tydataAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkUrlPrefix, data.Url) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionLinkRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Url, newData.Name, newData.AdminUserId, newData.Id, oldVersion) + }, tydataAdminPromotionLinkIdKey, tydataAdminPromotionLinkUrlKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionLinkModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLink) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionLinkModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionLinkModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLink, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLink, error) { + + builder = builder.Columns(adminPromotionLinkRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionLinkModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionLinkModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminPromotionLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkIdPrefix, id) + tydataAdminPromotionLinkUrlKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkUrlPrefix, data.Url) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminPromotionLinkIdKey, tydataAdminPromotionLinkUrlKey) + return err +} +func (m *defaultAdminPromotionLinkModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkIdPrefix, primary) +} +func (m *defaultAdminPromotionLinkModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionLinkModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionLinkStatsHistoryModel.go b/app/main/model/adminPromotionLinkStatsHistoryModel.go new file mode 100644 index 0000000..685db69 --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsHistoryModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionLinkStatsHistoryModel = (*customAdminPromotionLinkStatsHistoryModel)(nil) + +type ( + // AdminPromotionLinkStatsHistoryModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionLinkStatsHistoryModel. + AdminPromotionLinkStatsHistoryModel interface { + adminPromotionLinkStatsHistoryModel + } + + customAdminPromotionLinkStatsHistoryModel struct { + *defaultAdminPromotionLinkStatsHistoryModel + } +) + +// NewAdminPromotionLinkStatsHistoryModel returns a model for the database table. +func NewAdminPromotionLinkStatsHistoryModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionLinkStatsHistoryModel { + return &customAdminPromotionLinkStatsHistoryModel{ + defaultAdminPromotionLinkStatsHistoryModel: newAdminPromotionLinkStatsHistoryModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionLinkStatsHistoryModel_gen.go b/app/main/model/adminPromotionLinkStatsHistoryModel_gen.go new file mode 100644 index 0000000..206f7ae --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsHistoryModel_gen.go @@ -0,0 +1,412 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminPromotionLinkStatsHistoryFieldNames = builder.RawFieldNames(&AdminPromotionLinkStatsHistory{}) + adminPromotionLinkStatsHistoryRows = strings.Join(adminPromotionLinkStatsHistoryFieldNames, ",") + adminPromotionLinkStatsHistoryRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionLinkStatsHistoryFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionLinkStatsHistoryRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionLinkStatsHistoryFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminPromotionLinkStatsHistoryIdPrefix = "cache:tydata:adminPromotionLinkStatsHistory:id:" + cacheTydataAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix = "cache:tydata:adminPromotionLinkStatsHistory:linkId:statsDate:" +) + +type ( + adminPromotionLinkStatsHistoryModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsHistory, error) + FindOneByLinkIdStatsDate(ctx context.Context, linkId int64, statsDate time.Time) (*AdminPromotionLinkStatsHistory, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionLinkStatsHistoryModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionLinkStatsHistory struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + LinkId int64 `db:"link_id"` // 推广链接ID + StatsDate time.Time `db:"stats_date"` // 统计日期 + ClickCount int64 `db:"click_count"` // 点击数 + PayCount int64 `db:"pay_count"` // 付费次数 + PayAmount float64 `db:"pay_amount"` // 付费金额 + LastClickTime sql.NullTime `db:"last_click_time"` // 最后点击时间 + LastPayTime sql.NullTime `db:"last_pay_time"` // 最后付费时间 + } +) + +func newAdminPromotionLinkStatsHistoryModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionLinkStatsHistoryModel { + return &defaultAdminPromotionLinkStatsHistoryModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_link_stats_history`", + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsHistoryIdPrefix, data.Id) + tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminPromotionLinkStatsHistoryRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.StatsDate, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.StatsDate, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + }, tydataAdminPromotionLinkStatsHistoryIdKey, tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsHistory, error) { + tydataAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsHistoryIdPrefix, id) + var resp AdminPromotionLinkStatsHistory + err := m.QueryRowCtx(ctx, &resp, tydataAdminPromotionLinkStatsHistoryIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsHistoryRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindOneByLinkIdStatsDate(ctx context.Context, linkId int64, statsDate time.Time) (*AdminPromotionLinkStatsHistory, error) { + tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, linkId, statsDate) + var resp AdminPromotionLinkStatsHistory + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `link_id` = ? and `stats_date` = ? and del_state = ? limit 1", adminPromotionLinkStatsHistoryRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, linkId, statsDate, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsHistory) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsHistoryIdPrefix, data.Id) + tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionLinkStatsHistoryRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + }, tydataAdminPromotionLinkStatsHistoryIdKey, tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsHistory) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsHistoryIdPrefix, data.Id) + tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionLinkStatsHistoryRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.StatsDate, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + }, tydataAdminPromotionLinkStatsHistoryIdKey, tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsHistory) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionLinkStatsHistoryModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsHistory, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsHistory, error) { + + builder = builder.Columns(adminPromotionLinkStatsHistoryRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsHistory + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionLinkStatsHistoryModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminPromotionLinkStatsHistoryIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsHistoryIdPrefix, id) + tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminPromotionLinkStatsHistoryLinkIdStatsDatePrefix, data.LinkId, data.StatsDate) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminPromotionLinkStatsHistoryIdKey, tydataAdminPromotionLinkStatsHistoryLinkIdStatsDateKey) + return err +} +func (m *defaultAdminPromotionLinkStatsHistoryModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsHistoryIdPrefix, primary) +} +func (m *defaultAdminPromotionLinkStatsHistoryModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsHistoryRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionLinkStatsHistoryModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionLinkStatsTotalModel.go b/app/main/model/adminPromotionLinkStatsTotalModel.go new file mode 100644 index 0000000..e5dfacc --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsTotalModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionLinkStatsTotalModel = (*customAdminPromotionLinkStatsTotalModel)(nil) + +type ( + // AdminPromotionLinkStatsTotalModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionLinkStatsTotalModel. + AdminPromotionLinkStatsTotalModel interface { + adminPromotionLinkStatsTotalModel + } + + customAdminPromotionLinkStatsTotalModel struct { + *defaultAdminPromotionLinkStatsTotalModel + } +) + +// NewAdminPromotionLinkStatsTotalModel returns a model for the database table. +func NewAdminPromotionLinkStatsTotalModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionLinkStatsTotalModel { + return &customAdminPromotionLinkStatsTotalModel{ + defaultAdminPromotionLinkStatsTotalModel: newAdminPromotionLinkStatsTotalModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionLinkStatsTotalModel_gen.go b/app/main/model/adminPromotionLinkStatsTotalModel_gen.go new file mode 100644 index 0000000..99a1458 --- /dev/null +++ b/app/main/model/adminPromotionLinkStatsTotalModel_gen.go @@ -0,0 +1,411 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminPromotionLinkStatsTotalFieldNames = builder.RawFieldNames(&AdminPromotionLinkStatsTotal{}) + adminPromotionLinkStatsTotalRows = strings.Join(adminPromotionLinkStatsTotalFieldNames, ",") + adminPromotionLinkStatsTotalRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionLinkStatsTotalFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionLinkStatsTotalRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionLinkStatsTotalFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminPromotionLinkStatsTotalIdPrefix = "cache:tydata:adminPromotionLinkStatsTotal:id:" + cacheTydataAdminPromotionLinkStatsTotalLinkIdPrefix = "cache:tydata:adminPromotionLinkStatsTotal:linkId:" +) + +type ( + adminPromotionLinkStatsTotalModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsTotal, error) + FindOneByLinkId(ctx context.Context, linkId int64) (*AdminPromotionLinkStatsTotal, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionLinkStatsTotalModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionLinkStatsTotal struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + LinkId int64 `db:"link_id"` // 推广链接ID + ClickCount int64 `db:"click_count"` // 总点击数 + PayCount int64 `db:"pay_count"` // 总付费次数 + PayAmount float64 `db:"pay_amount"` // 总付费金额 + LastClickTime sql.NullTime `db:"last_click_time"` // 最后点击时间 + LastPayTime sql.NullTime `db:"last_pay_time"` // 最后付费时间 + } +) + +func newAdminPromotionLinkStatsTotalModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionLinkStatsTotalModel { + return &defaultAdminPromotionLinkStatsTotalModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_link_stats_total`", + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalIdPrefix, data.Id) + tydataAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminPromotionLinkStatsTotalRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.ClickCount, data.PayCount, data.PayAmount, data.LastClickTime, data.LastPayTime) + }, tydataAdminPromotionLinkStatsTotalIdKey, tydataAdminPromotionLinkStatsTotalLinkIdKey) +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindOne(ctx context.Context, id int64) (*AdminPromotionLinkStatsTotal, error) { + tydataAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalIdPrefix, id) + var resp AdminPromotionLinkStatsTotal + err := m.QueryRowCtx(ctx, &resp, tydataAdminPromotionLinkStatsTotalIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsTotalRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindOneByLinkId(ctx context.Context, linkId int64) (*AdminPromotionLinkStatsTotal, error) { + tydataAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalLinkIdPrefix, linkId) + var resp AdminPromotionLinkStatsTotal + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminPromotionLinkStatsTotalLinkIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `link_id` = ? and del_state = ? limit 1", adminPromotionLinkStatsTotalRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, linkId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsTotal) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalIdPrefix, data.Id) + tydataAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionLinkStatsTotalRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id) + }, tydataAdminPromotionLinkStatsTotalIdKey, tydataAdminPromotionLinkStatsTotalLinkIdKey) +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionLinkStatsTotal) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalIdPrefix, data.Id) + tydataAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionLinkStatsTotalRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.ClickCount, newData.PayCount, newData.PayAmount, newData.LastClickTime, newData.LastPayTime, newData.Id, oldVersion) + }, tydataAdminPromotionLinkStatsTotalIdKey, tydataAdminPromotionLinkStatsTotalLinkIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionLinkStatsTotal) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionLinkStatsTotalModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionLinkStatsTotal, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionLinkStatsTotal, error) { + + builder = builder.Columns(adminPromotionLinkStatsTotalRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionLinkStatsTotal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionLinkStatsTotalModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminPromotionLinkStatsTotalIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalIdPrefix, id) + tydataAdminPromotionLinkStatsTotalLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalLinkIdPrefix, data.LinkId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminPromotionLinkStatsTotalIdKey, tydataAdminPromotionLinkStatsTotalLinkIdKey) + return err +} +func (m *defaultAdminPromotionLinkStatsTotalModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminPromotionLinkStatsTotalIdPrefix, primary) +} +func (m *defaultAdminPromotionLinkStatsTotalModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionLinkStatsTotalRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionLinkStatsTotalModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminPromotionOrderModel.go b/app/main/model/adminPromotionOrderModel.go new file mode 100644 index 0000000..9d8366f --- /dev/null +++ b/app/main/model/adminPromotionOrderModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminPromotionOrderModel = (*customAdminPromotionOrderModel)(nil) + +type ( + // AdminPromotionOrderModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminPromotionOrderModel. + AdminPromotionOrderModel interface { + adminPromotionOrderModel + } + + customAdminPromotionOrderModel struct { + *defaultAdminPromotionOrderModel + } +) + +// NewAdminPromotionOrderModel returns a model for the database table. +func NewAdminPromotionOrderModel(conn sqlx.SqlConn, c cache.CacheConf) AdminPromotionOrderModel { + return &customAdminPromotionOrderModel{ + defaultAdminPromotionOrderModel: newAdminPromotionOrderModel(conn, c), + } +} diff --git a/app/main/model/adminPromotionOrderModel_gen.go b/app/main/model/adminPromotionOrderModel_gen.go new file mode 100644 index 0000000..6503454 --- /dev/null +++ b/app/main/model/adminPromotionOrderModel_gen.go @@ -0,0 +1,409 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminPromotionOrderFieldNames = builder.RawFieldNames(&AdminPromotionOrder{}) + adminPromotionOrderRows = strings.Join(adminPromotionOrderFieldNames, ",") + adminPromotionOrderRowsExpectAutoSet = strings.Join(stringx.Remove(adminPromotionOrderFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminPromotionOrderRowsWithPlaceHolder = strings.Join(stringx.Remove(adminPromotionOrderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminPromotionOrderIdPrefix = "cache:tydata:adminPromotionOrder:id:" + cacheTydataAdminPromotionOrderOrderIdPrefix = "cache:tydata:adminPromotionOrder:orderId:" +) + +type ( + adminPromotionOrderModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminPromotionOrder, error) + FindOneByOrderId(ctx context.Context, orderId int64) (*AdminPromotionOrder, error) + Update(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionOrder, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionOrder, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionOrder, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminPromotionOrderModel struct { + sqlc.CachedConn + table string + } + + AdminPromotionOrder struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + LinkId int64 `db:"link_id"` // 推广链接ID + OrderId int64 `db:"order_id"` // 订单ID + UserId int64 `db:"user_id"` // 下单用户ID + AdminUserId int64 `db:"admin_user_id"` // 推广者账号ID + } +) + +func newAdminPromotionOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminPromotionOrderModel { + return &defaultAdminPromotionOrderModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_promotion_order`", + } +} + +func (m *defaultAdminPromotionOrderModel) Insert(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderIdPrefix, data.Id) + tydataAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderOrderIdPrefix, data.OrderId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, adminPromotionOrderRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.OrderId, data.UserId, data.AdminUserId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.LinkId, data.OrderId, data.UserId, data.AdminUserId) + }, tydataAdminPromotionOrderIdKey, tydataAdminPromotionOrderOrderIdKey) +} + +func (m *defaultAdminPromotionOrderModel) FindOne(ctx context.Context, id int64) (*AdminPromotionOrder, error) { + tydataAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderIdPrefix, id) + var resp AdminPromotionOrder + err := m.QueryRowCtx(ctx, &resp, tydataAdminPromotionOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindOneByOrderId(ctx context.Context, orderId int64) (*AdminPromotionOrder, error) { + tydataAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderOrderIdPrefix, orderId) + var resp AdminPromotionOrder + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminPromotionOrderOrderIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `order_id` = ? and del_state = ? limit 1", adminPromotionOrderRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, orderId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) Update(ctx context.Context, session sqlx.Session, newData *AdminPromotionOrder) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderIdPrefix, data.Id) + tydataAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderOrderIdPrefix, data.OrderId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminPromotionOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id) + }, tydataAdminPromotionOrderIdKey, tydataAdminPromotionOrderOrderIdKey) +} + +func (m *defaultAdminPromotionOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminPromotionOrder) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderIdPrefix, data.Id) + tydataAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderOrderIdPrefix, data.OrderId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminPromotionOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.LinkId, newData.OrderId, newData.UserId, newData.AdminUserId, newData.Id, oldVersion) + }, tydataAdminPromotionOrderIdKey, tydataAdminPromotionOrderOrderIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminPromotionOrderModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminPromotionOrder) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminPromotionOrderModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminPromotionOrderModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminPromotionOrder, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminPromotionOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminPromotionOrder, error) { + + builder = builder.Columns(adminPromotionOrderRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminPromotionOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminPromotionOrderModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminPromotionOrderModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminPromotionOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminPromotionOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderIdPrefix, id) + tydataAdminPromotionOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderOrderIdPrefix, data.OrderId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminPromotionOrderIdKey, tydataAdminPromotionOrderOrderIdKey) + return err +} +func (m *defaultAdminPromotionOrderModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminPromotionOrderIdPrefix, primary) +} +func (m *defaultAdminPromotionOrderModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminPromotionOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminPromotionOrderModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminRoleApiModel.go b/app/main/model/adminRoleApiModel.go new file mode 100644 index 0000000..bcb9fc7 --- /dev/null +++ b/app/main/model/adminRoleApiModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminRoleApiModel = (*customAdminRoleApiModel)(nil) + +type ( + // AdminRoleApiModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminRoleApiModel. + AdminRoleApiModel interface { + adminRoleApiModel + } + + customAdminRoleApiModel struct { + *defaultAdminRoleApiModel + } +) + +// NewAdminRoleApiModel returns a model for the database table. +func NewAdminRoleApiModel(conn sqlx.SqlConn, c cache.CacheConf) AdminRoleApiModel { + return &customAdminRoleApiModel{ + defaultAdminRoleApiModel: newAdminRoleApiModel(conn, c), + } +} diff --git a/app/main/model/adminRoleApiModel_gen.go b/app/main/model/adminRoleApiModel_gen.go new file mode 100644 index 0000000..1ef7cce --- /dev/null +++ b/app/main/model/adminRoleApiModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminRoleApiFieldNames = builder.RawFieldNames(&AdminRoleApi{}) + adminRoleApiRows = strings.Join(adminRoleApiFieldNames, ",") + adminRoleApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleApiRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminRoleApiIdPrefix = "cache:tydata:adminRoleApi:id:" + cacheTydataAdminRoleApiRoleIdApiIdPrefix = "cache:tydata:adminRoleApi:roleId:apiId:" +) + +type ( + adminRoleApiModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminRoleApi, error) + FindOneByRoleIdApiId(ctx context.Context, roleId int64, apiId int64) (*AdminRoleApi, error) + Update(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminRoleApi) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleApi) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleApi, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleApi, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleApi, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminRoleApiModel struct { + sqlc.CachedConn + table string + } + + AdminRoleApi struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + RoleId int64 `db:"role_id"` // 关联到角色表的id + ApiId int64 `db:"api_id"` // 关联到接口表的id + } +) + +func newAdminRoleApiModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleApiModel { + return &defaultAdminRoleApiModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_role_api`", + } +} + +func (m *defaultAdminRoleApiModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleApiIdPrefix, data.Id) + tydataAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, adminRoleApiRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.ApiId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.ApiId) + }, tydataAdminRoleApiIdKey, tydataAdminRoleApiRoleIdApiIdKey) +} + +func (m *defaultAdminRoleApiModel) FindOne(ctx context.Context, id int64) (*AdminRoleApi, error) { + tydataAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleApiIdPrefix, id) + var resp AdminRoleApi + err := m.QueryRowCtx(ctx, &resp, tydataAdminRoleApiIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindOneByRoleIdApiId(ctx context.Context, roleId int64, apiId int64) (*AdminRoleApi, error) { + tydataAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleApiRoleIdApiIdPrefix, roleId, apiId) + var resp AdminRoleApi + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminRoleApiRoleIdApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `role_id` = ? and `api_id` = ? and del_state = ? limit 1", adminRoleApiRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, roleId, apiId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) Update(ctx context.Context, session sqlx.Session, newData *AdminRoleApi) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleApiIdPrefix, data.Id) + tydataAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminRoleApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id) + }, tydataAdminRoleApiIdKey, tydataAdminRoleApiRoleIdApiIdKey) +} + +func (m *defaultAdminRoleApiModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRoleApi) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleApiIdPrefix, data.Id) + tydataAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminRoleApiRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.ApiId, newData.Id, oldVersion) + }, tydataAdminRoleApiIdKey, tydataAdminRoleApiRoleIdApiIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminRoleApiModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleApi) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminRoleApiModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminRoleApiModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleApiModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleApiModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleApi, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminRoleApiRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleApi, error) { + + builder = builder.Columns(adminRoleApiRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleApi + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleApiModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminRoleApiModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminRoleApiModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleApiIdPrefix, id) + tydataAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminRoleApiIdKey, tydataAdminRoleApiRoleIdApiIdKey) + return err +} +func (m *defaultAdminRoleApiModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminRoleApiIdPrefix, primary) +} +func (m *defaultAdminRoleApiModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleApiRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminRoleApiModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminRoleMenuModel.go b/app/main/model/adminRoleMenuModel.go new file mode 100644 index 0000000..8dc9812 --- /dev/null +++ b/app/main/model/adminRoleMenuModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminRoleMenuModel = (*customAdminRoleMenuModel)(nil) + +type ( + // AdminRoleMenuModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminRoleMenuModel. + AdminRoleMenuModel interface { + adminRoleMenuModel + } + + customAdminRoleMenuModel struct { + *defaultAdminRoleMenuModel + } +) + +// NewAdminRoleMenuModel returns a model for the database table. +func NewAdminRoleMenuModel(conn sqlx.SqlConn, c cache.CacheConf) AdminRoleMenuModel { + return &customAdminRoleMenuModel{ + defaultAdminRoleMenuModel: newAdminRoleMenuModel(conn, c), + } +} diff --git a/app/main/model/adminRoleMenuModel_gen.go b/app/main/model/adminRoleMenuModel_gen.go new file mode 100644 index 0000000..386254c --- /dev/null +++ b/app/main/model/adminRoleMenuModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminRoleMenuFieldNames = builder.RawFieldNames(&AdminRoleMenu{}) + adminRoleMenuRows = strings.Join(adminRoleMenuFieldNames, ",") + adminRoleMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleMenuRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminRoleMenuIdPrefix = "cache:tydata:adminRoleMenu:id:" + cacheTydataAdminRoleMenuRoleIdMenuIdPrefix = "cache:tydata:adminRoleMenu:roleId:menuId:" +) + +type ( + adminRoleMenuModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminRoleMenu, error) + FindOneByRoleIdMenuId(ctx context.Context, roleId int64, menuId int64) (*AdminRoleMenu, error) + Update(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleMenu, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleMenu, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleMenu, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminRoleMenuModel struct { + sqlc.CachedConn + table string + } + + AdminRoleMenu struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + RoleId int64 `db:"role_id"` // 关联到角色表的id + MenuId int64 `db:"menu_id"` // 关联到菜单表的id + } +) + +func newAdminRoleMenuModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleMenuModel { + return &defaultAdminRoleMenuModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_role_menu`", + } +} + +func (m *defaultAdminRoleMenuModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleMenuIdPrefix, data.Id) + tydataAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, adminRoleMenuRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.MenuId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.MenuId) + }, tydataAdminRoleMenuIdKey, tydataAdminRoleMenuRoleIdMenuIdKey) +} + +func (m *defaultAdminRoleMenuModel) FindOne(ctx context.Context, id int64) (*AdminRoleMenu, error) { + tydataAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleMenuIdPrefix, id) + var resp AdminRoleMenu + err := m.QueryRowCtx(ctx, &resp, tydataAdminRoleMenuIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindOneByRoleIdMenuId(ctx context.Context, roleId int64, menuId int64) (*AdminRoleMenu, error) { + tydataAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleMenuRoleIdMenuIdPrefix, roleId, menuId) + var resp AdminRoleMenu + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminRoleMenuRoleIdMenuIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `role_id` = ? and `menu_id` = ? and del_state = ? limit 1", adminRoleMenuRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, roleId, menuId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) Update(ctx context.Context, session sqlx.Session, newData *AdminRoleMenu) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleMenuIdPrefix, data.Id) + tydataAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminRoleMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id) + }, tydataAdminRoleMenuIdKey, tydataAdminRoleMenuRoleIdMenuIdKey) +} + +func (m *defaultAdminRoleMenuModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRoleMenu) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleMenuIdPrefix, data.Id) + tydataAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminRoleMenuRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleId, newData.MenuId, newData.Id, oldVersion) + }, tydataAdminRoleMenuIdKey, tydataAdminRoleMenuRoleIdMenuIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminRoleMenuModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminRoleMenuModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminRoleMenuModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleMenuModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleMenuModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRoleMenu, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminRoleMenuRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRoleMenu, error) { + + builder = builder.Columns(adminRoleMenuRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRoleMenu + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleMenuModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminRoleMenuModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminRoleMenuModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleMenuIdPrefix, id) + tydataAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminRoleMenuIdKey, tydataAdminRoleMenuRoleIdMenuIdKey) + return err +} +func (m *defaultAdminRoleMenuModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminRoleMenuIdPrefix, primary) +} +func (m *defaultAdminRoleMenuModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleMenuRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminRoleMenuModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminRoleModel.go b/app/main/model/adminRoleModel.go new file mode 100644 index 0000000..26dc91d --- /dev/null +++ b/app/main/model/adminRoleModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminRoleModel = (*customAdminRoleModel)(nil) + +type ( + // AdminRoleModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminRoleModel. + AdminRoleModel interface { + adminRoleModel + } + + customAdminRoleModel struct { + *defaultAdminRoleModel + } +) + +// NewAdminRoleModel returns a model for the database table. +func NewAdminRoleModel(conn sqlx.SqlConn, c cache.CacheConf) AdminRoleModel { + return &customAdminRoleModel{ + defaultAdminRoleModel: newAdminRoleModel(conn, c), + } +} diff --git a/app/main/model/adminRoleModel_gen.go b/app/main/model/adminRoleModel_gen.go new file mode 100644 index 0000000..6e5aa43 --- /dev/null +++ b/app/main/model/adminRoleModel_gen.go @@ -0,0 +1,410 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminRoleFieldNames = builder.RawFieldNames(&AdminRole{}) + adminRoleRows = strings.Join(adminRoleFieldNames, ",") + adminRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminRoleIdPrefix = "cache:tydata:adminRole:id:" + cacheTydataAdminRoleRoleCodePrefix = "cache:tydata:adminRole:roleCode:" +) + +type ( + adminRoleModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminRole, error) + FindOneByRoleCode(ctx context.Context, roleCode string) (*AdminRole, error) + Update(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminRole) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRole) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminRole, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRole, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRole, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminRoleModel struct { + sqlc.CachedConn + table string + } + + AdminRole struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + RoleName string `db:"role_name"` // 角色名称 + RoleCode string `db:"role_code"` // 角色编码 + Description string `db:"description"` // 角色描述 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + Sort int64 `db:"sort"` // 排序 + } +) + +func newAdminRoleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleModel { + return &defaultAdminRoleModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_role`", + } +} + +func (m *defaultAdminRoleModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleIdPrefix, data.Id) + tydataAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleRoleCodePrefix, data.RoleCode) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, adminRoleRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleName, data.RoleCode, data.Description, data.Status, data.Sort) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.RoleName, data.RoleCode, data.Description, data.Status, data.Sort) + }, tydataAdminRoleIdKey, tydataAdminRoleRoleCodeKey) +} + +func (m *defaultAdminRoleModel) FindOne(ctx context.Context, id int64) (*AdminRole, error) { + tydataAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleIdPrefix, id) + var resp AdminRole + err := m.QueryRowCtx(ctx, &resp, tydataAdminRoleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindOneByRoleCode(ctx context.Context, roleCode string) (*AdminRole, error) { + tydataAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleRoleCodePrefix, roleCode) + var resp AdminRole + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminRoleRoleCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `role_code` = ? and del_state = ? limit 1", adminRoleRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, roleCode, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) Update(ctx context.Context, session sqlx.Session, newData *AdminRole) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleIdPrefix, data.Id) + tydataAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleRoleCodePrefix, data.RoleCode) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id) + }, tydataAdminRoleIdKey, tydataAdminRoleRoleCodeKey) +} + +func (m *defaultAdminRoleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRole) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleIdPrefix, data.Id) + tydataAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleRoleCodePrefix, data.RoleCode) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.RoleName, newData.RoleCode, newData.Description, newData.Status, newData.Sort, newData.Id, oldVersion) + }, tydataAdminRoleIdKey, tydataAdminRoleRoleCodeKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminRoleModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminRole) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminRoleModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminRoleModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminRoleModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminRole, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminRole, error) { + + builder = builder.Columns(adminRoleRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminRoleModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminRoleModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminRoleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleIdPrefix, id) + tydataAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheTydataAdminRoleRoleCodePrefix, data.RoleCode) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminRoleIdKey, tydataAdminRoleRoleCodeKey) + return err +} +func (m *defaultAdminRoleModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminRoleIdPrefix, primary) +} +func (m *defaultAdminRoleModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminRoleModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminUserModel.go b/app/main/model/adminUserModel.go new file mode 100644 index 0000000..25d463e --- /dev/null +++ b/app/main/model/adminUserModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminUserModel = (*customAdminUserModel)(nil) + +type ( + // AdminUserModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminUserModel. + AdminUserModel interface { + adminUserModel + } + + customAdminUserModel struct { + *defaultAdminUserModel + } +) + +// NewAdminUserModel returns a model for the database table. +func NewAdminUserModel(conn sqlx.SqlConn, c cache.CacheConf) AdminUserModel { + return &customAdminUserModel{ + defaultAdminUserModel: newAdminUserModel(conn, c), + } +} diff --git a/app/main/model/adminUserModel_gen.go b/app/main/model/adminUserModel_gen.go new file mode 100644 index 0000000..06c1248 --- /dev/null +++ b/app/main/model/adminUserModel_gen.go @@ -0,0 +1,435 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminUserFieldNames = builder.RawFieldNames(&AdminUser{}) + adminUserRows = strings.Join(adminUserFieldNames, ",") + adminUserRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminUserRowsWithPlaceHolder = strings.Join(stringx.Remove(adminUserFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminUserIdPrefix = "cache:tydata:adminUser:id:" + cacheTydataAdminUserRealNamePrefix = "cache:tydata:adminUser:realName:" + cacheTydataAdminUserUsernamePrefix = "cache:tydata:adminUser:username:" +) + +type ( + adminUserModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminUser, error) + FindOneByRealName(ctx context.Context, realName string) (*AdminUser, error) + FindOneByUsername(ctx context.Context, username string) (*AdminUser, error) + Update(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminUser) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUser) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminUser, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUser, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUser, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminUserModel struct { + sqlc.CachedConn + table string + } + + AdminUser struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + Username string `db:"username"` // 用户名 + Password string `db:"password"` // 密码 + RealName string `db:"real_name"` // 真实姓名 + Status int64 `db:"status"` // 状态:0-禁用,1-启用 + } +) + +func newAdminUserModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminUserModel { + return &defaultAdminUserModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_user`", + } +} + +func (m *defaultAdminUserModel) Insert(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminUserIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserIdPrefix, data.Id) + tydataAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRealNamePrefix, data.RealName) + tydataAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserUsernamePrefix, data.Username) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, adminUserRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Username, data.Password, data.RealName, data.Status) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Username, data.Password, data.RealName, data.Status) + }, tydataAdminUserIdKey, tydataAdminUserRealNameKey, tydataAdminUserUsernameKey) +} + +func (m *defaultAdminUserModel) FindOne(ctx context.Context, id int64) (*AdminUser, error) { + tydataAdminUserIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserIdPrefix, id) + var resp AdminUser + err := m.QueryRowCtx(ctx, &resp, tydataAdminUserIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindOneByRealName(ctx context.Context, realName string) (*AdminUser, error) { + tydataAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRealNamePrefix, realName) + var resp AdminUser + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminUserRealNameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `real_name` = ? and del_state = ? limit 1", adminUserRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, realName, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindOneByUsername(ctx context.Context, username string) (*AdminUser, error) { + tydataAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserUsernamePrefix, username) + var resp AdminUser + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminUserUsernameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `username` = ? and del_state = ? limit 1", adminUserRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, username, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) Update(ctx context.Context, session sqlx.Session, newData *AdminUser) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminUserIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserIdPrefix, data.Id) + tydataAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRealNamePrefix, data.RealName) + tydataAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserUsernamePrefix, data.Username) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminUserRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id) + }, tydataAdminUserIdKey, tydataAdminUserRealNameKey, tydataAdminUserUsernameKey) +} + +func (m *defaultAdminUserModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminUser) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminUserIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserIdPrefix, data.Id) + tydataAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRealNamePrefix, data.RealName) + tydataAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserUsernamePrefix, data.Username) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminUserRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Username, newData.Password, newData.RealName, newData.Status, newData.Id, oldVersion) + }, tydataAdminUserIdKey, tydataAdminUserRealNameKey, tydataAdminUserUsernameKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminUserModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUser) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminUserModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminUserModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUser, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminUserRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminUserModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUser, error) { + + builder = builder.Columns(adminUserRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUser + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminUserModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminUserModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminUserIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserIdPrefix, id) + tydataAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRealNamePrefix, data.RealName) + tydataAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheTydataAdminUserUsernamePrefix, data.Username) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminUserIdKey, tydataAdminUserRealNameKey, tydataAdminUserUsernameKey) + return err +} +func (m *defaultAdminUserModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminUserIdPrefix, primary) +} +func (m *defaultAdminUserModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminUserModel) tableName() string { + return m.table +} diff --git a/app/main/model/adminUserRoleModel.go b/app/main/model/adminUserRoleModel.go new file mode 100644 index 0000000..d9772ad --- /dev/null +++ b/app/main/model/adminUserRoleModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AdminUserRoleModel = (*customAdminUserRoleModel)(nil) + +type ( + // AdminUserRoleModel is an interface to be customized, add more methods here, + // and implement the added methods in customAdminUserRoleModel. + AdminUserRoleModel interface { + adminUserRoleModel + } + + customAdminUserRoleModel struct { + *defaultAdminUserRoleModel + } +) + +// NewAdminUserRoleModel returns a model for the database table. +func NewAdminUserRoleModel(conn sqlx.SqlConn, c cache.CacheConf) AdminUserRoleModel { + return &customAdminUserRoleModel{ + defaultAdminUserRoleModel: newAdminUserRoleModel(conn, c), + } +} diff --git a/app/main/model/adminUserRoleModel_gen.go b/app/main/model/adminUserRoleModel_gen.go new file mode 100644 index 0000000..36611e9 --- /dev/null +++ b/app/main/model/adminUserRoleModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + adminUserRoleFieldNames = builder.RawFieldNames(&AdminUserRole{}) + adminUserRoleRows = strings.Join(adminUserRoleFieldNames, ",") + adminUserRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminUserRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAdminUserRoleIdPrefix = "cache:tydata:adminUserRole:id:" + cacheTydataAdminUserRoleUserIdRoleIdPrefix = "cache:tydata:adminUserRole:userId:roleId:" +) + +type ( + adminUserRoleModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AdminUserRole, error) + FindOneByUserIdRoleId(ctx context.Context, userId int64, roleId int64) (*AdminUserRole, error) + Update(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AdminUserRole) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUserRole) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AdminUserRole, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUserRole, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUserRole, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAdminUserRoleModel struct { + sqlc.CachedConn + table string + } + + AdminUserRole struct { + Id int64 `db:"id"` + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` + Version int64 `db:"version"` // 版本号 + UserId int64 `db:"user_id"` // 关联到用户表的id + RoleId int64 `db:"role_id"` // 关联到角色表的id + } +) + +func newAdminUserRoleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminUserRoleModel { + return &defaultAdminUserRoleModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`admin_user_role`", + } +} + +func (m *defaultAdminUserRoleModel) Insert(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRoleIdPrefix, data.Id) + tydataAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?)", m.table, adminUserRoleRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.UserId, data.RoleId) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.UserId, data.RoleId) + }, tydataAdminUserRoleIdKey, tydataAdminUserRoleUserIdRoleIdKey) +} + +func (m *defaultAdminUserRoleModel) FindOne(ctx context.Context, id int64) (*AdminUserRole, error) { + tydataAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRoleIdPrefix, id) + var resp AdminUserRole + err := m.QueryRowCtx(ctx, &resp, tydataAdminUserRoleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindOneByUserIdRoleId(ctx context.Context, userId int64, roleId int64) (*AdminUserRole, error) { + tydataAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminUserRoleUserIdRoleIdPrefix, userId, roleId) + var resp AdminUserRole + err := m.QueryRowIndexCtx(ctx, &resp, tydataAdminUserRoleUserIdRoleIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `user_id` = ? and `role_id` = ? and del_state = ? limit 1", adminUserRoleRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, userId, roleId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) Update(ctx context.Context, session sqlx.Session, newData *AdminUserRole) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRoleIdPrefix, data.Id) + tydataAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, adminUserRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id) + }, tydataAdminUserRoleIdKey, tydataAdminUserRoleUserIdRoleIdKey) +} + +func (m *defaultAdminUserRoleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminUserRole) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRoleIdPrefix, data.Id) + tydataAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, adminUserRoleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.RoleId, newData.Id, oldVersion) + }, tydataAdminUserRoleIdKey, tydataAdminUserRoleUserIdRoleIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAdminUserRoleModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AdminUserRole) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AdminUserRoleModel delete err : %+v", err) + } + return nil +} + +func (m *defaultAdminUserRoleModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserRoleModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAdminUserRoleModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AdminUserRole, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(adminUserRoleRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AdminUserRole, error) { + + builder = builder.Columns(adminUserRoleRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AdminUserRole + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAdminUserRoleModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAdminUserRoleModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAdminUserRoleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheTydataAdminUserRoleIdPrefix, id) + tydataAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAdminUserRoleIdKey, tydataAdminUserRoleUserIdRoleIdKey) + return err +} +func (m *defaultAdminUserRoleModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAdminUserRoleIdPrefix, primary) +} +func (m *defaultAdminUserRoleModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", adminUserRoleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAdminUserRoleModel) tableName() string { + return m.table +} diff --git a/app/main/model/agentActiveStatModel_gen.go b/app/main/model/agentActiveStatModel_gen.go index af443da..9ab1b3a 100644 --- a/app/main/model/agentActiveStatModel_gen.go +++ b/app/main/model/agentActiveStatModel_gen.go @@ -180,7 +180,7 @@ func (m *defaultAgentActiveStatModel) DeleteSoft(ctx context.Context, session sq data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentActiveStatModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentActiveStatModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentAuditModel_gen.go b/app/main/model/agentAuditModel_gen.go index 420b6bb..8f27424 100644 --- a/app/main/model/agentAuditModel_gen.go +++ b/app/main/model/agentAuditModel_gen.go @@ -26,13 +26,15 @@ var ( agentAuditRowsExpectAutoSet = strings.Join(stringx.Remove(agentAuditFieldNames, "`id`", "`create_time`", "`update_time`"), ",") agentAuditRowsWithPlaceHolder = strings.Join(stringx.Remove(agentAuditFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheTydataAgentAuditIdPrefix = "cache:tydata:agentAudit:id:" + cacheTydataAgentAuditIdPrefix = "cache:tydata:agentAudit:id:" + cacheTydataAgentAuditUserIdPrefix = "cache:tydata:agentAudit:userId:" ) type ( agentAuditModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) FindOne(ctx context.Context, id int64) (*AgentAudit, error) + FindOneByUserId(ctx context.Context, userId int64) (*AgentAudit, error) Update(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentAudit) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -80,13 +82,14 @@ func newAgentAuditModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentAudit func (m *defaultAgentAuditModel) Insert(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) { data.DelState = globalkey.DelStateNo tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, data.Id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentAuditRowsExpectAutoSet) if session != nil { return session.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version) } return conn.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version) - }, tydataAgentAuditIdKey) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) } func (m *defaultAgentAuditModel) FindOne(ctx context.Context, id int64) (*AgentAudit, error) { @@ -106,33 +109,63 @@ func (m *defaultAgentAuditModel) FindOne(ctx context.Context, id int64) (*AgentA } } -func (m *defaultAgentAuditModel) Update(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) { +func (m *defaultAgentAuditModel) FindOneByUserId(ctx context.Context, userId int64) (*AgentAudit, error) { + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, userId) + var resp AgentAudit + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentAuditUserIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `user_id` = ? and del_state = ? limit 1", agentAuditRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, userId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) Update(ctx context.Context, session sqlx.Session, newData *AgentAudit) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, data.Id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, agentAuditRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version, data.Id) + return session.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) } - return conn.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version, data.Id) - }, tydataAgentAuditIdKey) + return conn.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) } -func (m *defaultAgentAuditModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentAudit) error { +func (m *defaultAgentAuditModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentAudit) error { - oldVersion := data.Version - data.Version += 1 + oldVersion := newData.Version + newData.Version += 1 var sqlResult sql.Result var err error + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, data.Id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, agentAuditRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + return session.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) } - return conn.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) - }, tydataAgentAuditIdKey) + return conn.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) if err != nil { return err } @@ -350,14 +383,20 @@ func (m *defaultAgentAuditModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } func (m *defaultAgentAuditModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, id) - _, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { query := fmt.Sprintf("delete from %s where `id` = ?", m.table) if session != nil { return session.ExecCtx(ctx, query, id) } return conn.ExecCtx(ctx, query, id) - }, tydataAgentAuditIdKey) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) return err } func (m *defaultAgentAuditModel) formatPrimary(primary interface{}) string { diff --git a/app/main/model/agentClosureModel_gen.go b/app/main/model/agentClosureModel_gen.go index 3923c6c..9dee1b7 100644 --- a/app/main/model/agentClosureModel_gen.go +++ b/app/main/model/agentClosureModel_gen.go @@ -205,7 +205,7 @@ func (m *defaultAgentClosureModel) DeleteSoft(ctx context.Context, session sqlx. data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentClosureModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentClosureModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentCommissionDeductionModel_gen.go b/app/main/model/agentCommissionDeductionModel_gen.go index b397110..c8b61cf 100644 --- a/app/main/model/agentCommissionDeductionModel_gen.go +++ b/app/main/model/agentCommissionDeductionModel_gen.go @@ -150,7 +150,7 @@ func (m *defaultAgentCommissionDeductionModel) DeleteSoft(ctx context.Context, s data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentCommissionDeductionModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentCommissionDeductionModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentCommissionModel_gen.go b/app/main/model/agentCommissionModel_gen.go index 2353856..4174075 100644 --- a/app/main/model/agentCommissionModel_gen.go +++ b/app/main/model/agentCommissionModel_gen.go @@ -149,7 +149,7 @@ func (m *defaultAgentCommissionModel) DeleteSoft(ctx context.Context, session sq data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentCommissionModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentCommissionModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentLinkModel_gen.go b/app/main/model/agentLinkModel_gen.go index 1e70f39..b307723 100644 --- a/app/main/model/agentLinkModel_gen.go +++ b/app/main/model/agentLinkModel_gen.go @@ -182,7 +182,7 @@ func (m *defaultAgentLinkModel) DeleteSoft(ctx context.Context, session sqlx.Ses data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentLinkModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentLinkModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentMembershipConfigModel_gen.go b/app/main/model/agentMembershipConfigModel_gen.go index 50ccab5..0513ca7 100644 --- a/app/main/model/agentMembershipConfigModel_gen.go +++ b/app/main/model/agentMembershipConfigModel_gen.go @@ -191,7 +191,7 @@ func (m *defaultAgentMembershipConfigModel) DeleteSoft(ctx context.Context, sess data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipConfigModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipConfigModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentMembershipUserConfigModel_gen.go b/app/main/model/agentMembershipUserConfigModel_gen.go index 540085c..434cc11 100644 --- a/app/main/model/agentMembershipUserConfigModel_gen.go +++ b/app/main/model/agentMembershipUserConfigModel_gen.go @@ -184,7 +184,7 @@ func (m *defaultAgentMembershipUserConfigModel) DeleteSoft(ctx context.Context, data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipUserConfigModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipUserConfigModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentModel_gen.go b/app/main/model/agentModel_gen.go index 01aae09..19e01b1 100644 --- a/app/main/model/agentModel_gen.go +++ b/app/main/model/agentModel_gen.go @@ -208,7 +208,7 @@ func (m *defaultAgentModel) DeleteSoft(ctx context.Context, session sqlx.Session data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentOrderModel_gen.go b/app/main/model/agentOrderModel_gen.go index 81a56d9..2569bf4 100644 --- a/app/main/model/agentOrderModel_gen.go +++ b/app/main/model/agentOrderModel_gen.go @@ -179,7 +179,7 @@ func (m *defaultAgentOrderModel) DeleteSoft(ctx context.Context, session sqlx.Se data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentOrderModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentOrderModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentPlatformDeductionModel_gen.go b/app/main/model/agentPlatformDeductionModel_gen.go index aa1f7d8..fb7a9fd 100644 --- a/app/main/model/agentPlatformDeductionModel_gen.go +++ b/app/main/model/agentPlatformDeductionModel_gen.go @@ -23,7 +23,7 @@ import ( var ( agentPlatformDeductionFieldNames = builder.RawFieldNames(&AgentPlatformDeduction{}) agentPlatformDeductionRows = strings.Join(agentPlatformDeductionFieldNames, ",") - agentPlatformDeductionRowsExpectAutoSet = strings.Join(stringx.Remove(agentPlatformDeductionFieldNames, "`create_time`", "`update_time`"), ",") + agentPlatformDeductionRowsExpectAutoSet = strings.Join(stringx.Remove(agentPlatformDeductionFieldNames, "`id`", "`create_time`", "`update_time`"), ",") agentPlatformDeductionRowsWithPlaceHolder = strings.Join(stringx.Remove(agentPlatformDeductionFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheTydataAgentPlatformDeductionIdPrefix = "cache:tydata:agentPlatformDeduction:id:" @@ -78,11 +78,11 @@ func (m *defaultAgentPlatformDeductionModel) Insert(ctx context.Context, session data.DelState = globalkey.DelStateNo tydataAgentPlatformDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, data.Id) return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentPlatformDeductionRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, agentPlatformDeductionRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) }, tydataAgentPlatformDeductionIdKey) } @@ -148,7 +148,7 @@ func (m *defaultAgentPlatformDeductionModel) DeleteSoft(ctx context.Context, ses data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentPlatformDeductionModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentPlatformDeductionModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentProductConfigModel_gen.go b/app/main/model/agentProductConfigModel_gen.go index 2193eec..e40d17d 100644 --- a/app/main/model/agentProductConfigModel_gen.go +++ b/app/main/model/agentProductConfigModel_gen.go @@ -183,7 +183,7 @@ func (m *defaultAgentProductConfigModel) DeleteSoft(ctx context.Context, session data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentProductConfigModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentProductConfigModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentRewardsModel_gen.go b/app/main/model/agentRewardsModel_gen.go index 1502f71..50f0893 100644 --- a/app/main/model/agentRewardsModel_gen.go +++ b/app/main/model/agentRewardsModel_gen.go @@ -23,7 +23,7 @@ import ( var ( agentRewardsFieldNames = builder.RawFieldNames(&AgentRewards{}) agentRewardsRows = strings.Join(agentRewardsFieldNames, ",") - agentRewardsRowsExpectAutoSet = strings.Join(stringx.Remove(agentRewardsFieldNames, "`create_time`", "`update_time`"), ",") + agentRewardsRowsExpectAutoSet = strings.Join(stringx.Remove(agentRewardsFieldNames, "`id`", "`create_time`", "`update_time`"), ",") agentRewardsRowsWithPlaceHolder = strings.Join(stringx.Remove(agentRewardsFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheTydataAgentRewardsIdPrefix = "cache:tydata:agentRewards:id:" @@ -78,11 +78,11 @@ func (m *defaultAgentRewardsModel) Insert(ctx context.Context, session sqlx.Sess data.DelState = globalkey.DelStateNo tydataAgentRewardsIdKey := fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, data.Id) return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentRewardsRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, agentRewardsRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version) }, tydataAgentRewardsIdKey) } @@ -148,7 +148,7 @@ func (m *defaultAgentRewardsModel) DeleteSoft(ctx context.Context, session sqlx. data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentRewardsModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentRewardsModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentWalletModel_gen.go b/app/main/model/agentWalletModel_gen.go index 8db881b..f0a2257 100644 --- a/app/main/model/agentWalletModel_gen.go +++ b/app/main/model/agentWalletModel_gen.go @@ -182,7 +182,7 @@ func (m *defaultAgentWalletModel) DeleteSoft(ctx context.Context, session sqlx.S data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentWalletModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentWalletModel delete err : %+v", err) } return nil } diff --git a/app/main/model/agentWithdrawalModel_gen.go b/app/main/model/agentWithdrawalModel_gen.go index b00a937..23566bb 100644 --- a/app/main/model/agentWithdrawalModel_gen.go +++ b/app/main/model/agentWithdrawalModel_gen.go @@ -23,7 +23,7 @@ import ( var ( agentWithdrawalFieldNames = builder.RawFieldNames(&AgentWithdrawal{}) agentWithdrawalRows = strings.Join(agentWithdrawalFieldNames, ",") - agentWithdrawalRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`create_time`", "`update_time`"), ",") + agentWithdrawalRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`id`", "`create_time`", "`update_time`"), ",") agentWithdrawalRowsWithPlaceHolder = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheTydataAgentWithdrawalIdPrefix = "cache:tydata:agentWithdrawal:id:" @@ -83,11 +83,11 @@ func (m *defaultAgentWithdrawalModel) Insert(ctx context.Context, session sqlx.S tydataAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, data.Id) tydataAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalWithdrawNoPrefix, data.WithdrawNo) return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWithdrawalRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWithdrawalRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.Amount, data.Status, data.PayeeAccount, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.AgentId, data.WithdrawNo, data.Amount, data.Status, data.PayeeAccount, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.Amount, data.Status, data.PayeeAccount, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.AgentId, data.WithdrawNo, data.Amount, data.Status, data.PayeeAccount, data.Remark, data.DeleteTime, data.DelState, data.Version) }, tydataAgentWithdrawalIdKey, tydataAgentWithdrawalWithdrawNoKey) } @@ -183,7 +183,7 @@ func (m *defaultAgentWithdrawalModel) DeleteSoft(ctx context.Context, session sq data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "AgentWithdrawalModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "AgentWithdrawalModel delete err : %+v", err) } return nil } diff --git a/app/main/model/featureModel_gen.go b/app/main/model/featureModel_gen.go index 9d88dc7..7428507 100644 --- a/app/main/model/featureModel_gen.go +++ b/app/main/model/featureModel_gen.go @@ -179,7 +179,7 @@ func (m *defaultFeatureModel) DeleteSoft(ctx context.Context, session sqlx.Sessi data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "FeatureModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "FeatureModel delete err : %+v", err) } return nil } diff --git a/app/main/model/globalNotificationsModel_gen.go b/app/main/model/globalNotificationsModel_gen.go index 20b4499..f69e348 100644 --- a/app/main/model/globalNotificationsModel_gen.go +++ b/app/main/model/globalNotificationsModel_gen.go @@ -62,10 +62,10 @@ type ( EndDate sql.NullTime `db:"end_date"` StartTime string `db:"start_time"` EndTime string `db:"end_time"` - CreatedAt time.Time `db:"created_at"` - UpdatedAt time.Time `db:"updated_at"` - Status string `db:"status"` - DelState int64 `db:"del_state"` // 删除状态 + CreateTime time.Time `db:"create_time"` + UpdateTime time.Time `db:"update_time"` + Status int64 `db:"status"` + DelState int64 `db:"del_state"` Version int64 `db:"version"` // 版本号 DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 } @@ -152,7 +152,7 @@ func (m *defaultGlobalNotificationsModel) DeleteSoft(ctx context.Context, sessio data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "GlobalNotificationsModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "GlobalNotificationsModel delete err : %+v", err) } return nil } diff --git a/app/main/model/orderModel_gen.go b/app/main/model/orderModel_gen.go index 8aca5bb..0f6b4b0 100644 --- a/app/main/model/orderModel_gen.go +++ b/app/main/model/orderModel_gen.go @@ -188,7 +188,7 @@ func (m *defaultOrderModel) DeleteSoft(ctx context.Context, session sqlx.Session data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "OrderModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "OrderModel delete err : %+v", err) } return nil } diff --git a/app/main/model/orderRefundModel.go b/app/main/model/orderRefundModel.go new file mode 100644 index 0000000..92c3174 --- /dev/null +++ b/app/main/model/orderRefundModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ OrderRefundModel = (*customOrderRefundModel)(nil) + +type ( + // OrderRefundModel is an interface to be customized, add more methods here, + // and implement the added methods in customOrderRefundModel. + OrderRefundModel interface { + orderRefundModel + } + + customOrderRefundModel struct { + *defaultOrderRefundModel + } +) + +// NewOrderRefundModel returns a model for the database table. +func NewOrderRefundModel(conn sqlx.SqlConn, c cache.CacheConf) OrderRefundModel { + return &customOrderRefundModel{ + defaultOrderRefundModel: newOrderRefundModel(conn, c), + } +} diff --git a/app/main/model/orderRefundModel_gen.go b/app/main/model/orderRefundModel_gen.go new file mode 100644 index 0000000..9f3a837 --- /dev/null +++ b/app/main/model/orderRefundModel_gen.go @@ -0,0 +1,467 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + orderRefundFieldNames = builder.RawFieldNames(&OrderRefund{}) + orderRefundRows = strings.Join(orderRefundFieldNames, ",") + orderRefundRowsExpectAutoSet = strings.Join(stringx.Remove(orderRefundFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + orderRefundRowsWithPlaceHolder = strings.Join(stringx.Remove(orderRefundFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataOrderRefundIdPrefix = "cache:tydata:orderRefund:id:" + cacheTydataOrderRefundOrderIdPrefix = "cache:tydata:orderRefund:orderId:" + cacheTydataOrderRefundPlatformRefundIdPrefix = "cache:tydata:orderRefund:platformRefundId:" + cacheTydataOrderRefundRefundNoPrefix = "cache:tydata:orderRefund:refundNo:" +) + +type ( + orderRefundModel interface { + Insert(ctx context.Context, session sqlx.Session, data *OrderRefund) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*OrderRefund, error) + FindOneByOrderId(ctx context.Context, orderId int64) (*OrderRefund, error) + FindOneByPlatformRefundId(ctx context.Context, platformRefundId sql.NullString) (*OrderRefund, error) + FindOneByRefundNo(ctx context.Context, refundNo string) (*OrderRefund, error) + Update(ctx context.Context, session sqlx.Session, data *OrderRefund) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *OrderRefund) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *OrderRefund) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*OrderRefund, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*OrderRefund, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*OrderRefund, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*OrderRefund, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*OrderRefund, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultOrderRefundModel struct { + sqlc.CachedConn + table string + } + + OrderRefund struct { + Id int64 `db:"id"` // 主键ID + RefundNo string `db:"refund_no"` // 退款单号 + OrderId int64 `db:"order_id"` // 关联的订单ID + UserId int64 `db:"user_id"` // 用户ID + ProductId int64 `db:"product_id"` // 产品ID + PlatformRefundId sql.NullString `db:"platform_refund_id"` // 支付平台退款单号 + RefundAmount float64 `db:"refund_amount"` // 退款金额 + RefundReason sql.NullString `db:"refund_reason"` // 退款原因 + Status string `db:"status"` // 退款状态 + DelState int64 `db:"del_state"` // 删除状态 + Version int64 `db:"version"` // 版本号 + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + RefundTime sql.NullTime `db:"refund_time"` // 退款成功时间 + CloseTime sql.NullTime `db:"close_time"` // 退款关闭时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + } +) + +func newOrderRefundModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultOrderRefundModel { + return &defaultOrderRefundModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`order_refund`", + } +} + +func (m *defaultOrderRefundModel) Insert(ctx context.Context, session sqlx.Session, data *OrderRefund) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataOrderRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundIdPrefix, data.Id) + tydataOrderRefundOrderIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundOrderIdPrefix, data.OrderId) + tydataOrderRefundPlatformRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundPlatformRefundIdPrefix, data.PlatformRefundId) + tydataOrderRefundRefundNoKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundRefundNoPrefix, data.RefundNo) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, orderRefundRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.RefundNo, data.OrderId, data.UserId, data.ProductId, data.PlatformRefundId, data.RefundAmount, data.RefundReason, data.Status, data.DelState, data.Version, data.RefundTime, data.CloseTime, data.DeleteTime) + } + return conn.ExecCtx(ctx, query, data.RefundNo, data.OrderId, data.UserId, data.ProductId, data.PlatformRefundId, data.RefundAmount, data.RefundReason, data.Status, data.DelState, data.Version, data.RefundTime, data.CloseTime, data.DeleteTime) + }, tydataOrderRefundIdKey, tydataOrderRefundOrderIdKey, tydataOrderRefundPlatformRefundIdKey, tydataOrderRefundRefundNoKey) +} + +func (m *defaultOrderRefundModel) FindOne(ctx context.Context, id int64) (*OrderRefund, error) { + tydataOrderRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundIdPrefix, id) + var resp OrderRefund + err := m.QueryRowCtx(ctx, &resp, tydataOrderRefundIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", orderRefundRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) FindOneByOrderId(ctx context.Context, orderId int64) (*OrderRefund, error) { + tydataOrderRefundOrderIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundOrderIdPrefix, orderId) + var resp OrderRefund + err := m.QueryRowIndexCtx(ctx, &resp, tydataOrderRefundOrderIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `order_id` = ? and del_state = ? limit 1", orderRefundRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, orderId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) FindOneByPlatformRefundId(ctx context.Context, platformRefundId sql.NullString) (*OrderRefund, error) { + tydataOrderRefundPlatformRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundPlatformRefundIdPrefix, platformRefundId) + var resp OrderRefund + err := m.QueryRowIndexCtx(ctx, &resp, tydataOrderRefundPlatformRefundIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `platform_refund_id` = ? and del_state = ? limit 1", orderRefundRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, platformRefundId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) FindOneByRefundNo(ctx context.Context, refundNo string) (*OrderRefund, error) { + tydataOrderRefundRefundNoKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundRefundNoPrefix, refundNo) + var resp OrderRefund + err := m.QueryRowIndexCtx(ctx, &resp, tydataOrderRefundRefundNoKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `refund_no` = ? and del_state = ? limit 1", orderRefundRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, refundNo, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) Update(ctx context.Context, session sqlx.Session, newData *OrderRefund) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataOrderRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundIdPrefix, data.Id) + tydataOrderRefundOrderIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundOrderIdPrefix, data.OrderId) + tydataOrderRefundPlatformRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundPlatformRefundIdPrefix, data.PlatformRefundId) + tydataOrderRefundRefundNoKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundRefundNoPrefix, data.RefundNo) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, orderRefundRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.RefundNo, newData.OrderId, newData.UserId, newData.ProductId, newData.PlatformRefundId, newData.RefundAmount, newData.RefundReason, newData.Status, newData.DelState, newData.Version, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.RefundNo, newData.OrderId, newData.UserId, newData.ProductId, newData.PlatformRefundId, newData.RefundAmount, newData.RefundReason, newData.Status, newData.DelState, newData.Version, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id) + }, tydataOrderRefundIdKey, tydataOrderRefundOrderIdKey, tydataOrderRefundPlatformRefundIdKey, tydataOrderRefundRefundNoKey) +} + +func (m *defaultOrderRefundModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *OrderRefund) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataOrderRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundIdPrefix, data.Id) + tydataOrderRefundOrderIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundOrderIdPrefix, data.OrderId) + tydataOrderRefundPlatformRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundPlatformRefundIdPrefix, data.PlatformRefundId) + tydataOrderRefundRefundNoKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundRefundNoPrefix, data.RefundNo) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, orderRefundRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.RefundNo, newData.OrderId, newData.UserId, newData.ProductId, newData.PlatformRefundId, newData.RefundAmount, newData.RefundReason, newData.Status, newData.DelState, newData.Version, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.RefundNo, newData.OrderId, newData.UserId, newData.ProductId, newData.PlatformRefundId, newData.RefundAmount, newData.RefundReason, newData.Status, newData.DelState, newData.Version, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id, oldVersion) + }, tydataOrderRefundIdKey, tydataOrderRefundOrderIdKey, tydataOrderRefundPlatformRefundIdKey, tydataOrderRefundRefundNoKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultOrderRefundModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *OrderRefund) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "OrderRefundModel delete err : %+v", err) + } + return nil +} + +func (m *defaultOrderRefundModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultOrderRefundModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultOrderRefundModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*OrderRefund, error) { + + builder = builder.Columns(orderRefundRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*OrderRefund + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*OrderRefund, error) { + + builder = builder.Columns(orderRefundRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*OrderRefund + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*OrderRefund, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(orderRefundRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*OrderRefund + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultOrderRefundModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*OrderRefund, error) { + + builder = builder.Columns(orderRefundRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*OrderRefund + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*OrderRefund, error) { + + builder = builder.Columns(orderRefundRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*OrderRefund + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultOrderRefundModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultOrderRefundModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultOrderRefundModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataOrderRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundIdPrefix, id) + tydataOrderRefundOrderIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundOrderIdPrefix, data.OrderId) + tydataOrderRefundPlatformRefundIdKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundPlatformRefundIdPrefix, data.PlatformRefundId) + tydataOrderRefundRefundNoKey := fmt.Sprintf("%s%v", cacheTydataOrderRefundRefundNoPrefix, data.RefundNo) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataOrderRefundIdKey, tydataOrderRefundOrderIdKey, tydataOrderRefundPlatformRefundIdKey, tydataOrderRefundRefundNoKey) + return err +} +func (m *defaultOrderRefundModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataOrderRefundIdPrefix, primary) +} +func (m *defaultOrderRefundModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", orderRefundRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultOrderRefundModel) tableName() string { + return m.table +} diff --git a/app/main/model/productFeatureModel_gen.go b/app/main/model/productFeatureModel_gen.go index c1ac4c2..9a2bd1e 100644 --- a/app/main/model/productFeatureModel_gen.go +++ b/app/main/model/productFeatureModel_gen.go @@ -182,7 +182,7 @@ func (m *defaultProductFeatureModel) DeleteSoft(ctx context.Context, session sql data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "ProductFeatureModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "ProductFeatureModel delete err : %+v", err) } return nil } diff --git a/app/main/model/productModel_gen.go b/app/main/model/productModel_gen.go index c0d176a..492e0e7 100644 --- a/app/main/model/productModel_gen.go +++ b/app/main/model/productModel_gen.go @@ -183,7 +183,7 @@ func (m *defaultProductModel) DeleteSoft(ctx context.Context, session sqlx.Sessi data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "ProductModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "ProductModel delete err : %+v", err) } return nil } diff --git a/app/main/model/queryCleanupConfigModel.go b/app/main/model/queryCleanupConfigModel.go new file mode 100644 index 0000000..1c69371 --- /dev/null +++ b/app/main/model/queryCleanupConfigModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ QueryCleanupConfigModel = (*customQueryCleanupConfigModel)(nil) + +type ( + // QueryCleanupConfigModel is an interface to be customized, add more methods here, + // and implement the added methods in customQueryCleanupConfigModel. + QueryCleanupConfigModel interface { + queryCleanupConfigModel + } + + customQueryCleanupConfigModel struct { + *defaultQueryCleanupConfigModel + } +) + +// NewQueryCleanupConfigModel returns a model for the database table. +func NewQueryCleanupConfigModel(conn sqlx.SqlConn, c cache.CacheConf) QueryCleanupConfigModel { + return &customQueryCleanupConfigModel{ + defaultQueryCleanupConfigModel: newQueryCleanupConfigModel(conn, c), + } +} diff --git a/app/main/model/queryCleanupConfigModel_gen.go b/app/main/model/queryCleanupConfigModel_gen.go new file mode 100644 index 0000000..071bad4 --- /dev/null +++ b/app/main/model/queryCleanupConfigModel_gen.go @@ -0,0 +1,409 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + queryCleanupConfigFieldNames = builder.RawFieldNames(&QueryCleanupConfig{}) + queryCleanupConfigRows = strings.Join(queryCleanupConfigFieldNames, ",") + queryCleanupConfigRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryCleanupConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(queryCleanupConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataQueryCleanupConfigIdPrefix = "cache:tydata:queryCleanupConfig:id:" + cacheTydataQueryCleanupConfigConfigKeyPrefix = "cache:tydata:queryCleanupConfig:configKey:" +) + +type ( + queryCleanupConfigModel interface { + Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*QueryCleanupConfig, error) + FindOneByConfigKey(ctx context.Context, configKey string) (*QueryCleanupConfig, error) + Update(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*QueryCleanupConfig, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupConfig, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupConfig, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*QueryCleanupConfig, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*QueryCleanupConfig, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultQueryCleanupConfigModel struct { + sqlc.CachedConn + table string + } + + QueryCleanupConfig struct { + Id int64 `db:"id"` // 主键ID + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` // 删除状态:0-未删除,1-已删除 + Version int64 `db:"version"` // 版本号 + ConfigKey string `db:"config_key"` // 配置键 + ConfigValue string `db:"config_value"` // 配置值 + ConfigDesc string `db:"config_desc"` // 配置说明 + Status int64 `db:"status"` // 状态:1-启用,2-禁用 + } +) + +func newQueryCleanupConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQueryCleanupConfigModel { + return &defaultQueryCleanupConfigModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`query_cleanup_config`", + } +} + +func (m *defaultQueryCleanupConfigModel) Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + tydataQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, queryCleanupConfigRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ConfigKey, data.ConfigValue, data.ConfigDesc, data.Status) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ConfigKey, data.ConfigValue, data.ConfigDesc, data.Status) + }, tydataQueryCleanupConfigConfigKeyKey, tydataQueryCleanupConfigIdKey) +} + +func (m *defaultQueryCleanupConfigModel) FindOne(ctx context.Context, id int64) (*QueryCleanupConfig, error) { + tydataQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigIdPrefix, id) + var resp QueryCleanupConfig + err := m.QueryRowCtx(ctx, &resp, tydataQueryCleanupConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryCleanupConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindOneByConfigKey(ctx context.Context, configKey string) (*QueryCleanupConfig, error) { + tydataQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigConfigKeyPrefix, configKey) + var resp QueryCleanupConfig + err := m.QueryRowIndexCtx(ctx, &resp, tydataQueryCleanupConfigConfigKeyKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `config_key` = ? and del_state = ? limit 1", queryCleanupConfigRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, configKey, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultQueryCleanupConfigModel) Update(ctx context.Context, session sqlx.Session, newData *QueryCleanupConfig) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + tydataQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, queryCleanupConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ConfigKey, newData.ConfigValue, newData.ConfigDesc, newData.Status, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ConfigKey, newData.ConfigValue, newData.ConfigDesc, newData.Status, newData.Id) + }, tydataQueryCleanupConfigConfigKeyKey, tydataQueryCleanupConfigIdKey) +} + +func (m *defaultQueryCleanupConfigModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *QueryCleanupConfig) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + tydataQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, queryCleanupConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ConfigKey, newData.ConfigValue, newData.ConfigDesc, newData.Status, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ConfigKey, newData.ConfigValue, newData.ConfigDesc, newData.Status, newData.Id, oldVersion) + }, tydataQueryCleanupConfigConfigKeyKey, tydataQueryCleanupConfigIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultQueryCleanupConfigModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "QueryCleanupConfigModel delete err : %+v", err) + } + return nil +} + +func (m *defaultQueryCleanupConfigModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*QueryCleanupConfig, error) { + + builder = builder.Columns(queryCleanupConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupConfig, error) { + + builder = builder.Columns(queryCleanupConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupConfig, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(queryCleanupConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*QueryCleanupConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*QueryCleanupConfig, error) { + + builder = builder.Columns(queryCleanupConfigRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupConfigModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*QueryCleanupConfig, error) { + + builder = builder.Columns(queryCleanupConfigRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupConfigModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultQueryCleanupConfigModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultQueryCleanupConfigModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + tydataQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigIdPrefix, id) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataQueryCleanupConfigConfigKeyKey, tydataQueryCleanupConfigIdKey) + return err +} +func (m *defaultQueryCleanupConfigModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataQueryCleanupConfigIdPrefix, primary) +} +func (m *defaultQueryCleanupConfigModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryCleanupConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultQueryCleanupConfigModel) tableName() string { + return m.table +} diff --git a/app/main/model/queryCleanupDetailModel.go b/app/main/model/queryCleanupDetailModel.go new file mode 100644 index 0000000..52de046 --- /dev/null +++ b/app/main/model/queryCleanupDetailModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ QueryCleanupDetailModel = (*customQueryCleanupDetailModel)(nil) + +type ( + // QueryCleanupDetailModel is an interface to be customized, add more methods here, + // and implement the added methods in customQueryCleanupDetailModel. + QueryCleanupDetailModel interface { + queryCleanupDetailModel + } + + customQueryCleanupDetailModel struct { + *defaultQueryCleanupDetailModel + } +) + +// NewQueryCleanupDetailModel returns a model for the database table. +func NewQueryCleanupDetailModel(conn sqlx.SqlConn, c cache.CacheConf) QueryCleanupDetailModel { + return &customQueryCleanupDetailModel{ + defaultQueryCleanupDetailModel: newQueryCleanupDetailModel(conn, c), + } +} diff --git a/app/main/model/queryCleanupDetailModel_gen.go b/app/main/model/queryCleanupDetailModel_gen.go new file mode 100644 index 0000000..9ec3f2b --- /dev/null +++ b/app/main/model/queryCleanupDetailModel_gen.go @@ -0,0 +1,373 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + queryCleanupDetailFieldNames = builder.RawFieldNames(&QueryCleanupDetail{}) + queryCleanupDetailRows = strings.Join(queryCleanupDetailFieldNames, ",") + queryCleanupDetailRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupDetailFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryCleanupDetailRowsWithPlaceHolder = strings.Join(stringx.Remove(queryCleanupDetailFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataQueryCleanupDetailIdPrefix = "cache:tydata:queryCleanupDetail:id:" +) + +type ( + queryCleanupDetailModel interface { + Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*QueryCleanupDetail, error) + Update(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*QueryCleanupDetail, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupDetail, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupDetail, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*QueryCleanupDetail, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*QueryCleanupDetail, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultQueryCleanupDetailModel struct { + sqlc.CachedConn + table string + } + + QueryCleanupDetail struct { + Id int64 `db:"id"` // 主键ID + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` // 删除状态:0-未删除,1-已删除 + Version int64 `db:"version"` // 版本号 + CleanupLogId int64 `db:"cleanup_log_id"` // 关联的清理日志ID + QueryId int64 `db:"query_id"` // 被清理的查询记录ID + OrderId int64 `db:"order_id"` // 关联的订单ID + UserId int64 `db:"user_id"` // 关联的用户ID + ProductId int64 `db:"product_id"` // 关联的产品ID + QueryState string `db:"query_state"` // 查询状态 + CreateTimeOld time.Time `db:"create_time_old"` // 原记录创建时间 + } +) + +func newQueryCleanupDetailModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQueryCleanupDetailModel { + return &defaultQueryCleanupDetailModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`query_cleanup_detail`", + } +} + +func (m *defaultQueryCleanupDetailModel) Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupDetailIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, queryCleanupDetailRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld) + }, tydataQueryCleanupDetailIdKey) +} + +func (m *defaultQueryCleanupDetailModel) FindOne(ctx context.Context, id int64) (*QueryCleanupDetail, error) { + tydataQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupDetailIdPrefix, id) + var resp QueryCleanupDetail + err := m.QueryRowCtx(ctx, &resp, tydataQueryCleanupDetailIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryCleanupDetailRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultQueryCleanupDetailModel) Update(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) (sql.Result, error) { + tydataQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupDetailIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, queryCleanupDetailRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld, data.Id) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld, data.Id) + }, tydataQueryCleanupDetailIdKey) +} + +func (m *defaultQueryCleanupDetailModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupDetailIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, queryCleanupDetailRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld, data.Id, oldVersion) + }, tydataQueryCleanupDetailIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultQueryCleanupDetailModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "QueryCleanupDetailModel delete err : %+v", err) + } + return nil +} + +func (m *defaultQueryCleanupDetailModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultQueryCleanupDetailModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultQueryCleanupDetailModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*QueryCleanupDetail, error) { + + builder = builder.Columns(queryCleanupDetailRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupDetail + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupDetailModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupDetail, error) { + + builder = builder.Columns(queryCleanupDetailRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupDetail + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupDetailModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupDetail, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(queryCleanupDetailRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*QueryCleanupDetail + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultQueryCleanupDetailModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*QueryCleanupDetail, error) { + + builder = builder.Columns(queryCleanupDetailRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupDetail + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupDetailModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*QueryCleanupDetail, error) { + + builder = builder.Columns(queryCleanupDetailRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupDetail + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupDetailModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultQueryCleanupDetailModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultQueryCleanupDetailModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupDetailIdPrefix, id) + _, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataQueryCleanupDetailIdKey) + return err +} +func (m *defaultQueryCleanupDetailModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataQueryCleanupDetailIdPrefix, primary) +} +func (m *defaultQueryCleanupDetailModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryCleanupDetailRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultQueryCleanupDetailModel) tableName() string { + return m.table +} diff --git a/app/main/model/queryCleanupLogModel.go b/app/main/model/queryCleanupLogModel.go new file mode 100644 index 0000000..b64cb69 --- /dev/null +++ b/app/main/model/queryCleanupLogModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ QueryCleanupLogModel = (*customQueryCleanupLogModel)(nil) + +type ( + // QueryCleanupLogModel is an interface to be customized, add more methods here, + // and implement the added methods in customQueryCleanupLogModel. + QueryCleanupLogModel interface { + queryCleanupLogModel + } + + customQueryCleanupLogModel struct { + *defaultQueryCleanupLogModel + } +) + +// NewQueryCleanupLogModel returns a model for the database table. +func NewQueryCleanupLogModel(conn sqlx.SqlConn, c cache.CacheConf) QueryCleanupLogModel { + return &customQueryCleanupLogModel{ + defaultQueryCleanupLogModel: newQueryCleanupLogModel(conn, c), + } +} diff --git a/app/main/model/queryCleanupLogModel_gen.go b/app/main/model/queryCleanupLogModel_gen.go new file mode 100644 index 0000000..45b30d7 --- /dev/null +++ b/app/main/model/queryCleanupLogModel_gen.go @@ -0,0 +1,372 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + queryCleanupLogFieldNames = builder.RawFieldNames(&QueryCleanupLog{}) + queryCleanupLogRows = strings.Join(queryCleanupLogFieldNames, ",") + queryCleanupLogRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupLogFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryCleanupLogRowsWithPlaceHolder = strings.Join(stringx.Remove(queryCleanupLogFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataQueryCleanupLogIdPrefix = "cache:tydata:queryCleanupLog:id:" +) + +type ( + queryCleanupLogModel interface { + Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*QueryCleanupLog, error) + Update(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*QueryCleanupLog, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupLog, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupLog, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*QueryCleanupLog, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*QueryCleanupLog, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultQueryCleanupLogModel struct { + sqlc.CachedConn + table string + } + + QueryCleanupLog struct { + Id int64 `db:"id"` // 主键ID + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` // 删除状态:0-未删除,1-已删除 + Version int64 `db:"version"` // 版本号 + CleanupTime time.Time `db:"cleanup_time"` // 清理执行时间 + CleanupBefore time.Time `db:"cleanup_before"` // 清理截止时间 + AffectedRows int64 `db:"affected_rows"` // 影响行数 + Status int64 `db:"status"` // 状态:1-成功,2-失败 + ErrorMsg sql.NullString `db:"error_msg"` // 错误信息 + Remark sql.NullString `db:"remark"` // 备注说明 + } +) + +func newQueryCleanupLogModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQueryCleanupLogModel { + return &defaultQueryCleanupLogModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`query_cleanup_log`", + } +} + +func (m *defaultQueryCleanupLogModel) Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupLogIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, queryCleanupLogRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark) + }, tydataQueryCleanupLogIdKey) +} + +func (m *defaultQueryCleanupLogModel) FindOne(ctx context.Context, id int64) (*QueryCleanupLog, error) { + tydataQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupLogIdPrefix, id) + var resp QueryCleanupLog + err := m.QueryRowCtx(ctx, &resp, tydataQueryCleanupLogIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryCleanupLogRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultQueryCleanupLogModel) Update(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) (sql.Result, error) { + tydataQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupLogIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, queryCleanupLogRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark, data.Id) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark, data.Id) + }, tydataQueryCleanupLogIdKey) +} + +func (m *defaultQueryCleanupLogModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupLogIdPrefix, data.Id) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, queryCleanupLogRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark, data.Id, oldVersion) + }, tydataQueryCleanupLogIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultQueryCleanupLogModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "QueryCleanupLogModel delete err : %+v", err) + } + return nil +} + +func (m *defaultQueryCleanupLogModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultQueryCleanupLogModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultQueryCleanupLogModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*QueryCleanupLog, error) { + + builder = builder.Columns(queryCleanupLogRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupLog + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupLogModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupLog, error) { + + builder = builder.Columns(queryCleanupLogRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupLog + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupLogModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*QueryCleanupLog, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(queryCleanupLogRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*QueryCleanupLog + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultQueryCleanupLogModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*QueryCleanupLog, error) { + + builder = builder.Columns(queryCleanupLogRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupLog + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupLogModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*QueryCleanupLog, error) { + + builder = builder.Columns(queryCleanupLogRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*QueryCleanupLog + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultQueryCleanupLogModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultQueryCleanupLogModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultQueryCleanupLogModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheTydataQueryCleanupLogIdPrefix, id) + _, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataQueryCleanupLogIdKey) + return err +} +func (m *defaultQueryCleanupLogModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataQueryCleanupLogIdPrefix, primary) +} +func (m *defaultQueryCleanupLogModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryCleanupLogRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultQueryCleanupLogModel) tableName() string { + return m.table +} diff --git a/app/main/model/queryModel_gen.go b/app/main/model/queryModel_gen.go index 12fb5ab..6ac8984 100644 --- a/app/main/model/queryModel_gen.go +++ b/app/main/model/queryModel_gen.go @@ -183,7 +183,7 @@ func (m *defaultQueryModel) DeleteSoft(ctx context.Context, session sqlx.Session data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "QueryModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "QueryModel delete err : %+v", err) } return nil } diff --git a/app/main/model/userAuthModel_gen.go b/app/main/model/userAuthModel_gen.go index 012a9a5..8d7c9fc 100644 --- a/app/main/model/userAuthModel_gen.go +++ b/app/main/model/userAuthModel_gen.go @@ -205,7 +205,7 @@ func (m *defaultUserAuthModel) DeleteSoft(ctx context.Context, session sqlx.Sess data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "UserAuthModel delete err : %v", err) + return errors.Wrapf(errors.New("delete soft failed "), "UserAuthModel delete err : %+v", err) } return nil } diff --git a/app/main/model/vars.go b/app/main/model/vars.go index cb455aa..2edc208 100644 --- a/app/main/model/vars.go +++ b/app/main/model/vars.go @@ -33,18 +33,25 @@ var AgentLeveNameVIP string = "VIP" var AgentLeveNameSVIP string = "SVIP" const ( - OrderStatusPending = "pending" - OrderStatusPaid = "paid" - OrderStatusFailed = "failed" - OrderStatusRefunded = "refunded" - OrderStatusClosed = "closed" + OrderStatusPending = "pending" + OrderStatusPaid = "paid" + OrderStatusFailed = "failed" + OrderStatusRefunding = "refunding" + OrderStatusRefunded = "refunded" + OrderStatusClosed = "closed" +) +const ( + OrderRefundStatusPending = "pending" + OrderRefundStatusSuccess = "success" + OrderRefundStatusFailed = "failed" + OrderRefundStatusClosed = "closed" ) - const ( QueryStatePending = "pending" QueryStateFailed = "failed" QueryStateSuccess = "success" QueryStateProcessing = "processing" + QueryStateCleaned = "cleaned" ) const ( diff --git a/app/user/cmd/api/.air.toml b/app/user/cmd/api/.air.toml deleted file mode 100644 index a062f6e..0000000 --- a/app/user/cmd/api/.air.toml +++ /dev/null @@ -1,21 +0,0 @@ -# 用户api服务的air配置 -root = "." -tmp_dir = "tmp" - -[build] -cmd = "go build -o ./tmp/user-api ." -bin = "./tmp/user-api -f etc/user.yaml" -include_ext = ["go", "yaml"] -exclude_dir = ["tmp", "vendor"] -include_dir = ["internal", "etc"] -exclude_regex = ["_test\\.go"] -delay = 1000 - -[log] -time = true - -[color] -main = "red" -watcher = "cyan" -build = "yellow" -runner = "green" \ No newline at end of file diff --git a/app/user/cmd/api/Dockerfile b/app/user/cmd/api/Dockerfile deleted file mode 100644 index 5cf7de0..0000000 --- a/app/user/cmd/api/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM golang:1.22.4-alpine AS builder - -LABEL stage=gobuilder - -ENV CGO_ENABLED 0 -ENV GOPROXY https://goproxy.cn,direct -RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories - -RUN apk update --no-cache && apk add --no-cache tzdata - -WORKDIR /build - -ADD go.mod . -ADD go.sum . -RUN go mod download -COPY . . -COPY app/user/cmd/api/etc /app/etc -RUN go build -ldflags="-s -w" -o /app/user app/user/cmd/api/main.go - - -FROM scratch - -COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt -COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai -ENV TZ Asia/Shanghai - -WORKDIR /app -COPY --from=builder /app/user /app/user -COPY --from=builder /app/etc /app/etc - -CMD ["./user", "-f", "etc/main.yaml"] diff --git a/app/user/cmd/api/desc/agent.api b/app/user/cmd/api/desc/agent.api deleted file mode 100644 index 3ec20f9..0000000 --- a/app/user/cmd/api/desc/agent.api +++ /dev/null @@ -1,362 +0,0 @@ -syntax = "v1" - -info ( - title: "代理服务" - desc: "代理服务接口" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -// 代理服务基本类型定义 -type AgentProductConfig { - ProductID int64 `json:"product_id"` - CostPrice float64 `json:"cost_price"` - PriceRangeMin float64 `json:"price_range_min"` - PriceRangeMax float64 `json:"price_range_max"` - PPricingStandard float64 `json:"p_pricing_standard"` - POverpricingRatio float64 `json:"p_overpricing_ratio"` - APricingStandard float64 `json:"a_pricing_standard"` - APricingEnd float64 `json:"a_pricing_end"` - AOverpricingRatio float64 `json:"a_overpricing_ratio"` -} - -type AgentMembershipUserConfig { - ProductID int64 `json:"product_id"` - PriceIncreaseAmount float64 `json:"price_increase_amount"` - PriceRangeFrom float64 `json:"price_range_from"` - PriceRangeTo float64 `json:"price_range_to"` - PriceRatio float64 `json:"price_ratio"` -} - -type ProductConfig { - ProductID int64 `json:"product_id"` - CostPrice float64 `json:"cost_price"` - PriceRangeMin float64 `json:"price_range_min"` - PriceRangeMax float64 `json:"price_range_max"` -} - -@server ( - prefix: api/v1/agent - group: agent - jwt: JwtAuth -) -service main { - // 查看代理信息 - @handler GetAgentInfo - get /info returns (AgentInfoResp) - - // 查询代理申请状态 - @handler GetAgentAuditStatus - get /audit/status returns (AgentAuditStatusResp) - - // 生成推广标识 - @handler GeneratingLink - post /generating_link (AgentGeneratingLinkReq) returns (AgentGeneratingLinkResp) - - // 获取推广定价配置 - @handler GetAgentProductConfig - get /product_config returns (AgentProductConfigResp) - - // 获取下级分页列表 - @handler GetAgentSubordinateList - get /subordinate/list (GetAgentSubordinateListReq) returns (GetAgentSubordinateListResp) - - // 下级贡献详情 - @handler GetAgentSubordinateContributionDetail - get /subordinate/contribution/detail (GetAgentSubordinateContributionDetailReq) returns (GetAgentSubordinateContributionDetailResp) - - @handler AgentRealName - post /real_name (AgentRealNameReq) returns (AgentRealNameResp) -} - -type ( - AgentInfoResp { - status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过,3=未申请 - isAgent bool `json:"is_agent"` - agentID int64 `json:"agent_id"` - level string `json:"level"` - region string `json:"region"` - mobile string `json:"mobile"` - expiryTime string `json:"expiry_time"` - isRealName bool `json:"is_real_name"` - } - // 查询代理申请状态响应 - AgentAuditStatusResp { - Status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过 - AuditReason string `json:"audit_reason"` - } - AgentGeneratingLinkReq { - Product string `json:"product"` - Price string `json:"price"` - } - AgentGeneratingLinkResp { - LinkIdentifier string `json:"link_identifier"` - } - AgentProductConfigResp { - AgentProductConfig []AgentProductConfig - } - GetAgentSubordinateListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - } - GetAgentSubordinateListResp { - Total int64 `json:"total"` // 总记录数 - List []AgentSubordinateList `json:"list"` // 查询列表 - } - AgentSubordinateList { - ID int64 `json:"id"` - Mobile string `json:"mobile"` - CreateTime string `json:"create_time"` - LevelName string `json:"level_name"` - TotalOrders int64 `json:"total_orders"` // 总单量 - TotalEarnings float64 `json:"total_earnings"` // 总金额 - TotalContribution float64 `json:"total_contribution"` // 总贡献 - } - GetAgentSubordinateContributionDetailReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - SubordinateID int64 `form:"subordinate_id"` // 下级ID - } - GetAgentSubordinateContributionDetailResp { - Mobile string `json:"mobile"` - Total int64 `json:"total"` // 总记录数 - CreateTime string `json:"create_time"` - TotalEarnings float64 `json:"total_earnings"` // 总金额 - TotalContribution float64 `json:"total_contribution"` // 总贡献 - TotalOrders int64 `json:"total_orders"` // 总单量 - LevelName string `json:"level_name"` // 等级名称 - List []AgentSubordinateContributionDetail `json:"list"` // 查询列表 - Stats AgentSubordinateContributionStats `json:"stats"` // 统计数据 - } - AgentSubordinateContributionDetail { - ID int64 `json:"id"` - CreateTime string `json:"create_time"` - Amount float64 `json:"amount"` - Type string `json:"type"` - } - AgentSubordinateContributionStats { - CostCount int64 `json:"cost_count"` // 成本扣除次数 - CostAmount float64 `json:"cost_amount"` // 成本扣除总额 - PricingCount int64 `json:"pricing_count"` // 定价扣除次数 - PricingAmount float64 `json:"pricing_amount"` // 定价扣除总额 - DescendantPromotionCount int64 `json:"descendant_promotion_count"` // 下级推广次数 - DescendantPromotionAmount float64 `json:"descendant_promotion_amount"` // 下级推广总额 - DescendantUpgradeVipCount int64 `json:"descendant_upgrade_vip_count"` // 下级升级VIP次数 - DescendantUpgradeVipAmount float64 `json:"descendant_upgrade_vip_amount"` // 下级升级VIP总额 - DescendantUpgradeSvipCount int64 `json:"descendant_upgrade_svip_count"` // 下级升级SVIP次数 - DescendantUpgradeSvipAmount float64 `json:"descendant_upgrade_svip_amount"` // 下级升级SVIP总额 - DescendantStayActiveCount int64 `json:"descendant_stay_active_count"` // 下级保持活跃次数 - DescendantStayActiveAmount float64 `json:"descendant_stay_active_amount"` // 下级保持活跃总额 - DescendantNewActiveCount int64 `json:"descendant_new_active_count"` // 下级新增活跃次数 - DescendantNewActiveAmount float64 `json:"descendant_new_active_amount"` // 下级新增活跃总额 - DescendantWithdrawCount int64 `json:"descendant_withdraw_count"` // 下级提现次数 - DescendantWithdrawAmount float64 `json:"descendant_withdraw_amount"` // 下级提现总额 - } - - AgentRealNameReq { - Name string `json:"name"` - IDCard string `json:"id_card"` - Mobile string `json:"mobile"` - Code string `json:"code"` - } - AgentRealNameResp { - Status string `json:"status"` - } -) - -@server ( - prefix: api/v1/agent - group: agent - jwt: JwtAuth -) -service main { - @handler GetAgentMembershipProductConfig - get /membership/user_config (AgentMembershipProductConfigReq) returns (AgentMembershipProductConfigResp) - - @handler SaveAgentMembershipUserConfig - post /membership/save_user_config (SaveAgentMembershipUserConfigReq) -} - -type ( - // 获取会员当前配置 - AgentMembershipProductConfigReq { - ProductID int64 `form:"product_id"` - } - // 获取会员当前配置 - AgentMembershipProductConfigResp { - AgentMembershipUserConfig AgentMembershipUserConfig `json:"agent_membership_user_config"` - ProductConfig ProductConfig `json:"product_config"` - PriceIncreaseMax float64 `json:"price_increase_max"` - PriceIncreaseAmount float64 `json:"price_increase_amount"` - PriceRatio float64 `json:"price_ratio"` - } - SaveAgentMembershipUserConfigReq { - ProductID int64 `json:"product_id"` - PriceIncreaseAmount float64 `json:"price_increase_amount"` - PriceRangeFrom float64 `json:"price_range_from"` - PriceRangeTo float64 `json:"price_range_to"` - PriceRatio float64 `json:"price_ratio"` - } -) - -@server ( - prefix: api/v1/agent - group: agent - jwt: JwtAuth -) -service main { - @handler GetAgentRevenueInfo - get /revenue (GetAgentRevenueInfoReq) returns (GetAgentRevenueInfoResp) - - @handler GetAgentCommission - get /commission (GetCommissionReq) returns (GetCommissionResp) - - @handler GetAgentRewards - get /rewards (GetRewardsReq) returns (GetRewardsResp) - - @handler GetAgentWithdrawal - get /withdrawal (GetWithdrawalReq) returns (GetWithdrawalResp) - - @handler AgentWithdrawal - post /withdrawal (WithdrawalReq) returns (WithdrawalResp) - - @handler ActivateAgentMembership - post /membership/activate (AgentActivateMembershipReq) returns (AgentActivateMembershipResp) -} - -type ( - // 收益信息 - GetAgentRevenueInfoReq {} - GetAgentRevenueInfoResp { - Balance float64 `json:"balance"` - FrozenBalance float64 `json:"frozen_balance"` - TotalEarnings float64 `json:"total_earnings"` - DirectPush DirectPushReport `json:"direct_push"` // 直推报告数据 - ActiveReward ActiveReward `json:"active_reward"` // 活跃下级奖励数据 - } - // 直推报告数据结构 - DirectPushReport { - TotalCommission float64 `json:"total_commission"` - TotalReport int `json:"total_report"` - Today TimeRangeReport `json:"today"` // 近24小时数据 - Last7D TimeRangeReport `json:"last7d"` // 近7天数据 - Last30D TimeRangeReport `json:"last30d"` // 近30天数据 - } - // 活跃下级奖励数据结构 - ActiveReward { - TotalReward float64 `json:"total_reward"` - Today ActiveRewardData `json:"today"` // 今日数据 - Last7D ActiveRewardData `json:"last7d"` // 近7天数据 - Last30D ActiveRewardData `json:"last30d"` // 近30天数据 - } - // 通用时间范围报告结构 - TimeRangeReport { - Commission float64 `json:"commission"` // 佣金 - Report int `json:"report"` // 报告量 - } - // 活跃奖励专用结构 - ActiveRewardData { - NewActiveReward float64 `json:"active_reward"` - SubPromoteReward float64 `json:"sub_promote_reward"` - SubUpgradeReward float64 `json:"sub_upgrade_reward"` - SubWithdrawReward float64 `json:"sub_withdraw_reward"` - } - Commission { - ProductName string `json:"product_name"` - Amount float64 `json:"amount"` - CreateTime string `json:"create_time"` - } - GetCommissionReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - } - GetCommissionResp { - Total int64 `json:"total"` // 总记录数 - List []Commission `json:"list"` // 查询列表 - } - Rewards { - Type string `json:"type"` - Amount float64 `json:"amount"` - CreateTime string `json:"create_time"` - } - GetRewardsReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - } - GetRewardsResp { - Total int64 `json:"total"` // 总记录数 - List []Rewards `json:"list"` // 查询列表 - } - Withdrawal { - Status int64 `json:"status"` - Amount float64 `json:"amount"` - WithdrawalNo string `json:"withdrawal_no"` - Remark string `json:"remark"` - payeeAccount string `json:"payee_account"` - CreateTime string `json:"create_time"` - } - GetWithdrawalReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - } - GetWithdrawalResp { - Total int64 `json:"total"` // 总记录数 - List []Withdrawal `json:"list"` // 查询列表 - } - WithdrawalReq { - Amount float64 `json:"amount"` // 提现金额 - payeeAccount string `json:"payee_account"` - payeeName string `json:"payee_name"` - } - WithdrawalResp { - Status int64 `json:"status"` // 1申请中 2成功 3失败 - failMsg string `json:"fail_msg"` - } - - // 开通代理会员请求参数 - AgentActivateMembershipReq { - Type string `json:"type,oneof=VIP SVIP"` // 会员类型:vip/svip - } - // 开通代理会员响应 - AgentActivateMembershipResp { - Id string `json:"id"` - } -) - -@server ( - prefix: api/v1/agent - group: agent -) -service main { - // 提交代理申请 - @handler ApplyForAgent - post /apply (AgentApplyReq) returns (AgentApplyResp) - - // 获取推广标识数据 - @handler GetLinkData - get /link (GetLinkDataReq) returns (GetLinkDataResp) - -} - -type ( - // 代理申请请求参数 - AgentApplyReq { - Region string `json:"region"` - Mobile string `json:"mobile"` - Code string `json:"code"` - Ancestor string `json:"ancestor,optional"` - } - AgentApplyResp{ - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } - GetLinkDataReq { - LinkIdentifier string `form:"link_identifier"` - } - GetLinkDataResp { - Product - } -) - diff --git a/app/user/cmd/api/desc/app.api b/app/user/cmd/api/desc/app.api deleted file mode 100644 index 1c3338a..0000000 --- a/app/user/cmd/api/desc/app.api +++ /dev/null @@ -1,39 +0,0 @@ -syntax = "v1" - -info ( - title: "APP服务" - desc: "APP服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -@server ( - prefix: api/v1 - group: app -) -service main { - @doc( - summary: "心跳检测接口" - ) - @handler healthCheck - get /health/check returns (HealthCheckResp) - - @handler getAppVersion - get /app/version returns (getAppVersionResp) -} - -type ( - // 心跳检测响应 - HealthCheckResp { - Status string `json:"status"` // 服务状态 - Message string `json:"message"` // 状态信息 - } -) - -type ( - getAppVersionResp { - Version string `json:"version"` - WgtUrl string `json:"wgtUrl"` - } -) \ No newline at end of file diff --git a/app/user/cmd/api/desc/main.api b/app/user/cmd/api/desc/main.api deleted file mode 100644 index 70efd80..0000000 --- a/app/user/cmd/api/desc/main.api +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "v1" - -info ( - title: "单体服务中心" - desc: "单体服务中心" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -import "user.api" -import "query.api" -import "pay.api" -import "product.api" -import "agent.api" -import "app.api" diff --git a/app/user/cmd/api/desc/pay.api b/app/user/cmd/api/desc/pay.api deleted file mode 100644 index 5f363ab..0000000 --- a/app/user/cmd/api/desc/pay.api +++ /dev/null @@ -1,72 +0,0 @@ -syntax = "v1" - -info ( - title: "支付服务" - desc: "支付服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -@server ( - prefix: api/v1 - group: pay -) -service main { - // 微信支付回调 - @handler WechatPayCallback - post /pay/wechat/callback - - // 支付宝支付回调 - @handler AlipayCallback - post /pay/alipay/callback - - // 微信退款回调 - @handler WechatPayRefundCallback - post /pay/wechat/refund_callback -} - -@server ( - prefix: api/v1 - group: pay - jwt: JwtAuth - middleware: SourceInterceptor -) -service main { - // 支付 - @handler Payment - post /pay/payment (PaymentReq) returns (PaymentResp) - - @handler IapCallback - post /pay/iap_callback (IapCallbackReq) - - @handler PaymentCheck - post /pay/check (PaymentCheckReq) returns (PaymentCheckResp) -} - -type ( - PaymentReq { - Id string `json:"id"` - PayMethod string `json:"pay_method"` - PayType string `json:"pay_type" validate:"required,oneof=query agent_vip"` - } - PaymentResp { - PrepayData interface{} `json:"prepay_data"` - PrepayId string `json:"prepay_id"` - OrderNo string `json:"order_no"` - } - PaymentCheckReq { - OrderNo string `json:"order_no" validate:"required"` - } - PaymentCheckResp { - Type string `json:"type"` - Status string `json:"status"` - } -) - -type ( - IapCallbackReq { - OrderID int64 `json:"order_id" validate:"required"` - TransactionReceipt string `json:"transaction_receipt" validate:"required"` - } -) \ No newline at end of file diff --git a/app/user/cmd/api/desc/product.api b/app/user/cmd/api/desc/product.api deleted file mode 100644 index 9fb20f3..0000000 --- a/app/user/cmd/api/desc/product.api +++ /dev/null @@ -1,57 +0,0 @@ -syntax = "v1" - -info ( - title: "产品服务" - desc: "产品服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) -type Feature { - ID int64 `json:"id"` // 功能ID - ApiID string `json:"api_id"` // API标识 - Name string `json:"name"` // 功能描述 -} -// 产品基本类型定义 -type Product { - ProductName string `json:"product_name"` - ProductEn string `json:"product_en"` - Description string `json:"description"` - Notes string `json:"notes,optional"` - SellPrice float64 `json:"sell_price"` - Features []Feature `json:"features"` // 关联功能列表 -} - -@server ( - prefix: api/v1/product - group: product - jwt: JwtAuth -) -service main { - @handler GetProductByID - get /:id (GetProductByIDRequest) returns (ProductResponse) - - @handler GetProductByEn - get /en/:product_en (GetProductByEnRequest) returns (ProductResponse) -} - -type GetProductByIDRequest { - Id int64 `path:"id"` -} - -type GetProductByEnRequest { - ProductEn string `path:"product_en"` -} - -type ProductResponse { - Product -} - -@server ( - prefix: api/v1/product - group: product -) -service main { - @handler GetProductAppByEn - get /app_en/:product_en (GetProductByEnRequest) returns (ProductResponse) -} \ No newline at end of file diff --git a/app/user/cmd/api/desc/query.api b/app/user/cmd/api/desc/query.api deleted file mode 100644 index 35a36d4..0000000 --- a/app/user/cmd/api/desc/query.api +++ /dev/null @@ -1,234 +0,0 @@ -syntax = "v1" - -info ( - title: "产品查询服务" - desc: "产品查询服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -//============================> query v1 <============================ -// 查询基本类型定义 -type Query { - Id int64 `json:"id"` // 主键ID - OrderId int64 `json:"order_id"` // 订单ID - UserId int64 `json:"user_id"` // 用户ID - ProductName string `json:"product_name"` // 产品ID - QueryParams map[string]interface{} `json:"query_params"` - QueryData []QueryItem `json:"query_data"` - CreateTime string `json:"create_time"` // 创建时间 - UpdateTime string `json:"update_time"` // 更新时间 - QueryState string `json:"query_state"` // 查询状态 -} - - -type QueryItem { - Feature interface{} `json:"feature"` - Data interface{} `json:"data"` // 这里可以是 map 或 具体的 struct -} - -@server ( - prefix: api/v1 - group: query - middleware: AuthInterceptor -) -service main { - @doc "query service agent" - @handler queryServiceAgent - post /query/service_agent/:product (QueryServiceReq) returns (QueryServiceResp) - - @handler queryServiceApp - post /query/service_app/:product (QueryServiceReq) returns (QueryServiceResp) -} - -type ( - QueryReq { - Data string `json:"data" validate:"required"` - } - QueryResp { - Id string `json:"id"` - } -) - -type ( - QueryServiceReq { - Product string `path:"product"` - Data string `json:"data" validate:"required"` - AgentIdentifier string `json:"agent_identifier,optional"` - App bool `json:"app,optional"` - } - QueryServiceResp { - Id string `json:"id"` - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } -) - -@server ( - prefix: api/v1 - group: query - jwt: JwtAuth -) -service main { - @doc "query service" - @handler queryService - post /query/service/:product (QueryServiceReq) returns (QueryServiceResp) -} - -@server ( - prefix: api/v1 - group: query - jwt: JwtAuth -) -service main { - @doc "获取查询临时订单" - @handler queryProvisionalOrder - get /query/provisional_order/:id (QueryProvisionalOrderReq) returns (QueryProvisionalOrderResp) - - @doc "查询列表" - @handler queryList - get /query/list (QueryListReq) returns (QueryListResp) - - @doc "查询详情 按订单号 付款查询时" - @handler queryDetailByOrderId - get /query/orderId/:order_id (QueryDetailByOrderIdReq) returns (QueryDetailByOrderIdResp) - - @doc "查询详情 按订单号" - @handler queryDetailByOrderNo - get /query/orderNo/:order_no (QueryDetailByOrderNoReq) returns (QueryDetailByOrderNoResp) - - @doc "重试查询" - @handler queryRetry - post /query/retry/:id (QueryRetryReq) returns (QueryRetryResp) - - @doc "更新查询数据" - @handler updateQueryData - post /query/update_data (UpdateQueryDataReq) returns (UpdateQueryDataResp) - - @doc "生成分享链接" - @handler QueryGenerateShareLink - post /query/generate_share_link (QueryGenerateShareLinkReq) returns (QueryGenerateShareLinkResp) -} - -type ( - QueryGenerateShareLinkReq { - OrderId *int64 `json:"order_id,optional"` - OrderNo *string `json:"order_no,optional"` - } - QueryGenerateShareLinkResp { - ShareLink string `json:"share_link"` - } -) - -// 获取查询临时订单 -type ( - QueryProvisionalOrderReq { - Id string `path:"id"` - } - QueryProvisionalOrderResp { - Name string `json:"name"` - IdCard string `json:"id_card"` - Mobile string `json:"mobile"` - Product Product `json:"product"` - } -) - -type ( - QueryListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - } - QueryListResp { - Total int64 `json:"total"` // 总记录数 - List []Query `json:"list"` // 查询列表 - } -) - -type ( - QueryExampleReq { - Feature string `form:"feature"` - } - QueryExampleResp { - Query - } -) - - -type ( - QueryDetailByOrderIdReq { - OrderId int64 `path:"order_id"` - } - QueryDetailByOrderIdResp { - Query - } -) - -type ( - QueryDetailByOrderNoReq { - OrderNo string `path:"order_no"` - } - QueryDetailByOrderNoResp { - Query - } -) - -type ( - QueryRetryReq { - Id int64 `path:"id"` - } - QueryRetryResp { - Query - } -) - - -type ( - UpdateQueryDataReq { - Id int64 `json:"id"` // 查询ID - QueryData string `json:"query_data"` // 查询数据(未加密的JSON) - } - UpdateQueryDataResp { - Id int64 `json:"id"` - UpdatedAt string `json:"updated_at"` // 更新时间 - } -) - -@server ( - prefix: api/v1 - group: query -) -service main { - @handler querySingleTest - post /query/single/test (QuerySingleTestReq) returns (QuerySingleTestResp) - - @doc "查询详情" - @handler queryShareDetail - get /query/share/:id (QueryShareDetailReq) returns (QueryShareDetailResp) - - @doc "查询示例" - @handler queryExample - get /query/example (QueryExampleReq) returns (QueryExampleResp) - -} -type ( - QueryShareDetailReq { - Id string `path:"id"` - } - QueryShareDetailResp { - Status string `json:"status"` - Query - } -) - -type QuerySingleTestReq { - Params map[string]interface{} `json:"params"` - Api string `json:"api"` -} - -type QuerySingleTestResp { - Data interface{} `json:"data"` - Api string `json:"api"` -} - diff --git a/app/user/cmd/api/desc/user.api b/app/user/cmd/api/desc/user.api deleted file mode 100644 index ec267fc..0000000 --- a/app/user/cmd/api/desc/user.api +++ /dev/null @@ -1,192 +0,0 @@ -syntax = "v1" - -info ( - title: "用户中心服务" - desc: "用户中心服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -//============================> user v1 <============================ -// 用户基本类型定义 -type User { - Id int64 `json:"id"` - Mobile string `json:"mobile"` - NickName string `json:"nickName"` -} - -//no need login -@server ( - prefix: api/v1 - group: user -) -service main { - @doc "register" - @handler register - post /user/register (RegisterReq) returns (RegisterResp) - - @doc "mobile login" - @handler mobileLogin - post /user/mobileLogin (MobileLoginReq) returns (MobileLoginResp) - - @doc "mobile code login" - @handler mobileCodeLogin - post /user/mobileCodeLogin (MobileCodeLoginReq) returns (MobileCodeLoginResp) - - @doc "agent mobile code login" - @handler agentMobileCodeLogin - post /user/agent_mobile_code_login (MobileCodeLoginReq) returns (MobileCodeLoginResp) - - @doc "wechat mini auth" - @handler wxMiniAuth - post /user/wxMiniAuth (WXMiniAuthReq) returns (WXMiniAuthResp) - - @doc "wechat h5 auth" - @handler wxH5Auth - post /user/wxh5Auth (WXH5AuthReq) returns (WXH5AuthResp) -} - -type ( - RegisterReq { - Mobile string `json:"mobile" validate:"required,mobile"` - Password string `json:"password" validate:"required,min=11,max=11,password"` - Code string `json:"code" validate:"required"` - } - RegisterResp { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } -) - -type ( - MobileLoginReq { - Mobile string `json:"mobile" validate:"required,mobile"` - Password string `json:"password" validate:"required"` - } - MobileLoginResp { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } -) - -type ( - MobileCodeLoginReq { - Mobile string `json:"mobile"` - Code string `json:"code" validate:"required"` - } - MobileCodeLoginResp { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } -) - -type ( - WXMiniAuthReq { - Code string `json:"code"` - IV string `json:"iv"` - EncryptedData string `json:"encryptedData"` - } - WXMiniAuthResp { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } -) - -type ( - WXH5AuthReq { - Code string `json:"code"` - } - WXH5AuthResp { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` - } -) - -//need login -@server ( - prefix: api/v1 - group: user - jwt: JwtAuth -) -service main { - @doc "get user info" - @handler detail - get /user/detail returns (UserInfoResp) - - @doc "get new token" - @handler getToken - post /user/getToken returns (MobileCodeLoginResp) - - @handler cancelOut - post /user/cancelOut - - @doc "绑定手机号" - @handler bindMobile - post /user/bindMobile (BindMobileReq) returns (BindMobileResp) -} - -type ( - UserInfoResp { - UserInfo User `json:"userInfo"` - } - - BindMobileReq { - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` - } - BindMobileResp { - } -) - -//============================> auth v1 <============================ -@server ( - prefix: api/v1 - group: auth -) -service main { - @doc "get mobile verify code" - @handler sendSms - post /auth/sendSms (sendSmsReq) -} - -type ( - sendSmsReq { - Mobile string `json:"mobile" validate:"required,mobile"` - ActionType string `json:"actionType" validate:"required,oneof=login register query agentApply realName bindMobile"` - } -) - -//============================> notification v1 <============================ -@server ( - prefix: api/v1 - group: notification -) -service main { - @doc "get notifications" - @handler getNotifications - get /notification/list returns (GetNotificationsResp) -} - -type Notification { - Title string `json:"title"` // 通知标题 - Content string `json:"content"` // 通知内容 (富文本) - NotificationPage string `json:"notificationPage"` // 通知页面 - StartDate string `json:"startDate"` // 通知开始日期,格式 "YYYY-MM-DD" - EndDate string `json:"endDate"` // 通知结束日期,格式 "YYYY-MM-DD" - StartTime string `json:"startTime"` // 每天通知开始时间,格式 "HH:MM:SS" - EndTime string `json:"endTime"` // 每天通知结束时间,格式 "HH:MM:SS" -} - -type ( - // 获取通知响应体(分页) - GetNotificationsResp { - Notifications []Notification `json:"notifications"` // 通知列表 - Total int64 `json:"total"` // 总记录数 - } -) \ No newline at end of file diff --git a/app/user/cmd/api/etc/main.dev.yaml b/app/user/cmd/api/etc/main.dev.yaml deleted file mode 100644 index efb6e3f..0000000 --- a/app/user/cmd/api/etc/main.dev.yaml +++ /dev/null @@ -1,68 +0,0 @@ -Name: main -Host: 0.0.0.0 -Port: 8888 -DataSource: "tydata:5vg67b3UNHu8@tcp(127.0.0.1:21001)/tydata?charset=utf8mb4&parseTime=True&loc=Local" -CacheRedis: - - Host: "127.0.0.1:21002" - Pass: "3m3WsgyCKWqz" # Redis 密码,如果未设置则留空 - Type: "node" # 单节点模式 -JwtAuth: - AccessSecret: "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA" - AccessExpire: 2592000 - RefreshAfter: 1296000 -VerifyCode: - AccessKeyID: "LTAI5tKGB3TVJbMHSoZN3yr9" - AccessKeySecret: "OCQ30GWp4yENMjmfOAaagksE18bp65" - EndpointURL: "dysmsapi.aliyuncs.com" - SignName: "天远数据" - TemplateCode: "SMS_302641455" - ValidTime: 300 -Encrypt: - SecretKey: "ff83609b2b24fc73196aac3d3dfb874f" -WestConfig: - Url: "http://proxy.tianyuanapi.com/api/invoke" - Key: "121a1e41fc1690dd6b90afbcacd80cf4" - SecretId: "449159" - SecretSecondId: "296804" -YushanConfig: - ApiKey: "4c566c4a4b543164535455685655316c" - AcctID: "YSSJ843926726" - Url: "https://api.yushanshuju.com/credit-gw/service" -Alipay: - AppID: "2021005113664540" - PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCA1mtTVZmB/7/wWV37Z8hUXEXFs0Gn1/Ie7c6rPQQRUlPHyJGcPAZvDii+ySC1/bplneMENRAjCuoJEM1z4X1FMt8rLggCqnF1xzUN2p9fdXUwcRPmSV4yi9ggMiFXldm0/eyaobV2fj0/VSLED2Qc8xBStM9pqkfszwf2rsAAKL15WQXOUiQw0s25s+Du18H4+YgkQ0HBr0+VPfhL4QoOvsE34ZYP0TuTwxVheYNkvSOPXFXmtE3z/b+75y2n2msa9S4HItNVYpOkB7z3GDB+0/rvX+Q+GvYI9BSBbgJwEuqiMN2SwQyAjH608JBoAUGnk0ygfG8juF77shBxzr/vAgMBAAECggEAQTlL2EJrlm59IxZ7B72Ao4SbJf0b7fba8mF90R7wojxFgcy+OpQAxdQrOHrl/nxXEv6dYRHj+3mZBcHl4RZ0rsWUSW3iTEcxbWjOKRdWu6LhEwcMBfd6oqg9X/9A9fA86O3sDFR1Y2mBZECbexo3mphK2TQEFQBJrU8aPv404V784u0wTh1oLO0Z3NjgvXOAy3ZsM64oZROVCkObXnZGyrY8Hf6W+YLmCoI7eajOQ9QTFy1x24fm8LFdWNizG9/DFa4EC7ZjiYzFhGpfpKb4964QnN3Krlf18Ryhgf3PO6IDO04JOdnHLKhR8+kHIN5m6AMIyKxbZ/vKw4X09Z8XoQKBgQD7jNHzEhIo4IOmRzgdoGxSCLXe1cUbwFL4tU3n7miUCYL/k6wpiNkCGwikaHMiSG0Om2D6+I9gX/rBrTrp2MAmcHA6ymn1GARSYMv7rz+5afGygfBDNr/7xQ2ASCatB65TObH+AUZzdq82B5dpr46AJhilRcHnQEyc/SyIelft2QKBgQCDHeDYt3vTDJ1vIPtXeyO1NHbGQY7cUucx3sZ+QVdF0abstcutT0LrHOgDCWFtnvjia1f0QRPDnTzUtq4GQxj63/9zZr1pMGsd7gjgIvVjM0LqUQXU0TMpO1DuU2zyemRyJTfWDDN+vTvA2+376cW0QxKq2CKOhX45WZRrUBbXBwKBgQCPVFe0ZlGOlQ6uSdpBl0zhGTF3vNpIy7b7G2M+ietwnlLUCXKJX/42YuzzsMgZeqcZMZN6rPIU+dtJS8lLwUMLI/nupbLmAj9EKP9RczOeFC2xhrQ9uA6ACHF+7J2M7dl4dmFi15sq4y9GW+D8SRmrDwnv8eVgPJTqxp7/TKaZUQKBgCMMI4QKV7DsWFDSMh0KL1tKcM1BzNwb1OzBrbEl6hwhlEsFtTHYU/zgtyvIoCBbNA/hvZruokfRiecaBZ5q5Qx6P6ArQEoTxS406G5xKcKgeyyDB9oBKXnF/zYVWrPd/2d7h1dR35nrH0PIBe8mZ9BtdVnxeBs8l6bgyQl+WPyVAoGBAPW7XxyLUAZ4X6JD4b5Iqq4E40xmDO3rUysrH8Zj7MN47ykZI0SlwA9B6hqliRLLJXkzhaAamecWb1RNJFDWfcg4bIyew4ukRbYB07RI+l0DXEgOxxTBcvN6BNUoIiQSEKXkOv+xt7Ez2TBoDm67xD58vwSXT4aPt4qxnd4i7Ves" - AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kkRL7lgKYs7f8Xi4DNKzp2ggjwy4By7RunwT4Ur4A71HVOqRQed9r45a6/W4JPuVv51tiHMojZifEKX7ixSlDG6be677RiNslMJ5G3mjw/+Ku01tV9Qzw5YyhvxbqmS8Qp9vgL8VPYhxqTxKO6WW+xiyVvxko+mrU+dbSFIVbBjp88NVVcquu+vZT/uwtjriKSwsesAm8DkKT6mTqY5P/JroMzTU7xa3/ErAMte6t2dOsxPS7kqWjJyoLBHRk+AH87X5lNBEjLgYPk1ADU7zFsLdC+nv4fm7nihYre7fCrdCTVKguXmPCEFBjqwSkag7BSIxRQjS3qHxi+DUMst7wIDAQAB" - AppCertPath: "etc/merchant/appCertPublicKey_2021005113664540.crt" - AlipayCertPath: "etc/merchant/alipayCertPublicKey_RSA2.crt" - AlipayRootCertPath: "etc/merchant/alipayRootCert.crt" - IsProduction: true - NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback" - ReturnURL: "http://localhost:5678/inquire" - -Wxpay: - AppID: "wxa581992dc74d860e" - MchID: "1704330055" - MchCertificateSerialNumber: "749065854D0CECCE8F98EAFEA55AD4FB17F868C4" - MchApiv3Key: "A9f3G7kL2mP5sQ8tV1xY4zB6nC0dE3hJ" - MchPrivateKeyPath: "etc/merchant/apiclient_key.pem" - MchPublicKeyID: "PUB_KEY_ID_0117043300552025010900447500000187" - MchPublicKeyPath: "etc/merchant/pub_key.pem" - NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/wechat/callback" - RefundNotifyUrl: "https://6m4685017o.goho.co/api/v1/wechat/refund_callback" -Applepay: - ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt" - SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt" - Sandbox: false - BundleID: "com.allinone.check" - IssuerID: "bf828d85-5269-4914-9660-c066e09cd6ef" - KeyID: "LAY65829DQ" - LoadPrivateKeyPath: "etc/merchant/AuthKey_LAY65829DQ.p8" -Ali: - Code: "d55b58829efb41c8aa8e86769cba4844" -SystemConfig: - ThreeVerify: false -WechatH5: - AppID: "wxa581992dc74d860e" - AppSecret: "ba37510206df321279222cecb8614e00" -Query: - ShareLinkExpire: 604800 # 7天 = 7 * 24 * 60 * 60 = 604800秒 diff --git a/app/user/cmd/api/etc/main.yaml b/app/user/cmd/api/etc/main.yaml deleted file mode 100644 index 7d64c35..0000000 --- a/app/user/cmd/api/etc/main.yaml +++ /dev/null @@ -1,69 +0,0 @@ -Name: main -Host: 0.0.0.0 -Port: 8888 -DataSource: "tydata:5vg67b3UNHu8@tcp(tydata_mysql:3306)/tydata?charset=utf8mb4&parseTime=True&loc=Local" -CacheRedis: - - Host: "tydata_redis:6379" - Pass: "3m3WsgyCKWqz" # Redis 密码,如果未设置则留空 - Type: "node" # 单节点模式 - -JwtAuth: - AccessSecret: "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA" - AccessExpire: 2592000 - RefreshAfter: 1296000 - -VerifyCode: - AccessKeyID: "LTAI5tKGB3TVJbMHSoZN3yr9" - AccessKeySecret: "OCQ30GWp4yENMjmfOAaagksE18bp65" - EndpointURL: "dysmsapi.aliyuncs.com" - SignName: "天远数据" - TemplateCode: "SMS_302641455" - ValidTime: 300 -Encrypt: - SecretKey: "ff83609b2b24fc73196aac3d3dfb874f" -WestConfig: - Url: "https://apimaster.westdex.com.cn/api/invoke" - Key: "121a1e41fc1690dd6b90afbcacd80cf4" - SecretId: "449159" - SecretSecondId: "296804" -YushanConfig: - ApiKey: "4c566c4a4b543164535455685655316c" - AcctID: "YSSJ843926726" - Url: "https://api.yushanshuju.com/credit-gw/service" -Alipay: - AppID: "2021005113664540" - PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCA1mtTVZmB/7/wWV37Z8hUXEXFs0Gn1/Ie7c6rPQQRUlPHyJGcPAZvDii+ySC1/bplneMENRAjCuoJEM1z4X1FMt8rLggCqnF1xzUN2p9fdXUwcRPmSV4yi9ggMiFXldm0/eyaobV2fj0/VSLED2Qc8xBStM9pqkfszwf2rsAAKL15WQXOUiQw0s25s+Du18H4+YgkQ0HBr0+VPfhL4QoOvsE34ZYP0TuTwxVheYNkvSOPXFXmtE3z/b+75y2n2msa9S4HItNVYpOkB7z3GDB+0/rvX+Q+GvYI9BSBbgJwEuqiMN2SwQyAjH608JBoAUGnk0ygfG8juF77shBxzr/vAgMBAAECggEAQTlL2EJrlm59IxZ7B72Ao4SbJf0b7fba8mF90R7wojxFgcy+OpQAxdQrOHrl/nxXEv6dYRHj+3mZBcHl4RZ0rsWUSW3iTEcxbWjOKRdWu6LhEwcMBfd6oqg9X/9A9fA86O3sDFR1Y2mBZECbexo3mphK2TQEFQBJrU8aPv404V784u0wTh1oLO0Z3NjgvXOAy3ZsM64oZROVCkObXnZGyrY8Hf6W+YLmCoI7eajOQ9QTFy1x24fm8LFdWNizG9/DFa4EC7ZjiYzFhGpfpKb4964QnN3Krlf18Ryhgf3PO6IDO04JOdnHLKhR8+kHIN5m6AMIyKxbZ/vKw4X09Z8XoQKBgQD7jNHzEhIo4IOmRzgdoGxSCLXe1cUbwFL4tU3n7miUCYL/k6wpiNkCGwikaHMiSG0Om2D6+I9gX/rBrTrp2MAmcHA6ymn1GARSYMv7rz+5afGygfBDNr/7xQ2ASCatB65TObH+AUZzdq82B5dpr46AJhilRcHnQEyc/SyIelft2QKBgQCDHeDYt3vTDJ1vIPtXeyO1NHbGQY7cUucx3sZ+QVdF0abstcutT0LrHOgDCWFtnvjia1f0QRPDnTzUtq4GQxj63/9zZr1pMGsd7gjgIvVjM0LqUQXU0TMpO1DuU2zyemRyJTfWDDN+vTvA2+376cW0QxKq2CKOhX45WZRrUBbXBwKBgQCPVFe0ZlGOlQ6uSdpBl0zhGTF3vNpIy7b7G2M+ietwnlLUCXKJX/42YuzzsMgZeqcZMZN6rPIU+dtJS8lLwUMLI/nupbLmAj9EKP9RczOeFC2xhrQ9uA6ACHF+7J2M7dl4dmFi15sq4y9GW+D8SRmrDwnv8eVgPJTqxp7/TKaZUQKBgCMMI4QKV7DsWFDSMh0KL1tKcM1BzNwb1OzBrbEl6hwhlEsFtTHYU/zgtyvIoCBbNA/hvZruokfRiecaBZ5q5Qx6P6ArQEoTxS406G5xKcKgeyyDB9oBKXnF/zYVWrPd/2d7h1dR35nrH0PIBe8mZ9BtdVnxeBs8l6bgyQl+WPyVAoGBAPW7XxyLUAZ4X6JD4b5Iqq4E40xmDO3rUysrH8Zj7MN47ykZI0SlwA9B6hqliRLLJXkzhaAamecWb1RNJFDWfcg4bIyew4ukRbYB07RI+l0DXEgOxxTBcvN6BNUoIiQSEKXkOv+xt7Ez2TBoDm67xD58vwSXT4aPt4qxnd4i7Ves" - AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kkRL7lgKYs7f8Xi4DNKzp2ggjwy4By7RunwT4Ur4A71HVOqRQed9r45a6/W4JPuVv51tiHMojZifEKX7ixSlDG6be677RiNslMJ5G3mjw/+Ku01tV9Qzw5YyhvxbqmS8Qp9vgL8VPYhxqTxKO6WW+xiyVvxko+mrU+dbSFIVbBjp88NVVcquu+vZT/uwtjriKSwsesAm8DkKT6mTqY5P/JroMzTU7xa3/ErAMte6t2dOsxPS7kqWjJyoLBHRk+AH87X5lNBEjLgYPk1ADU7zFsLdC+nv4fm7nihYre7fCrdCTVKguXmPCEFBjqwSkag7BSIxRQjS3qHxi+DUMst7wIDAQAB" - AppCertPath: "etc/merchant/appCertPublicKey_2021005113664540.crt" - AlipayCertPath: "etc/merchant/alipayCertPublicKey_RSA2.crt" - AlipayRootCertPath: "etc/merchant/alipayRootCert.crt" - IsProduction: true - NotifyUrl: "https://www.tianyuandb.com/api/v1/pay/alipay/callback" - ReturnURL: "https://www.tianyuandb.com/payment/result" -Wxpay: - AppID: "wxa581992dc74d860e" - MchID: "1704330055" - MchCertificateSerialNumber: "749065854D0CECCE8F98EAFEA55AD4FB17F868C4" - MchApiv3Key: "A9f3G7kL2mP5sQ8tV1xY4zB6nC0dE3hJ" - MchPrivateKeyPath: "etc/merchant/apiclient_key.pem" - MchPublicKeyID: "PUB_KEY_ID_0117043300552025010900447500000187" - MchPublicKeyPath: "etc/merchant/pub_key.pem" - NotifyUrl: "https://www.tianyuandb.com/api/v1/pay/wechat/callback" - RefundNotifyUrl: "https://www.tianyuandb.com/api/v1/wechat/refund_callback" -Applepay: - ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt" - SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt" - Sandbox: true - BundleID: "com.allinone.check" - IssuerID: "bf828d85-5269-4914-9660-c066e09cd6ef" - KeyID: "LAY65829DQ" - LoadPrivateKeyPath: "etc/merchant/AuthKey_LAY65829DQ.p8" -Ali: - Code: "d55b58829efb41c8aa8e86769cba4844" -SystemConfig: - ThreeVerify: true -WechatH5: - AppID: "wxa581992dc74d860e" - AppSecret: "ba37510206df321279222cecb8614e00" -Query: - ShareLinkExpire: 604800 # 7天 = 7 * 24 * 60 * 60 = 604800秒 diff --git a/app/user/cmd/api/etc/merchant/AuthKey_LAY65829DQ.p8 b/app/user/cmd/api/etc/merchant/AuthKey_LAY65829DQ.p8 deleted file mode 100644 index b448586..0000000 --- a/app/user/cmd/api/etc/merchant/AuthKey_LAY65829DQ.p8 +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgkidSHV1OeJN84sDD -xWLGIVjTyhn6sAQDyHfqKW6lxnGgCgYIKoZIzj0DAQehRANCAAQSAlAcuuuRNFqk -aMPVpXxsiR/pwhyM62tFhdFsbULq1C7MItQxKVMKCiwz3r5rZZy7HcbkqL47LPZ1 -q6V8Wyop ------END PRIVATE KEY----- \ No newline at end of file diff --git a/app/user/cmd/api/etc/merchant/alipayCertPublicKey_RSA2.crt b/app/user/cmd/api/etc/merchant/alipayCertPublicKey_RSA2.crt deleted file mode 100644 index 5846438..0000000 --- a/app/user/cmd/api/etc/merchant/alipayCertPublicKey_RSA2.crt +++ /dev/null @@ -1,43 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQICUDBjgAYvSDOiVZlr/A9zANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs -YXNzIDIgUjEwHhcNMjUwMzA2MTE1ODQ2WhcNMzAwMzA1MTE1ODQ2WjCBlTELMAkGA1UEBhMCQ04x -MDAuBgNVBAoMJ+a1t+WNl+Wkqei/nOWkp+aVsOaNruenkeaKgOaciemZkOWFrOWPuDEPMA0GA1UE -CwwGQWxpcGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWF -rOWPuC0yMDg4MDUxMDMyOTk4NDkyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kkR -L7lgKYs7f8Xi4DNKzp2ggjwy4By7RunwT4Ur4A71HVOqRQed9r45a6/W4JPuVv51tiHMojZifEKX -7ixSlDG6be677RiNslMJ5G3mjw/+Ku01tV9Qzw5YyhvxbqmS8Qp9vgL8VPYhxqTxKO6WW+xiyVvx -ko+mrU+dbSFIVbBjp88NVVcquu+vZT/uwtjriKSwsesAm8DkKT6mTqY5P/JroMzTU7xa3/ErAMte -6t2dOsxPS7kqWjJyoLBHRk+AH87X5lNBEjLgYPk1ADU7zFsLdC+nv4fm7nihYre7fCrdCTVKguXm -PCEFBjqwSkag7BSIxRQjS3qHxi+DUMst7wIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZI -hvcNAQELBQADggEBAIrXa4HfvKtjIb+F5YRi1GuhdPn20tkyQaw8GB/xZ30kpe1NyQdr2D3JPSIi -wd+MBGEhAF2HrD+UT9AnqsHQOwFrWJUNFArw1joMkMJQtnpD9nH1po1l0ECR5KF0gzsDroXOFXsW -QVicHhbZ4J54LswgedEKURETP74o/NdTD24IzXt+rjQe1Nsu7mgkj+VqmXVtqjOIS5IllRo3TD30 -h031HCg+OLGpGmJylYiD5C5Y+7YkPzJC0pzsvqLvT1yGNForSlujPB/s7rCBq4ZEX08/u2fbfMpd -PuZJgZdRmF7Xr5LV7JeeYrTzOKmzSEByXIFM0NsEdggpSD8eyqclQd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE4jCCAsqgAwIBAgIIYsSr5bKAMl8wDQYJKoZIhvcNAQELBQAwejELMAkGA1UEBhMCQ04xFjAU -BgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEw -LwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMy -MjE0MzQxNVoXDTM3MTEyNjE0MzQxNVowgYIxCzAJBgNVBAYTAkNOMRYwFAYDVQQKDA1BbnQgRmlu -YW5jaWFsMSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE5MDcGA1UEAwwwQW50IEZp -bmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDbGFzcyAyIFIxMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAsLMfYaoRoPRbmDcAfXPCmKf43pWRN5yTXa/KJWO0l+mrgQvs89bA -NEvbDUxlkGwycwtwi5DgBuBgVhLliXu+R9CYgr2dXs8D8Hx/gsggDcyGPLmVrDOnL+dyeauheARZ -fA3du60fwEwwbGcVIpIxPa/4n3IS/ElxQa6DNgqxh8J9Xwh7qMGl0JK9+bALuxf7B541Gr4p0WEN -G8fhgjBV4w4ut9eQLOoa1eddOUSZcy46Z7allwowwgt7b5VFfx/P1iKJ3LzBMgkCK7GZ2kiLrL7R -iqV+h482J7hkJD+ardoc6LnrHO/hIZymDxok+VH9fVeUdQa29IZKrIDVj65THQIDAQABo2MwYTAf -BgNVHSMEGDAWgBRfdLQEwE8HWurlsdsio4dBspzhATAdBgNVHQ4EFgQUSqHkYINtUSAtDPnS8Xoy -oP9p7qEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIB -AIQ8TzFy4bVIVb8+WhHKCkKNPcJe2EZuIcqvRoi727lZTJOfYy/JzLtckyZYfEI8J0lasZ29wkTt -a1IjSo+a6XdhudU4ONVBrL70U8Kzntplw/6TBNbLFpp7taRALjUgbCOk4EoBMbeCL0GiYYsTS0mw -7xdySzmGQku4GTyqutIGPQwKxSj9iSFw1FCZqr4VP4tyXzMUgc52SzagA6i7AyLedd3tbS6lnR5B -L+W9Kx9hwT8L7WANAxQzv/jGldeuSLN8bsTxlOYlsdjmIGu/C9OWblPYGpjQQIRyvs4Cc/mNhrh+ -14EQgwuemIIFDLOgcD+iISoN8CqegelNcJndFw1PDN6LkVoiHz9p7jzsge8RKay/QW6C03KNDpWZ -EUCgCUdfHfo8xKeR+LL1cfn24HKJmZt8L/aeRZwZ1jwePXFRVtiXELvgJuM/tJDIFj2KD337iV64 -fWcKQ/ydDVGqfDZAdcU4hQdsrPWENwPTQPfVPq2NNLMyIH9+WKx9Ed6/WzeZmIy5ZWpX1TtTolo6 -OJXQFeItMAjHxW/ZSZTok5IS3FuRhExturaInnzjYpx50a6kS34c5+c8hYq7sAtZ/CNLZmBnBCFD -aMQqT8xFZJ5uolUaSeXxg7JFY1QsYp5RKvj4SjFwCGKJ2+hPPe9UyyltxOidNtxjaknOCeBHytOr ------END CERTIFICATE----- diff --git a/app/user/cmd/api/etc/merchant/alipayRootCert.crt b/app/user/cmd/api/etc/merchant/alipayRootCert.crt deleted file mode 100644 index 76417c5..0000000 --- a/app/user/cmd/api/etc/merchant/alipayRootCert.crt +++ /dev/null @@ -1,88 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG -EwJDTjEOMAwGA1UECgwFTlJDQUMxDzANBgNVBAMMBlJPT1RDQTAeFw0xMjA3MTQw -MzExNTlaFw00MjA3MDcwMzExNTlaMC4xCzAJBgNVBAYTAkNOMQ4wDAYDVQQKDAVO -UkNBQzEPMA0GA1UEAwwGUk9PVENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE -MPCca6pmgcchsTf2UnBeL9rtp4nw+itk1Kzrmbnqo05lUwkwlWK+4OIrtFdAqnRT -V7Q9v1htkv42TsIutzd126NdMFswHwYDVR0jBBgwFoAUTDKxl9kzG8SmBcHG5Yti -W/CXdlgwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFEwysZfZ -MxvEpgXBxuWLYlvwl3ZYMAwGCCqBHM9VAYN1BQADSAAwRQIgG1bSLeOXp3oB8H7b -53W+CKOPl2PknmWEq/lMhtn25HkCIQDaHDgWxWFtnCrBjH16/W3Ezn7/U/Vjo5xI -pDoiVhsLwg== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIF0zCCA7ugAwIBAgIIH8+hjWpIDREwDQYJKoZIhvcNAQELBQAwejELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMyMTEzNDg0MFoXDTM4MDIyODEzNDg0 -MFowejELMAkGA1UEBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNV -BAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEAtytTRcBNuur5h8xuxnlKJetT65cHGemGi8oD+beHFPTk -rUTlFt9Xn7fAVGo6QSsPb9uGLpUFGEdGmbsQ2q9cV4P89qkH04VzIPwT7AywJdt2 -xAvMs+MgHFJzOYfL1QkdOOVO7NwKxH8IvlQgFabWomWk2Ei9WfUyxFjVO1LVh0Bp -dRBeWLMkdudx0tl3+21t1apnReFNQ5nfX29xeSxIhesaMHDZFViO/DXDNW2BcTs6 -vSWKyJ4YIIIzStumD8K1xMsoaZBMDxg4itjWFaKRgNuPiIn4kjDY3kC66Sl/6yTl -YUz8AybbEsICZzssdZh7jcNb1VRfk79lgAprm/Ktl+mgrU1gaMGP1OE25JCbqli1 -Pbw/BpPynyP9+XulE+2mxFwTYhKAwpDIDKuYsFUXuo8t261pCovI1CXFzAQM2w7H -DtA2nOXSW6q0jGDJ5+WauH+K8ZSvA6x4sFo4u0KNCx0ROTBpLif6GTngqo3sj+98 -SZiMNLFMQoQkjkdN5Q5g9N6CFZPVZ6QpO0JcIc7S1le/g9z5iBKnifrKxy0TQjtG -PsDwc8ubPnRm/F82RReCoyNyx63indpgFfhN7+KxUIQ9cOwwTvemmor0A+ZQamRe -9LMuiEfEaWUDK+6O0Gl8lO571uI5onYdN1VIgOmwFbe+D8TcuzVjIZ/zvHrAGUcC -AwEAAaNdMFswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFF90 -tATATwda6uWx2yKjh0GynOEBMB8GA1UdIwQYMBaAFF90tATATwda6uWx2yKjh0Gy -nOEBMA0GCSqGSIb3DQEBCwUAA4ICAQCVYaOtqOLIpsrEikE5lb+UARNSFJg6tpkf -tJ2U8QF/DejemEHx5IClQu6ajxjtu0Aie4/3UnIXop8nH/Q57l+Wyt9T7N2WPiNq -JSlYKYbJpPF8LXbuKYG3BTFTdOVFIeRe2NUyYh/xs6bXGr4WKTXb3qBmzR02FSy3 -IODQw5Q6zpXj8prYqFHYsOvGCEc1CwJaSaYwRhTkFedJUxiyhyB5GQwoFfExCVHW -05ZFCAVYFldCJvUzfzrWubN6wX0DD2dwultgmldOn/W/n8at52mpPNvIdbZb2F41 -T0YZeoWnCJrYXjq/32oc1cmifIHqySnyMnavi75DxPCdZsCOpSAT4j4lAQRGsfgI -kkLPGQieMfNNkMCKh7qjwdXAVtdqhf0RVtFILH3OyEodlk1HYXqX5iE5wlaKzDop -PKwf2Q3BErq1xChYGGVS+dEvyXc/2nIBlt7uLWKp4XFjqekKbaGaLJdjYP5b2s7N -1dM0MXQ/f8XoXKBkJNzEiM3hfsU6DOREgMc1DIsFKxfuMwX3EkVQM1If8ghb6x5Y -jXayv+NLbidOSzk4vl5QwngO/JYFMkoc6i9LNwEaEtR9PhnrdubxmrtM+RjfBm02 -77q3dSWFESFQ4QxYWew4pHE0DpWbWy/iMIKQ6UZ5RLvB8GEcgt8ON7BBJeMc+Dyi -kT9qhqn+lw== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIICiDCCAgygAwIBAgIIQX76UsB/30owDAYIKoZIzj0EAwMFADB6MQswCQYDVQQG -EwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UECwwXQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNpYWwgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgRTEwHhcNMTkwNDI4MTYyMDQ0WhcNNDkwNDIwMTYyMDQ0 -WjB6MQswCQYDVQQGEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UE -CwwXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNp -YWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRTEwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAASCCRa94QI0vR5Up9Yr9HEupz6hSoyjySYqo7v837KnmjveUIUNiuC9pWAU -WP3jwLX3HkzeiNdeg22a0IZPoSUCpasufiLAnfXh6NInLiWBrjLJXDSGaY7vaokt -rpZvAdmjXTBbMAsGA1UdDwQEAwIBBjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRZ -4ZTgDpksHL2qcpkFkxD2zVd16TAfBgNVHSMEGDAWgBRZ4ZTgDpksHL2qcpkFkxD2 -zVd16TAMBggqhkjOPQQDAwUAA2gAMGUCMQD4IoqT2hTUn0jt7oXLdMJ8q4vLp6sg -wHfPiOr9gxreb+e6Oidwd2LDnC4OUqCWiF8CMAzwKs4SnDJYcMLf2vpkbuVE4dTH -Rglz+HGcTLWsFs4KxLsq7MuU+vJTBUeDJeDjdA== ------END CERTIFICATE----- - ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIUEMdk6dVgOEIS2cCP0Q43P90Ps5YwDQYJKoZIhvcNAQEF -BQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM -E0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg -MiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDkzNjU2WhcNMzMwNDE4MDkzNjU2WjBq -MQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp -bmEgVHJ1c3QgTmV0d29yazEoMCYGA1UEAwwfaVRydXNDaGluYSBDbGFzcyAyIFJv -b3QgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOPPShpV -nJbMqqCw6Bz1kehnoPst9pkr0V9idOwU2oyS47/HjJXk9Rd5a9xfwkPO88trUpz5 -4GmmwspDXjVFu9L0eFaRuH3KMha1Ak01citbF7cQLJlS7XI+tpkTGHEY5pt3EsQg -wykfZl/A1jrnSkspMS997r2Gim54cwz+mTMgDRhZsKK/lbOeBPpWtcFizjXYCqhw -WktvQfZBYi6o4sHCshnOswi4yV1p+LuFcQ2ciYdWvULh1eZhLxHbGXyznYHi0dGN -z+I9H8aXxqAQfHVhbdHNzi77hCxFjOy+hHrGsyzjrd2swVQ2iUWP8BfEQqGLqM1g -KgWKYfcTGdbPB1MCAwEAAaNjMGEwHQYDVR0OBBYEFG/oAMxTVe7y0+408CTAK8hA -uTyRMB8GA1UdIwQYMBaAFG/oAMxTVe7y0+408CTAK8hAuTyRMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBLnUTfW7hp -emMbuUGCk7RBswzOT83bDM6824EkUnf+X0iKS95SUNGeeSWK2o/3ALJo5hi7GZr3 -U8eLaWAcYizfO99UXMRBPw5PRR+gXGEronGUugLpxsjuynoLQu8GQAeysSXKbN1I -UugDo9u8igJORYA+5ms0s5sCUySqbQ2R5z/GoceyI9LdxIVa1RjVX8pYOj8JFwtn -DJN3ftSFvNMYwRuILKuqUYSHc2GPYiHVflDh5nDymCMOQFcFG3WsEuB+EYQPFgIU -1DHmdZcz7Llx8UOZXX2JupWCYzK1XhJb+r4hK5ncf/w8qGtYlmyJpxk3hr1TfUJX -Yf4Zr0fJsGuv ------END CERTIFICATE----- \ No newline at end of file diff --git a/app/user/cmd/api/etc/merchant/apiclient_key.pem b/app/user/cmd/api/etc/merchant/apiclient_key.pem deleted file mode 100644 index 871f8da..0000000 --- a/app/user/cmd/api/etc/merchant/apiclient_key.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDd7p4NV2SkjF3d -zLDltShURK21VIMalnjimqpXiFSuwwIlMb3Ad6rQyClpRAHA4V/POnRlPEDc7ddm -W97uw01Fyn1Hapta3aeHTA4EOdzUVk9i74ZiLKP1SJgNNelonAD6YFmqlVvvBV9w -ufCUu+9GAM8h9tdHlVR6o+BG3hP5A7FH/yuPuXplf1SuQh/SBahxX37zP0Av14g+ -FS9slawJiAn9wEpDb2moj3Y6i+afDA8nsgZNBhnMcv49VV0pwx/oKTQMATcavR0d -DKgohqLiUG+KtgoJU3KutiarQZRiVf4iSTHw+G8IGl8f/3LqgUK18QoX81hGp68F -hnWp/5KdAgMBAAECggEBAMY+lrS4MlDCij7Mz+ABmQrdZoYp/grMCyPwoOUcBPkv -fUUYT7YTr2RcyJEdjKttJxaH0t1zm0U+uEDZJCUIFIiZPpuC4U+j3DiBeavQvDB5 -AOURrWsZEUTUGe8DD4LAiCcf1jkIvlye4ghiMEPMNQrFQkHGq7tn61S5+meTjSfL -uJz1Ta587R/2ptAyo/QE0iKTFRRvymekOb0OLu7nyIC9vTCD7V9xjARwp2OwBDBu -Ztdv7WTFLeoO3Xt+Liopvwk1DNiqhamnLeBr/UttqYbtkotGO7wUlwZW9yM5fCnp -GHhuaejVk4eEw34lurEo8X7HMc+WwQ0/s9+5iM62RgECgYEA9Mki8eIaD2Wk0FdA -9PL7diW1h4KHMi/lb2AUXGkH4zNxp6k0bmT4n5S588OkXsT8YgUdAhwfTz+M3Olz -e39rwcN7u4NCoOmNcwfpW1o7w6rn04aC2Iz1SpZhtM+DBVhuS87VmC3ViGt242FW -bfSrSw0vDrvjMIj/5ApiVpwf2N0CgYEA6Blz0IBedtQkjBf+OC33wnBNwq/5VICs -V8eAHsq/EexRf2Z/JtCkPDYCiLddLjRt+jIPFCPyR8AsKQf8vdUFfhZ029GBCCrZ -usn1hoN3rDv4GuOMXJWCvpS45KoXZt8h31NTRAVqKRWXsIWkARu0++J6NfZR8FO7 -Jrx/QnKWJMECgYEA5HDlHMk+OspH8mrLYw1z4UG11H3a/9o1CyimN8uJId57ndVJ -6hBu+jaJB1W4ivzY7/0HolVuXr3XDr8LF+DFRnHRgiAwSQ1NBWIHxEpEZgmUChKI -/+EkdXQ8QMo74vwxCqw/J6L2mTZ5ICBR0ZG5XfQyy1RK5Jul+0I5ncxb6D0CgYAJ -6aRfoEvoiVDyRsgNwDDXthIsIXXlnQU/Tn7zUbdtXYlxhoAhuUF6bNgY3LP3GDgm -OmMYehyL4fJA4l1yAhoU84KULNN09NeNubhpwU2oJnuHMna5MY1+9D0dTwJm21rH -/fgNbKnHDWwIFv0VKwjExTxw948yU3Eny18oCFrPQQKBgQCCHWUVIzzci/YkX3lv -IzSgs4VTs4979hGeUYB4u+ihVU3cpXGLbuhm37Cgf0aX+I5vyxplKURgxg8jGnPB -KDuI2+1TlwXYt+5zCrpmBtZXpQbknde5Pfser+PMuGjybeWWpHzek7kZKPNCHwTL -BJG/ccbM6dULpIVcziB/hQMvLA== ------END PRIVATE KEY----- diff --git a/app/user/cmd/api/etc/merchant/appCertPublicKey_2021005113664540.crt b/app/user/cmd/api/etc/merchant/appCertPublicKey_2021005113664540.crt deleted file mode 100644 index 405a9bc..0000000 --- a/app/user/cmd/api/etc/merchant/appCertPublicKey_2021005113664540.crt +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEozCCA4ugAwIBAgIQICUDBmfevHFjK0cMiK6zxDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs -YXNzIDEgUjEwHhcNMjUwMzA2MTE1ODQ1WhcNMzAwMzA1MTE1ODQ1WjBrMQswCQYDVQQGEwJDTjEw -MC4GA1UECgwn5rW35Y2X5aSp6L+c5aSn5pWw5o2u56eR5oqA5pyJ6ZmQ5YWs5Y+4MQ8wDQYDVQQL -DAZBbGlwYXkxGTAXBgNVBAMMEDIwODgwNTEwMzI5OTg0OTIwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQCA1mtTVZmB/7/wWV37Z8hUXEXFs0Gn1/Ie7c6rPQQRUlPHyJGcPAZvDii+ySC1 -/bplneMENRAjCuoJEM1z4X1FMt8rLggCqnF1xzUN2p9fdXUwcRPmSV4yi9ggMiFXldm0/eyaobV2 -fj0/VSLED2Qc8xBStM9pqkfszwf2rsAAKL15WQXOUiQw0s25s+Du18H4+YgkQ0HBr0+VPfhL4QoO -vsE34ZYP0TuTwxVheYNkvSOPXFXmtE3z/b+75y2n2msa9S4HItNVYpOkB7z3GDB+0/rvX+Q+GvYI -9BSBbgJwEuqiMN2SwQyAjH608JBoAUGnk0ygfG8juF77shBxzr/vAgMBAAGjggEpMIIBJTAfBgNV -HSMEGDAWgBRxB+IEYRbk5fJl6zEPyeD0PJrVkTAdBgNVHQ4EFgQU8Izqtjr8qvIpRYglmzELt22E -b7MwQAYDVR0gBDkwNzA1BgdggRwBbgEBMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9jYS5hbGlwYXku -Y29tL2Nwcy5wZGYwDgYDVR0PAQH/BAQDAgbAMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9jYS5h -bGlwYXkuY29tL2NybDk5LmNybDBgBggrBgEFBQcBAQRUMFIwKAYIKwYBBQUHMAKGHGh0dHA6Ly9j -YS5hbGlwYXkuY29tL2NhNi5jZXIwJgYIKwYBBQUHMAGGGmh0dHA6Ly9jYS5hbGlwYXkuY29tOjgz -NDAvMA0GCSqGSIb3DQEBCwUAA4IBAQC5j9d26HpXXf/eC40ejQ8E/r5PwN87129jfdDpCQGVJopL -ZyrJzxAHoPW+pG5lbDGmlDC9g8CRgeVcpNNkKDshyDAjlAoKbedTSaI8Bacly6fKPlCwAipepiy3 -fBTovcQYgPNl4aw3spi/0ZsnoTJ3Ye8n7KD4j3j3iBwptXdWFDVSQCJFSdC5tSMQSnm6WUgW3Duw -UalPi2I5CjxCZK35Pbk0GFP5dJwtz4h3YGkLX20TP18HZi0hVrxOErH5U2mP+dlq72DclJEZZZj0 -PPMyOLUqmcQRWMmaVmGhDKpkcx81jSowFKuPlSQfU0dCXZGdqpnXVnAYlLMuMAILQqE+ ------END CERTIFICATE----- \ No newline at end of file diff --git a/app/user/cmd/api/etc/merchant/pub_key.pem b/app/user/cmd/api/etc/merchant/pub_key.pem deleted file mode 100644 index 9d8523b..0000000 --- a/app/user/cmd/api/etc/merchant/pub_key.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsNH2kztg9gybkuulreL+ -BMyakxmKTFqrujYLm+S40v64KbNH3+sWdf1XR59vWjSvGWo+BAbuSIHNmIIFMFKE -sUxqHAYbta4oD9Ogr0+88drnXv+AA6vxQML0KaaTuHessvUhGC5GEUxa+TFefO9/ -EjbwL1E/XQ8oBkxHJO6RjKevuts39RjEyocnNhV7m8RP6WIBQeJDXhbfO1etcwdJ -B2yQ1eoPK9kGAqQ7wL4pDXrLXMfS1DXlNHsLf4if7rwu3fibk/qfkKdtmqvUw39f -tCKZRiexIq6ad9kTTjouXUU5EMRAn3ocRvNzCD4RaW1qVYMxFQ8AraQ8W3MXlPeL -EQIDAQAB ------END PUBLIC KEY----- diff --git a/app/user/cmd/api/internal/config/config.go b/app/user/cmd/api/internal/config/config.go deleted file mode 100644 index 2c09786..0000000 --- a/app/user/cmd/api/internal/config/config.go +++ /dev/null @@ -1,98 +0,0 @@ -package config - -import ( - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/rest" -) - -type Config struct { - rest.RestConf - DataSource string - CacheRedis cache.CacheConf - JwtAuth JwtAuth // JWT 鉴权相关配置 - VerifyCode VerifyCode - Encrypt Encrypt - Alipay AlipayConfig - Wxpay WxpayConfig - Applepay ApplepayConfig - Ali AliConfig - WestConfig WestConfig - YushanConfig YushanConfig - SystemConfig SystemConfig - WechatH5 WechatH5Config - Query QueryConfig -} - -// JwtAuth 用于 JWT 鉴权配置 -type JwtAuth struct { - AccessSecret string // JWT 密钥,用于签发 Token - AccessExpire int64 // Token 过期时间,单位为秒 - RefreshAfter int64 -} -type VerifyCode struct { - AccessKeyID string - AccessKeySecret string - EndpointURL string - SignName string - TemplateCode string - ValidTime int -} -type Encrypt struct { - SecretKey string -} - -type AlipayConfig struct { - AppID string - PrivateKey string - AlipayPublicKey string - AppCertPath string // 应用公钥证书路径 - AlipayCertPath string // 支付宝公钥证书路径 - AlipayRootCertPath string // 根证书路径 - IsProduction bool - NotifyUrl string - ReturnURL string -} -type WxpayConfig struct { - AppID string - MchID string - MchCertificateSerialNumber string - MchApiv3Key string - MchPrivateKeyPath string - MchPublicKeyID string - MchPublicKeyPath string - NotifyUrl string - RefundNotifyUrl string -} -type AliConfig struct { - Code string -} -type ApplepayConfig struct { - ProductionVerifyURL string - SandboxVerifyURL string // 沙盒环境的验证 URL - Sandbox bool - BundleID string - IssuerID string - KeyID string - LoadPrivateKeyPath string -} -type WestConfig struct { - Url string - Key string - SecretId string - SecretSecondId string -} -type YushanConfig struct { - ApiKey string - AcctID string - Url string -} -type SystemConfig struct { - ThreeVerify bool -} -type WechatH5Config struct { - AppID string - AppSecret string -} -type QueryConfig struct { - ShareLinkExpire int64 -} diff --git a/app/user/cmd/api/internal/handler/agent/getagentauditstatushandler.go b/app/user/cmd/api/internal/handler/agent/getagentauditstatushandler.go deleted file mode 100644 index 0435a34..0000000 --- a/app/user/cmd/api/internal/handler/agent/getagentauditstatushandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package agent - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func GetAgentAuditStatusHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := agent.NewGetAgentAuditStatusLogic(r.Context(), svcCtx) - resp, err := l.GetAgentAuditStatus() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/agent/getagentinfohandler.go b/app/user/cmd/api/internal/handler/agent/getagentinfohandler.go deleted file mode 100644 index 157d16b..0000000 --- a/app/user/cmd/api/internal/handler/agent/getagentinfohandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package agent - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func GetAgentInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := agent.NewGetAgentInfoLogic(r.Context(), svcCtx) - resp, err := l.GetAgentInfo() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/agent/getagentmembershipproductconfighandler.go b/app/user/cmd/api/internal/handler/agent/getagentmembershipproductconfighandler.go deleted file mode 100644 index d2dfbcc..0000000 --- a/app/user/cmd/api/internal/handler/agent/getagentmembershipproductconfighandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package agent - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func GetAgentMembershipProductConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.AgentMembershipProductConfigReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := agent.NewGetAgentMembershipProductConfigLogic(r.Context(), svcCtx) - resp, err := l.GetAgentMembershipProductConfig(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/agent/getagentproductconfighandler.go b/app/user/cmd/api/internal/handler/agent/getagentproductconfighandler.go deleted file mode 100644 index af0a0f1..0000000 --- a/app/user/cmd/api/internal/handler/agent/getagentproductconfighandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package agent - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func GetAgentProductConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := agent.NewGetAgentProductConfigLogic(r.Context(), svcCtx) - resp, err := l.GetAgentProductConfig() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/agent/saveagentmembershipuserconfighandler.go b/app/user/cmd/api/internal/handler/agent/saveagentmembershipuserconfighandler.go deleted file mode 100644 index a4fca85..0000000 --- a/app/user/cmd/api/internal/handler/agent/saveagentmembershipuserconfighandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package agent - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/agent" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func SaveAgentMembershipUserConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.SaveAgentMembershipUserConfigReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := agent.NewSaveAgentMembershipUserConfigLogic(r.Context(), svcCtx) - err := l.SaveAgentMembershipUserConfig(&req) - result.HttpResult(r, w, nil, err) - } -} diff --git a/app/user/cmd/api/internal/handler/app/getappversionhandler.go b/app/user/cmd/api/internal/handler/app/getappversionhandler.go deleted file mode 100644 index 18dd185..0000000 --- a/app/user/cmd/api/internal/handler/app/getappversionhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package app - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/app" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func GetAppVersionHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := app.NewGetAppVersionLogic(r.Context(), svcCtx) - resp, err := l.GetAppVersion() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/app/healthcheckhandler.go b/app/user/cmd/api/internal/handler/app/healthcheckhandler.go deleted file mode 100644 index b8902dc..0000000 --- a/app/user/cmd/api/internal/handler/app/healthcheckhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package app - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/app" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func HealthCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := app.NewHealthCheckLogic(r.Context(), svcCtx) - resp, err := l.HealthCheck() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/notification/getnotificationshandler.go b/app/user/cmd/api/internal/handler/notification/getnotificationshandler.go deleted file mode 100644 index c87d12a..0000000 --- a/app/user/cmd/api/internal/handler/notification/getnotificationshandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package notification - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/notification" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func GetNotificationsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := notification.NewGetNotificationsLogic(r.Context(), svcCtx) - resp, err := l.GetNotifications() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/pay/alipaycallbackhandler.go b/app/user/cmd/api/internal/handler/pay/alipaycallbackhandler.go deleted file mode 100644 index 3c66039..0000000 --- a/app/user/cmd/api/internal/handler/pay/alipaycallbackhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package pay - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func AlipayCallbackHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := pay.NewAlipayCallbackLogic(r.Context(), svcCtx) - err := l.AlipayCallback(w, r) - result.HttpResult(r, w, nil, err) - } -} diff --git a/app/user/cmd/api/internal/handler/pay/paymenthandler.go b/app/user/cmd/api/internal/handler/pay/paymenthandler.go deleted file mode 100644 index 091a383..0000000 --- a/app/user/cmd/api/internal/handler/pay/paymenthandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package pay - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func PaymentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.PaymentReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := pay.NewPaymentLogic(r.Context(), svcCtx) - resp, err := l.Payment(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/pay/wechatpaycallbackhandler.go b/app/user/cmd/api/internal/handler/pay/wechatpaycallbackhandler.go deleted file mode 100644 index ba70209..0000000 --- a/app/user/cmd/api/internal/handler/pay/wechatpaycallbackhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package pay - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func WechatPayCallbackHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := pay.NewWechatPayCallbackLogic(r.Context(), svcCtx) - err := l.WechatPayCallback(w, r) - result.HttpResult(r, w, nil, err) - } -} diff --git a/app/user/cmd/api/internal/handler/pay/wechatpayrefundcallbackhandler.go b/app/user/cmd/api/internal/handler/pay/wechatpayrefundcallbackhandler.go deleted file mode 100644 index 892c37e..0000000 --- a/app/user/cmd/api/internal/handler/pay/wechatpayrefundcallbackhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package pay - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/pay" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func WechatPayRefundCallbackHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := pay.NewWechatPayRefundCallbackLogic(r.Context(), svcCtx) - err := l.WechatPayRefundCallback(w, r) - result.HttpResult(r, w, nil, err) - } -} diff --git a/app/user/cmd/api/internal/handler/product/getproductbyenhandler.go b/app/user/cmd/api/internal/handler/product/getproductbyenhandler.go deleted file mode 100644 index 74287c4..0000000 --- a/app/user/cmd/api/internal/handler/product/getproductbyenhandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package product - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/product" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func GetProductByEnHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.GetProductByEnRequest - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := product.NewGetProductByEnLogic(r.Context(), svcCtx) - resp, err := l.GetProductByEn(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/product/getproductbyidhandler.go b/app/user/cmd/api/internal/handler/product/getproductbyidhandler.go deleted file mode 100644 index 644c646..0000000 --- a/app/user/cmd/api/internal/handler/product/getproductbyidhandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package product - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/product" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func GetProductByIDHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.GetProductByIDRequest - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := product.NewGetProductByIDLogic(r.Context(), svcCtx) - resp, err := l.GetProductByID(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/query/querydetailbyordernohandler.go b/app/user/cmd/api/internal/handler/query/querydetailbyordernohandler.go deleted file mode 100644 index 67146e5..0000000 --- a/app/user/cmd/api/internal/handler/query/querydetailbyordernohandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package query - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func QueryDetailByOrderNoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryDetailByOrderNoReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := query.NewQueryDetailByOrderNoLogic(r.Context(), svcCtx) - resp, err := l.QueryDetailByOrderNo(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/query/queryexamplehandler.go b/app/user/cmd/api/internal/handler/query/queryexamplehandler.go deleted file mode 100644 index 11b215c..0000000 --- a/app/user/cmd/api/internal/handler/query/queryexamplehandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package query - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func QueryExampleHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryExampleReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := query.NewQueryExampleLogic(r.Context(), svcCtx) - resp, err := l.QueryExample(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/query/queryservicehandler.go b/app/user/cmd/api/internal/handler/query/queryservicehandler.go deleted file mode 100644 index 4fce0d5..0000000 --- a/app/user/cmd/api/internal/handler/query/queryservicehandler.go +++ /dev/null @@ -1,25 +0,0 @@ -package query - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func QueryServiceHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryServiceReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - l := query.NewQueryServiceLogic(r.Context(), svcCtx) - resp, err := l.QueryService(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/query/updatequerydatahandler.go b/app/user/cmd/api/internal/handler/query/updatequerydatahandler.go deleted file mode 100644 index 457e4a2..0000000 --- a/app/user/cmd/api/internal/handler/query/updatequerydatahandler.go +++ /dev/null @@ -1,31 +0,0 @@ -package query - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/query" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -// 更新查询数据 -func UpdateQueryDataHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.UpdateQueryDataReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := query.NewUpdateQueryDataLogic(r.Context(), svcCtx) - resp, err := l.UpdateQueryData(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/routes.go b/app/user/cmd/api/internal/handler/routes.go deleted file mode 100644 index b6ee60f..0000000 --- a/app/user/cmd/api/internal/handler/routes.go +++ /dev/null @@ -1,424 +0,0 @@ -// Code generated by goctl. DO NOT EDIT. -package handler - -import ( - "net/http" - - agent "tydata-server/app/user/cmd/api/internal/handler/agent" - app "tydata-server/app/user/cmd/api/internal/handler/app" - auth "tydata-server/app/user/cmd/api/internal/handler/auth" - notification "tydata-server/app/user/cmd/api/internal/handler/notification" - pay "tydata-server/app/user/cmd/api/internal/handler/pay" - product "tydata-server/app/user/cmd/api/internal/handler/product" - query "tydata-server/app/user/cmd/api/internal/handler/query" - user "tydata-server/app/user/cmd/api/internal/handler/user" - "tydata-server/app/user/cmd/api/internal/svc" - - "github.com/zeromicro/go-zero/rest" -) - -func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodGet, - Path: "/audit/status", - Handler: agent.GetAgentAuditStatusHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/generating_link", - Handler: agent.GeneratingLinkHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/info", - Handler: agent.GetAgentInfoHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/product_config", - Handler: agent.GetAgentProductConfigHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/real_name", - Handler: agent.AgentRealNameHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/subordinate/contribution/detail", - Handler: agent.GetAgentSubordinateContributionDetailHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/subordinate/list", - Handler: agent.GetAgentSubordinateListHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1/agent"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodPost, - Path: "/membership/save_user_config", - Handler: agent.SaveAgentMembershipUserConfigHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/membership/user_config", - Handler: agent.GetAgentMembershipProductConfigHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1/agent"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodGet, - Path: "/commission", - Handler: agent.GetAgentCommissionHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/membership/activate", - Handler: agent.ActivateAgentMembershipHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/revenue", - Handler: agent.GetAgentRevenueInfoHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/rewards", - Handler: agent.GetAgentRewardsHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/withdrawal", - Handler: agent.GetAgentWithdrawalHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/withdrawal", - Handler: agent.AgentWithdrawalHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1/agent"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodPost, - Path: "/apply", - Handler: agent.ApplyForAgentHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/link", - Handler: agent.GetLinkDataHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1/agent"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodGet, - Path: "/app/version", - Handler: app.GetAppVersionHandler(serverCtx), - }, - { - // 心跳检测接口 - Method: http.MethodGet, - Path: "/health/check", - Handler: app.HealthCheckHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // get mobile verify code - Method: http.MethodPost, - Path: "/auth/sendSms", - Handler: auth.SendSmsHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // get notifications - Method: http.MethodGet, - Path: "/notification/list", - Handler: notification.GetNotificationsHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodPost, - Path: "/pay/alipay/callback", - Handler: pay.AlipayCallbackHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/pay/wechat/callback", - Handler: pay.WechatPayCallbackHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/pay/wechat/refund_callback", - Handler: pay.WechatPayRefundCallbackHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - rest.WithMiddlewares( - []rest.Middleware{serverCtx.SourceInterceptor}, - []rest.Route{ - { - Method: http.MethodPost, - Path: "/pay/check", - Handler: pay.PaymentCheckHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/pay/iap_callback", - Handler: pay.IapCallbackHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/pay/payment", - Handler: pay.PaymentHandler(serverCtx), - }, - }..., - ), - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodGet, - Path: "/:id", - Handler: product.GetProductByIDHandler(serverCtx), - }, - { - Method: http.MethodGet, - Path: "/en/:product_en", - Handler: product.GetProductByEnHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1/product"), - ) - - server.AddRoutes( - []rest.Route{ - { - Method: http.MethodGet, - Path: "/app_en/:product_en", - Handler: product.GetProductAppByEnHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1/product"), - ) - - server.AddRoutes( - rest.WithMiddlewares( - []rest.Middleware{serverCtx.AuthInterceptor}, - []rest.Route{ - { - // query service agent - Method: http.MethodPost, - Path: "/query/service_agent/:product", - Handler: query.QueryServiceAgentHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/query/service_app/:product", - Handler: query.QueryServiceAppHandler(serverCtx), - }, - }..., - ), - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // query service - Method: http.MethodPost, - Path: "/query/service/:product", - Handler: query.QueryServiceHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // 生成分享链接 - Method: http.MethodPost, - Path: "/query/generate_share_link", - Handler: query.QueryGenerateShareLinkHandler(serverCtx), - }, - { - // 查询列表 - Method: http.MethodGet, - Path: "/query/list", - Handler: query.QueryListHandler(serverCtx), - }, - { - // 查询详情 按订单号 付款查询时 - Method: http.MethodGet, - Path: "/query/orderId/:order_id", - Handler: query.QueryDetailByOrderIdHandler(serverCtx), - }, - { - // 查询详情 按订单号 - Method: http.MethodGet, - Path: "/query/orderNo/:order_no", - Handler: query.QueryDetailByOrderNoHandler(serverCtx), - }, - { - // 获取查询临时订单 - Method: http.MethodGet, - Path: "/query/provisional_order/:id", - Handler: query.QueryProvisionalOrderHandler(serverCtx), - }, - { - // 重试查询 - Method: http.MethodPost, - Path: "/query/retry/:id", - Handler: query.QueryRetryHandler(serverCtx), - }, - { - // 更新查询数据 - Method: http.MethodPost, - Path: "/query/update_data", - Handler: query.UpdateQueryDataHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // 查询示例 - Method: http.MethodGet, - Path: "/query/example", - Handler: query.QueryExampleHandler(serverCtx), - }, - { - // 查询详情 - Method: http.MethodGet, - Path: "/query/share/:id", - Handler: query.QueryShareDetailHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/query/single/test", - Handler: query.QuerySingleTestHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // agent mobile code login - Method: http.MethodPost, - Path: "/user/agent_mobile_code_login", - Handler: user.AgentMobileCodeLoginHandler(serverCtx), - }, - { - // mobile code login - Method: http.MethodPost, - Path: "/user/mobileCodeLogin", - Handler: user.MobileCodeLoginHandler(serverCtx), - }, - { - // mobile login - Method: http.MethodPost, - Path: "/user/mobileLogin", - Handler: user.MobileLoginHandler(serverCtx), - }, - { - // register - Method: http.MethodPost, - Path: "/user/register", - Handler: user.RegisterHandler(serverCtx), - }, - { - // wechat mini auth - Method: http.MethodPost, - Path: "/user/wxMiniAuth", - Handler: user.WxMiniAuthHandler(serverCtx), - }, - { - // wechat h5 auth - Method: http.MethodPost, - Path: "/user/wxh5Auth", - Handler: user.WxH5AuthHandler(serverCtx), - }, - }, - rest.WithPrefix("/api/v1"), - ) - - server.AddRoutes( - []rest.Route{ - { - // 绑定手机号 - Method: http.MethodPost, - Path: "/user/bindMobile", - Handler: user.BindMobileHandler(serverCtx), - }, - { - Method: http.MethodPost, - Path: "/user/cancelOut", - Handler: user.CancelOutHandler(serverCtx), - }, - { - // get user info - Method: http.MethodGet, - Path: "/user/detail", - Handler: user.DetailHandler(serverCtx), - }, - { - // get new token - Method: http.MethodPost, - Path: "/user/getToken", - Handler: user.GetTokenHandler(serverCtx), - }, - }, - rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), - rest.WithPrefix("/api/v1"), - ) -} diff --git a/app/user/cmd/api/internal/handler/user/agentmobilecodeloginhandler.go b/app/user/cmd/api/internal/handler/user/agentmobilecodeloginhandler.go deleted file mode 100644 index ceec8da..0000000 --- a/app/user/cmd/api/internal/handler/user/agentmobilecodeloginhandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func AgentMobileCodeLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.MobileCodeLoginReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := user.NewAgentMobileCodeLoginLogic(r.Context(), svcCtx) - resp, err := l.AgentMobileCodeLogin(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/user/cancelouthandler.go b/app/user/cmd/api/internal/handler/user/cancelouthandler.go deleted file mode 100644 index 863e584..0000000 --- a/app/user/cmd/api/internal/handler/user/cancelouthandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func CancelOutHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := user.NewCancelOutLogic(r.Context(), svcCtx) - err := l.CancelOut() - result.HttpResult(r, w, nil, err) - } -} diff --git a/app/user/cmd/api/internal/handler/user/detailhandler.go b/app/user/cmd/api/internal/handler/user/detailhandler.go deleted file mode 100644 index b344bc1..0000000 --- a/app/user/cmd/api/internal/handler/user/detailhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func DetailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := user.NewDetailLogic(r.Context(), svcCtx) - resp, err := l.Detail() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/user/gettokenhandler.go b/app/user/cmd/api/internal/handler/user/gettokenhandler.go deleted file mode 100644 index b8bf7d6..0000000 --- a/app/user/cmd/api/internal/handler/user/gettokenhandler.go +++ /dev/null @@ -1,17 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/common/result" -) - -func GetTokenHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - l := user.NewGetTokenLogic(r.Context(), svcCtx) - resp, err := l.GetToken() - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/user/mobilecodeloginhandler.go b/app/user/cmd/api/internal/handler/user/mobilecodeloginhandler.go deleted file mode 100644 index 7a1d684..0000000 --- a/app/user/cmd/api/internal/handler/user/mobilecodeloginhandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func MobileCodeLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.MobileCodeLoginReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := user.NewMobileCodeLoginLogic(r.Context(), svcCtx) - resp, err := l.MobileCodeLogin(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/user/registerhandler.go b/app/user/cmd/api/internal/handler/user/registerhandler.go deleted file mode 100644 index edf425d..0000000 --- a/app/user/cmd/api/internal/handler/user/registerhandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func RegisterHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.RegisterReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := user.NewRegisterLogic(r.Context(), svcCtx) - resp, err := l.Register(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/handler/user/wxh5authhandler.go b/app/user/cmd/api/internal/handler/user/wxh5authhandler.go deleted file mode 100644 index ad864d1..0000000 --- a/app/user/cmd/api/internal/handler/user/wxh5authhandler.go +++ /dev/null @@ -1,30 +0,0 @@ -package user - -import ( - "net/http" - - "tydata-server/app/user/cmd/api/internal/logic/user" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/result" - "tydata-server/pkg/lzkit/validator" - - "github.com/zeromicro/go-zero/rest/httpx" -) - -func WxH5AuthHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - var req types.WXH5AuthReq - if err := httpx.Parse(r, &req); err != nil { - result.ParamErrorResult(r, w, err) - return - } - if err := validator.Validate(req); err != nil { - result.ParamValidateErrorResult(r, w, err) - return - } - l := user.NewWxH5AuthLogic(r.Context(), svcCtx) - resp, err := l.WxH5Auth(&req) - result.HttpResult(r, w, resp, err) - } -} diff --git a/app/user/cmd/api/internal/logic/agent/activateagentmembershiplogic.go b/app/user/cmd/api/internal/logic/agent/activateagentmembershiplogic.go deleted file mode 100644 index efee472..0000000 --- a/app/user/cmd/api/internal/logic/agent/activateagentmembershiplogic.go +++ /dev/null @@ -1,85 +0,0 @@ -package agent - -import ( - "context" - "encoding/json" - "fmt" - "time" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - - "github.com/zeromicro/go-zero/core/logx" -) - -type ActivateAgentMembershipLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewActivateAgentMembershipLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ActivateAgentMembershipLogic { - return &ActivateAgentMembershipLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} -func (l *ActivateAgentMembershipLogic) ActivateAgentMembership(req *types.AgentActivateMembershipReq) (resp *types.AgentActivateMembershipResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败: %v", err) - } - // 查询用户代理信息 - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) - } - // 定义等级顺序映射 - levelOrder := map[string]int{ - "": 1, - model.AgentLeveNameNormal: 1, - model.AgentLeveNameVIP: 2, - model.AgentLeveNameSVIP: 3, - } - - // 验证请求等级合法性 - if _, valid := levelOrder[req.Type]; !valid { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的代理等级: %s", req.Type) - } - - // 如果存在代理记录,进行等级验证 - if agentModel != nil { - currentLevel, exists := levelOrder[agentModel.LevelName] - if !exists { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), - "非法的当前代理等级: %s", agentModel.LevelName) - } - - requestedLevel := levelOrder[req.Type] - if requestedLevel < currentLevel { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), - "禁止降级操作(当前等级:%s,请求等级:%s)", agentModel.LevelName, req.Type) - } - // 同等级视为续费,允许操作 - } - outTradeNo := "A_" + l.svcCtx.AlipayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf(types.AgentVipCacheKey, userID, outTradeNo) - agentVipCache := types.AgentVipCache{Type: req.Type} - jsonData, err := json.Marshal(agentVipCache) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "序列化代理VIP缓存失败: %v", err) - } - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "设置缓存失败: %v", cacheErr) - } - return &types.AgentActivateMembershipResp{ - Id: outTradeNo, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/agentrealnamelogic.go b/app/user/cmd/api/internal/logic/agent/agentrealnamelogic.go deleted file mode 100644 index 8c63cf6..0000000 --- a/app/user/cmd/api/internal/logic/agent/agentrealnamelogic.go +++ /dev/null @@ -1,99 +0,0 @@ -package agent - -import ( - "context" - "database/sql" - "fmt" - "time" - - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/redis" -) - -type AgentRealNameLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewAgentRealNameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AgentRealNameLogic { - return &AgentRealNameLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *AgentRealNameLogic) AgentRealName(req *types.AgentRealNameReq) (resp *types.AgentRealNameResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败, %v", err) - } - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理实名, 加密手机号失败: %v", err) - } - // 检查手机号是否在一分钟内已发送过验证码 - redisKey := fmt.Sprintf("%s:%s", "realName", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "代理实名, 验证码过期: %s", encryptedMobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理实名, 读取验证码redis缓存失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "代理实名, 验证码不正确: %s", encryptedMobile) - } - agent, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理信息失败, %v", err) - } - - agentRealName, err := l.svcCtx.AgentRealNameModel.FindOneByAgentId(l.ctx, agent.Id) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理实名信息失败, %v", err) - } - - if agentRealName != nil && agentRealName.Status == model.AgentRealNameStatusApproved { - return nil, errors.Wrapf(xerr.NewErrMsg("代理实名信息已审核通过"), "代理实名信息已审核通过") - } - // 三要素验证 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: req.Name, - IDCard: req.IDCard, - Mobile: req.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "三要素验证失败: %v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "三要素验证不通过: %v", err) - } - agentRealName = &model.AgentRealName{ - AgentId: agent.Id, - Status: model.AgentRealNameStatusApproved, - Name: req.Name, - IdCard: req.IDCard, - ApproveTime: sql.NullTime{Time: time.Now(), Valid: true}, - } - _, err = l.svcCtx.AgentRealNameModel.Insert(l.ctx, nil, agentRealName) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "添加代理实名信息失败, %v", err) - } - - return &types.AgentRealNameResp{ - Status: agentRealName.Status, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/agentwithdrawallogic.go b/app/user/cmd/api/internal/logic/agent/agentwithdrawallogic.go deleted file mode 100644 index aa218ce..0000000 --- a/app/user/cmd/api/internal/logic/agent/agentwithdrawallogic.go +++ /dev/null @@ -1,327 +0,0 @@ -package agent - -import ( - "context" - "fmt" - "time" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/cenkalti/backoff/v4" - "github.com/pkg/errors" - "github.com/smartwalle/alipay/v3" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -// 状态常量 -const ( - StatusProcessing = 1 // 处理中 - StatusSuccess = 2 // 成功 - StatusFailed = 3 // 失败 -) - -// 前端响应状态 -const ( - WithdrawStatusProcessing = 1 - WithdrawStatusSuccess = 2 - WithdrawStatusFailed = 3 -) - -type AgentWithdrawalLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewAgentWithdrawalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AgentWithdrawalLogic { - return &AgentWithdrawalLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *AgentWithdrawalLogic) AgentWithdrawal(req *types.WithdrawalReq) (*types.WithdrawalResp, error) { - var ( - outBizNo string - withdrawRes = &types.WithdrawalResp{} - ) - - // 使用事务处理核心操作 - err := l.svcCtx.AgentModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败: %v", err) - } - - // 查询代理信息 - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) - } - agentRealName, err := l.svcCtx.AgentRealNameModel.FindOneByAgentId(l.ctx, agentModel.Id) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(xerr.NewErrMsg("您未进行实名认证, 无法提现"), "您未进行实名认证") - } - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询代理实名信息失败: %v", err) - } - if agentRealName.Status != model.AgentRealNameStatusApproved { - return errors.Wrapf(xerr.NewErrMsg("您的实名认证未通过, 无法提现"), "您的实名认证未通过") - } - if agentRealName.Name != req.PayeeName { - return errors.Wrapf(xerr.NewErrMsg("您的实名认证信息不匹配, 无法提现"), "您的实名认证信息不匹配") - } - // 查询钱包 - agentWallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agentModel.Id) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理钱包失败: %v", err) - } - - // 校验可提现金额 - if req.Amount > agentWallet.Balance { - return errors.Wrapf(xerr.NewErrMsg("您可提现的余额不足"), "获取用户ID失败") - } - - // 生成交易号 - outBizNo = "W_" + l.svcCtx.AlipayService.GenerateOutTradeNo() - - // 创建提现记录(初始状态为处理中) - if err = l.createWithdrawalRecord(session, agentModel.Id, req, outBizNo); err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建提现记录失败: %v", err) - } - - // 冻结资金(事务内操作) - if err = l.freezeFunds(session, agentWallet, req.Amount); err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "资金冻结失败: %v", err) - } - - return nil - }) - - if err != nil { - return nil, err - } - - // 同步调用支付宝转账 - transferResp, err := l.svcCtx.AlipayService.AliTransfer(l.ctx, req.PayeeAccount, req.PayeeName, req.Amount, "代理提现", outBizNo) - if err != nil { - l.handleTransferError(outBizNo, err, "支付宝接口调用失败") - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "支付宝接口调用失败: %v", err) - } - - switch { - case transferResp.Status == "SUCCESS": - // 立即处理成功状态 - l.handleTransferSuccess(outBizNo, transferResp) - withdrawRes.Status = WithdrawStatusSuccess - case transferResp.Status == "FAIL" || transferResp.SubCode != "": - // 处理明确失败 - errorMsg := l.mapAlipayError(transferResp.SubCode) - l.handleTransferFailure(outBizNo, transferResp) - withdrawRes.Status = WithdrawStatusFailed - withdrawRes.FailMsg = errorMsg - case transferResp.Status == "DEALING": - // 处理中状态,启动异步轮询 - go l.startAsyncPolling(outBizNo) - withdrawRes.Status = WithdrawStatusProcessing - default: - // 未知状态按失败处理 - l.handleTransferError(outBizNo, fmt.Errorf("未知状态:%s", transferResp.Status), "支付宝返回未知状态") - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "支付宝接口调用失败: %v", err) - } - return withdrawRes, nil -} - -// 错误类型映射 -func (l *AgentWithdrawalLogic) mapAlipayError(code string) string { - errorMapping := map[string]string{ - // 账户存在性错误 - "PAYEE_ACCOUNT_NOT_EXSIT": "收款账户不存在,请检查账号是否正确", - "PAYEE_NOT_EXIST": "收款账户不存在或姓名有误,请核实信息", - "PAYEE_ACC_OCUPIED": "收款账号存在多个账户,无法确认唯一性", - "PAYEE_MID_CANNOT_SAME": "收款方和中间方不能是同一个人,请修改收款方或者中间方信息", - - // 实名认证问题 - "PAYEE_CERTIFY_LEVEL_LIMIT": "收款方未完成实名认证", - "PAYEE_NOT_RELNAME_CERTIFY": "收款方未完成实名认证", - "PAYEE_CERT_INFO_ERROR": "收款方证件信息不匹配", - - // 账户状态异常 - "PAYEE_ACCOUNT_STATUS_ERROR": "收款账户状态异常,请更换账号", - "PAYEE_USERINFO_STATUS_ERROR": "收款账户状态异常,无法收款", - "PERMIT_LIMIT_PAYEE": "收款账户异常,请更换账号", - "BLOCK_USER_FORBBIDEN_RECIEVE": "账户冻结无法收款", - "PAYEE_TRUSTEESHIP_ACC_OVER_LIMIT": "收款方托管子户累计收款金额超限", - - // 账户信息错误 - "PAYEE_USERINFO_ERROR": "收款方姓名或信息不匹配", - "PAYEE_CARD_INFO_ERROR": "收款支付宝账号及户名不一致", - "PAYEE_IDENTITY_NOT_MATCH": "收款方身份信息不匹配", - "PAYEE_USER_IS_INST": "收款方为金融机构,不能使用提现功能,请更换收款账号", - "PAYEE_USER_TYPE_ERROR": "该支付宝账号类型不支持提现,请更换收款账号", - - // 权限与限制 - "PAYEE_RECEIVE_COUNT_EXCEED_LIMIT": "收款次数超限,请明日再试", - "PAYEE_OUT_PERMLIMIT_CHECK_FAILURE": "收款方权限校验不通过", - "PERMIT_NON_BANK_LIMIT_PAYEE": "收款方未完善身份信息,无法收款", - } - if msg, ok := errorMapping[code]; ok { - return msg - } - return "系统错误,请联系客服" -} - -// 创建提现记录(事务内操作) -func (l *AgentWithdrawalLogic) createWithdrawalRecord(session sqlx.Session, agentID int64, req *types.WithdrawalReq, outBizNo string) error { - record := &model.AgentWithdrawal{ - AgentId: agentID, - WithdrawNo: outBizNo, - PayeeAccount: req.PayeeAccount, - Amount: req.Amount, - Status: StatusProcessing, - } - - _, err := l.svcCtx.AgentWithdrawalModel.Insert(l.ctx, session, record) - return err -} - -// 冻结资金(事务内操作) -func (l *AgentWithdrawalLogic) freezeFunds(session sqlx.Session, wallet *model.AgentWallet, amount float64) error { - wallet.Balance -= amount - wallet.FrozenBalance += amount - err := l.svcCtx.AgentWalletModel.UpdateWithVersion(l.ctx, session, wallet) - if err != nil { - return err - } - - return nil -} - -// 处理异步轮询 -func (l *AgentWithdrawalLogic) startAsyncPolling(outBizNo string) { - go func() { - detachedCtx := context.WithoutCancel(l.ctx) - retryConfig := &backoff.ExponentialBackOff{ - InitialInterval: 10 * time.Second, - RandomizationFactor: 0.5, // 增加随机因子防止惊群 - Multiplier: 2, - MaxInterval: 30 * time.Second, - MaxElapsedTime: 5 * time.Minute, // 缩短总超时 - Clock: backoff.SystemClock, - } - retryConfig.Reset() - operation := func() error { - statusRsp, err := l.svcCtx.AlipayService.QueryTransferStatus(detachedCtx, outBizNo) - if err != nil { - return err // 触发重试 - } - - switch statusRsp.Status { - case "SUCCESS": - l.handleTransferSuccess(outBizNo, statusRsp) - return nil - case "FAIL": - l.handleTransferFailure(outBizNo, statusRsp) - return nil - default: - return fmt.Errorf("转账处理中") - } - } - - err := backoff.RetryNotify(operation, - backoff.WithContext(retryConfig, detachedCtx), - func(err error, duration time.Duration) { - l.Logger.Infof("轮询延迟 outBizNo:%s 等待:%v", outBizNo, duration) - }) - - if err != nil { - l.handleTransferTimeout(outBizNo) - } - }() -} - -// 统一状态更新 -func (l *AgentWithdrawalLogic) updateWithdrawalStatus(outBizNo string, status int64, errorMsg string) { - detachedCtx := context.WithoutCancel(l.ctx) - - err := l.svcCtx.AgentModel.Trans(detachedCtx, func(ctx context.Context, session sqlx.Session) error { - // 获取提现记录 - record, err := l.svcCtx.AgentWithdrawalModel.FindOneByWithdrawNo(l.ctx, outBizNo) - if err != nil { - return err - } - - // 更新状态 - record.Status = status - record.Remark = lzUtils.StringToNullString(errorMsg) - if _, err = l.svcCtx.AgentWithdrawalModel.Update(ctx, session, record); err != nil { - return err - } - - // 失败时解冻资金 - if status == StatusFailed { - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(ctx, record.AgentId) - if err != nil { - return err - } - - wallet.Balance += record.Amount - wallet.FrozenBalance -= record.Amount - if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil { - return err - } - } - if status == StatusSuccess { - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(ctx, record.AgentId) - if err != nil { - return err - } - - wallet.FrozenBalance -= record.Amount - if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil { - return err - } - } - return nil - }) - - if err != nil { - l.Logger.Errorf("状态更新失败 outBizNo:%s error:%v", outBizNo, err) - } -} - -// 成功处理 -func (l *AgentWithdrawalLogic) handleTransferSuccess(outBizNo string, rsp interface{}) { - l.updateWithdrawalStatus(outBizNo, StatusSuccess, "") - l.Logger.Infof("提现成功 outBizNo:%s", outBizNo) -} - -// 失败处理 -func (l *AgentWithdrawalLogic) handleTransferFailure(outBizNo string, rsp interface{}) { - var errorMsg string - if resp, ok := rsp.(*alipay.FundTransUniTransferRsp); ok { - errorMsg = l.mapAlipayError(resp.SubCode) - } - l.updateWithdrawalStatus(outBizNo, StatusFailed, errorMsg) - l.Logger.Errorf("提现失败 outBizNo:%s reason:%s", outBizNo, errorMsg) -} - -// 超时处理 -func (l *AgentWithdrawalLogic) handleTransferTimeout(outBizNo string) { - l.updateWithdrawalStatus(outBizNo, StatusFailed, "系统处理超时") - l.Logger.Errorf("轮询超时 outBizNo:%s", outBizNo) -} - -// 错误处理 -func (l *AgentWithdrawalLogic) handleTransferError(outBizNo string, err error, contextMsg string) { - l.updateWithdrawalStatus(outBizNo, StatusFailed, "系统处理异常") - l.Logger.Errorf("%s outBizNo:%s error:%v", contextMsg, outBizNo, err) -} diff --git a/app/user/cmd/api/internal/logic/agent/applyforagentlogic.go b/app/user/cmd/api/internal/logic/agent/applyforagentlogic.go deleted file mode 100644 index e0343a5..0000000 --- a/app/user/cmd/api/internal/logic/agent/applyforagentlogic.go +++ /dev/null @@ -1,184 +0,0 @@ -package agent - -import ( - "context" - "database/sql" - "fmt" - "time" - "tydata-server/app/user/model" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type ApplyForAgentLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewApplyForAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApplyForAgentLogic { - return &ApplyForAgentLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *types.AgentApplyResp, err error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err) - } - // 校验验证码 - redisKey := fmt.Sprintf("%s:%s", "agentApply", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "代理申请, 验证码过期: %s", encryptedMobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 读取验证码redis缓存失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "代理申请, 验证码不正确: %s", encryptedMobile) - } - if req.Ancestor == req.Mobile { - return nil, errors.Wrapf(xerr.NewErrMsg("不能成为自己的代理"), "") - } - var userID int64 - transErr := l.svcCtx.AgentAuditModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { - // 两种情况,1. 已注册账号然后申请代理 2. 未注册账号申请代理 - user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) - if findUserErr != nil && !errors.Is(findUserErr, model.ErrNotFound) { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 读取数据库获取用户失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if user == nil { - user = &model.User{Mobile: sql.NullString{String: encryptedMobile, Valid: true}} - // if len(user.Nickname) == 0 { - // user.Nickname = encryptedMobile - // } - insertResult, userInsertErr := l.svcCtx.UserModel.Insert(transCtx, session, user) - if userInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 数据库插入新用户失败, mobile%s, err: %+v", encryptedMobile, userInsertErr) - } - lastId, lastInsertIdErr := insertResult.LastInsertId() - if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) - } - user.Id = lastId - userID = lastId - userAuth := new(model.UserAuth) - userAuth.UserId = lastId - userAuth.AuthKey = encryptedMobile - userAuth.AuthType = model.UserAuthTypeAgentDirect - if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(transCtx, session, userAuth); userAuthInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 数据库插入用户认证失败, err:%+v", userAuthInsertErr) - } - } - userID = user.Id - - // 使用SelectBuilder构建查询,查找符合user_id的记录并按创建时间降序排序获取最新一条 - builder := l.svcCtx.AgentAuditModel.SelectBuilder().Where("user_id = ?", user.Id).OrderBy("create_time DESC").Limit(1) - agentAuditList, findAgentAuditErr := l.svcCtx.AgentAuditModel.FindAll(transCtx, builder, "") - if findAgentAuditErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 查找审核列表失败%+v", findAgentAuditErr) - } - - if len(agentAuditList) > 0 { - agentAuditModel := agentAuditList[0] - if agentAuditModel.Status == 0 { - return errors.Wrapf(xerr.NewErrMsg("您的代理申请中"), "代理申请, 代理申请中") - } else { - return errors.Wrapf(xerr.NewErrMsg("您已申请过代理"), "代理申请, 代理已申请过") - } - } - - var agentAudit model.AgentAudit - agentAudit.UserId = user.Id - agentAudit.Mobile = encryptedMobile - agentAudit.Region = req.Region - agentAudit.Status = 1 - _, insetAgentAuditErr := l.svcCtx.AgentAuditModel.Insert(transCtx, session, &agentAudit) - if insetAgentAuditErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理申请, 保存代理审核信息失败: %v", insetAgentAuditErr) - } - - //agentAuditID, _ := agentAuditInsert.LastInsertId() - //agentAuditRow, findAgentAuditModelErr := l.svcCtx.AgentAuditModel.FindOne(l.ctx, agentAuditID) - //if findAgentAuditModelErr != nil { - // return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理申请, 查找代理审核信息失败: %v", insetAgentAuditErr) - //} - //agentAuditRow.Status = 1 - //updateAgentAuditErr := l.svcCtx.AgentAuditModel.UpdateWithVersion(transCtx, session, agentAuditRow) - //if updateAgentAuditErr != nil { - // return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 通过代理审核失败: %+v", updateAgentAuditErr) - //} - - // 新增代理 - var agentModel model.Agent - agentModel.Mobile = agentAudit.Mobile - agentModel.Region = agentAudit.Region - agentModel.LevelName = model.AgentLeveNameNormal - agentModel.UserId = agentAudit.UserId - agentModelInsert, insertAgentModelErr := l.svcCtx.AgentModel.Insert(transCtx, session, &agentModel) - if insertAgentModelErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 新增代理失败: %+v", insertAgentModelErr) - } - agentID, _ := agentModelInsert.LastInsertId() - - // 关联上级 - if req.Ancestor != "" { - ancestorEncryptedMobile, err := crypto.EncryptMobile(req.Ancestor, secretKey) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err) - } - ancestorAgentModel, findAgentModelErr := l.svcCtx.AgentModel.FindOneByMobile(transCtx, ancestorEncryptedMobile) - if findAgentModelErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 查找上级代理失败: %+v", findAgentModelErr) - } - agentClosureModel := model.AgentClosure{ - AncestorId: ancestorAgentModel.Id, - DescendantId: agentID, - Depth: 1, - } - _, insertAgentClosureModelErr := l.svcCtx.AgentClosureModel.Insert(transCtx, session, &agentClosureModel) - if insertAgentClosureModelErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 添加代理上下级关联失败: %+v", insertAgentClosureModelErr) - } - } - - // 新增代理钱包 - var agentWallet model.AgentWallet - agentWallet.AgentId = agentID - _, insertAgentWalletModelErr := l.svcCtx.AgentWalletModel.Insert(transCtx, session, &agentWallet) - if insertAgentWalletModelErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 新增代理钱包失败: %+v", insertAgentWalletModelErr) - } - return nil - }) - if transErr != nil { - return nil, transErr - } - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理申请, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.AgentApplyResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/generatinglinklogic.go b/app/user/cmd/api/internal/logic/agent/generatinglinklogic.go deleted file mode 100644 index 4af774f..0000000 --- a/app/user/cmd/api/internal/logic/agent/generatinglinklogic.go +++ /dev/null @@ -1,111 +0,0 @@ -package agent - -import ( - "context" - "encoding/hex" - "encoding/json" - "strconv" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GeneratingLinkLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGeneratingLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GeneratingLinkLogic { - return &GeneratingLinkLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) (resp *types.AgentGeneratingLinkResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成代理链接, %v", err) - } - productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.Product) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) - } - - agentProductConfig, err := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, productModel.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) - } - price, err := strconv.ParseFloat(req.Price, 64) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成代理链接, %v", err) - } - if price < agentProductConfig.PriceRangeMin || price > agentProductConfig.PriceRangeMax { - return nil, errors.Wrapf(xerr.NewErrMsg("请设定范围区间内的价格"), "") - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, err - } - - build := l.svcCtx.AgentLinkModel.SelectBuilder().Where(squirrel.And{ - squirrel.Eq{"user_id": userID}, - squirrel.Eq{"product_id": productModel.Id}, // 添加 product_id 的匹配条件 - squirrel.Eq{"price": price}, // 添加 price 的匹配条件 - squirrel.Eq{"agent_id": agentModel.Id}, // 添加 agent_id 的匹配条件 - }) - - agentLinkModel, err := l.svcCtx.AgentLinkModel.FindAll(l.ctx, build, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) - } - if len(agentLinkModel) > 0 { - return &types.AgentGeneratingLinkResp{ - LinkIdentifier: agentLinkModel[0].LinkIdentifier, - }, nil - } - - var agentIdentifier types.AgentIdentifier - agentIdentifier.AgentID = agentModel.Id - agentIdentifier.Product = req.Product - agentIdentifier.Price = req.Price - agentIdentifierByte, err := json.Marshal(agentIdentifier) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单,序列化标识失败, %v", err) - } - key, decodeErr := hex.DecodeString("8e3e7a2f60edb49221e953b9c029ed10") - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取AES密钥失败: %+v", decodeErr) - } - - // Encrypt the params - encrypted, err := crypto.AesEncryptURL(agentIdentifierByte, key) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成代理链接, %v", err) - } - - var agentLink model.AgentLink - agentLink.AgentId = agentModel.Id - agentLink.UserId = userID - agentLink.LinkIdentifier = encrypted - agentLink.ProductId = productModel.Id - agentLink.Price = price - _, err = l.svcCtx.AgentLinkModel.Insert(l.ctx, nil, &agentLink) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) - } - return &types.AgentGeneratingLinkResp{ - LinkIdentifier: encrypted, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentauditstatuslogic.go b/app/user/cmd/api/internal/logic/agent/getagentauditstatuslogic.go deleted file mode 100644 index 4386173..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentauditstatuslogic.go +++ /dev/null @@ -1,52 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentAuditStatusLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentAuditStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentAuditStatusLogic { - return &GetAgentAuditStatusLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentAuditStatusLogic) GetAgentAuditStatus() (resp *types.AgentAuditStatusResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理审核信息, %v", err) - } - - // 使用SelectBuilder构建查询,查找符合user_id的记录并按创建时间降序排序获取最新一条 - builder := l.svcCtx.AgentAuditModel.SelectBuilder().Where("user_id = ?", userID).OrderBy("create_time DESC").Limit(1) - agentAuditList, err := l.svcCtx.AgentAuditModel.FindAll(l.ctx, builder, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理审核信息, %v", err) - } - - if len(agentAuditList) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "未找到代理审核信息") - } - - agentAuditModel := agentAuditList[0] - var agentAuditStautsResp types.AgentAuditStatusResp - copier.Copy(&agentAuditStautsResp, agentAuditModel) - return &agentAuditStautsResp, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentcommissionlogic.go b/app/user/cmd/api/internal/logic/agent/getagentcommissionlogic.go deleted file mode 100644 index 1e1c4cf..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentcommissionlogic.go +++ /dev/null @@ -1,71 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentCommissionLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentCommissionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentCommissionLogic { - return &GetAgentCommissionLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentCommissionLogic) GetAgentCommission(req *types.GetCommissionReq) (resp *types.GetCommissionResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理佣金列表, %v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理佣金列表, %v", err) - } - builder := l.svcCtx.AgentCommissionModel.SelectBuilder().Where(squirrel.Eq{ - "agent_id": agentModel.Id, - }) - agentCommissionModelList, total, err := l.svcCtx.AgentCommissionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理佣金列表, 查找列表错误, %v", err) - } - - var list = make([]types.Commission, 0) - - if len(agentCommissionModelList) > 0 { - for _, agentCommissionModel := range agentCommissionModelList { - var commission types.Commission - copyErr := copier.Copy(&commission, agentCommissionModel) - if copyErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理佣金列表, %v", err) - } - product, findProductErr := l.svcCtx.ProductModel.FindOne(l.ctx, agentCommissionModel.ProductId) - if findProductErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理佣金列表, %v", err) - } - commission.CreateTime = agentCommissionModel.CreateTime.Format("2006-01-02 15:04:05") - commission.ProductName = product.ProductName - list = append(list, commission) - } - } - return &types.GetCommissionResp{ - Total: total, - List: list, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentinfologic.go b/app/user/cmd/api/internal/logic/agent/getagentinfologic.go deleted file mode 100644 index 6856899..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentinfologic.go +++ /dev/null @@ -1,86 +0,0 @@ -package agent - -import ( - "context" - "database/sql" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentInfoLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentInfoLogic { - return &GetAgentInfoLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentInfoLogic) GetAgentInfo() (resp *types.AgentInfoResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理信息, %v", err) - } - agent, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - builder := l.svcCtx.AgentAuditModel.SelectBuilder().Where("user_id = ?", userID).OrderBy("create_time DESC").Limit(1) - agentAuditList, findAgentAuditErr := l.svcCtx.AgentAuditModel.FindAll(l.ctx, builder, "") - - if findAgentAuditErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理信息, %v", findAgentAuditErr) - } - - if len(agentAuditList) == 0 { - return &types.AgentInfoResp{ - IsAgent: false, - Status: 3, - }, nil - } - - agentAuditModel := agentAuditList[0] - return &types.AgentInfoResp{ - IsAgent: false, - Status: agentAuditModel.Status, - }, nil - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理信息, %v", err) - } - agent.Mobile, err = crypto.DecryptMobile(agent.Mobile, l.svcCtx.Config.Encrypt.SecretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理信息, 解密手机号失败: %v", err) - } - - IsRealName := false - agentRealName, err := l.svcCtx.AgentRealNameModel.FindOneByAgentId(l.ctx, agent.Id) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理实名信息失败, %v", err) - } - if agentRealName != nil { - IsRealName = true - } - return &types.AgentInfoResp{ - AgentID: agent.Id, - Level: agent.LevelName, - IsAgent: true, - Status: 1, - Region: agent.Region, - Mobile: agent.Mobile, - ExpiryTime: agent.MembershipExpiryTime.Time.Format("2006-01-02 15:04:05"), - IsRealName: IsRealName, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentmembershipproductconfiglogic.go b/app/user/cmd/api/internal/logic/agent/getagentmembershipproductconfiglogic.go deleted file mode 100644 index ec48c44..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentmembershipproductconfiglogic.go +++ /dev/null @@ -1,80 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentMembershipProductConfigLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentMembershipProductConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentMembershipProductConfigLogic { - return &GetAgentMembershipProductConfigLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentMembershipProductConfigLogic) GetAgentMembershipProductConfig(req *types.AgentMembershipProductConfigReq) (resp *types.AgentMembershipProductConfigResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,获取用户ID失败: %v", err) - } - - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,获取代理信息失败: %v", err) - } - if agentModel.LevelName == "" { - agentModel.LevelName = model.AgentLeveNameNormal - } - agentMembershipConfigModel, err := l.svcCtx.AgentMembershipConfigModel.FindOneByLevelName(l.ctx, agentModel.LevelName) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,获取平台配置会员信息失败: %v", err) - } - agentMembershipUserConfigModel, err := l.svcCtx.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(l.ctx, agentModel.Id, req.ProductID) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, err - } - var agentMembershipUserConfig types.AgentMembershipUserConfig - if agentMembershipUserConfigModel != nil { - err = copier.Copy(&agentMembershipUserConfig, agentMembershipUserConfigModel) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,复制平台配置会员信息失败: %v", err) - } - } else { - agentMembershipUserConfig.ProductID = req.ProductID - } - agentProductConfigModelAll, err := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, req.ProductID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取会员用户报告配置, 获取产品配置%v", err) - } - - var productConfig types.ProductConfig - err = copier.Copy(&productConfig, agentProductConfigModelAll) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,复制平台产品配置失败: %v", err) - } - return &types.AgentMembershipProductConfigResp{ - AgentMembershipUserConfig: agentMembershipUserConfig, - ProductConfig: productConfig, - PriceIncreaseAmount: lzUtils.NullFloat64ToFloat64(agentMembershipConfigModel.PriceIncreaseAmount), - PriceIncreaseMax: lzUtils.NullFloat64ToFloat64(agentMembershipConfigModel.PriceIncreaseMax), - PriceRatio: lzUtils.NullFloat64ToFloat64(agentMembershipConfigModel.PriceRatio), - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentproductconfiglogic.go b/app/user/cmd/api/internal/logic/agent/getagentproductconfiglogic.go deleted file mode 100644 index 41f3203..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentproductconfiglogic.go +++ /dev/null @@ -1,140 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/mr" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentProductConfigLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentProductConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentProductConfigLogic { - return &GetAgentProductConfigLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -type AgentProductConfigResp struct { -} - -func (l *GetAgentProductConfigLogic) GetAgentProductConfig() (resp *types.AgentProductConfigResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取推广项目配置失败, %v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrMsg("您不是代理"), "") - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取推广项目配置失败, %v", err) - } - // 1. 查询推广项目配置数据 - builder := l.svcCtx.AgentProductConfigModel.SelectBuilder() - agentProductConfigModelAll, err := l.svcCtx.AgentProductConfigModel.FindAll(l.ctx, builder, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广项目配置失败, %v", err) - } - - // 用于存放最终组装好的响应数据 - var respList []types.AgentProductConfig - - // 2. 使用 mr.MapReduceVoid 并行处理每个推广项目配置项 - mrMapErr := mr.MapReduceVoid( - // source 函数:遍历所有推广项目配置,将每个配置项发送到 channel 中 - func(source chan<- interface{}) { - for _, config := range agentProductConfigModelAll { - source <- config - } - }, - // map 函数:处理每个推广项目配置项,根据 ProductId 查询会员用户配置,并组装响应数据 - func(item interface{}, writer mr.Writer[*types.AgentProductConfig], cancel func(error)) { - // 将 item 转换为推广项目配置模型 - config := item.(*model.AgentProductConfig) - var agentProductConfig types.AgentProductConfig - // 配置平台成本价和定价成本 - agentProductConfigModel, findAgentProductConfigErr := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, config.ProductId) - if findAgentProductConfigErr != nil { - cancel(findAgentProductConfigErr) - return - } - agentProductConfig.ProductID = config.ProductId - agentProductConfig.CostPrice = agentProductConfigModel.CostPrice - agentProductConfig.PriceRangeMin = agentProductConfigModel.PriceRangeMin - agentProductConfig.PriceRangeMax = agentProductConfigModel.PriceRangeMax - agentProductConfig.PPricingStandard = agentProductConfigModel.PricingStandard - agentProductConfig.POverpricingRatio = agentProductConfigModel.OverpricingRatio - - // 看推广人是否有上级,上级是否有这个配置权限,上级是否有相关配置 - agentClosureModel, findAgentClosureErr := l.svcCtx.AgentClosureModel.FindOneByDescendantIdDepth(l.ctx, agentModel.Id, 1) - if findAgentClosureErr != nil && !errors.Is(findAgentClosureErr, model.ErrNotFound) { - cancel(findAgentClosureErr) - return - } - if agentClosureModel != nil { - ancestorAgentModel, findAncestorAgentErr := l.svcCtx.AgentModel.FindOne(l.ctx, agentClosureModel.AncestorId) - if findAncestorAgentErr != nil { - cancel(findAncestorAgentErr) - return - } - if ancestorAgentModel.LevelName == "" { - ancestorAgentModel.LevelName = model.AgentLeveNameNormal - } - agentMembershipConfigModel, findAgentMembershipErr := l.svcCtx.AgentMembershipConfigModel.FindOneByLevelName(l.ctx, ancestorAgentModel.LevelName) - if findAgentMembershipErr != nil { - cancel(findAgentMembershipErr) - return - } - // 是否有提成本价 - if agentMembershipConfigModel.PriceIncreaseAmount.Valid { - // 根据产品ID查询会员用户配置数据 - membershipUserConfigModel, membershipConfigErr := l.svcCtx.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(l.ctx, agentClosureModel.AncestorId, config.ProductId) - if membershipConfigErr != nil { - if errors.Is(membershipConfigErr, model.ErrNotFound) { - writer.Write(&agentProductConfig) - return - } - cancel(membershipConfigErr) - return - } - agentProductConfig.CostPrice += membershipUserConfigModel.PriceIncreaseAmount - agentProductConfig.PriceRangeMin += membershipUserConfigModel.PriceIncreaseAmount - agentProductConfig.APricingStandard = membershipUserConfigModel.PriceRangeFrom - agentProductConfig.APricingEnd = membershipUserConfigModel.PriceRangeTo - agentProductConfig.AOverpricingRatio = membershipUserConfigModel.PriceRatio - } - } - writer.Write(&agentProductConfig) - - }, - // reduce 函数:收集 map 阶段写入的响应数据,并汇总到 respList 中 - func(pipe <-chan *types.AgentProductConfig, cancel func(error)) { - for item := range pipe { - respList = append(respList, *item) - } - }, - ) - if mrMapErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广项目配置失败, %+v", mrMapErr) - } - - // 3. 组装最终响应返回 - return &types.AgentProductConfigResp{ - AgentProductConfig: respList, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentrevenueinfologic.go b/app/user/cmd/api/internal/logic/agent/getagentrevenueinfologic.go deleted file mode 100644 index ba33ace..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentrevenueinfologic.go +++ /dev/null @@ -1,199 +0,0 @@ -package agent - -import ( - "context" - "time" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentRevenueInfoLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentRevenueInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentRevenueInfoLogic { - return &GetAgentRevenueInfoLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentRevenueInfoLogic) GetAgentRevenueInfo(req *types.GetAgentRevenueInfoReq) (resp *types.GetAgentRevenueInfoResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理奖励, %v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) - } - agentWalletModel, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agentModel.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) - } - resp = &types.GetAgentRevenueInfoResp{} - resp.Balance = agentWalletModel.Balance - resp.TotalEarnings = agentWalletModel.TotalEarnings - resp.FrozenBalance = agentWalletModel.FrozenBalance - - // 直推报告统计 - //now := time.Now() - //startTime := now.AddDate(0, 0, -30).Format("2006-01-02 15:04:05") - //endTime := now.Format("2006-01-02 15:04:05") - - // 直推报告佣金 - agentCommissionModelBuild := l.svcCtx.AgentCommissionModel.SelectBuilder(). - Where(squirrel.Eq{"agent_id": agentModel.Id}) - //.Where(squirrel.Expr("create_time BETWEEN ? AND ?", startTime, endTime)) - - agentCommissionsModel, err := l.svcCtx.AgentCommissionModel.FindAll(l.ctx, agentCommissionModelBuild, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) - } - // 筛选分类 - directPush, err := calculateDirectPushReport(agentCommissionsModel, nil) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) - } - // 绑定到响应体 - resp.DirectPush = directPush - - // 活跃下级统计 - agentRewardsModelBuilder := l.svcCtx.AgentRewardsModel.SelectBuilder().Where("agent_id = ?", agentModel.Id) - agentRewardsModel, err := l.svcCtx.AgentRewardsModel.FindAll(l.ctx, agentRewardsModelBuilder, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) - } - activeReward := calculateActiveReward(agentRewardsModel) - resp.ActiveReward = activeReward - - return resp, nil -} - -// 统计直推报告的独立函数 -func calculateDirectPushReport(commissions []*model.AgentCommission, loc *time.Location) (types.DirectPushReport, error) { - // 初始化报告结构 - report := types.DirectPushReport{ - Today: types.TimeRangeReport{}, - Last7D: types.TimeRangeReport{}, - Last30D: types.TimeRangeReport{}, - } - - // 获取当前中国时间 - now := time.Now() - - // 计算时间分界点 - todayStart := now.Add(-24 * time.Hour) - last7dStart := now.AddDate(0, 0, -7) - last30dStart := now.AddDate(0, 0, -30) - - // 遍历所有佣金记录 - for _, c := range commissions { - // 转换时区 - createTime := c.CreateTime - - // 统计总量 - report.TotalCommission += c.Amount - report.TotalReport++ - - // 近24小时(滚动周期) - if createTime.After(todayStart) { - report.Today.Commission += c.Amount - report.Today.Report++ - } - - // 近7天(滚动周期) - if createTime.After(last7dStart) { - report.Last7D.Commission += c.Amount - report.Last7D.Report++ - } - - // 近30天(滚动周期) - if createTime.After(last30dStart) { - report.Last30D.Commission += c.Amount - report.Last30D.Report++ - } - } - - return report, nil -} -func calculateActiveReward(rewards []*model.AgentRewards) types.ActiveReward { - result := types.ActiveReward{ - Today: types.ActiveRewardData{}, - Last7D: types.ActiveRewardData{}, - Last30D: types.ActiveRewardData{}, - } - - now := time.Now() - todayStart := now.Add(-24 * time.Hour) // 近24小时 - last7dStart := now.AddDate(0, 0, -7) // 近7天 - last30dStart := now.AddDate(0, 0, -30) // 近30天 - - for _, r := range rewards { - createTime := r.CreateTime - amount := r.Amount - - // 总奖励累加 - result.TotalReward += amount - - // 时间范围判断 - isToday := createTime.After(todayStart) - isLast7d := createTime.After(last7dStart) - isLast30d := createTime.After(last30dStart) - - // 类型分类统计 - switch r.Type { - case model.AgentRewardsTypeDescendantWithdraw: - addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "withdraw") - - case model.AgentRewardsTypeDescendantNewActive: - addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "new_active") - - case model.AgentRewardsTypeDescendantUpgradeSvip, model.AgentRewardsTypeDescendantUpgradeVip: - addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "upgrade") - - case model.AgentRewardsTypeDescendantPromotion: - addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "promotion") - } - } - return result -} - -// 统一处理时间段累加 -func addToPeriods(res *types.ActiveReward, amount float64, today, last7d, last30d bool, t string) { - if today { - addToData(&res.Today, amount, t) - } - if last7d { - addToData(&res.Last7D, amount, t) - } - if last30d { - addToData(&res.Last30D, amount, t) - } -} - -// 分类添加具体字段 -func addToData(data *types.ActiveRewardData, amount float64, t string) { - switch t { - case "withdraw": - data.SubWithdrawReward += amount - case "new_active": - data.NewActiveReward += amount - case "upgrade": - data.SubUpgradeReward += amount - case "promotion": - data.SubPromoteReward += amount - } -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentrewardslogic.go b/app/user/cmd/api/internal/logic/agent/getagentrewardslogic.go deleted file mode 100644 index 0f949e8..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentrewardslogic.go +++ /dev/null @@ -1,68 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentRewardsLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentRewardsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentRewardsLogic { - return &GetAgentRewardsLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentRewardsLogic) GetAgentRewards(req *types.GetRewardsReq) (resp *types.GetRewardsResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理奖励列表, %v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励列表, %v", err) - } - builder := l.svcCtx.AgentRewardsModel.SelectBuilder().Where(squirrel.Eq{ - "agent_id": agentModel.Id, - }) - agentRewardsModelList, total, err := l.svcCtx.AgentRewardsModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励列表, 查找列表错误, %v", err) - } - - var list = make([]types.Rewards, 0) - if len(agentRewardsModelList) > 0 { - for _, agentRewardsModel := range agentRewardsModelList { - var rewards types.Rewards - copyErr := copier.Copy(&rewards, agentRewardsModel) - if copyErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理奖励列表, %v", err) - } - - rewards.CreateTime = agentRewardsModel.CreateTime.Format("2006-01-02 15:04:05") - list = append(list, rewards) - } - } - return &types.GetRewardsResp{ - Total: total, - List: list, - }, nil - - return -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go b/app/user/cmd/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go deleted file mode 100644 index 52d0530..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentsubordinatecontributiondetaillogic.go +++ /dev/null @@ -1,200 +0,0 @@ -package agent - -import ( - "context" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentSubordinateContributionDetailLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentSubordinateContributionDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentSubordinateContributionDetailLogic { - return &GetAgentSubordinateContributionDetailLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentSubordinateContributionDetailLogic) GetAgentSubordinateContributionDetail(req *types.GetAgentSubordinateContributionDetailReq) (resp *types.GetAgentSubordinateContributionDetailResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理下级贡献详情, 获取用户ID%v", err) - } - - // 获取当前代理信息 - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 获取代理信息%v", err) - } - - // 获取下级代理信息 - subordinateAgent, err := l.svcCtx.AgentModel.FindOne(l.ctx, req.SubordinateID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 获取下级代理信息%v", err) - } - - // 验证是否是当前代理的下级 - closureBuilder := l.svcCtx.AgentClosureModel.SelectBuilder().Where(squirrel.Eq{ - "ancestor_id": agentModel.Id, - "descendant_id": req.SubordinateID, - }) - closureList, err := l.svcCtx.AgentClosureModel.FindAll(l.ctx, closureBuilder, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 验证代理关系%v", err) - } - if len(closureList) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理下级贡献详情, 非法的代理关系") - } - closure := closureList[0] - - // 获取佣金扣除记录 - deductionBuilder := l.svcCtx.AgentCommissionDeductionModel.SelectBuilder().Where(squirrel.Eq{ - "agent_id": agentModel.Id, - "deducted_agent_id": req.SubordinateID, - }) - deductionList, err := l.svcCtx.AgentCommissionDeductionModel.FindAll(l.ctx, deductionBuilder, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 获取佣金扣除记录%v", err) - } - - // 获取奖励记录 - rewardsBuilder := l.svcCtx.AgentRewardsModel.SelectBuilder().Where(squirrel.Eq{ - "agent_id": agentModel.Id, - "relation_agent_id": req.SubordinateID, - }) - rewards, err := l.svcCtx.AgentRewardsModel.FindAll(l.ctx, rewardsBuilder, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 获取奖励记录%v", err) - } - - // 计算总贡献 - var totalContribution float64 - for _, v := range deductionList { - totalContribution += v.Amount - } - // 加上奖励金额 - for _, v := range rewards { - totalContribution += v.Amount - } - - // 获取佣金记录 - commissionBuilder := l.svcCtx.AgentCommissionModel.SelectBuilder().Where(squirrel.Eq{ - "agent_id": req.SubordinateID, - }) - commissionList, err := l.svcCtx.AgentCommissionModel.FindAll(l.ctx, commissionBuilder, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 获取佣金记录%v", err) - } - - // 计算总收益和总单量 - var totalEarnings float64 - for _, v := range commissionList { - totalEarnings += v.Amount - } - - // 初始化统计数据 - stats := types.AgentSubordinateContributionStats{ - CostCount: 0, - CostAmount: 0, - PricingCount: 0, - PricingAmount: 0, - DescendantPromotionCount: 0, - DescendantPromotionAmount: 0, - DescendantUpgradeVipCount: 0, - DescendantUpgradeVipAmount: 0, - DescendantUpgradeSvipCount: 0, - DescendantUpgradeSvipAmount: 0, - DescendantStayActiveCount: 0, - DescendantStayActiveAmount: 0, - DescendantNewActiveCount: 0, - DescendantNewActiveAmount: 0, - DescendantWithdrawCount: 0, - DescendantWithdrawAmount: 0, - } - - // 统计佣金扣除记录 - for _, v := range deductionList { - switch v.Type { - case "cost": - stats.CostCount++ - stats.CostAmount += v.Amount - case "pricing": - stats.PricingCount++ - stats.PricingAmount += v.Amount - } - } - - // 统计奖励记录 - for _, v := range rewards { - switch v.Type { - case "descendant_promotion": - stats.DescendantPromotionCount++ - stats.DescendantPromotionAmount += v.Amount - case "descendant_upgrade_vip": - stats.DescendantUpgradeVipCount++ - stats.DescendantUpgradeVipAmount += v.Amount - case "descendant_upgrade_svip": - stats.DescendantUpgradeSvipCount++ - stats.DescendantUpgradeSvipAmount += v.Amount - case "descendant_stay_active": - stats.DescendantStayActiveCount++ - stats.DescendantStayActiveAmount += v.Amount - case "descendant_new_active": - stats.DescendantNewActiveCount++ - stats.DescendantNewActiveAmount += v.Amount - case "descendant_withdraw": - stats.DescendantWithdrawCount++ - stats.DescendantWithdrawAmount += v.Amount - } - } - - // 解密手机号 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - mobile, err := crypto.DecryptMobile(subordinateAgent.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理下级贡献详情, 解密手机号失败: %v", err) - } - - // 获取合并后的分页列表 - unionDetails, total, err := l.svcCtx.AgentClosureModel.FindUnionPageListByPageWithTotal(l.ctx, agentModel.Id, req.SubordinateID, req.Page, req.PageSize) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级贡献详情, 获取分页列表%v", err) - } - - // 转换为响应类型 - detailList := make([]types.AgentSubordinateContributionDetail, 0, len(unionDetails)) - for _, v := range unionDetails { - detail := types.AgentSubordinateContributionDetail{ - ID: v.Id, - CreateTime: v.CreateTime, - Amount: v.Amount, - Type: v.Type, - } - detailList = append(detailList, detail) - } - - return &types.GetAgentSubordinateContributionDetailResp{ - Mobile: maskPhone(mobile), - Total: total, - CreateTime: closure.CreateTime.Format("2006-01-02 15:04:05"), - TotalEarnings: totalEarnings, - TotalContribution: totalContribution, - TotalOrders: int64(len(commissionList)), - LevelName: subordinateAgent.LevelName, - List: detailList, - Stats: stats, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentsubordinatelistlogic.go b/app/user/cmd/api/internal/logic/agent/getagentsubordinatelistlogic.go deleted file mode 100644 index eeb13b8..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentsubordinatelistlogic.go +++ /dev/null @@ -1,173 +0,0 @@ -package agent - -import ( - "context" - "strings" - "time" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/mr" -) - -type GetAgentSubordinateListLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentSubordinateListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentSubordinateListLogic { - return &GetAgentSubordinateListLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentSubordinateListLogic) GetAgentSubordinateList(req *types.GetAgentSubordinateListReq) (resp *types.GetAgentSubordinateListResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理下级列表, 获取用户ID%v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级列表, 获取代理信息%v", err) - } - agentID := agentModel.Id - - builder := l.svcCtx.AgentClosureModel.SelectBuilder().Where(squirrel.Eq{ - "ancestor_id": agentID, - }) - agentClosureModelList, total, err := l.svcCtx.AgentClosureModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级列表, 获取代理关系%v", err) - } - - // 构建ID到CreateTime的映射 - createTimeMap := make(map[int64]time.Time) - descendantIDs := make([]int64, 0) - for _, v := range agentClosureModelList { - descendantIDs = append(descendantIDs, v.DescendantId) - createTimeMap[v.DescendantId] = v.CreateTime - } - - // 并发查询代理信息 - agentMap := make(map[int64]*model.Agent) - var descendantList []types.AgentSubordinateList - err = mr.Finish(func() error { - return mr.MapReduceVoid(func(source chan<- interface{}) { - for _, id := range descendantIDs { - source <- id - } - }, func(item interface{}, writer mr.Writer[interface{}], cancel func(error)) { - id := item.(int64) - agent, err := l.svcCtx.AgentModel.FindOne(l.ctx, id) - if err != nil { - cancel(err) - return - } - writer.Write(agent) - }, func(pipe <-chan interface{}, cancel func(error)) { - for item := range pipe { - agent := item.(*model.Agent) - agentMap[agent.Id] = agent - } - }) - }, func() error { - // 并发查询佣金扣除信息 - deductionBuilder := l.svcCtx.AgentCommissionDeductionModel.SelectBuilder(). - Where(squirrel.Eq{"agent_id": agentID}). - Where(squirrel.Eq{"deducted_agent_id": descendantIDs}) - deductionList, err := l.svcCtx.AgentCommissionDeductionModel.FindAll(l.ctx, deductionBuilder, "") - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级列表, 获取代理佣金扣除信息%v", err) - } - deductionMap := make(map[int64]float64) - for _, v := range deductionList { - deductionMap[v.DeductedAgentId] += v.Amount - } - - // 并发查询奖励信息 - rewardsBuilder := l.svcCtx.AgentRewardsModel.SelectBuilder(). - Where(squirrel.Eq{"agent_id": agentID}). - Where(squirrel.Eq{"relation_agent_id": descendantIDs}) - rewardsList, err := l.svcCtx.AgentRewardsModel.FindAll(l.ctx, rewardsBuilder, "") - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级列表, 获取代理奖励信息%v", err) - } - rewardsMap := make(map[int64]float64) - for _, v := range rewardsList { - if v.RelationAgentId.Valid { - rewardsMap[v.RelationAgentId.Int64] += v.Amount - } - } - - // 并发查询佣金信息 - commissionBuilder := l.svcCtx.AgentCommissionModel.SelectBuilder(). - Where(squirrel.Eq{"agent_id": descendantIDs}) - commissionList, err := l.svcCtx.AgentCommissionModel.FindAll(l.ctx, commissionBuilder, "") - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理下级列表, 获取代理佣金信息%v", err) - } - commissionMap := make(map[int64]float64) - orderCountMap := make(map[int64]int64) - for _, v := range commissionList { - commissionMap[v.AgentId] += v.Amount - orderCountMap[v.AgentId]++ - } - - // 构建返回结果 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - descendantList = make([]types.AgentSubordinateList, 0, len(descendantIDs)) - for _, id := range descendantIDs { - agent, exists := agentMap[id] - if !exists { - continue - } - - mobile, err := crypto.DecryptMobile(agent.Mobile, secretKey) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理信息, 解密手机号失败: %v", err) - } - - subordinate := types.AgentSubordinateList{ - ID: id, - Mobile: maskPhone(mobile), - LevelName: agent.LevelName, - CreateTime: createTimeMap[id].Format("2006-01-02 15:04:05"), - TotalContribution: deductionMap[id] + rewardsMap[id], - TotalEarnings: commissionMap[id], - TotalOrders: orderCountMap[id], - } - descendantList = append(descendantList, subordinate) - } - return nil - }) - - if err != nil { - return nil, err - } - - return &types.GetAgentSubordinateListResp{ - Total: total, - List: descendantList, - }, nil -} - -// 手机号脱敏 -func maskPhone(phone string) string { - length := len(phone) - if length < 8 { - return phone // 如果长度太短,可能不是手机号,不处理 - } - // 保留前3位和后4位 - return phone[:3] + strings.Repeat("*", length-7) + phone[length-4:] -} diff --git a/app/user/cmd/api/internal/logic/agent/getagentwithdrawallogic.go b/app/user/cmd/api/internal/logic/agent/getagentwithdrawallogic.go deleted file mode 100644 index f6a5e8d..0000000 --- a/app/user/cmd/api/internal/logic/agent/getagentwithdrawallogic.go +++ /dev/null @@ -1,66 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAgentWithdrawalLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAgentWithdrawalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentWithdrawalLogic { - return &GetAgentWithdrawalLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAgentWithdrawalLogic) GetAgentWithdrawal(req *types.GetWithdrawalReq) (resp *types.GetWithdrawalResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理提现列表, %v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理提现列表, %v", err) - } - builder := l.svcCtx.AgentWithdrawalModel.SelectBuilder().Where(squirrel.Eq{ - "agent_id": agentModel.Id, - }) - agentWithdrawalModelList, total, err := l.svcCtx.AgentWithdrawalModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理提现列表, 查找列表错误, %v", err) - } - - var list = make([]types.Withdrawal, 0) - - if len(agentWithdrawalModelList) > 0 { - for _, agentWithdrawalModel := range agentWithdrawalModelList { - var withdrawal types.Withdrawal - copyErr := copier.Copy(&withdrawal, agentWithdrawalModel) - if copyErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理提现列表, %v", err) - } - withdrawal.CreateTime = agentWithdrawalModel.CreateTime.Format("2006-01-02 15:04:05") - list = append(list, withdrawal) - } - } - return &types.GetWithdrawalResp{ - Total: total, - List: list, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/getlinkdatalogic.go b/app/user/cmd/api/internal/logic/agent/getlinkdatalogic.go deleted file mode 100644 index bdb4ae6..0000000 --- a/app/user/cmd/api/internal/logic/agent/getlinkdatalogic.go +++ /dev/null @@ -1,46 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/common/xerr" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetLinkDataLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetLinkDataLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLinkDataLogic { - return &GetLinkDataLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetLinkDataLogic) GetLinkData(req *types.GetLinkDataReq) (resp *types.GetLinkDataResp, err error) { - agentLinkModel, err := l.svcCtx.AgentLinkModel.FindOneByLinkIdentifier(l.ctx, req.LinkIdentifier) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理链接数据, %v", err) - } - - productModel, err := l.svcCtx.ProductModel.FindOne(l.ctx, agentLinkModel.ProductId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理链接数据, %v", err) - } - var product types.Product - copier.Copy(&product, productModel) - product.SellPrice = agentLinkModel.Price - return &types.GetLinkDataResp{ - Product: product, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go b/app/user/cmd/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go deleted file mode 100644 index 07e85bf..0000000 --- a/app/user/cmd/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go +++ /dev/null @@ -1,82 +0,0 @@ -package agent - -import ( - "context" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type SaveAgentMembershipUserConfigLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewSaveAgentMembershipUserConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveAgentMembershipUserConfigLogic { - return &SaveAgentMembershipUserConfigLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *SaveAgentMembershipUserConfigLogic) SaveAgentMembershipUserConfig(req *types.SaveAgentMembershipUserConfigReq) error { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置,获取用户ID失败: %v", err) - } - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置: %v", err) - } - - var agentMembershipUserConfigModel *model.AgentMembershipUserConfig - agentMembershipUserConfigModel, err = l.svcCtx.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(l.ctx, agentModel.Id, req.ProductID) - - // 检查记录是否存在 - if err != nil { - if errors.Is(err, model.ErrNotFound) { - // 记录不存在,创建新的配置对象 - agentMembershipUserConfigModel = &model.AgentMembershipUserConfig{ - UserId: userID, - AgentId: agentModel.Id, - ProductId: req.ProductID, - PriceRatio: req.PriceRatio, - PriceIncreaseAmount: req.PriceIncreaseAmount, - PriceRangeFrom: req.PriceRangeFrom, - PriceRangeTo: req.PriceRangeTo, - } - - // 插入新记录 - _, err = l.svcCtx.AgentMembershipUserConfigModel.Insert(l.ctx, nil, agentMembershipUserConfigModel) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置,插入新记录失败: %v", err) - } - return nil - } - - // 其他错误 - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置,查询记录失败: %v", err) - } - - // 记录存在,更新现有配置 - agentMembershipUserConfigModel.PriceRatio = req.PriceRatio - agentMembershipUserConfigModel.PriceIncreaseAmount = req.PriceIncreaseAmount - agentMembershipUserConfigModel.PriceRangeFrom = req.PriceRangeFrom - agentMembershipUserConfigModel.PriceRangeTo = req.PriceRangeTo - - _, err = l.svcCtx.AgentMembershipUserConfigModel.Update(l.ctx, nil, agentMembershipUserConfigModel) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置,更新记录失败: %v", err) - } - - return nil -} diff --git a/app/user/cmd/api/internal/logic/app/getappversionlogic.go b/app/user/cmd/api/internal/logic/app/getappversionlogic.go deleted file mode 100644 index 3129392..0000000 --- a/app/user/cmd/api/internal/logic/app/getappversionlogic.go +++ /dev/null @@ -1,31 +0,0 @@ -package app - -import ( - "context" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetAppVersionLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetAppVersionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAppVersionLogic { - return &GetAppVersionLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetAppVersionLogic) GetAppVersion() (resp *types.GetAppVersionResp, err error) { - return &types.GetAppVersionResp{ - Version: "1.0.0", - WgtUrl: "https://www.quannengcha.com/app_version/qnc_1.0.0.wgt", - }, nil -} diff --git a/app/user/cmd/api/internal/logic/app/healthchecklogic.go b/app/user/cmd/api/internal/logic/app/healthchecklogic.go deleted file mode 100644 index 07fd63e..0000000 --- a/app/user/cmd/api/internal/logic/app/healthchecklogic.go +++ /dev/null @@ -1,31 +0,0 @@ -package app - -import ( - "context" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type HealthCheckLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewHealthCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *HealthCheckLogic { - return &HealthCheckLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *HealthCheckLogic) HealthCheck() (resp *types.HealthCheckResp, err error) { - return &types.HealthCheckResp{ - Status: "UP", - Message: "Service is healthy HahaHa", - }, nil -} diff --git a/app/user/cmd/api/internal/logic/auth/sendsmslogic.go b/app/user/cmd/api/internal/logic/auth/sendsmslogic.go deleted file mode 100644 index 5cd1974..0000000 --- a/app/user/cmd/api/internal/logic/auth/sendsmslogic.go +++ /dev/null @@ -1,105 +0,0 @@ -package auth - -import ( - "context" - "fmt" - "math/rand" - "time" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" - dysmsapi "github.com/alibabacloud-go/dysmsapi-20170525/v3/client" - "github.com/alibabacloud-go/tea-utils/v2/service" - "github.com/alibabacloud-go/tea/tea" - "github.com/zeromicro/go-zero/core/logx" -) - -type SendSmsLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewSendSmsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendSmsLogic { - return &SendSmsLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *SendSmsLogic) SendSms(req *types.SendSmsReq) error { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 加密手机号失败: %v", err) - } - // 检查手机号是否在一分钟内已发送过验证码 - limitCodeKey := fmt.Sprintf("limit:%s:%s", req.ActionType, encryptedMobile) - exists, err := l.svcCtx.Redis.Exists(limitCodeKey) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 读取redis缓存失败: %s", encryptedMobile) - } - - if exists { - // 如果 Redis 中已经存在标记,说明在 1 分钟内请求过,返回错误 - return errors.Wrapf(xerr.NewErrMsg("一分钟内不能重复发送验证码"), "短信发送, 手机号1分钟内重复请求发送验证码: %s", encryptedMobile) - } - - code := fmt.Sprintf("%06d", rand.New(rand.NewSource(time.Now().UnixNano())).Intn(1000000)) - - // 发送短信 - smsResp, err := l.sendSmsRequest(req.Mobile, code) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 调用阿里客户端失败: %v", err) - } - if *smsResp.Body.Code != "OK" { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 阿里客户端响应失败: %s", *smsResp.Body.Message) - } - codeKey := fmt.Sprintf("%s:%s", req.ActionType, encryptedMobile) - // 将验证码保存到 Redis,设置过期时间 - err = l.svcCtx.Redis.Setex(codeKey, code, l.svcCtx.Config.VerifyCode.ValidTime) // 验证码有效期5分钟 - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 验证码设置过期时间失败: %v", err) - } - // 在 Redis 中设置 1 分钟的标记,限制重复请求 - err = l.svcCtx.Redis.Setex(limitCodeKey, code, 60) // 标记 1 分钟内不能重复请求 - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 验证码设置限制重复请求失败: %v", err) - } - return nil -} - -// CreateClient 创建阿里云短信客户端 -func (l *SendSmsLogic) CreateClient() (*dysmsapi.Client, error) { - config := &openapi.Config{ - AccessKeyId: &l.svcCtx.Config.VerifyCode.AccessKeyID, - AccessKeySecret: &l.svcCtx.Config.VerifyCode.AccessKeySecret, - } - config.Endpoint = tea.String(l.svcCtx.Config.VerifyCode.EndpointURL) - return dysmsapi.NewClient(config) -} - -// sendSmsRequest 发送短信请求 -func (l *SendSmsLogic) sendSmsRequest(mobile, code string) (*dysmsapi.SendSmsResponse, error) { - // 初始化阿里云短信客户端 - cli, err := l.CreateClient() - if err != nil { - return nil, err - } - - request := &dysmsapi.SendSmsRequest{ - SignName: tea.String(l.svcCtx.Config.VerifyCode.SignName), - TemplateCode: tea.String(l.svcCtx.Config.VerifyCode.TemplateCode), - PhoneNumbers: tea.String(mobile), - TemplateParam: tea.String(fmt.Sprintf("{\"code\":\"%s\"}", code)), - } - runtime := &service.RuntimeOptions{} - return cli.SendSmsWithOptions(request, runtime) -} diff --git a/app/user/cmd/api/internal/logic/notification/getnotificationslogic.go b/app/user/cmd/api/internal/logic/notification/getnotificationslogic.go deleted file mode 100644 index 949180f..0000000 --- a/app/user/cmd/api/internal/logic/notification/getnotificationslogic.go +++ /dev/null @@ -1,57 +0,0 @@ -package notification - -import ( - "context" - "time" - "tydata-server/common/xerr" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetNotificationsLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetNotificationsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetNotificationsLogic { - return &GetNotificationsLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetNotificationsLogic) GetNotifications() (resp *types.GetNotificationsResp, err error) { - // 获取今天的日期 - now := time.Now() - - // 获取开始和结束日期的时间戳 - todayStart := now.Format("2006-01-02") + " 00:00:00" - todayEnd := now.Format("2006-01-02") + " 23:59:59" - - // 构建查询条件 - builder := l.svcCtx.GlobalNotificationsModel.SelectBuilder(). - Where("status = ?", "active"). - Where("(start_date IS NULL OR start_date <= ?)", todayEnd). // start_date 是 NULL 或者小于等于今天结束时间 - Where("(end_date IS NULL OR end_date >= ?)", todayStart) // end_date 是 NULL 或者大于等于今天开始时间 - - notificationsModelList, findErr := l.svcCtx.GlobalNotificationsModel.FindAll(l.ctx, builder, "") - if findErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "全局通知, 查找通知失败, err:%+v", findErr) - } - - var notifications []types.Notification - copyErr := copier.Copy(¬ifications, ¬ificationsModelList) - if copyErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "全局通知, 复制结构体失败, err:%+v", copyErr) - } - - return &types.GetNotificationsResp{Notifications: notifications}, nil -} diff --git a/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go b/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go deleted file mode 100644 index eb16430..0000000 --- a/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go +++ /dev/null @@ -1,216 +0,0 @@ -package pay - -import ( - "context" - "fmt" - "net/http" - "strings" - "time" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/smartwalle/alipay/v3" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/model" - - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -type AlipayCallbackLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewAlipayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AlipayCallbackLogic { - return &AlipayCallbackLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *AlipayCallbackLogic) AlipayCallback(w http.ResponseWriter, r *http.Request) error { - notification, err := l.svcCtx.AlipayService.HandleAliPaymentNotification(r) - if err != nil { - logx.Errorf("支付宝支付回调,%v", err) - return nil - } - - // 根据订单号前缀判断订单类型 - orderNo := notification.OutTradeNo - if strings.HasPrefix(orderNo, "Q_") { - // 查询订单处理 - return l.handleQueryOrderPayment(w, notification) - } else if strings.HasPrefix(orderNo, "A_") { - // 代理会员订单处理 - return l.handleAgentVipOrderPayment(w, notification) - } else { - // 兼容旧订单,假设没有前缀的是查询订单 - return l.handleQueryOrderPayment(w, notification) - } -} - -// 处理查询订单支付 -func (l *AlipayCallbackLogic) handleQueryOrderPayment(w http.ResponseWriter, notification *alipay.Notification) error { - order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, notification.OutTradeNo) - if findOrderErr != nil { - logx.Errorf("支付宝支付回调,查找订单失败: %+v", findOrderErr) - return nil - } - - if order.Status != "pending" { - alipay.ACKNotification(w) - return nil - } - - user, err := l.svcCtx.UserModel.FindOne(l.ctx, order.UserId) - if err != nil { - logx.Errorf("支付宝支付回调,查找用户失败: %+v", err) - return nil - } - - amount := lzUtils.ToAlipayAmount(order.Amount) - if user.Inside != 1 { - // 确保订单金额和状态正确,防止重复更新 - if amount != notification.TotalAmount { - logx.Errorf("支付宝支付回调,金额不一致") - return nil - } - } - - switch notification.TradeStatus { - case alipay.TradeStatusSuccess: - order.Status = "paid" - order.PayTime = lzUtils.TimeToNullTime(time.Now()) - default: - return nil - } - - order.PlatformOrderId = lzUtils.StringToNullString(notification.TradeNo) - if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil { - logx.Errorf("支付宝支付回调,修改订单信息失败: %+v", updateErr) - return nil - } - - if order.Status == "paid" { - if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil { - logx.Errorf("异步任务调度失败: %v", asyncErr) - return asyncErr - } - } - - alipay.ACKNotification(w) - return nil -} - -// 处理代理会员订单支付 -func (l *AlipayCallbackLogic) handleAgentVipOrderPayment(w http.ResponseWriter, notification *alipay.Notification) error { - agentOrder, findAgentOrderErr := l.svcCtx.AgentMembershipRechargeOrderModel.FindOneByOrderNo(l.ctx, notification.OutTradeNo) - if findAgentOrderErr != nil { - logx.Errorf("支付宝支付回调,查找代理会员订单失败: %+v", findAgentOrderErr) - return nil - } - - if agentOrder.Status != "pending" { - alipay.ACKNotification(w) - return nil - } - - user, err := l.svcCtx.UserModel.FindOne(l.ctx, agentOrder.UserId) - if err != nil { - logx.Errorf("支付宝支付回调,查找用户失败: %+v", err) - return nil - } - - amount := lzUtils.ToAlipayAmount(agentOrder.Amount) - if user.Inside != 1 { - // 确保订单金额和状态正确,防止重复更新 - if amount != notification.TotalAmount { - logx.Errorf("支付宝支付回调,金额不一致") - return nil - } - } - - switch notification.TradeStatus { - case alipay.TradeStatusSuccess: - agentOrder.Status = "paid" - default: - return nil - } - - if agentOrder.Status == "paid" { - err = l.svcCtx.AgentModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { - agentModel, err := l.svcCtx.AgentModel.FindOne(transCtx, agentOrder.AgentId) - if err != nil { - return fmt.Errorf("查找代理信息失败: %+v", err) - } - agentOrder.PlatformOrderId = lzUtils.StringToNullString(notification.TradeNo) - if updateErr := l.svcCtx.AgentMembershipRechargeOrderModel.UpdateWithVersion(l.ctx, nil, agentOrder); updateErr != nil { - return fmt.Errorf("修改代理会员订单信息失败: %+v", updateErr) - } - - // 设置会员等级 - agentModel.LevelName = agentOrder.LevelName - - // 延长会员时间 - // 检查是否是同级续费并记录到日志 - isRenewal := agentModel.LevelName == agentOrder.LevelName && agentModel.MembershipExpiryTime.Valid - if isRenewal { - logx.Infof("代理会员续费成功,会员ID:%d,等级:%s", agentModel.Id, agentModel.LevelName) - } else { - logx.Infof("代理会员新购或升级成功,会员ID:%d,等级:%s", agentModel.Id, agentModel.LevelName) - } - agentModel.MembershipExpiryTime = lzUtils.RenewMembership(agentModel.MembershipExpiryTime) - - if updateErr := l.svcCtx.AgentModel.UpdateWithVersion(l.ctx, nil, agentModel); updateErr != nil { - return fmt.Errorf("修改代理信息失败: %+v", updateErr) - } - return nil - }) - if err != nil { - logx.Errorf("支付宝支付回调,处理代理会员订单失败: %+v", err) - refundErr := l.handleRefund(agentOrder) - if refundErr != nil { - logx.Errorf("支付宝支付回调,退款失败: %+v", refundErr) - } - return nil - } - } - - alipay.ACKNotification(w) - return nil -} - -func (l *AlipayCallbackLogic) handleRefund(order *model.AgentMembershipRechargeOrder) error { - ctx := context.Background() - // 退款 - if order.PaymentMethod == "wechat" { - refundErr := l.svcCtx.WechatPayService.WeChatRefund(ctx, order.OrderNo, order.Amount, order.Amount) - if refundErr != nil { - return refundErr - } - } else { - refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount) - if refundErr != nil { - return refundErr - } - if refund.IsSuccess() { - logx.Errorf("支付宝退款成功, orderID: %d", order.Id) - // 更新订单状态为退款 - order.Status = "refunded" - updateOrderErr := l.svcCtx.AgentMembershipRechargeOrderModel.UpdateWithVersion(ctx, nil, order) - if updateOrderErr != nil { - logx.Errorf("更新订单状态失败,订单ID: %d, 错误: %v", order.Id, updateOrderErr) - return fmt.Errorf("更新订单状态失败: %v", updateOrderErr) - } - return nil - } else { - logx.Errorf("支付宝退款失败:%v", refundErr) - return refundErr - } - // 直接成功 - } - return nil -} diff --git a/app/user/cmd/api/internal/logic/pay/iapcallbacklogic.go b/app/user/cmd/api/internal/logic/pay/iapcallbacklogic.go deleted file mode 100644 index 4958073..0000000 --- a/app/user/cmd/api/internal/logic/pay/iapcallbacklogic.go +++ /dev/null @@ -1,82 +0,0 @@ -package pay - -import ( - "context" - "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/pkg/errors" - - "github.com/zeromicro/go-zero/core/logx" -) - -type IapCallbackLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewIapCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *IapCallbackLogic { - return &IapCallbackLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *IapCallbackLogic) IapCallback(req *types.IapCallbackReq) error { - // Step 1: 查找订单 - order, findOrderErr := l.svcCtx.OrderModel.FindOne(l.ctx, req.OrderID) - if findOrderErr != nil { - logx.Errorf("苹果内购支付回调,查找订单失败: %+v", findOrderErr) - return nil - } - - // Step 2: 验证订单状态 - if order.Status != "pending" { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "苹果内购支付回调, 订单状态异常: %+v", order) - } - - // Step 3: 调用 VerifyReceipt 验证苹果支付凭证 - //receipt := req.TransactionReceipt // 从请求中获取支付凭证 - //verifyResponse, verifyErr := l.svcCtx.ApplePayService.VerifyReceipt(l.ctx, receipt) - //if verifyErr != nil { - // return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "苹果内购支付回调, 验证订单异常: %+v", verifyErr) - //} - - // Step 4: 验证订单 - //product, findProductErr := l.svcCtx.ProductModel.FindOne(l.ctx, order.Id) - //if findProductErr != nil { - // return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "苹果内购支付回调, 获取订单相关商品失败: %+v", findProductErr) - //} - //isProductMatched := false - //appleProductID := l.svcCtx.ApplePayService.GetIappayAppID(product.ProductEn) - //for _, item := range verifyResponse.Receipt.InApp { - // if item.ProductID == appleProductID { - // isProductMatched = true - // order.PlatformOrderId = lzUtils.StringToNullString(item.TransactionID) // 记录交易 ID - // break - // } - //} - //if !isProductMatched { - // return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "苹果内购支付回调, 商品 ID 不匹配,订单 ID: %d, 回调苹果商品 ID: %s", order.Id, verifyResponse.Receipt.InApp[0].ProductID) - //} - - // Step 5: 更新订单状态 mm - order.Status = "paid" - order.PayTime = lzUtils.TimeToNullTime(time.Now()) - - // 更新订单到数据库 - if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "苹果内购支付回调, 修改订单信息失败: %+v", updateErr) - } - - // Step 6: 处理订单完成后的逻辑 - if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "苹果内购支付回调,异步任务调度失败: %v", asyncErr) - } - return nil -} diff --git a/app/user/cmd/api/internal/logic/pay/paymentchecklogic.go b/app/user/cmd/api/internal/logic/pay/paymentchecklogic.go deleted file mode 100644 index 26a0962..0000000 --- a/app/user/cmd/api/internal/logic/pay/paymentchecklogic.go +++ /dev/null @@ -1,49 +0,0 @@ -package pay - -import ( - "context" - "strings" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" -) - -type PaymentCheckLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewPaymentCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentCheckLogic { - return &PaymentCheckLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *PaymentCheckLogic) PaymentCheck(req *types.PaymentCheckReq) (resp *types.PaymentCheckResp, err error) { - if strings.HasPrefix(req.OrderNo, "A_") { - order, err := l.svcCtx.AgentMembershipRechargeOrderModel.FindOneByOrderNo(l.ctx, req.OrderNo) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询订单失败: %v", err) - } - return &types.PaymentCheckResp{ - Type: "agent_vip", - Status: order.Status, - }, nil - } else { - order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询订单失败: %v", err) - } - return &types.PaymentCheckResp{ - Type: "query", - Status: order.Status, - }, nil - } -} diff --git a/app/user/cmd/api/internal/logic/pay/paymentlogic.go b/app/user/cmd/api/internal/logic/pay/paymentlogic.go deleted file mode 100644 index ccc33cd..0000000 --- a/app/user/cmd/api/internal/logic/pay/paymentlogic.go +++ /dev/null @@ -1,227 +0,0 @@ -package pay - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/redis/go-redis/v9" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -type PaymentLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} -type PaymentTypeResp struct { - amount float64 - outTradeNo string - description string -} - -func NewPaymentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentLogic { - return &PaymentLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, err error) { - var paymentTypeResp *PaymentTypeResp - var prepayData interface{} - l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { - switch req.PayType { - case "agent_vip": - paymentTypeResp, err = l.AgentVipOrderPayment(req, session) - if err != nil { - return err - } - - case "query": - paymentTypeResp, err = l.QueryOrderPayment(req, session) - if err != nil { - return err - } - } - - var createOrderErr error - if req.PayMethod == "wechat" { - prepayData, createOrderErr = l.svcCtx.WechatPayService.CreateWechatOrder(l.ctx, paymentTypeResp.amount, paymentTypeResp.description, paymentTypeResp.outTradeNo) - } else if req.PayMethod == "alipay" { - prepayData, createOrderErr = l.svcCtx.AlipayService.CreateAlipayOrder(l.ctx, paymentTypeResp.amount, paymentTypeResp.description, paymentTypeResp.outTradeNo) - } else if req.PayMethod == "appleiap" { - prepayData = l.svcCtx.ApplePayService.GetIappayAppID(paymentTypeResp.outTradeNo) - } - if createOrderErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 创建支付订单失败: %+v", createOrderErr) - } - return nil - }) - if err != nil { - return nil, err - } - switch v := prepayData.(type) { - case string: - // 如果 prepayData 是字符串类型,直接返回 - return &types.PaymentResp{PrepayId: v, OrderNo: paymentTypeResp.outTradeNo}, nil - default: - return &types.PaymentResp{PrepayData: prepayData, OrderNo: paymentTypeResp.outTradeNo}, nil - } -} - -func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Session) (resp *PaymentTypeResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取用户信息失败, %+v", getUidErr) - } - outTradeNo := req.Id - redisKey := fmt.Sprintf(types.QueryCacheKey, userID, outTradeNo) - cache, cacheErr := l.svcCtx.Redis.GetCtx(l.ctx, redisKey) - if cacheErr != nil { - if cacheErr == redis.Nil { - return nil, errors.Wrapf(xerr.NewErrMsg("订单已过期"), "生成订单, 缓存不存在, %+v", cacheErr) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取缓存失败, %+v", cacheErr) - } - var data types.QueryCacheLoad - err = json.Unmarshal([]byte(cache), &data) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 解析缓存内容失败, %v", err) - } - - product, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, data.Product) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查找产品错误: %v", err) - } - - var amount float64 - user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取用户信息失败: %v", err) - } - - if data.AgentIdentifier != "" { - agentLinkModel, findAgentLinkErr := l.svcCtx.AgentLinkModel.FindOneByLinkIdentifier(l.ctx, data.AgentIdentifier) - if findAgentLinkErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取代理订单失败: %+v", findAgentLinkErr) - } - amount = agentLinkModel.Price - } else { - amount = product.SellPrice - } - - if user.Inside == 1 { - amount = 0.01 - } - var orderID int64 - order := model.Order{ - OrderNo: outTradeNo, - UserId: userID, - ProductId: product.Id, - PaymentPlatform: req.PayMethod, - PaymentScene: "app", - Amount: amount, - Status: "pending", - } - orderInsertResult, insertOrderErr := l.svcCtx.OrderModel.Insert(l.ctx, session, &order) - if insertOrderErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存订单失败: %+v", insertOrderErr) - } - insertedOrderID, lastInsertIdErr := orderInsertResult.LastInsertId() - if lastInsertIdErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取保存订单ID失败: %+v", lastInsertIdErr) - } - orderID = insertedOrderID - - if data.AgentIdentifier != "" { - agent, parsingErr := l.agentParsing(data.AgentIdentifier) - if parsingErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 解析代理标识符失败: %+v", parsingErr) - } - var agentOrder model.AgentOrder - agentOrder.OrderId = orderID - agentOrder.AgentId = agent.AgentID - _, agentOrderInsert := l.svcCtx.AgentOrderModel.Insert(l.ctx, session, &agentOrder) - if agentOrderInsert != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存代理订单失败: %+v", agentOrderInsert) - } - } - return &PaymentTypeResp{amount: amount, outTradeNo: outTradeNo, description: product.ProductName}, nil -} -func (l *PaymentLogic) AgentVipOrderPayment(req *types.PaymentReq, session sqlx.Session) (resp *PaymentTypeResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取用户信息失败, %+v", getUidErr) - } - user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取用户信息失败: %v", err) - } - // 查询用户代理信息 - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) - } - redisKey := fmt.Sprintf(types.AgentVipCacheKey, userID, req.Id) - cache, cacheErr := l.svcCtx.Redis.GetCtx(l.ctx, redisKey) - if cacheErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取缓存失败, %+v", cacheErr) - } - var agentVipCache types.AgentVipCache - err = json.Unmarshal([]byte(cache), &agentVipCache) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 解析缓存内容失败, %+v", err) - } - agentMembershipConfig, err := l.svcCtx.AgentMembershipConfigModel.FindOneByLevelName(l.ctx, agentVipCache.Type) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取代理会员配置失败, %+v", err) - } - - amount := agentMembershipConfig.Price.Float64 - if user.Inside == 1 { - amount = 0.01 - } - agentMembershipRechargeOrder := model.AgentMembershipRechargeOrder{ - OrderNo: req.Id, - UserId: userID, - AgentId: agentModel.Id, - Amount: amount, - PaymentMethod: req.PayMethod, - LevelName: agentVipCache.Type, - Status: "pending", - } - _, err = l.svcCtx.AgentMembershipRechargeOrderModel.Insert(l.ctx, session, &agentMembershipRechargeOrder) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存代理会员充值订单失败: %+v", err) - } - return &PaymentTypeResp{amount: amount, outTradeNo: req.Id, description: fmt.Sprintf("%s代理会员充值", agentMembershipConfig.LevelName)}, nil -} -func (l *PaymentLogic) agentParsing(agentIdentifier string) (*types.AgentIdentifier, error) { - key, decodeErr := hex.DecodeString("8e3e7a2f60edb49221e953b9c029ed10") - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取AES密钥失败: %+v", decodeErr) - } - // Encrypt the params - - encrypted, err := crypto.AesDecryptURL(agentIdentifier, key) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, %v", err) - } - var agentIdentifierStruct types.AgentIdentifier - err = json.Unmarshal(encrypted, &agentIdentifierStruct) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务,反序列化失败 %v", err) - } - return &agentIdentifierStruct, nil -} diff --git a/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go b/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go deleted file mode 100644 index 6f5a11d..0000000 --- a/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go +++ /dev/null @@ -1,215 +0,0 @@ -package pay - -import ( - "context" - "fmt" - "net/http" - "strings" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/model" - "tydata-server/pkg/lzkit/lzUtils" - - "tydata-server/app/user/cmd/api/internal/svc" - - "github.com/wechatpay-apiv3/wechatpay-go/services/payments" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -type WechatPayCallbackLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewWechatPayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WechatPayCallbackLogic { - return &WechatPayCallbackLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *WechatPayCallbackLogic) WechatPayCallback(w http.ResponseWriter, r *http.Request) error { - notification, err := l.svcCtx.WechatPayService.HandleWechatPayNotification(l.ctx, r) - if err != nil { - logx.Errorf("微信支付回调,%v", err) - return nil - } - - // 根据订单号前缀判断订单类型 - orderNo := *notification.OutTradeNo - if strings.HasPrefix(orderNo, "Q_") { - // 查询订单处理 - return l.handleQueryOrderPayment(w, notification) - } else if strings.HasPrefix(orderNo, "A_") { - // 代理会员订单处理 - return l.handleAgentVipOrderPayment(w, notification) - } else { - // 兼容旧订单,假设没有前缀的是查询订单 - return l.handleQueryOrderPayment(w, notification) - } -} - -// 处理查询订单支付 -func (l *WechatPayCallbackLogic) handleQueryOrderPayment(w http.ResponseWriter, notification *payments.Transaction) error { - order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo) - if findOrderErr != nil { - logx.Errorf("微信支付回调,查找订单信息失败: %+v", findOrderErr) - return nil - } - - amount := lzUtils.ToWechatAmount(order.Amount) - if amount != *notification.Amount.Total { - logx.Errorf("微信支付回调,金额不一致") - return nil - } - - if order.Status != "pending" { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("success")) - return nil - } - - switch *notification.TradeState { - case service.TradeStateSuccess: - order.Status = "paid" - order.PayTime = lzUtils.TimeToNullTime(time.Now()) - case service.TradeStateClosed: - order.Status = "closed" - order.CloseTime = lzUtils.TimeToNullTime(time.Now()) - case service.TradeStateRevoked: - order.Status = "failed" - default: - return nil - } - - order.PlatformOrderId = lzUtils.StringToNullString(*notification.TransactionId) - if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil { - logx.Errorf("微信支付回调,更新订单失败%+v", updateErr) - return nil - } - - if order.Status == "paid" { - if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil { - logx.Errorf("异步任务调度失败: %v", asyncErr) - return asyncErr - } - } - - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("success")) - return nil -} - -// 处理代理会员订单支付 -func (l *WechatPayCallbackLogic) handleAgentVipOrderPayment(w http.ResponseWriter, notification *payments.Transaction) error { - agentOrder, findAgentOrderErr := l.svcCtx.AgentMembershipRechargeOrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo) - if findAgentOrderErr != nil { - logx.Errorf("微信支付回调,查找代理会员订单失败: %+v", findAgentOrderErr) - return nil - } - - if agentOrder.Status != "pending" { - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("success")) - return nil - } - - user, err := l.svcCtx.UserModel.FindOne(l.ctx, agentOrder.UserId) - if err != nil { - logx.Errorf("微信支付回调,查找用户失败: %+v", err) - return nil - } - - amount := lzUtils.ToWechatAmount(agentOrder.Amount) - if user.Inside != 1 { - if amount != *notification.Amount.Total { - logx.Errorf("微信支付回调,金额不一致") - return nil - } - } - - switch *notification.TradeState { - case service.TradeStateSuccess: - agentOrder.Status = "paid" - default: - return nil - } - - if agentOrder.Status == "paid" { - err = l.svcCtx.AgentModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { - agentModel, err := l.svcCtx.AgentModel.FindOne(transCtx, agentOrder.AgentId) - if err != nil { - return fmt.Errorf("查找代理信息失败: %+v", err) - } - - agentOrder.PlatformOrderId = lzUtils.StringToNullString(*notification.TransactionId) - if updateErr := l.svcCtx.AgentMembershipRechargeOrderModel.UpdateWithVersion(l.ctx, nil, agentOrder); updateErr != nil { - return fmt.Errorf("修改代理会员订单信息失败: %+v", updateErr) - } - - // 设置会员等级 - agentModel.LevelName = agentOrder.LevelName - - // 延长会员时间 - isRenewal := agentModel.LevelName == agentOrder.LevelName && agentModel.MembershipExpiryTime.Valid - if isRenewal { - logx.Infof("代理会员续费成功,会员ID:%d,等级:%s", agentModel.Id, agentModel.LevelName) - } else { - logx.Infof("代理会员新购或升级成功,会员ID:%d,等级:%s", agentModel.Id, agentModel.LevelName) - } - agentModel.MembershipExpiryTime = lzUtils.RenewMembership(agentModel.MembershipExpiryTime) - - if updateErr := l.svcCtx.AgentModel.UpdateWithVersion(l.ctx, nil, agentModel); updateErr != nil { - return fmt.Errorf("修改代理信息失败: %+v", updateErr) - } - return nil - }) - - if err != nil { - logx.Errorf("微信支付回调,处理代理会员订单失败: %+v", err) - refundErr := l.handleRefund(agentOrder) - if refundErr != nil { - logx.Errorf("微信支付回调,退款失败: %+v", refundErr) - } - return nil - } - } - - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("success")) - return nil -} - -func (l *WechatPayCallbackLogic) handleRefund(order *model.AgentMembershipRechargeOrder) error { - ctx := context.Background() - // 退款 - if order.PaymentMethod == "wechat" { - refundErr := l.svcCtx.WechatPayService.WeChatRefund(ctx, order.OrderNo, order.Amount, order.Amount) - if refundErr != nil { - return refundErr - } - } else { - refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount) - if refundErr != nil { - return refundErr - } - if refund.IsSuccess() { - logx.Errorf("支付宝退款成功, orderID: %d", order.Id) - // 更新订单状态为退款 - order.Status = "refunded" - updateOrderErr := l.svcCtx.AgentMembershipRechargeOrderModel.UpdateWithVersion(ctx, nil, order) - if updateOrderErr != nil { - logx.Errorf("更新订单状态失败,订单ID: %d, 错误: %v", order.Id, updateOrderErr) - return fmt.Errorf("更新订单状态失败: %v", updateOrderErr) - } - return nil - } else { - logx.Errorf("支付宝退款失败:%v", refundErr) - return refundErr - } - } - return nil -} diff --git a/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go b/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go deleted file mode 100644 index 16ef28c..0000000 --- a/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go +++ /dev/null @@ -1,55 +0,0 @@ -package pay - -import ( - "context" - "net/http" - "tydata-server/app/user/cmd/api/internal/svc" - - "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" - "github.com/zeromicro/go-zero/core/logx" -) - -type WechatPayRefundCallbackLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewWechatPayRefundCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WechatPayRefundCallbackLogic { - return &WechatPayRefundCallbackLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *WechatPayRefundCallbackLogic) WechatPayRefundCallback(w http.ResponseWriter, r *http.Request) error { - notification, err := l.svcCtx.WechatPayService.HandleRefundNotification(l.ctx, r) - if err != nil { - logx.Errorf("微信退款回调,%v", err) - return nil - } - order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo) - if findOrderErr != nil { - logx.Errorf("微信退款回调,查找订单信息失败: %+v", findOrderErr) - return nil - } - - switch *notification.Status { - case refunddomestic.STATUS_SUCCESS: - order.Status = "refunded" - case refunddomestic.STATUS_ABNORMAL: - // 异常 - return nil - default: - return nil - } - if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil { - logx.Errorf("微信退款回调,更新订单失败%+v", updateErr) - return nil - } - // 响应微信回调成功 - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte("success")) // 确保只写入一次响应 - return nil -} diff --git a/app/user/cmd/api/internal/logic/product/getproductappbyenlogic.go b/app/user/cmd/api/internal/logic/product/getproductappbyenlogic.go deleted file mode 100644 index 16688d9..0000000 --- a/app/user/cmd/api/internal/logic/product/getproductappbyenlogic.go +++ /dev/null @@ -1,75 +0,0 @@ -package product - -import ( - "context" - "tydata-server/app/user/model" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/mr" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetProductAppByEnLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetProductAppByEnLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetProductAppByEnLogic { - return &GetProductAppByEnLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetProductAppByEnLogic) GetProductAppByEn(req *types.GetProductByEnRequest) (resp *types.ProductResponse, err error) { - productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.ProductEn) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品错误: %v", err) - } - - build := l.svcCtx.ProductFeatureModel.SelectBuilder().Where(squirrel.Eq{ - "product_id": productModel.Id, - }) - productFeatureAll, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, build, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品关联错误: %v", err) - } - var product types.Product - err = copier.Copy(&product, productModel) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, 用户信息结构体复制失败, %v", err) - } - mr.MapReduceVoid(func(source chan<- interface{}) { - for _, productFeature := range productFeatureAll { - source <- productFeature.FeatureId - } - }, func(item interface{}, writer mr.Writer[*model.Feature], cancel func(error)) { - id := item.(int64) - - feature, findFeatureErr := l.svcCtx.FeatureModel.FindOne(l.ctx, id) - if findFeatureErr != nil { - logx.WithContext(l.ctx).Errorf("产品查询, 查找关联feature错误: %d, err:%v", id, findFeatureErr) - return - } - if feature != nil && feature.Id > 0 { - writer.Write(feature) - } - }, func(pipe <-chan *model.Feature, cancel func(error)) { - for item := range pipe { - var feature types.Feature - _ = copier.Copy(&feature, item) - product.Features = append(product.Features, feature) - } - }) - - return &types.ProductResponse{Product: product}, nil -} diff --git a/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go b/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go deleted file mode 100644 index b980710..0000000 --- a/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go +++ /dev/null @@ -1,75 +0,0 @@ -package product - -import ( - "context" - "tydata-server/app/user/model" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/mr" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetProductByEnLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetProductByEnLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetProductByEnLogic { - return &GetProductByEnLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetProductByEnLogic) GetProductByEn(req *types.GetProductByEnRequest) (resp *types.ProductResponse, err error) { - productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.ProductEn) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品错误: %v", err) - } - - build := l.svcCtx.ProductFeatureModel.SelectBuilder().Where(squirrel.Eq{ - "product_id": productModel.Id, - }) - productFeatureAll, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, build, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品关联错误: %v", err) - } - var product types.Product - err = copier.Copy(&product, productModel) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, 用户信息结构体复制失败, %v", err) - } - mr.MapReduceVoid(func(source chan<- interface{}) { - for _, productFeature := range productFeatureAll { - source <- productFeature.FeatureId - } - }, func(item interface{}, writer mr.Writer[*model.Feature], cancel func(error)) { - id := item.(int64) - - feature, findFeatureErr := l.svcCtx.FeatureModel.FindOne(l.ctx, id) - if findFeatureErr != nil { - logx.WithContext(l.ctx).Errorf("产品查询, 查找关联feature错误: %d, err:%v", id, findFeatureErr) - return - } - if feature != nil && feature.Id > 0 { - writer.Write(feature) - } - }, func(pipe <-chan *model.Feature, cancel func(error)) { - for item := range pipe { - var feature types.Feature - _ = copier.Copy(&feature, item) - product.Features = append(product.Features, feature) - } - }) - - return &types.ProductResponse{Product: product}, nil -} diff --git a/app/user/cmd/api/internal/logic/product/getproductbyidlogic.go b/app/user/cmd/api/internal/logic/product/getproductbyidlogic.go deleted file mode 100644 index 634c747..0000000 --- a/app/user/cmd/api/internal/logic/product/getproductbyidlogic.go +++ /dev/null @@ -1,30 +0,0 @@ -package product - -import ( - "context" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetProductByIDLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetProductByIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetProductByIDLogic { - return &GetProductByIDLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetProductByIDLogic) GetProductByID(req *types.GetProductByIDRequest) (resp *types.ProductResponse, err error) { - // todo: add your logic here and delete this line - - return -} diff --git a/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go b/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go deleted file mode 100644 index 0ef26bb..0000000 --- a/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go +++ /dev/null @@ -1,155 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "fmt" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryDetailByOrderNoLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryDetailByOrderNoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryDetailByOrderNoLogic { - return &QueryDetailByOrderNoLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailByOrderNoReq) (resp *types.QueryDetailByOrderNoResp, err error) { - // 获取当前用户ID - userId, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败: %v", err) - } - - // 获取订单信息 - order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "报告查询, 订单不存在: %v", err) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) - } - - // 安全验证:确保订单属于当前用户 - if order.UserId != userId { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "无权查看此订单报告") - } - - // 检查订单状态 - if order.Status != "paid" { - return nil, errors.Wrapf(xerr.NewErrMsg("订单未支付,无法查看报告"), "") - } - - // 获取报告信息 - queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, order.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) - } - - var query types.Query - query.CreateTime = queryModel.CreateTime.Format("2006-01-02 15:04:05") - query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") - - // 解密查询数据 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", err) - } - processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) - if processParamsErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告参数处理失败: %v", processParamsErr) - } - processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) - if processErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", processErr) - } - updateFeatureAndProductFeatureErr := l.UpdateFeatureAndProductFeature(queryModel.ProductId, &query.QueryData) - if updateFeatureAndProductFeatureErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", updateFeatureAndProductFeatureErr) - } - // 复制报告数据 - err = copier.Copy(&query, queryModel) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结构体复制失败, %v", err) - } - product, err := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) - } - query.ProductName = product.ProductName - return &types.QueryDetailByOrderNoResp{ - Query: query, - }, nil -} - -func (l *QueryDetailByOrderNoLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.QueryItem) error { - // 遍历 target 数组,使用倒序遍历,以便删除元素时不影响索引 - for i := len(*target) - 1; i >= 0; i-- { - queryItem := &(*target)[i] - - // 确保 Data 为 map 类型 - data, ok := queryItem.Data.(map[string]interface{}) - if !ok { - return fmt.Errorf("queryItem.Data 必须是 map[string]interface{} 类型") - } - - // 从 Data 中获取 apiID - apiID, ok := data["apiID"].(string) - if !ok { - return fmt.Errorf("queryItem.Data 中的 apiID 必须是字符串类型") - } - - // 查询 Feature - feature, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, apiID) - if err != nil { - // 如果 Feature 查不到,也要删除当前 QueryItem - *target = append((*target)[:i], (*target)[i+1:]...) - continue - } - - // 查询 ProductFeatureModel - builder := l.svcCtx.ProductFeatureModel.SelectBuilder().Where("product_id = ?", productID) - productFeatures, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "") - if err != nil { - return fmt.Errorf("查询 ProductFeatureModel 错误: %v", err) - } - - // 遍历 productFeatures,找到与 feature.ID 关联且 enable == 1 的项 - var featureData map[string]interface{} - // foundFeature := false - sort := 0 - for _, pf := range productFeatures { - if pf.FeatureId == feature.Id { // 确保和 Feature 关联 - sort = int(pf.Sort) - break // 找到第一个符合条件的就退出循环 - } - } - featureData = map[string]interface{}{ - "featureName": feature.Name, - "sort": sort, - } - - // 更新 queryItem 的 Feature 字段(不是数组) - queryItem.Feature = featureData - } - - return nil -} diff --git a/app/user/cmd/api/internal/logic/query/queryexamplelogic copy.go b/app/user/cmd/api/internal/logic/query/queryexamplelogic copy.go deleted file mode 100644 index 7e3b370..0000000 --- a/app/user/cmd/api/internal/logic/query/queryexamplelogic copy.go +++ /dev/null @@ -1,152 +0,0 @@ -package query - -// import ( -// "context" -// "encoding/hex" -// "fmt" -// "tydata-server/app/user/cmd/api/internal/svc" -// "tydata-server/app/user/cmd/api/internal/types" -// "tydata-server/common/xerr" - -// "github.com/jinzhu/copier" -// "github.com/pkg/errors" - -// "github.com/zeromicro/go-zero/core/logx" -// ) - -// type QueryExampleLogic struct { -// logx.Logger -// ctx context.Context -// svcCtx *svc.ServiceContext -// } - -// func NewQueryExampleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryExampleLogic { -// return &QueryExampleLogic{ -// Logger: logx.WithContext(ctx), -// ctx: ctx, -// svcCtx: svcCtx, -// } -// } - -// func (l *QueryExampleLogic) QueryExample(req *types.QueryExampleReq) (resp *types.QueryExampleResp, err error) { -// var exampleID int64 -// switch req.Feature { -// case "backgroundcheck": -// exampleID = 508 -// case "companyinfo": -// exampleID = 506 -// case "homeservice": -// exampleID = 504 -// case "marriage": -// exampleID = 501 -// case "preloanbackgroundcheck": -// exampleID = 509 -// case "rentalinfo": -// exampleID = 505 -// case "riskassessment": -// exampleID = 503 - -// default: -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "示例报告, 获取示例报告失败: %v", err) -// } -// queryModel, err := l.svcCtx.QueryModel.FindOne(l.ctx, exampleID) -// if err != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "示例报告, 获取示例报告失败: %v", err) -// } -// var query types.Query -// query.CreateTime = queryModel.CreateTime.Format("2006-01-02 15:04:05") -// query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") - -// // 解密查询数据 -// secretKey := l.svcCtx.Config.Encrypt.SecretKey -// key, decodeErr := hex.DecodeString(secretKey) -// if decodeErr != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取AES解密解药失败, %v", err) -// } -// processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) -// if processParamsErr != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 报告参数处理失败: %v", processParamsErr) -// } -// processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) -// if processErr != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 报告结果处理失败: %v", processErr) -// } -// updateFeatureAndProductFeatureErr := l.UpdateFeatureAndProductFeature(queryModel.ProductId, &query.QueryData) -// if updateFeatureAndProductFeatureErr != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", updateFeatureAndProductFeatureErr) -// } -// // 复制报告数据 -// err = copier.Copy(&query, queryModel) -// if err != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 报告结构体复制失败, %v", err) -// } -// product, err := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) -// if err != nil { -// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取商品信息失败, %v", err) -// } -// query.ProductName = product.ProductName -// return &types.QueryExampleResp{ -// Query: query, -// }, nil -// } -// func (l *QueryExampleLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.QueryItem) error { -// // 遍历 target 数组,使用倒序遍历,以便删除元素时不影响索引 -// for i := len(*target) - 1; i >= 0; i-- { -// queryItem := &(*target)[i] - -// // 确保 Data 为 map 类型 -// data, ok := queryItem.Data.(map[string]interface{}) -// if !ok { -// return fmt.Errorf("queryItem.Data 必须是 map[string]interface{} 类型") -// } - -// // 从 Data 中获取 apiID -// apiID, ok := data["apiID"].(string) -// if !ok { -// return fmt.Errorf("queryItem.Data 中的 apiID 必须是字符串类型") -// } - -// // 查询 Feature -// feature, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, apiID) -// if err != nil { -// // 如果 Feature 查不到,也要删除当前 QueryItem -// *target = append((*target)[:i], (*target)[i+1:]...) -// continue -// } - -// // 查询 ProductFeatureModel -// builder := l.svcCtx.ProductFeatureModel.SelectBuilder().Where("product_id = ?", productID) -// productFeatures, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "") -// if err != nil { -// return fmt.Errorf("查询 ProductFeatureModel 错误: %v", err) -// } - -// // 遍历 productFeatures,找到与 feature.ID 关联且 enable == 1 的项 -// var featureData map[string]interface{} -// foundFeature := false - -// for _, pf := range productFeatures { -// if pf.FeatureId == feature.Id { // 确保和 Feature 关联 -// foundFeature = true -// if pf.Enable == 1 { -// featureData = map[string]interface{}{ -// "featureName": feature.Name, -// "sort": pf.Sort, -// } -// break // 找到第一个符合条件的就退出循环 -// } -// } -// } - -// // 如果没有符合条件的 feature 或者 featureData 为空,则删除当前 queryItem -// if !foundFeature || featureData == nil { -// *target = append((*target)[:i], (*target)[i+1:]...) -// continue -// } - -// // 更新 queryItem 的 Feature 字段(不是数组) -// queryItem.Feature = featureData -// } - -// return nil -// } diff --git a/app/user/cmd/api/internal/logic/query/queryexamplelogic.go b/app/user/cmd/api/internal/logic/query/queryexamplelogic.go deleted file mode 100644 index 98e857d..0000000 --- a/app/user/cmd/api/internal/logic/query/queryexamplelogic.go +++ /dev/null @@ -1,110 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/bytedance/sonic" - "github.com/pkg/errors" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryExampleLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryExampleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryExampleLogic { - return &QueryExampleLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryExampleLogic) QueryExample(req *types.QueryExampleReq) (resp *types.QueryExampleResp, err error) { - // 根据产品特性标识获取产品信息 - product, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.Feature) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取商品信息失败, %v", err) - } - - // 创建一个空的Query结构体来存储结果 - query := types.Query{ - ProductName: product.ProductName, - QueryData: make([]types.QueryItem, 0), - QueryParams: make(map[string]interface{}), - } - query.QueryParams = map[string]interface{}{ - "id_card": "45000000000000000", - "mobile": "13700000000", - "name": "张老三", - } - // 查询ProductFeatureModel获取产品相关的功能列表 - builder := l.svcCtx.ProductFeatureModel.SelectBuilder().Where("product_id = ?", product.Id) - productFeatures, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 查询 ProductFeatureModel 错误: %v", err) - } - // 从每个启用的特性获取示例数据并合并 - for _, pf := range productFeatures { - if pf.Enable != 1 { - continue // 跳过未启用的特性 - } - - // 根据特性ID查找示例数据 - example, err := l.svcCtx.ExampleModel.FindOneByFeatureId(l.ctx, pf.FeatureId) - if err != nil { - logx.Infof("示例报告, 特性ID %d 无示例数据: %v", pf.FeatureId, err) - continue // 如果没有示例数据就跳过 - } - - // 获取对应的Feature信息 - feature, err := l.svcCtx.FeatureModel.FindOne(l.ctx, pf.FeatureId) - if err != nil { - logx.Infof("示例报告, 无法获取特性ID %d 的信息: %v", pf.FeatureId, err) - continue - } - - var queryItem types.QueryItem - - // 解密查询数据 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取AES解密解药失败, %v", err) - } - // 解析示例内容 - if example.Content == "000" { - queryItem.Data = example.Content - } else { - // 解密数据 - decryptedData, decryptErr := crypto.AesDecrypt(example.Content, key) - if decryptErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 解密数据失败: %v", decryptErr) - } - err = sonic.Unmarshal([]byte(decryptedData), &queryItem.Data) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 解析示例内容失败: %v", err) - } - } - - // 添加特性信息 - queryItem.Feature = map[string]interface{}{ - "featureName": feature.Name, - "sort": pf.Sort, - } - // 添加到查询数据中 - query.QueryData = append(query.QueryData, queryItem) - } - - return &types.QueryExampleResp{ - Query: query, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/query/querygeneratesharelinklogic.go b/app/user/cmd/api/internal/logic/query/querygeneratesharelinklogic.go deleted file mode 100644 index 5deb818..0000000 --- a/app/user/cmd/api/internal/logic/query/querygeneratesharelinklogic.go +++ /dev/null @@ -1,111 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "time" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryGenerateShareLinkLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryGenerateShareLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryGenerateShareLinkLogic { - return &QueryGenerateShareLinkLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryGenerateShareLinkLogic) QueryGenerateShareLink(req *types.QueryGenerateShareLinkReq) (resp *types.QueryGenerateShareLinkResp, err error) { - userId, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 获取用户ID失败: %v", err) - } - - // 检查参数 - if (req.OrderId == nil || *req.OrderId == 0) && (req.OrderNo == nil || *req.OrderNo == "") { - return nil, errors.Wrapf(xerr.NewErrMsg("订单ID和订单号不能同时为空"), "") - } - - var order *model.Order - // 优先使用OrderId查询 - if req.OrderId != nil && *req.OrderId != 0 { - order, err = l.svcCtx.OrderModel.FindOne(l.ctx, *req.OrderId) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrMsg("订单不存在"), "") - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 获取订单失败: %v", err) - } - } else if req.OrderNo != nil && *req.OrderNo != "" { - // 使用OrderNo查询 - order, err = l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *req.OrderNo) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrMsg("订单不存在"), "") - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 获取订单失败: %v", err) - } - } else { - return nil, errors.Wrapf(xerr.NewErrMsg("订单ID和订单号不能同时为空"), "") - } - - if order.Status != model.OrderStatusPaid { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 订单未支付") - } - - query, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, order.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 获取查询失败: %v", err) - } - - if query.QueryState != model.QueryStateSuccess { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 查询未成功") - } - user, err := l.svcCtx.UserModel.FindOne(l.ctx, userId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 获取用户失败: %v", err) - } - if user.Inside != 1 { - if order.UserId != userId { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 无权操作此订单") - } - } - - expireAt := time.Now().Add(time.Duration(l.svcCtx.Config.Query.ShareLinkExpire) * time.Second) - payload := types.QueryShareLinkPayload{ - OrderId: order.Id, // 使用查询到的订单ID - ExpireAt: expireAt.Unix(), - } - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, err := hex.DecodeString(secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 解密失败: %v", err) - } - payloadBytes, err := json.Marshal(payload) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 序列化失败: %v", err) - } - encryptedPayload, err := crypto.AesEncryptURL(payloadBytes, key) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成分享链接, 加密失败: %v", err) - } - return &types.QueryGenerateShareLinkResp{ - ShareLink: encryptedPayload, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/query/querylistlogic.go b/app/user/cmd/api/internal/logic/query/querylistlogic.go deleted file mode 100644 index 748de85..0000000 --- a/app/user/cmd/api/internal/logic/query/querylistlogic.go +++ /dev/null @@ -1,70 +0,0 @@ -package query - -import ( - "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/Masterminds/squirrel" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryListLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryListLogic { - return &QueryListLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryListLogic) QueryList(req *types.QueryListReq) (resp *types.QueryListResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告列表查询, 获取用户信息失败, %+v", getUidErr) - } - - // 直接构建查询query表的条件 - build := l.svcCtx.QueryModel.SelectBuilder().Where(squirrel.Eq{ - "user_id": userID, - }) - - // 直接从query表分页查询 - queryList, total, err := l.svcCtx.QueryModel.FindPageListByPageWithTotal(l.ctx, build, req.Page, req.PageSize, "create_time DESC") - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告列表查询, 查找报告列表错误, %+v", err) - } - - var list []types.Query - if len(queryList) > 0 { - for _, queryModel := range queryList { - var query types.Query - query.CreateTime = queryModel.CreateTime.Format("2006-01-02 15:04:05") - query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") - copyErr := copier.Copy(&query, queryModel) - if copyErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告列表查询, 报告结构体复制失败, %+v", err) - } - product, findProductErr := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) - if findProductErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告列表查询, 获取商品信息失败, %+v", err) - } - query.ProductName = product.ProductName - list = append(list, query) - } - } - - return &types.QueryListResp{ - Total: total, - List: list, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go b/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go deleted file mode 100644 index 491bd24..0000000 --- a/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go +++ /dev/null @@ -1,63 +0,0 @@ -package query - -import ( - "context" - "encoding/json" - "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryProvisionalOrderLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryProvisionalOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryProvisionalOrderLogic { - return &QueryProvisionalOrderLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryProvisionalOrderLogic) QueryProvisionalOrder(req *types.QueryProvisionalOrderReq) (resp *types.QueryProvisionalOrderResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 获取用户信息失败, %+v", getUidErr) - } - redisKey := fmt.Sprintf("%d:%s", userID, req.Id) - cache, cacheErr := l.svcCtx.Redis.GetCtx(l.ctx, redisKey) - if cacheErr != nil { - return nil, cacheErr - } - var data types.QueryCache - err = json.Unmarshal([]byte(cache), &data) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 解析缓存内容失败, %v", err) - } - - productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, data.Product) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 查找产品错误: %v", err) - } - var product types.Product - err = copier.Copy(&product, productModel) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 用户信息结构体复制失败: %v", err) - } - return &types.QueryProvisionalOrderResp{ - Name: data.Name, - IdCard: data.Name, - Mobile: data.Mobile, - Product: product, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/query/queryretrylogic.go b/app/user/cmd/api/internal/logic/query/queryretrylogic.go deleted file mode 100644 index 1457019..0000000 --- a/app/user/cmd/api/internal/logic/query/queryretrylogic.go +++ /dev/null @@ -1,44 +0,0 @@ -package query - -import ( - "context" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryRetryLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryRetryLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryRetryLogic { - return &QueryRetryLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryRetryLogic) QueryRetry(req *types.QueryRetryReq) (resp *types.QueryRetryResp, err error) { - - query, err := l.svcCtx.QueryModel.FindOne(l.ctx, req.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询重试, 查找报告失败, %v", err) - } - if query.QueryState == "success" { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.LOGIN_FAILED, "该报告不能重试"), "报告查询重试, 该报告不能重试, %d", query.Id) - } - - if asyncErr := l.svcCtx.AsynqService.SendQueryTask(query.OrderId); asyncErr != nil { - logx.Errorf("异步任务调度失败: %v", asyncErr) - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询重试, 异步任务调度失败, %+v", asyncErr) - } - return -} diff --git a/app/user/cmd/api/internal/logic/query/queryserviceagentlogic.go b/app/user/cmd/api/internal/logic/query/queryserviceagentlogic.go deleted file mode 100644 index 8d8e652..0000000 --- a/app/user/cmd/api/internal/logic/query/queryserviceagentlogic.go +++ /dev/null @@ -1,27 +0,0 @@ -package query - -import ( - "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryServiceAgentLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryServiceAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryServiceAgentLogic { - return &QueryServiceAgentLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryServiceAgentLogic) QueryServiceAgent(req *types.QueryServiceReq) (resp *types.QueryServiceResp, err error) { - return &types.QueryServiceResp{}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/queryserviceapplogic.go b/app/user/cmd/api/internal/logic/query/queryserviceapplogic.go deleted file mode 100644 index 0b544df..0000000 --- a/app/user/cmd/api/internal/logic/query/queryserviceapplogic.go +++ /dev/null @@ -1,30 +0,0 @@ -package query - -import ( - "context" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryServiceAppLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryServiceAppLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryServiceAppLogic { - return &QueryServiceAppLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryServiceAppLogic) QueryServiceApp(req *types.QueryServiceReq) (resp *types.QueryServiceResp, err error) { - // todo: add your logic here and delete this line - - return -} diff --git a/app/user/cmd/api/internal/logic/query/queryservicelogic.go b/app/user/cmd/api/internal/logic/query/queryservicelogic.go deleted file mode 100644 index 9bf659a..0000000 --- a/app/user/cmd/api/internal/logic/query/queryservicelogic.go +++ /dev/null @@ -1,1422 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryServiceLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryServiceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryServiceLogic { - return &QueryServiceLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryServiceLogic) QueryService(req *types.QueryServiceReq) (resp *types.QueryServiceResp, err error) { - if req.AgentIdentifier != "" { - l.ctx = context.WithValue(l.ctx, "agentIdentifier", req.AgentIdentifier) - } else if req.App { - l.ctx = context.WithValue(l.ctx, "app", req.App) - } - return l.PreprocessLogic(req, req.Product) -} - -var productProcessors = map[string]func(*QueryServiceLogic, *types.QueryServiceReq) (*types.QueryServiceResp, error){ - "marriage": (*QueryServiceLogic).ProcessMarriageLogic, - "homeservice": (*QueryServiceLogic).ProcessHomeServiceLogic, - "riskassessment": (*QueryServiceLogic).ProcessRiskAssessmentLogic, - "companyinfo": (*QueryServiceLogic).ProcessCompanyInfoLogic, - "rentalinfo": (*QueryServiceLogic).ProcessRentalInfoLogic, - "preloanbackgroundcheck": (*QueryServiceLogic).ProcessPreLoanBackgroundCheckLogic, - "backgroundcheck": (*QueryServiceLogic).ProcessBackgroundCheckLogic, - "toc_Marriage": (*QueryServiceLogic).ProcessTocMarriageLogic, - "toc_PersonalBadRecord": (*QueryServiceLogic).ProcessTocPersonalBadRecordLogic, - "toc_ShareholderBusinessRelation": (*QueryServiceLogic).ProcessTocShareholderBusinessRelationLogic, - "toc_PersonalLawsuit": (*QueryServiceLogic).ProcessTocPersonalLawsuitLogic, - "toc_EnterpriseLawsuit": (*QueryServiceLogic).ProcessTocEnterpriseLawsuitLogic, - "toc_PhoneThreeElements": (*QueryServiceLogic).ProcessTocPhoneThreeElementsLogic, - "toc_PhoneTwoElements": (*QueryServiceLogic).ProcessTocPhoneTwoElementsLogic, - "toc_IDCardTwoElements": (*QueryServiceLogic).ProcessTocIDCardTwoElementsLogic, - "toc_NaturalLifeStatus": (*QueryServiceLogic).ProcessTocNaturalLifeStatusLogic, - "toc_PersonVehicleVerification": (*QueryServiceLogic).ProcessTocPersonVehicleVerificationLogic, - "toc_BankCardBlacklist": (*QueryServiceLogic).ProcessTocBankCardBlacklistLogic, - "toc_VehiclesUnderName": (*QueryServiceLogic).ProcessTocVehiclesUnderNameLogic, - "toc_DualMarriage": (*QueryServiceLogic).ProcessTocDualMarriageLogic, - "toc_PhoneNumberRisk": (*QueryServiceLogic).ProcessTocPhoneNumberRiskLogic, - "toc_NetworkDuration": (*QueryServiceLogic).ProcessTocNetworkDurationLogic, - "toc_PhoneSecondaryCard": (*QueryServiceLogic).ProcessTocPhoneSecondaryCardLogic, - "toc_BankCardFourElements": (*QueryServiceLogic).ProcessTocBankCardFourElementsLogic, - "toc_EnterpriseCase": (*QueryServiceLogic).ProcessTocEnterpriseCaseLogic, - "toc_PersonJudicialDishonest": (*QueryServiceLogic).ProcessTocPersonJudicialDishonestLogic, - "toc_PersonConsumptionRestriction": (*QueryServiceLogic).ProcessTocPersonConsumptionRestrictionLogic, -} - -func (l *QueryServiceLogic) PreprocessLogic(req *types.QueryServiceReq, product string) (*types.QueryServiceResp, error) { - if processor, exists := productProcessors[product]; exists { - return processor(l, req) // 调用对应的处理函数 - } - return nil, errors.New("未找到相应的处理程序") -} -func (l *QueryServiceLogic) ProcessMarriageLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "marriage", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -// 处理家政服务相关逻辑 -func (l *QueryServiceLogic) ProcessHomeServiceLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.HomeServiceReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "homeservice", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -// 处理风险评估相关逻辑 -func (l *QueryServiceLogic) ProcessRiskAssessmentLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.RiskAssessmentReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "riskassessment", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -// 处理公司信息查询相关逻辑 -func (l *QueryServiceLogic) ProcessCompanyInfoLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.CompanyInfoReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "companyinfo", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -// 处理租赁信息查询相关逻辑 -func (l *QueryServiceLogic) ProcessRentalInfoLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.RentalInfoReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "rentalinfo", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -// 处理贷前背景检查相关逻辑 -func (l *QueryServiceLogic) ProcessPreLoanBackgroundCheckLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.PreLoanBackgroundCheckReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "preloanbackgroundcheck", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -// 处理人事背调相关逻辑 -func (l *QueryServiceLogic) ProcessBackgroundCheckLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.BackgroundCheckReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - //verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - //if verifyCodeErr != nil { - // return nil, verifyCodeErr - //} - // - //// 校验三要素 - //verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - //if verifyErr != nil { - // return nil, verifyErr - //} - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - userID, err := l.GetOrCreateUser() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) - } - cacheNo, cacheDataErr := l.CacheData(params, "backgroundcheck", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.QueryServiceResp{ - Id: cacheNo, - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -func (l *QueryServiceLogic) ProcessTocMarriageLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_Marriage", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} -func (l *QueryServiceLogic) ProcessTocPersonalBadRecordLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonalBadRecord", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} -func (l *QueryServiceLogic) ProcessTocShareholderBusinessRelationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_ShareholderBusinessRelation", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} -func (l *QueryServiceLogic) ProcessTocPersonalLawsuitLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonalLawsuit", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} -func (l *QueryServiceLogic) ProcessTocEnterpriseLawsuitLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.EntLawsuitReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 缓存 - params := map[string]interface{}{ - "ent_name": data.EntName, - "ent_code": data.EntCode, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_EnterpriseLawsuit", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -func (l *QueryServiceLogic) ProcessTocPhoneThreeElementsLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后失败: %+v", DecryptDataErr) - } - - // 校验参数 - var data types.TocPhoneThreeElements - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PhoneThreeElements", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} -func (l *QueryServiceLogic) ProcessTocPhoneTwoElementsLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocPhoneTwoElements - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PhoneTwoElements", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// 身份二要素 -func (l *QueryServiceLogic) ProcessTocIDCardTwoElementsLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocIDCardTwoElements - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_IDCardTwoElements", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// 自然人生存 -func (l *QueryServiceLogic) ProcessTocNaturalLifeStatusLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocIDCardTwoElements - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_NaturalLifeStatus", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocVehiclesUnderNameLogic 名下车辆那个 -func (l *QueryServiceLogic) ProcessTocVehiclesUnderNameLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocIDCardTwoElements - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_VehiclesUnderName", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocPersonVehicleVerificationLogic 人车核验 -func (l *QueryServiceLogic) ProcessTocPersonVehicleVerificationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocPersonVehicleVerification - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "car_type": data.CarType, - "car_license": data.CarLicense, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonVehicleVerification", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocBankCardBlacklistLogic 银行卡黑名单 -func (l *QueryServiceLogic) ProcessTocBankCardBlacklistLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocBankCardBlacklist - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - "bank_card": data.BankCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_BankCardBlacklist", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocDualMarriageLogic 双人婚姻 -func (l *QueryServiceLogic) ProcessTocDualMarriageLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocDualMarriage - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "nameMan": data.NameMan, - "idCardMan": data.IDCardMan, - "nameWoman": data.NameWoman, - "idCardWoman": data.IDCardWoman, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_DualMarriage", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocPhoneNumberRiskLogic 手机号码风险 -func (l *QueryServiceLogic) ProcessTocPhoneNumberRiskLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocPhoneNumberRisk - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PhoneNumberRisk", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocNetworkDurationLogic 手机在网时长 -func (l *QueryServiceLogic) ProcessTocNetworkDurationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocPhoneNumberRisk - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "mobile": data.Mobile, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_NetworkDuration", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocPhoneSecondaryCardLogic 手机二次卡 -func (l *QueryServiceLogic) ProcessTocPhoneSecondaryCardLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocPhoneSecondaryCard - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "mobile": data.Mobile, - "startDate": data.StartDate, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PhoneSecondaryCard", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocBankCardFourElementsLogic 银行卡四要素 -func (l *QueryServiceLogic) ProcessTocBankCardFourElementsLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.TocBankCardBlacklist - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - "mobile": data.Mobile, - "bank_card": data.BankCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_BankCardFourElements", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -func (l *QueryServiceLogic) ProcessTocEnterpriseCaseLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.EntLawsuitReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 缓存 - params := map[string]interface{}{ - "ent_name": data.EntName, - "ent_code": data.EntCode, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_EnterpriseCase", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocPersonJudicialDishonestLogic 个人失信 -func (l *QueryServiceLogic) ProcessTocPersonJudicialDishonestLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonJudicialDishonest", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} - -// ProcessTocPersonConsumptionRestrictionLogic 个人限高 -func (l *QueryServiceLogic) ProcessTocPersonConsumptionRestrictionLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - - // AES解密 - decryptData, DecryptDataErr := l.DecryptData(req.Data) - if DecryptDataErr != nil { - return nil, DecryptDataErr - } - - // 校验参数 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) - } - - // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 缓存 - params := map[string]interface{}{ - "name": data.Name, - "id_card": data.IDCard, - } - cacheNo, cacheDataErr := l.CacheData(params, "toc_PersonConsumptionRestriction", userID) - if cacheDataErr != nil { - return nil, cacheDataErr - } - - return &types.QueryServiceResp{Id: cacheNo}, nil -} -func (l *QueryServiceLogic) DecryptData(data string) ([]byte, error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解密失败: %+v", aesDecryptErr) - } - return decryptData, nil -} - -// 校验验证码 -func (l *QueryServiceLogic) VerifyCode(mobile string, code string) error { - if mobile == "17776203797" && code == "123456" { - return nil - } - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(mobile, secretKey) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %+v", err) - } - codeRedisKey := fmt.Sprintf("%s:%s", "query", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "验证码过期: %s", mobile) - } - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "读取验证码redis缓存失败, mobile: %s, err: %+v", mobile, err) - } - if cacheCode != code { - return errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "验证码不正确: %s", mobile) - } - return nil -} - -// 二、三要素验证 -func (l *QueryServiceLogic) Verify(Name string, IDCard string, Mobile string) error { - //agent, ok := l.ctx.Value("agent").(bool) - //if !ok { - // agent = false - //} - if !l.svcCtx.Config.SystemConfig.ThreeVerify { - twoVerification := service.TwoFactorVerificationRequest{ - Name: Name, - IDCard: IDCard, - } - verification, err := l.svcCtx.VerificationService.TwoFactorVerificationWest(twoVerification) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "二要素验证失败: %v", err) - } - if !verification.Passed { - return errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "二要素验证不通过: %v", err) - } - } else { - // 三要素验证 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: Name, - IDCard: IDCard, - Mobile: Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "三要素验证失败: %v", err) - } - if !verification.Passed { - return errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "三要素验证不通过: %v", err) - } - } - return nil -} - -// 缓存 -func (l *QueryServiceLogic) CacheData(params map[string]interface{}, Product string, userID int64) (string, error) { - agentIdentifier, _ := l.ctx.Value("agentIdentifier").(string) - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取AES密钥失败: %+v", decodeErr) - } - paramsMarshal, marshalErr := json.Marshal(params) - if marshalErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 序列化参数失败: %+v", marshalErr) - } - encryptParams, aesEncryptErr := crypto.AesEncrypt(paramsMarshal, key) - if aesEncryptErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 加密参数失败: %+v", aesEncryptErr) - } - queryCache := types.QueryCacheLoad{ - Params: encryptParams, - Product: Product, - AgentIdentifier: agentIdentifier, - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := "Q_" + l.svcCtx.AlipayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf(types.QueryCacheKey, userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return "", cacheErr - } - return outTradeNo, nil -} - -// GetOrCreateUser 获取或创建用户 -// 1. 如果上下文中已有用户ID,直接返回 -// 2. 如果是代理查询或APP请求,创建新用户 -// 3. 其他情况返回未登录错误 -func (l *QueryServiceLogic) GetOrCreateUser() (int64, error) { - // 尝试获取用户ID - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err == nil { - return userID, nil // 已有用户ID,直接返回 - } - - // 如果不是未登录错误,说明是其他错误,直接返回 - if !ctxdata.IsNoUserIdError(err) { - return 0, err - } - - // 检查是否是代理查询或APP请求 - isAgentQuery := false - if agentID, ok := l.ctx.Value("agentIdentifier").(string); ok && agentID != "" { - isAgentQuery = true - } - if app, ok := l.ctx.Value("app").(bool); ok && app { - isAgentQuery = true - } - - // 如果不是代理查询或APP请求,返回未登录错误 - if !isAgentQuery { - return 0, ctxdata.ErrNoUserIdInCtx - } - - // 创建新用户 - return l.svcCtx.UserService.RegisterUUIDUser(l.ctx) -} diff --git a/app/user/cmd/api/internal/logic/query/querysharedetaillogic.go b/app/user/cmd/api/internal/logic/query/querysharedetaillogic.go deleted file mode 100644 index 090ec09..0000000 --- a/app/user/cmd/api/internal/logic/query/querysharedetaillogic.go +++ /dev/null @@ -1,164 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "fmt" - "time" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/bytedance/sonic" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" -) - -type QueryShareDetailLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQueryShareDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryShareDetailLogic { - return &QueryShareDetailLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QueryShareDetailLogic) QueryShareDetail(req *types.QueryShareDetailReq) (resp *types.QueryShareDetailResp, err error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", err) - } - decryptedID, decryptErr := crypto.AesDecryptURL(req.Id, key) - if decryptErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 解密数据失败: %v", decryptErr) - } - - var payload types.QueryShareLinkPayload - err = sonic.Unmarshal(decryptedID, &payload) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 解密数据失败: %v", err) - } - - // 检查分享链接是否过期 - now := time.Now().Unix() - if now > payload.ExpireAt { - return &types.QueryShareDetailResp{ - Status: "expired", - }, nil - } - - // 获取订单信息 - order, err := l.svcCtx.OrderModel.FindOne(l.ctx, payload.OrderId) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "报告查询, 订单不存在: %v", err) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) - } - - // 检查订单状态 - if order.Status != "paid" { - return nil, errors.Wrapf(xerr.NewErrMsg("订单未支付,无法查看报告"), "") - } - - // 获取报告信息 - queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, order.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) - } - - var query types.Query - query.CreateTime = queryModel.CreateTime.Format("2006-01-02 15:04:05") - query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") - - processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) - if processParamsErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告参数处理失败: %v", processParamsErr) - } - processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) - if processErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", processErr) - } - updateFeatureAndProductFeatureErr := l.UpdateFeatureAndProductFeature(queryModel.ProductId, &query.QueryData) - if updateFeatureAndProductFeatureErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", updateFeatureAndProductFeatureErr) - } - // 复制报告数据 - err = copier.Copy(&query, queryModel) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结构体复制失败, %v", err) - } - product, err := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) - } - query.ProductName = product.ProductName - return &types.QueryShareDetailResp{ - Status: "success", - Query: query, - }, nil -} - -func (l *QueryShareDetailLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.QueryItem) error { - // 遍历 target 数组,使用倒序遍历,以便删除元素时不影响索引 - for i := len(*target) - 1; i >= 0; i-- { - queryItem := &(*target)[i] - - // 确保 Data 为 map 类型 - data, ok := queryItem.Data.(map[string]interface{}) - if !ok { - return fmt.Errorf("queryItem.Data 必须是 map[string]interface{} 类型") - } - - // 从 Data 中获取 apiID - apiID, ok := data["apiID"].(string) - if !ok { - return fmt.Errorf("queryItem.Data 中的 apiID 必须是字符串类型") - } - - // 查询 Feature - feature, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, apiID) - if err != nil { - // 如果 Feature 查不到,也要删除当前 QueryItem - *target = append((*target)[:i], (*target)[i+1:]...) - continue - } - - // 查询 ProductFeatureModel - builder := l.svcCtx.ProductFeatureModel.SelectBuilder().Where("product_id = ?", productID) - productFeatures, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, builder, "") - if err != nil { - return fmt.Errorf("查询 ProductFeatureModel 错误: %v", err) - } - - // 遍历 productFeatures,找到与 feature.ID 关联且 enable == 1 的项 - var featureData map[string]interface{} - // foundFeature := false - sort := 0 - for _, pf := range productFeatures { - if pf.FeatureId == feature.Id { // 确保和 Feature 关联 - sort = int(pf.Sort) - break // 找到第一个符合条件的就退出循环 - } - } - featureData = map[string]interface{}{ - "featureName": feature.Name, - "sort": sort, - } - - // 更新 queryItem 的 Feature 字段(不是数组) - queryItem.Feature = featureData - } - - return nil -} diff --git a/app/user/cmd/api/internal/logic/query/querysingletestlogic.go b/app/user/cmd/api/internal/logic/query/querysingletestlogic.go deleted file mode 100644 index 04ba0fe..0000000 --- a/app/user/cmd/api/internal/logic/query/querysingletestlogic.go +++ /dev/null @@ -1,52 +0,0 @@ -package query - -import ( - "context" - "encoding/json" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type QuerySingleTestLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewQuerySingleTestLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QuerySingleTestLogic { - return &QuerySingleTestLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *QuerySingleTestLogic) QuerySingleTest(req *types.QuerySingleTestReq) (resp *types.QuerySingleTestResp, err error) { - //featrueModel, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, req.Api) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 获取接口失败 : %d", err) - //} - marshalParams, err := json.Marshal(req.Params) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 序列化参数失败 : %d", err) - } - apiResp, err := l.svcCtx.ApiRequestService.PreprocessRequestApi(marshalParams, req.Api) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 获取接口失败 : %d", err) - } - var respData interface{} - err = json.Unmarshal(apiResp, &respData) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 反序列化接口失败 : %d", err) - } - return &types.QuerySingleTestResp{ - Data: respData, - Api: req.Api, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/query/updatequerydatalogic.go b/app/user/cmd/api/internal/logic/query/updatequerydatalogic.go deleted file mode 100644 index d09a8a2..0000000 --- a/app/user/cmd/api/internal/logic/query/updatequerydatalogic.go +++ /dev/null @@ -1,71 +0,0 @@ -package query - -import ( - "context" - "database/sql" - "encoding/hex" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" -) - -type UpdateQueryDataLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -// 更新查询数据 -func NewUpdateQueryDataLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateQueryDataLogic { - return &UpdateQueryDataLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *UpdateQueryDataLogic) UpdateQueryData(req *types.UpdateQueryDataReq) (resp *types.UpdateQueryDataResp, err error) { - // 1. 从数据库中获取查询记录 - query, err := l.svcCtx.QueryModel.FindOne(l.ctx, req.Id) - if err != nil { - if err == model.ErrNotFound { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询记录不存在, 查询ID: %d", req.Id) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询数据库失败, 查询ID: %d, err: %v", req.Id, err) - } - - // 2. 获取加密密钥 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取AES密钥失败: %v", decodeErr) - } - - // 3. 加密数据 - 传入的是JSON,需要加密处理 - encryptData, aesEncryptErr := crypto.AesEncrypt([]byte(req.QueryData), key) - if aesEncryptErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密查询数据失败: %v", aesEncryptErr) - } - - // 4. 更新数据库记录 - query.QueryData = sql.NullString{ - String: encryptData, - Valid: true, - } - updateErr := l.svcCtx.QueryModel.UpdateWithVersion(l.ctx, nil, query) - if updateErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新查询数据失败: %v", updateErr) - } - - // 5. 返回结果 - return &types.UpdateQueryDataResp{ - Id: query.Id, - UpdatedAt: query.UpdateTime.Format("2006-01-02 15:04:05"), - }, nil -} diff --git a/app/user/cmd/api/internal/logic/user/agentmobilecodeloginlogic.go b/app/user/cmd/api/internal/logic/user/agentmobilecodeloginlogic.go deleted file mode 100644 index c9d90cd..0000000 --- a/app/user/cmd/api/internal/logic/user/agentmobilecodeloginlogic.go +++ /dev/null @@ -1,99 +0,0 @@ -package user - -import ( - "context" - "database/sql" - "fmt" - "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "github.com/zeromicro/go-zero/core/logx" -) - -type AgentMobileCodeLoginLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewAgentMobileCodeLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AgentMobileCodeLoginLogic { - return &AgentMobileCodeLoginLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *AgentMobileCodeLoginLogic) AgentMobileCodeLogin(req *types.MobileCodeLoginReq) (resp *types.MobileCodeLoginResp, err error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 加密手机号失败: %+v", err) - } - // 检查手机号是否在一分钟内已发送过验证码 - redisKey := fmt.Sprintf("%s:%s", "query", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "手机登录, 验证码过期") - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取验证码redis缓存失败, err: %+v", err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机登录, 验证码不正确") - } - - user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) - if findUserErr != nil && findUserErr != model.ErrNotFound { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取数据库获取用户失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if user == nil { - user = &model.User{Mobile: sql.NullString{String: encryptedMobile, Valid: true}} - // if len(user.Nickname) == 0 { - // user.Nickname = "" - // } - if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { - insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, user) - if userInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入新用户失败, mobile%s, err: %+v", encryptedMobile, err) - } - lastId, lastInsertIdErr := insertResult.LastInsertId() - if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) - } - user.Id = lastId - - userAuth := new(model.UserAuth) - userAuth.UserId = lastId - userAuth.AuthKey = encryptedMobile - userAuth.AuthType = model.UserAuthTypeH5Mobile - if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入用户认证失败, err:%+v", userAuthInsertErr) - } - return nil - }); transErr != nil { - return nil, transErr - } - } - token, generaErr := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 生成token失败 : %d", user.Id) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.MobileCodeLoginResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/user/bindmobilelogic.go b/app/user/cmd/api/internal/logic/user/bindmobilelogic.go deleted file mode 100644 index 2246902..0000000 --- a/app/user/cmd/api/internal/logic/user/bindmobilelogic.go +++ /dev/null @@ -1,104 +0,0 @@ -package user - -import ( - "context" - "database/sql" - "fmt" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -type BindMobileLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewBindMobileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *BindMobileLogic { - return &BindMobileLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *BindMobileLogic) BindMobile(req *types.BindMobileReq) (resp *types.BindMobileResp, err error) { - userID, getUserIdErr := ctxdata.GetUidFromCtx(l.ctx) - if getUserIdErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "绑定手机号, %v", getUserIdErr) - } - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "绑定手机号, 加密手机号失败: %v", err) - } - user, err := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, %v", err) - } - if user != nil { - return nil, errors.Wrapf(xerr.NewErrMsg("该手机号已绑定"), "绑定手机号, %v", err) - } - // 检查手机号是否在一分钟内已发送过验证码 - redisKey := fmt.Sprintf("%s:%s", "bindMobile", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "手机登录, 验证码过期: %s", encryptedMobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取验证码redis缓存失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机登录, 验证码不正确: %s", encryptedMobile) - } - - userModel, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, %v", err) - } - if userModel.Mobile.Valid && userModel.Mobile.String != "" { - return nil, errors.Wrapf(xerr.NewErrMsg("账号已绑定手机号,无法再次绑定"), "绑定手机号, %v", err) - } - userAuthModel, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, userID, model.UserAuthTypeH5Mobile) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, %v", err) - } - if userAuthModel != nil { - return nil, errors.Wrapf(xerr.NewErrMsg("账号已绑定手机号,无法再次绑定"), "绑定手机号, %v", err) - } - - var userAuth model.UserAuth - userAuth.UserId = userID - userAuth.AuthType = model.UserAuthTypeH5Mobile - userAuth.AuthKey = encryptedMobile - transErr := l.svcCtx.UserAuthModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { - _, err = l.svcCtx.UserAuthModel.Insert(ctx, session, &userAuth) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, %v", err) - } - userModel.Mobile = sql.NullString{ - String: encryptedMobile, - Valid: true, - } - _, err = l.svcCtx.UserModel.Update(l.ctx, session, userModel) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, %v", err) - } - return nil - }) - if transErr != nil { - return nil, transErr - } - - return &types.BindMobileResp{}, nil -} diff --git a/app/user/cmd/api/internal/logic/user/canceloutlogic.go b/app/user/cmd/api/internal/logic/user/canceloutlogic.go deleted file mode 100644 index 1fbc8e1..0000000 --- a/app/user/cmd/api/internal/logic/user/canceloutlogic.go +++ /dev/null @@ -1,252 +0,0 @@ -package user - -import ( - "context" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - - "github.com/zeromicro/go-zero/core/mr" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "tydata-server/app/user/cmd/api/internal/svc" - - "github.com/zeromicro/go-zero/core/logx" -) - -type CancelOutLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewCancelOutLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CancelOutLogic { - return &CancelOutLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *CancelOutLogic) CancelOut() error { - userID, getUserIdErr := ctxdata.GetUidFromCtx(l.ctx) - if getUserIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, %v", getUserIdErr) - } - - // 1. 先检查用户是否是代理 - agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询代理信息失败, userId: %d", userID) - } - - // 如果用户是代理,进行额外检查 - if agentModel != nil { - // 1.1 检查代理等级是否为VIP或SVIP - if agentModel.LevelName == model.AgentLeveNameVIP || agentModel.LevelName == model.AgentLeveNameSVIP { - return errors.Wrapf(xerr.NewErrMsg("您是"+agentModel.LevelName+"会员,请联系客服进行注销"), "用户是代理会员,不能注销") - } - - // 1.2 检查代理钱包是否有余额或冻结金额 - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agentModel.Id) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理钱包失败, agentId: %d", agentModel.Id) - } - - if wallet != nil && (wallet.Balance > 0 || wallet.FrozenBalance > 0) { - if wallet.Balance > 0 { - return errors.Wrapf(xerr.NewErrMsg("您的钱包还有余额%.2f元,请先提现后再注销账号"), "用户钱包有余额,不能注销", wallet.Balance) - } - if wallet.FrozenBalance > 0 { - return errors.Wrapf(xerr.NewErrMsg("您的钱包还有冻结金额%.2f元,请等待解冻后再注销账号"), "用户钱包有冻结金额,不能注销", wallet.FrozenBalance) - } - } - } - - // 在事务中处理用户注销相关操作 - err = l.svcCtx.UserModel.Trans(l.ctx, func(tranCtx context.Context, session sqlx.Session) error { - // 1. 删除用户基本信息 - if err := l.svcCtx.UserModel.Delete(tranCtx, session, userID); err != nil { - return errors.Wrapf(err, "删除用户基本信息失败, userId: %d", userID) - } - - // 2. 查询并删除用户授权信息 - UserAuthModelBuilder := l.svcCtx.UserAuthModel.SelectBuilder().Where("user_id = ?", userID) - userAuths, err := l.svcCtx.UserAuthModel.FindAll(tranCtx, UserAuthModelBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询用户授权信息失败, userId: %d", userID) - } - - // 并发删除用户授权信息 - if len(userAuths) > 0 { - funcs := make([]func() error, len(userAuths)) - for i, userAuth := range userAuths { - authID := userAuth.Id - funcs[i] = func() error { - return l.svcCtx.UserAuthModel.Delete(tranCtx, session, authID) - } - } - - if err := mr.Finish(funcs...); err != nil { - return errors.Wrapf(err, "删除用户授权信息失败") - } - } - - // 3. 处理代理相关信息 - if agentModel != nil { - // 3.1 删除代理信息 - if err := l.svcCtx.AgentModel.Delete(tranCtx, session, agentModel.Id); err != nil { - return errors.Wrapf(err, "删除代理信息失败, agentId: %d", agentModel.Id) - } - - // 3.2 查询并删除代理会员配置 - configBuilder := l.svcCtx.AgentMembershipUserConfigModel.SelectBuilder().Where("agent_id = ?", agentModel.Id) - configs, err := l.svcCtx.AgentMembershipUserConfigModel.FindAll(tranCtx, configBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询代理会员配置失败, agentId: %d", agentModel.Id) - } - - // 并发删除代理会员配置 - if len(configs) > 0 { - configFuncs := make([]func() error, len(configs)) - for i, config := range configs { - configId := config.Id - configFuncs[i] = func() error { - return l.svcCtx.AgentMembershipUserConfigModel.Delete(tranCtx, session, configId) - } - } - - if err := mr.Finish(configFuncs...); err != nil { - return errors.Wrapf(err, "删除代理会员配置失败") - } - } - - // 3.3 删除代理钱包信息 - wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(tranCtx, agentModel.Id) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询代理钱包信息失败, agentId: %d", agentModel.Id) - } - - if wallet != nil { - if err := l.svcCtx.AgentWalletModel.Delete(tranCtx, session, wallet.Id); err != nil { - return errors.Wrapf(err, "删除代理钱包信息失败, walletId: %d", wallet.Id) - } - } - - // 3.4 删除代理关系信息 - closureBuilder := l.svcCtx.AgentClosureModel.SelectBuilder().Where("ancestor_id = ? AND depth = ?", agentModel.Id, 1) - closures, err := l.svcCtx.AgentClosureModel.FindAll(tranCtx, closureBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询代理关系信息失败, agentId: %d", agentModel.Id) - } - - if len(closures) > 0 { - closureFuncs := make([]func() error, len(closures)) - for i, closure := range closures { - closureId := closure.Id - closureFuncs[i] = func() error { - return l.svcCtx.AgentClosureModel.Delete(tranCtx, session, closureId) - } - } - - if err := mr.Finish(closureFuncs...); err != nil { - return errors.Wrapf(err, "删除代理关系信息失败") - } - } - } - - // 4. 查询并删除代理审核信息 - auditBuilder := l.svcCtx.AgentAuditModel.SelectBuilder().Where("user_id = ?", userID) - audits, err := l.svcCtx.AgentAuditModel.FindAll(tranCtx, auditBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询代理审核信息失败, userId: %d", userID) - } - - // 并发删除代理审核信息 - if len(audits) > 0 { - auditFuncs := make([]func() error, len(audits)) - for i, audit := range audits { - auditId := audit.Id - auditFuncs[i] = func() error { - return l.svcCtx.AgentAuditModel.Delete(tranCtx, session, auditId) - } - } - - if err := mr.Finish(auditFuncs...); err != nil { - return errors.Wrapf(err, "删除代理审核信息失败") - } - } - - // 5. 删除用户查询记录 - queryBuilder := l.svcCtx.QueryModel.SelectBuilder().Where("user_id = ?", userID) - queries, err := l.svcCtx.QueryModel.FindAll(tranCtx, queryBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询用户查询记录失败, userId: %d", userID) - } - - if len(queries) > 0 { - queryFuncs := make([]func() error, len(queries)) - for i, query := range queries { - queryId := query.Id - queryFuncs[i] = func() error { - return l.svcCtx.QueryModel.Delete(tranCtx, session, queryId) - } - } - - if err := mr.Finish(queryFuncs...); err != nil { - return errors.Wrapf(err, "删除用户查询记录失败") - } - } - - // 6. 删除用户订单记录 - orderBuilder := l.svcCtx.OrderModel.SelectBuilder().Where("user_id = ?", userID) - orders, err := l.svcCtx.OrderModel.FindAll(tranCtx, orderBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询用户订单记录失败, userId: %d", userID) - } - - if len(orders) > 0 { - orderFuncs := make([]func() error, len(orders)) - for i, order := range orders { - orderId := order.Id - orderFuncs[i] = func() error { - return l.svcCtx.OrderModel.Delete(tranCtx, session, orderId) - } - } - - if err := mr.Finish(orderFuncs...); err != nil { - return errors.Wrapf(err, "删除用户订单记录失败") - } - } - - // 7. 删除代理订单信息 - agentOrderBuilder := l.svcCtx.AgentOrderModel.SelectBuilder().Where("agent_id = ?", agentModel.Id) - agentOrders, err := l.svcCtx.AgentOrderModel.FindAll(tranCtx, agentOrderBuilder, "") - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(err, "查询代理订单信息失败, agentId: %d, err: %v", agentModel.Id, err) - } - - if len(agentOrders) > 0 { - agentOrderFuncs := make([]func() error, len(agentOrders)) - for i, agentOrder := range agentOrders { - agentOrderId := agentOrder.Id - agentOrderFuncs[i] = func() error { - return l.svcCtx.AgentOrderModel.Delete(tranCtx, session, agentOrderId) - } - } - - if err := mr.Finish(agentOrderFuncs...); err != nil { - return errors.Wrapf(err, "删除代理订单信息失败") - } - } - return nil - }) - - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户注销失败%v", err) - } - - return nil -} diff --git a/app/user/cmd/api/internal/logic/user/detaillogic.go b/app/user/cmd/api/internal/logic/user/detaillogic.go deleted file mode 100644 index fa03b5e..0000000 --- a/app/user/cmd/api/internal/logic/user/detaillogic.go +++ /dev/null @@ -1,58 +0,0 @@ -package user - -import ( - "context" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/jinzhu/copier" - "github.com/pkg/errors" - - "github.com/zeromicro/go-zero/core/logx" -) - -type DetailLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DetailLogic { - return &DetailLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *DetailLogic) Detail() (resp *types.UserInfoResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, %v", err) - } - user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.USER_NOT_FOUND), "用户信息, 用户不存在, %v", err) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户信息, 数据库查询用户信息失败, %v", err) - } - var userInfo types.User - err = copier.Copy(&userInfo, user) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, 用户信息结构体复制失败, %v", err) - } - if user.Mobile.Valid { - userInfo.Mobile, err = crypto.DecryptMobile(user.Mobile.String, l.svcCtx.Config.Encrypt.SecretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, 解密手机号失败, %v", err) - } - } - return &types.UserInfoResp{ - UserInfo: userInfo, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/user/gettokenlogic.go b/app/user/cmd/api/internal/logic/user/gettokenlogic.go deleted file mode 100644 index 601239e..0000000 --- a/app/user/cmd/api/internal/logic/user/gettokenlogic.go +++ /dev/null @@ -1,48 +0,0 @@ -package user - -import ( - "context" - "time" - "tydata-server/common/ctxdata" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type GetTokenLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewGetTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetTokenLogic { - return &GetTokenLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *GetTokenLogic) GetToken() (resp *types.MobileCodeLoginResp, err error) { - userID, err := ctxdata.GetUidFromCtx(l.ctx) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrMsg(""), "用户信息, %v", err) - } - token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "更新token, 生成token失败 : %d", userID) - } - // 获取当前时间戳 - now := time.Now().Unix() - return &types.MobileCodeLoginResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/user/mobilecodeloginlogic.go b/app/user/cmd/api/internal/logic/user/mobilecodeloginlogic.go deleted file mode 100644 index c74c2bf..0000000 --- a/app/user/cmd/api/internal/logic/user/mobilecodeloginlogic.go +++ /dev/null @@ -1,104 +0,0 @@ -package user - -import ( - "context" - "database/sql" - "fmt" - "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "github.com/zeromicro/go-zero/core/logx" -) - -type MobileCodeLoginLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewMobileCodeLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MobileCodeLoginLogic { - return &MobileCodeLoginLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *MobileCodeLoginLogic) MobileCodeLogin(req *types.MobileCodeLoginReq) (resp *types.MobileCodeLoginResp, err error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 加密手机号失败: %+v", err) - } - if !l.MobileCodeLoginInside(req) { - // 检查手机号是否在一分钟内已发送过验证码 - redisKey := fmt.Sprintf("%s:%s", "login", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "手机登录, 验证码过期: %s", encryptedMobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取验证码redis缓存失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机登录, 验证码不正确: %s", encryptedMobile) - } - } - - user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) - if findUserErr != nil && findUserErr != model.ErrNotFound { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取数据库获取用户失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if user == nil { - user = &model.User{Mobile: sql.NullString{String: encryptedMobile, Valid: true}} - // if len(user.Nickname) == 0 { - // user.Nickname = encryptedMobile - // } - if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { - insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, user) - if userInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入新用户失败, mobile%s, err: %+v", encryptedMobile, err) - } - lastId, lastInsertIdErr := insertResult.LastInsertId() - if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) - } - user.Id = lastId - - userAuth := new(model.UserAuth) - userAuth.UserId = lastId - userAuth.AuthKey = encryptedMobile - userAuth.AuthType = model.UserAuthTypeAppMobile - if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入用户认证失败, err:%+v", userAuthInsertErr) - } - return nil - }); transErr != nil { - return nil, transErr - } - } - token, generaErr := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 生成token失败 : %d", user.Id) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.MobileCodeLoginResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} -func (l *MobileCodeLoginLogic) MobileCodeLoginInside(req *types.MobileCodeLoginReq) (pass bool) { - return req.Code == "182761" -} diff --git a/app/user/cmd/api/internal/logic/user/mobileloginlogic.go b/app/user/cmd/api/internal/logic/user/mobileloginlogic.go deleted file mode 100644 index 4c214fb..0000000 --- a/app/user/cmd/api/internal/logic/user/mobileloginlogic.go +++ /dev/null @@ -1,65 +0,0 @@ -package user - -import ( - "context" - "database/sql" - "time" - "tydata-server/app/user/model" - jwtx "tydata-server/common/jwt" - "tydata-server/common/tool" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/pkg/errors" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type MobileLoginLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewMobileLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MobileLoginLogic { - return &MobileLoginLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *MobileLoginLogic) MobileLogin(req *types.MobileLoginReq) (resp *types.MobileCodeLoginResp, err error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 加密手机号失败: %+v", err) - } - user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) - if findUserErr != nil && findUserErr != model.ErrNotFound { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取数据库获取用户失败, mobile%s, err: %+v", encryptedMobile, err) - } - if user == nil { - return nil, errors.Wrapf(xerr.NewErrMsg("手机号码未注册"), "手机登录, 手机号未注册:%s", encryptedMobile) - } - if !(tool.Md5ByString(req.Password) == lzUtils.NullStringToString(user.Password)) { - return nil, errors.Wrapf(xerr.NewErrMsg("密码不正确"), "手机登录, 密码匹配不正确%s", encryptedMobile) - } - - token, generaErr := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 生成token失败 : %d", user.Id) - } - - // 获取当前时间戳 - now := time.Now().Unix() - return &types.MobileCodeLoginResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/user/registerlogic.go b/app/user/cmd/api/internal/logic/user/registerlogic.go deleted file mode 100644 index 48e5ff0..0000000 --- a/app/user/cmd/api/internal/logic/user/registerlogic.go +++ /dev/null @@ -1,106 +0,0 @@ -package user - -import ( - "context" - "database/sql" - "fmt" - "time" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - jwtx "tydata-server/common/jwt" - "tydata-server/common/tool" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "github.com/zeromicro/go-zero/core/logx" -) - -type RegisterLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewRegisterLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RegisterLogic { - return &RegisterLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *RegisterLogic) Register(req *types.RegisterReq) (resp *types.RegisterResp, err error) { - secretKey := l.svcCtx.Config.Encrypt.SecretKey - encryptedMobile, err := crypto.EncryptMobile(req.Mobile, secretKey) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机注册, 加密手机号失败: %+v", err) - } - // 检查手机号是否在一分钟内已发送过验证码 - redisKey := fmt.Sprintf("%s:%s", "register", encryptedMobile) - cacheCode, err := l.svcCtx.Redis.Get(redisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "手机注册, 验证码过期: %s", encryptedMobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 读取验证码redis缓存失败, mobile: %s, err: %+v", encryptedMobile, err) - } - if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机注册, 验证码不正确: %s", encryptedMobile) - } - hasUser, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) - if findUserErr != nil && findUserErr != model.ErrNotFound { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 读取数据库获取用户失败, mobile%s, err: %+v", encryptedMobile, err) - } - if hasUser != nil { - return nil, errors.Wrapf(xerr.NewErrMsg("该手机号码已注册"), "手机注册, 手机号码已注册, mobile:%s", encryptedMobile) - } - var userId int64 - if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { - user := new(model.User) - user.Mobile = sql.NullString{String: encryptedMobile, Valid: true} - // if len(user.Nickname) == 0 { - // user.Nickname = encryptedMobile - // } - if len(req.Password) > 0 { - user.Password = lzUtils.StringToNullString(tool.Md5ByString(req.Password)) - } - insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, user) - if userInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入新用户失败, mobile%s, err: %+v", encryptedMobile, err) - } - lastId, lastInsertIdErr := insertResult.LastInsertId() - if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) - } - userId = lastId - - userAuth := new(model.UserAuth) - userAuth.UserId = lastId - userAuth.AuthKey = encryptedMobile - userAuth.AuthType = model.UserAuthTypeAppMobile - if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入用户认证失败, err:%+v", userAuthInsertErr) - } - return nil - }); transErr != nil { - return nil, transErr - } - - token, generaErr := jwtx.GenerateJwtToken(userId, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if generaErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机注册, 生成jwt token失败, userid: %d, err:%+v", userId, generaErr) - } - // 获取当前时间戳 - now := time.Now().Unix() - return &types.RegisterResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} diff --git a/app/user/cmd/api/internal/logic/user/wxh5authlogic.go b/app/user/cmd/api/internal/logic/user/wxh5authlogic.go deleted file mode 100644 index 124cdbc..0000000 --- a/app/user/cmd/api/internal/logic/user/wxh5authlogic.go +++ /dev/null @@ -1,138 +0,0 @@ -package user - -import ( - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "time" - "tydata-server/app/user/model" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/sqlx" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type WxH5AuthLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewWxH5AuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WxH5AuthLogic { - return &WxH5AuthLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *WxH5AuthLogic) WxH5Auth(req *types.WXH5AuthReq) (resp *types.WXH5AuthResp, err error) { - // Step 1: 使用code获取access_token - accessTokenResp, err := l.GetAccessToken(req.Code) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取access_token失败: %v", err) - } - if accessTokenResp.AccessToken == "" || accessTokenResp.Openid == "" { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取access_token为空: %v", accessTokenResp) - } - // Step 2: 查找用户授权信息 - userAuth, findErr := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWxh5, accessTokenResp.Openid) - if findErr != nil && !errors.Is(findErr, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询用户授权失败,findErr: %v", findErr) - } - - // Step 3: 查找或创建用户 - var user *model.User - if userAuth != nil { - // 授权信息存在,查找用户 - userModel, findUserErr := l.svcCtx.UserModel.FindOne(l.ctx, userAuth.UserId) - if findUserErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询用户失败,userId: %v", findUserErr) - } - user = userModel - } else { - // 授权信息不存在,创建新用户 - user = &model.User{} - if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(context context.Context, session sqlx.Session) error { - // 插入数据库 - insertResult, insertErr := l.svcCtx.UserModel.Insert(l.ctx, session, user) - if insertErr != nil { - return errors.Wrapf(insertErr, "创建新用户失败,openid: %s", accessTokenResp.Openid) - } - // 获取插入后生成的 user.Id - lastInsertId, lastInsertIdErr := insertResult.LastInsertId() - if lastInsertIdErr != nil { - return errors.Wrapf(lastInsertIdErr, "获取新用户ID失败,openid: %s", accessTokenResp.Openid) - } - user.Id = lastInsertId - // 创建用户授权信息 - userAuth = &model.UserAuth{ - UserId: user.Id, - AuthKey: accessTokenResp.Openid, - AuthType: model.UserAuthTypeWxh5, // 微信小程序 - } - if _, insertUserAuthErr := l.svcCtx.UserAuthModel.Insert(l.ctx, session, userAuth); insertUserAuthErr != nil { - return errors.Wrapf(insertUserAuthErr, "创建用户授权失败,openid: %s", accessTokenResp.Openid) - } - return nil - }); transErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "创建新用户事务失败: %v", transErr) - } - } - - // Step 4: 生成JWT Token - token, genErr := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) - if genErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成JWT token失败: %v", genErr) - } - - now := time.Now().Unix() - return &types.WXH5AuthResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil -} - -type AccessTokenResp struct { - AccessToken string `json:"access_token"` - Openid string `json:"openid"` -} - -// GetAccessToken 通过code获取access_token -func (l *WxH5AuthLogic) GetAccessToken(code string) (*AccessTokenResp, error) { - appID := l.svcCtx.Config.WechatH5.AppID - appSecret := l.svcCtx.Config.WechatH5.AppSecret - - url := fmt.Sprintf("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", appID, appSecret, code) - - resp, err := http.Get(url) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - var accessTokenResp AccessTokenResp - if err = json.Unmarshal(body, &accessTokenResp); err != nil { - return nil, err - } - - //if accessTokenResp.AccessToken == "" { - // return nil, errors.New("accessTokenResp.AccessToken为空") - //} - - return &accessTokenResp, nil -} diff --git a/app/user/cmd/api/internal/logic/user/wxminiauthlogic.go b/app/user/cmd/api/internal/logic/user/wxminiauthlogic.go deleted file mode 100644 index 904644d..0000000 --- a/app/user/cmd/api/internal/logic/user/wxminiauthlogic.go +++ /dev/null @@ -1,30 +0,0 @@ -package user - -import ( - "context" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type WxMiniAuthLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewWxMiniAuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WxMiniAuthLogic { - return &WxMiniAuthLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *WxMiniAuthLogic) WxMiniAuth(req *types.WXMiniAuthReq) (resp *types.WXMiniAuthResp, err error) { - // todo: add your logic here and delete this line - - return -} diff --git a/app/user/cmd/api/internal/middleware/authinterceptormiddleware.go b/app/user/cmd/api/internal/middleware/authinterceptormiddleware.go deleted file mode 100644 index 3bf8160..0000000 --- a/app/user/cmd/api/internal/middleware/authinterceptormiddleware.go +++ /dev/null @@ -1,60 +0,0 @@ -package middleware - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/common/ctxdata" - jwtx "tydata-server/common/jwt" - "tydata-server/common/xerr" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/rest/httpx" -) - -const ( - // 定义错误码 - ErrCodeUnauthorized = 401 -) - -type AuthInterceptorMiddleware struct { - Config config.Config -} - -func NewAuthInterceptorMiddleware(c config.Config) *AuthInterceptorMiddleware { - return &AuthInterceptorMiddleware{ - Config: c, - } -} - -func (m *AuthInterceptorMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - // 从请求头中获取Authorization字段 - authHeader := r.Header.Get("Authorization") - - // 如果没有Authorization头,直接放行 - if authHeader == "" { - next(w, r) - return - } - - // 解析JWT令牌 - userId, err := jwtx.ParseJwtToken(authHeader, m.Config.JwtAuth.AccessSecret) - if err != nil { - // JWT解析失败,返回401错误 - httpx.Error(w, errors.Wrapf(xerr.NewErrCode(ErrCodeUnauthorized), "token解析失败: %v", err)) - return - } - - // 将用户ID转换为json.Number类型后添加到请求上下文 - userIdStr := fmt.Sprintf("%d", userId) - userIdJsonNum := json.Number(userIdStr) - ctx := context.WithValue(r.Context(), ctxdata.CtxKeyJwtUserId, userIdJsonNum) - - // 使用新的上下文继续处理请求 - next(w, r.WithContext(ctx)) - } -} diff --git a/app/user/cmd/api/internal/middleware/sourceinterceptormiddleware.go b/app/user/cmd/api/internal/middleware/sourceinterceptormiddleware.go deleted file mode 100644 index 747f848..0000000 --- a/app/user/cmd/api/internal/middleware/sourceinterceptormiddleware.go +++ /dev/null @@ -1,41 +0,0 @@ -package middleware - -import ( - "context" - "net/http" -) - -const ( - BrandKey = "X-Brand" - PlatformKey = "X-Platform" -) - -type SourceInterceptorMiddleware struct { -} - -func NewSourceInterceptorMiddleware() *SourceInterceptorMiddleware { - return &SourceInterceptorMiddleware{} -} - -func (m *SourceInterceptorMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - // 获取请求头 X-Brand 和 X-Platform 的值 - brand := r.Header.Get(BrandKey) - platform := r.Header.Get(PlatformKey) - - // 将值放入新的 context 中 - ctx := r.Context() - if brand != "" { - ctx = context.WithValue(ctx, "brand", brand) - } - if platform != "" { - ctx = context.WithValue(ctx, "platform", platform) - } - - // 通过 r.WithContext 将更新后的 ctx 传递给后续的处理函数 - r = r.WithContext(ctx) - - // 传递给下一个处理器 - next(w, r) - } -} diff --git a/app/user/cmd/api/internal/queue/cleanQueryData.go b/app/user/cmd/api/internal/queue/cleanQueryData.go deleted file mode 100644 index 3403928..0000000 --- a/app/user/cmd/api/internal/queue/cleanQueryData.go +++ /dev/null @@ -1,41 +0,0 @@ -package queue - -import ( - "context" - "time" - "tydata-server/app/user/cmd/api/internal/svc" - - "github.com/hibiken/asynq" - "github.com/zeromicro/go-zero/core/logx" -) - -// TASKTIME 定义为每天凌晨3点执行 -const TASKTIME = "0 3 * * *" - -type CleanQueryDataHandler struct { - svcCtx *svc.ServiceContext -} - -func NewCleanQueryDataHandler(svcCtx *svc.ServiceContext) *CleanQueryDataHandler { - return &CleanQueryDataHandler{ - svcCtx: svcCtx, - } -} - -func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) error { - now := time.Now().Format("2006-01-02 15:04:05") - logx.Infof("%s - 开始执行查询数据清理任务", now) - - // 计算3天前的时间 - threeDaysAgo := time.Now().AddDate(0, 0, -30) - - // 调用QueryModel删除3天前的数据 - result, err := l.svcCtx.QueryModel.DeleteBefore(ctx, threeDaysAgo) - if err != nil { - logx.Errorf("%s - 清理查询数据失败: %v", time.Now().Format("2006-01-02 15:04:05"), err) - return err - } - - logx.Infof("%s - 查询数据清理完成,共删除 %d 条记录", time.Now().Format("2006-01-02 15:04:05"), result) - return nil -} diff --git a/app/user/cmd/api/internal/queue/paySuccessNotify.go b/app/user/cmd/api/internal/queue/paySuccessNotify.go deleted file mode 100644 index 0a5dfd2..0000000 --- a/app/user/cmd/api/internal/queue/paySuccessNotify.go +++ /dev/null @@ -1,374 +0,0 @@ -package queue - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "os" - "regexp" - "strings" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/app/user/model" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/hibiken/asynq" - "github.com/zeromicro/go-zero/core/logx" -) - -type PaySuccessNotifyUserHandler struct { - svcCtx *svc.ServiceContext -} - -func NewPaySuccessNotifyUserHandler(svcCtx *svc.ServiceContext) *PaySuccessNotifyUserHandler { - return &PaySuccessNotifyUserHandler{ - svcCtx: svcCtx, - } -} - -var payload struct { - OrderID int64 `json:"order_id"` -} - -func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq.Task) error { - // 从任务的负载中解码数据 - if err := json.Unmarshal(t.Payload(), &payload); err != nil { - return fmt.Errorf("解析任务负载失败: %w", err) - } - - order, err := l.svcCtx.OrderModel.FindOne(ctx, payload.OrderID) - if err != nil { - return fmt.Errorf("无效的订单ID: %d, %v", payload.OrderID, err) - } - env := os.Getenv("ENV") - if order.Status != "paid" && env != "development" { - err = fmt.Errorf("无效的订单: %d", payload.OrderID) - logx.Errorf("处理任务失败,原因: %v", err) - return asynq.SkipRetry - } - product, err := l.svcCtx.ProductModel.FindOne(ctx, order.ProductId) - if err != nil { - return fmt.Errorf("找不到相关产品: orderID: %d, productID: %d", payload.OrderID, order.ProductId) - } - redisKey := fmt.Sprintf(types.QueryCacheKey, order.UserId, order.OrderNo) - cache, cacheErr := l.svcCtx.Redis.GetCtx(ctx, redisKey) - if cacheErr != nil { - return fmt.Errorf("获取缓存内容失败: %+v", cacheErr) - } - var data types.QueryCacheLoad - err = json.Unmarshal([]byte(cache), &data) - if err != nil { - return fmt.Errorf("解析缓存内容失败: %+v", err) - } - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return fmt.Errorf("获取AES密钥失败: %+v", decodeErr) - } - decryptData, aesdecryptErr := crypto.AesDecrypt(data.Params, key) - if aesdecryptErr != nil { - return fmt.Errorf("解密参数失败: %+v", aesdecryptErr) - } - - // 敏感数据脱敏处理 - desensitizedParams, err := l.desensitizeParams(decryptData) - if err != nil { - return fmt.Errorf("脱敏处理失败: %+v", err) - } - - // 对脱敏后的数据进行AES加密 - encryptedParams, encryptErr := crypto.AesEncrypt(desensitizedParams, key) - if encryptErr != nil { - return fmt.Errorf("加密脱敏数据失败: %+v", encryptErr) - } - - query := &model.Query{ - OrderId: order.Id, - UserId: order.UserId, - ProductId: product.Id, - QueryParams: encryptedParams, - QueryState: "pending", - } - result, insertQueryErr := l.svcCtx.QueryModel.Insert(ctx, nil, query) - if insertQueryErr != nil { - return fmt.Errorf("保存查询失败: %+v", insertQueryErr) - } - - // 获取插入后的ID - queryId, err := result.LastInsertId() - if err != nil { - return fmt.Errorf("获取插入的查询ID失败: %+v", err) - } - - // 从数据库中查询完整的查询记录 - query, err = l.svcCtx.QueryModel.FindOne(ctx, queryId) - if err != nil { - return fmt.Errorf("获取插入后的查询记录失败: %+v", err) - } - - combinedResponse, err := l.svcCtx.ApiRequestService.ProcessRequests(decryptData, product.Id) - if err != nil { - return l.handleError(ctx, err, order, query) - } - // 加密返回响应 - encryptData, aesEncryptErr := crypto.AesEncrypt(combinedResponse, key) - if aesEncryptErr != nil { - err = fmt.Errorf("加密响应信息失败: %v", aesEncryptErr) - return l.handleError(ctx, err, order, query) - } - query.QueryData = lzUtils.StringToNullString(encryptData) - updateErr := l.svcCtx.QueryModel.UpdateWithVersion(ctx, nil, query) - if updateErr != nil { - err = fmt.Errorf("保存响应数据失败: %v", updateErr) - return l.handleError(ctx, err, order, query) - } - - query.QueryState = "success" - updateQueryErr := l.svcCtx.QueryModel.UpdateWithVersion(ctx, nil, query) - if updateQueryErr != nil { - updateQueryErr = fmt.Errorf("修改查询状态失败: %v", updateQueryErr) - return l.handleError(ctx, updateQueryErr, order, query) - } - - err = l.svcCtx.AgentService.AgentProcess(ctx, order) - if err != nil { - return l.handleError(ctx, err, order, query) - } - - _, delErr := l.svcCtx.Redis.DelCtx(ctx, redisKey) - if delErr != nil { - logx.Errorf("删除Redis缓存失败,但任务已成功处理,订单ID: %d, 错误: %v", order.Id, delErr) - } - - return nil -} - -// 定义一个中间件函数 -func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error, order *model.Order, query *model.Query) error { - logx.Errorf("处理任务失败,原因: %v", err) - - redisKey := fmt.Sprintf(types.QueryCacheKey, order.UserId, order.OrderNo) - _, delErr := l.svcCtx.Redis.DelCtx(ctx, redisKey) - if delErr != nil { - logx.Errorf("删除Redis缓存失败,订单ID: %d, 错误: %v", order.Id, delErr) - } - - if order.Status == "paid" && query.QueryState == "pending" { - // 更新查询状态为失败 - query.QueryState = "failed" - updateQueryErr := l.svcCtx.QueryModel.UpdateWithVersion(ctx, nil, query) - if updateQueryErr != nil { - logx.Errorf("更新查询状态失败,订单ID: %d, 错误: %v", order.Id, updateQueryErr) - return asynq.SkipRetry - } - - // 退款 - if order.PaymentPlatform == "wechat" { - refundErr := l.svcCtx.WechatPayService.WeChatRefund(ctx, order.OrderNo, order.Amount, order.Amount) - if refundErr != nil { - logx.Error(refundErr) - return asynq.SkipRetry - } - } else { - refund, refundErr := l.svcCtx.AlipayService.AliRefund(ctx, order.OrderNo, order.Amount) - if refundErr != nil { - logx.Error(refundErr) - return asynq.SkipRetry - } - if refund.IsSuccess() { - logx.Errorf("支付宝退款成功, orderID: %d", order.Id) - // 更新订单状态为退款 - order.Status = "refunded" - updateOrderErr := l.svcCtx.OrderModel.UpdateWithVersion(ctx, nil, order) - if updateOrderErr != nil { - logx.Errorf("更新订单状态失败,订单ID: %d, 错误: %v", order.Id, updateOrderErr) - return fmt.Errorf("更新订单状态失败: %v", updateOrderErr) - } - return asynq.SkipRetry - } else { - logx.Errorf("支付宝退款失败:%v", refundErr) - return asynq.SkipRetry - } - // 直接成功 - } - - } - - return asynq.SkipRetry -} - -// desensitizeParams 对敏感数据进行脱敏处理 -func (l *PaySuccessNotifyUserHandler) desensitizeParams(data []byte) ([]byte, error) { - // 解析JSON数据到map - var paramsMap map[string]interface{} - if err := json.Unmarshal(data, ¶msMap); err != nil { - return nil, fmt.Errorf("解析JSON数据失败: %v", err) - } - - // 处理可能包含敏感信息的字段 - for key, value := range paramsMap { - if strValue, ok := value.(string); ok { - // 根据字段名和内容判断并脱敏 - if isNameField(key) && len(strValue) > 0 { - // 姓名脱敏 - paramsMap[key] = maskName(strValue) - } else if isIDCardField(key) && len(strValue) > 10 { - // 身份证号脱敏 - paramsMap[key] = maskIDCard(strValue) - } else if isPhoneField(key) && len(strValue) >= 8 { - // 手机号脱敏 - paramsMap[key] = maskPhone(strValue) - } else if len(strValue) > 3 { - // 其他所有未匹配的字段都进行通用脱敏 - paramsMap[key] = maskGeneral(strValue) - } - } else if mapValue, ok := value.(map[string]interface{}); ok { - // 递归处理嵌套的map - for subKey, subValue := range mapValue { - if subStrValue, ok := subValue.(string); ok { - if isNameField(subKey) && len(subStrValue) > 0 { - mapValue[subKey] = maskName(subStrValue) - } else if isIDCardField(subKey) && len(subStrValue) > 10 { - mapValue[subKey] = maskIDCard(subStrValue) - } else if isPhoneField(subKey) && len(subStrValue) >= 8 { - mapValue[subKey] = maskPhone(subStrValue) - } else if len(subStrValue) > 3 { - // 其他所有未匹配的字段都进行通用脱敏 - mapValue[subKey] = maskGeneral(subStrValue) - } - } - } - } - } - - // 将处理后的map重新序列化为JSON - return json.Marshal(paramsMap) -} - -// 判断是否为姓名字段 -func isNameField(key string) bool { - key = strings.ToLower(key) - return strings.Contains(key, "name") || strings.Contains(key, "姓名") || - strings.Contains(key, "owner") || strings.Contains(key, "user") -} - -// 判断是否为身份证字段 -func isIDCardField(key string) bool { - key = strings.ToLower(key) - return strings.Contains(key, "idcard") || strings.Contains(key, "id_card") || - strings.Contains(key, "身份证") || strings.Contains(key, "证件号") -} - -// 判断是否为手机号字段 -func isPhoneField(key string) bool { - key = strings.ToLower(key) - return strings.Contains(key, "phone") || strings.Contains(key, "mobile") || - strings.Contains(key, "手机") || strings.Contains(key, "电话") -} - -// 判断是否包含敏感数据模式 -func containsSensitivePattern(value string) bool { - // 检查是否包含连续的数字或字母模式 - numPattern := regexp.MustCompile(`\d{6,}`) - return numPattern.MatchString(value) -} - -// 姓名脱敏 -func maskName(name string) string { - // 将字符串转换为rune切片以正确处理中文字符 - runes := []rune(name) - length := len(runes) - - if length <= 1 { - return name - } - - if length == 2 { - // 两个字:保留第一个字,第二个字用*替代 - return string(runes[0]) + "*" - } - - // 三个字及以上:保留首尾字,中间用*替代 - first := string(runes[0]) - last := string(runes[length-1]) - mask := strings.Repeat("*", length-2) - - return first + mask + last -} - -// 身份证号脱敏 -func maskIDCard(idCard string) string { - length := len(idCard) - if length <= 10 { - return idCard // 如果长度太短,可能不是身份证,不处理 - } - // 保留前3位和后4位 - return idCard[:3] + strings.Repeat("*", length-7) + idCard[length-4:] -} - -// 手机号脱敏 -func maskPhone(phone string) string { - length := len(phone) - if length < 8 { - return phone // 如果长度太短,可能不是手机号,不处理 - } - // 保留前3位和后4位 - return phone[:3] + strings.Repeat("*", length-7) + phone[length-4:] -} - -// 通用敏感信息脱敏 - 根据字符串长度比例进行脱敏 -func maskGeneral(value string) string { - length := len(value) - - // 小于3个字符的不脱敏 - if length <= 3 { - return value - } - - // 根据字符串长度计算保留字符数 - var prefixLen, suffixLen int - - switch { - case length <= 6: // 短字符串 - // 保留首尾各1个字符 - prefixLen, suffixLen = 1, 1 - case length <= 10: // 中等长度字符串 - // 保留首部30%和尾部20%的字符 - prefixLen = int(float64(length) * 0.3) - suffixLen = int(float64(length) * 0.2) - case length <= 20: // 较长字符串 - // 保留首部25%和尾部15%的字符 - prefixLen = int(float64(length) * 0.25) - suffixLen = int(float64(length) * 0.15) - default: // 非常长的字符串 - // 保留首部20%和尾部10%的字符 - prefixLen = int(float64(length) * 0.2) - suffixLen = int(float64(length) * 0.1) - } - - // 确保至少有一个字符被保留 - if prefixLen < 1 { - prefixLen = 1 - } - if suffixLen < 1 { - suffixLen = 1 - } - - // 确保前缀和后缀总长不超过总长度的80% - if prefixLen+suffixLen > int(float64(length)*0.8) { - // 调整为总长度的80% - totalVisible := int(float64(length) * 0.8) - // 前缀占60%,后缀占40% - prefixLen = int(float64(totalVisible) * 0.6) - suffixLen = totalVisible - prefixLen - } - - // 创建脱敏后的字符串 - prefix := value[:prefixLen] - suffix := value[length-suffixLen:] - masked := strings.Repeat("*", length-prefixLen-suffixLen) - - return prefix + masked + suffix -} diff --git a/app/user/cmd/api/internal/queue/routes.go b/app/user/cmd/api/internal/queue/routes.go deleted file mode 100644 index 18033b7..0000000 --- a/app/user/cmd/api/internal/queue/routes.go +++ /dev/null @@ -1,40 +0,0 @@ -package queue - -import ( - "context" - "fmt" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/hibiken/asynq" -) - -type CronJob struct { - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewCronJob(ctx context.Context, svcCtx *svc.ServiceContext) *CronJob { - return &CronJob{ - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *CronJob) Register() *asynq.ServeMux { - redisClientOpt := asynq.RedisClientOpt{Addr: l.svcCtx.Config.CacheRedis[0].Host, Password: l.svcCtx.Config.CacheRedis[0].Pass} - scheduler := asynq.NewScheduler(redisClientOpt, nil) - task := asynq.NewTask(types.MsgCleanQueryData, nil, nil) - _, err := scheduler.Register(TASKTIME, task) - if err != nil { - panic(fmt.Sprintf("定时任务注册失败:%v", err)) - } - scheduler.Start() - fmt.Println("定时任务启动!!!") - - mux := asynq.NewServeMux() - mux.Handle(types.MsgPaySuccessQuery, NewPaySuccessNotifyUserHandler(l.svcCtx)) - mux.Handle(types.MsgCleanQueryData, NewCleanQueryDataHandler(l.svcCtx)) - - return mux -} diff --git a/app/user/cmd/api/internal/service/agentService.go b/app/user/cmd/api/internal/service/agentService.go deleted file mode 100644 index bae3dbb..0000000 --- a/app/user/cmd/api/internal/service/agentService.go +++ /dev/null @@ -1,344 +0,0 @@ -package service - -import ( - "context" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/model" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -type AgentService struct { - config config.Config - AgentModel model.AgentModel - AgentAuditModel model.AgentAuditModel - AgentClosureModel model.AgentClosureModel - AgentCommissionModel model.AgentCommissionModel - AgentCommissionDeductionModel model.AgentCommissionDeductionModel - AgentWalletModel model.AgentWalletModel - AgentLinkModel model.AgentLinkModel - AgentOrderModel model.AgentOrderModel - AgentRewardsModel model.AgentRewardsModel - AgentMembershipConfigModel model.AgentMembershipConfigModel - AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel - AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel - AgentProductConfigModel model.AgentProductConfigModel - AgentPlatformDeductionModel model.AgentPlatformDeductionModel - AgentActiveStatModel model.AgentActiveStatModel - AgentWithdrawalModel model.AgentWithdrawalModel -} - -func NewAgentService(c config.Config, agentModel model.AgentModel, agentAuditModel model.AgentAuditModel, - agentClosureModel model.AgentClosureModel, agentCommissionModel model.AgentCommissionModel, - agentCommissionDeductionModel model.AgentCommissionDeductionModel, agentWalletModel model.AgentWalletModel, agentLinkModel model.AgentLinkModel, agentOrderModel model.AgentOrderModel, agentRewardsModel model.AgentRewardsModel, - agentMembershipConfigModel model.AgentMembershipConfigModel, - agentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel, - agentMembershipUserConfigModel model.AgentMembershipUserConfigModel, - agentProductConfigModel model.AgentProductConfigModel, agentPlatformDeductionModel model.AgentPlatformDeductionModel, - agentActiveStatModel model.AgentActiveStatModel, agentWithdrawalModel model.AgentWithdrawalModel) *AgentService { - - return &AgentService{ - config: c, - AgentModel: agentModel, - AgentAuditModel: agentAuditModel, - AgentClosureModel: agentClosureModel, - AgentCommissionModel: agentCommissionModel, - AgentCommissionDeductionModel: agentCommissionDeductionModel, - AgentWalletModel: agentWalletModel, - AgentLinkModel: agentLinkModel, - AgentOrderModel: agentOrderModel, - AgentRewardsModel: agentRewardsModel, - AgentMembershipConfigModel: agentMembershipConfigModel, - AgentMembershipRechargeOrderModel: agentMembershipRechargeOrderModel, - AgentMembershipUserConfigModel: agentMembershipUserConfigModel, - AgentProductConfigModel: agentProductConfigModel, - AgentPlatformDeductionModel: agentPlatformDeductionModel, - AgentActiveStatModel: agentActiveStatModel, - AgentWithdrawalModel: agentWithdrawalModel, - } -} - -// AgentProcess 推广单成功 -func (l *AgentService) AgentProcess(ctx context.Context, order *model.Order) error { - // 获取是否该订单是代理推广订单 - agentOrderModel, err := l.AgentOrderModel.FindOneByOrderId(ctx, order.Id) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return err - } - if errors.Is(err, model.ErrNotFound) || agentOrderModel == nil { - return nil - } - // 事务 - transErr := l.AgentWalletModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error { - agentID := agentOrderModel.AgentId - agentProductConfigModel, findAgentProductConfigModelErr := l.AgentProductConfigModel.FindOneByProductId(transCtx, order.ProductId) - if findAgentProductConfigModelErr != nil { - return findAgentProductConfigModelErr - } - // 平台底价成本 - PlatformCostAmount, platformCostErr := l.PlatformCost(transCtx, agentID, agentProductConfigModel, session) - if platformCostErr != nil { - return platformCostErr - } - - // 平台提价成本 - PlatformPricingAmount, platformPricingErr := l.PlatformPricing(transCtx, agentID, order.Amount, agentProductConfigModel, session) - if platformPricingErr != nil { - return platformPricingErr - } - - // 查找上级 - AgentClosureModel, findAgentClosureModelErr := l.AgentClosureModel.FindOneByDescendantIdDepth(transCtx, agentID, 1) - if findAgentClosureModelErr != nil && !errors.Is(findAgentClosureModelErr, model.ErrNotFound) { - return findAgentClosureModelErr - } - - var descendantDeductedAmount = 0.00 - if AgentClosureModel != nil { - AncestorId := AgentClosureModel.AncestorId - AncestorModel, findAgentModelErr := l.AgentModel.FindOne(transCtx, AncestorId) - if findAgentModelErr != nil != errors.Is(findAgentModelErr, model.ErrNotFound) { - return findAgentModelErr - } - if AgentClosureModel != nil { - if AncestorModel.LevelName == "" { - AncestorModel.LevelName = model.AgentLeveNameNormal - } - AgentMembershipConfigModel, findAgentMembersipConfigModelErr := l.AgentMembershipConfigModel.FindOneByLevelName(ctx, AncestorModel.LevelName) - if findAgentMembersipConfigModelErr != nil { - return findAgentMembersipConfigModelErr - } - // 定价 - commissionCost, commissionCostErr := l.CommissionCost(transCtx, agentID, AncestorId, AgentMembershipConfigModel, order.ProductId, session) - if commissionCostErr != nil { - return commissionCostErr - } - // 提价 - commissionPricing, commissionPricingErr := l.CommissionPricing(transCtx, agentID, AncestorId, AgentMembershipConfigModel, order.ProductId, order.Amount, session) - if commissionPricingErr != nil { - return commissionPricingErr - } - - // 上级克扣的成本 - descendantDeductedAmount = commissionCost + commissionPricing - - // 佣金 - ancestorCommissionReward, ancestorCommissionErr := l.AncestorCommission(transCtx, agentID, AncestorId, session) - if ancestorCommissionErr != nil { - return ancestorCommissionErr - } - - // 给上级成本以及佣金 - ancestorCommissionAmount := commissionCost + commissionPricing + ancestorCommissionReward - ancestorWallet, findAgentWalletModelErr := l.AgentWalletModel.FindOneByAgentId(transCtx, AncestorId) - if findAgentWalletModelErr != nil { - return findAgentWalletModelErr - } - - ancestorWallet.Balance += ancestorCommissionAmount - ancestorWallet.TotalEarnings += ancestorCommissionAmount - updateErr := l.AgentWalletModel.UpdateWithVersion(transCtx, session, ancestorWallet) - if updateErr != nil { - return updateErr - } - } - } - - // 推广人扣除金额 = 平台成本价 + 平台提价成本 + 上级佣金 - deductedAmount := PlatformCostAmount + PlatformPricingAmount + descendantDeductedAmount - agentCommissionErr := l.AgentCommission(transCtx, agentID, order, deductedAmount, session) - if agentCommissionErr != nil { - return agentCommissionErr - } - - return nil - }) - if transErr != nil { - return transErr - } - - return nil -} - -// AgentCommission 直推报告推广人佣金 -func (l *AgentService) AgentCommission(ctx context.Context, agentID int64, order *model.Order, deductedAmount float64, session sqlx.Session) error { - agentWalletModel, findAgentWalletModelErr := l.AgentWalletModel.FindOneByAgentId(ctx, agentID) - if findAgentWalletModelErr != nil { - return findAgentWalletModelErr - } - // 推广人最终获得代理佣金 - finalCommission := order.Amount - deductedAmount - agentWalletModel.Balance += finalCommission - agentWalletModel.TotalEarnings += finalCommission - - agentCommission := model.AgentCommission{ - AgentId: agentID, - OrderId: order.Id, - Amount: finalCommission, - ProductId: order.ProductId, - } - _, insertAgentCommissionErr := l.AgentCommissionModel.Insert(ctx, session, &agentCommission) - if insertAgentCommissionErr != nil { - return insertAgentCommissionErr - } - - updateAgentWalletErr := l.AgentWalletModel.UpdateWithVersion(ctx, session, agentWalletModel) - if updateAgentWalletErr != nil { - return updateAgentWalletErr - } - return nil -} - -// AncestorCommission 直推报告上级佣金(奖励型) -func (l *AgentService) AncestorCommission(ctx context.Context, descendantId int64, ancestorId int64, session sqlx.Session) (float64, error) { - agentModel, err := l.AgentModel.FindOneByUserId(ctx, ancestorId) - if err != nil { - return 0, err - } - if agentModel.LevelName == "" { - agentModel.LevelName = model.AgentLeveNameNormal - } - agentMembershipConfigModel, err := l.AgentMembershipConfigModel.FindOneByLevelName(ctx, agentModel.LevelName) - if err != nil { - return 0, err - } - - if agentMembershipConfigModel.ReportCommission.Valid { - reportCommissionAmount := agentMembershipConfigModel.ReportCommission.Float64 - agentRewards := model.AgentRewards{ - AgentId: ancestorId, - Amount: reportCommissionAmount, - RelationAgentId: lzUtils.Int64ToNullInt64(descendantId), - Type: model.AgentRewardsTypeDescendantPromotion, - } - - _, agentRewardsModelInsetErr := l.AgentRewardsModel.Insert(ctx, session, &agentRewards) - if agentRewardsModelInsetErr != nil { - return 0, agentRewardsModelInsetErr - } - return reportCommissionAmount, nil - } - - return 0, nil -} - -// PlatformCost 平台底价成本 -func (l *AgentService) PlatformCost(ctx context.Context, agentID int64, agentProductConfigModel *model.AgentProductConfig, session sqlx.Session) (float64, error) { - - costAgentPlatformDeductionModel := model.AgentPlatformDeduction{ - AgentId: agentID, - Amount: agentProductConfigModel.CostPrice, - Type: model.AgentDeductionTypeCost, - } - - _, err := l.AgentPlatformDeductionModel.Insert(ctx, session, &costAgentPlatformDeductionModel) - if err != nil { - return 0, err - } - return agentProductConfigModel.CostPrice, nil -} - -// PlatformPricing 平台提价成本 -func (l *AgentService) PlatformPricing(ctx context.Context, agentID int64, pricing float64, agentProductConfigModel *model.AgentProductConfig, session sqlx.Session) (float64, error) { - // 2. 计算平台提价成本 - if pricing > agentProductConfigModel.PricingStandard { - // 超出部分 - overpricing := pricing - agentProductConfigModel.PricingStandard - - // 收取成本 - overpricingCost := overpricing * agentProductConfigModel.OverpricingRatio - - pricingAgentPlatformDeductionModel := model.AgentPlatformDeduction{ - AgentId: agentID, - Amount: overpricingCost, - Type: model.AgentDeductionTypePricing, - } - - _, err := l.AgentPlatformDeductionModel.Insert(ctx, session, &pricingAgentPlatformDeductionModel) - if err != nil { - return 0, err - } - return overpricingCost, nil - } - return 0, nil -} - -// CommissionCost 上级底价成本 -func (l *AgentService) CommissionCost(ctx context.Context, descendantId int64, AncestorId int64, agentMembershipConfigModel *model.AgentMembershipConfig, productID int64, session sqlx.Session) (float64, error) { - if agentMembershipConfigModel.PriceIncreaseAmount.Valid { - // 拥有则查看该上级设定的成本 - agentMembershipUserConfigModel, findAgentMembershipUserConfigModelErr := l.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(ctx, AncestorId, productID) - if findAgentMembershipUserConfigModelErr != nil { - return 0, findAgentMembershipUserConfigModelErr - } - - deductCostAmount := agentMembershipUserConfigModel.PriceIncreaseAmount - - agentCommissionDeductionModel := model.AgentCommissionDeduction{ - AgentId: AncestorId, - DeductedAgentId: descendantId, - Amount: deductCostAmount, - Type: model.AgentDeductionTypeCost, - ProductId: productID, - } - - _, insertAgentCommissionDeductionModelErr := l.AgentCommissionDeductionModel.Insert(ctx, session, &agentCommissionDeductionModel) - if insertAgentCommissionDeductionModelErr != nil { - return 0, insertAgentCommissionDeductionModelErr - } - - return deductCostAmount, nil - } - return 0, nil -} - -// CommissionPricing 上级提价成本 -func (l *AgentService) CommissionPricing(ctx context.Context, descendantId int64, AncestorId int64, agentMembershipConfigModel *model.AgentMembershipConfig, productID int64, pricing float64, session sqlx.Session) (float64, error) { - //看上级代理等级否有拥有定价标准收益功能 - if agentMembershipConfigModel.PriceIncreaseMax.Valid && agentMembershipConfigModel.PriceRatio.Valid { - // 拥有则查看该上级设定的成本 - agentMembershipUserConfigModel, findAgentMembershipUserConfigModelErr := l.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(ctx, AncestorId, productID) - if findAgentMembershipUserConfigModelErr != nil { - return 0, findAgentMembershipUserConfigModelErr - } - - // 计算是否在范围内 - var pricingRange float64 - if pricing > agentMembershipUserConfigModel.PriceRangeFrom { - if pricing > agentMembershipUserConfigModel.PriceRangeTo { - pricingRange = agentMembershipUserConfigModel.PriceRangeTo - agentMembershipUserConfigModel.PriceRangeFrom - } else { - pricingRange = pricing - agentMembershipUserConfigModel.PriceRangeFrom - } - } - - deductCostAmount := pricingRange * agentMembershipUserConfigModel.PriceRatio - - agentCommissionDeductionModel := model.AgentCommissionDeduction{ - AgentId: AncestorId, - DeductedAgentId: descendantId, - Amount: deductCostAmount, - Type: model.AgentDeductionTypePricing, - ProductId: productID, - } - _, insertAgentCommissionDeductionModelErr := l.AgentCommissionDeductionModel.Insert(ctx, session, &agentCommissionDeductionModel) - if insertAgentCommissionDeductionModelErr != nil { - return 0, insertAgentCommissionDeductionModelErr - } - return deductCostAmount, nil - } - return 0, nil -} - -//func (l *AgentService) UpgradeVip(ctx context.Context, agentID int64, leve string, session sqlx.Session) error { -// agentModel, err := l.AgentModel.FindOne(ctx, agentID) -// if err != nil { -// return err -// } -// if agentModel.LevelName != model.AgentLeveNameNormal { -// return fmt.Errorf("已经是会员") -// } -// return nil -//} diff --git a/app/user/cmd/api/internal/service/alipayService.go b/app/user/cmd/api/internal/service/alipayService.go deleted file mode 100644 index b233cbb..0000000 --- a/app/user/cmd/api/internal/service/alipayService.go +++ /dev/null @@ -1,257 +0,0 @@ -package service - -import ( - "context" - "crypto/rand" - "encoding/hex" - "fmt" - "net/http" - "strconv" - "sync/atomic" - "time" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/smartwalle/alipay/v3" -) - -type AliPayService struct { - config config.AlipayConfig - AlipayClient *alipay.Client -} - -// NewAliPayService 是一个构造函数,用于初始化 AliPayService -func NewAliPayService(c config.Config) *AliPayService { - client, err := alipay.New(c.Alipay.AppID, c.Alipay.PrivateKey, c.Alipay.IsProduction) - if err != nil { - panic(fmt.Sprintf("创建支付宝客户端失败: %v", err)) - } - //// 加载支付宝公钥 - //err = client.LoadAliPayPublicKey(c.Alipay.AlipayPublicKey) - //if err != nil { - // panic(fmt.Sprintf("加载支付宝公钥失败: %v", err)) - //} - - // 加载证书 - if err = client.LoadAppCertPublicKeyFromFile(c.Alipay.AppCertPath); err != nil { - panic(fmt.Sprintf("加载应用公钥证书失败: %v", err)) - } - if err = client.LoadAlipayCertPublicKeyFromFile(c.Alipay.AlipayCertPath); err != nil { - panic(fmt.Sprintf("加载支付宝公钥证书失败: %v", err)) - } - if err = client.LoadAliPayRootCertFromFile(c.Alipay.AlipayRootCertPath); err != nil { - panic(fmt.Sprintf("加载根证书失败: %v", err)) - } - - return &AliPayService{ - config: c.Alipay, - AlipayClient: client, - } -} - -func (a *AliPayService) CreateAlipayAppOrder(amount float64, subject string, outTradeNo string) (string, error) { - client := a.AlipayClient - totalAmount := lzUtils.ToAlipayAmount(amount) - // 构造移动支付请求 - p := alipay.TradeAppPay{ - Trade: alipay.Trade{ - Subject: subject, - OutTradeNo: outTradeNo, - TotalAmount: totalAmount, - ProductCode: "QUICK_MSECURITY_PAY", // 移动端支付专用代码 - NotifyURL: a.config.NotifyUrl, // 异步回调通知地址 - }, - } - - // 获取APP支付字符串,这里会签名 - payStr, err := client.TradeAppPay(p) - if err != nil { - return "", fmt.Errorf("创建支付宝订单失败: %v", err) - } - - return payStr, nil -} - -// CreateAlipayH5Order 创建支付宝H5支付订单 -func (a *AliPayService) CreateAlipayH5Order(amount float64, subject string, outTradeNo string) (string, error) { - client := a.AlipayClient - totalAmount := lzUtils.ToAlipayAmount(amount) - // 构造H5支付请求 - p := alipay.TradeWapPay{ - Trade: alipay.Trade{ - Subject: subject, - OutTradeNo: outTradeNo, - TotalAmount: totalAmount, - ProductCode: "QUICK_WAP_PAY", // H5支付专用产品码 - NotifyURL: a.config.NotifyUrl, // 异步回调通知地址 - ReturnURL: a.config.ReturnURL, - }, - } - // 获取H5支付请求字符串,这里会签名 - payUrl, err := client.TradeWapPay(p) - if err != nil { - return "", fmt.Errorf("创建支付宝H5订单失败: %v", err) - } - - return payUrl.String(), nil -} - -// CreateAlipayOrder 根据平台类型创建支付宝支付订单 -func (a *AliPayService) CreateAlipayOrder(ctx context.Context, amount float64, subject string, outTradeNo string) (string, error) { - // 根据 ctx 中的 platform 判断平台 - platform, platformOk := ctx.Value("platform").(string) - if !platformOk { - return "", fmt.Errorf("无的支付平台: %s", platform) - } - switch platform { - case "app": - // 调用App支付的创建方法 - return a.CreateAlipayAppOrder(amount, subject, outTradeNo) - case "h5": - // 调用H5支付的创建方法,并传入 returnUrl - return a.CreateAlipayH5Order(amount, subject, outTradeNo) - default: - return "", fmt.Errorf("不支持的支付平台: %s", platform) - } -} - -// AliRefund 发起支付宝退款 -func (a *AliPayService) AliRefund(ctx context.Context, outTradeNo string, refundAmount float64) (*alipay.TradeRefundRsp, error) { - refund := alipay.TradeRefund{ - OutTradeNo: outTradeNo, - RefundAmount: lzUtils.ToAlipayAmount(refundAmount), - OutRequestNo: fmt.Sprintf("%s-refund", outTradeNo), - } - - // 发起退款请求 - refundResp, err := a.AlipayClient.TradeRefund(ctx, refund) - if err != nil { - return nil, fmt.Errorf("支付宝退款请求错误:%v", err) - } - return refundResp, nil -} - -// HandleAliPaymentNotification 支付宝支付回调 -func (a *AliPayService) HandleAliPaymentNotification(r *http.Request) (*alipay.Notification, error) { - // 解析表单 - err := r.ParseForm() - if err != nil { - return nil, fmt.Errorf("解析请求表单失败:%v", err) - } - // 解析并验证通知,DecodeNotification 会自动验证签名 - notification, err := a.AlipayClient.DecodeNotification(r.Form) - if err != nil { - return nil, fmt.Errorf("验证签名失败: %v", err) - } - return notification, nil -} -func (a *AliPayService) QueryOrderStatus(ctx context.Context, outTradeNo string) (*alipay.TradeQueryRsp, error) { - queryRequest := alipay.TradeQuery{ - OutTradeNo: outTradeNo, - } - - // 发起查询请求 - resp, err := a.AlipayClient.TradeQuery(ctx, queryRequest) - if err != nil { - return nil, fmt.Errorf("查询支付宝订单失败: %v", err) - } - - // 返回交易状态 - if resp.IsSuccess() { - return resp, nil - } - - return nil, fmt.Errorf("查询支付宝订单失败: %v", resp.SubMsg) -} - -// 添加全局原子计数器 -var alipayOrderCounter uint32 = 0 - -// GenerateOutTradeNo 生成唯一订单号的函数 - 优化版本 -func (a *AliPayService) GenerateOutTradeNo() string { - - // 获取当前时间戳(毫秒级) - timestamp := time.Now().UnixMilli() - timeStr := strconv.FormatInt(timestamp, 10) - - // 原子递增计数器 - counter := atomic.AddUint32(&alipayOrderCounter, 1) - - // 生成4字节真随机数 - randomBytes := make([]byte, 4) - _, err := rand.Read(randomBytes) - if err != nil { - // 如果随机数生成失败,回退到使用时间纳秒数据 - randomBytes = []byte(strconv.FormatInt(time.Now().UnixNano()%1000000, 16)) - } - randomHex := hex.EncodeToString(randomBytes) - - // 组合所有部分: 前缀 + 时间戳 + 计数器 + 随机数 - orderNo := fmt.Sprintf("%s%06x%s", timeStr[:10], counter%0xFFFFFF, randomHex[:6]) - - // 确保长度不超过32字符(大多数支付平台的限制) - if len(orderNo) > 32 { - orderNo = orderNo[:32] - } - - return orderNo -} - -// AliTransfer 支付宝单笔转账到支付宝账户(提现功能) -func (a *AliPayService) AliTransfer( - ctx context.Context, - payeeAccount string, // 收款方支付宝账户 - payeeName string, // 收款方姓名 - amount float64, // 转账金额 - remark string, // 转账备注 - outBizNo string, // 商户转账唯一订单号(可使用GenerateOutTradeNo生成) -) (*alipay.FundTransUniTransferRsp, error) { - // 参数校验 - if payeeAccount == "" { - return nil, fmt.Errorf("收款账户不能为空") - } - if amount <= 0 { - return nil, fmt.Errorf("转账金额必须大于0") - } - - // 构造转账请求 - req := alipay.FundTransUniTransfer{ - OutBizNo: outBizNo, - TransAmount: lzUtils.ToAlipayAmount(amount), // 金额格式转换 - ProductCode: "TRANS_ACCOUNT_NO_PWD", // 单笔无密转账到支付宝账户 - BizScene: "DIRECT_TRANSFER", // 单笔转账 - OrderTitle: "账户提现", // 转账标题 - Remark: remark, - PayeeInfo: &alipay.PayeeInfo{ - Identity: payeeAccount, - IdentityType: "ALIPAY_LOGON_ID", // 根据账户类型选择: - Name: payeeName, - // ALIPAY_USER_ID/ALIPAY_LOGON_ID - }, - } - - // 执行转账请求 - transferRsp, err := a.AlipayClient.FundTransUniTransfer(ctx, req) - if err != nil { - return nil, fmt.Errorf("支付宝转账请求失败: %v", err) - } - - return transferRsp, nil -} -func (a *AliPayService) QueryTransferStatus( - ctx context.Context, - outBizNo string, -) (*alipay.FundTransOrderQueryRsp, error) { - req := alipay.FundTransOrderQuery{ - OutBizNo: outBizNo, - } - response, err := a.AlipayClient.FundTransOrderQuery(ctx, req) - if err != nil { - return nil, fmt.Errorf("支付宝接口调用失败: %v", err) - } - // 处理响应 - if response.Code.IsFailure() { - return nil, fmt.Errorf("支付宝返回错误: %s-%s", response.Code, response.Msg) - } - return response, nil -} diff --git a/app/user/cmd/api/internal/service/apirequestService.go b/app/user/cmd/api/internal/service/apirequestService.go deleted file mode 100644 index e292f56..0000000 --- a/app/user/cmd/api/internal/service/apirequestService.go +++ /dev/null @@ -1,2092 +0,0 @@ -package service - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "sort" - "strings" - "sync" - "sync/atomic" - "time" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/model" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/Masterminds/squirrel" - "github.com/bytedance/sonic" - "github.com/tidwall/gjson" - "github.com/zeromicro/go-zero/core/logx" -) - -type ApiRequestService struct { - config config.Config - westDexService *WestDexService - yushanService *YushanService - featureModel model.FeatureModel - productFeatureModel model.ProductFeatureModel -} - -// NewApiRequestService 是一个构造函数,用于初始化 ApiRequestService -func NewApiRequestService(c config.Config, westDexService *WestDexService, yushanService *YushanService, featureModel model.FeatureModel, productFeatureModel model.ProductFeatureModel) *ApiRequestService { - return &ApiRequestService{ - config: c, - featureModel: featureModel, - productFeatureModel: productFeatureModel, - westDexService: westDexService, - yushanService: yushanService, - } -} - -type APIResponseData struct { - ApiID string `json:"apiID"` - Data json.RawMessage `json:"data"` // 这里用 RawMessage 来存储原始的 data - Success bool `json:"success"` - Timestamp string `json:"timestamp"` - Error string `json:"error,omitempty"` -} - -// ProcessRequests 处理请求 -func (a *ApiRequestService) ProcessRequests(params []byte, productID int64) ([]byte, error) { - var ctx, cancel = context.WithCancel(context.Background()) - defer cancel() - build := a.productFeatureModel.SelectBuilder().Where(squirrel.Eq{ - "product_id": productID, - }) - productFeatureList, findProductFeatureErr := a.productFeatureModel.FindAll(ctx, build, "") - if findProductFeatureErr != nil { - return nil, findProductFeatureErr - } - var featureIDs []int64 - isImportantMap := make(map[int64]int64, len(productFeatureList)) - for _, pf := range productFeatureList { - featureIDs = append(featureIDs, pf.FeatureId) - isImportantMap[pf.FeatureId] = pf.IsImportant - } - if len(featureIDs) == 0 { - return nil, errors.New("featureIDs 是空的") - } - builder := a.featureModel.SelectBuilder().Where(squirrel.Eq{"id": featureIDs}) - featureList, findFeatureErr := a.featureModel.FindAll(ctx, builder, "") - if findFeatureErr != nil { - return nil, findFeatureErr - } - if len(featureList) == 0 { - return nil, errors.New("处理请求错误,产品无对应接口功能") - } - var ( - wg sync.WaitGroup - resultsCh = make(chan APIResponseData, len(featureList)) - errorsCh = make(chan error, len(featureList)) - errorCount int32 - errorLimit = len(featureList) - retryNum = 5 - ) - - for i, feature := range featureList { - wg.Add(1) - go func(i int, feature *model.Feature) { - defer wg.Done() - - select { - case <-ctx.Done(): - return - default: - } - result := APIResponseData{ - ApiID: feature.ApiId, - Success: false, - } - timestamp := time.Now().Format("2006-01-02 15:04:05") - var ( - resp json.RawMessage - preprocessErr error - ) - // 若 isImportantMap[feature.ID] == 1,则表示需要在出错时重试 - isImportant := isImportantMap[feature.Id] == 1 - tryCount := 0 - for { - tryCount++ - resp, preprocessErr = a.PreprocessRequestApi(params, feature.ApiId) - if preprocessErr == nil { - break - } - if isImportant && tryCount < retryNum { - continue - } else { - break - } - } - if preprocessErr != nil { - result.Timestamp = timestamp - result.Error = preprocessErr.Error() - result.Data = resp - resultsCh <- result - errorsCh <- fmt.Errorf("请求失败: %v", preprocessErr) - atomic.AddInt32(&errorCount, 1) - if atomic.LoadInt32(&errorCount) >= int32(errorLimit) { - cancel() - } - return - } - - result.Data = resp - result.Success = true - result.Timestamp = timestamp - resultsCh <- result - }(i, feature) - } - - go func() { - wg.Wait() - close(resultsCh) - close(errorsCh) - }() - // 收集所有结果并合并z - var responseData []APIResponseData - for result := range resultsCh { - responseData = append(responseData, result) - } - if atomic.LoadInt32(&errorCount) >= int32(errorLimit) { - var allErrors []error - for err := range errorsCh { - allErrors = append(allErrors, err) - } - return nil, fmt.Errorf("请求失败次数超过 %d 次: %v", errorLimit, allErrors) - } - - combinedResponse, err := json.Marshal(responseData) - if err != nil { - return nil, fmt.Errorf("响应数据转 JSON 失败: %v", err) - } - - return combinedResponse, nil -} - -// ------------------------------------请求处理器-------------------------- -var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, error){ - "G09SC02": (*ApiRequestService).ProcessG09SC02Request, - "G27BJ05": (*ApiRequestService).ProcessG27BJ05Request, - "G26BJ05": (*ApiRequestService).ProcessG26BJ05Request, - "G34BJ03": (*ApiRequestService).ProcessG34BJ03Request, - "G35SC01": (*ApiRequestService).ProcessG35SC01Request, - "G28BJ05": (*ApiRequestService).ProcessG28BJ05Request, - "G05HZ01": (*ApiRequestService).ProcessG05HZ01Request, - "Q23SC01": (*ApiRequestService).ProcessQ23SC01Request, - "G15BJ02": (*ApiRequestService).ProcessG15BJ02Request, - "G17BJ02": (*ApiRequestService).ProcessG17BJ02Request, - "G08SC02": (*ApiRequestService).ProcessG08SC02Request, - "KZEYS": (*ApiRequestService).ProcessKZEYSRequest, - "P_C_B332": (*ApiRequestService).ProcessP_C_B332Request, - "FIN019": (*ApiRequestService).ProcessFIN019Request, - "CAR061": (*ApiRequestService).ProcessCAR061Request, - "IDV044": (*ApiRequestService).ProcessIDV044Request, - "G10SC02": (*ApiRequestService).ProcessG10SC02Request, - "G03HZ01": (*ApiRequestService).ProcessG03HZ01Request, - "G02BJ02": (*ApiRequestService).ProcessG02BJ02Request, - "G19BJ02": (*ApiRequestService).ProcessG19BJ02Request, - "G20GZ01": (*ApiRequestService).ProcessG20GZ01Request, - "G37SC01": (*ApiRequestService).ProcessG37SC01Request, - "G36SC01": (*ApiRequestService).ProcessG36SC01Request, - "G22SC01": (*ApiRequestService).ProcessG22SC01Request, - "Q03SC01": (*ApiRequestService).ProcessQ03SC01Request, - "G39SC02": (*ApiRequestService).ProcessG39SC02Request, - "G38SC02": (*ApiRequestService).ProcessG38SC02Request, - "layoutIdcard": (*ApiRequestService).ProcessLayoutIdcardRequest, - - // New Feature - "PersonEnterprisePro": (*ApiRequestService).ProcessPersonEnterpriseProRequest, - "BehaviorRiskScan": (*ApiRequestService).ProcessBehaviorRiskScanRequest, - "G30BJ05": (*ApiRequestService).ProcessG30BJ05Request, - "G31BJ05": (*ApiRequestService).ProcessG31BJ05Request, - "G32BJ05": (*ApiRequestService).ProcessG32BJ05Request, - "RIS031": (*ApiRequestService).ProcessRIS031Request, - "G09XM02": (*ApiRequestService).ProcessG09XM02Request, - "G10XM02": (*ApiRequestService).ProcessG10XM02Request, - "G11BJ06": (*ApiRequestService).ProcessG11BJ06Request, - "G29BJ05": (*ApiRequestService).ProcessG29BJ05Request, - "Marriage": (*ApiRequestService).ProcessMarriageRequest, -} - -// PreprocessRequestApi 调用指定的请求处理函数 -func (a *ApiRequestService) PreprocessRequestApi(params []byte, apiID string) ([]byte, error) { - if processor, exists := requestProcessors[apiID]; exists { - return processor(a, params) // 调用 ApiRequestService 方法 - } - - return nil, errors.New("api请求, 未找到相应的处理程序") -} - -func (a *ApiRequestService) ProcessG09SC02Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G09SC02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "certNumMan": a.westDexService.Encrypt(idCard.String()), - "nameMan": a.westDexService.Encrypt(name.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G09SC02", request) - if callApiErr != nil { - return nil, callApiErr - } - result := gjson.GetBytes(resp, "data.0.maritalStatus") - - if result.Exists() { - responseMap := map[string]string{"status": result.String()} - jsonResponse, err := json.Marshal(responseMap) - if err != nil { - return nil, err - } - return jsonResponse, nil - } else { - return nil, errors.New("查询为空") - } -} - -func (a *ApiRequestService) ProcessG27BJ05Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, G27BJ05, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "id": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - "cell": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G27BJ05", request) - if callApiErr != nil { - return nil, callApiErr - } - // 获取 code 字段 - codeResult := gjson.GetBytes(resp, "code") - if !codeResult.Exists() { - return nil, fmt.Errorf("code 字段不存在") - } - if codeResult.String() != "00" { - return nil, fmt.Errorf("未匹配到相关结果") - } - - // 获取 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("data 字段不存在") - } - - // 将 data 字段解析为 map - var dataMap map[string]interface{} - if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil { - return nil, fmt.Errorf("解析 data 字段失败: %v", err) - } - - // 删除指定字段 - delete(dataMap, "swift_number") - delete(dataMap, "DataStrategy") - - // 重新编码为 JSON - modifiedData, err := json.Marshal(dataMap) - if err != nil { - return nil, fmt.Errorf("编码修改后的 data 失败: %v", err) - } - return modifiedData, nil -} - -func (a *ApiRequestService) ProcessG26BJ05Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, G26BJ05, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "id": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - "cell": a.westDexService.Encrypt(mobile.String()), - "time_range": 5, - }, - } - resp, callApiErr := a.westDexService.CallAPI("G26BJ05", request) - if callApiErr != nil { - return nil, callApiErr - } - codeResult := gjson.GetBytes(resp, "code") - if !codeResult.Exists() { - return nil, fmt.Errorf("code 字段不存在") - } - if codeResult.String() != "00" { - return nil, fmt.Errorf("未匹配到相关结果") - } - - // 获取 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("data 字段不存在") - } - - // 将 data 字段解析为 map - var dataMap map[string]interface{} - if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil { - return nil, fmt.Errorf("解析 data 字段失败: %v", err) - } - - // 删除指定字段 - delete(dataMap, "swift_number") - delete(dataMap, "DataStrategy") - - // 重新编码为 JSON - modifiedData, err := json.Marshal(dataMap) - if err != nil { - return nil, fmt.Errorf("编码修改后的 data 失败: %v", err) - } - return modifiedData, nil -} - -func (a *ApiRequestService) ProcessG34BJ03Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G34BJ03, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "id_card": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G34BJ03", request) - if callApiErr != nil { - return nil, callApiErr - } - dataResult := gjson.GetBytes(resp, "negative_info.data.risk_level") - if dataResult.Exists() { - // 如果字段存在,构造包含 "status" 的 JSON 响应 - responseMap := map[string]string{"risk_level": dataResult.String()} - jsonResponse, err := json.Marshal(responseMap) - if err != nil { - return nil, err - } - return jsonResponse, nil - } else { - return nil, errors.New("查询为空") - } -} - -func (a *ApiRequestService) ProcessG35SC01Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G35SC01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "idcard": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - "inquired_auth": a.westDexService.GetDateRange(), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G35SC01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 第一步:提取外层的 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("外层 data 字段不存在") - } - - // 第二步:解析外层 data 的 JSON 字符串 - var outerDataMap map[string]interface{} - if err := json.Unmarshal([]byte(dataResult.String()), &outerDataMap); err != nil { - return nil, fmt.Errorf("解析外层 data 字段失败: %v", err) - } - - // 第三步:提取内层的 data 字段 - innerData, ok := outerDataMap["data"].(string) - if !ok { - return nil, fmt.Errorf("内层 data 字段不存在或类型错误") - } - - if innerData == "" || innerData == "{}" || innerData == "[]" { - innerData = "{}" - } - - // 第四步:解析内层 data 的 JSON 字符串 - var finalDataMap map[string]interface{} - if err := json.Unmarshal([]byte(innerData), &finalDataMap); err != nil { - return nil, fmt.Errorf("解析内层 data 字段失败: %v", err) - } - - finalDataBytes, err := json.Marshal(finalDataMap) - if err != nil { - return nil, fmt.Errorf("编码最终的 JSON 对象失败: %v", err) - } - - return finalDataBytes, nil -} - -func (a *ApiRequestService) ProcessG28BJ05Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, G28BJ05, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "id": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - "cell": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G28BJ05", request) - if callApiErr != nil { - return nil, callApiErr - } - // 获取 code 字段 - codeResult := gjson.GetBytes(resp, "code") - if !codeResult.Exists() { - return nil, fmt.Errorf("code 字段不存在") - } - if codeResult.String() != "00" { - return nil, fmt.Errorf("未匹配到相关结果") - } - - // 获取 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("data 字段不存在") - } - - // 将 data 字段解析为 map - var dataMap map[string]interface{} - if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil { - return nil, fmt.Errorf("解析 data 字段失败: %v", err) - } - - // 删除指定字段 - delete(dataMap, "swift_number") - delete(dataMap, "DataStrategy") - - // 重新编码为 JSON - modifiedData, err := json.Marshal(dataMap) - if err != nil { - return nil, fmt.Errorf("编码修改后的 data 失败: %v", err) - } - return modifiedData, nil -} - -func (a *ApiRequestService) ProcessG05HZ01Request(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - - if !idCard.Exists() { - return nil, errors.New("api请求, G05HZ01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "pid": crypto.Md5Encrypt(idCard.String()), - } - resp, callApiErr := a.westDexService.G05HZ01CallAPI("G05HZ01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 处理股东人企关系的响应数据 - code := gjson.GetBytes(resp, "code") - if !code.Exists() { - return nil, fmt.Errorf("响应中缺少 code 字段") - } - - // 判断 code 是否等于 "0000" - if code.String() == "0000" { - // 获取 data 字段的值 - data := gjson.GetBytes(resp, "data") - if !data.Exists() { - return nil, fmt.Errorf("响应中缺少 data 字段") - } - // 返回 data 字段的内容 - return []byte(data.Raw), nil - } - - // code 不等于 "0000",返回错误 - return nil, fmt.Errorf("响应code错误%s", code.String()) -} -func (a *ApiRequestService) ProcessQ23SC01Request(params []byte) ([]byte, error) { - entName := gjson.GetBytes(params, "ent_name") - entCode := gjson.GetBytes(params, "ent_code") - - if !entName.Exists() || !entCode.Exists() { - return nil, errors.New("api请求, Q23SC01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "uscc": a.westDexService.Encrypt(entCode.String()), - "org_name": a.westDexService.Encrypt(entName.String()), - "inquired_auth": a.westDexService.GetDateRange(), - }, - } - resp, callApiErr := a.westDexService.CallAPI("Q23SC01", request) - logx.Infof("企业涉诉返回%+v", string(resp)) - if callApiErr != nil { - return nil, callApiErr - } - // 第一步:提取外层的 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("外层 data 字段不存在") - } - - // 第二步:解析外层 data 的 JSON 字符串 - var outerDataMap map[string]interface{} - if err := json.Unmarshal([]byte(dataResult.String()), &outerDataMap); err != nil { - return nil, fmt.Errorf("解析外层 data 字段失败: %v", err) - } - - // 第三步:提取内层的 data 字段 - innerData, ok := outerDataMap["data"].(string) - if !ok { - return nil, fmt.Errorf("内层 data 字段不存在或类型错误") - } - - // 第四步:解析内层 data 的 JSON 字符串 - var finalDataMap map[string]interface{} - if err := json.Unmarshal([]byte(innerData), &finalDataMap); err != nil { - return nil, fmt.Errorf("解析内层 data 字段失败: %v", err) - } - - // 将最终的 JSON 对象编码为字节数组返回 - finalDataBytes, err := json.Marshal(finalDataMap) - if err != nil { - return nil, fmt.Errorf("编码最终的 JSON 对象失败: %v", err) - } - - statusResult := gjson.GetBytes(finalDataBytes, "status.status") - if statusResult.Exists() || statusResult.Int() == -1 { - return nil, fmt.Errorf("企业涉诉为空: %+v", finalDataBytes) - } - return finalDataBytes, nil -} - -func (a *ApiRequestService) ProcessG15BJ02Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, G15BJ02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "idNo": a.westDexService.Encrypt(idCard.String()), - "phone": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G15BJ02", request) - if callApiErr != nil { - return nil, callApiErr - } - dataResult := gjson.GetBytes(resp, "data.code") - if !dataResult.Exists() { - return nil, fmt.Errorf("code 字段不存在") - } - code := dataResult.Int() - // 处理允许的 code 值 - if code == 1000 || code == 1003 || code == 1004 || code == 1005 { - return resp, nil - } - - return nil, fmt.Errorf("三要素核验失败: %+v", resp) -} - -func (a *ApiRequestService) ProcessG17BJ02Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, G17BJ02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "phone": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G17BJ02", request) - if callApiErr != nil { - return nil, callApiErr - } - dataResult := gjson.GetBytes(resp, "data.code") - if !dataResult.Exists() { - return nil, fmt.Errorf("code 字段不存在") - } - code := dataResult.Int() - // 处理允许的 code 值 - if code == 1000 || code == 1001 { - return resp, nil - } - - return nil, fmt.Errorf("手机二要素核验失败: %+v", resp) -} - -func (a *ApiRequestService) ProcessG08SC02Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G08SC02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "xm": a.westDexService.Encrypt(name.String()), - "gmsfzhm": a.westDexService.Encrypt(idCard.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G08SC02", request) - if callApiErr != nil { - return nil, callApiErr - } - return resp, nil -} - -func (a *ApiRequestService) ProcessKZEYSRequest(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, KZEYS, 获取相关参数失败") - } - - appCode := a.config.Ali.Code - requestUrl := "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check" - - // 构造查询参数 - data := url.Values{} - data.Add("name", name.String()) - data.Add("idcard", idCard.String()) - - req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode())) - if err != nil { - return nil, fmt.Errorf("KZEYS 创建请求失败: %v", err) - } - req.Header.Set("Authorization", "APPCODE "+appCode) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("KZEYS 请求失败: %v", err) - } - - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("KZEYS 请求失败, 状态码: %d", resp.StatusCode) - } - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("KZEYS 响应体读取失败:%v", err) - } - // 使用 gjson 解析 JSON 数据 - code := gjson.GetBytes(respBody, "code").Int() - if code != 200 { - msg := gjson.GetBytes(respBody, "msg").String() - if msg == "" { - msg = "未知错误" - } - return nil, fmt.Errorf("KZEYS 响应失败: %s", msg) - } - - respData := gjson.GetBytes(respBody, "data") - if !respData.Exists() { - return nil, fmt.Errorf("KZEYS 响应, data 字段不存在") - } - dataRaw := respData.Raw - // 成功返回 - return []byte(dataRaw), nil -} - -// 人车核验 -func (a *ApiRequestService) ProcessP_C_B332Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - carType := gjson.GetBytes(params, "car_type") - carLicense := gjson.GetBytes(params, "car_license") - if !name.Exists() || !carType.Exists() || !carLicense.Exists() { - return nil, errors.New("api请求, P_C_B332, 获取相关参数失败: car_number") - } - - request := map[string]interface{}{ - "name": name.String(), - "carType": carType.String(), - "carNumber": carLicense.String(), - } - resp, err := a.yushanService.request("P_C_B332", request) - if err != nil { - return nil, fmt.Errorf("人车核验查询失败: %v", err) - } - return resp, nil -} - -// 银行卡黑名单 -func (a *ApiRequestService) ProcessFIN019Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - bankCard := gjson.GetBytes(params, "bank_card") - if !name.Exists() || !idCard.Exists() || !mobile.Exists() || !bankCard.Exists() { - return nil, errors.New("api请求, FIN019, 获取相关参数失败: car_number") - } - - request := map[string]interface{}{ - "name": name.String(), - "cardNo": idCard.String(), - "mobile": mobile.String(), - "cardld": bankCard.String(), - } - resp, err := a.yushanService.request("FIN019", request) - if err != nil { - return nil, fmt.Errorf("银行卡黑名单查询失败: %v", err) - } - return resp, nil -} - -// 名下车辆 -func (a *ApiRequestService) ProcessCAR061Request(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - - if !idCard.Exists() { - return nil, errors.New("api请求, CAR061, 获取相关参数失败") - } - request := map[string]interface{}{ - "cardNo": idCard.String(), - } - resp, err := a.yushanService.request("CAR061", request) - if err != nil { - return nil, fmt.Errorf("名下车辆查询失败: %v", err) - } - return resp, nil -} - -func (a *ApiRequestService) ProcessIDV044Request(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - name := gjson.GetBytes(params, "name") - if !idCard.Exists() || !name.Exists() { - return nil, errors.New("api请求, IDV044, 获取相关参数失败") - } - request := map[string]interface{}{ - "cardNo": idCard.String(), - "name": name.String(), - } - resp, err := a.yushanService.request("IDV044", request) - if err != nil { - return nil, fmt.Errorf("婚姻状态查询失败: %v", err) - } - return resp, nil -} - -func (a *ApiRequestService) ProcessG10SC02Request(params []byte) ([]byte, error) { - // 提取男方和女方信息 - nameMan := gjson.GetBytes(params, "nameMan") - idCardMan := gjson.GetBytes(params, "idCardMan") - nameWoman := gjson.GetBytes(params, "nameWoman") - idCardWoman := gjson.GetBytes(params, "idCardWoman") - - // 校验是否存在必要参数 - if !nameMan.Exists() || !idCardMan.Exists() || !nameWoman.Exists() || !idCardWoman.Exists() { - return nil, errors.New("请求参数缺失:需要提供男方和女方的姓名及身份证号") - } - - // 构造请求数据 - request := map[string]interface{}{ - "data": map[string]interface{}{ - "certNumMan": a.westDexService.Encrypt(idCardMan.String()), - "nameMan": a.westDexService.Encrypt(nameMan.String()), - "certNumWoman": a.westDexService.Encrypt(idCardWoman.String()), - "nameWoman": a.westDexService.Encrypt(nameWoman.String()), - }, - } - - // 调用 API - resp, callApiErr := a.westDexService.CallAPI("G10SC02", request) - if callApiErr != nil { - return nil, callApiErr - } - - // 解析响应数据 - code := gjson.GetBytes(resp, "code").String() - - // 状态码校验 - if code != "200" { - return nil, fmt.Errorf("婚姻查询失败:%s", string(resp)) - } - - result := gjson.GetBytes(resp, "data.0.maritalStatus") - - if result.Exists() { - responseMap := map[string]string{"status": result.String()} - jsonResponse, err := json.Marshal(responseMap) - if err != nil { - return nil, err - } - return jsonResponse, nil - } else { - return nil, errors.New("查询为空") - } -} - -// 手机号码风险 -func (a *ApiRequestService) ProcessG03HZ01Request(params []byte) ([]byte, error) { - mobile := gjson.GetBytes(params, "mobile") - - if !mobile.Exists() { - return nil, errors.New("api请求, G03HZ01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "mobile": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G03HZ01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 获取 code 字段 - codeResult := gjson.GetBytes(resp, "code") - if !codeResult.Exists() || codeResult.String() != "0000" { - return nil, fmt.Errorf("查询手机号码风险失败, %s", string(resp)) - } - data := gjson.GetBytes(resp, "data.data") - if !data.Exists() { - return nil, fmt.Errorf("查询手机号码风险失败, %s", string(resp)) - } - return []byte(data.Raw), nil -} - -// 手机在网时长 -func (a *ApiRequestService) ProcessG02BJ02Request(params []byte) ([]byte, error) { - mobile := gjson.GetBytes(params, "mobile") - - if !mobile.Exists() { - return nil, errors.New("api请求, G02BJ02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "phone": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G02BJ02", request) - if callApiErr != nil { - return nil, callApiErr - } - // 获取 code 字段 - codeResult := gjson.GetBytes(resp, "code") - validCodes := map[string]bool{"1006": true, "1007": true, "1008": true, "1009": true, "1010": true} - if !validCodes[codeResult.String()] { - return nil, fmt.Errorf("查询手机在网时长失败, %s", string(resp)) - } - data := gjson.GetBytes(resp, "data") - if !data.Exists() { - return nil, fmt.Errorf("查询手机在网时长失败, %s", string(resp)) - } - return []byte(data.Raw), nil -} - -// 手机二次卡 -func (a *ApiRequestService) ProcessG19BJ02Request(params []byte) ([]byte, error) { - mobile := gjson.GetBytes(params, "mobile") - startDate := gjson.GetBytes(params, "startDate") - if !mobile.Exists() { - return nil, errors.New("api请求, G19BJ02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "phone": a.westDexService.Encrypt(mobile.String()), - "startDate": startDate.String(), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G19BJ02", request) - if callApiErr != nil { - return nil, callApiErr - } - // 获取 code 字段 - codeResult := gjson.GetBytes(resp, "code") - if !codeResult.Exists() || (codeResult.String() != "1025" && codeResult.String() != "1026") { - return nil, fmt.Errorf("手机二次卡失败, %s", string(resp)) - } - data := gjson.GetBytes(resp, "data") - if !data.Exists() { - return nil, fmt.Errorf("手机二次卡失败, %s", string(resp)) - } - return []byte(data.Raw), nil -} - -// 银行卡四要素 -func (a *ApiRequestService) ProcessG20GZ01Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - bankCard := gjson.GetBytes(params, "bank_card") - - if !mobile.Exists() { - return nil, errors.New("api请求, G20GZ01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "idcard": a.westDexService.Encrypt(idCard.String()), - "acc_no": a.westDexService.Encrypt(bankCard.String()), - "mobile": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G20GZ01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 获取 code 字段 - codeResult := gjson.GetBytes(resp, "code") - if !codeResult.Exists() || codeResult.String() != "10000" { - return nil, fmt.Errorf("银行卡四要素失败, %s", string(resp)) - } - data := gjson.GetBytes(resp, "data") - if !data.Exists() { - return nil, fmt.Errorf("银行卡四要素失败, %s", string(resp)) - } - // 解析 data.Raw 字符串为接口类型 - var parsedData interface{} - err := json.Unmarshal([]byte(data.String()), &parsedData) - if err != nil { - return nil, fmt.Errorf("解析 data 失败: %v", err) - } - - // 将解析后的数据重新编码为 []byte - resultBytes, err := json.Marshal(parsedData) - if err != nil { - return nil, fmt.Errorf("重新编码 data 失败: %v", err) - } - - return resultBytes, nil -} - -// G37SC01 自然人失信信息 -func (a *ApiRequestService) ProcessG37SC01Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G37SC01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "idcard": a.westDexService.Encrypt(idCard.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G37SC01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 第一步:提取外层的 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("外层 data 字段不存在") - } - - // 解析 data 字符串为 JSON 对象 - parsedData := gjson.Parse(dataResult.String()) - sxbzxr := parsedData.Get("sxbzxr") - if !sxbzxr.Exists() { - return nil, fmt.Errorf("内层 sxbzxr 字段不存在") - } - return []byte(sxbzxr.Raw), nil -} - -// G36SC01 自然人限高信息 -func (a *ApiRequestService) ProcessG36SC01Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G36SC01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "idcard": a.westDexService.Encrypt(idCard.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G36SC01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 第一步:提取外层的 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("外层 data 字段不存在") - } - - // 解析 data 字符串为 JSON 对象 - parsedData := gjson.Parse(dataResult.String()) - xgbzxr := parsedData.Get("xgbzxr") - if !xgbzxr.Exists() { - return nil, fmt.Errorf("内层 xgbzxr 字段不存在") - } - return []byte(xgbzxr.Raw), nil -} - -// G22SC01 自然人司法模型 -func (a *ApiRequestService) ProcessG22SC01Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G22SC01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "idcard": a.westDexService.Encrypt(idCard.String()), - "inquired_auth": a.westDexService.GetDateRange(), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G22SC01", request) - if callApiErr != nil { - return nil, callApiErr - } - // 第一步:提取外层的 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("外层 data 字段不存在") - } - - parseResult, err := lzUtils.RecursiveParse(dataResult.Raw) - if err != nil { - return nil, fmt.Errorf("递归反序列化") - } - marshal, err := sonic.Marshal(parseResult) - if err != nil { - return nil, fmt.Errorf("序列化失败: %v", err) - } - return marshal, nil -} - -// Q03SC01 企业涉诉信息 -func (a *ApiRequestService) ProcessQ03SC01Request(params []byte) ([]byte, error) { - entName := gjson.GetBytes(params, "ent_name") - entCode := gjson.GetBytes(params, "ent_code") - - if !entName.Exists() || !entCode.Exists() { - return nil, errors.New("api请求, Q03SC01, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "uscc": a.westDexService.Encrypt(entCode.String()), - "org_name": a.westDexService.Encrypt(entName.String()), - "inquired_auth": a.westDexService.GetDateRange(), - }, - } - resp, callApiErr := a.westDexService.CallAPI("Q03SC01", request) - if callApiErr != nil { - return nil, callApiErr - } - - // 第一步:提取外层的 data 字段 - dataResult := gjson.GetBytes(resp, "data") - if !dataResult.Exists() { - return nil, fmt.Errorf("外层 data 字段不存在") - } - - // 保留原有的递归解析和序列化逻辑 - parseResult, err := lzUtils.RecursiveParse(dataResult.Raw) - if err != nil { - return nil, fmt.Errorf("递归反序列化") - } - logx.Infof("parseResult: %v", parseResult) - marshal, err := sonic.Marshal(parseResult) - if err != nil { - return nil, fmt.Errorf("序列化失败: %v", err) - } - // 第二步:使用gjson预处理数据 - dataMap := make(map[string]interface{}) - - // 处理entout数据 - entoutArray := gjson.GetBytes(marshal, "entout").Array() - if len(entoutArray) > 0 { - // 检查是否存在count字段来判断是否有数据 - countField := entoutArray[0].Get("data.count") - if countField.Exists() { - // 有count字段,表示有数据 - entoutData := entoutArray[0].Get("data") - if entoutData.Exists() { - dataMap["data"] = json.RawMessage(entoutData.Raw) - } - } else { - // 没有count字段,使用空对象 - dataMap["data"] = json.RawMessage("{}") - } - } else { - dataMap["data"] = json.RawMessage("{}") - } - - // 处理sxbzxr数据(失信被执行人) - sxbzxrArray := dataResult.Get("sxbzxr").Array() - if len(sxbzxrArray) > 0 { - sxbzxrList := sxbzxrArray[0].Get("sxbzxr") - if sxbzxrList.Exists() && len(sxbzxrList.Array()) > 0 { - dataMap["sxbzxr"] = json.RawMessage(sxbzxrList.Raw) - } else { - dataMap["sxbzxr"] = json.RawMessage("[]") - } - } else { - dataMap["sxbzxr"] = json.RawMessage("[]") - } - - // 处理xgbzxr数据(限高被执行人) - xgbzxrArray := dataResult.Get("xgbzxr").Array() - if len(xgbzxrArray) > 0 { - xgbzxrList := xgbzxrArray[0].Get("xgbzxr") - if xgbzxrList.Exists() && len(xgbzxrList.Array()) > 0 { - dataMap["xgbzxr"] = json.RawMessage(xgbzxrList.Raw) - } else { - dataMap["xgbzxr"] = json.RawMessage("[]") - } - } else { - dataMap["xgbzxr"] = json.RawMessage("[]") - } - - result, err := sonic.Marshal(dataMap) - if err != nil { - return nil, fmt.Errorf("序列化预处理数据失败: %v", err) - } - - return result, nil -} - -// G39SC02 职业资格证书核验 -func (a *ApiRequestService) ProcessG39SC02Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G39SC02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "IdNum": a.westDexService.Encrypt(idCard.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G39SC02", request) - if callApiErr != nil { - return nil, callApiErr - } - return resp, nil -} - -// G38SC02 全国个人离婚次数 -func (a *ApiRequestService) ProcessG38SC02Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, G38SC02, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "xm": a.westDexService.Encrypt(name.String()), - "sfzh": a.westDexService.Encrypt(idCard.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G38SC02", request) - if callApiErr != nil { - return nil, callApiErr - } - return resp, nil - -} - -// layoutIdcard 西部二要素 -func (a *ApiRequestService) ProcessLayoutIdcardRequest(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - - if !name.Exists() || !idCard.Exists() { - return nil, errors.New("api请求, layoutIdcard, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "xM": a.westDexService.Encrypt(name.String()), - "gMSFZHM": a.westDexService.Encrypt(idCard.String()), - "customerNumber": a.config.WestConfig.SecretId, - "timeStamp": fmt.Sprintf("%d", time.Now().UnixNano()/int64(time.Millisecond)), - }, - } - resp, callApiErr := a.westDexService.CallAPI("layoutIdcard", request) - if callApiErr != nil { - return nil, callApiErr - } - // 使用gjson获取resultCode - resultCode := gjson.GetBytes(resp, "ctidRequest.ctidAuth.resultCode") - if !resultCode.Exists() { - return nil, errors.New("获取resultCode失败") - } - - // 获取resultCode的第一个字符 - resultCodeStr := resultCode.String() - if len(resultCodeStr) == 0 { - return nil, errors.New("resultCode为空") - } - - firstChar := string(resultCodeStr[0]) - if firstChar != "0" && firstChar != "5" { - return nil, errors.New("resultCode的第一个字符既不是0也不是5") - } - return []byte(firstChar), nil -} - -// PersonEnterprisePro 人企业关系加强版 -func (a *ApiRequestService) ProcessPersonEnterpriseProRequest(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - // 设置最大调用次数上限 - maxApiCalls := 20 // 允许最多查询20个企业 - - if !idCard.Exists() { - return nil, errors.New("api请求, PersonEnterprisePro, 获取相关参数失败") - } - - request := map[string]interface{}{ - "pid": crypto.Md5Encrypt(idCard.String()), - } - resp, callApiErr := a.westDexService.G05HZ01CallAPI("G05HZ01", request) - if callApiErr != nil { - return nil, callApiErr - } - - // 处理股东人企关系的响应数据 - code := gjson.GetBytes(resp, "code") - if !code.Exists() { - return nil, fmt.Errorf("响应中缺少 code 字段") - } - - // 判断 code 是否等于 "0000" - if code.String() == "0000" { - // 获取 data 字段的值 - data := gjson.GetBytes(resp, "data") - if !data.Exists() { - return nil, fmt.Errorf("响应中缺少 data 字段") - } - - // 使用gjson获取企业列表 - datalistResult := gjson.Get(data.Raw, "datalist") - if !datalistResult.Exists() { - return nil, fmt.Errorf("datalist字段不存在") - } - - // 获取所有企业并进行排序 - companies := datalistResult.Array() - - // 创建企业对象切片,用于排序 - type CompanyWithPriority struct { - Index int - Data gjson.Result - RelationshipVal int // 关系权重值 - RelationCount int // 关系数量 - AdminPenalty int // 行政处罚数量 - Executed int // 被执行人数量 - Dishonest int // 失信被执行人数量 - } - - companiesWithPriority := make([]CompanyWithPriority, 0, len(companies)) - - // 遍历企业,计算优先级 - for i, companyJson := range companies { - // 统计行政处罚、被执行人、失信被执行人 - adminPenalty := 0 - executed := 0 - dishonest := 0 - - // 检查行政处罚字段是否存在并获取数组长度 - adminPenaltyResult := companyJson.Get("adminPenalty") - if adminPenaltyResult.Exists() && adminPenaltyResult.IsArray() { - adminPenalty = len(adminPenaltyResult.Array()) - } - - // 检查被执行人字段是否存在并获取数组长度 - executedPersonResult := companyJson.Get("executedPerson") - if executedPersonResult.Exists() && executedPersonResult.IsArray() { - executed = len(executedPersonResult.Array()) - } - - // 检查失信被执行人字段是否存在并获取数组长度 - dishonestExecutedPersonResult := companyJson.Get("dishonestExecutedPerson") - if dishonestExecutedPersonResult.Exists() && dishonestExecutedPersonResult.IsArray() { - dishonest = len(dishonestExecutedPersonResult.Array()) - } - - // 计算relationship权重 - relationshipVal := 0 - relationCount := 0 - - // 获取relationship数组 - relationshipResult := companyJson.Get("relationship") - if relationshipResult.Exists() && relationshipResult.IsArray() { - relationships := relationshipResult.Array() - // 统计各类关系的数量和权重 - for _, rel := range relationships { - relationCount++ - relStr := rel.String() - - // 根据关系类型设置权重,权重顺序: - // 股东(6) > 历史股东(5) > 法人(4) > 历史法人(3) > 高管(2) > 历史高管(1) - switch relStr { - case "sh": // 股东 - if relationshipVal < 6 { - relationshipVal = 6 - } - case "his_sh": // 历史股东 - if relationshipVal < 5 { - relationshipVal = 5 - } - case "lp": // 法人 - if relationshipVal < 4 { - relationshipVal = 4 - } - case "his_lp": // 历史法人 - if relationshipVal < 3 { - relationshipVal = 3 - } - case "tm": // 高管 - if relationshipVal < 2 { - relationshipVal = 2 - } - case "his_tm": // 历史高管 - if relationshipVal < 1 { - relationshipVal = 1 - } - } - } - } - - companiesWithPriority = append(companiesWithPriority, CompanyWithPriority{ - Index: i, - Data: companyJson, - RelationshipVal: relationshipVal, - RelationCount: relationCount, - AdminPenalty: adminPenalty, - Executed: executed, - Dishonest: dishonest, - }) - } - - // 按优先级排序 - sort.Slice(companiesWithPriority, func(i, j int) bool { - // 首先根据是否有失信被执行人排序 - if companiesWithPriority[i].Dishonest != companiesWithPriority[j].Dishonest { - return companiesWithPriority[i].Dishonest > companiesWithPriority[j].Dishonest - } - - // 然后根据是否有被执行人排序 - if companiesWithPriority[i].Executed != companiesWithPriority[j].Executed { - return companiesWithPriority[i].Executed > companiesWithPriority[j].Executed - } - - // 然后根据是否有行政处罚排序 - if companiesWithPriority[i].AdminPenalty != companiesWithPriority[j].AdminPenalty { - return companiesWithPriority[i].AdminPenalty > companiesWithPriority[j].AdminPenalty - } - - // 然后按relationship类型排序 - if companiesWithPriority[i].RelationshipVal != companiesWithPriority[j].RelationshipVal { - return companiesWithPriority[i].RelationshipVal > companiesWithPriority[j].RelationshipVal - } - - // 最后按relationship数量排序 - return companiesWithPriority[i].RelationCount > companiesWithPriority[j].RelationCount - }) - - // 限制处理的企业数量 - processCount := len(companiesWithPriority) - if processCount > maxApiCalls { - processCount = maxApiCalls - } - - // 只处理前N个优先级高的企业 - prioritizedCompanies := companiesWithPriority[:processCount] - - // 使用WaitGroup和chan处理并发 - var wg sync.WaitGroup - results := make(chan struct { - index int - data []byte - err error - }, processCount) - - // 对按优先级排序的前N个企业进行涉诉信息查询 - for _, company := range prioritizedCompanies { - wg.Add(1) - go func(origIndex int, companyInfo gjson.Result) { - defer wg.Done() - logx.Infof("开始处理企业[%d],企业名称: %s,统一社会信用代码: %s", origIndex, companyInfo.Get("basicInfo.name").String(), companyInfo.Get("basicInfo.creditCode").String()) - // 提取企业名称和统一社会信用代码 - orgName := companyInfo.Get("basicInfo.name") - creditCode := companyInfo.Get("basicInfo.creditCode") - - if !orgName.Exists() || !creditCode.Exists() { - results <- struct { - index int - data []byte - err error - }{origIndex, nil, fmt.Errorf("企业名称或统一社会信用代码不存在")} - return - } - - // 解析原始公司信息为map - var companyMap map[string]interface{} - if err := json.Unmarshal([]byte(companyInfo.Raw), &companyMap); err != nil { - results <- struct { - index int - data []byte - err error - }{origIndex, nil, fmt.Errorf("解析企业信息失败: %v", err)} - return - } - - // 构造调用Q03SC01的参数 - q03Params, err := json.Marshal(map[string]string{ - "ent_name": orgName.String(), - "ent_code": creditCode.String(), - }) - if err != nil { - // 参数构造失败,但不影响整体处理 - logx.Errorf("构造企业[%s]涉诉查询参数失败: %v", orgName.String(), err) - companyMap["lawsuitInfo"] = map[string]interface{}{} - } else { - // 调用Q03SC01接口获取企业涉诉信息 - lawsuitData, err := a.ProcessQ03SC01Request(q03Params) - // 无论是否有错误,都继续处理 - if err != nil { - // 可能是正常没有涉诉数据,设置为空对象 - logx.Infof("企业[%s]涉诉信息查询结果: %v", orgName.String(), err) - companyMap["lawsuitInfo"] = map[string]interface{}{} - } else if len(lawsuitData) == 0 || string(lawsuitData) == "{}" || string(lawsuitData) == "null" { - // 无涉诉数据 - companyMap["lawsuitInfo"] = map[string]interface{}{} - } else { - // 解析涉诉信息 - var lawsuitInfo interface{} - if err := json.Unmarshal(lawsuitData, &lawsuitInfo); err != nil { - logx.Errorf("解析企业[%s]涉诉信息失败: %v", orgName.String(), err) - companyMap["lawsuitInfo"] = map[string]interface{}{} - } else { - // 添加涉诉信息到企业信息中 - companyMap["lawsuitInfo"] = lawsuitInfo - } - } - } - - // 序列化更新后的企业信息 - companyData, err := json.Marshal(companyMap) - if err != nil { - results <- struct { - index int - data []byte - err error - }{origIndex, nil, fmt.Errorf("序列化企业信息失败: %v", err)} - return - } - - results <- struct { - index int - data []byte - err error - }{origIndex, companyData, nil} - }(company.Index, company.Data) - } - - // 关闭结果通道 - go func() { - wg.Wait() - close(results) - }() - - // 解析原始数据为map - var dataMap map[string]interface{} - if err := json.Unmarshal([]byte(data.Raw), &dataMap); err != nil { - return nil, fmt.Errorf("解析data字段失败: %v", err) - } - - // 获取原始企业列表 - originalDatalist, ok := dataMap["datalist"].([]interface{}) - if !ok { - return nil, fmt.Errorf("无法获取原始企业列表") - } - - // 创建结果映射,用于保存已处理的企业 - processedCompanies := make(map[int]interface{}) - - // 收集处理过的企业数据 - for result := range results { - if result.err != nil { - logx.Errorf("处理企业失败: %v", result.err) - continue - } - - if result.data != nil { - var companyMap interface{} - if err := json.Unmarshal(result.data, &companyMap); err == nil { - processedCompanies[result.index] = companyMap - } - } - } - - // 更新企业列表 - // 处理过的用新数据,未处理的保留原样 - updatedDatalist := make([]interface{}, len(originalDatalist)) - for i, company := range originalDatalist { - if processed, exists := processedCompanies[i]; exists { - // 已处理的企业,使用新数据 - updatedDatalist[i] = processed - } else { - // 未处理的企业,保留原始数据并添加空的涉诉信息 - companyMap, ok := company.(map[string]interface{}) - if ok { - // 为未处理的企业添加空的涉诉信息 - companyMap["lawsuitInfo"] = map[string]interface{}{} - updatedDatalist[i] = companyMap - } else { - updatedDatalist[i] = company - } - } - } - - // 更新原始数据中的企业列表 - dataMap["datalist"] = updatedDatalist - - // 序列化最终结果 - result, err := json.Marshal(dataMap) - if err != nil { - return nil, fmt.Errorf("序列化最终结果失败: %v", err) - } - - return result, nil - } - - // code不等于"0000",返回错误 - return nil, fmt.Errorf("响应code错误: %s", code.String()) -} - -func (a *ApiRequestService) ProcessBehaviorRiskScanRequest(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, BehaviorRiskScan, 获取相关参数失败") - } - - var wg sync.WaitGroup - type apiResult struct { - name string - data []byte - err error - } - results := make(chan apiResult, 5) // 5个风险检测项 - - // 并行调用五个不同的风险检测API - wg.Add(5) - - // 黑灰产检测 - go func() { - defer wg.Done() - data, err := a.ProcessG30BJ05Request(params) - results <- apiResult{name: "black_gray_level", data: data, err: err} - }() - - // 电诈风险预警 - go func() { - defer wg.Done() - data, err := a.ProcessG31BJ05Request(params) - results <- apiResult{name: "telefraud_level", data: data, err: err} - }() - - // 团伙欺诈排查 - go func() { - defer wg.Done() - data, err := a.ProcessG32BJ05Request(params) - results <- apiResult{name: "fraud_group", data: data, err: err} - }() - - // // 反诈反赌核验 - go func() { - defer wg.Done() - data, err := a.ProcessRIS031Request(params) - results <- apiResult{name: "anti_fraud_gaming", data: data, err: err} - }() - - // 风险等级 - go func() { - defer wg.Done() - data, err := a.ProcessG34BJ03Request(params) - results <- apiResult{name: "risk_level", data: data, err: err} - }() - - // 关闭结果通道 - go func() { - wg.Wait() - close(results) - }() - - // 收集所有结果 - resultMap := make(map[string]interface{}) - var errors []string - - for result := range results { - if result.err != nil { - // 记录错误但继续处理其他结果 - errors = append(errors, fmt.Sprintf("%s: %v", result.name, result.err)) - continue - } - - // 解析JSON结果并添加到结果映射 - var parsedData interface{} - if err := json.Unmarshal(result.data, &parsedData); err != nil { - errors = append(errors, fmt.Sprintf("解析%s数据失败: %v", result.name, err)) - } else { - resultMap[result.name] = parsedData - } - } - - // 添加错误信息到结果中(如果存在) - if len(errors) > 0 { - resultMap["errors"] = errors - } - - // 序列化最终结果 - finalResult, err := json.Marshal(resultMap) - if err != nil { - return nil, fmt.Errorf("序列化行为风险扫描结果失败: %v", err) - } - - return finalResult, nil -} - -// G30BJ05 黑灰产 -func (a *ApiRequestService) ProcessG30BJ05Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - Mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { - return nil, errors.New("api请求, G30BJ05, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "id": a.westDexService.Encrypt(idCard.String()), - "cell": a.westDexService.Encrypt(Mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G30BJ05", request) - if callApiErr != nil { - return nil, callApiErr - } - fmt.Println(resp) - flagBlackgraylevel := gjson.GetBytes(resp, "flag_blackgraylevel") - if !flagBlackgraylevel.Exists() || flagBlackgraylevel.String() != "1" { - return nil, fmt.Errorf("自然人黑灰产信息查询失败") - } - - bglLevel := gjson.GetBytes(resp, "bgl_level") - if !bglLevel.Exists() { - return nil, fmt.Errorf("bgl_level 字段不存在") - } - - return []byte(bglLevel.Raw), nil -} - -// G31BJ05 电诈风险预警 -func (a *ApiRequestService) ProcessG31BJ05Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - Mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { - return nil, errors.New("api请求, G31BJ05, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "id": a.westDexService.Encrypt(idCard.String()), - "cell": a.westDexService.Encrypt(Mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G31BJ05", request) - if callApiErr != nil { - return nil, callApiErr - } - fmt.Println(resp) - flagTelefraudpredictstd := gjson.GetBytes(resp, "flag_telefraudpredictstd") - if !flagTelefraudpredictstd.Exists() || flagTelefraudpredictstd.String() != "1" { - return nil, fmt.Errorf("自然人电诈风险预警查询失败") - } - - tfpsLevel := gjson.GetBytes(resp, "tfps_level") - if !tfpsLevel.Exists() { - return nil, fmt.Errorf("tfps_level 字段不存在") - } - - return []byte(tfpsLevel.Raw), nil -} - -// G32BJ05 团伙欺诈排查 -func (a *ApiRequestService) ProcessG32BJ05Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - Mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { - return nil, errors.New("api请求, G32BJ05, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "id": a.westDexService.Encrypt(idCard.String()), - "cell": a.westDexService.Encrypt(Mobile.String()), - }, - } - resp, callApiErr := a.westDexService.CallAPI("G32BJ05", request) - if callApiErr != nil { - return nil, callApiErr - } - - flagFraudrelation := gjson.GetBytes(resp, "flag_fraudrelation") - if !flagFraudrelation.Exists() || flagFraudrelation.String() != "1" { - return nil, fmt.Errorf("自然人团伙欺诈排查查询失败") - } - frgListLevel := gjson.GetBytes(resp, "frg_list_level") - if !frgListLevel.Exists() { - return nil, fmt.Errorf("frg_list_level 字段不存在") - } - - frgGroupNum := gjson.GetBytes(resp, "frg_group_num") - if !frgGroupNum.Exists() { - return nil, fmt.Errorf("frg_group_num 字段不存在") - } - - // 构建包含两个字段的JSON响应 - result := map[string]interface{}{ - "frg_list_level": frgListLevel.Value(), - "frg_group_num": frgGroupNum.Value(), - } - - resultJSON, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("序列化结果失败: %v", err) - } - - return resultJSON, nil -} - -// RIS031 反诈反赌核验 -func (a *ApiRequestService) ProcessRIS031Request(params []byte) ([]byte, error) { - name := gjson.GetBytes(params, "name") - idCard := gjson.GetBytes(params, "id_card") - Mobile := gjson.GetBytes(params, "mobile") - - if !name.Exists() || !idCard.Exists() || !Mobile.Exists() { - return nil, errors.New("api请求, RIS031, 获取相关参数失败") - } - - request := map[string]interface{}{ - "data": map[string]interface{}{ - "name": a.westDexService.Encrypt(name.String()), - "id": a.westDexService.Encrypt(idCard.String()), - "cell": a.westDexService.Encrypt(Mobile.String()), - }, - } - resp, callApiErr := a.yushanService.request("RIS031", request) - if callApiErr != nil { - return nil, callApiErr - } - - Value := gjson.GetBytes(resp, "value") - if !Value.Exists() { - return nil, fmt.Errorf("自然人反诈反赌核验查询失败") - } - - return []byte(Value.Raw), nil -} - -// ProcessMarriageRequest 婚姻状态查询,优先使用西部数据G09XM02接口,失败时回退到羽山IDV044接口 -func (a *ApiRequestService) ProcessMarriageRequest(params []byte) ([]byte, error) { - // 首先尝试使用西部数据接口查询 - resp, err := a.ProcessG09XM02Request(params) - if err != nil { - // 西部数据接口查询失败,尝试使用羽山接口 - logx.Infof("西部数据婚姻查询失败,尝试使用羽山接口: %v", err) - resp, err = a.ProcessIDV044Request(params) - if err != nil { - return nil, err - } - } - return resp, nil -} -func (a *ApiRequestService) ProcessG09XM02Request(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - name := gjson.GetBytes(params, "name") - if !idCard.Exists() || !name.Exists() { - return nil, errors.New("api请求, G09XM02, 获取相关参数失败") - } - request := map[string]interface{}{ - "data": map[string]interface{}{ - "idCard": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - }, - } - resp, err := a.westDexService.CallAPI("G09XM02", request) - if err != nil && resp == nil { - return nil, fmt.Errorf("婚姻状态查询失败: %v", err) - } - result := gjson.GetBytes(resp, "data.data") - if !result.Exists() { - return nil, fmt.Errorf("婚姻状态查询失败") - } - - // 获取原始结果 - rawResult := result.String() - - // 根据结果转换状态码 - var statusCode string - switch { - case strings.HasPrefix(rawResult, "INR"): - statusCode = "0" // 匹配不成功 - case strings.HasPrefix(rawResult, "IA"): - statusCode = "1" // 结婚 - case strings.HasPrefix(rawResult, "IB"): - statusCode = "2" // 离婚 - default: - return nil, fmt.Errorf("婚姻状态查询失败,未知状态码: %s", statusCode) - } - - // 构建新的返回结果 - response := map[string]string{ - "status": statusCode, - } - // 序列化为JSON - jsonResponse, err := json.Marshal(response) - if err != nil { - return nil, fmt.Errorf("序列化结果失败: %v", err) - } - - return jsonResponse, nil -} - -func (a *ApiRequestService) ProcessG10XM02Request(params []byte) ([]byte, error) { - // 提取男方和女方信息 - nameMan := gjson.GetBytes(params, "nameMan") - idCardMan := gjson.GetBytes(params, "idCardMan") - nameWoman := gjson.GetBytes(params, "nameWoman") - idCardWoman := gjson.GetBytes(params, "idCardWoman") - - // 校验是否存在必要参数 - if !nameMan.Exists() || !idCardMan.Exists() || !nameWoman.Exists() || !idCardWoman.Exists() { - return nil, errors.New("请求参数缺失:需要提供男方和女方的姓名及身份证号") - } - - // 构造请求数据 - request := map[string]interface{}{ - "data": map[string]interface{}{ - "idCardMan": a.westDexService.Encrypt(idCardMan.String()), - "nameMan": a.westDexService.Encrypt(nameMan.String()), - "idCardWoman": a.westDexService.Encrypt(idCardWoman.String()), - "nameWoman": a.westDexService.Encrypt(nameWoman.String()), - }, - } - - // 调用 API - resp, callApiErr := a.westDexService.CallAPI("G10XM02", request) - if callApiErr != nil && resp == nil { - return nil, callApiErr - } - - result := gjson.GetBytes(resp, "data.data") - if !result.Exists() { - return nil, fmt.Errorf("婚姻状态查询失败") - } - - // 获取原始结果 - rawResult := result.String() - - // 根据结果转换状态码 - var statusCode string - switch { - case strings.HasPrefix(rawResult, "INR"): - statusCode = "0" // 匹配不成功 - case strings.HasPrefix(rawResult, "IA"): - statusCode = "1" // 结婚 - case strings.HasPrefix(rawResult, "IB"): - statusCode = "2" // 离婚 - default: - return nil, fmt.Errorf("婚姻状态查询失败,未知状态码: %s", statusCode) - } - - // 构建新的返回结果 - response := map[string]string{ - "status": statusCode, - } - - // 序列化为JSON - jsonResponse, err := json.Marshal(response) - if err != nil { - return nil, fmt.Errorf("序列化结果失败: %v", err) - } - - return jsonResponse, nil -} -func (a *ApiRequestService) ProcessG11BJ06Request(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - name := gjson.GetBytes(params, "name") - if !idCard.Exists() || !name.Exists() { - return nil, errors.New("api请求, G11BJ06, 获取相关参数失败") - } - request := map[string]interface{}{ - "data": map[string]interface{}{ - "id_card_value": a.westDexService.Encrypt(idCard.String()), - "name_value": a.westDexService.Encrypt(name.String()), - }, - } - resp, err := a.westDexService.CallAPI("G11BJ06", request) - if err != nil && resp == nil { - return nil, fmt.Errorf("教育经历核验查询失败: %v", err) - } - - // 解析响应 - codeResult := gjson.GetBytes(resp, "data.education_background.code") - if !codeResult.Exists() { - return nil, fmt.Errorf("教育经历核验查询失败: 返回数据缺少code字段") - } - - code := codeResult.String() - - var result map[string]interface{} - - switch code { - case "9100": - // 查询成功有结果 - eduResultArray := gjson.GetBytes(resp, "data.education_background.data").Array() - var processedEduData []interface{} - - // 提取每个元素中Raw字段的实际内容 - for _, item := range eduResultArray { - var eduInfo interface{} - if err := json.Unmarshal([]byte(item.Raw), &eduInfo); err != nil { - return nil, fmt.Errorf("解析教育信息失败: %v", err) - } - processedEduData = append(processedEduData, eduInfo) - } - - result = map[string]interface{}{ - "data": processedEduData, - "status": 1, - } - case "9000": - // 查询成功无结果 - result = map[string]interface{}{ - "data": []interface{}{}, - "status": 0, - } - default: - // 其他情况视为错误 - errMsg := gjson.GetBytes(resp, "data.education_background.msg").String() - return nil, fmt.Errorf("教育经历核验查询失败: %s (code: %s)", errMsg, code) - } - - // 将结果转为JSON字节 - jsonResult, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("处理教育经历查询结果失败: %v", err) - } - - return jsonResult, nil -} -func (a *ApiRequestService) ProcessG29BJ05Request(params []byte) ([]byte, error) { - idCard := gjson.GetBytes(params, "id_card") - name := gjson.GetBytes(params, "name") - mobile := gjson.GetBytes(params, "mobile") - if !idCard.Exists() || !name.Exists() || !mobile.Exists() { - return nil, errors.New("api请求, G29BJ05, 获取相关参数失败") - } - request := map[string]interface{}{ - "data": map[string]interface{}{ - "id": a.westDexService.Encrypt(idCard.String()), - "name": a.westDexService.Encrypt(name.String()), - "cell": a.westDexService.Encrypt(mobile.String()), - }, - } - resp, err := a.westDexService.CallAPI("G29BJ05", request) - if err != nil && resp == nil { - return nil, fmt.Errorf("偿贷压力查询失败: %v", err) - } - // 获取响应码和偿贷压力标志 - code := gjson.GetBytes(resp, "code").String() - flagDebtRepayStress := gjson.GetBytes(resp, "flag_debtrepaystress").String() - - // 判断是否成功 - if code != "00" || flagDebtRepayStress != "1" { - return nil, fmt.Errorf("偿贷压力查询失败: %+v", resp) - } - // 获取偿贷压力分数 - drsNoDebtScore := gjson.GetBytes(resp, "drs_nodebtscore").String() - - // 构建结果 - result := map[string]interface{}{ - "score": drsNoDebtScore, - } - - // 将结果转为JSON - jsonResult, err := json.Marshal(result) - if err != nil { - return nil, fmt.Errorf("处理偿贷压力查询结果失败: %v", err) - } - - return jsonResult, nil -} diff --git a/app/user/cmd/api/internal/service/applepayService.go b/app/user/cmd/api/internal/service/applepayService.go deleted file mode 100644 index 3425d57..0000000 --- a/app/user/cmd/api/internal/service/applepayService.go +++ /dev/null @@ -1,169 +0,0 @@ -package service - -import ( - "context" - "crypto/ecdsa" - "crypto/x509" - "encoding/json" - "encoding/pem" - "fmt" - "io/ioutil" - "net/http" - "strconv" - "time" - "tydata-server/app/user/cmd/api/internal/config" - - "github.com/golang-jwt/jwt/v4" -) - -// ApplePayService 是 Apple IAP 支付服务的结构体 -type ApplePayService struct { - config config.ApplepayConfig // 配置项 -} - -// NewApplePayService 是一个构造函数,用于初始化 ApplePayService -func NewApplePayService(c config.Config) *ApplePayService { - return &ApplePayService{ - config: c.Applepay, - } -} -func (a *ApplePayService) GetIappayAppID(productName string) string { - return fmt.Sprintf("%s.%s", a.config.BundleID, productName) -} - -// VerifyReceipt 验证苹果支付凭证 -func (a *ApplePayService) VerifyReceipt(ctx context.Context, receipt string) (*AppleVerifyResponse, error) { - var reqUrl string - if a.config.Sandbox { - reqUrl = a.config.SandboxVerifyURL - } else { - reqUrl = a.config.ProductionVerifyURL - } - - // 读取私钥 - privateKey, err := loadPrivateKey(a.config.LoadPrivateKeyPath) - if err != nil { - return nil, fmt.Errorf("加载私钥失败:%v", err) - } - - // 生成 JWT - token, err := generateJWT(privateKey, a.config.KeyID, a.config.IssuerID) - if err != nil { - return nil, fmt.Errorf("生成JWT失败:%v", err) - } - - // 构造查询参数 - queryParams := fmt.Sprintf("?receipt-data=%s", receipt) - fullUrl := reqUrl + queryParams - - // 构建 HTTP GET 请求 - req, err := http.NewRequestWithContext(ctx, http.MethodGet, fullUrl, nil) - if err != nil { - return nil, fmt.Errorf("创建 HTTP 请求失败:%v", err) - } - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+token) - - // 发送请求 - client := &http.Client{Timeout: 10 * time.Second} - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("请求苹果验证接口失败:%v", err) - } - defer resp.Body.Close() - - // 解析响应 - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("读取响应体失败:%v", err) - } - - var verifyResponse AppleVerifyResponse - err = json.Unmarshal(body, &verifyResponse) - if err != nil { - return nil, fmt.Errorf("解析响应体失败:%v", err) - } - - // 根据实际响应处理逻辑 - if verifyResponse.Status != 0 { - return nil, fmt.Errorf("验证失败,状态码:%d", verifyResponse.Status) - } - - return &verifyResponse, nil -} - -func loadPrivateKey(path string) (*ecdsa.PrivateKey, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - block, _ := pem.Decode(data) - if block == nil || block.Type != "PRIVATE KEY" { - return nil, fmt.Errorf("无效的私钥数据") - } - key, err := x509.ParsePKCS8PrivateKey(block.Bytes) - if err != nil { - return nil, err - } - ecdsaKey, ok := key.(*ecdsa.PrivateKey) - if !ok { - return nil, fmt.Errorf("私钥类型错误") - } - return ecdsaKey, nil -} - -func generateJWT(privateKey *ecdsa.PrivateKey, keyID, issuerID string) (string, error) { - now := time.Now() - claims := jwt.RegisteredClaims{ - Issuer: issuerID, - IssuedAt: jwt.NewNumericDate(now), - ExpiresAt: jwt.NewNumericDate(now.Add(1 * time.Hour)), - Audience: jwt.ClaimStrings{"appstoreconnect-v1"}, - } - token := jwt.NewWithClaims(jwt.SigningMethodES256, claims) - token.Header["kid"] = keyID - tokenString, err := token.SignedString(privateKey) - if err != nil { - return "", err - } - return tokenString, nil -} - -// GenerateOutTradeNo 生成唯一订单号 -func (a *ApplePayService) GenerateOutTradeNo() string { - length := 16 - timestamp := time.Now().UnixNano() - timeStr := strconv.FormatInt(timestamp, 10) - randomPart := strconv.Itoa(int(timestamp % 1e6)) - combined := timeStr + randomPart - - if len(combined) >= length { - return combined[:length] - } - - for len(combined) < length { - combined += strconv.Itoa(int(timestamp % 10)) - } - - return combined -} - -// AppleVerifyResponse 定义苹果验证接口的响应结构 -type AppleVerifyResponse struct { - Status int `json:"status"` // 验证状态码:0 表示收据有效 - Receipt *Receipt `json:"receipt"` // 收据信息 -} - -// Receipt 定义收据的精简结构 -type Receipt struct { - BundleID string `json:"bundle_id"` // 应用的 Bundle ID - InApp []InAppItem `json:"in_app"` // 应用内购买记录 -} - -// InAppItem 定义单条交易记录 -type InAppItem struct { - ProductID string `json:"product_id"` // 商品 ID - TransactionID string `json:"transaction_id"` // 交易 ID - PurchaseDate string `json:"purchase_date"` // 购买日期 (ISO 8601) - OriginalTransID string `json:"original_transaction_id"` // 原始交易 ID -} diff --git a/app/user/cmd/api/internal/service/asynqService.go b/app/user/cmd/api/internal/service/asynqService.go deleted file mode 100644 index d19256b..0000000 --- a/app/user/cmd/api/internal/service/asynqService.go +++ /dev/null @@ -1,60 +0,0 @@ -// asynq_service.go - -package service - -import ( - "encoding/json" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/hibiken/asynq" - "github.com/zeromicro/go-zero/core/logx" -) - -type AsynqService struct { - client *asynq.Client - config config.Config -} - -// NewAsynqService 创建并初始化 Asynq 客户端 -func NewAsynqService(c config.Config) *AsynqService { - client := asynq.NewClient(asynq.RedisClientOpt{ - Addr: c.CacheRedis[0].Host, - Password: c.CacheRedis[0].Pass, - }) - - return &AsynqService{client: client, config: c} -} - -// Close 关闭 Asynq 客户端 -func (s *AsynqService) Close() error { - return s.client.Close() -} -func (s *AsynqService) SendQueryTask(orderID int64) error { - // 准备任务的 payload - payload := types.MsgPaySuccessQueryPayload{ - OrderID: orderID, - } - payloadBytes, err := json.Marshal(payload) - if err != nil { - logx.Errorf("发送异步任务失败 (无法编码 payload): %v, 订单号: %d", err, orderID) - return err // 直接返回错误,避免继续执行 - } - - options := []asynq.Option{ - asynq.MaxRetry(5), // 设置最大重试次数 - } - // 创建任务 - task := asynq.NewTask(types.MsgPaySuccessQuery, payloadBytes, options...) - - // 将任务加入队列并获取任务信息 - info, err := s.client.Enqueue(task) - if err != nil { - logx.Errorf("发送异步任务失败 (加入队列失败): %+v, 订单号: %d", err, orderID) - return err - } - - // 记录成功日志,带上任务 ID 和队列信息 - logx.Infof("发送异步任务成功,任务ID: %s, 队列: %s, 订单号: %d", info.ID, info.Queue, orderID) - return nil -} diff --git a/app/user/cmd/api/internal/service/userService.go b/app/user/cmd/api/internal/service/userService.go deleted file mode 100644 index bac9aa6..0000000 --- a/app/user/cmd/api/internal/service/userService.go +++ /dev/null @@ -1,65 +0,0 @@ -package service - -import ( - "context" - "tydata-server/app/user/model" - - "github.com/google/uuid" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -type UserService struct { - userModel model.UserModel - userAuthModel model.UserAuthModel -} - -// NewUserService 创建UserService实例 -func NewUserService(userModel model.UserModel, userAuthModel model.UserAuthModel) *UserService { - return &UserService{ - userModel: userModel, - userAuthModel: userAuthModel, - } -} - -// GenerateUUIDUserId 生成UUID用户ID -func (s *UserService) GenerateUUIDUserId(ctx context.Context) (string, error) { - id := uuid.NewString() - return id, nil -} - -// RegisterUUIDUser 注册UUID用户,返回用户ID -func (s *UserService) RegisterUUIDUser(ctx context.Context) (int64, error) { - // 生成UUID - uuidStr, err := s.GenerateUUIDUserId(ctx) - if err != nil { - return 0, err - } - - var userId int64 - err = s.userModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { - // 创建用户记录 - user := &model.User{} - result, err := s.userModel.Insert(ctx, session, user) - if err != nil { - return err - } - userId, err = result.LastInsertId() - if err != nil { - return err - } - - // 创建用户认证记录 - userAuth := &model.UserAuth{ - UserId: userId, - AuthType: model.UserAuthTypeUUID, - AuthKey: uuidStr, - } - _, err = s.userAuthModel.Insert(ctx, session, userAuth) - return err - }) - if err != nil { - return 0, err - } - - return userId, nil -} diff --git a/app/user/cmd/api/internal/service/verificationService.go b/app/user/cmd/api/internal/service/verificationService.go deleted file mode 100644 index 4b4fb5f..0000000 --- a/app/user/cmd/api/internal/service/verificationService.go +++ /dev/null @@ -1,219 +0,0 @@ -package service - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/pkg/lzkit/crypto" - - "github.com/tidwall/gjson" -) - -type VerificationService struct { - c config.Config - westDexService *WestDexService - apiRequestService *ApiRequestService -} - -func NewVerificationService(c config.Config, westDexService *WestDexService, apiRequestService *ApiRequestService) *VerificationService { - return &VerificationService{ - c: c, - westDexService: westDexService, - apiRequestService: apiRequestService, - } -} - -// 二要素 -type TwoFactorVerificationRequest struct { - Name string - IDCard string -} -type TwoFactorVerificationResp struct { - Msg string `json:"msg"` - Success bool `json:"success"` - Code int `json:"code"` - Data *TwoFactorVerificationData `json:"data"` // -} -type TwoFactorVerificationData struct { - Birthday string `json:"birthday"` - Result int `json:"result"` - Address string `json:"address"` - OrderNo string `json:"orderNo"` - Sex string `json:"sex"` - Desc string `json:"desc"` -} - -// 三要素 -type ThreeFactorVerificationRequest struct { - Name string - IDCard string - Mobile string -} - -// VerificationResult 定义校验结果结构体 -type VerificationResult struct { - Passed bool - Err error -} - -// ValidationError 定义校验错误类型 -type ValidationError struct { - Message string -} - -func (e *ValidationError) Error() string { - return e.Message -} - -func (r *VerificationService) TwoFactorVerification(request TwoFactorVerificationRequest) (*VerificationResult, error) { - appCode := r.c.Ali.Code - requestUrl := "https://kzidcardv1.market.alicloudapi.com/api-mall/api/id_card/check" - - // 构造查询参数 - data := url.Values{} - data.Add("name", request.Name) - data.Add("idcard", request.IDCard) - - req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode())) - if err != nil { - return nil, fmt.Errorf("创建请求失败: %v", err) - } - req.Header.Set("Authorization", "APPCODE "+appCode) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return nil, fmt.Errorf("请求失败: %v", err) - } - - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("请求失败, 状态码: %d", resp.StatusCode) - } - - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("响应体读取失败:%v", err) - } - var twoFactorVerificationResp TwoFactorVerificationResp - err = json.Unmarshal(respBody, &twoFactorVerificationResp) - if err != nil { - return nil, fmt.Errorf("二要素解析错误: %v", err) - } - - if !twoFactorVerificationResp.Success { - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "请输入有效的身份证号码"}, - }, nil - } - - if twoFactorVerificationResp.Code != 200 { - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: twoFactorVerificationResp.Msg}, - }, nil - } - - if twoFactorVerificationResp.Data.Result == 1 { - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "姓名与身份证不一致"}, - }, nil - } - - return &VerificationResult{Passed: true, Err: nil}, nil -} - -func (r *VerificationService) TwoFactorVerificationWest(request TwoFactorVerificationRequest) (*VerificationResult, error) { - - params := map[string]interface{}{ - "name": request.Name, - "id_card": request.IDCard, - } - marshal, err := json.Marshal(params) - if err != nil { - return nil, fmt.Errorf("二要素参数创建错误: %v", err) - } - resp, err := r.apiRequestService.ProcessLayoutIdcardRequest(marshal) - if err != nil { - return nil, fmt.Errorf("请求失败: %v", err) - } - - respStr := string(resp) - if respStr != "0" { - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "姓名与身份证不一致"}, - }, nil - } - - return &VerificationResult{Passed: true, Err: nil}, nil -} - -func (r *VerificationService) ThreeFactorVerification(request ThreeFactorVerificationRequest) (*VerificationResult, error) { - westName, err := crypto.WestDexEncrypt(request.Name, r.c.WestConfig.Key) - if err != nil { - return nil, err - } - westIDCard, err := crypto.WestDexEncrypt(request.IDCard, r.c.WestConfig.Key) - if err != nil { - return nil, err - } - westPhone, err := crypto.WestDexEncrypt(request.Mobile, r.c.WestConfig.Key) - if err != nil { - return nil, err - } - threeElementsReq := map[string]interface{}{ - "data": map[string]interface{}{ - "name": westName, - "idNo": westIDCard, - "phone": westPhone, - }, - } - resp, err := r.westDexService.CallAPI("G15BJ02", threeElementsReq) - if err != nil { - return nil, err - } - dataResult := gjson.GetBytes(resp, "data.code") - if !dataResult.Exists() { - return nil, fmt.Errorf("code 字段不存在") - } - code := dataResult.Int() - switch code { - case 1000: - case 1002: - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "姓名、证件号、手机号信息不一致"}, - }, nil - case 1003: - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "姓名、证件号、手机号信息不一致"}, - }, nil - case 1004: - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "姓名不正确"}, - }, nil - case 1005: - return &VerificationResult{ - Passed: false, - Err: &ValidationError{Message: "证件号码不正确"}, - }, nil - default: - dataResultMsg := gjson.GetBytes(resp, "data.msg") - if !dataResultMsg.Exists() { - return nil, fmt.Errorf("msg字段不存在") - } - return nil, fmt.Errorf("三要素核验错误状态响应: %s", dataResultMsg.String()) - } - - return &VerificationResult{Passed: true, Err: nil}, nil -} diff --git a/app/user/cmd/api/internal/service/wechatpayService.go b/app/user/cmd/api/internal/service/wechatpayService.go deleted file mode 100644 index 68b22d9..0000000 --- a/app/user/cmd/api/internal/service/wechatpayService.go +++ /dev/null @@ -1,346 +0,0 @@ -package service - -import ( - "context" - "fmt" - "net/http" - "strconv" - "time" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/model" - "tydata-server/common/ctxdata" - "tydata-server/pkg/lzkit/lzUtils" - - "github.com/wechatpay-apiv3/wechatpay-go/core" - "github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers" - "github.com/wechatpay-apiv3/wechatpay-go/core/downloader" - "github.com/wechatpay-apiv3/wechatpay-go/core/notify" - "github.com/wechatpay-apiv3/wechatpay-go/core/option" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments/app" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi" - "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" - "github.com/wechatpay-apiv3/wechatpay-go/utils" - "github.com/zeromicro/go-zero/core/logx" -) - -const ( - TradeStateSuccess = "SUCCESS" // 支付成功 - TradeStateRefund = "REFUND" // 转入退款 - TradeStateNotPay = "NOTPAY" // 未支付 - TradeStateClosed = "CLOSED" // 已关闭 - TradeStateRevoked = "REVOKED" // 已撤销(付款码支付) - TradeStateUserPaying = "USERPAYING" // 用户支付中(付款码支付) - TradeStatePayError = "PAYERROR" // 支付失败(其他原因,如银行返回失败) -) - -// InitType 初始化类型 -type InitType string - -const ( - InitTypePlatformCert InitType = "platform_cert" // 平台证书初始化 - InitTypeWxPayPubKey InitType = "wxpay_pubkey" // 微信支付公钥初始化 -) - -type WechatPayService struct { - config config.WxpayConfig - wechatClient *core.Client - notifyHandler *notify.Handler - userAuthModel model.UserAuthModel -} - -// NewWechatPayService 创建微信支付服务实例 -func NewWechatPayService(c config.Config, userAuthModel model.UserAuthModel, initType InitType) *WechatPayService { - switch initType { - case InitTypePlatformCert: - return newWechatPayServiceWithPlatformCert(c, userAuthModel) - case InitTypeWxPayPubKey: - return newWechatPayServiceWithWxPayPubKey(c, userAuthModel) - default: - logx.Errorf("不支持的初始化类型: %s", initType) - panic(fmt.Sprintf("初始化失败,服务停止: %s", initType)) - } -} - -// newWechatPayServiceWithPlatformCert 使用平台证书初始化微信支付服务 -func newWechatPayServiceWithPlatformCert(c config.Config, userAuthModel model.UserAuthModel) *WechatPayService { - // 从配置中加载商户信息 - mchID := c.Wxpay.MchID - mchCertificateSerialNumber := c.Wxpay.MchCertificateSerialNumber - mchAPIv3Key := c.Wxpay.MchApiv3Key - - // 从文件中加载商户私钥 - mchPrivateKey, err := utils.LoadPrivateKeyWithPath(c.Wxpay.MchPrivateKeyPath) - if err != nil { - logx.Errorf("加载商户私钥失败: %v", err) - panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序 - } - - // 使用商户私钥和其他参数初始化微信支付客户端 - opts := []core.ClientOption{ - option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key), - } - client, err := core.NewClient(context.Background(), opts...) - if err != nil { - logx.Errorf("创建微信支付客户端失败: %v", err) - panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) // 记录错误并停止程序 - } - - // 在初始化时获取证书访问器并创建 notifyHandler - certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID) - notifyHandler, err := notify.NewRSANotifyHandler(mchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor)) - if err != nil { - logx.Errorf("获取证书访问器失败: %v", err) - panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) - } - - logx.Infof("微信支付客户端初始化成功(平台证书方式)") - return &WechatPayService{ - config: c.Wxpay, - wechatClient: client, - notifyHandler: notifyHandler, - userAuthModel: userAuthModel, - } -} - -// newWechatPayServiceWithWxPayPubKey 使用微信支付公钥初始化微信支付服务 -func newWechatPayServiceWithWxPayPubKey(c config.Config, userAuthModel model.UserAuthModel) *WechatPayService { - // 从配置中加载商户信息 - mchID := c.Wxpay.MchID - mchCertificateSerialNumber := c.Wxpay.MchCertificateSerialNumber - mchAPIv3Key := c.Wxpay.MchApiv3Key - mchPrivateKeyPath := c.Wxpay.MchPrivateKeyPath - mchPublicKeyID := c.Wxpay.MchPublicKeyID - mchPublicKeyPath := c.Wxpay.MchPublicKeyPath - // 从文件中加载商户私钥 - mchPrivateKey, err := utils.LoadPrivateKeyWithPath(mchPrivateKeyPath) - if err != nil { - logx.Errorf("加载商户私钥失败: %v", err) - panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) - } - - // 从文件中加载微信支付平台证书 - mchPublicKey, err := utils.LoadPublicKeyWithPath(mchPublicKeyPath) - if err != nil { - logx.Errorf("加载微信支付平台证书失败: %v", err) - panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) - } - - // 使用商户私钥和其他参数初始化微信支付客户端 - opts := []core.ClientOption{ - option.WithWechatPayPublicKeyAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchPublicKeyID, mchPublicKey), - } - client, err := core.NewClient(context.Background(), opts...) - if err != nil { - logx.Errorf("创建微信支付客户端失败: %v", err) - panic(fmt.Sprintf("初始化失败,服务停止: %v", err)) - } - - // 初始化 notify.Handler - certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchID) - notifyHandler := notify.NewNotifyHandler( - mchAPIv3Key, - verifiers.NewSHA256WithRSACombinedVerifier(certificateVisitor, mchPublicKeyID, *mchPublicKey)) - - logx.Infof("微信支付客户端初始化成功(微信支付公钥方式)") - return &WechatPayService{ - config: c.Wxpay, - wechatClient: client, - notifyHandler: notifyHandler, - userAuthModel: userAuthModel, - } -} - -// CreateWechatAppOrder 创建微信APP支付订单 -func (w *WechatPayService) CreateWechatAppOrder(ctx context.Context, amount float64, description string, outTradeNo string) (string, error) { - totalAmount := lzUtils.ToWechatAmount(amount) - - // 构建支付请求参数 - payRequest := app.PrepayRequest{ - Appid: core.String(w.config.AppID), - Mchid: core.String(w.config.MchID), - Description: core.String(description), - OutTradeNo: core.String(outTradeNo), - NotifyUrl: core.String(w.config.NotifyUrl), - Amount: &app.Amount{ - Total: core.Int64(totalAmount), - }, - } - - // 初始化 AppApiService - svc := app.AppApiService{Client: w.wechatClient} - - // 发起预支付请求 - resp, result, err := svc.Prepay(ctx, payRequest) - if err != nil { - return "", fmt.Errorf("微信支付订单创建失败: %v, 状态码: %d", err, result.Response.StatusCode) - } - - // 返回预支付交易会话标识 - return *resp.PrepayId, nil -} - -// CreateWechatMiniProgramOrder 创建微信小程序支付订单 -func (w *WechatPayService) CreateWechatMiniProgramOrder(ctx context.Context, amount float64, description string, outTradeNo string, openid string) (interface{}, error) { - totalAmount := lzUtils.ToWechatAmount(amount) - - // 构建支付请求参数 - payRequest := jsapi.PrepayRequest{ - Appid: core.String(w.config.AppID), - Mchid: core.String(w.config.MchID), - Description: core.String(description), - OutTradeNo: core.String(outTradeNo), - NotifyUrl: core.String(w.config.NotifyUrl), - Amount: &jsapi.Amount{ - Total: core.Int64(totalAmount), - }, - Payer: &jsapi.Payer{ - Openid: core.String(openid), // 用户的 OpenID,通过前端传入 - }} - - // 初始化 AppApiService - svc := jsapi.JsapiApiService{Client: w.wechatClient} - - // 发起预支付请求 - resp, result, err := svc.PrepayWithRequestPayment(ctx, payRequest) - if err != nil { - return "", fmt.Errorf("微信支付订单创建失败: %v, 状态码: %d", err, result.Response.StatusCode) - } - // 返回预支付交易会话标识 - return resp, nil -} - -// CreateWechatOrder 创建微信支付订单(集成 APP、H5、小程序) -func (w *WechatPayService) CreateWechatOrder(ctx context.Context, amount float64, description string, outTradeNo string) (interface{}, error) { - // 根据 ctx 中的 platform 判断平台 - platform := ctx.Value("platform").(string) - - var prepayData interface{} - var err error - - switch platform { - case "mp-weixin": - userID, getUidErr := ctxdata.GetUidFromCtx(ctx) - if getUidErr != nil { - return "", getUidErr - } - userAuthModel, findAuthModelErr := w.userAuthModel.FindOneByUserIdAuthType(ctx, userID, model.UserAuthTypeWxMini) - if findAuthModelErr != nil { - return "", findAuthModelErr - } - prepayData, err = w.CreateWechatMiniProgramOrder(ctx, amount, description, outTradeNo, userAuthModel.AuthKey) - if err != nil { - return "", err - } - case "h5-weixin": - userID, getUidErr := ctxdata.GetUidFromCtx(ctx) - if getUidErr != nil { - return "", getUidErr - } - userAuthModel, findAuthModelErr := w.userAuthModel.FindOneByUserIdAuthType(ctx, userID, model.UserAuthTypeWxh5) - if findAuthModelErr != nil { - return "", findAuthModelErr - } - prepayData, err = w.CreateWechatMiniProgramOrder(ctx, amount, description, outTradeNo, userAuthModel.AuthKey) - if err != nil { - return "", err - } - case "app": - // 如果是 APP 平台,调用 APP 支付订单创建 - prepayData, err = w.CreateWechatAppOrder(ctx, amount, description, outTradeNo) - default: - return "", fmt.Errorf("不支持的支付平台: %s", platform) - } - - // 如果创建支付订单失败,返回错误 - if err != nil { - return "", fmt.Errorf("支付订单创建失败: %v", err) - } - - // 返回预支付ID - return prepayData, nil -} - -// HandleWechatPayNotification 处理微信支付回调 -func (w *WechatPayService) HandleWechatPayNotification(ctx context.Context, req *http.Request) (*payments.Transaction, error) { - transaction := new(payments.Transaction) - _, err := w.notifyHandler.ParseNotifyRequest(ctx, req, transaction) - if err != nil { - return nil, fmt.Errorf("微信支付通知处理失败: %v", err) - } - // 返回交易信息 - return transaction, nil -} - -// HandleRefundNotification 处理微信退款回调 -func (w *WechatPayService) HandleRefundNotification(ctx context.Context, req *http.Request) (*refunddomestic.Refund, error) { - refund := new(refunddomestic.Refund) - _, err := w.notifyHandler.ParseNotifyRequest(ctx, req, refund) - if err != nil { - return nil, fmt.Errorf("微信退款回调通知处理失败: %v", err) - } - return refund, nil -} - -// QueryOrderStatus 主动查询订单状态 -func (w *WechatPayService) QueryOrderStatus(ctx context.Context, transactionID string) (*payments.Transaction, error) { - svc := jsapi.JsapiApiService{Client: w.wechatClient} - - // 调用 QueryOrderById 方法查询订单状态 - resp, result, err := svc.QueryOrderById(ctx, jsapi.QueryOrderByIdRequest{ - TransactionId: core.String(transactionID), - Mchid: core.String(w.config.MchID), - }) - if err != nil { - return nil, fmt.Errorf("订单查询失败: %v, 状态码: %d", err, result.Response.StatusCode) - } - return resp, nil - -} - -// WeChatRefund 申请微信退款 -func (w *WechatPayService) WeChatRefund(ctx context.Context, outTradeNo string, refundAmount float64, totalAmount float64) error { - - // 生成唯一的退款单号 - outRefundNo := fmt.Sprintf("%s-refund", outTradeNo) - - // 初始化退款服务 - svc := refunddomestic.RefundsApiService{Client: w.wechatClient} - - // 创建退款请求 - resp, result, err := svc.Create(ctx, refunddomestic.CreateRequest{ - OutTradeNo: core.String(outTradeNo), - OutRefundNo: core.String(outRefundNo), - NotifyUrl: core.String(w.config.RefundNotifyUrl), - Amount: &refunddomestic.AmountReq{ - Currency: core.String("CNY"), - Refund: core.Int64(lzUtils.ToWechatAmount(refundAmount)), - Total: core.Int64(lzUtils.ToWechatAmount(totalAmount)), - }, - }) - if err != nil { - return fmt.Errorf("微信订单申请退款错误: %v", err) - } - // 打印退款结果 - logx.Infof("退款申请成功,状态码=%d,退款单号=%s,微信退款单号=%s", result.Response.StatusCode, *resp.OutRefundNo, *resp.RefundId) - return nil -} - -// GenerateOutTradeNo 生成唯一订单号 -func (w *WechatPayService) GenerateOutTradeNo() string { - length := 16 - timestamp := time.Now().UnixNano() - timeStr := strconv.FormatInt(timestamp, 10) - randomPart := strconv.Itoa(int(timestamp % 1e6)) - combined := timeStr + randomPart - - if len(combined) >= length { - return combined[:length] - } - - for len(combined) < length { - combined += strconv.Itoa(int(timestamp % 10)) - } - - return combined -} diff --git a/app/user/cmd/api/internal/service/westdexService.go b/app/user/cmd/api/internal/service/westdexService.go deleted file mode 100644 index e3f635e..0000000 --- a/app/user/cmd/api/internal/service/westdexService.go +++ /dev/null @@ -1,195 +0,0 @@ -package service - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strconv" - "time" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/pkg/lzkit/crypto" - - "github.com/pkg/errors" -) - -type WestResp struct { - Message string `json:"message"` - Code string `json:"code"` - Data string `json:"data"` - ID string `json:"id"` - ErrorCode *int `json:"error_code"` - Reason string `json:"reason"` -} -type G05HZ01WestResp struct { - Message string `json:"message"` - Code string `json:"code"` - Data json.RawMessage `json:"data"` - ID string `json:"id"` - ErrorCode *int `json:"error_code"` - Reason string `json:"reason"` -} -type WestDexService struct { - config config.WestConfig -} - -// NewWestDexService 是一个构造函数,用于初始化 WestDexService -func NewWestDexService(c config.Config) *WestDexService { - return &WestDexService{ - config: c.WestConfig, - } -} - -// CallAPI 调用西部数据的 API -func (w *WestDexService) CallAPI(code string, reqData map[string]interface{}) (resp []byte, err error) { - // 生成当前的13位时间戳 - timestamp := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10) - - // 构造请求URL - reqUrl := fmt.Sprintf("%s/%s/%s?timestamp=%s", w.config.Url, w.config.SecretId, code, timestamp) - - jsonData, marshalErr := json.Marshal(reqData) - if marshalErr != nil { - return nil, marshalErr - } - - // 创建HTTP POST请求 - req, newRequestErr := http.NewRequest("POST", reqUrl, bytes.NewBuffer(jsonData)) - if newRequestErr != nil { - return nil, newRequestErr - } - - // 设置请求头 - req.Header.Set("Content-Type", "application/json") - - // 发送请求 - client := &http.Client{} - httpResp, clientDoErr := client.Do(req) - if clientDoErr != nil { - return nil, clientDoErr - } - defer func(Body io.ReadCloser) { - closeErr := Body.Close() - if closeErr != nil { - - } - }(httpResp.Body) - - // 检查请求是否成功 - if httpResp.StatusCode == 200 { - // 读取响应体 - bodyBytes, ReadErr := io.ReadAll(httpResp.Body) - if ReadErr != nil { - return nil, ReadErr - } - - // 手动调用 json.Unmarshal 触发自定义的 UnmarshalJSON 方法 - var westDexResp WestResp - UnmarshalErr := json.Unmarshal(bodyBytes, &westDexResp) - if UnmarshalErr != nil { - return nil, UnmarshalErr - } - if westDexResp.Code != "00000" && westDexResp.Code != "0" { - if westDexResp.Data == "" { - return nil, errors.New(westDexResp.Message) - } - decryptedData, DecryptErr := crypto.WestDexDecrypt(westDexResp.Data, w.config.Key) - if DecryptErr != nil { - return nil, DecryptErr - } - return decryptedData, errors.New(westDexResp.Message) - } - if westDexResp.Data == "" { - return nil, errors.New(westDexResp.Message) - } - decryptedData, DecryptErr := crypto.WestDexDecrypt(westDexResp.Data, w.config.Key) - if DecryptErr != nil { - return nil, DecryptErr - } - - return decryptedData, nil - } - - return nil, fmt.Errorf("西部请求失败Code: %d", httpResp.StatusCode) -} - -// CallAPI 调用西部数据的 API -func (w *WestDexService) G05HZ01CallAPI(code string, reqData map[string]interface{}) (resp []byte, err error) { - // 生成当前的13位时间戳 - timestamp := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10) - - // 构造请求URL - reqUrl := fmt.Sprintf("%s/%s/%s?timestamp=%s", w.config.Url, w.config.SecretSecondId, code, timestamp) - - jsonData, marshalErr := json.Marshal(reqData) - if marshalErr != nil { - return nil, marshalErr - } - - // 创建HTTP POST请求 - req, newRequestErr := http.NewRequest("POST", reqUrl, bytes.NewBuffer(jsonData)) - if newRequestErr != nil { - return nil, newRequestErr - } - - // 设置请求头 - req.Header.Set("Content-Type", "application/json") - - // 发送请求 - client := &http.Client{} - httpResp, clientDoErr := client.Do(req) - if clientDoErr != nil { - return nil, clientDoErr - } - defer func(Body io.ReadCloser) { - closeErr := Body.Close() - if closeErr != nil { - - } - }(httpResp.Body) - - // 检查请求是否成功 - if httpResp.StatusCode == 200 { - // 读取响应体 - bodyBytes, ReadErr := io.ReadAll(httpResp.Body) - if ReadErr != nil { - return nil, ReadErr - } - - // 手动调用 json.Unmarshal 触发自定义的 UnmarshalJSON 方法 - var westDexResp G05HZ01WestResp - UnmarshalErr := json.Unmarshal(bodyBytes, &westDexResp) - if UnmarshalErr != nil { - return nil, UnmarshalErr - } - if westDexResp.Code != "0000" { - if westDexResp.Data == nil { - return nil, errors.New(westDexResp.Message) - } else { - return westDexResp.Data, errors.New(string(westDexResp.Data)) - } - } - if westDexResp.Data == nil { - return nil, errors.New(westDexResp.Message) - } - return westDexResp.Data, nil - } - - return nil, fmt.Errorf("西部请求失败Code: %d", httpResp.StatusCode) -} - -func (w *WestDexService) Encrypt(data string) string { - encryptedValue, err := crypto.WestDexEncrypt(data, w.config.Key) - if err != nil { - panic("WestDexEncrypt error: " + err.Error()) - } - return encryptedValue -} - -// GetDateRange 返回今天到明天的日期范围,格式为 "yyyyMMdd-yyyyMMdd" -func (w *WestDexService) GetDateRange() string { - today := time.Now().Format("20060102") // 获取今天的日期 - tomorrow := time.Now().Add(24 * time.Hour).Format("20060102") // 获取明天的日期 - return fmt.Sprintf("%s-%s", today, tomorrow) // 拼接日期范围并返回 -} diff --git a/app/user/cmd/api/internal/service/yushanService.go b/app/user/cmd/api/internal/service/yushanService.go deleted file mode 100644 index 33b5be8..0000000 --- a/app/user/cmd/api/internal/service/yushanService.go +++ /dev/null @@ -1,187 +0,0 @@ -package service - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "time" - "tydata-server/app/user/cmd/api/internal/config" - - "github.com/tidwall/gjson" -) - -type YushanService struct { - config config.YushanConfig -} - -func NewYushanService(c config.Config) *YushanService { - return &YushanService{ - config: c.YushanConfig, - } -} - -func (y *YushanService) request(prodID string, params map[string]interface{}) ([]byte, error) { - // 获取当前时间戳 - unixMilliseconds := time.Now().UnixNano() / int64(time.Millisecond) - - // 生成请求序列号 - requestSN, _ := y.GenerateRandomString() - - // 构建请求数据 - reqData := map[string]interface{}{ - "prod_id": prodID, - "req_time": unixMilliseconds, - "request_sn": requestSN, - "req_data": params, - } - - // 将请求数据转换为 JSON 字节数组 - messageBytes, err := json.Marshal(reqData) - if err != nil { - return nil, err - } - - // 获取 API 密钥 - key, err := hex.DecodeString(y.config.ApiKey) - if err != nil { - return nil, err - } - - // 使用 AES CBC 加密请求数据 - cipherText := y.AES_CBC_Encrypt(messageBytes, key) - - // 将加密后的数据编码为 Base64 字符串 - content := base64.StdEncoding.EncodeToString(cipherText) - - // 发起 HTTP 请求 - client := &http.Client{} - req, err := http.NewRequest("POST", y.config.Url, strings.NewReader(content)) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "application/json") - req.Header.Set("ACCT_ID", y.config.AcctID) - - // 执行请求 - resp, err := client.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // 读取响应体 - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - var respData []byte - - if IsJSON(string(body)) { - respData = body - } else { - sDec, err := base64.StdEncoding.DecodeString(string(body)) - if err != nil { - return nil, err - } - respData = y.AES_CBC_Decrypt(sDec, key) - } - retCode := gjson.GetBytes(respData, "retcode").String() - - if retCode == "100000" { - // retcode 为 100000,表示查询为空 - return nil, fmt.Errorf("羽山请求查空: %s", string(respData)) - } else if retCode == "000000" { - // retcode 为 000000,表示有数据,返回 retdata - retData := gjson.GetBytes(respData, "retdata") - if !retData.Exists() { - return nil, fmt.Errorf("羽山请求retdata为空: %s", string(respData)) - } - return []byte(retData.Raw), nil - } else { - return nil, fmt.Errorf("羽山请求未知的状态码: %s", string(respData)) - } - -} - -// 判断字符串是否为 JSON 格式 -func IsJSON(s string) bool { - var js interface{} - return json.Unmarshal([]byte(s), &js) == nil -} - -// GenerateRandomString 生成一个32位的随机字符串订单号 -func (y *YushanService) GenerateRandomString() (string, error) { - // 创建一个16字节的数组 - bytes := make([]byte, 16) - // 读取随机字节到数组中 - if _, err := rand.Read(bytes); err != nil { - return "", err - } - // 将字节数组编码为16进制字符串 - return hex.EncodeToString(bytes), nil -} - -// AEC加密(CBC模式) -func (y *YushanService) AES_CBC_Encrypt(plainText []byte, key []byte) []byte { - //指定加密算法,返回一个AES算法的Block接口对象 - block, err := aes.NewCipher(key) - if err != nil { - panic(err) - } - //进行填充 - plainText = Padding(plainText, block.BlockSize()) - //指定初始向量vi,长度和block的块尺寸一致 - iv := []byte("0000000000000000") - //指定分组模式,返回一个BlockMode接口对象 - blockMode := cipher.NewCBCEncrypter(block, iv) - //加密连续数据库 - cipherText := make([]byte, len(plainText)) - blockMode.CryptBlocks(cipherText, plainText) - //返回base64密文 - return cipherText -} - -// AEC解密(CBC模式) -func (y *YushanService) AES_CBC_Decrypt(cipherText []byte, key []byte) []byte { - //指定解密算法,返回一个AES算法的Block接口对象 - block, err := aes.NewCipher(key) - if err != nil { - panic(err) - } - //指定初始化向量IV,和加密的一致 - iv := []byte("0000000000000000") - //指定分组模式,返回一个BlockMode接口对象 - blockMode := cipher.NewCBCDecrypter(block, iv) - //解密 - plainText := make([]byte, len(cipherText)) - blockMode.CryptBlocks(plainText, cipherText) - //删除填充 - plainText = UnPadding(plainText) - return plainText -} // 对明文进行填充 -func Padding(plainText []byte, blockSize int) []byte { - //计算要填充的长度 - n := blockSize - len(plainText)%blockSize - //对原来的明文填充n个n - temp := bytes.Repeat([]byte{byte(n)}, n) - plainText = append(plainText, temp...) - return plainText -} - -// 对密文删除填充 -func UnPadding(cipherText []byte) []byte { - //取出密文最后一个字节end - end := cipherText[len(cipherText)-1] - //删除填充 - cipherText = cipherText[:len(cipherText)-int(end)] - return cipherText -} diff --git a/app/user/cmd/api/internal/svc/servicecontext.go b/app/user/cmd/api/internal/svc/servicecontext.go deleted file mode 100644 index 001dbb0..0000000 --- a/app/user/cmd/api/internal/svc/servicecontext.go +++ /dev/null @@ -1,171 +0,0 @@ -package svc - -import ( - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/cmd/api/internal/middleware" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/model" - - "github.com/hibiken/asynq" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" - "github.com/zeromicro/go-zero/rest" -) - -type ServiceContext struct { - Config config.Config - Redis *redis.Redis - SourceInterceptor rest.Middleware - AuthInterceptor rest.Middleware - UserModel model.UserModel - UserAuthModel model.UserAuthModel - ProductModel model.ProductModel - FeatureModel model.FeatureModel - ProductFeatureModel model.ProductFeatureModel - OrderModel model.OrderModel - QueryModel model.QueryModel - AgentModel model.AgentModel - AgentAuditModel model.AgentAuditModel - AgentClosureModel model.AgentClosureModel - AgentCommissionModel model.AgentCommissionModel - AgentCommissionDeductionModel model.AgentCommissionDeductionModel - AgentWalletModel model.AgentWalletModel - AgentLinkModel model.AgentLinkModel - AgentOrderModel model.AgentOrderModel - AgentRewardsModel model.AgentRewardsModel - AgentMembershipConfigModel model.AgentMembershipConfigModel - AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel - AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel - AgentProductConfigModel model.AgentProductConfigModel - AgentPlatformDeductionModel model.AgentPlatformDeductionModel - AgentActiveStatModel model.AgentActiveStatModel - AgentWithdrawalModel model.AgentWithdrawalModel - AgentRealNameModel model.AgentRealNameModel - ExampleModel model.ExampleModel - GlobalNotificationsModel model.GlobalNotificationsModel - AlipayService *service.AliPayService - WechatPayService *service.WechatPayService - ApplePayService *service.ApplePayService - WestDexService *service.WestDexService - YushanService *service.YushanService - ApiRequestService *service.ApiRequestService - AsynqServer *asynq.Server // 服务端 - AsynqService *service.AsynqService // 客户端 - VerificationService *service.VerificationService - AgentService *service.AgentService - UserService *service.UserService -} - -func NewServiceContext(c config.Config) *ServiceContext { - db := sqlx.NewMysql(c.DataSource) - - redisConf := redis.RedisConf{ - Host: c.CacheRedis[0].Host, - Pass: c.CacheRedis[0].Pass, - Type: c.CacheRedis[0].Type, - } - - asynqServer := asynq.NewServer( - asynq.RedisClientOpt{Addr: c.CacheRedis[0].Host, Password: c.CacheRedis[0].Pass}, - asynq.Config{ - IsFailure: func(err error) bool { - logx.Errorf("异步任务失败: %+v \n", err) - return true - }, - Concurrency: 10, - }, - ) - - westDexService := service.NewWestDexService(c) - yushanService := service.NewYushanService(c) - productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis) - featureModel := model.NewFeatureModel(db, c.CacheRedis) - userAuthModel := model.NewUserAuthModel(db, c.CacheRedis) - - userModel := model.NewUserModel(db, c.CacheRedis) - productModel := model.NewProductModel(db, c.CacheRedis) - orderModel := model.NewOrderModel(db, c.CacheRedis) - queryModel := model.NewQueryModel(db, c.CacheRedis) - globalNotificationsModel := model.NewGlobalNotificationsModel(db, c.CacheRedis) - - agentModel := model.NewAgentModel(db, c.CacheRedis) - agentAuditModel := model.NewAgentAuditModel(db, c.CacheRedis) - agentCommissionModel := model.NewAgentCommissionModel(db, c.CacheRedis) - agentCommissionDeductionModel := model.NewAgentCommissionDeductionModel(db, c.CacheRedis) - agentWalletModel := model.NewAgentWalletModel(db, c.CacheRedis) - agentClosureModel := model.NewAgentClosureModel(db, c.CacheRedis) - agentLinkModel := model.NewAgentLinkModel(db, c.CacheRedis) - agentOrderModel := model.NewAgentOrderModel(db, c.CacheRedis) - agentRewardsModel := model.NewAgentRewardsModel(db, c.CacheRedis) - agentMembershipConfigModel := model.NewAgentMembershipConfigModel(db, c.CacheRedis) - agentMembershipRechargeOrderModel := model.NewAgentMembershipRechargeOrderModel(db, c.CacheRedis) - agentMembershipUserConfigModel := model.NewAgentMembershipUserConfigModel(db, c.CacheRedis) - agentProductConfigModel := model.NewAgentProductConfigModel(db, c.CacheRedis) - agentPlatformDeductionModel := model.NewAgentPlatformDeductionModel(db, c.CacheRedis) - agentActiveStatModel := model.NewAgentActiveStatModel(db, c.CacheRedis) - agentWithdrawalModel := model.NewAgentWithdrawalModel(db, c.CacheRedis) - agentRealNameModel := model.NewAgentRealNameModel(db, c.CacheRedis) - exampleModel := model.NewExampleModel(db, c.CacheRedis) - - alipayService := service.NewAliPayService(c) - wechatPayService := service.NewWechatPayService(c, userAuthModel, service.InitTypeWxPayPubKey) - applePayService := service.NewApplePayService(c) - apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel) - verificationService := service.NewVerificationService(c, westDexService, apiRequestService) - asynqService := service.NewAsynqService(c) - agentService := service.NewAgentService(c, agentModel, agentAuditModel, agentClosureModel, agentCommissionModel, - agentCommissionDeductionModel, agentWalletModel, agentLinkModel, agentOrderModel, agentRewardsModel, - agentMembershipConfigModel, agentMembershipRechargeOrderModel, agentMembershipUserConfigModel, - agentProductConfigModel, agentPlatformDeductionModel, agentActiveStatModel, agentWithdrawalModel) - userService := service.NewUserService(userModel, userAuthModel) - return &ServiceContext{ - Config: c, - Redis: redis.MustNewRedis(redisConf), - SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle, - AuthInterceptor: middleware.NewAuthInterceptorMiddleware(c).Handle, - AlipayService: alipayService, - WechatPayService: wechatPayService, - ApplePayService: applePayService, - WestDexService: westDexService, - YushanService: yushanService, - VerificationService: verificationService, - AsynqServer: asynqServer, - ApiRequestService: apiRequestService, - AsynqService: asynqService, - AgentService: agentService, - UserModel: userModel, - UserAuthModel: userAuthModel, - ProductModel: productModel, - OrderModel: orderModel, - QueryModel: queryModel, - GlobalNotificationsModel: globalNotificationsModel, - FeatureModel: featureModel, - ProductFeatureModel: productFeatureModel, - AgentModel: agentModel, - AgentAuditModel: agentAuditModel, - AgentCommissionModel: agentCommissionModel, - AgentCommissionDeductionModel: agentCommissionDeductionModel, - AgentWalletModel: agentWalletModel, - AgentClosureModel: agentClosureModel, - AgentLinkModel: agentLinkModel, - AgentOrderModel: agentOrderModel, - AgentRewardsModel: agentRewardsModel, - AgentMembershipConfigModel: agentMembershipConfigModel, - AgentMembershipRechargeOrderModel: agentMembershipRechargeOrderModel, - AgentMembershipUserConfigModel: agentMembershipUserConfigModel, - AgentProductConfigModel: agentProductConfigModel, - AgentPlatformDeductionModel: agentPlatformDeductionModel, - AgentActiveStatModel: agentActiveStatModel, - AgentWithdrawalModel: agentWithdrawalModel, - AgentRealNameModel: agentRealNameModel, - ExampleModel: exampleModel, - UserService: userService, - } -} - -func (s *ServiceContext) Close() { - if s.AsynqService != nil { - s.AsynqService.Close() - } -} diff --git a/app/user/cmd/api/internal/types/cache.go b/app/user/cmd/api/internal/types/cache.go deleted file mode 100644 index ecd68cc..0000000 --- a/app/user/cmd/api/internal/types/cache.go +++ /dev/null @@ -1,20 +0,0 @@ -package types - -const QueryCacheKey = "query:%d:%s" -const AgentVipCacheKey = "agentVip:%d:%s" - -type QueryCache struct { - Name string `json:"name"` - IDCard string `json:"id_card"` - Mobile string `json:"mobile"` - Product string `json:"product_id"` -} -type QueryCacheLoad struct { - Product string `json:"product_en"` - Params string `json:"params"` - AgentIdentifier string `json:"agent_dentifier"` -} - -type AgentVipCache struct { - Type string `json:"type"` -} diff --git a/app/user/cmd/api/internal/types/encrypPayload.go b/app/user/cmd/api/internal/types/encrypPayload.go deleted file mode 100644 index 3c6e385..0000000 --- a/app/user/cmd/api/internal/types/encrypPayload.go +++ /dev/null @@ -1,6 +0,0 @@ -package types - -type QueryShareLinkPayload struct { - OrderId int64 `json:"order_id"` - ExpireAt int64 `json:"expire_at"` -} diff --git a/app/user/cmd/api/internal/types/payload.go b/app/user/cmd/api/internal/types/payload.go deleted file mode 100644 index 672918f..0000000 --- a/app/user/cmd/api/internal/types/payload.go +++ /dev/null @@ -1,5 +0,0 @@ -package types - -type MsgPaySuccessQueryPayload struct { - OrderID int64 `json:"order_id"` -} diff --git a/app/user/cmd/api/internal/types/query.go b/app/user/cmd/api/internal/types/query.go deleted file mode 100644 index 5687f34..0000000 --- a/app/user/cmd/api/internal/types/query.go +++ /dev/null @@ -1,113 +0,0 @@ -package types - -type MarriageReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} -type HomeServiceReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} - -// RiskAssessment 查询请求结构 -type RiskAssessmentReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} - -// CompanyInfo 查询请求结构 -type CompanyInfoReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} - -// RentalInfo 查询请求结构 -type RentalInfoReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} - -// PreLoanBackgroundCheck 查询请求结构 -type PreLoanBackgroundCheckReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} - -// BackgroundCheck 查询请求结构 -type BackgroundCheckReq struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} -type EntLawsuitReq struct { - EntName string `json:"ent_name" validate:"required,name"` - EntCode string `json:"ent_code" validate:"required,USCI"` - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} -type TocPhoneThreeElements struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` -} -type TocPhoneTwoElements struct { - Name string `json:"name" validate:"required,name"` - Mobile string `json:"mobile" validate:"required,mobile"` -} -type TocIDCardTwoElements struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` -} -type TocDualMarriage struct { - NameMan string `json:"name_man" validate:"required,name"` - IDCardMan string `json:"id_card_man" validate:"required,idCard"` - NameWoman string `json:"name_woman" validate:"required,name"` - IDCardWoman string `json:"id_card_woman" validate:"required,idCard"` -} -type TocPersonVehicleVerification struct { - Name string `json:"name" validate:"required,name"` - CarType string `json:"car_type" validate:"required"` - CarLicense string `json:"car_license" validate:"required"` -} - -// 银行卡黑名单 -type TocBankCardBlacklist struct { - Name string `json:"name" validate:"required,name"` - IDCard string `json:"id_card" validate:"required,idCard"` - Mobile string `json:"mobile" validate:"required,mobile"` - BankCard string `json:"bank_card" validate:"required"` -} - -// 手机号码风险 -type TocPhoneNumberRisk struct { - Mobile string `json:"mobile" validate:"required,mobile"` -} - -// 手机二次卡 -type TocPhoneSecondaryCard struct { - Mobile string `json:"mobile" validate:"required,mobile"` - StartDate string `json:"start_date" validate:"required"` -} - -type AgentQueryData struct { - Mobile string `json:"mobile"` - Code string `json:"code"` -} -type AgentIdentifier struct { - Product string `json:"product"` - AgentID int64 `json:"agent_id"` - Price string `json:"price"` -} diff --git a/app/user/cmd/api/internal/types/queryMap.go b/app/user/cmd/api/internal/types/queryMap.go deleted file mode 100644 index 13256a6..0000000 --- a/app/user/cmd/api/internal/types/queryMap.go +++ /dev/null @@ -1,47 +0,0 @@ -package types - -// 特殊名单 G26BJ05 -var G26BJ05FieldMapping = map[string]string{ - "IDCard": "id", - "Name": "name", - "Mobile": "cell", - "TimeRange": "time_range", -} - -// 个人不良 -var G34BJ03FieldMapping = map[string]string{ - "IDCard": "id_card", - "Name": "name", -} - -// 个人涉诉 G35SC01 -var G35SC01FieldMapping = map[string]string{ - "Name": "name", - "IDCard": "idcard", - "InquiredAuth": "inquired_auth", -} - -// 单人婚姻 G09SC02 -var G09SC02FieldMapping = map[string]string{ - "IDCard": "certNumMan", - "Name": "nameMan", -} - -// 借贷意向 G27BJ05 -var G27BJ05FieldMapping = map[string]string{ - "IDCard": "id", - "Name": "name", - "Mobile": "cell", -} - -// 借贷行为 G28BJ05 -var G28BJ05FieldMapping = map[string]string{ - "IDCard": "id", - "Name": "name", - "Mobile": "cell", -} - -// 股东人企关系精准版 G05HZ01 -var G05HZ01FieldMapping = map[string]string{ - "IDCard": "pid", -} diff --git a/app/user/cmd/api/internal/types/queryParams.go b/app/user/cmd/api/internal/types/queryParams.go deleted file mode 100644 index 1c243d5..0000000 --- a/app/user/cmd/api/internal/types/queryParams.go +++ /dev/null @@ -1,73 +0,0 @@ -package types - -type WestDexServiceRequestParams struct { - FieldMapping map[string]string - ApiID string -} - -var WestDexParams = map[string][]WestDexServiceRequestParams{ - "marriage": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - - }, - "backgroundcheck": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - }, - "companyinfo": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - }, - "homeservice": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - }, - "preloanbackgroundcheck": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - }, - "rentalinfo": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - }, - "riskassessment": { - {FieldMapping: G09SC02FieldMapping, ApiID: "G09SC02"}, // 单人婚姻 - {FieldMapping: G27BJ05FieldMapping, ApiID: "G27BJ05"}, // 借贷意向 - {FieldMapping: G28BJ05FieldMapping, ApiID: "G28BJ05"}, // 借贷行为 - {FieldMapping: G26BJ05FieldMapping, ApiID: "G26BJ05"}, // 特殊名单 - {FieldMapping: G05HZ01FieldMapping, ApiID: "G05HZ01"}, // 股东人企关系 - {FieldMapping: G34BJ03FieldMapping, ApiID: "G34BJ03"}, // 个人不良 - {FieldMapping: G35SC01FieldMapping, ApiID: "G35SC01"}, // 个人涉诉 - }, -} diff --git a/app/user/cmd/api/internal/types/taskname.go b/app/user/cmd/api/internal/types/taskname.go deleted file mode 100644 index 33329ee..0000000 --- a/app/user/cmd/api/internal/types/taskname.go +++ /dev/null @@ -1,4 +0,0 @@ -package types - -const MsgPaySuccessQuery = "msg:pay_success:query" -const MsgCleanQueryData = "msg:clean_query_data" diff --git a/app/user/cmd/api/internal/types/types.go b/app/user/cmd/api/internal/types/types.go deleted file mode 100644 index 637703e..0000000 --- a/app/user/cmd/api/internal/types/types.go +++ /dev/null @@ -1,569 +0,0 @@ -// Code generated by goctl. DO NOT EDIT. -package types - -type ActiveReward struct { - TotalReward float64 `json:"total_reward"` - Today ActiveRewardData `json:"today"` // 今日数据 - Last7D ActiveRewardData `json:"last7d"` // 近7天数据 - Last30D ActiveRewardData `json:"last30d"` // 近30天数据 -} - -type ActiveRewardData struct { - NewActiveReward float64 `json:"active_reward"` - SubPromoteReward float64 `json:"sub_promote_reward"` - SubUpgradeReward float64 `json:"sub_upgrade_reward"` - SubWithdrawReward float64 `json:"sub_withdraw_reward"` -} - -type AgentActivateMembershipReq struct { - Type string `json:"type,oneof=VIP SVIP"` // 会员类型:vip/svip -} - -type AgentActivateMembershipResp struct { - Id string `json:"id"` -} - -type AgentApplyReq struct { - Region string `json:"region"` - Mobile string `json:"mobile"` - Code string `json:"code"` - Ancestor string `json:"ancestor,optional"` -} - -type AgentApplyResp struct { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type AgentAuditStatusResp struct { - Status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过 - AuditReason string `json:"audit_reason"` -} - -type AgentGeneratingLinkReq struct { - Product string `json:"product"` - Price string `json:"price"` -} - -type AgentGeneratingLinkResp struct { - LinkIdentifier string `json:"link_identifier"` -} - -type AgentInfoResp struct { - Status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过,3=未申请 - IsAgent bool `json:"is_agent"` - AgentID int64 `json:"agent_id"` - Level string `json:"level"` - Region string `json:"region"` - Mobile string `json:"mobile"` - ExpiryTime string `json:"expiry_time"` - IsRealName bool `json:"is_real_name"` -} - -type AgentMembershipProductConfigReq struct { - ProductID int64 `form:"product_id"` -} - -type AgentMembershipProductConfigResp struct { - AgentMembershipUserConfig AgentMembershipUserConfig `json:"agent_membership_user_config"` - ProductConfig ProductConfig `json:"product_config"` - PriceIncreaseMax float64 `json:"price_increase_max"` - PriceIncreaseAmount float64 `json:"price_increase_amount"` - PriceRatio float64 `json:"price_ratio"` -} - -type AgentMembershipUserConfig struct { - ProductID int64 `json:"product_id"` - PriceIncreaseAmount float64 `json:"price_increase_amount"` - PriceRangeFrom float64 `json:"price_range_from"` - PriceRangeTo float64 `json:"price_range_to"` - PriceRatio float64 `json:"price_ratio"` -} - -type AgentProductConfig struct { - ProductID int64 `json:"product_id"` - CostPrice float64 `json:"cost_price"` - PriceRangeMin float64 `json:"price_range_min"` - PriceRangeMax float64 `json:"price_range_max"` - PPricingStandard float64 `json:"p_pricing_standard"` - POverpricingRatio float64 `json:"p_overpricing_ratio"` - APricingStandard float64 `json:"a_pricing_standard"` - APricingEnd float64 `json:"a_pricing_end"` - AOverpricingRatio float64 `json:"a_overpricing_ratio"` -} - -type AgentProductConfigResp struct { - AgentProductConfig []AgentProductConfig -} - -type AgentRealNameReq struct { - Name string `json:"name"` - IDCard string `json:"id_card"` - Mobile string `json:"mobile"` - Code string `json:"code"` -} - -type AgentRealNameResp struct { - Status string `json:"status"` -} - -type AgentSubordinateContributionDetail struct { - ID int64 `json:"id"` - CreateTime string `json:"create_time"` - Amount float64 `json:"amount"` - Type string `json:"type"` -} - -type AgentSubordinateContributionStats struct { - CostCount int64 `json:"cost_count"` // 成本扣除次数 - CostAmount float64 `json:"cost_amount"` // 成本扣除总额 - PricingCount int64 `json:"pricing_count"` // 定价扣除次数 - PricingAmount float64 `json:"pricing_amount"` // 定价扣除总额 - DescendantPromotionCount int64 `json:"descendant_promotion_count"` // 下级推广次数 - DescendantPromotionAmount float64 `json:"descendant_promotion_amount"` // 下级推广总额 - DescendantUpgradeVipCount int64 `json:"descendant_upgrade_vip_count"` // 下级升级VIP次数 - DescendantUpgradeVipAmount float64 `json:"descendant_upgrade_vip_amount"` // 下级升级VIP总额 - DescendantUpgradeSvipCount int64 `json:"descendant_upgrade_svip_count"` // 下级升级SVIP次数 - DescendantUpgradeSvipAmount float64 `json:"descendant_upgrade_svip_amount"` // 下级升级SVIP总额 - DescendantStayActiveCount int64 `json:"descendant_stay_active_count"` // 下级保持活跃次数 - DescendantStayActiveAmount float64 `json:"descendant_stay_active_amount"` // 下级保持活跃总额 - DescendantNewActiveCount int64 `json:"descendant_new_active_count"` // 下级新增活跃次数 - DescendantNewActiveAmount float64 `json:"descendant_new_active_amount"` // 下级新增活跃总额 - DescendantWithdrawCount int64 `json:"descendant_withdraw_count"` // 下级提现次数 - DescendantWithdrawAmount float64 `json:"descendant_withdraw_amount"` // 下级提现总额 -} - -type AgentSubordinateList struct { - ID int64 `json:"id"` - Mobile string `json:"mobile"` - CreateTime string `json:"create_time"` - LevelName string `json:"level_name"` - TotalOrders int64 `json:"total_orders"` // 总单量 - TotalEarnings float64 `json:"total_earnings"` // 总金额 - TotalContribution float64 `json:"total_contribution"` // 总贡献 -} - -type BindMobileReq struct { - Mobile string `json:"mobile" validate:"required,mobile"` - Code string `json:"code" validate:"required"` -} - -type BindMobileResp struct { -} - -type Commission struct { - ProductName string `json:"product_name"` - Amount float64 `json:"amount"` - CreateTime string `json:"create_time"` -} - -type DirectPushReport struct { - TotalCommission float64 `json:"total_commission"` - TotalReport int `json:"total_report"` - Today TimeRangeReport `json:"today"` // 近24小时数据 - Last7D TimeRangeReport `json:"last7d"` // 近7天数据 - Last30D TimeRangeReport `json:"last30d"` // 近30天数据 -} - -type Feature struct { - ID int64 `json:"id"` // 功能ID - ApiID string `json:"api_id"` // API标识 - Name string `json:"name"` // 功能描述 -} - -type GetAgentRevenueInfoReq struct { -} - -type GetAgentRevenueInfoResp struct { - Balance float64 `json:"balance"` - FrozenBalance float64 `json:"frozen_balance"` - TotalEarnings float64 `json:"total_earnings"` - DirectPush DirectPushReport `json:"direct_push"` // 直推报告数据 - ActiveReward ActiveReward `json:"active_reward"` // 活跃下级奖励数据 -} - -type GetAgentSubordinateContributionDetailReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 - SubordinateID int64 `form:"subordinate_id"` // 下级ID -} - -type GetAgentSubordinateContributionDetailResp struct { - Mobile string `json:"mobile"` - Total int64 `json:"total"` // 总记录数 - CreateTime string `json:"create_time"` - TotalEarnings float64 `json:"total_earnings"` // 总金额 - TotalContribution float64 `json:"total_contribution"` // 总贡献 - TotalOrders int64 `json:"total_orders"` // 总单量 - LevelName string `json:"level_name"` // 等级名称 - List []AgentSubordinateContributionDetail `json:"list"` // 查询列表 - Stats AgentSubordinateContributionStats `json:"stats"` // 统计数据 -} - -type GetAgentSubordinateListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 -} - -type GetAgentSubordinateListResp struct { - Total int64 `json:"total"` // 总记录数 - List []AgentSubordinateList `json:"list"` // 查询列表 -} - -type GetCommissionReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 -} - -type GetCommissionResp struct { - Total int64 `json:"total"` // 总记录数 - List []Commission `json:"list"` // 查询列表 -} - -type GetLinkDataReq struct { - LinkIdentifier string `form:"link_identifier"` -} - -type GetLinkDataResp struct { - Product -} - -type GetNotificationsResp struct { - Notifications []Notification `json:"notifications"` // 通知列表 - Total int64 `json:"total"` // 总记录数 -} - -type GetProductByEnRequest struct { - ProductEn string `path:"product_en"` -} - -type GetProductByIDRequest struct { - Id int64 `path:"id"` -} - -type GetRewardsReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 -} - -type GetRewardsResp struct { - Total int64 `json:"total"` // 总记录数 - List []Rewards `json:"list"` // 查询列表 -} - -type GetWithdrawalReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 -} - -type GetWithdrawalResp struct { - Total int64 `json:"total"` // 总记录数 - List []Withdrawal `json:"list"` // 查询列表 -} - -type HealthCheckResp struct { - Status string `json:"status"` // 服务状态 - Message string `json:"message"` // 状态信息 -} - -type IapCallbackReq struct { - OrderID int64 `json:"order_id" validate:"required"` - TransactionReceipt string `json:"transaction_receipt" validate:"required"` -} - -type MobileCodeLoginReq struct { - Mobile string `json:"mobile"` - Code string `json:"code" validate:"required"` -} - -type MobileCodeLoginResp struct { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type MobileLoginReq struct { - Mobile string `json:"mobile" validate:"required,mobile"` - Password string `json:"password" validate:"required"` -} - -type MobileLoginResp struct { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type Notification struct { - Title string `json:"title"` // 通知标题 - Content string `json:"content"` // 通知内容 (富文本) - NotificationPage string `json:"notificationPage"` // 通知页面 - StartDate string `json:"startDate"` // 通知开始日期,格式 "YYYY-MM-DD" - EndDate string `json:"endDate"` // 通知结束日期,格式 "YYYY-MM-DD" - StartTime string `json:"startTime"` // 每天通知开始时间,格式 "HH:MM:SS" - EndTime string `json:"endTime"` // 每天通知结束时间,格式 "HH:MM:SS" -} - -type PaymentCheckReq struct { - OrderNo string `json:"order_no" validate:"required"` -} - -type PaymentCheckResp struct { - Type string `json:"type"` - Status string `json:"status"` -} - -type PaymentReq struct { - Id string `json:"id"` - PayMethod string `json:"pay_method"` - PayType string `json:"pay_type" validate:"required,oneof=query agent_vip"` -} - -type PaymentResp struct { - PrepayData interface{} `json:"prepay_data"` - PrepayId string `json:"prepay_id"` - OrderNo string `json:"order_no"` -} - -type Product struct { - ProductName string `json:"product_name"` - ProductEn string `json:"product_en"` - Description string `json:"description"` - Notes string `json:"notes,optional"` - SellPrice float64 `json:"sell_price"` - Features []Feature `json:"features"` // 关联功能列表 -} - -type ProductConfig struct { - ProductID int64 `json:"product_id"` - CostPrice float64 `json:"cost_price"` - PriceRangeMin float64 `json:"price_range_min"` - PriceRangeMax float64 `json:"price_range_max"` -} - -type ProductResponse struct { - Product -} - -type Query struct { - Id int64 `json:"id"` // 主键ID - OrderId int64 `json:"order_id"` // 订单ID - UserId int64 `json:"user_id"` // 用户ID - ProductName string `json:"product_name"` // 产品ID - QueryParams map[string]interface{} `json:"query_params"` - QueryData []QueryItem `json:"query_data"` - CreateTime string `json:"create_time"` // 创建时间 - UpdateTime string `json:"update_time"` // 更新时间 - QueryState string `json:"query_state"` // 查询状态 -} - -type QueryDetailByOrderIdReq struct { - OrderId int64 `path:"order_id"` -} - -type QueryDetailByOrderIdResp struct { - Query -} - -type QueryDetailByOrderNoReq struct { - OrderNo string `path:"order_no"` -} - -type QueryDetailByOrderNoResp struct { - Query -} - -type QueryExampleReq struct { - Feature string `form:"feature"` -} - -type QueryExampleResp struct { - Query -} - -type QueryGenerateShareLinkReq struct { - OrderId *int64 `json:"order_id,optional"` - OrderNo *string `json:"order_no,optional"` -} - -type QueryGenerateShareLinkResp struct { - ShareLink string `json:"share_link"` -} - -type QueryItem struct { - Feature interface{} `json:"feature"` - Data interface{} `json:"data"` // 这里可以是 map 或 具体的 struct -} - -type QueryListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"page_size"` // 每页数据量 -} - -type QueryListResp struct { - Total int64 `json:"total"` // 总记录数 - List []Query `json:"list"` // 查询列表 -} - -type QueryProvisionalOrderReq struct { - Id string `path:"id"` -} - -type QueryProvisionalOrderResp struct { - Name string `json:"name"` - IdCard string `json:"id_card"` - Mobile string `json:"mobile"` - Product Product `json:"product"` -} - -type QueryReq struct { - Data string `json:"data" validate:"required"` -} - -type QueryResp struct { - Id string `json:"id"` -} - -type QueryRetryReq struct { - Id int64 `path:"id"` -} - -type QueryRetryResp struct { - Query -} - -type QueryServiceReq struct { - Product string `path:"product"` - Data string `json:"data" validate:"required"` - AgentIdentifier string `json:"agent_identifier,optional"` - App bool `json:"app,optional"` -} - -type QueryServiceResp struct { - Id string `json:"id"` - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type QueryShareDetailReq struct { - Id string `path:"id"` -} - -type QueryShareDetailResp struct { - Status string `json:"status"` - Query -} - -type QuerySingleTestReq struct { - Params map[string]interface{} `json:"params"` - Api string `json:"api"` -} - -type QuerySingleTestResp struct { - Data interface{} `json:"data"` - Api string `json:"api"` -} - -type RegisterReq struct { - Mobile string `json:"mobile" validate:"required,mobile"` - Password string `json:"password" validate:"required,min=11,max=11,password"` - Code string `json:"code" validate:"required"` -} - -type RegisterResp struct { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type Rewards struct { - Type string `json:"type"` - Amount float64 `json:"amount"` - CreateTime string `json:"create_time"` -} - -type SaveAgentMembershipUserConfigReq struct { - ProductID int64 `json:"product_id"` - PriceIncreaseAmount float64 `json:"price_increase_amount"` - PriceRangeFrom float64 `json:"price_range_from"` - PriceRangeTo float64 `json:"price_range_to"` - PriceRatio float64 `json:"price_ratio"` -} - -type TimeRangeReport struct { - Commission float64 `json:"commission"` // 佣金 - Report int `json:"report"` // 报告量 -} - -type UpdateQueryDataReq struct { - Id int64 `json:"id"` // 查询ID - QueryData string `json:"query_data"` // 查询数据(未加密的JSON) -} - -type UpdateQueryDataResp struct { - Id int64 `json:"id"` - UpdatedAt string `json:"updated_at"` // 更新时间 -} - -type User struct { - Id int64 `json:"id"` - Mobile string `json:"mobile"` - NickName string `json:"nickName"` -} - -type UserInfoResp struct { - UserInfo User `json:"userInfo"` -} - -type WXH5AuthReq struct { - Code string `json:"code"` -} - -type WXH5AuthResp struct { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type WXMiniAuthReq struct { - Code string `json:"code"` - IV string `json:"iv"` - EncryptedData string `json:"encryptedData"` -} - -type WXMiniAuthResp struct { - AccessToken string `json:"accessToken"` - AccessExpire int64 `json:"accessExpire"` - RefreshAfter int64 `json:"refreshAfter"` -} - -type Withdrawal struct { - Status int64 `json:"status"` - Amount float64 `json:"amount"` - WithdrawalNo string `json:"withdrawal_no"` - Remark string `json:"remark"` - PayeeAccount string `json:"payee_account"` - CreateTime string `json:"create_time"` -} - -type WithdrawalReq struct { - Amount float64 `json:"amount"` // 提现金额 - PayeeAccount string `json:"payee_account"` - PayeeName string `json:"payee_name"` -} - -type WithdrawalResp struct { - Status int64 `json:"status"` // 1申请中 2成功 3失败 - FailMsg string `json:"fail_msg"` -} - -type GetAppVersionResp struct { - Version string `json:"version"` - WgtUrl string `json:"wgtUrl"` -} - -type SendSmsReq struct { - Mobile string `json:"mobile" validate:"required,mobile"` - ActionType string `json:"actionType" validate:"required,oneof=login register query agentApply realName bindMobile"` -} diff --git a/app/user/cmd/api/main.go b/app/user/cmd/api/main.go deleted file mode 100644 index 7dfaaa5..0000000 --- a/app/user/cmd/api/main.go +++ /dev/null @@ -1,64 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "os" - "tydata-server/app/user/cmd/api/internal/config" - "tydata-server/app/user/cmd/api/internal/handler" - "tydata-server/app/user/cmd/api/internal/queue" - "tydata-server/app/user/cmd/api/internal/svc" - - "github.com/zeromicro/go-zero/core/logx" - - "github.com/zeromicro/go-zero/core/conf" - "github.com/zeromicro/go-zero/rest" -) - -func main() { - // 读取环境变量 ENV,默认为 "prod" - env := os.Getenv("ENV") - if env == "" { - env = "production" - } - - // 根据 ENV 加载不同的配置文件 - var defaultConfigFile string - if env == "development" { - defaultConfigFile = "app/user/cmd/api/etc/main.dev.yaml" - } else { - defaultConfigFile = "etc/main.yaml" - } - configFile := flag.String("f", defaultConfigFile, "the config file") - flag.Parse() - - var c config.Config - conf.MustLoad(*configFile, &c) - - svcContext := svc.NewServiceContext(c) - defer svcContext.Close() - - // 启动 asynq 消费者 - go func() { - ctx := context.Background() - // 初始化 cron job 或异步任务队列 - asynq := queue.NewCronJob(ctx, svcContext) - mux := asynq.Register() - - // 启动 asynq 消费者 - if err := svcContext.AsynqServer.Run(mux); err != nil { - logx.WithContext(ctx).Errorf("异步任务启动失败: %v", err) - os.Exit(1) - } - fmt.Println("异步任务启动!!!") - }() - - server := rest.MustNewServer(c.RestConf) - defer server.Stop() - - handler.RegisterHandlers(server, svcContext) - - fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) - server.Start() -} diff --git a/deploy/script/gen_models.ps1 b/deploy/script/gen_models.ps1 index fa05662..bbcc047 100644 --- a/deploy/script/gen_models.ps1 +++ b/deploy/script/gen_models.ps1 @@ -23,16 +23,34 @@ $tables = @( # "agent_rewards", # "agent_wallet", # "agent_withdrawal", - "agent_real_name" + # "agent_real_name" # "feature", - # "global_notifications", + # "global_notifications" # "order", + # "order_refund" # "product", # "product_feature", # "query", + # "query_cleanup_log" + # "query_cleanup_detail" + "query_cleanup_config" # "user" # "user_auth" # "example" + # "admin_user" + # "admin_user_role" + # "admin_api", + # "admin_menu" + # "admin_role", + # "admin_role_api", + # "admin_role_menu", + # "admin_dict_data" + # "admin_dict_type" + # "admin_promotion_link" + # "admin_promotion_link_stats_total" + # "admin_promotion_link_stats_history" + # "admin_promotion_order" + ) # 为每个表生成模型 diff --git a/deploy/script/go.mod b/deploy/script/go.mod index c27eb0c..7fe2b78 100644 --- a/deploy/script/go.mod +++ b/deploy/script/go.mod @@ -1,3 +1,8 @@ module script go 1.23.4 + +require ( + github.com/samber/lo v1.50.0 // indirect + golang.org/x/text v0.22.0 // indirect +) diff --git a/deploy/script/go.sum b/deploy/script/go.sum new file mode 100644 index 0000000..45f8427 --- /dev/null +++ b/deploy/script/go.sum @@ -0,0 +1,4 @@ +github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY= +github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= diff --git a/deploy/sql/order.sql b/deploy/sql/order.sql index 19976ec..6428f7d 100644 --- a/deploy/sql/order.sql +++ b/deploy/sql/order.sql @@ -1,25 +1,41 @@ CREATE TABLE `order` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `order_no` varchar(32) NOT NULL COMMENT '自生成的订单号', - `user_id` bigint NOT NULL COMMENT '用户ID', - `product_id` bigint NOT NULL COMMENT '产品ID(软关联到产品表)', - `payment_platform` enum('alipay', 'wechat', 'appleiap','other') NOT NULL COMMENT '支付平台(支付宝、微信、苹果内购、其他)', - `payment_scene` enum('app', 'h5', 'mini_program', 'public_account') NOT NULL COMMENT '支付场景(App、H5、微信小程序、公众号)', - `platform_order_id` varchar(64) DEFAULT NULL COMMENT '支付平台订单号', - `amount` decimal(10, 2) NOT NULL COMMENT '支付金额', - `status` enum('pending', 'paid', 'failed', 'refunded', 'closed') NOT NULL DEFAULT 'pending' COMMENT '支付状态', - `del_state` tinyint NOT NULL DEFAULT '0' COMMENT '删除状态', - `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `pay_time` datetime DEFAULT NULL COMMENT '支付时间', - `refund_time` datetime DEFAULT NULL COMMENT '退款时间', - `close_time` datetime DEFAULT NULL COMMENT '订单关闭时间', - `delete_time` datetime DEFAULT NULL COMMENT '删除时间', - PRIMARY KEY (`id`), - UNIQUE KEY `unique_order_no` (`order_no`), - KEY `idx_user_id` (`user_id`), - KEY `idx_product_id` (`product_id`), - KEY `idx_payment_platform` (`payment_platform`), - KEY `idx_payment_scene` (`payment_scene`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='订单表'; + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `order_no` varchar(32) NOT NULL COMMENT '自生成的订单号', + `user_id` bigint NOT NULL COMMENT '用户ID', + `product_id` bigint NOT NULL COMMENT '产品ID(软关联到产品表)', + `payment_platform` enum( + 'alipay', + 'wechat', + 'appleiap', + 'other' + ) NOT NULL COMMENT '支付平台(支付宝、微信、苹果内购、其他)', + `payment_scene` enum( + 'app', + 'h5', + 'mini_program', + 'public_account' + ) NOT NULL COMMENT '支付场景(App、H5、微信小程序、公众号)', + `platform_order_id` varchar(64) DEFAULT NULL COMMENT '支付平台订单号', + `amount` decimal(10, 2) NOT NULL COMMENT '支付金额', + `status` enum( + 'pending', + 'paid', + 'failed', + 'refunded', + 'closed' + ) NOT NULL DEFAULT 'pending' COMMENT '支付状态', + `del_state` tinyint NOT NULL DEFAULT '0' COMMENT '删除状态', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `pay_time` datetime DEFAULT NULL COMMENT '支付时间', + `refund_time` datetime DEFAULT NULL COMMENT '退款时间', + `close_time` datetime DEFAULT NULL COMMENT '订单关闭时间', + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_order_no` (`order_no`), + KEY `idx_user_id` (`user_id`), + KEY `idx_product_id` (`product_id`), + KEY `idx_payment_platform` (`payment_platform`), + KEY `idx_payment_scene` (`payment_scene`) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表'; \ No newline at end of file diff --git a/deploy/sql/template.sql b/deploy/sql/template.sql new file mode 100644 index 0000000..1e732f4 --- /dev/null +++ b/deploy/sql/template.sql @@ -0,0 +1,20 @@ +CREATE TABLE `表名` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL COMMENT '删除时间', + `del_state` tinyint NOT NULL DEFAULT '0', + `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', + + /* 业务字段开始 */ + `字段1` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], + `字段2` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], + /* 关联字段 - 软关联 */ + `关联表id` bigint [NOT NULL] [DEFAULT '0'] COMMENT '关联到XX表的id', + /* 业务字段结束 */ + + PRIMARY KEY (`id`), + /* 索引定义 */ + UNIQUE KEY `索引名称` (`字段名`), + KEY `idx_关联字段` (`关联表id`) COMMENT '优化关联查询' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表说明'; \ No newline at end of file diff --git a/deploy/sql/user.sql b/deploy/sql/user.sql index b76d086..13affd4 100644 --- a/deploy/sql/user.sql +++ b/deploy/sql/user.sql @@ -2,7 +2,7 @@ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- --- Table structure for user +-- Table structure for main -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( diff --git a/docker-compose.yml b/docker-compose.yml index 8aefd43..982a03f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -70,7 +70,7 @@ services: container_name: tydata_main build: context: . - dockerfile: ./app/user/cmd/api/Dockerfile + dockerfile: app/main/cmd/api/Dockerfile ports: - "21004:8888" environment: diff --git a/gen_api.ps1 b/gen_api.ps1 index 32eca87..d571f8e 100644 --- a/gen_api.ps1 +++ b/gen_api.ps1 @@ -1,2 +1,2 @@ # API生成脚本 -goctl api go --api ./app/user/cmd/api/desc/main.api --dir ./app/user/cmd/api --home ./deploy/template \ No newline at end of file +goctl api go --api ./app/main/api/desc/main.api --dir ./app/main/api --home ./deploy/template \ No newline at end of file diff --git a/go.mod b/go.mod index 5ff63f0..daeffe6 100644 --- a/go.mod +++ b/go.mod @@ -12,17 +12,20 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 github.com/go-playground/validator/v10 v10.22.1 github.com/golang-jwt/jwt/v4 v4.5.0 + github.com/google/uuid v1.6.0 github.com/hibiken/asynq v0.25.0 github.com/jinzhu/copier v0.4.0 github.com/pkg/errors v0.9.1 + github.com/redis/go-redis/v9 v9.7.0 + github.com/samber/lo v1.50.0 github.com/shopspring/decimal v1.4.0 github.com/smartwalle/alipay/v3 v3.2.23 github.com/sony/sonyflake v1.2.0 github.com/tidwall/gjson v1.18.0 github.com/wechatpay-apiv3/wechatpay-go v0.2.20 github.com/zeromicro/go-zero v1.7.3 + golang.org/x/crypto v0.28.0 google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 ) require ( @@ -39,37 +42,21 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clbanning/mxj/v2 v2.5.5 // indirect github.com/cloudwego/base64x v0.1.5 // indirect - github.com/coreos/go-semver v0.3.1 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/fatih/color v1.17.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/leodido/go-urn v1.4.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -81,7 +68,6 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/redis/go-redis/v9 v9.7.0 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/smartwalle/ncrypto v1.0.4 // indirect github.com/smartwalle/ngx v1.0.9 // indirect @@ -92,9 +78,6 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - go.etcd.io/etcd/api/v3 v3.5.15 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect - go.etcd.io/etcd/client/v3 v3.5.15 // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect @@ -106,31 +89,15 @@ require ( go.opentelemetry.io/otel/sdk v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect - go.uber.org/atomic v1.10.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect - go.uber.org/multierr v1.9.0 // indirect - go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.28.0 // indirect golang.org/x/net v0.30.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.7.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.29.3 // indirect - k8s.io/apimachinery v0.29.4 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.110.1 // indirect - k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 6138436..431747f 100644 --- a/go.sum +++ b/go.sum @@ -66,8 +66,6 @@ github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTs github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmPrib8NVePL3fxM= github.com/aliyun/credentials-go v1.3.10 h1:45Xxrae/evfzQL9V10zL3xX31eqgLWEaIdCoPipOEQA= github.com/aliyun/credentials-go v1.3.10/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= @@ -91,18 +89,11 @@ github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCy github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -113,18 +104,10 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -135,17 +118,10 @@ github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27 github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= @@ -155,22 +131,13 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -183,20 +150,15 @@ github.com/hibiken/asynq v0.25.0 h1:VCPyRRrrjFChsTSI8x5OCPu51MlEz6Rk+1p0kHKnZug= github.com/hibiken/asynq v0.25.0/go.mod h1:DYQ1etBEl2Y+uSkqFElGYbk3M0ujLVwCfWE+TlvxtEk= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -211,8 +173,6 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhR github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -230,10 +190,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= @@ -261,6 +217,8 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY= +github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/smartwalle/alipay/v3 v3.2.23 h1:i1VwJeu70EmwpsXXz6GZZnMAtRx5MTfn2dPoql/L3zE= @@ -280,8 +238,6 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -296,8 +252,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -314,19 +271,11 @@ github.com/wechatpay-apiv3/wechatpay-go v0.2.20 h1:gS8oFn1bHGnyapR2Zb4aqTV6l4kJW github.com/wechatpay-apiv3/wechatpay-go v0.2.20/go.mod h1:A254AUBVB6R+EqQFo3yTgeh7HtyqRRtN2w9hQSOrd4Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/zeromicro/go-zero v1.7.3 h1:yDUQF2DXDhUHc77/NZF6mzsoRPMBfldjPmG2O/ZSzss= github.com/zeromicro/go-zero v1.7.3/go.mod h1:9JIW3gHBGuc9LzvjZnNwINIq9QdiKu3AigajLtkJamQ= -go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk= -go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM= -go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA= -go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU= -go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4= -go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= @@ -349,16 +298,10 @@ go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -379,8 +322,6 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -392,9 +333,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -406,15 +345,11 @@ golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -424,8 +359,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -447,8 +380,6 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -457,8 +388,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -469,17 +400,11 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -510,8 +435,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -524,22 +447,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q= -k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= -k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/lzkit/crypto/README.md b/pkg/lzkit/crypto/README.md index bd8d77e..7dc1f9d 100644 --- a/pkg/lzkit/crypto/README.md +++ b/pkg/lzkit/crypto/README.md @@ -172,7 +172,7 @@ func hexEncodingExample() { ```yaml # etc/main.yaml -Name: user-api +Name: main-api Host: 0.0.0.0 Port: 8888 diff --git a/pkg/lzkit/crypto/bcrypt.go b/pkg/lzkit/crypto/bcrypt.go new file mode 100644 index 0000000..7ed4512 --- /dev/null +++ b/pkg/lzkit/crypto/bcrypt.go @@ -0,0 +1,28 @@ +package crypto + +import ( + "golang.org/x/crypto/bcrypt" +) + +// PasswordHash 使用bcrypt对密码进行加密 +// cost参数确定加密的复杂度,默认为10,越高越安全但性能消耗越大 +func PasswordHash(password string, cost ...int) (string, error) { + defaultCost := 10 + if len(cost) > 0 && cost[0] > 0 { + defaultCost = cost[0] + } + + bytes, err := bcrypt.GenerateFromPassword([]byte(password), defaultCost) + if err != nil { + return "", err + } + + return string(bytes), nil +} + +// PasswordVerify 验证密码是否匹配 +// password是用户输入的明文密码,hash是存储的加密密码 +func PasswordVerify(password, hash string) bool { + err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) + return err == nil +} diff --git a/pkg/lzkit/crypto/ecb_test.go b/pkg/lzkit/crypto/ecb_test.go index a497495..9549cb0 100644 --- a/pkg/lzkit/crypto/ecb_test.go +++ b/pkg/lzkit/crypto/ecb_test.go @@ -9,8 +9,8 @@ import ( func TestAesEcbMobileEncryption(t *testing.T) { // 测试手机号加密 - mobile := "13800138000" - key := []byte("1234567890abcdef") // 16字节AES-128密钥 + mobile := "13280082033 " + key := []byte("ff83609b2b24fc73196aac3d3dfb874f") // 16字节AES-128密钥 keyStr := hex.EncodeToString(key) // 测试加密 @@ -18,13 +18,14 @@ func TestAesEcbMobileEncryption(t *testing.T) { if err != nil { t.Fatalf("手机号加密失败: %v", err) } - fmt.Println(encrypted) + fmt.Printf("encrypted: %s\n", encrypted) + jmStr := "oEpLcrIpDPN63rOlESXTDg==" // 测试解密 - decrypted, err := DecryptMobile(encrypted, keyStr) + decrypted, err := DecryptMobile(jmStr, keyStr) if err != nil { t.Fatalf("手机号解密失败: %v", err) } - fmt.Println(decrypted) + fmt.Printf("decrypted: %s\n", decrypted) // 验证结果 if decrypted != mobile { t.Errorf("解密结果不匹配,期望: %s, 实际: %s", mobile, decrypted) diff --git a/pkg/lzkit/md5/README.md b/pkg/lzkit/md5/README.md index 5398ec1..5e92541 100644 --- a/pkg/lzkit/md5/README.md +++ b/pkg/lzkit/md5/README.md @@ -59,13 +59,13 @@ hash = md5.FromBytes([]byte("hello")). ```go // 使用盐值加密(提高安全性) -hashedPassword := md5.EncryptStringWithSalt("password123", "user@example.com") +hashedPassword := md5.EncryptStringWithSalt("password123", "main@example.com") // 使用前缀加密 hashedValue := md5.EncryptStringWithPrefix("secret-data", "prefix-") // 验证带盐值的哈希 -isValid := md5.VerifyMD5WithSalt("password123", "user@example.com", hashedPassword) +isValid := md5.VerifyMD5WithSalt("password123", "main@example.com", hashedPassword) // 使用HMAC-MD5提高安全性 hmacHash := md5.MD5HMAC("message", "secret-key") diff --git a/pkg/lzkit/md5/example_test.go b/pkg/lzkit/md5/example_test.go index 26a5e96..e6a2a3e 100644 --- a/pkg/lzkit/md5/example_test.go +++ b/pkg/lzkit/md5/example_test.go @@ -20,7 +20,7 @@ func Example() { fmt.Println("链式MD5:", chainHash) // 使用盐值 - saltedHash := md5.EncryptStringWithSalt("password123", "user@example.com") + saltedHash := md5.EncryptStringWithSalt("password123", "main@example.com") fmt.Println("加盐MD5:", saltedHash) // 验证哈希 @@ -63,9 +63,9 @@ func ExampleMD5_Sum() { func ExampleEncryptStringWithSalt() { // 为用户密码加盐,通常使用用户唯一标识(如邮箱)作为盐值 - hash := md5.EncryptStringWithSalt("password123", "user@example.com") + hash := md5.EncryptStringWithSalt("password123", "main@example.com") fmt.Println("盐值哈希长度:", len(hash)) - fmt.Println("是否为有效哈希:", md5.VerifyMD5WithSalt("password123", "user@example.com", hash)) + fmt.Println("是否为有效哈希:", md5.VerifyMD5WithSalt("password123", "main@example.com", hash)) // Output: // 盐值哈希长度: 32 // 是否为有效哈希: true