From c23ab8338b8feb8c53d6c4fb292a8d4cb2d81333 Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Tue, 9 Dec 2025 18:55:28 +0800 Subject: [PATCH] v1.1 --- .gitignore | 2 + app/main/api/desc/admin/admin_agent.api | 193 ++++++++------- app/main/api/desc/admin/admin_api.api | 12 +- app/main/api/desc/admin/admin_feature.api | 70 +++--- app/main/api/desc/admin/admin_product.api | 88 +++---- app/main/api/desc/admin/admin_query.api | 42 ++-- app/main/api/desc/admin/admin_role_api.api | 20 +- app/main/api/desc/admin/admin_user.api | 88 +++---- app/main/api/desc/admin/menu.api | 109 ++++---- app/main/api/desc/admin/notification.api | 38 +-- app/main/api/desc/admin/order.api | 34 +-- app/main/api/desc/admin/platform_user.api | 75 +++--- app/main/api/desc/admin/role.api | 52 ++-- app/main/api/desc/front/agent.api | 138 +++++++---- app/main/api/desc/front/authorization.api | 59 ++--- app/main/api/desc/front/pay.api | 14 +- app/main/api/desc/front/product.api | 10 +- app/main/api/desc/front/query.api | 20 +- app/main/api/desc/front/user.api | 23 +- app/main/api/etc/main.dev.yaml | 1 + .../agent/getpromotionquerylisthandler.go | 31 +++ .../handler/app/getappconfighandler.go | 17 ++ app/main/api/internal/handler/routes.go | 22 +- .../api/internal/handler/user/authhandler.go | 25 ++ .../admingeneratediamondinvitecodelogic.go | 40 +-- .../admingetagentcommissionlistlogic.go | 6 +- .../admin_agent/admingetagentconfiglogic.go | 9 +- .../admin_agent/admingetagentlinklistlogic.go | 20 +- .../admin_agent/admingetagentlistlogic.go | 37 +-- .../admingetagentorderlistlogic.go | 6 +- .../admingetagentrebatelistlogic.go | 16 +- .../admingetinvitecodelistlogic.go | 24 +- .../adminupdateagentconfiglogic.go | 75 +++++- .../adminbatchupdateapistatuslogic.go | 4 +- .../logic/admin_api/admincreateapilogic.go | 7 +- .../logic/admin_api/admindeleteapilogic.go | 4 +- .../logic/admin_api/admingetapidetaillogic.go | 4 +- .../logic/admin_api/adminupdateapilogic.go | 4 +- .../logic/admin_auth/adminloginlogic.go | 4 +- .../adminconfigfeatureexamplelogic.go | 30 +-- .../admin_feature/admincreatefeaturelogic.go | 6 +- .../admingetfeatureexamplelogic.go | 2 +- .../admin_feature/adminupdatefeaturelogic.go | 4 +- .../logic/admin_menu/createmenulogic.go | 52 ++-- .../logic/admin_menu/deletemenulogic.go | 6 +- .../logic/admin_menu/getmenualllogic.go | 51 ++-- .../logic/admin_menu/getmenulistlogic.go | 12 +- .../logic/admin_menu/updatemenulogic.go | 10 +- .../admincreatenotificationlogic.go | 6 +- .../admin_order/admincreateorderlogic.go | 13 +- .../admin_order/admingetorderlistlogic.go | 20 +- .../admin_order/adminrefundorderlogic.go | 71 +++--- .../admincreateplatformuserlogic.go | 33 ++- .../admin_product/admincreateproductlogic.go | 18 +- .../admingetproductfeaturelistlogic.go | 10 +- .../adminupdateproductfeatureslogic.go | 50 ++-- .../admingetquerycleanupdetaillistlogic.go | 10 +- .../admingetquerydetailbyorderidlogic.go | 2 +- .../logic/admin_role/createrolelogic.go | 54 ++-- .../logic/admin_role/getroledetaillogic.go | 4 +- .../logic/admin_role/getrolelistlogic.go | 6 +- .../logic/admin_role/updaterolelogic.go | 46 ++-- .../admin_role_api/adminassignroleapilogic.go | 34 +-- .../admin_role_api/admingetallapilistlogic.go | 6 +- .../admingetroleapilistlogic.go | 8 +- .../admin_role_api/adminremoveroleapilogic.go | 8 +- .../admin_role_api/adminupdateroleapilogic.go | 38 +-- .../logic/admin_user/admincreateuserlogic.go | 14 +- .../admin_user/admingetuserdetaillogic.go | 4 +- .../logic/admin_user/admingetuserlistlogic.go | 6 +- .../logic/admin_user/adminupdateuserlogic.go | 46 ++-- .../logic/admin_user/adminuserinfologic.go | 2 +- .../logic/agent/applyforagentlogic.go | 208 ++++++++++------ .../internal/logic/agent/applyupgradelogic.go | 15 +- .../logic/agent/applywithdrawallogic.go | 10 +- .../logic/agent/deleteinvitecodelogic.go | 2 +- .../logic/agent/generateinvitecodelogic.go | 4 +- .../logic/agent/generatinglinklogic.go | 75 ++++-- .../internal/logic/agent/getagentinfologic.go | 37 +-- .../logic/agent/getagentproductconfiglogic.go | 30 ++- .../logic/agent/getcommissionlistlogic.go | 4 +- .../logic/agent/getconversionratelogic.go | 38 +-- .../logic/agent/getinvitelinklogic.go | 80 ++++-- .../logic/agent/getlevelprivilegelogic.go | 10 +- .../internal/logic/agent/getlinkdatalogic.go | 24 +- .../logic/agent/getpromotionquerylistlogic.go | 88 +++++++ .../logic/agent/getrebatelistlogic.go | 4 +- .../getsubordinatecontributiondetaillogic.go | 18 +- .../internal/logic/agent/getteamlistlogic.go | 20 +- .../logic/agent/getteamstatisticslogic.go | 46 ++-- .../logic/agent/getupgraderebatelistlogic.go | 2 +- .../logic/agent/registerbyinvitecodelogic.go | 193 +++++++++------ .../logic/agent/shortlinkredirectlogic.go | 8 +- .../logic/agent/upgradesubordinatelogic.go | 10 +- .../internal/logic/app/getappconfiglogic.go | 42 ++++ .../downloadauthorizationdocumentlogic.go | 4 +- .../getauthorizationdocumentbyorderlogic.go | 2 +- .../internal/logic/pay/alipaycallbacklogic.go | 2 +- .../internal/logic/pay/iapcallbacklogic.go | 5 +- .../api/internal/logic/pay/paymentlogic.go | 68 +++-- .../logic/pay/wechatpaycallbacklogic.go | 2 +- .../logic/pay/wechatpayrefundcallbacklogic.go | 4 +- .../logic/product/getproductappbyenlogic.go | 4 +- .../logic/product/getproductbyenlogic.go | 15 +- .../api/internal/logic/query/query_common.go | 157 ++++++++++++ .../logic/query/querydetailbyorderidlogic.go | 204 +++------------ .../logic/query/querydetailbyordernologic.go | 118 +-------- .../logic/query/queryexamplelogic copy.go | 152 ------------ .../query/querygeneratesharelinklogic.go | 4 +- .../logic/query/queryserviceagentlogic.go | 16 +- .../internal/logic/query/queryservicelogic.go | 134 +++++----- .../logic/query/querysharedetaillogic.go | 2 +- app/main/api/internal/logic/user/authlogic.go | 144 +++++++++++ .../internal/logic/user/bindmobilelogic.go | 234 ++++++++++++++---- .../logic/user/mobilecodeloginlogic.go | 12 +- .../api/internal/logic/user/wxh5authlogic.go | 79 +++--- .../internal/logic/user/wxminiauthlogic.go | 79 +++--- .../adminauthinterceptormiddleware.go | 78 +++--- app/main/api/internal/queue/agentProcess.go | 42 ++-- app/main/api/internal/queue/cleanQueryData.go | 25 +- .../api/internal/queue/paySuccessNotify.go | 33 ++- .../api/internal/queue/unfreezeCommission.go | 58 ++--- app/main/api/internal/service/agentService.go | 107 ++++---- .../internal/service/apiRegistryService.go | 126 +++++----- .../api/internal/service/apirequestService.go | 20 +- app/main/api/internal/service/asynqService.go | 34 +-- .../internal/service/authorizationService.go | 15 +- app/main/api/internal/service/userService.go | 218 ++++++---------- .../internal/service/verificationService.go | 65 ++++- app/main/api/internal/svc/servicecontext.go | 5 +- app/main/api/internal/types/adminagent.go | 100 ++++---- app/main/api/internal/types/adminapi.go | 12 +- app/main/api/internal/types/adminfeature.go | 18 +- app/main/api/internal/types/adminmenu.go | 20 +- .../api/internal/types/adminnotification.go | 10 +- app/main/api/internal/types/adminorder.go | 14 +- .../api/internal/types/adminplatformuser.go | 10 +- app/main/api/internal/types/adminproduct.go | 20 +- app/main/api/internal/types/adminquery.go | 16 +- app/main/api/internal/types/adminrole.go | 50 ++-- app/main/api/internal/types/adminroleapi.go | 14 +- app/main/api/internal/types/adminuser.go | 40 +-- app/main/api/internal/types/agent.go | 77 +++--- app/main/api/internal/types/app.go | 4 + app/main/api/internal/types/authorization.go | 14 +- app/main/api/internal/types/encrypPayload.go | 4 +- app/main/api/internal/types/pay.go | 2 +- app/main/api/internal/types/payload.go | 8 +- app/main/api/internal/types/product.go | 2 +- app/main/api/internal/types/query.go | 10 +- app/main/api/internal/types/queryMap.go | 4 +- app/main/api/internal/types/types.go | 196 ++++++++------- app/main/api/internal/types/user.go | 14 ++ app/main/model/adminApiModel_gen.go | 78 +++--- app/main/model/adminDictDataModel_gen.go | 92 ++++--- app/main/model/adminDictTypeModel_gen.go | 78 +++--- app/main/model/adminMenuModel_gen.go | 80 +++--- app/main/model/adminRoleApiModel_gen.go | 86 ++++--- app/main/model/adminRoleMenuModel_gen.go | 86 ++++--- app/main/model/adminRoleModel_gen.go | 78 +++--- app/main/model/adminUserModel_gen.go | 92 ++++--- app/main/model/adminUserRoleModel_gen.go | 86 ++++--- app/main/model/agentCommissionModel_gen.go | 43 +++- app/main/model/agentConfigModel_gen.go | 37 ++- app/main/model/agentFreezeTaskModel_gen.go | 43 +++- app/main/model/agentInviteCodeModel_gen.go | 65 +++-- .../model/agentInviteCodeUsageModel_gen.go | 59 +++-- app/main/model/agentLinkModel_gen.go | 47 ++-- app/main/model/agentModel_gen.go | 114 ++++++--- app/main/model/agentOrderModel_gen.go | 47 ++-- app/main/model/agentProductConfigModel_gen.go | 46 +++- app/main/model/agentRealNameModel_gen.go | 43 +++- app/main/model/agentRebateModel_gen.go | 63 +++-- app/main/model/agentRelationModel_gen.go | 45 +++- app/main/model/agentShortLinkModel.go | 19 ++ app/main/model/agentShortLinkModel_gen.go | 51 ++-- app/main/model/agentUpgradeModel_gen.go | 69 ++++-- app/main/model/agentWalletModel_gen.go | 43 +++- app/main/model/agentWithdrawalModel_gen.go | 39 ++- app/main/model/agentWithdrawalTaxModel_gen.go | 41 ++- app/main/model/authorizationDocumentModel.go | 8 +- .../model/authorizationDocumentModel_gen.go | 70 ++++-- app/main/model/exampleModel_gen.go | 122 +++++---- app/main/model/featureModel_gen.go | 78 +++--- .../model/globalNotificationsModel_gen.go | 64 +++-- app/main/model/orderModel.go | 28 +++ app/main/model/orderModel_gen.go | 84 ++++--- app/main/model/orderRefundModel_gen.go | 48 ++-- app/main/model/productFeatureModel_gen.go | 143 +++++------ app/main/model/productModel_gen.go | 78 +++--- app/main/model/queryCleanupConfigModel_gen.go | 78 +++--- app/main/model/queryCleanupDetailModel_gen.go | 84 ++++--- app/main/model/queryCleanupLogModel_gen.go | 64 +++-- app/main/model/queryModel.go | 55 ++-- app/main/model/queryModel_gen.go | 88 ++++--- app/main/model/userAuthModel_gen.go | 98 +++++--- app/main/model/userModel_gen.go | 78 +++--- common/ctxdata/ctxData.go | 46 ++-- common/jwt/jwtx.go | 8 +- common/jwt/jwtx_test.go | 28 +-- db/migrations/uuid_fk_char36.sql | 93 +++++++ deploy/script/gen_models.ps1 | 97 ++++---- deploy/script/model/vars.go | 9 - deploy/sql/user_system_refactor.sql | 6 +- deploy/sql/user_temp_migration.sql | 45 ++++ deploy/template/model/import-no-cache.tpl | 26 +- deploy/template/model/import.tpl | 28 ++- deploy/template/model/insert.tpl | 45 ++-- deploy/template/model/types.tpl | 20 +- 209 files changed, 5445 insertions(+), 3963 deletions(-) create mode 100644 app/main/api/internal/handler/agent/getpromotionquerylisthandler.go create mode 100644 app/main/api/internal/handler/app/getappconfighandler.go create mode 100644 app/main/api/internal/handler/user/authhandler.go create mode 100644 app/main/api/internal/logic/agent/getpromotionquerylistlogic.go create mode 100644 app/main/api/internal/logic/app/getappconfiglogic.go create mode 100644 app/main/api/internal/logic/query/query_common.go delete mode 100644 app/main/api/internal/logic/query/queryexamplelogic copy.go create mode 100644 app/main/api/internal/logic/user/authlogic.go create mode 100644 db/migrations/uuid_fk_char36.sql delete mode 100644 deploy/script/model/vars.go create mode 100644 deploy/sql/user_temp_migration.sql diff --git a/.gitignore b/.gitignore index e145787..5ac55ea 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ data/* /tmp/ /app/api + +deploy/script/js diff --git a/app/main/api/desc/admin/admin_agent.api b/app/main/api/desc/admin/admin_agent.api index e58f7f7..90bb543 100644 --- a/app/main/api/desc/admin/admin_agent.api +++ b/app/main/api/desc/admin/admin_agent.api @@ -59,7 +59,6 @@ service main { // 代理实名认证审核(已废弃:实名认证改为三要素核验,无需审核) // @handler AdminAuditRealName // post /real_name/audit (AdminAuditRealNameReq) returns (AdminAuditRealNameResp) - // 系统配置查询 @handler AdminGetAgentConfig get /config returns (AdminGetAgentConfigResp) @@ -93,17 +92,18 @@ type ( Mobile *string `form:"mobile,optional"` // 手机号(可选) Region *string `form:"region,optional"` // 区域(可选) Level *int64 `form:"level,optional"` // 等级(可选) - TeamLeaderId *int64 `form:"team_leader_id,optional"` // 团队首领ID(可选) + TeamLeaderId *string `form:"team_leader_id,optional"` // 团队首领ID(可选) } AgentListItem { - Id int64 `json:"id"` // 主键 - UserId int64 `json:"user_id"` // 用户ID + Id string `json:"id"` // 主键 + UserId string `json:"user_id"` // 用户ID Level int64 `json:"level"` // 等级:1=普通,2=黄金,3=钻石 LevelName string `json:"level_name"` // 等级名称 Region string `json:"region"` // 区域 Mobile string `json:"mobile"` // 手机号 WechatId string `json:"wechat_id"` // 微信号 - TeamLeaderId int64 `json:"team_leader_id"` // 团队首领ID + TeamLeaderId string `json:"team_leader_id"` // 团队首领ID + AgentCode int64 `json:"agent_code"` Balance float64 `json:"balance"` // 钱包余额 TotalEarnings float64 `json:"total_earnings"` // 累计收益 FrozenBalance float64 `json:"frozen_balance"` // 冻结余额 @@ -128,14 +128,14 @@ type ( AdminGetAgentLinkListReq { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - ProductId *int64 `form:"product_id,optional"` // 产品ID(可选) + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + ProductId *string `form:"product_id,optional"` // 产品ID(可选) LinkIdentifier *string `form:"link_identifier,optional"` // 推广码(可选) } AgentLinkListItem { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - ProductId int64 `json:"product_id"` // 产品ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 SetPrice float64 `json:"set_price"` // 设定价格 ActualBasePrice float64 `json:"actual_base_price"` // 实际底价 @@ -148,17 +148,17 @@ type ( } // 代理订单分页查询 AdminGetAgentOrderListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - OrderId *int64 `form:"order_id,optional"` // 订单ID(可选) - ProcessStatus *int64 `form:"process_status,optional"` // 处理状态(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + OrderId *string `form:"order_id,optional"` // 订单ID(可选) + ProcessStatus *int64 `form:"process_status,optional"` // 处理状态(可选) } AgentOrderListItem { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - OrderId int64 `json:"order_id"` // 订单ID - ProductId int64 `json:"product_id"` // 产品ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + OrderId string `json:"order_id"` // 订单ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 OrderAmount float64 `json:"order_amount"` // 订单金额 SetPrice float64 `json:"set_price"` // 设定价格 @@ -174,16 +174,16 @@ type ( } // 代理佣金分页查询 AdminGetAgentCommissionListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - OrderId *int64 `form:"order_id,optional"` // 订单ID(可选) - Status *int64 `form:"status,optional"` // 状态(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + OrderId *string `form:"order_id,optional"` // 订单ID(可选) + Status *int64 `form:"status,optional"` // 状态(可选) } AgentCommissionListItem { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - OrderId int64 `json:"order_id"` // 订单ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + OrderId string `json:"order_id"` // 订单ID ProductName string `json:"product_name"` // 产品名称 Amount float64 `json:"amount"` // 金额 Status int64 `json:"status"` // 状态 @@ -195,17 +195,17 @@ type ( } // 代理返佣分页查询 AdminGetAgentRebateListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - SourceAgentId *int64 `form:"source_agent_id,optional"` // 来源代理ID(可选) - RebateType *int64 `form:"rebate_type,optional"` // 返佣类型(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + SourceAgentId *string `form:"source_agent_id,optional"` // 来源代理ID(可选) + RebateType *int64 `form:"rebate_type,optional"` // 返佣类型(可选) } AgentRebateListItem { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 获得返佣的代理ID - SourceAgentId int64 `json:"source_agent_id"` // 来源代理ID - OrderId int64 `json:"order_id"` // 订单ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 获得返佣的代理ID + SourceAgentId string `json:"source_agent_id"` // 来源代理ID + OrderId string `json:"order_id"` // 订单ID RebateType int64 `json:"rebate_type"` // 返佣类型 Amount float64 `json:"amount"` // 金额 CreateTime string `json:"create_time"` // 创建时间 @@ -216,15 +216,15 @@ type ( } // 代理升级记录分页查询 AdminGetAgentUpgradeListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - UpgradeType *int64 `form:"upgrade_type,optional"` // 升级类型(可选) - Status *int64 `form:"status,optional"` // 状态(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + UpgradeType *int64 `form:"upgrade_type,optional"` // 升级类型(可选) + Status *int64 `form:"status,optional"` // 状态(可选) } AgentUpgradeListItem { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID FromLevel int64 `json:"from_level"` // 原等级 ToLevel int64 `json:"to_level"` // 目标等级 UpgradeType int64 `json:"upgrade_type"` // 升级类型 @@ -241,13 +241,13 @@ type ( AdminGetAgentWithdrawalListReq { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + AgentId *string `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 + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID WithdrawNo string `json:"withdraw_no"` // 提现单号 Amount float64 `json:"amount"` // 金额 TaxAmount float64 `json:"tax_amount"` // 税费金额 @@ -264,7 +264,7 @@ type ( } // 代理提现审核 AdminAuditWithdrawalReq { - WithdrawalId int64 `json:"withdrawal_id"` // 提现记录ID + WithdrawalId string `json:"withdrawal_id"` // 提现记录ID Status int64 `json:"status"` // 审核状态:2=通过,3=拒绝 Remark string `json:"remark"` // 备注 } @@ -273,20 +273,20 @@ type ( } // 代理实名认证分页查询 AdminGetAgentRealNameListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - Status *int64 `form:"status,optional"` // 状态(可选):1=未验证,2=已通过 + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + Status *int64 `form:"status,optional"` // 状态(可选):1=未验证,2=已通过 } AgentRealNameListItem { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - Name string `json:"name"` // 姓名 - IdCard string `json:"id_card"` // 身份证号 - Mobile string `json:"mobile"` // 手机号 - Status int64 `json:"status"` // 状态:1=未验证,2=已通过(verify_time不为空表示已通过) - VerifyTime string `json:"verify_time"` // 验证时间(三要素核验通过时间) - CreateTime string `json:"create_time"` // 创建时间 + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + Name string `json:"name"` // 姓名 + IdCard string `json:"id_card"` // 身份证号 + Mobile string `json:"mobile"` // 手机号 + Status int64 `json:"status"` // 状态:1=未验证,2=已通过(verify_time不为空表示已通过) + VerifyTime string `json:"verify_time"` // 验证时间(三要素核验通过时间) + CreateTime string `json:"create_time"` // 创建时间 } AdminGetAgentRealNameListResp { Total int64 `json:"total"` // 总数 @@ -303,14 +303,16 @@ type ( } // 系统配置查询(价格配置已移除,改为产品配置表管理) AdminGetAgentConfigResp { - LevelBonus LevelBonusConfig `json:"level_bonus"` // 等级加成配置 - UpgradeFee UpgradeFeeConfig `json:"upgrade_fee"` // 升级费用配置 - UpgradeRebate UpgradeRebateConfig `json:"upgrade_rebate"` // 升级返佣配置 - DirectParentRebate DirectParentRebateConfig `json:"direct_parent_rebate"` // 直接上级返佣配置 - MaxGoldRebateAmount float64 `json:"max_gold_rebate_amount"` // 黄金代理最大返佣金额 - CommissionFreeze CommissionFreezeConfig `json:"commission_freeze"` // 佣金冻结配置 - TaxRate float64 `json:"tax_rate"` // 税率 - TaxExemptionAmount float64 `json:"tax_exemption_amount"` // 免税额度 + LevelBonus LevelBonusConfig `json:"level_bonus"` // 等级加成配置 + UpgradeFee UpgradeFeeConfig `json:"upgrade_fee"` // 升级费用配置 + UpgradeRebate UpgradeRebateConfig `json:"upgrade_rebate"` // 升级返佣配置 + DirectParentRebate DirectParentRebateConfig `json:"direct_parent_rebate"` // 直接上级返佣配置 + MaxGoldRebateAmount float64 `json:"max_gold_rebate_amount"` // 黄金代理最大返佣金额 + CommissionFreeze CommissionFreezeConfig `json:"commission_freeze"` // 佣金冻结配置 + TaxRate float64 `json:"tax_rate"` // 税率 + TaxExemptionAmount float64 `json:"tax_exemption_amount"` // 免税额度 + GoldMaxUpliftAmount float64 `json:"gold_max_uplift_amount"` + DiamondMaxUpliftAmount float64 `json:"diamond_max_uplift_amount"` } LevelBonusConfig { Diamond int64 `json:"diamond"` // 钻石加成:0 @@ -320,7 +322,6 @@ type ( UpgradeFeeConfig { NormalToGold float64 `json:"normal_to_gold"` // 普通→黄金:199 NormalToDiamond float64 `json:"normal_to_diamond"` // 普通→钻石:980 - GoldToDiamond float64 `json:"gold_to_diamond"` // 黄金→钻石:980 } UpgradeRebateConfig { NormalToGoldRebate float64 `json:"normal_to_gold_rebate"` // 普通→黄金返佣:139 @@ -332,34 +333,36 @@ type ( Normal float64 `json:"normal"` // 直接上级是普通的返佣金额(2元) } CommissionFreezeConfig { - Ratio float64 `json:"ratio"` // 佣金冻结比例(例如:0.1表示10%) - Threshold float64 `json:"threshold"` // 佣金冻结阈值(订单单价达到此金额才触发冻结,单位:元) - Days int64 `json:"days"` // 佣金冻结解冻天数(单位:天,例如:30表示30天后解冻) + Ratio float64 `json:"ratio"` // 佣金冻结比例(例如:0.1表示10%) + Threshold float64 `json:"threshold"` // 佣金冻结阈值(订单单价达到此金额才触发冻结,单位:元) + Days int64 `json:"days"` // 佣金冻结解冻天数(单位:天,例如:30表示30天后解冻) } // 系统配置更新(价格配置已移除,改为产品配置表管理) AdminUpdateAgentConfigReq { - LevelBonus *LevelBonusConfig `json:"level_bonus,optional"` // 等级加成配置 - UpgradeFee *UpgradeFeeConfig `json:"upgrade_fee,optional"` // 升级费用配置 - UpgradeRebate *UpgradeRebateConfig `json:"upgrade_rebate,optional"` // 升级返佣配置 - DirectParentRebate *DirectParentRebateConfig `json:"direct_parent_rebate,optional"` // 直接上级返佣配置 - MaxGoldRebateAmount *float64 `json:"max_gold_rebate_amount,optional"` // 黄金代理最大返佣金额 - CommissionFreeze *CommissionFreezeConfig `json:"commission_freeze,optional"` // 佣金冻结配置 - TaxRate *float64 `json:"tax_rate,optional"` // 税率 - TaxExemptionAmount *float64 `json:"tax_exemption_amount,optional"` // 免税额度 + LevelBonus *LevelBonusConfig `json:"level_bonus,optional"` // 等级加成配置 + UpgradeFee *UpgradeFeeConfig `json:"upgrade_fee,optional"` // 升级费用配置 + UpgradeRebate *UpgradeRebateConfig `json:"upgrade_rebate,optional"` // 升级返佣配置 + DirectParentRebate *DirectParentRebateConfig `json:"direct_parent_rebate,optional"` // 直接上级返佣配置 + MaxGoldRebateAmount *float64 `json:"max_gold_rebate_amount,optional"` // 黄金代理最大返佣金额 + CommissionFreeze *CommissionFreezeConfig `json:"commission_freeze,optional"` // 佣金冻结配置 + TaxRate *float64 `json:"tax_rate,optional"` // 税率 + TaxExemptionAmount *float64 `json:"tax_exemption_amount,optional"` // 免税额度 + GoldMaxUpliftAmount *float64 `json:"gold_max_uplift_amount,optional"` + DiamondMaxUpliftAmount *float64 `json:"diamond_max_uplift_amount,optional"` } AdminUpdateAgentConfigResp { Success bool `json:"success"` } // 产品配置分页查询 AdminGetAgentProductConfigListReq { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - ProductId *int64 `form:"product_id,optional"` // 产品ID(可选) - ProductName *string `form:"product_name,optional"` // 产品名称(可选,用于搜索) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + ProductId *string `form:"product_id,optional"` // 产品ID(可选) + ProductName *string `form:"product_name,optional"` // 产品名称(可选,用于搜索) } AgentProductConfigItem { - Id int64 `json:"id"` // 主键 - ProductId int64 `json:"product_id"` // 产品ID + Id string `json:"id"` // 主键 + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 BasePrice float64 `json:"base_price"` // 基础底价 PriceRangeMin float64 `json:"price_range_min"` // 最低定价 @@ -374,11 +377,11 @@ type ( } // 产品配置更新 AdminUpdateAgentProductConfigReq { - Id int64 `json:"id"` // 主键 - BasePrice float64 `json:"base_price"` // 基础底价 - PriceRangeMax float64 `json:"price_range_max"` // 最高定价(对应数据库 system_max_price) - PriceThreshold *float64 `json:"price_threshold,optional"` // 提价标准阈值(可选) - PriceFeeRate *float64 `json:"price_fee_rate,optional"` // 提价手续费比例(可选) + Id string `json:"id"` // 主键 + BasePrice float64 `json:"base_price"` // 基础底价 + PriceRangeMax float64 `json:"price_range_max"` // 最高定价(对应数据库 system_max_price) + PriceThreshold *float64 `json:"price_threshold,optional"` // 提价标准阈值(可选) + PriceFeeRate *float64 `json:"price_fee_rate,optional"` // 提价手续费比例(可选) } AdminUpdateAgentProductConfigResp { Success bool `json:"success"` @@ -397,19 +400,19 @@ type ( Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 Code *string `form:"code,optional"` // 邀请码(可选) - AgentId *int64 `form:"agent_id,optional"` // 发放代理ID(可选,NULL表示平台发放) + AgentId *string `form:"agent_id,optional"` // 发放代理ID(可选,NULL表示平台发放) TargetLevel *int64 `form:"target_level,optional"` // 目标等级(可选) Status *int64 `form:"status,optional"` // 状态(可选) } InviteCodeListItem { - Id int64 `json:"id"` // 主键 + Id string `json:"id"` // 主键 Code string `json:"code"` // 邀请码 - AgentId int64 `json:"agent_id"` // 发放代理ID(0表示平台发放) + AgentId string `json:"agent_id"` // 发放代理ID(0表示平台发放) AgentMobile string `json:"agent_mobile"` // 发放代理手机号 TargetLevel int64 `json:"target_level"` // 目标等级 Status int64 `json:"status"` // 状态:0=未使用,1=已使用,2=已失效 - UsedUserId int64 `json:"used_user_id"` // 使用用户ID - UsedAgentId int64 `json:"used_agent_id"` // 使用代理ID + UsedUserId string `json:"used_user_id"` // 使用用户ID + UsedAgentId string `json:"used_agent_id"` // 使用代理ID UsedTime string `json:"used_time"` // 使用时间 ExpireTime string `json:"expire_time"` // 过期时间 Remark string `json:"remark"` // 备注 diff --git a/app/main/api/desc/admin/admin_api.api b/app/main/api/desc/admin/admin_api.api index 4ad224b..87db11b 100644 --- a/app/main/api/desc/admin/admin_api.api +++ b/app/main/api/desc/admin/admin_api.api @@ -25,7 +25,7 @@ type ( // API信息 AdminApiInfo { - Id int64 `json:"id"` + Id string `json:"id"` ApiName string `json:"api_name"` ApiCode string `json:"api_code"` Method string `json:"method"` @@ -38,7 +38,7 @@ type ( // API详情请求 AdminGetApiDetailReq { - Id int64 `path:"id"` + Id string `path:"id"` } // API详情响应 @@ -58,12 +58,12 @@ type ( // 创建API响应 AdminCreateApiResp { - Id int64 `json:"id"` + Id string `json:"id"` } // 更新API请求 AdminUpdateApiReq { - Id int64 `path:"id"` + Id string `path:"id"` ApiName string `json:"api_name"` ApiCode string `json:"api_code"` Method string `json:"method"` @@ -79,7 +79,7 @@ type ( // 删除API请求 AdminDeleteApiReq { - Id int64 `path:"id"` + Id string `path:"id"` } // 删除API响应 @@ -89,7 +89,7 @@ type ( // 批量更新API状态请求 AdminBatchUpdateApiStatusReq { - Ids []int64 `json:"ids"` + Ids []string `json:"ids"` Status int64 `json:"status"` } diff --git a/app/main/api/desc/admin/admin_feature.api b/app/main/api/desc/admin/admin_feature.api index 4f4c1db..03a7212 100644 --- a/app/main/api/desc/admin/admin_feature.api +++ b/app/main/api/desc/admin/admin_feature.api @@ -49,23 +49,23 @@ type ( Name string `json:"name"` // 描述 } // 创建功能响应 - AdminCreateFeatureResp { - Id int64 `json:"id"` // 功能ID - } + AdminCreateFeatureResp { + Id string `json:"id"` // 功能ID + } // 更新功能请求 - AdminUpdateFeatureReq { - Id int64 `path:"id"` // 功能ID - ApiId *string `json:"api_id,optional"` // API标识 - Name *string `json:"name,optional"` // 描述 - } + AdminUpdateFeatureReq { + Id string `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 - } + AdminDeleteFeatureReq { + Id string `path:"id"` // 功能ID + } // 删除功能响应 AdminDeleteFeatureResp { Success bool `json:"success"` // 是否成功 @@ -78,9 +78,9 @@ type ( Name *string `form:"name,optional"` // 描述 } // 功能列表项 - FeatureListItem { - Id int64 `json:"id"` // 功能ID - ApiId string `json:"api_id"` // API标识 + FeatureListItem { + Id string `json:"id"` // 功能ID + ApiId string `json:"api_id"` // API标识 Name string `json:"name"` // 描述 CreateTime string `json:"create_time"` // 创建时间 UpdateTime string `json:"update_time"` // 更新时间 @@ -91,38 +91,38 @@ type ( Items []FeatureListItem `json:"items"` // 列表数据 } // 获取功能详情请求 - AdminGetFeatureDetailReq { - Id int64 `path:"id"` // 功能ID - } + AdminGetFeatureDetailReq { + Id string `path:"id"` // 功能ID + } // 获取功能详情响应 - AdminGetFeatureDetailResp { - Id int64 `json:"id"` // 功能ID - ApiId string `json:"api_id"` // API标识 + AdminGetFeatureDetailResp { + Id string `json:"id"` // 功能ID + ApiId string `json:"api_id"` // API标识 Name string `json:"name"` // 描述 CreateTime string `json:"create_time"` // 创建时间 UpdateTime string `json:"update_time"` // 更新时间 } // 配置功能示例数据请求 - AdminConfigFeatureExampleReq { - FeatureId int64 `json:"feature_id"` // 功能ID - Data string `json:"data"` // 示例数据JSON - } + AdminConfigFeatureExampleReq { + FeatureId string `json:"feature_id"` // 功能ID + Data string `json:"data"` // 示例数据JSON + } // 配置功能示例数据响应 AdminConfigFeatureExampleResp { Success bool `json:"success"` // 是否成功 } // 查看功能示例数据请求 - AdminGetFeatureExampleReq { - FeatureId int64 `path:"feature_id"` // 功能ID - } + AdminGetFeatureExampleReq { + FeatureId string `path:"feature_id"` // 功能ID + } // 查看功能示例数据响应 - AdminGetFeatureExampleResp { - Id int64 `json:"id"` // 示例数据ID - FeatureId int64 `json:"feature_id"` // 功能ID - ApiId string `json:"api_id"` // API标识 - Data string `json:"data"` // 示例数据JSON - CreateTime string `json:"create_time"` // 创建时间 - UpdateTime string `json:"update_time"` // 更新时间 - } + AdminGetFeatureExampleResp { + Id string `json:"id"` // 示例数据ID + FeatureId string `json:"feature_id"` // 功能ID + ApiId string `json:"api_id"` // API标识 + Data string `json:"data"` // 示例数据JSON + CreateTime string `json:"create_time"` // 创建时间 + UpdateTime string `json:"update_time"` // 更新时间 + } ) diff --git a/app/main/api/desc/admin/admin_product.api b/app/main/api/desc/admin/admin_product.api index b8fe7ba..c3ba2c7 100644 --- a/app/main/api/desc/admin/admin_product.api +++ b/app/main/api/desc/admin/admin_product.api @@ -54,14 +54,14 @@ type ( } // 创建产品响应 - AdminCreateProductResp { - Id int64 `json:"id"` // 产品ID - } + AdminCreateProductResp { + Id string `json:"id"` // 产品ID + } // 更新产品请求 - AdminUpdateProductReq { - Id int64 `path:"id"` // 产品ID - ProductName *string `json:"product_name,optional"` // 服务名 + AdminUpdateProductReq { + Id string `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"` // 备注 @@ -75,9 +75,9 @@ type ( } // 删除产品请求 - AdminDeleteProductReq { - Id int64 `path:"id"` // 产品ID - } + AdminDeleteProductReq { + Id string `path:"id"` // 产品ID + } // 删除产品响应 AdminDeleteProductResp { @@ -93,9 +93,9 @@ type ( } // 产品列表项 - ProductListItem { - Id int64 `json:"id"` // 产品ID - ProductName string `json:"product_name"` // 服务名 + ProductListItem { + Id string `json:"id"` // 产品ID + ProductName string `json:"product_name"` // 服务名 ProductEn string `json:"product_en"` // 英文名 Description string `json:"description"` // 描述 Notes string `json:"notes"` // 备注 @@ -112,14 +112,14 @@ type ( } // 获取产品详情请求 - AdminGetProductDetailReq { - Id int64 `path:"id"` // 产品ID - } + AdminGetProductDetailReq { + Id string `path:"id"` // 产品ID + } // 获取产品详情响应 - AdminGetProductDetailResp { - Id int64 `json:"id"` // 产品ID - ProductName string `json:"product_name"` // 服务名 + AdminGetProductDetailResp { + Id string `json:"id"` // 产品ID + ProductName string `json:"product_name"` // 服务名 ProductEn string `json:"product_en"` // 英文名 Description string `json:"description"` // 描述 Notes string `json:"notes"` // 备注 @@ -130,23 +130,23 @@ type ( } // 获取产品功能列表请求 - AdminGetProductFeatureListReq { - ProductId int64 `path:"product_id"` // 产品ID - } + AdminGetProductFeatureListReq { + ProductId string `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 { + Id string `json:"id"` // 关联ID + ProductId string `json:"product_id"` // 产品ID + FeatureId string `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 { @@ -154,21 +154,21 @@ type ( // } // 产品功能关联项 - ProductFeatureItem { - FeatureId int64 `json:"feature_id"` // 功能ID - Sort int64 `json:"sort"` // 排序 - Enable int64 `json:"enable"` // 是否启用 - IsImportant int64 `json:"is_important"` // 是否重要 - } + ProductFeatureItem { + FeatureId string `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"` // 功能列表 - } + AdminUpdateProductFeaturesReq { + ProductId string `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 index ab3db31..1d3bb41 100644 --- a/app/main/api/desc/admin/admin_query.api +++ b/app/main/api/desc/admin/admin_query.api @@ -33,14 +33,14 @@ service main { put /cleanup/config (AdminUpdateQueryCleanupConfigReq) returns (AdminUpdateQueryCleanupConfigResp) } -type AdminGetQueryDetailByOrderIdReq { - OrderId int64 `path:"order_id"` + type AdminGetQueryDetailByOrderIdReq { + OrderId string `path:"order_id"` } -type AdminGetQueryDetailByOrderIdResp { - Id int64 `json:"id"` // 主键ID - OrderId int64 `json:"order_id"` // 订单ID - UserId int64 `json:"user_id"` // 用户ID + type AdminGetQueryDetailByOrderIdResp { + Id string `json:"id"` // 主键ID + OrderId string `json:"order_id"` // 订单ID + UserId string `json:"user_id"` // 用户ID ProductName string `json:"product_name"` // 产品ID QueryParams map[string]interface{} `json:"query_params"` QueryData []AdminQueryItem `json:"query_data"` @@ -68,8 +68,8 @@ type AdminGetQueryCleanupLogListResp { Items []QueryCleanupLogItem `json:"items"` // 列表 } -type QueryCleanupLogItem { - Id int64 `json:"id"` // 主键ID + type QueryCleanupLogItem { + Id string `json:"id"` // 主键ID CleanupTime string `json:"cleanup_time"` // 清理时间 CleanupBefore string `json:"cleanup_before"` // 清理截止时间 Status int64 `json:"status"` // 状态:1-成功,2-失败 @@ -80,8 +80,8 @@ type QueryCleanupLogItem { } // 清理详情相关请求响应定义 -type AdminGetQueryCleanupDetailListReq { - LogId int64 `path:"log_id"` // 清理日志ID + type AdminGetQueryCleanupDetailListReq { + LogId string `path:"log_id"` // 清理日志ID Page int64 `form:"page,default=1"` // 页码 PageSize int64 `form:"page_size,default=20"` // 每页数量 } @@ -91,12 +91,12 @@ type AdminGetQueryCleanupDetailListResp { 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 + type QueryCleanupDetailItem { + Id string `json:"id"` // 主键ID + CleanupLogId string `json:"cleanup_log_id"` // 清理日志ID + QueryId string `json:"query_id"` // 查询ID + OrderId string `json:"order_id"` // 订单ID + UserId string `json:"user_id"` // 用户ID ProductName string `json:"product_name"` // 产品名称 QueryState string `json:"query_state"` // 查询状态 CreateTimeOld string `json:"create_time_old"` // 原创建时间 @@ -112,8 +112,8 @@ type AdminGetQueryCleanupConfigListResp { Items []QueryCleanupConfigItem `json:"items"` // 配置列表 } -type QueryCleanupConfigItem { - Id int64 `json:"id"` // 主键ID + type QueryCleanupConfigItem { + Id string `json:"id"` // 主键ID ConfigKey string `json:"config_key"` // 配置键 ConfigValue string `json:"config_value"` // 配置值 ConfigDesc string `json:"config_desc"` // 配置描述 @@ -122,12 +122,12 @@ type QueryCleanupConfigItem { UpdateTime string `json:"update_time"` // 更新时间 } -type AdminUpdateQueryCleanupConfigReq { - Id int64 `json:"id"` // 主键ID + type AdminUpdateQueryCleanupConfigReq { + Id string `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_role_api.api b/app/main/api/desc/admin/admin_role_api.api index 2659a8e..42322e2 100644 --- a/app/main/api/desc/admin/admin_role_api.api +++ b/app/main/api/desc/admin/admin_role_api.api @@ -10,7 +10,7 @@ info( type ( // 获取角色API权限列表请求 AdminGetRoleApiListReq { - RoleId int64 `path:"role_id"` + RoleId string `path:"role_id"` } // 获取角色API权限列表响应 @@ -20,9 +20,9 @@ type ( // 角色API权限信息 AdminRoleApiInfo { - Id int64 `json:"id"` - RoleId int64 `json:"role_id"` - ApiId int64 `json:"api_id"` + Id string `json:"id"` + RoleId string `json:"role_id"` + ApiId string `json:"api_id"` ApiName string `json:"api_name"` ApiCode string `json:"api_code"` Method string `json:"method"` @@ -33,8 +33,8 @@ type ( // 分配角色API权限请求 AdminAssignRoleApiReq { - RoleId int64 `json:"role_id"` - ApiIds []int64 `json:"api_ids"` + RoleId string `json:"role_id"` + ApiIds []string `json:"api_ids"` } // 分配角色API权限响应 @@ -44,8 +44,8 @@ type ( // 移除角色API权限请求 AdminRemoveRoleApiReq { - RoleId int64 `json:"role_id"` - ApiIds []int64 `json:"api_ids"` + RoleId string `json:"role_id"` + ApiIds []string `json:"api_ids"` } // 移除角色API权限响应 @@ -55,8 +55,8 @@ type ( // 更新角色API权限请求 AdminUpdateRoleApiReq { - RoleId int64 `json:"role_id"` - ApiIds []int64 `json:"api_ids"` + RoleId string `json:"role_id"` + ApiIds []string `json:"api_ids"` } // 更新角色API权限响应 diff --git a/app/main/api/desc/admin/admin_user.api b/app/main/api/desc/admin/admin_user.api index 8df538e..9dd8000 100644 --- a/app/main/api/desc/admin/admin_user.api +++ b/app/main/api/desc/admin/admin_user.api @@ -58,52 +58,52 @@ type ( } // 列表项 - 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列表 - } + AdminUserListItem { + Id string `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + RoleIds []string `json:"role_ids"` // 关联的角色ID列表 + } // 详情请求 - AdminGetUserDetailReq { - Id int64 `path:"id"` // 用户ID - } + AdminGetUserDetailReq { + Id string `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列表 - } + AdminGetUserDetailResp { + Id string `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 []string `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列表 - } + AdminCreateUserReq { + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + RoleIds []string `json:"role_ids"` // 关联的角色ID列表 + } // 创建响应 - AdminCreateUserResp { - Id int64 `json:"id"` // 用户ID - } + AdminCreateUserResp { + Id string `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列表 - } + AdminUpdateUserReq { + Id string `path:"id"` // 用户ID + Username *string `json:"username,optional"` // 用户名 + RealName *string `json:"real_name,optional"` // 真实姓名 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + RoleIds []string `json:"role_ids,optional"` // 关联的角色ID列表 + } // 更新响应 AdminUpdateUserResp { @@ -111,9 +111,9 @@ type ( } // 删除请求 - AdminDeleteUserReq { - Id int64 `path:"id"` // 用户ID - } + AdminDeleteUserReq { + Id string `path:"id"` // 用户ID + } // 删除响应 AdminDeleteUserResp { @@ -132,13 +132,13 @@ type ( } // 重置密码请求 - AdminResetPasswordReq { - Id int64 `path:"id"` // 用户ID - Password string `json:"password"` // 新密码 - } + AdminResetPasswordReq { + Id string `path:"id"` // 用户ID + Password string `json:"password"` // 新密码 + } // 重置密码响应 AdminResetPasswordResp { Success bool `json:"success"` // 是否成功 } -) \ No newline at end of file +) diff --git a/app/main/api/desc/admin/menu.api b/app/main/api/desc/admin/menu.api index 792539c..b420c44 100644 --- a/app/main/api/desc/admin/menu.api +++ b/app/main/api/desc/admin/menu.api @@ -7,8 +7,8 @@ info ( ) @server ( - prefix: api/v1/admin/menu - group: admin_menu + prefix: api/v1/admin/menu + group: admin_menu middleware: AdminAuthInterceptor ) service main { @@ -40,100 +40,88 @@ service main { type ( // 列表请求 GetMenuListReq { - Name string `form:"name,optional"` // 菜单名称 - Path string `form:"path,optional"` // 路由路径 + 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 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"` // 排序 + Id string `json:"id"` // 菜单ID + Pid string `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"` // 子菜单 + Children []MenuListItem `json:"children"` // 子菜单 } - // 详情请求 GetMenuDetailReq { - Id int64 `path:"id"` // 菜单ID + Id string `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"` // 排序 + Id string `json:"id"` // 菜单ID + Pid string `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"` // 路由元数据 + Pid string `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 string `json:"type"` // 类型 + Sort int64 `json:"sort,optional"` // 排序 } - // 创建响应 CreateMenuResp { - Id int64 `json:"id"` // 菜单ID + Id string `json:"id"` // 菜单ID } - // 更新请求 UpdateMenuReq { - Id int64 `path:"id"` // 菜单ID - Pid int64 `json:"pid,optional"` // 父菜单ID - Name string `json:"name"` // 路由名称 - Path string `json:"path,optional"` // 路由路径 + Id string `path:"id"` // 菜单ID + Pid *string `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"` // 排序 + 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 + Id string `path:"id"` // 菜单ID } - // 删除响应 DeleteMenuResp { Success bool `json:"success"` // 是否成功 } - // 获取所有菜单请求 - GetMenuAllReq { - } - + GetMenuAllReq {} // 获取所有菜单响应 GetMenuAllResp { Name string `json:"name"` @@ -144,4 +132,5 @@ type ( 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 index a66dc31..18f0f7c 100644 --- a/app/main/api/desc/admin/notification.api +++ b/app/main/api/desc/admin/notification.api @@ -14,14 +14,14 @@ type ( } // 创建通知响应 - AdminCreateNotificationResp { - Id int64 `json:"id"` // 通知ID - } + AdminCreateNotificationResp { + Id string `json:"id"` // 通知ID + } // 更新通知请求 - AdminUpdateNotificationReq { - Id int64 `path:"id"` // 通知ID - Title *string `json:"title,optional"` // 通知标题 + AdminUpdateNotificationReq { + Id string `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"` // 生效开始日期 @@ -37,9 +37,9 @@ type ( } // 删除通知请求 - AdminDeleteNotificationReq { - Id int64 `path:"id"` // 通知ID - } + AdminDeleteNotificationReq { + Id string `path:"id"` // 通知ID + } // 删除通知响应 AdminDeleteNotificationResp { @@ -47,14 +47,14 @@ type ( } // 获取通知详情请求 - AdminGetNotificationDetailReq { - Id int64 `path:"id"` // 通知ID - } + AdminGetNotificationDetailReq { + Id string `path:"id"` // 通知ID + } // 获取通知详情响应 - AdminGetNotificationDetailResp { - Id int64 `json:"id"` // 通知ID - Title string `json:"title"` // 通知标题 + AdminGetNotificationDetailResp { + Id string `json:"id"` // 通知ID + Title string `json:"title"` // 通知标题 Content string `json:"content"` // 通知内容 NotificationPage string `json:"notification_page"` // 通知页面 StartDate string `json:"start_date"` // 生效开始日期 @@ -78,9 +78,9 @@ type ( } // 通知列表项 - NotificationListItem { - Id int64 `json:"id"` // 通知ID - Title string `json:"title"` // 通知标题 + NotificationListItem { + Id string `json:"id"` // 通知ID + Title string `json:"title"` // 通知标题 NotificationPage string `json:"notification_page"` // 通知页面 Content string `json:"content"` // 通知内容 StartDate string `json:"start_date"` // 生效开始日期 @@ -125,4 +125,4 @@ service main { // 获取通知列表 @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 index c511121..47c7d1f 100644 --- a/app/main/api/desc/admin/order.api +++ b/app/main/api/desc/admin/order.api @@ -66,8 +66,8 @@ type ( Items []OrderListItem `json:"items"` // 列表 } // 列表项 - OrderListItem { - Id int64 `json:"id"` // 订单ID + OrderListItem { + Id string `json:"id"` // 订单ID OrderNo string `json:"order_no"` // 商户订单号 PlatformOrderId string `json:"platform_order_id"` // 支付订单号 ProductName string `json:"product_name"` // 产品名称 @@ -83,12 +83,12 @@ type ( AgentProcessStatus string `json:"agent_process_status"` // 代理事务处理状态:not_agent-非代理订单,success-处理成功,failed-处理失败,pending-待处理 } // 详情请求 - AdminGetOrderDetailReq { - Id int64 `path:"id"` // 订单ID + AdminGetOrderDetailReq { + Id string `path:"id"` // 订单ID } // 详情响应 - AdminGetOrderDetailResp { - Id int64 `json:"id"` // 订单ID + AdminGetOrderDetailResp { + Id string `json:"id"` // 订单ID OrderNo string `json:"order_no"` // 商户订单号 PlatformOrderId string `json:"platform_order_id"` // 支付订单号 ProductName string `json:"product_name"` // 产品名称 @@ -115,12 +115,12 @@ type ( Status string `json:"status,default=pending"` // 支付状态:pending-待支付,paid-已支付,refunded-已退款,closed-已关闭,failed-支付失败 } // 创建响应 - AdminCreateOrderResp { - Id int64 `json:"id"` // 订单ID + AdminCreateOrderResp { + Id string `json:"id"` // 订单ID } // 更新请求 - AdminUpdateOrderReq { - Id int64 `path:"id"` // 订单ID + AdminUpdateOrderReq { + Id string `path:"id"` // 订单ID OrderNo *string `json:"order_no,optional"` // 商户订单号 PlatformOrderId *string `json:"platform_order_id,optional"` // 支付订单号 ProductName *string `json:"product_name,optional"` // 产品名称 @@ -136,16 +136,16 @@ type ( Success bool `json:"success"` // 是否成功 } // 删除请求 - AdminDeleteOrderReq { - Id int64 `path:"id"` // 订单ID + AdminDeleteOrderReq { + Id string `path:"id"` // 订单ID } // 删除响应 AdminDeleteOrderResp { Success bool `json:"success"` // 是否成功 } // 退款请求 - AdminRefundOrderReq { - Id int64 `path:"id"` // 订单ID + AdminRefundOrderReq { + Id string `path:"id"` // 订单ID RefundAmount float64 `json:"refund_amount"` // 退款金额 RefundReason string `json:"refund_reason"` // 退款原因 } @@ -156,8 +156,8 @@ type ( Amount float64 `json:"amount"` // 退款金额 } // 重新执行代理处理请求 - AdminRetryAgentProcessReq { - Id int64 `path:"id"` // 订单ID + AdminRetryAgentProcessReq { + Id string `path:"id"` // 订单ID } // 重新执行代理处理响应 AdminRetryAgentProcessResp { @@ -165,4 +165,4 @@ type ( Message string `json:"message"` // 执行结果消息 ProcessedAt string `json:"processed_at"` // 处理时间 } -) \ 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 index 7ab5e63..1b3b56f 100644 --- a/app/main/api/desc/admin/platform_user.api +++ b/app/main/api/desc/admin/platform_user.api @@ -7,9 +7,9 @@ info ( ) // 平台用户管理接口 -@server( - prefix: /api/v1/admin/platform_user - group: admin_platform_user +@server ( + prefix: /api/v1/admin/platform_user + group: admin_platform_user middleware: AdminAuthInterceptor ) service main { @@ -37,86 +37,77 @@ service main { 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-否 + 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"` // 排序类型 + 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-否 + Id string `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 + Id string `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-否 + Id string `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"` // 手机号 + Mobile string `json:"mobile"` // 手机号 Password string `json:"password"` // 密码 Nickname string `json:"nickname"` // 昵称 - Info string `json:"info"` // 备注信息 - Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 + Info string `json:"info"` // 备注信息 + Inside int64 `json:"inside"` // 是否内部用户 1-是 0-否 } - // 创建响应 AdminCreatePlatformUserResp { - Id int64 `json:"id"` // 用户ID + Id string `json:"id"` // 用户ID } - // 更新请求 AdminUpdatePlatformUserReq { - Id int64 `path:"id"` // 用户ID - Mobile *string `json:"mobile,optional"` // 手机号 + Id string `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-否 + Info *string `json:"info,optional"` // 备注信息 + Inside *int64 `json:"inside,optional"` // 是否内部用户 1-是 0-否 } - // 更新响应 AdminUpdatePlatformUserResp { Success bool `json:"success"` // 是否成功 } - // 删除请求 AdminDeletePlatformUserReq { - Id int64 `path:"id"` // 用户ID + Id string `path:"id"` // 用户ID } - // 删除响应 AdminDeletePlatformUserResp { Success bool `json:"success"` // 是否成功 } -) \ No newline at end of file +) + diff --git a/app/main/api/desc/admin/role.api b/app/main/api/desc/admin/role.api index 99dd121..b6c18e5 100644 --- a/app/main/api/desc/admin/role.api +++ b/app/main/api/desc/admin/role.api @@ -50,25 +50,25 @@ type ( } // 列表项 - RoleListItem { - Id int64 `json:"id"` // 角色ID - RoleName string `json:"role_name"` // 角色名称 + RoleListItem { + Id string `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列表 - } + MenuIds []string `json:"menu_ids"` // 关联的菜单ID列表 + } // 详情请求 - GetRoleDetailReq { - Id int64 `path:"id"` // 角色ID - } + GetRoleDetailReq { + Id string `path:"id"` // 角色ID + } // 详情响应 - GetRoleDetailResp { - Id int64 `json:"id"` // 角色ID + GetRoleDetailResp { + Id string `json:"id"` // 角色ID RoleName string `json:"role_name"` // 角色名称 RoleCode string `json:"role_code"` // 角色编码 Description string `json:"description"` // 角色描述 @@ -76,34 +76,34 @@ type ( Sort int64 `json:"sort"` // 排序 CreateTime string `json:"create_time"` // 创建时间 UpdateTime string `json:"update_time"` // 更新时间 - MenuIds []int64 `json:"menu_ids"` // 关联的菜单ID列表 - } + MenuIds []string `json:"menu_ids"` // 关联的菜单ID列表 + } // 创建请求 - CreateRoleReq { + 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列表 - } + MenuIds []string `json:"menu_ids"` // 关联的菜单ID列表 + } // 创建响应 - CreateRoleResp { - Id int64 `json:"id"` // 角色ID - } + CreateRoleResp { + Id string `json:"id"` // 角色ID + } // 更新请求 - UpdateRoleReq { - Id int64 `path:"id"` // 角色ID + UpdateRoleReq { + Id string `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列表 - } + MenuIds []string `json:"menu_ids,optional"` // 关联的菜单ID列表 + } // 更新响应 UpdateRoleResp { @@ -111,12 +111,12 @@ type ( } // 删除请求 - DeleteRoleReq { - Id int64 `path:"id"` // 角色ID - } + DeleteRoleReq { + Id string `path:"id"` // 角色ID + } // 删除响应 DeleteRoleResp { Success bool `json:"success"` // 是否成功 } -) \ No newline at end of file +) diff --git a/app/main/api/desc/front/agent.api b/app/main/api/desc/front/agent.api index 32dd3ba..5d28873 100644 --- a/app/main/api/desc/front/agent.api +++ b/app/main/api/desc/front/agent.api @@ -32,8 +32,8 @@ type ( LinkIdentifier string `form:"link_identifier"` // 推广链接标识 } GetLinkDataResp { - AgentId int64 `json:"agent_id"` // 代理ID - ProductId int64 `json:"product_id"` // 产品ID + AgentId string `json:"agent_id"` // 代理ID + ProductId string `json:"product_id"` // 产品ID SetPrice float64 `json:"set_price"` // 代理设定价格 ActualBasePrice float64 `json:"actual_base_price"` // 实际底价 ProductName string `json:"product_name"` // 产品名称 @@ -43,31 +43,37 @@ type ( Features []Feature `json:"features"` // 产品功能列表 } AgentApplyReq { - Region string `json:"region,optional"` // 区域(可选) - Mobile string `json:"mobile"` // 手机号 - Code string `json:"code"` // 验证码 - InviteCode string `json:"invite_code"` // 邀请码(必填,只能通过邀请码成为代理) + Region string `json:"region,optional"` + Mobile string `json:"mobile"` + Code string `json:"code"` + Referrer string `json:"referrer"` + InviteCode string `json:"invite_code,optional"` + AgentCode int64 `json:"agent_code,optional"` } AgentApplyResp { AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` RefreshAfter int64 `json:"refreshAfter"` + AgentCode int64 `json:"agent_code"` } // 通过邀请码注册 RegisterByInviteCodeReq { - InviteCode string `json:"invite_code"` // 邀请码 - Mobile string `json:"mobile"` // 手机号 - Code string `json:"code"` // 验证码 - Region string `json:"region,optional"` // 区域(可选) - WechatId string `json:"wechat_id,optional"` // 微信号(可选) + Referrer string `json:"referrer"` + InviteCode string `json:"invite_code,optional"` + AgentCode int64 `json:"agent_code,optional"` + Mobile string `json:"mobile"` + Code string `json:"code"` + Region string `json:"region,optional"` + WechatId string `json:"wechat_id,optional"` } RegisterByInviteCodeResp { AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` RefreshAfter int64 `json:"refreshAfter"` - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 代理等级 LevelName string `json:"level_name"` // 等级名称 + AgentCode int64 `json:"agent_code"` } // 生成邀请码 GenerateInviteCodeReq { @@ -89,7 +95,7 @@ type ( List []InviteCodeItem `json:"list"` // 列表 } InviteCodeItem { - Id int64 `json:"id"` // 记录ID + Id string `json:"id"` // 记录ID Code string `json:"code"` // 邀请码 TargetLevel int64 `json:"target_level"` // 目标等级 Status int64 `json:"status"` // 状态:0=未使用,1=已使用,2=已失效 @@ -100,7 +106,7 @@ type ( } // 删除邀请码 DeleteInviteCodeReq { - Id int64 `json:"id"` // 邀请码ID + Id string `json:"id"` // 邀请码ID } DeleteInviteCodeResp {} // 获取邀请链接 @@ -113,18 +119,22 @@ type ( } // 获取代理等级特权信息 GetLevelPrivilegeResp { - Levels []LevelPrivilegeItem `json:"levels"` // 各等级特权信息列表 + Levels []LevelPrivilegeItem `json:"levels"` + UpgradeToGoldFee float64 `json:"upgrade_to_gold_fee"` + UpgradeToDiamondFee float64 `json:"upgrade_to_diamond_fee"` + UpgradeToGoldRebate float64 `json:"upgrade_to_gold_rebate"` + UpgradeToDiamondRebate float64 `json:"upgrade_to_diamond_rebate"` } LevelPrivilegeItem { - Level int64 `json:"level"` // 等级:1=普通,2=黄金,3=钻石 - LevelName string `json:"level_name"` // 等级名称 - LevelBonus float64 `json:"level_bonus"` // 等级加成(元) - PriceReduction float64 `json:"price_reduction"` // 底价降低(元,相对于当前等级) - PromoteRebate string `json:"promote_rebate"` // 推广返佣说明 - MaxPromoteRebate float64 `json:"max_promote_rebate"` // 最高推广返佣金额(元) - UpgradeRebate string `json:"upgrade_rebate"` // 下级升级返佣说明 - Privileges []string `json:"privileges"` // 特权列表 - CanUpgradeSubordinate bool `json:"can_upgrade_subordinate"` // 是否可以升级下级 + Level int64 `json:"level"` // 等级:1=普通,2=黄金,3=钻石 + LevelName string `json:"level_name"` // 等级名称 + LevelBonus float64 `json:"level_bonus"` // 等级加成(元) + PriceReduction float64 `json:"price_reduction"` // 底价降低(元,相对于当前等级) + PromoteRebate string `json:"promote_rebate"` // 推广返佣说明 + MaxPromoteRebate float64 `json:"max_promote_rebate"` // 最高推广返佣金额(元) + UpgradeRebate string `json:"upgrade_rebate"` // 下级升级返佣说明 + Privileges []string `json:"privileges"` // 特权列表 + CanUpgradeSubordinate bool `json:"can_upgrade_subordinate"` // 是否可以升级下级 } ) @@ -229,23 +239,28 @@ service main { // 获取代理等级特权信息 @handler GetLevelPrivilege get /level/privilege returns (GetLevelPrivilegeResp) + + // 获取推广查询报告列表 + @handler GetPromotionQueryList + get /promotion/query/list (GetPromotionQueryListReq) returns (GetPromotionQueryListResp) } type ( // 代理信息 AgentInfoResp { - AgentId int64 `json:"agent_id"` // 代理ID - Level int64 `json:"level"` // 代理等级:1=普通,2=黄金,3=钻石 - LevelName string `json:"level_name"` // 等级名称 - Region string `json:"region"` // 区域(可选) - Mobile string `json:"mobile"` // 手机号 - WechatId string `json:"wechat_id"` // 微信号(可选) - TeamLeaderId int64 `json:"team_leader_id"` // 团队首领ID - IsRealName bool `json:"is_real_name"` // 是否已实名 + AgentId string `json:"agent_id"` + Level int64 `json:"level"` + LevelName string `json:"level_name"` + Region string `json:"region"` + Mobile string `json:"mobile"` + WechatId string `json:"wechat_id"` + TeamLeaderId string `json:"team_leader_id"` + IsRealName bool `json:"is_real_name"` + AgentCode int64 `json:"agent_code"` } // 生成推广链接 AgentGeneratingLinkReq { - ProductId int64 `json:"product_id"` // 产品ID + ProductId string `json:"product_id"` // 产品ID SetPrice float64 `json:"set_price"` // 设定价格 TargetPath string `json:"target_path,optional"` // 目标地址(可选,默认为推广报告页面) } @@ -258,7 +273,7 @@ type ( List []ProductConfigItem `json:"list"` } ProductConfigItem { - ProductId int64 `json:"product_id"` // 产品ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 ProductEn string `json:"product_en"` // 产品英文标识 ActualBasePrice float64 `json:"actual_base_price"` // 实际底价 @@ -305,7 +320,7 @@ type ( List []SubordinateItem `json:"list"` // 列表 } SubordinateItem { - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 等级 LevelName string `json:"level_name"` // 等级名称 Mobile string `json:"mobile"` // 手机号 @@ -315,7 +330,7 @@ type ( } // 下级贡献详情 GetSubordinateContributionDetailReq { - SubordinateId int64 `form:"subordinate_id"` // 下级代理ID + SubordinateId string `form:"subordinate_id"` // 下级代理ID Page int64 `form:"page"` // 页码 PageSize int64 `form:"page_size"` // 每页数量 TabType string `form:"tab_type,optional"` // 标签页类型:order=订单列表,invite=邀请列表 @@ -349,14 +364,14 @@ type ( } OrderItem { OrderNo string `json:"order_no"` // 订单号 - ProductId int64 `json:"product_id"` // 产品ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 OrderAmount float64 `json:"order_amount"` // 订单金额 RebateAmount float64 `json:"rebate_amount"` // 返佣金额 CreateTime string `json:"create_time"` // 创建时间 } InviteItem { - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 等级 LevelName string `json:"level_name"` // 等级名称 Mobile string `json:"mobile"` // 手机号 @@ -385,7 +400,7 @@ type ( MonthEarnings float64 `json:"month_earnings"` // 月收益 } TeamMemberItem { - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 等级 LevelName string `json:"level_name"` // 等级名称 Mobile string `json:"mobile"` // 手机号 @@ -421,8 +436,8 @@ type ( List []CommissionItem `json:"list"` // 列表 } CommissionItem { - Id int64 `json:"id"` // 记录ID - OrderId int64 `json:"order_id"` // 订单ID + Id string `json:"id"` // 记录ID + OrderId string `json:"order_id"` // 订单ID OrderNo string `json:"order_no"` // 订单号 ProductName string `json:"product_name"` // 产品名称 Amount float64 `json:"amount"` // 佣金金额 @@ -440,11 +455,11 @@ type ( List []RebateItem `json:"list"` // 列表 } RebateItem { - Id int64 `json:"id"` // 记录ID - SourceAgentId int64 `json:"source_agent_id"` // 来源代理ID + Id string `json:"id"` // 记录ID + SourceAgentId string `json:"source_agent_id"` // 来源代理ID SourceAgentMobile string `json:"source_agent_mobile"` // 来源代理手机号 SourceAgentLevel int64 `json:"source_agent_level"` // 来源代理等级:1=普通,2=黄金,3=钻石 - OrderId int64 `json:"order_id"` // 订单ID + OrderId string `json:"order_id"` // 订单ID OrderNo string `json:"order_no"` // 订单号 RebateType int64 `json:"rebate_type"` // 返佣类型:1=直接上级,2=钻石上级,3=黄金上级 Amount float64 `json:"amount"` // 返佣金额 @@ -460,8 +475,8 @@ type ( List []UpgradeRebateItem `json:"list"` // 列表 } UpgradeRebateItem { - Id int64 `json:"id"` // 记录ID - SourceAgentId int64 `json:"source_agent_id"` // 来源代理ID(升级的代理) + Id string `json:"id"` // 记录ID + SourceAgentId string `json:"source_agent_id"` // 来源代理ID(升级的代理) SourceAgentMobile string `json:"source_agent_mobile"` // 来源代理手机号 OrderNo string `json:"order_no"` // 订单号 FromLevel int64 `json:"from_level"` // 原等级 @@ -479,8 +494,8 @@ type ( List []UpgradeItem `json:"list"` // 列表 } UpgradeItem { - Id int64 `json:"id"` // 记录ID - AgentId int64 `json:"agent_id"` // 代理ID + Id string `json:"id"` // 记录ID + AgentId string `json:"agent_id"` // 代理ID FromLevel int64 `json:"from_level"` // 原等级 ToLevel int64 `json:"to_level"` // 目标等级 UpgradeType int64 `json:"upgrade_type"` // 升级类型:1=自主付费,2=钻石升级 @@ -494,13 +509,13 @@ type ( ToLevel int64 `json:"to_level"` // 目标等级:2=黄金,3=钻石 } ApplyUpgradeResp { - UpgradeId int64 `json:"upgrade_id"` // 升级记录ID + UpgradeId string `json:"upgrade_id"` // 升级记录ID OrderNo string `json:"order_no"` // 支付订单号 } // 钻石升级下级 UpgradeSubordinateReq { - SubordinateId int64 `json:"subordinate_id"` // 下级代理ID - ToLevel int64 `json:"to_level"` // 目标等级(只能是2=黄金) + SubordinateId string `json:"subordinate_id"` // 下级代理ID + ToLevel int64 `json:"to_level"` // 目标等级(只能是2=黄金) } UpgradeSubordinateResp { Success bool `json:"success"` @@ -515,7 +530,7 @@ type ( List []WithdrawalItem `json:"list"` // 列表 } WithdrawalItem { - Id int64 `json:"id"` // 记录ID + Id string `json:"id"` // 记录ID WithdrawalNo string `json:"withdrawal_no"` // 提现单号 Amount float64 `json:"amount"` // 提现金额 TaxAmount float64 `json:"tax_amount"` // 税费金额 @@ -533,7 +548,7 @@ type ( PayeeName string `json:"payee_name"` // 收款人姓名 } ApplyWithdrawalResp { - WithdrawalId int64 `json:"withdrawal_id"` // 提现记录ID + WithdrawalId string `json:"withdrawal_id"` // 提现记录ID WithdrawalNo string `json:"withdrawal_no"` // 提现单号 } // 实名认证 @@ -546,6 +561,22 @@ type ( RealNameAuthResp { Status string `json:"status"` // 状态:pending=待审核,approved=已通过,rejected=已拒绝 } + // 推广查询列表 + GetPromotionQueryListReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数量 + } + GetPromotionQueryListResp { + Total int64 `json:"total"` // 总数 + List []PromotionQueryItem `json:"list"` // 列表 + } + PromotionQueryItem { + Id string `json:"id"` // 查询ID + OrderId string `json:"order_id"` // 订单ID + ProductName string `json:"product_name"` // 产品名称 + CreateTime string `json:"create_time"` // 创建时间 + QueryState string `json:"query_state"` // 查询状态 + } ) // ============================================ @@ -563,4 +594,3 @@ service main { type ( ShortLinkRedirectResp {} ) - diff --git a/app/main/api/desc/front/authorization.api b/app/main/api/desc/front/authorization.api index 8a82ee9..3886183 100644 --- a/app/main/api/desc/front/authorization.api +++ b/app/main/api/desc/front/authorization.api @@ -1,56 +1,50 @@ type ( // GetAuthorizationDocumentReq 获取授权书请求 GetAuthorizationDocumentReq { - DocumentId int64 `json:"documentId" validate:"required"` // 授权书ID + DocumentId string `json:"documentId" validate:"required"` // 授权书ID } - // GetAuthorizationDocumentResp 获取授权书响应 GetAuthorizationDocumentResp { - DocumentId int64 `json:"documentId"` // 授权书ID - UserId int64 `json:"userId"` // 用户ID - OrderId int64 `json:"orderId"` // 订单ID - QueryId int64 `json:"queryId"` // 查询ID - FileName string `json:"fileName"` // 文件名 - FileUrl string `json:"fileUrl"` // 文件访问URL - FileSize int64 `json:"fileSize"` // 文件大小 - FileType string `json:"fileType"` // 文件类型 - Status string `json:"status"` // 状态 - CreateTime string `json:"createTime"` // 创建时间 + DocumentId string `json:"documentId"` // 授权书ID + UserId string `json:"userId"` // 用户ID + OrderId string `json:"orderId"` // 订单ID + QueryId string `json:"queryId"` // 查询ID + FileName string `json:"fileName"` // 文件名 + FileUrl string `json:"fileUrl"` // 文件访问URL + FileSize int64 `json:"fileSize"` // 文件大小 + FileType string `json:"fileType"` // 文件类型 + Status string `json:"status"` // 状态 + CreateTime string `json:"createTime"` // 创建时间 } - // GetAuthorizationDocumentByOrderReq 根据订单ID获取授权书请求 GetAuthorizationDocumentByOrderReq { - OrderId int64 `json:"orderId" validate:"required"` // 订单ID + OrderId string `json:"orderId" validate:"required"` // 订单ID } - // GetAuthorizationDocumentByOrderResp 根据订单ID获取授权书响应 GetAuthorizationDocumentByOrderResp { Documents []AuthorizationDocumentInfo `json:"documents"` // 授权书列表 } - // AuthorizationDocumentInfo 授权书信息 AuthorizationDocumentInfo { - DocumentId int64 `json:"documentId"` // 授权书ID - UserId int64 `json:"userId"` // 用户ID - OrderId int64 `json:"orderId"` // 订单ID - QueryId int64 `json:"queryId"` // 查询ID - FileName string `json:"fileName"` // 文件名 - FileUrl string `json:"fileUrl"` // 文件访问URL - FileSize int64 `json:"fileSize"` // 文件大小 - FileType string `json:"fileType"` // 文件类型 - Status string `json:"status"` // 状态 - CreateTime string `json:"createTime"` // 创建时间 + DocumentId string `json:"documentId"` // 授权书ID + UserId string `json:"userId"` // 用户ID + OrderId string `json:"orderId"` // 订单ID + QueryId string `json:"queryId"` // 查询ID + FileName string `json:"fileName"` // 文件名 + FileUrl string `json:"fileUrl"` // 文件访问URL + FileSize int64 `json:"fileSize"` // 文件大小 + FileType string `json:"fileType"` // 文件类型 + Status string `json:"status"` // 状态 + CreateTime string `json:"createTime"` // 创建时间 } - // DownloadAuthorizationDocumentReq 下载授权书请求 DownloadAuthorizationDocumentReq { - DocumentId int64 `json:"documentId" validate:"required"` // 授权书ID + DocumentId string `json:"documentId" validate:"required"` // 授权书ID } - // DownloadAuthorizationDocumentResp 下载授权书响应 DownloadAuthorizationDocumentResp { FileName string `json:"fileName"` // 文件名 - FileUrl string `json:"fileUrl"` // 文件访问URL + FileUrl string `json:"fileUrl"` // 文件访问URL } ) @@ -63,12 +57,13 @@ service main { // 获取授权书信息 @handler GetAuthorizationDocument get /authorization/document/:documentId (GetAuthorizationDocumentReq) returns (GetAuthorizationDocumentResp) - + // 根据订单ID获取授权书列表 @handler GetAuthorizationDocumentByOrder get /authorization/document/order/:orderId (GetAuthorizationDocumentByOrderReq) returns (GetAuthorizationDocumentByOrderResp) - + // 下载授权书文件 @handler DownloadAuthorizationDocument get /authorization/download/:documentId (DownloadAuthorizationDocumentReq) returns (DownloadAuthorizationDocumentResp) } + diff --git a/app/main/api/desc/front/pay.api b/app/main/api/desc/front/pay.api index 3032223..afc4f93 100644 --- a/app/main/api/desc/front/pay.api +++ b/app/main/api/desc/front/pay.api @@ -25,11 +25,10 @@ service main { } @server ( - prefix: api/v1 - group: pay - jwt: JwtAuth - middleware: UserAuthInterceptor - + prefix: api/v1 + group: pay + jwt: JwtAuth + middleware: AuthInterceptor ) service main { // 支付 @@ -65,7 +64,8 @@ type ( type ( IapCallbackReq { - OrderID int64 `json:"order_id" validate:"required"` + OrderID string `json:"order_id" validate:"required"` TransactionReceipt string `json:"transaction_receipt" validate:"required"` } -) \ No newline at end of file +) + diff --git a/app/main/api/desc/front/product.api b/app/main/api/desc/front/product.api index f642df5..8b6549f 100644 --- a/app/main/api/desc/front/product.api +++ b/app/main/api/desc/front/product.api @@ -6,9 +6,9 @@ info ( version: "v1" ) type Feature { - ID int64 `json:"id"` // 功能ID - ApiID string `json:"api_id"` // API标识 - Name string `json:"name"` // 功能描述 + ID string `json:"id"` // 功能ID + ApiID string `json:"api_id"` // API标识 + Name string `json:"name"` // 功能描述 } // 产品基本类型定义 type Product { @@ -34,7 +34,7 @@ service main { } type GetProductByIDRequest { - Id int64 `path:"id"` + Id string `path:"id"` } type GetProductByEnRequest { @@ -52,4 +52,4 @@ type ProductResponse { service main { @handler GetProductAppByEn get /app_en/:product_en (GetProductByEnRequest) returns (ProductResponse) -} \ No newline at end of file +} diff --git a/app/main/api/desc/front/query.api b/app/main/api/desc/front/query.api index 3fe2416..7a71035 100644 --- a/app/main/api/desc/front/query.api +++ b/app/main/api/desc/front/query.api @@ -9,9 +9,9 @@ info ( //============================> query v1 <============================ // 查询基本类型定义 type Query { - Id int64 `json:"id"` // 主键ID - OrderId int64 `json:"order_id"` // 订单ID - UserId int64 `json:"user_id"` // 用户ID + Id string `json:"id"` // 主键ID + OrderId string `json:"order_id"` // 订单ID + UserId string `json:"user_id"` // 用户ID Product string `json:"product"` // 产品ID ProductName string `json:"product_name"` // 产品ID QueryParams map[string]interface{} `json:"query_params"` @@ -68,7 +68,7 @@ type ( prefix: api/v1 group: query jwt: JwtAuth - middleware: UserAuthInterceptor + middleware: AuthInterceptor ) service main { @doc "query service" @@ -80,7 +80,7 @@ service main { prefix: api/v1 group: query jwt: JwtAuth - middleware: UserAuthInterceptor + middleware: AuthInterceptor ) service main { @doc "获取查询临时订单" @@ -114,7 +114,7 @@ service main { type ( QueryGenerateShareLinkReq { - OrderId *int64 `json:"order_id,optional"` + OrderId *string `json:"order_id,optional"` OrderNo *string `json:"order_no,optional"` } QueryGenerateShareLinkResp { @@ -154,7 +154,7 @@ type ( type ( QueryDetailByOrderIdReq { - OrderId int64 `path:"order_id"` + OrderId string `path:"order_id"` } ) @@ -166,7 +166,7 @@ type ( type ( QueryRetryReq { - Id int64 `path:"id"` + Id string `path:"id"` } QueryRetryResp { Query @@ -175,11 +175,11 @@ type ( type ( UpdateQueryDataReq { - Id int64 `json:"id"` // 查询ID + Id string `json:"id"` // 查询ID QueryData string `json:"query_data"` // 查询数据(未加密的JSON) } UpdateQueryDataResp { - Id int64 `json:"id"` + Id string `json:"id"` UpdatedAt string `json:"updated_at"` // 更新时间 } ) diff --git a/app/main/api/desc/front/user.api b/app/main/api/desc/front/user.api index aa750f5..683c887 100644 --- a/app/main/api/desc/front/user.api +++ b/app/main/api/desc/front/user.api @@ -9,10 +9,10 @@ info ( //============================> user v1 <============================ // 用户基本类型定义 type User { - Id int64 `json:"id"` - Mobile string `json:"mobile"` - NickName string `json:"nickName"` - UserType int64 `json:"userType"` + Id string `json:"id"` + Mobile string `json:"mobile"` + NickName string `json:"nickName"` + UserType int64 `json:"userType"` } //no need login @@ -21,6 +21,9 @@ type User { group: user ) service main { + @doc "unified auth" + @handler auth + post /user/auth (AuthReq) returns (AuthResp) @doc "mobile code login" @handler mobileCodeLogin post /user/mobileCodeLogin (MobileCodeLoginReq) returns (MobileCodeLoginResp) @@ -38,6 +41,18 @@ service main { } type ( + AuthReq { + Platform string `json:"platform"` // browser|wxh5|wxmini + Code string `json:"code,optional"` + } + AuthResp { + AccessToken string `json:"accessToken"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` + UserType int64 `json:"userType"` + HasMobile bool `json:"hasMobile"` + IsAgent bool `json:"isAgent"` + } MobileCodeLoginReq { Mobile string `json:"mobile"` Code string `json:"code" validate:"required"` diff --git a/app/main/api/etc/main.dev.yaml b/app/main/api/etc/main.dev.yaml index eba0c1e..f0e9ace 100644 --- a/app/main/api/etc/main.dev.yaml +++ b/app/main/api/etc/main.dev.yaml @@ -1,6 +1,7 @@ Name: main Host: 0.0.0.0 Port: 8888 +Timeout: 0 DataSource: "ycc:5vg67b3UNHu8@tcp(127.0.0.1:21001)/ycc?charset=utf8mb4&parseTime=True&loc=Local" CacheRedis: - Host: "127.0.0.1:21002" diff --git a/app/main/api/internal/handler/agent/getpromotionquerylisthandler.go b/app/main/api/internal/handler/agent/getpromotionquerylisthandler.go new file mode 100644 index 0000000..363f6a8 --- /dev/null +++ b/app/main/api/internal/handler/agent/getpromotionquerylisthandler.go @@ -0,0 +1,31 @@ +package agent + +import ( + "net/http" + + "ycc-server/app/main/api/internal/logic/agent" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/common/result" + "ycc-server/pkg/lzkit/validator" + + "github.com/zeromicro/go-zero/rest/httpx" +) + +func GetPromotionQueryListHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetPromotionQueryListReq + 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.NewGetPromotionQueryListLogic(r.Context(), svcCtx) + resp, err := l.GetPromotionQueryList(&req) + result.HttpResult(r, w, resp, err) + } +} + diff --git a/app/main/api/internal/handler/app/getappconfighandler.go b/app/main/api/internal/handler/app/getappconfighandler.go new file mode 100644 index 0000000..9e1b77c --- /dev/null +++ b/app/main/api/internal/handler/app/getappconfighandler.go @@ -0,0 +1,17 @@ +package app + +import ( + "net/http" + + "ycc-server/app/main/api/internal/logic/app" + "ycc-server/app/main/api/internal/svc" + "ycc-server/common/result" +) + +func GetAppConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + l := app.NewGetAppConfigLogic(r.Context(), svcCtx) + resp, err := l.GetAppConfig() + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/handler/routes.go b/app/main/api/internal/handler/routes.go index bb978ee..860ff49 100644 --- a/app/main/api/internal/handler/routes.go +++ b/app/main/api/internal/handler/routes.go @@ -662,6 +662,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/product_config", Handler: agent.GetAgentProductConfigHandler(serverCtx), }, + { + Method: http.MethodGet, + Path: "/promotion/query/list", + Handler: agent.GetPromotionQueryListHandler(serverCtx), + }, { Method: http.MethodPost, Path: "/real_name", @@ -745,6 +750,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ + { + Method: http.MethodGet, + Path: "/app/config", + Handler: app.GetAppConfigHandler(serverCtx), + }, { Method: http.MethodGet, Path: "/app/version", @@ -828,7 +838,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( rest.WithMiddlewares( - []rest.Middleware{serverCtx.UserAuthInterceptor}, + []rest.Middleware{serverCtx.AuthInterceptor}, []rest.Route{ { Method: http.MethodPost, @@ -900,7 +910,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( rest.WithMiddlewares( - []rest.Middleware{serverCtx.UserAuthInterceptor}, + []rest.Middleware{serverCtx.AuthInterceptor}, []rest.Route{ { // query service @@ -916,7 +926,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( rest.WithMiddlewares( - []rest.Middleware{serverCtx.UserAuthInterceptor}, + []rest.Middleware{serverCtx.AuthInterceptor}, []rest.Route{ { // 生成分享链接 @@ -991,6 +1001,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ + { + // unified auth + Method: http.MethodPost, + Path: "/user/auth", + Handler: user.AuthHandler(serverCtx), + }, { // mobile code login Method: http.MethodPost, diff --git a/app/main/api/internal/handler/user/authhandler.go b/app/main/api/internal/handler/user/authhandler.go new file mode 100644 index 0000000..d968a8b --- /dev/null +++ b/app/main/api/internal/handler/user/authhandler.go @@ -0,0 +1,25 @@ +package user + +import ( + "net/http" + + logic "ycc-server/app/main/api/internal/logic/user" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/common/result" + + "github.com/zeromicro/go-zero/rest/httpx" +) + +func AuthHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AuthReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + l := logic.NewAuthLogic(r.Context(), svcCtx) + resp, err := l.Auth(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/main/api/internal/logic/admin_agent/admingeneratediamondinvitecodelogic.go b/app/main/api/internal/logic/admin_agent/admingeneratediamondinvitecodelogic.go index b925911..a51754c 100644 --- a/app/main/api/internal/logic/admin_agent/admingeneratediamondinvitecodelogic.go +++ b/app/main/api/internal/logic/admin_agent/admingeneratediamondinvitecodelogic.go @@ -1,20 +1,21 @@ package admin_agent import ( - "context" - "database/sql" - "time" - "ycc-server/app/main/model" - "ycc-server/common/tool" - "ycc-server/common/xerr" + "context" + "database/sql" + "time" + "ycc-server/app/main/model" + "ycc-server/common/tool" + "ycc-server/common/xerr" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/sqlx" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" - "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" ) type AdminGenerateDiamondInviteCodeLogic struct { @@ -70,14 +71,15 @@ func (l *AdminGenerateDiamondInviteCodeLogic) AdminGenerateDiamondInviteCode(req } // 创建邀请码记录(平台发放的钻石邀请码) - inviteCode := &model.AgentInviteCode{ - Code: code, - AgentId: sql.NullInt64{Valid: false}, // NULL表示平台发放 - TargetLevel: 3, // 钻石代理 - Status: 0, // 未使用 - ExpireTime: expireTime, - Remark: sql.NullString{String: req.Remark, Valid: req.Remark != ""}, - } + inviteCode := &model.AgentInviteCode{ + Id: uuid.NewString(), + Code: code, + AgentId: sql.NullString{Valid: false}, // NULL表示平台发放 + TargetLevel: 3, // 钻石代理 + Status: 0, // 未使用 + ExpireTime: expireTime, + Remark: sql.NullString{String: req.Remark, Valid: req.Remark != ""}, + } _, err := l.svcCtx.AgentInviteCodeModel.Insert(transCtx, session, inviteCode) if err != nil { diff --git a/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go index 343d18e..26eb1fe 100644 --- a/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetagentcommissionlistlogic.go @@ -41,13 +41,13 @@ func (l *AdminGetAgentCommissionListLogic) AdminGetAgentCommissionList(req *type } // 批量查product_name - productIds := make(map[int64]struct{}) + productIds := make(map[string]struct{}) for _, v := range list { productIds[v.ProductId] = struct{}{} } - productNameMap := make(map[int64]string) + productNameMap := make(map[string]string) if len(productIds) > 0 { - ids := make([]int64, 0, len(productIds)) + ids := make([]string, 0, len(productIds)) for id := range productIds { ids = append(ids, id) } diff --git a/app/main/api/internal/logic/admin_agent/admingetagentconfiglogic.go b/app/main/api/internal/logic/admin_agent/admingetagentconfiglogic.go index 423e7a7..96b2ecd 100644 --- a/app/main/api/internal/logic/admin_agent/admingetagentconfiglogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetagentconfiglogic.go @@ -69,6 +69,8 @@ func (l *AdminGetAgentConfigLogic) AdminGetAgentConfig() (resp *types.AdminGetAg commissionFreezeThreshold := getConfigFloat("commission_freeze_threshold") commissionFreezeDays := getConfigInt("commission_freeze_days") + goldUplift := getConfigFloat("gold_max_uplift_amount") + diamondUplift := getConfigFloat("diamond_max_uplift_amount") return &types.AdminGetAgentConfigResp{ LevelBonus: types.LevelBonusConfig{ Normal: int64(level1Bonus), @@ -78,7 +80,6 @@ func (l *AdminGetAgentConfigLogic) AdminGetAgentConfig() (resp *types.AdminGetAg UpgradeFee: types.UpgradeFeeConfig{ NormalToGold: upgradeToGoldFee, NormalToDiamond: upgradeToDiamondFee, - GoldToDiamond: upgradeToDiamondFee - upgradeToGoldFee, }, UpgradeRebate: types.UpgradeRebateConfig{ NormalToGoldRebate: upgradeToGoldRebate, @@ -95,7 +96,9 @@ func (l *AdminGetAgentConfigLogic) AdminGetAgentConfig() (resp *types.AdminGetAg Threshold: commissionFreezeThreshold, Days: commissionFreezeDays, }, - TaxRate: getConfigFloat("tax_rate"), - TaxExemptionAmount: getConfigFloat("tax_exemption_amount"), + TaxRate: getConfigFloat("tax_rate"), + TaxExemptionAmount: getConfigFloat("tax_exemption_amount"), + GoldMaxUpliftAmount: goldUplift, + DiamondMaxUpliftAmount: diamondUplift, }, nil } diff --git a/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go index 8fadcde..da7ecd6 100644 --- a/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetagentlinklistlogic.go @@ -44,15 +44,15 @@ func (l *AdminGetAgentLinkListLogic) AdminGetAgentLinkList(req *types.AdminGetAg } // 批量查product_id->name,避免N+1 - productIdSet := make(map[int64]struct{}) + productIdSet := make(map[string]struct{}) for _, link := range links { productIdSet[link.ProductId] = struct{}{} } - productIdList := make([]int64, 0, len(productIdSet)) + productIdList := make([]string, 0, len(productIdSet)) for id := range productIdSet { productIdList = append(productIdList, id) } - productNameMap := make(map[int64]string) + productNameMap := make(map[string]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 { @@ -63,14 +63,14 @@ func (l *AdminGetAgentLinkListLogic) AdminGetAgentLinkList(req *types.AdminGetAg items := make([]types.AgentLinkListItem, 0, len(links)) for _, link := range links { items = append(items, types.AgentLinkListItem{ - Id: link.Id, - AgentId: link.AgentId, - ProductId: link.ProductId, - ProductName: productNameMap[link.ProductId], - SetPrice: link.SetPrice, + Id: link.Id, + AgentId: link.AgentId, + ProductId: link.ProductId, + ProductName: productNameMap[link.ProductId], + SetPrice: link.SetPrice, ActualBasePrice: link.ActualBasePrice, - LinkIdentifier: link.LinkIdentifier, - CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), + LinkIdentifier: link.LinkIdentifier, + CreateTime: link.CreateTime.Format("2006-01-02 15:04:05"), }) } diff --git a/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go index 0f822c7..a259f93 100644 --- a/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetagentlistlogic.go @@ -29,7 +29,7 @@ func NewAdminGetAgentListLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListReq) (resp *types.AdminGetAgentListResp, err error) { builder := l.svcCtx.AgentModel.SelectBuilder() - + // 如果传入TeamLeaderId,则查找该团队首领下的所有代理 if req.TeamLeaderId != nil { builder = builder.Where(squirrel.Eq{"team_leader_id": *req.TeamLeaderId}) @@ -78,7 +78,7 @@ func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListR // 查询钱包信息 wallet, _ := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agent.Id) - + // 查询实名认证信息 realNameInfo, _ := l.svcCtx.AgentRealNameModel.FindOneByAgentId(l.ctx, agent.Id) isRealName := false @@ -90,9 +90,9 @@ func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListR if agent.WechatId.Valid { wechatId = agent.WechatId.String } - teamLeaderId := int64(0) + teamLeaderId := "" if agent.TeamLeaderId.Valid { - teamLeaderId = agent.TeamLeaderId.Int64 + teamLeaderId = agent.TeamLeaderId.String } // 获取区域 @@ -102,22 +102,23 @@ func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListR } item := types.AgentListItem{ - Id: agent.Id, - UserId: agent.UserId, - Level: agent.Level, - LevelName: levelName, - Region: region, - Mobile: agent.Mobile, - WechatId: wechatId, - TeamLeaderId: teamLeaderId, - Balance: 0, - TotalEarnings: 0, - FrozenBalance: 0, + Id: agent.Id, + UserId: agent.UserId, + Level: agent.Level, + LevelName: levelName, + Region: region, + Mobile: agent.Mobile, + WechatId: wechatId, + TeamLeaderId: teamLeaderId, + AgentCode: agent.AgentCode, + Balance: 0, + TotalEarnings: 0, + FrozenBalance: 0, WithdrawnAmount: 0, - IsRealName: isRealName, - CreateTime: agent.CreateTime.Format("2006-01-02 15:04:05"), + IsRealName: isRealName, + CreateTime: agent.CreateTime.Format("2006-01-02 15:04:05"), } - + if wallet != nil { item.Balance = wallet.Balance item.TotalEarnings = wallet.TotalEarnings diff --git a/app/main/api/internal/logic/admin_agent/admingetagentorderlistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentorderlistlogic.go index 6f07689..797e53d 100644 --- a/app/main/api/internal/logic/admin_agent/admingetagentorderlistlogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetagentorderlistlogic.go @@ -58,15 +58,15 @@ func (l *AdminGetAgentOrderListLogic) AdminGetAgentOrderList(req *types.AdminGet } // 批量查询产品名称 - productIdSet := make(map[int64]struct{}) + productIdSet := make(map[string]struct{}) for _, order := range orders { productIdSet[order.ProductId] = struct{}{} } - productIdList := make([]int64, 0, len(productIdSet)) + productIdList := make([]string, 0, len(productIdSet)) for id := range productIdSet { productIdList = append(productIdList, id) } - productNameMap := make(map[int64]string) + productNameMap := make(map[string]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 { diff --git a/app/main/api/internal/logic/admin_agent/admingetagentrebatelistlogic.go b/app/main/api/internal/logic/admin_agent/admingetagentrebatelistlogic.go index 2d61ae4..2503dae 100644 --- a/app/main/api/internal/logic/admin_agent/admingetagentrebatelistlogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetagentrebatelistlogic.go @@ -58,15 +58,15 @@ func (l *AdminGetAgentRebateListLogic) AdminGetAgentRebateList(req *types.AdminG } // 批量查询产品名称 - productIdSet := make(map[int64]struct{}) + productIdSet := make(map[string]struct{}) for _, rebate := range rebates { productIdSet[rebate.ProductId] = struct{}{} } - productIdList := make([]int64, 0, len(productIdSet)) + productIdList := make([]string, 0, len(productIdSet)) for id := range productIdSet { productIdList = append(productIdList, id) } - productNameMap := make(map[int64]string) + productNameMap := make(map[string]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 { @@ -79,12 +79,12 @@ func (l *AdminGetAgentRebateListLogic) AdminGetAgentRebateList(req *types.AdminG for _, rebate := range rebates { items = append(items, types.AgentRebateListItem{ Id: rebate.Id, - AgentId: rebate.AgentId, + AgentId: rebate.AgentId, SourceAgentId: rebate.SourceAgentId, - OrderId: rebate.OrderId, - RebateType: rebate.RebateType, - Amount: rebate.RebateAmount, - CreateTime: rebate.CreateTime.Format("2006-01-02 15:04:05"), + OrderId: rebate.OrderId, + RebateType: rebate.RebateType, + Amount: rebate.RebateAmount, + CreateTime: rebate.CreateTime.Format("2006-01-02 15:04:05"), }) } diff --git a/app/main/api/internal/logic/admin_agent/admingetinvitecodelistlogic.go b/app/main/api/internal/logic/admin_agent/admingetinvitecodelistlogic.go index cfb4736..f4d17ad 100644 --- a/app/main/api/internal/logic/admin_agent/admingetinvitecodelistlogic.go +++ b/app/main/api/internal/logic/admin_agent/admingetinvitecodelistlogic.go @@ -37,8 +37,8 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet if req.Code != nil && *req.Code != "" { builder = builder.Where("code = ?", *req.Code) } - if req.AgentId != nil { - if *req.AgentId == 0 { + if req.AgentId != nil && *req.AgentId != "" { + if *req.AgentId == "0" { // agent_id = 0 表示查询平台发放的邀请码(agent_id为NULL) builder = builder.Where("agent_id IS NULL") } else { @@ -59,16 +59,16 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet } // 3. 批量查询代理信息(用于显示代理手机号) - agentIds := make(map[int64]struct{}) + agentIds := make(map[string]struct{}) for _, v := range list { - if v.AgentId.Valid && v.AgentId.Int64 > 0 { - agentIds[v.AgentId.Int64] = struct{}{} + if v.AgentId.Valid && v.AgentId.String != "" { + agentIds[v.AgentId.String] = struct{}{} } } - agentMobileMap := make(map[int64]string) + agentMobileMap := make(map[string]string) if len(agentIds) > 0 { - agentIdList := make([]int64, 0, len(agentIds)) + agentIdList := make([]string, 0, len(agentIds)) for id := range agentIds { agentIdList = append(agentIdList, id) } @@ -90,7 +90,7 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet item := types.InviteCodeListItem{ Id: v.Id, Code: v.Code, - AgentId: 0, + AgentId: "", AgentMobile: "", TargetLevel: v.TargetLevel, Status: v.Status, @@ -98,15 +98,15 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet } if v.AgentId.Valid { - item.AgentId = v.AgentId.Int64 - item.AgentMobile = agentMobileMap[v.AgentId.Int64] + item.AgentId = v.AgentId.String + item.AgentMobile = agentMobileMap[v.AgentId.String] } if v.UsedUserId.Valid { - item.UsedUserId = v.UsedUserId.Int64 + item.UsedUserId = v.UsedUserId.String } if v.UsedAgentId.Valid { - item.UsedAgentId = v.UsedAgentId.Int64 + item.UsedAgentId = v.UsedAgentId.String } if v.UsedTime.Valid { item.UsedTime = v.UsedTime.Time.Format("2006-01-02 15:04:05") diff --git a/app/main/api/internal/logic/admin_agent/adminupdateagentconfiglogic.go b/app/main/api/internal/logic/admin_agent/adminupdateagentconfiglogic.go index 3b43326..ce22f54 100644 --- a/app/main/api/internal/logic/admin_agent/adminupdateagentconfiglogic.go +++ b/app/main/api/internal/logic/admin_agent/adminupdateagentconfiglogic.go @@ -2,6 +2,7 @@ package admin_agent import ( "context" + "database/sql" "strconv" "ycc-server/common/xerr" @@ -9,6 +10,7 @@ import ( "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" "github.com/zeromicro/go-zero/core/logx" ) @@ -28,17 +30,77 @@ func NewAdminUpdateAgentConfigLogic(ctx context.Context, svcCtx *svc.ServiceCont } func (l *AdminUpdateAgentConfigLogic) AdminUpdateAgentConfig(req *types.AdminUpdateAgentConfigReq) (resp *types.AdminUpdateAgentConfigResp, err error) { - // 更新配置的辅助函数 + configTypeForKey := func(key string) string { + switch key { + case "level_1_bonus", "level_2_bonus", "level_3_bonus": + return "bonus" + case "upgrade_to_gold_fee", "upgrade_to_diamond_fee", "upgrade_to_gold_rebate", "upgrade_to_diamond_rebate": + return "upgrade" + case "direct_parent_amount_diamond", "direct_parent_amount_gold", "direct_parent_amount_normal", "max_gold_rebate_amount": + return "rebate" + case "commission_freeze_ratio", "commission_freeze_threshold", "commission_freeze_days": + return "rebate" + case "tax_rate", "tax_exemption_amount": + return "tax" + case "gold_max_uplift_amount", "diamond_max_uplift_amount": + return "price" + default: + return "rebate" + } + } + updateConfig := func(key string, value *float64) error { if value == nil { return nil } + valStr := strconv.FormatFloat(*value, 'f', -1, 64) config, err := l.svcCtx.AgentConfigModel.FindOneByConfigKey(l.ctx, key) if err != nil { + if errors.Is(err, model.ErrNotFound) { + cfg := &model.AgentConfig{ + ConfigKey: key, + ConfigValue: valStr, + ConfigType: configTypeForKey(key), + Description: sql.NullString{}, + DeleteTime: sql.NullTime{}, + Version: 0, + } + _, insErr := l.svcCtx.AgentConfigModel.Insert(l.ctx, nil, cfg) + if insErr != nil { + return errors.Wrapf(insErr, "创建配置失败, key: %s", key) + } + return nil + } return errors.Wrapf(err, "查询配置失败, key: %s", key) } - config.ConfigValue = strconv.FormatFloat(*value, 'f', -1, 64) - return l.svcCtx.AgentConfigModel.UpdateWithVersion(l.ctx, nil, config) + config.ConfigValue = valStr + if uErr := l.svcCtx.AgentConfigModel.UpdateWithVersion(l.ctx, nil, config); uErr != nil { + if errors.Is(uErr, model.ErrNoRowsUpdate) { + latestByKey, reErr := l.svcCtx.AgentConfigModel.FindOneByConfigKey(l.ctx, key) + if reErr != nil { + if errors.Is(reErr, model.ErrNotFound) { + cfg := &model.AgentConfig{ + ConfigKey: key, + ConfigValue: valStr, + ConfigType: configTypeForKey(key), + Description: sql.NullString{}, + DeleteTime: sql.NullTime{}, + Version: 0, + } + _, insErr := l.svcCtx.AgentConfigModel.Insert(l.ctx, nil, cfg) + if insErr != nil { + return errors.Wrapf(insErr, "创建配置失败, key: %s", key) + } + return nil + } + return errors.Wrapf(reErr, "查询最新配置失败, key: %s", key) + } + latestByKey.ConfigValue = valStr + return l.svcCtx.AgentConfigModel.UpdateWithVersion(l.ctx, nil, latestByKey) + } + return uErr + } + return nil } // 更新等级加成配置 @@ -118,6 +180,13 @@ func (l *AdminUpdateAgentConfigLogic) AdminUpdateAgentConfig(req *types.AdminUpd return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新免税额度失败, %v", err) } + if err := updateConfig("gold_max_uplift_amount", req.GoldMaxUpliftAmount); err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新黄金代理最高价上调金额失败, %v", err) + } + if err := updateConfig("diamond_max_uplift_amount", req.DiamondMaxUpliftAmount); err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新钻石代理最高价上调金额失败, %v", err) + } + return &types.AdminUpdateAgentConfigResp{ Success: true, }, nil diff --git a/app/main/api/internal/logic/admin_api/adminbatchupdateapistatuslogic.go b/app/main/api/internal/logic/admin_api/adminbatchupdateapistatuslogic.go index 2d67986..1642f4f 100644 --- a/app/main/api/internal/logic/admin_api/adminbatchupdateapistatuslogic.go +++ b/app/main/api/internal/logic/admin_api/adminbatchupdateapistatuslogic.go @@ -40,7 +40,7 @@ func (l *AdminBatchUpdateApiStatusLogic) AdminBatchUpdateApiStatus(req *types.Ad // 2. 批量更新API状态 successCount := 0 for _, id := range req.Ids { - if id <= 0 { + if id == "" { continue } @@ -50,7 +50,7 @@ func (l *AdminBatchUpdateApiStatusLogic) AdminBatchUpdateApiStatus(req *types.Ad if errors.Is(err, model.ErrNotFound) { continue // 跳过不存在的API } - logx.Errorf("查询API失败, err: %v, id: %d", err, id) + logx.Errorf("查询API失败, err: %v, id: %s", err, id) continue } diff --git a/app/main/api/internal/logic/admin_api/admincreateapilogic.go b/app/main/api/internal/logic/admin_api/admincreateapilogic.go index 2a690e0..df3540d 100644 --- a/app/main/api/internal/logic/admin_api/admincreateapilogic.go +++ b/app/main/api/internal/logic/admin_api/admincreateapilogic.go @@ -8,6 +8,7 @@ import ( "ycc-server/app/main/model" "ycc-server/common/xerr" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" ) @@ -58,6 +59,7 @@ func (l *AdminCreateApiLogic) AdminCreateApi(req *types.AdminCreateApiReq) (resp // 3. 创建API记录 apiData := &model.AdminApi{ + Id: uuid.NewString(), ApiName: req.ApiName, ApiCode: req.ApiCode, Method: req.Method, @@ -71,8 +73,7 @@ func (l *AdminCreateApiLogic) AdminCreateApi(req *types.AdminCreateApiReq) (resp return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建API失败, err: %v", err) } - // 4. 返回结果 - apiId, _ := result.LastInsertId() - return &types.AdminCreateApiResp{Id: apiId}, nil + _ = result + return &types.AdminCreateApiResp{Id: apiData.Id}, nil } diff --git a/app/main/api/internal/logic/admin_api/admindeleteapilogic.go b/app/main/api/internal/logic/admin_api/admindeleteapilogic.go index 8105983..4f3bc9d 100644 --- a/app/main/api/internal/logic/admin_api/admindeleteapilogic.go +++ b/app/main/api/internal/logic/admin_api/admindeleteapilogic.go @@ -28,9 +28,9 @@ func NewAdminDeleteApiLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Ad func (l *AdminDeleteApiLogic) AdminDeleteApi(req *types.AdminDeleteApiReq) (resp *types.AdminDeleteApiResp, err error) { // 1. 参数验证 - if req.Id <= 0 { + if req.Id == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "API ID必须大于0, id: %d", req.Id) + "API ID不能为空, id: %s", req.Id) } // 2. 查询API是否存在 diff --git a/app/main/api/internal/logic/admin_api/admingetapidetaillogic.go b/app/main/api/internal/logic/admin_api/admingetapidetaillogic.go index 309a621..3821ef0 100644 --- a/app/main/api/internal/logic/admin_api/admingetapidetaillogic.go +++ b/app/main/api/internal/logic/admin_api/admingetapidetaillogic.go @@ -28,9 +28,9 @@ func NewAdminGetApiDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminGetApiDetailLogic) AdminGetApiDetail(req *types.AdminGetApiDetailReq) (resp *types.AdminGetApiDetailResp, err error) { // 1. 参数验证 - if req.Id <= 0 { + if req.Id == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "API ID必须大于0, id: %d", req.Id) + "API ID不能为空, id: %s", req.Id) } // 2. 查询API详情 diff --git a/app/main/api/internal/logic/admin_api/adminupdateapilogic.go b/app/main/api/internal/logic/admin_api/adminupdateapilogic.go index dc80017..547b709 100644 --- a/app/main/api/internal/logic/admin_api/adminupdateapilogic.go +++ b/app/main/api/internal/logic/admin_api/adminupdateapilogic.go @@ -28,9 +28,9 @@ func NewAdminUpdateApiLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Ad func (l *AdminUpdateApiLogic) AdminUpdateApi(req *types.AdminUpdateApiReq) (resp *types.AdminUpdateApiResp, err error) { // 1. 参数验证 - if req.Id <= 0 { + if req.Id == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "API ID必须大于0, id: %d", req.Id) + "API ID不能为空, id: %s", req.Id) } if req.ApiName == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), diff --git a/app/main/api/internal/logic/admin_auth/adminloginlogic.go b/app/main/api/internal/logic/admin_auth/adminloginlogic.go index 997996d..1b97347 100644 --- a/app/main/api/internal/logic/admin_auth/adminloginlogic.go +++ b/app/main/api/internal/logic/admin_auth/adminloginlogic.go @@ -57,7 +57,7 @@ func (l *AdminLoginLogic) AdminLogin(req *types.AdminLoginReq) (resp *types.Admi } // 获取角色ID数组 - roleIds := make([]int64, 0) + roleIds := make([]string, 0) for _, permission := range permissions { roleIds = append(roleIds, permission.RoleId) } @@ -77,7 +77,7 @@ func (l *AdminLoginLogic) AdminLogin(req *types.AdminLoginReq) (resp *types.Admi expiresAt := l.svcCtx.Config.AdminConfig.AccessExpire claims := jwtx.JwtClaims{ UserId: user.Id, - AgentId: 0, + AgentId: "", Platform: model.PlatformAdmin, UserType: model.UserTypeAdmin, IsAgent: model.AgentStatusNo, diff --git a/app/main/api/internal/logic/admin_feature/adminconfigfeatureexamplelogic.go b/app/main/api/internal/logic/admin_feature/adminconfigfeatureexamplelogic.go index 92c8079..c0b25f9 100644 --- a/app/main/api/internal/logic/admin_feature/adminconfigfeatureexamplelogic.go +++ b/app/main/api/internal/logic/admin_feature/adminconfigfeatureexamplelogic.go @@ -1,17 +1,18 @@ package admin_feature import ( - "context" - "encoding/hex" + "context" + "encoding/hex" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" - "ycc-server/pkg/lzkit/crypto" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" + "ycc-server/pkg/lzkit/crypto" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" ) type AdminConfigFeatureExampleLogic struct { @@ -62,11 +63,12 @@ func (l *AdminConfigFeatureExampleLogic) AdminConfigFeatureExample(req *types.Ad } // 4. 准备示例数据 - exampleData := &model.Example{ - ApiId: feature.ApiId, - FeatureId: req.FeatureId, - Content: encryptedData, - } + exampleData := &model.Example{ + Id: uuid.NewString(), + ApiId: feature.ApiId, + FeatureId: req.FeatureId, + Content: encryptedData, + } // 4. 根据是否存在决定新增或更新 if existingExample == nil { diff --git a/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go b/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go index 419650e..b422c8d 100644 --- a/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go +++ b/app/main/api/internal/logic/admin_feature/admincreatefeaturelogic.go @@ -8,6 +8,7 @@ import ( "ycc-server/app/main/model" "ycc-server/common/xerr" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" ) @@ -29,6 +30,7 @@ func NewAdminCreateFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminCreateFeatureLogic) AdminCreateFeature(req *types.AdminCreateFeatureReq) (resp *types.AdminCreateFeatureResp, err error) { // 1. 数据转换 data := &model.Feature{ + Id: uuid.NewString(), ApiId: req.ApiId, Name: req.Name, } @@ -41,6 +43,6 @@ func (l *AdminCreateFeatureLogic) AdminCreateFeature(req *types.AdminCreateFeatu } // 3. 返回结果 - id, _ := result.LastInsertId() - return &types.AdminCreateFeatureResp{Id: id}, nil + _ = result + return &types.AdminCreateFeatureResp{Id: data.Id}, nil } diff --git a/app/main/api/internal/logic/admin_feature/admingetfeatureexamplelogic.go b/app/main/api/internal/logic/admin_feature/admingetfeatureexamplelogic.go index dc72ab5..2b7137e 100644 --- a/app/main/api/internal/logic/admin_feature/admingetfeatureexamplelogic.go +++ b/app/main/api/internal/logic/admin_feature/admingetfeatureexamplelogic.go @@ -35,7 +35,7 @@ func (l *AdminGetFeatureExampleLogic) AdminGetFeatureExample(req *types.AdminGet if errors.Is(err, model.ErrNotFound) { // 示例数据不存在,返回空数据 return &types.AdminGetFeatureExampleResp{ - Id: 0, + Id: "", FeatureId: req.FeatureId, ApiId: "", Data: "", diff --git a/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go b/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go index 6aff18a..526be22 100644 --- a/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go +++ b/app/main/api/internal/logic/admin_feature/adminupdatefeaturelogic.go @@ -27,9 +27,9 @@ func NewAdminUpdateFeatureLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminUpdateFeatureLogic) AdminUpdateFeature(req *types.AdminUpdateFeatureReq) (resp *types.AdminUpdateFeatureResp, err error) { // 1. 参数验证 - if req.Id <= 0 { + if req.Id == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "功能ID必须大于0, id: %d", req.Id) + "功能ID不能为空, id: %s", req.Id) } // 2. 查询记录是否存在 diff --git a/app/main/api/internal/logic/admin_menu/createmenulogic.go b/app/main/api/internal/logic/admin_menu/createmenulogic.go index 25b2728..f342df8 100644 --- a/app/main/api/internal/logic/admin_menu/createmenulogic.go +++ b/app/main/api/internal/logic/admin_menu/createmenulogic.go @@ -1,18 +1,19 @@ package admin_menu import ( - "context" - "database/sql" - "encoding/json" - "time" + "context" + "database/sql" + "encoding/json" + "time" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" ) type CreateMenuLogic struct { @@ -48,13 +49,13 @@ func (l *CreateMenuLogic) CreateMenu(req *types.CreateMenuReq) (resp *types.Crea } // 3. 检查父菜单是否存在(如果不是根菜单) - if req.Pid > 0 { + if req.Pid != "" { 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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询父菜单失败, id: %s, err: %v", req.Pid, err) } if parentMenu == nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %d", req.Pid) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %s", req.Pid) } } @@ -65,18 +66,19 @@ func (l *CreateMenuLogic) CreateMenu(req *types.CreateMenuReq) (resp *types.Crea } // 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(), - } + menu := &model.AdminMenu{ + Id: uuid.NewString(), + Pid: sql.NullString{String: req.Pid, Valid: 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) diff --git a/app/main/api/internal/logic/admin_menu/deletemenulogic.go b/app/main/api/internal/logic/admin_menu/deletemenulogic.go index 220914b..1b94285 100644 --- a/app/main/api/internal/logic/admin_menu/deletemenulogic.go +++ b/app/main/api/internal/logic/admin_menu/deletemenulogic.go @@ -27,16 +27,16 @@ func NewDeleteMenuLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Delete func (l *DeleteMenuLogic) DeleteMenu(req *types.DeleteMenuReq) (resp *types.DeleteMenuResp, err error) { // 1. 参数验证 - if req.Id <= 0 { + if req.Id == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "菜单ID必须大于0, id: %d", req.Id) + "菜单ID不能为空, id: %s", req.Id) } // 2. 查询菜单是否存在 menu, err := l.svcCtx.AdminMenuModel.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: %v, id: %s", err, req.Id) } // 3. 检查是否有子菜单 diff --git a/app/main/api/internal/logic/admin_menu/getmenualllogic.go b/app/main/api/internal/logic/admin_menu/getmenualllogic.go index 3ed6fac..cbddae0 100644 --- a/app/main/api/internal/logic/admin_menu/getmenualllogic.go +++ b/app/main/api/internal/logic/admin_menu/getmenualllogic.go @@ -2,8 +2,8 @@ package admin_menu import ( "context" + "database/sql" "sort" - "strconv" "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" @@ -38,14 +38,14 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败, %+v", err) } - // 使用MapReduceVoid并发获取用户角色 - var roleIds []int64 + // 使用MapReduceVoid并发获取用户角色(UUID 字符串) + var roleIds []string var permissions []*struct { - RoleId int64 + RoleId string } type UserRoleResult struct { - RoleId int64 + RoleId string } err = mr.MapReduceVoid( @@ -67,7 +67,7 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge }, func(pipe <-chan *UserRoleResult, cancel func(error)) { for item := range pipe { - permissions = append(permissions, &struct{ RoleId int64 }{RoleId: item.RoleId}) + permissions = append(permissions, &struct{ RoleId string }{RoleId: item.RoleId}) } }, ) @@ -79,14 +79,14 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge roleIds = append(roleIds, permission.RoleId) } - // 使用MapReduceVoid并发获取角色菜单 - var menuIds []int64 + // 使用MapReduceVoid并发获取角色菜单(UUID 字符串) + var menuIds []string var roleMenus []*struct { - MenuId int64 + MenuId string } type RoleMenuResult struct { - MenuId int64 + MenuId string } err = mr.MapReduceVoid( @@ -108,7 +108,7 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge }, func(pipe <-chan *RoleMenuResult, cancel func(error)) { for item := range pipe { - roleMenus = append(roleMenus, &struct{ MenuId int64 }{MenuId: item.MenuId}) + roleMenus = append(roleMenus, &struct{ MenuId string }{MenuId: item.MenuId}) } }, ) @@ -122,8 +122,8 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge // 使用MapReduceVoid并发获取菜单 type AdminMenuStruct struct { - Id int64 - Pid int64 + Id string + Pid sql.NullString Name string Path string Component string @@ -199,8 +199,7 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge return "" }() - menuId := strconv.FormatInt(menu.Id, 10) - menuMap[menuId] = types.GetMenuAllResp{ + menuMap[menu.Id] = types.GetMenuAllResp{ Name: menu.Name, Path: menu.Path, Redirect: redirect, @@ -211,14 +210,17 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge } } - // 按ParentId将菜单分组 - menuGroups := lo.GroupBy(menus, func(item *AdminMenuStruct) int64 { - return item.Pid + // 按ParentId将菜单分组(字符串键) + menuGroups := lo.GroupBy(menus, func(item *AdminMenuStruct) string { + if item.Pid.Valid { + return item.Pid.String + } + return "0" }) - // 递归构建菜单树 - var buildMenuTree func(parentId int64) []types.GetMenuAllResp - buildMenuTree = func(parentId int64) []types.GetMenuAllResp { + // 递归构建菜单树(字符串键) + var buildMenuTree func(parentId string) []types.GetMenuAllResp + buildMenuTree = func(parentId string) []types.GetMenuAllResp { children := make([]types.GetMenuAllResp, 0) childMenus, ok := menuGroups[parentId] @@ -232,8 +234,7 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge }) for _, childMenu := range childMenus { - menuId := strconv.FormatInt(childMenu.Id, 10) - if menu, exists := menuMap[menuId]; exists && childMenu.Status == 1 { + if menu, exists := menuMap[childMenu.Id]; exists && childMenu.Status == 1 { // 递归构建子菜单 menu.Children = buildMenuTree(childMenu.Id) children = append(children, menu) @@ -243,8 +244,8 @@ func (l *GetMenuAllLogic) GetMenuAll(req *types.GetMenuAllReq) (resp *[]types.Ge return children } - // 从根菜单开始构建(ParentId为0的是根菜单) - menuTree := buildMenuTree(0) + // 从根菜单开始构建(ParentId为"0"的是根菜单) + menuTree := buildMenuTree("0") return &menuTree, nil } diff --git a/app/main/api/internal/logic/admin_menu/getmenulistlogic.go b/app/main/api/internal/logic/admin_menu/getmenulistlogic.go index f24ef51..e87602a 100644 --- a/app/main/api/internal/logic/admin_menu/getmenulistlogic.go +++ b/app/main/api/internal/logic/admin_menu/getmenulistlogic.go @@ -54,7 +54,7 @@ func (l *GetMenuListLogic) GetMenuList(req *types.GetMenuListReq) (resp []types. } // 将菜单按ID存入map - menuMap := make(map[int64]types.MenuListItem) + menuMap := make(map[string]types.MenuListItem) for _, menu := range menus { var meta map[string]interface{} err := json.Unmarshal([]byte(menu.Meta), &meta) @@ -69,7 +69,7 @@ func (l *GetMenuListLogic) GetMenuList(req *types.GetMenuListReq) (resp []types. } item := types.MenuListItem{ Id: menu.Id, - Pid: menu.Pid, + Pid: menu.Pid.String, Name: menu.Name, Path: menu.Path, Component: menu.Component, @@ -86,13 +86,13 @@ func (l *GetMenuListLogic) GetMenuList(req *types.GetMenuListReq) (resp []types. // 构建父子关系 for _, menu := range menus { - if menu.Pid > 0 { + if menu.Pid.Valid && menu.Pid.String != "0" { // 找到父菜单 - if parent, exists := menuMap[menu.Pid]; exists { + if parent, exists := menuMap[menu.Pid.String]; exists { // 添加当前菜单到父菜单的子菜单列表 children := append(parent.Children, menuMap[menu.Id]) parent.Children = children - menuMap[menu.Pid] = parent + menuMap[menu.Pid.String] = parent } } } @@ -100,7 +100,7 @@ func (l *GetMenuListLogic) GetMenuList(req *types.GetMenuListReq) (resp []types. // 提取顶级菜单(ParentId为0)到响应列表 result := make([]types.MenuListItem, 0) for _, menu := range menus { - if menu.Pid == 0 { + if menu.Pid.Valid && menu.Pid.String == "0" { result = append(result, menuMap[menu.Id]) } } diff --git a/app/main/api/internal/logic/admin_menu/updatemenulogic.go b/app/main/api/internal/logic/admin_menu/updatemenulogic.go index 05da416..b13798b 100644 --- a/app/main/api/internal/logic/admin_menu/updatemenulogic.go +++ b/app/main/api/internal/logic/admin_menu/updatemenulogic.go @@ -45,13 +45,13 @@ func (l *UpdateMenuLogic) UpdateMenu(req *types.UpdateMenuReq) (resp *types.Upda } // 3. 检查父菜单是否存在(如果不是根菜单) - if req.Pid > 0 { - parentMenu, err := l.svcCtx.AdminMenuModel.FindOne(l.ctx, req.Pid) + if req.Pid != nil && *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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询父菜单失败, id: %s, err: %v", *req.Pid, err) } if parentMenu == nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %d", req.Pid) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "父菜单不存在, id: %s", *req.Pid) } } @@ -68,7 +68,7 @@ func (l *UpdateMenuLogic) UpdateMenu(req *types.UpdateMenuReq) (resp *types.Upda // 5. 更新菜单信息 - menu.Pid = req.Pid + menu.Pid = sql.NullString{String: *req.Pid, Valid: req.Pid != nil} menu.Name = req.Name menu.Path = req.Path menu.Component = req.Component diff --git a/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go b/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go index ad5ba82..a5753ee 100644 --- a/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go +++ b/app/main/api/internal/logic/admin_notification/admincreatenotificationlogic.go @@ -10,6 +10,7 @@ import ( "ycc-server/app/main/model" "ycc-server/common/xerr" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" ) @@ -32,6 +33,7 @@ func (l *AdminCreateNotificationLogic) AdminCreateNotification(req *types.AdminC startDate, _ := time.Parse("2006-01-02", req.StartDate) endDate, _ := time.Parse("2006-01-02", req.EndDate) data := &model.GlobalNotifications{ + Id: uuid.NewString(), Title: req.Title, Content: req.Content, NotificationPage: req.NotificationPage, @@ -45,6 +47,6 @@ func (l *AdminCreateNotificationLogic) AdminCreateNotification(req *types.AdminC 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 + _ = result + return &types.AdminCreateNotificationResp{Id: data.Id}, nil } diff --git a/app/main/api/internal/logic/admin_order/admincreateorderlogic.go b/app/main/api/internal/logic/admin_order/admincreateorderlogic.go index 3a07f4b..46e5361 100644 --- a/app/main/api/internal/logic/admin_order/admincreateorderlogic.go +++ b/app/main/api/internal/logic/admin_order/admincreateorderlogic.go @@ -11,6 +11,7 @@ import ( "ycc-server/app/main/model" "ycc-server/common/xerr" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -48,6 +49,7 @@ func (l *AdminCreateOrderLogic) AdminCreateOrder(req *types.AdminCreateOrderReq) // 创建订单对象 order := &model.Order{ + Id: uuid.NewString(), OrderNo: orderNo, PlatformOrderId: sql.NullString{String: req.PlatformOrderId, Valid: req.PlatformOrderId != ""}, ProductId: product.Id, @@ -58,19 +60,14 @@ func (l *AdminCreateOrderLogic) AdminCreateOrder(req *types.AdminCreateOrderReq) } // 使用事务处理订单创建 - var orderId int64 + var orderId string err = l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 插入订单 - result, err := l.svcCtx.OrderModel.Insert(ctx, session, order) + _, 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) - } + orderId = order.Id return nil }) diff --git a/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go b/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go index 37506ce..8b0a502 100644 --- a/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go +++ b/app/main/api/internal/logic/admin_order/admingetorderlistlogic.go @@ -97,16 +97,16 @@ func (l *AdminGetOrderListLogic) AdminGetOrderList(req *types.AdminGetOrderListR } // 并发获取产品信息和查询状态 - productMap := make(map[int64]string) - queryStateMap := make(map[int64]string) - agentOrderMap := make(map[int64]bool) // 代理订单映射 - agentProcessStatusMap := make(map[int64]string) // 代理处理状态映射 + productMap := make(map[string]string) + queryStateMap := make(map[string]string) + agentOrderMap := make(map[string]bool) // 代理订单映射 + agentProcessStatusMap := make(map[string]string) // 代理处理状态映射 var mu sync.Mutex // 批量获取查询状态 if len(orders) > 0 { - orderIds := make([]int64, 0, len(orders)) + orderIds := make([]string, 0, len(orders)) for _, order := range orders { orderIds = append(orderIds, order.Id) } @@ -121,14 +121,14 @@ func (l *AdminGetOrderListLogic) AdminGetOrderList(req *types.AdminGetOrderListR } // 2. 记录已找到查询状态的订单ID - foundOrderIds := make(map[int64]bool) + foundOrderIds := make(map[string]bool) for _, query := range queries { queryStateMap[query.OrderId] = query.QueryState foundOrderIds[query.OrderId] = true } // 3. 查找未找到查询状态的订单是否在清理日志中 - notFoundOrderIds := make([]int64, 0) + notFoundOrderIds := make([]string, 0) for _, orderId := range orderIds { if !foundOrderIds[orderId] { notFoundOrderIds = append(notFoundOrderIds, orderId) @@ -175,7 +175,7 @@ func (l *AdminGetOrderListLogic) AdminGetOrderList(req *types.AdminGetOrderListR // 对于代理订单,查询代理处理状态 if len(agentOrders) > 0 { - agentOrderIds := make([]int64, 0, len(agentOrders)) + agentOrderIds := make([]string, 0, len(agentOrders)) for _, agentOrder := range agentOrders { agentOrderIds = append(agentOrderIds, agentOrder.OrderId) } @@ -188,13 +188,13 @@ func (l *AdminGetOrderListLogic) AdminGetOrderList(req *types.AdminGetOrderListR } // 记录有佣金记录的订单为处理成功 - processedOrderIds := make(map[int64]bool) + processedOrderIds := make(map[string]bool) for _, commission := range commissions { processedOrderIds[commission.OrderId] = true } // 创建订单状态映射,避免重复查找 - orderStatusMap := make(map[int64]string) + orderStatusMap := make(map[string]string) for _, order := range orders { orderStatusMap[order.Id] = order.Status } diff --git a/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go b/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go index 4bff4f0..d915445 100644 --- a/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go +++ b/app/main/api/internal/logic/admin_order/adminrefundorderlogic.go @@ -1,19 +1,20 @@ package admin_order import ( - "context" - "database/sql" - "fmt" - "time" + "context" + "database/sql" + "fmt" + "time" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/google/uuid" ) const ( @@ -55,7 +56,7 @@ func (l *AdminRefundOrderLogic) AdminRefundOrder(req *types.AdminRefundOrderReq) } // getAndValidateOrder 获取并验证订单信息 -func (l *AdminRefundOrderLogic) getAndValidateOrder(orderId int64, refundAmount float64) (*model.Order, error) { +func (l *AdminRefundOrderLogic) getAndValidateOrder(orderId string, refundAmount float64) (*model.Order, error) { order, err := l.svcCtx.OrderModel.FindOne(l.ctx, orderId) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "AdminRefundOrder, 查询订单失败 err: %v", err) @@ -132,17 +133,18 @@ func (l *AdminRefundOrderLogic) handleWechatRefund(order *model.Order, req *type func (l *AdminRefundOrderLogic) createRefundRecordAndUpdateOrder(order *model.Order, req *types.AdminRefundOrderReq, refundNo, platformRefundId, orderStatus, refundStatus string) error { return l.svcCtx.OrderModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 创建退款记录 - refund := &model.OrderRefund{ - RefundNo: refundNo, - PlatformRefundId: l.createNullString(platformRefundId), - OrderId: order.Id, - UserId: order.UserId, - ProductId: order.ProductId, - RefundAmount: req.RefundAmount, - RefundReason: l.createNullString(req.RefundReason), - Status: refundStatus, // 使用传入的状态,不再硬编码 - RefundTime: sql.NullTime{Time: time.Now(), Valid: true}, - } + refund := &model.OrderRefund{ + Id: uuid.NewString(), + RefundNo: refundNo, + PlatformRefundId: l.createNullString(platformRefundId), + OrderId: order.Id, + UserId: order.UserId, + ProductId: order.ProductId, + RefundAmount: req.RefundAmount, + RefundReason: l.createNullString(req.RefundReason), + Status: refundStatus, // 使用传入的状态,不再硬编码 + RefundTime: sql.NullTime{Time: time.Now(), Valid: true}, + } if _, err := l.svcCtx.OrderRefundModel.Insert(ctx, session, refund); err != nil { return fmt.Errorf("创建退款记录失败: %v", err) @@ -160,17 +162,18 @@ func (l *AdminRefundOrderLogic) createRefundRecordAndUpdateOrder(order *model.Or // createRefundRecordOnly 仅创建退款记录,不更新订单状态(用于退款失败的情况) func (l *AdminRefundOrderLogic) createRefundRecordOnly(order *model.Order, req *types.AdminRefundOrderReq, refundNo, platformRefundId, refundStatus string) error { - refund := &model.OrderRefund{ - RefundNo: refundNo, - PlatformRefundId: l.createNullString(platformRefundId), - OrderId: order.Id, - UserId: order.UserId, - ProductId: order.ProductId, - RefundAmount: req.RefundAmount, - RefundReason: l.createNullString(req.RefundReason), - Status: refundStatus, - RefundTime: sql.NullTime{Time: time.Now(), Valid: true}, - } + refund := &model.OrderRefund{ + Id: uuid.NewString(), + RefundNo: refundNo, + PlatformRefundId: l.createNullString(platformRefundId), + OrderId: order.Id, + UserId: order.UserId, + ProductId: order.ProductId, + RefundAmount: req.RefundAmount, + RefundReason: l.createNullString(req.RefundReason), + Status: refundStatus, + RefundTime: sql.NullTime{Time: time.Now(), Valid: true}, + } _, err := l.svcCtx.OrderRefundModel.Insert(l.ctx, nil, refund) if err != 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 index 4976fff..a78ef19 100644 --- a/app/main/api/internal/logic/admin_platform_user/admincreateplatformuserlogic.go +++ b/app/main/api/internal/logic/admin_platform_user/admincreateplatformuserlogic.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" ) type AdminCreatePlatformUserLogic struct { @@ -37,21 +38,19 @@ func (l *AdminCreatePlatformUserLogic) AdminCreatePlatformUser(req *types.AdminC 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 + user := &model.User{ + Id: uuid.NewString(), + 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) + } + _ = result + resp = &types.AdminCreatePlatformUserResp{Id: user.Id} + 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 index eb35031..1bd61c6 100644 --- a/app/main/api/internal/logic/admin_product/admincreateproductlogic.go +++ b/app/main/api/internal/logic/admin_product/admincreateproductlogic.go @@ -8,6 +8,7 @@ import ( "ycc-server/app/main/model" "ycc-server/common/xerr" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -30,6 +31,7 @@ func NewAdminCreateProductLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminCreateProductLogic) AdminCreateProduct(req *types.AdminCreateProductReq) (resp *types.AdminCreateProductResp, err error) { // 1. 数据转换 data := &model.Product{ + Id: uuid.NewString(), ProductName: req.ProductName, ProductEn: req.ProductEn, Description: req.Description, @@ -39,23 +41,19 @@ func (l *AdminCreateProductLogic) AdminCreateProduct(req *types.AdminCreateProdu } // 2. 数据库操作(使用事务确保产品表和代理产品配置表同步) - var productId int64 + var productId string err = l.svcCtx.ProductModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 2.1 插入产品 - result, err := l.svcCtx.ProductModel.Insert(ctx, session, data) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), - "创建产品失败, err: %v, req: %+v", err, req) - } - - productId, err = result.LastInsertId() + _, err := l.svcCtx.ProductModel.Insert(ctx, session, data) if err != nil { return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), - "获取产品ID失败, err: %v", err) + "创建产品失败, err: %v, req: %+v", err, req) } + productId = data.Id // 2.2 同步创建代理产品配置(使用默认值) agentProductConfig := &model.AgentProductConfig{ + Id: uuid.NewString(), ProductId: productId, BasePrice: 0.00, // 默认基础底价 SystemMaxPrice: 9999.99, // 默认系统价格上限 @@ -66,7 +64,7 @@ func (l *AdminCreateProductLogic) AdminCreateProduct(req *types.AdminCreateProdu _, err = l.svcCtx.AgentProductConfigModel.Insert(ctx, session, agentProductConfig) if err != nil { return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), - "创建代理产品配置失败, err: %v, productId: %d", err, productId) + "创建代理产品配置失败, err: %v, productId: %s", err, productId) } return nil diff --git a/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go b/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go index 26b910c..8b822dc 100644 --- a/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go +++ b/app/main/api/internal/logic/admin_product/admingetproductfeaturelistlogic.go @@ -39,7 +39,7 @@ func (l *AdminGetProductFeatureListLogic) AdminGetProductFeatureList(req *types. } // 3. 获取所有功能ID - featureIds := make([]int64, 0, len(list)) + featureIds := make([]string, 0, len(list)) for _, item := range list { featureIds = append(featureIds, item.FeatureId) } @@ -55,13 +55,13 @@ func (l *AdminGetProductFeatureListLogic) AdminGetProductFeatureList(req *types. for i, id := range featureIds { source <- struct { index int - id int64 + id string }{i, id} } }, func(item interface{}, writer mr.Writer[featureResult], cancel func(error)) { data := item.(struct { index int - id int64 + id string }) feature, err := l.svcCtx.FeatureModel.FindOne(l.ctx, data.id) writer.Write(featureResult{ @@ -71,7 +71,7 @@ func (l *AdminGetProductFeatureListLogic) AdminGetProductFeatureList(req *types. }, 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) + l.Logger.Errorf("查询功能详情失败, feature_id: %s, err: %v", result.feature.Id, result.err) continue } results = append(results, result) @@ -84,7 +84,7 @@ func (l *AdminGetProductFeatureListLogic) AdminGetProductFeatureList(req *types. } // 5. 构建功能ID到详情的映射 - featureMap := make(map[int64]*model.Feature) + featureMap := make(map[string]*model.Feature) for _, result := range results { if result.feature != nil { featureMap[result.feature.Id] = result.feature diff --git a/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go b/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go index 4ae5acd..6084899 100644 --- a/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go +++ b/app/main/api/internal/logic/admin_product/adminupdateproductfeatureslogic.go @@ -1,17 +1,18 @@ package admin_product import ( - "context" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" - "sync" + "context" + "sync" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-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" + "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" + "github.com/google/uuid" ) type AdminUpdateProductFeaturesLogic struct { @@ -39,13 +40,13 @@ func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types. } // 2. 构建现有关联的映射 - existingMap := make(map[int64]*model.ProductFeature) + existingMap := make(map[string]*model.ProductFeature) for _, item := range existingList { existingMap[item.FeatureId] = item } // 3. 构建新关联的映射 - newMap := make(map[int64]*types.ProductFeatureItem) + newMap := make(map[string]*types.ProductFeatureItem) for _, item := range req.Features { newMap[item.FeatureId] = &item } @@ -54,7 +55,7 @@ func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types. err = l.svcCtx.ProductFeatureModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 4.1 处理需要删除的关联 var mu sync.Mutex - var deleteIds []int64 + var deleteIds []string err = mr.MapReduceVoid(func(source chan<- interface{}) { for featureId, existing := range existingMap { if _, exists := newMap[featureId]; !exists { @@ -62,7 +63,7 @@ func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types. } } }, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { - id := item.(int64) + id := item.(string) mu.Lock() deleteIds = append(deleteIds, id) mu.Unlock() @@ -90,7 +91,7 @@ func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types. err = mr.MapReduceVoid(func(source chan<- interface{}) { for featureId, newItem := range newMap { source <- struct { - featureId int64 + featureId string newItem *types.ProductFeatureItem existing *model.ProductFeature }{ @@ -101,7 +102,7 @@ func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types. } }, func(item interface{}, writer mr.Writer[struct{}], cancel func(error)) { data := item.(struct { - featureId int64 + featureId string newItem *types.ProductFeatureItem existing *model.ProductFeature }) @@ -119,14 +120,15 @@ func (l *AdminUpdateProductFeaturesLogic) AdminUpdateProductFeatures(req *types. return } } else { - // 新增关联 - newFeature := &model.ProductFeature{ - ProductId: req.ProductId, - FeatureId: data.featureId, - Sort: data.newItem.Sort, - Enable: data.newItem.Enable, - IsImportant: data.newItem.IsImportant, - } + // 新增关联 + newFeature := &model.ProductFeature{ + Id: uuid.NewString(), + 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", diff --git a/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go b/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go index f7ad5a8..3cf91ec 100644 --- a/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go +++ b/app/main/api/internal/logic/admin_query/admingetquerycleanupdetaillistlogic.go @@ -2,12 +2,12 @@ package admin_query import ( "context" + "sync" "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" "ycc-server/app/main/model" "ycc-server/common/globalkey" "ycc-server/common/xerr" - "sync" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" @@ -66,23 +66,23 @@ func (l *AdminGetQueryCleanupDetailListLogic) AdminGetQueryCleanupDetailList(req } // 4. 获取所有产品ID - productIds := make([]int64, 0, len(details)) + productIds := make([]string, 0, len(details)) for _, detail := range details { productIds = append(productIds, detail.ProductId) } // 5. 并发获取产品信息 - productMap := make(map[int64]string) + productMap := make(map[string]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) + productId := item.(string) 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)) + cancel(errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询产品信息失败, product_id: %s, err: %v", productId, err)) return } mu.Lock() diff --git a/app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go b/app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go index 44fba27..cdb48cc 100644 --- a/app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go +++ b/app/main/api/internal/logic/admin_query/admingetquerydetailbyorderidlogic.go @@ -135,7 +135,7 @@ func ProcessQueryParams(QueryParams string, target *map[string]interface{}, key return nil } -func (l *AdminGetQueryDetailByOrderIdLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.AdminQueryItem) error { +func (l *AdminGetQueryDetailByOrderIdLogic) UpdateFeatureAndProductFeature(productID string, target *[]types.AdminQueryItem) error { // 遍历 target 数组,使用倒序遍历,以便删除元素时不影响索引 for i := len(*target) - 1; i >= 0; i-- { queryItem := &(*target)[i] diff --git a/app/main/api/internal/logic/admin_role/createrolelogic.go b/app/main/api/internal/logic/admin_role/createrolelogic.go index 30f7f41..36294e8 100644 --- a/app/main/api/internal/logic/admin_role/createrolelogic.go +++ b/app/main/api/internal/logic/admin_role/createrolelogic.go @@ -11,6 +11,7 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/google/uuid" ) type CreateRoleLogic struct { @@ -37,37 +38,36 @@ func (l *CreateRoleLogic) CreateRole(req *types.CreateRoleReq) (resp *types.Crea 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 + role := &model.AdminRole{ + Id: uuid.NewString(), + RoleName: req.RoleName, + RoleCode: req.RoleCode, + Description: req.Description, + Status: req.Status, + Sort: req.Sort, + } + var roleId string // 使用事务创建角色和关联菜单 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失败") - } + _, err := l.svcCtx.AdminRoleModel.Insert(ctx, session, role) + if err != nil { + return errors.New("插入新角色失败") + } + roleId = role.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("插入角色菜单关联失败") - } + roleMenu := &model.AdminRoleMenu{ + Id: uuid.NewString(), + RoleId: roleId, + MenuId: menuId, + } + _, err = l.svcCtx.AdminRoleMenuModel.Insert(ctx, session, roleMenu) + if err != nil { + return errors.New("插入角色菜单关联失败") + } } } @@ -77,7 +77,7 @@ func (l *CreateRoleLogic) CreateRole(req *types.CreateRoleReq) (resp *types.Crea return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建角色失败: %v", err) } - return &types.CreateRoleResp{ - Id: roleId, - }, nil + return &types.CreateRoleResp{ + Id: roleId, + }, nil } diff --git a/app/main/api/internal/logic/admin_role/getroledetaillogic.go b/app/main/api/internal/logic/admin_role/getroledetaillogic.go index 3139184..43ba881 100644 --- a/app/main/api/internal/logic/admin_role/getroledetaillogic.go +++ b/app/main/api/internal/logic/admin_role/getroledetaillogic.go @@ -32,7 +32,7 @@ func NewGetRoleDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Get func (l *GetRoleDetailLogic) GetRoleDetail(req *types.GetRoleDetailReq) (resp *types.GetRoleDetailResp, err error) { // 使用MapReduceVoid并发获取角色信息和菜单ID var role *model.AdminRole - var menuIds []int64 + var menuIds []string var mutex sync.Mutex var wg sync.WaitGroup @@ -62,7 +62,7 @@ func (l *GetRoleDetailLogic) GetRoleDetail(req *types.GetRoleDetailReq) (resp *t return } mutex.Lock() - menuIds = lo.Map(menus, func(item *model.AdminRoleMenu, _ int) int64 { + menuIds = lo.Map(menus, func(item *model.AdminRoleMenu, _ int) string { return item.MenuId }) mutex.Unlock() diff --git a/app/main/api/internal/logic/admin_role/getrolelistlogic.go b/app/main/api/internal/logic/admin_role/getrolelistlogic.go index f84851f..f2cbbff 100644 --- a/app/main/api/internal/logic/admin_role/getrolelistlogic.go +++ b/app/main/api/internal/logic/admin_role/getrolelistlogic.go @@ -106,7 +106,7 @@ func (l *GetRoleListLogic) GetRoleList(req *types.GetRoleListReq) (resp *types.G for _, role := range roles { source <- role } - }, func(item interface{}, writer mr.Writer[[]int64], cancel func(error)) { + }, func(item interface{}, writer mr.Writer[[]string], cancel func(error)) { role := item.(*model.AdminRole) // 获取角色关联的菜单ID @@ -117,12 +117,12 @@ func (l *GetRoleListLogic) GetRoleList(req *types.GetRoleListReq) (resp *types.G cancel(err) return } - menuIds := lo.Map(menus, func(item *model.AdminRoleMenu, _ int) int64 { + menuIds := lo.Map(menus, func(item *model.AdminRoleMenu, _ int) string { return item.MenuId }) writer.Write(menuIds) - }, func(pipe <-chan []int64, cancel func(error)) { + }, func(pipe <-chan []string, cancel func(error)) { for _, role := range roles { menuIds := <-pipe item := types.RoleListItem{ diff --git a/app/main/api/internal/logic/admin_role/updaterolelogic.go b/app/main/api/internal/logic/admin_role/updaterolelogic.go index d71de13..ab538f6 100644 --- a/app/main/api/internal/logic/admin_role/updaterolelogic.go +++ b/app/main/api/internal/logic/admin_role/updaterolelogic.go @@ -1,17 +1,18 @@ package admin_role import ( - "context" + "context" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-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" + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/google/uuid" ) type UpdateRoleLogic struct { @@ -83,7 +84,7 @@ func (l *UpdateRoleLogic) UpdateRole(req *types.UpdateRoleReq) (resp *types.Upda } // 2. 转换为map便于查找 - currentMenuMap := make(map[int64]*model.AdminRoleMenu) + currentMenuMap := make(map[string]*model.AdminRoleMenu) for _, menu := range currentMenus { currentMenuMap[menu.MenuId] = menu } @@ -92,13 +93,13 @@ func (l *UpdateRoleLogic) UpdateRole(req *types.UpdateRoleReq) (resp *types.Upda 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) + return errors.Wrapf(xerr.NewErrMsg("菜单不存在"), "菜单ID: %s", menuId) } } // 4. 找出需要删除和新增的关联 var toDelete []*model.AdminRoleMenu - var toInsert []int64 + var toInsert []string // 需要删除的:当前存在但新列表中没有的 for menuId, roleMenu := range currentMenuMap { @@ -123,16 +124,17 @@ func (l *UpdateRoleLogic) UpdateRole(req *types.UpdateRoleReq) (resp *types.Upda } // 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) - } - } + for _, menuId := range toInsert { + roleMenu := &model.AdminRoleMenu{ + Id: uuid.NewString(), + 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 diff --git a/app/main/api/internal/logic/admin_role_api/adminassignroleapilogic.go b/app/main/api/internal/logic/admin_role_api/adminassignroleapilogic.go index c86f87e..ba7fee9 100644 --- a/app/main/api/internal/logic/admin_role_api/adminassignroleapilogic.go +++ b/app/main/api/internal/logic/admin_role_api/adminassignroleapilogic.go @@ -1,15 +1,16 @@ package admin_role_api import ( - "context" + "context" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" ) type AdminAssignRoleApiLogic struct { @@ -28,9 +29,9 @@ func NewAdminAssignRoleApiLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminAssignRoleApiLogic) AdminAssignRoleApi(req *types.AdminAssignRoleApiReq) (resp *types.AdminAssignRoleApiResp, err error) { // 1. 参数验证 - if req.RoleId <= 0 { + if req.RoleId == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "角色ID必须大于0, roleId: %d", req.RoleId) + "角色ID不能为空, roleId: %s", req.RoleId) } if len(req.ApiIds) == 0 { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), @@ -51,7 +52,7 @@ func (l *AdminAssignRoleApiLogic) AdminAssignRoleApi(req *types.AdminAssignRoleA // 3. 批量分配API权限 successCount := 0 for _, apiId := range req.ApiIds { - if apiId <= 0 { + if apiId == "" { continue } @@ -59,10 +60,10 @@ func (l *AdminAssignRoleApiLogic) AdminAssignRoleApi(req *types.AdminAssignRoleA _, err := l.svcCtx.AdminApiModel.FindOne(l.ctx, apiId) if err != nil { if errors.Is(err, model.ErrNotFound) { - logx.Errorf("API不存在, apiId: %d", apiId) + logx.Errorf("API不存在, apiId: %s", apiId) continue } - logx.Errorf("查询API失败, err: %v, apiId: %d", err, apiId) + logx.Errorf("查询API失败, err: %v, apiId: %s", err, apiId) continue } @@ -77,10 +78,11 @@ func (l *AdminAssignRoleApiLogic) AdminAssignRoleApi(req *types.AdminAssignRoleA } // 创建关联 - roleApiData := &model.AdminRoleApi{ - RoleId: req.RoleId, - ApiId: apiId, - } + roleApiData := &model.AdminRoleApi{ + Id: uuid.NewString(), + RoleId: req.RoleId, + ApiId: apiId, + } _, err = l.svcCtx.AdminRoleApiModel.Insert(l.ctx, nil, roleApiData) if err != nil { diff --git a/app/main/api/internal/logic/admin_role_api/admingetallapilistlogic.go b/app/main/api/internal/logic/admin_role_api/admingetallapilistlogic.go index 57ee234..ba64ee9 100644 --- a/app/main/api/internal/logic/admin_role_api/admingetallapilistlogic.go +++ b/app/main/api/internal/logic/admin_role_api/admingetallapilistlogic.go @@ -28,7 +28,7 @@ func NewAdminGetAllApiListLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminGetAllApiListLogic) AdminGetAllApiList(req *types.AdminGetAllApiListReq) (resp *types.AdminGetAllApiListResp, err error) { // 1. 构建查询条件 builder := l.svcCtx.AdminApiModel.SelectBuilder() - + // 添加状态过滤 if req.Status > 0 { builder = builder.Where("status = ?", req.Status) @@ -45,8 +45,8 @@ func (l *AdminGetAllApiListLogic) AdminGetAllApiList(req *types.AdminGetAllApiLi var apiList []types.AdminRoleApiInfo for _, api := range apis { apiList = append(apiList, types.AdminRoleApiInfo{ - Id: 0, // 这里不是关联ID,而是API ID - RoleId: 0, // 这里不是角色ID + Id: api.Id, + RoleId: "", ApiId: api.Id, ApiName: api.ApiName, ApiCode: api.ApiCode, diff --git a/app/main/api/internal/logic/admin_role_api/admingetroleapilistlogic.go b/app/main/api/internal/logic/admin_role_api/admingetroleapilistlogic.go index 0d71401..b4e2062 100644 --- a/app/main/api/internal/logic/admin_role_api/admingetroleapilistlogic.go +++ b/app/main/api/internal/logic/admin_role_api/admingetroleapilistlogic.go @@ -28,9 +28,9 @@ func NewAdminGetRoleApiListLogic(ctx context.Context, svcCtx *svc.ServiceContext func (l *AdminGetRoleApiListLogic) AdminGetRoleApiList(req *types.AdminGetRoleApiListReq) (resp *types.AdminGetRoleApiListResp, err error) { // 1. 参数验证 - if req.RoleId <= 0 { + if req.RoleId == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "角色ID必须大于0, roleId: %d", req.RoleId) + "角色ID不能为空, roleId: %s", req.RoleId) } // 2. 查询角色是否存在 @@ -38,7 +38,7 @@ func (l *AdminGetRoleApiListLogic) AdminGetRoleApiList(req *types.AdminGetRoleAp if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), - "角色不存在, roleId: %d", req.RoleId) + "角色不存在, roleId: %s", req.RoleId) } return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询角色失败, err: %v, roleId: %d", err, req.RoleId) @@ -47,7 +47,7 @@ func (l *AdminGetRoleApiListLogic) AdminGetRoleApiList(req *types.AdminGetRoleAp // 3. 查询角色API权限列表 builder := l.svcCtx.AdminRoleApiModel.SelectBuilder(). Where("role_id = ?", req.RoleId) - + roleApis, err := l.svcCtx.AdminRoleApiModel.FindAll(l.ctx, builder, "") if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), diff --git a/app/main/api/internal/logic/admin_role_api/adminremoveroleapilogic.go b/app/main/api/internal/logic/admin_role_api/adminremoveroleapilogic.go index a8177f5..e9746fd 100644 --- a/app/main/api/internal/logic/admin_role_api/adminremoveroleapilogic.go +++ b/app/main/api/internal/logic/admin_role_api/adminremoveroleapilogic.go @@ -28,9 +28,9 @@ func NewAdminRemoveRoleApiLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminRemoveRoleApiLogic) AdminRemoveRoleApi(req *types.AdminRemoveRoleApiReq) (resp *types.AdminRemoveRoleApiResp, err error) { // 1. 参数验证 - if req.RoleId <= 0 { + if req.RoleId == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "角色ID必须大于0, roleId: %d", req.RoleId) + "角色ID不能为空, roleId: %s", req.RoleId) } if len(req.ApiIds) == 0 { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), @@ -51,7 +51,7 @@ func (l *AdminRemoveRoleApiLogic) AdminRemoveRoleApi(req *types.AdminRemoveRoleA // 3. 批量移除API权限 successCount := 0 for _, apiId := range req.ApiIds { - if apiId <= 0 { + if apiId == "" { continue } @@ -61,7 +61,7 @@ func (l *AdminRemoveRoleApiLogic) AdminRemoveRoleApi(req *types.AdminRemoveRoleA if errors.Is(err, model.ErrNotFound) { continue // 不存在,跳过 } - logx.Errorf("查询角色API关联失败, err: %v, roleId: %d, apiId: %d", err, req.RoleId, apiId) + logx.Errorf("查询角色API关联失败, err: %v, roleId: %s, apiId: %s", err, req.RoleId, apiId) continue } diff --git a/app/main/api/internal/logic/admin_role_api/adminupdateroleapilogic.go b/app/main/api/internal/logic/admin_role_api/adminupdateroleapilogic.go index 5c5fe2f..cb657d9 100644 --- a/app/main/api/internal/logic/admin_role_api/adminupdateroleapilogic.go +++ b/app/main/api/internal/logic/admin_role_api/adminupdateroleapilogic.go @@ -1,15 +1,16 @@ package admin_role_api import ( - "context" + "context" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" ) type AdminUpdateRoleApiLogic struct { @@ -28,9 +29,9 @@ func NewAdminUpdateRoleApiLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminUpdateRoleApiLogic) AdminUpdateRoleApi(req *types.AdminUpdateRoleApiReq) (resp *types.AdminUpdateRoleApiResp, err error) { // 1. 参数验证 - if req.RoleId <= 0 { + if req.RoleId == "" { return nil, errors.Wrapf(xerr.NewErrCode(xerr.PARAM_VERIFICATION_ERROR), - "角色ID必须大于0, roleId: %d", req.RoleId) + "角色ID不能为空, roleId: %s", req.RoleId) } // 2. 查询角色是否存在 @@ -38,10 +39,10 @@ func (l *AdminUpdateRoleApiLogic) AdminUpdateRoleApi(req *types.AdminUpdateRoleA if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), - "角色不存在, roleId: %d", req.RoleId) + "角色不存在, roleId: %s", req.RoleId) } return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), - "查询角色失败, err: %v, roleId: %d", err, req.RoleId) + "查询角色失败, err: %v, roleId: %s", err, req.RoleId) } // 3. 删除该角色的所有API权限 @@ -63,7 +64,7 @@ func (l *AdminUpdateRoleApiLogic) AdminUpdateRoleApi(req *types.AdminUpdateRoleA // 4. 添加新的API权限 if len(req.ApiIds) > 0 { for _, apiId := range req.ApiIds { - if apiId <= 0 { + if apiId == "" { continue } @@ -71,18 +72,19 @@ func (l *AdminUpdateRoleApiLogic) AdminUpdateRoleApi(req *types.AdminUpdateRoleA _, err := l.svcCtx.AdminApiModel.FindOne(l.ctx, apiId) if err != nil { if errors.Is(err, model.ErrNotFound) { - logx.Errorf("API不存在, apiId: %d", apiId) + logx.Errorf("API不存在, apiId: %s", apiId) continue } - logx.Errorf("查询API失败, err: %v, apiId: %d", err, apiId) + logx.Errorf("查询API失败, err: %v, apiId: %s", err, apiId) continue } // 创建新的关联 - roleApiData := &model.AdminRoleApi{ - RoleId: req.RoleId, - ApiId: apiId, - } + roleApiData := &model.AdminRoleApi{ + Id: uuid.NewString(), + RoleId: req.RoleId, + ApiId: apiId, + } _, err = l.svcCtx.AdminRoleApiModel.Insert(l.ctx, nil, roleApiData) if err != nil { diff --git a/app/main/api/internal/logic/admin_user/admincreateuserlogic.go b/app/main/api/internal/logic/admin_user/admincreateuserlogic.go index 97fc707..7dd07a4 100644 --- a/app/main/api/internal/logic/admin_user/admincreateuserlogic.go +++ b/app/main/api/internal/logic/admin_user/admincreateuserlogic.go @@ -9,6 +9,7 @@ import ( "ycc-server/common/xerr" "ycc-server/pkg/lzkit/crypto" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -43,8 +44,9 @@ func (l *AdminCreateUserLogic) AdminCreateUser(req *types.AdminCreateUserReq) (r } // 创建用户 user := &model.AdminUser{ + Id: uuid.NewString(), Username: req.Username, - Password: password, // 注意:实际应用中需要加密密码 + Password: password, RealName: req.RealName, Status: req.Status, } @@ -52,20 +54,16 @@ func (l *AdminCreateUserLogic) AdminCreateUser(req *types.AdminCreateUserReq) (r // 使用事务创建用户和关联角色 err = l.svcCtx.AdminUserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { // 创建用户 - result, err := l.svcCtx.AdminUserModel.Insert(ctx, session, user) + _, 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, + Id: uuid.NewString(), + UserId: user.Id, RoleId: roleId, } _, err = l.svcCtx.AdminUserRoleModel.Insert(ctx, session, userRole) diff --git a/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go b/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go index 0223c32..ae4e9c2 100644 --- a/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go +++ b/app/main/api/internal/logic/admin_user/admingetuserdetaillogic.go @@ -31,7 +31,7 @@ func NewAdminGetUserDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *AdminGetUserDetailLogic) AdminGetUserDetail(req *types.AdminGetUserDetailReq) (resp *types.AdminGetUserDetailResp, err error) { // 使用MapReduceVoid并发获取用户信息和角色ID var user *model.AdminUser - var roleIds []int64 + var roleIds []string var mutex sync.Mutex var wg sync.WaitGroup @@ -61,7 +61,7 @@ func (l *AdminGetUserDetailLogic) AdminGetUserDetail(req *types.AdminGetUserDeta return } mutex.Lock() - roleIds = lo.Map(roles, func(item *model.AdminUserRole, _ int) int64 { + roleIds = lo.Map(roles, func(item *model.AdminUserRole, _ int) string { return item.RoleId }) mutex.Unlock() diff --git a/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go b/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go index 663f990..695181b 100644 --- a/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go +++ b/app/main/api/internal/logic/admin_user/admingetuserlistlogic.go @@ -109,7 +109,7 @@ func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq) for _, user := range users { source <- user } - }, func(item interface{}, writer mr.Writer[[]int64], cancel func(error)) { + }, func(item interface{}, writer mr.Writer[[]string], cancel func(error)) { user := item.(*model.AdminUser) // 获取用户关联的角色ID @@ -120,12 +120,12 @@ func (l *AdminGetUserListLogic) AdminGetUserList(req *types.AdminGetUserListReq) cancel(err) return } - roleIds := lo.Map(roles, func(item *model.AdminUserRole, _ int) int64 { + roleIds := lo.Map(roles, func(item *model.AdminUserRole, _ int) string { return item.RoleId }) writer.Write(roleIds) - }, func(pipe <-chan []int64, cancel func(error)) { + }, func(pipe <-chan []string, cancel func(error)) { for _, user := range users { roleIds := <-pipe item := types.AdminUserListItem{ diff --git a/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go b/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go index 49d97a5..4bd208c 100644 --- a/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go +++ b/app/main/api/internal/logic/admin_user/adminupdateuserlogic.go @@ -1,17 +1,18 @@ package admin_user import ( - "context" + "context" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-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" + "github.com/pkg/errors" + "github.com/samber/lo" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/google/uuid" ) type AdminUpdateUserLogic struct { @@ -76,7 +77,7 @@ func (l *AdminUpdateUserLogic) AdminUpdateUser(req *types.AdminUpdateUserReq) (r } // 2. 转换为map便于查找 - currentRoleMap := make(map[int64]*model.AdminUserRole) + currentRoleMap := make(map[string]*model.AdminUserRole) for _, role := range currentRoles { currentRoleMap[role.RoleId] = role } @@ -85,13 +86,13 @@ func (l *AdminUpdateUserLogic) AdminUpdateUser(req *types.AdminUpdateUserReq) (r 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) + return errors.Wrapf(xerr.NewErrMsg("角色不存在"), "角色ID: %s", roleId) } } // 4. 找出需要删除和新增的关联 var toDelete []*model.AdminUserRole - var toInsert []int64 + var toInsert []string // 需要删除的:当前存在但新列表中没有的 for roleId, userRole := range currentRoleMap { @@ -116,16 +117,17 @@ func (l *AdminUpdateUserLogic) AdminUpdateUser(req *types.AdminUpdateUserReq) (r } // 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) - } - } + for _, roleId := range toInsert { + userRole := &model.AdminUserRole{ + Id: uuid.NewString(), + 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 diff --git a/app/main/api/internal/logic/admin_user/adminuserinfologic.go b/app/main/api/internal/logic/admin_user/adminuserinfologic.go index 48d9cab..448e70e 100644 --- a/app/main/api/internal/logic/admin_user/adminuserinfologic.go +++ b/app/main/api/internal/logic/admin_user/adminuserinfologic.go @@ -45,7 +45,7 @@ func (l *AdminUserInfoLogic) AdminUserInfo(req *types.AdminUserInfoReq) (resp *t } // 获取角色ID数组 - roleIds := make([]int64, 0) + roleIds := make([]string, 0) for _, permission := range permissions { roleIds = append(roleIds, permission.RoleId) } diff --git a/app/main/api/internal/logic/agent/applyforagentlogic.go b/app/main/api/internal/logic/agent/applyforagentlogic.go index 1a4b7fa..12f46d7 100644 --- a/app/main/api/internal/logic/agent/applyforagentlogic.go +++ b/app/main/api/internal/logic/agent/applyforagentlogic.go @@ -1,19 +1,22 @@ package agent import ( - "context" - "database/sql" - "fmt" - "os" - "time" - "ycc-server/app/main/model" - "ycc-server/common/ctxdata" - "ycc-server/common/xerr" - "ycc-server/pkg/lzkit/crypto" + "context" + "database/sql" + "fmt" + "os" + "time" + "ycc-server/app/main/model" + "ycc-server/common/ctxdata" + "ycc-server/common/globalkey" + "ycc-server/common/xerr" + "ycc-server/pkg/lzkit/crypto" + "strconv" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/google/uuid" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/redis" + "github.com/zeromicro/go-zero/core/stores/sqlx" "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" @@ -47,10 +50,9 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err) } - // 1. 必须提供邀请码,用户不能自主成为代理 - if req.InviteCode == "" { - return nil, errors.Wrapf(xerr.NewErrMsg("必须提供邀请码才能成为代理,请联系平台或代理获取邀请码"), "") - } + if req.Referrer == "" { + return nil, errors.Wrapf(xerr.NewErrMsg("请填写邀请信息"), "") + } // 2. 校验验证码(开发环境下跳过验证码校验) if os.Getenv("ENV") != "development" { @@ -67,7 +69,7 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type } } - var userID int64 + var userID string transErr := l.svcCtx.AgentModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 1. 处理用户注册/绑定 user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, sql.NullString{String: encryptedMobile, Valid: true}) @@ -88,15 +90,11 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type // 用户已存在 if claims != nil && claims.UserType == model.UserTypeTemp { // 临时用户,检查手机号是否已绑定其他微信号 - userTemp, err := l.svcCtx.UserTempModel.FindOne(l.ctx, claims.UserId) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询临时用户失败, %v", err) + userAuth, findUserAuthErr := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, user.Id, claims.AuthType) + if findUserAuthErr != nil && !errors.Is(findUserAuthErr, model.ErrNotFound) { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户认证失败, %v", findUserAuthErr) } - userAuth, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, user.Id, userTemp.AuthType) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户认证失败, %v", err) - } - if userAuth != nil && userAuth.AuthKey != userTemp.AuthKey { + if userAuth != nil && userAuth.AuthKey != claims.AuthKey { return errors.Wrapf(xerr.NewErrMsg("该手机号已绑定其他微信号"), "") } // 临时用户,转为正式用户 @@ -117,40 +115,53 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type return errors.Wrapf(xerr.NewErrMsg("您已经是代理"), "") } - // 4. 必须通过邀请码成为代理(没有其他途径) - // 4.1 查询邀请码 - inviteCodeModel, err := l.svcCtx.AgentInviteCodeModel.FindOneByCode(transCtx, req.InviteCode) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(xerr.NewErrMsg("邀请码不存在"), "") - } - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请码失败, %v", err) - } + var inviteCodeModel *model.AgentInviteCode + var parentAgentId string + var targetLevel int64 - // 4.2 验证邀请码状态 - // 钻石级别的邀请码只能使用一次,使用后立即失效 - // 普通级别的邀请码可以无限使用 - if inviteCodeModel.Status != 0 { - if inviteCodeModel.Status == 1 { - return errors.Wrapf(xerr.NewErrMsg("邀请码已使用"), "") - } - return errors.Wrapf(xerr.NewErrMsg("邀请码已失效"), "") - } - - // 4.3 验证邀请码是否过期 - if inviteCodeModel.ExpireTime.Valid && inviteCodeModel.ExpireTime.Time.Before(time.Now()) { - return errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "") - } - - // 4.4 获取邀请码信息 - targetLevel := inviteCodeModel.TargetLevel - var parentAgentId int64 = 0 - if inviteCodeModel.AgentId.Valid { - parentAgentId = inviteCodeModel.AgentId.Int64 - } + inviteCodeModel, err = l.svcCtx.AgentInviteCodeModel.FindOneByCode(transCtx, req.Referrer) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请码失败, %v", err) + } + if inviteCodeModel != nil { + if inviteCodeModel.Status != 0 { + if inviteCodeModel.Status == 1 { + return errors.Wrapf(xerr.NewErrMsg("邀请码已使用"), "") + } + return errors.Wrapf(xerr.NewErrMsg("邀请码已失效"), "") + } + if inviteCodeModel.ExpireTime.Valid && inviteCodeModel.ExpireTime.Time.Before(time.Now()) { + return errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "") + } + targetLevel = inviteCodeModel.TargetLevel + if inviteCodeModel.AgentId.Valid { + parentAgentId = inviteCodeModel.AgentId.String + } + } else { + if codeVal, parseErr := strconv.ParseInt(req.Referrer, 10, 64); parseErr == nil && codeVal > 0 { + parentAgent, err := l.findAgentByCode(transCtx, codeVal) + if err != nil { + return err + } + parentAgentId = parentAgent.Id + targetLevel = 1 + } else { + encRefMobile, _ := crypto.EncryptMobile(req.Referrer, l.svcCtx.Config.Encrypt.SecretKey) + agents, findErr := l.svcCtx.AgentModel.FindAll(transCtx, l.svcCtx.AgentModel.SelectBuilder().Where("mobile = ? AND del_state = ?", encRefMobile, globalkey.DelStateNo).Limit(1), "") + if findErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询上级代理失败, %v", findErr) + } + if len(agents) == 0 { + return errors.Wrapf(xerr.NewErrMsg("邀请信息无效"), "") + } + parentAgentId = agents[0].Id + targetLevel = 1 + } + } // 4.5 创建代理记录 newAgent := &model.Agent{ + Id: uuid.NewString(), UserId: userID, Level: targetLevel, Mobile: encryptedMobile, @@ -160,7 +171,7 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type } // 4.6 处理上级关系 - if parentAgentId > 0 { + if parentAgentId != "" { // 代理发放的邀请码,成为该代理的下级 parentAgent, err := l.svcCtx.AgentModel.FindOne(transCtx, parentAgentId) if err != nil { @@ -177,23 +188,23 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type if err != nil { return errors.Wrapf(err, "查找团队首领失败") } - if teamLeaderId > 0 { - newAgent.TeamLeaderId = sql.NullInt64{Int64: teamLeaderId, Valid: true} + if teamLeaderId != "" { + newAgent.TeamLeaderId = sql.NullString{String: teamLeaderId, Valid: true} } - // 先插入代理记录 - agentResult, err := l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) + newAgent.AgentCode = 0 + _, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) if err != nil { return errors.Wrapf(err, "创建代理记录失败") } - agentId, _ := agentResult.LastInsertId() - newAgent.Id = agentId + // 已设置newAgent.Id为UUID // 建立关系 relation := &model.AgentRelation{ + Id: uuid.NewString(), ParentId: parentAgent.Id, - ChildId: agentId, - RelationType: 1, // 直接关系 + ChildId: newAgent.Id, + RelationType: 1, } if _, err := l.svcCtx.AgentRelationModel.Insert(transCtx, session, relation); err != nil { return errors.Wrapf(err, "建立代理关系失败") @@ -201,29 +212,28 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type } else { // 平台发放的钻石邀请码,独立成团队 if targetLevel == 3 { - agentResult, err := l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) + newAgent.AgentCode = 0 + _, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) if err != nil { return errors.Wrapf(err, "创建代理记录失败") } - agentId, _ := agentResult.LastInsertId() - newAgent.Id = agentId - // 设置自己为团队首领 - newAgent.TeamLeaderId = sql.NullInt64{Int64: agentId, Valid: true} + newAgent.TeamLeaderId = sql.NullString{String: newAgent.Id, Valid: true} if err := l.svcCtx.AgentModel.UpdateInTransaction(transCtx, session, newAgent); err != nil { return errors.Wrapf(err, "更新团队首领失败") } } else { - agentResult, err := l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) + newAgent.AgentCode = 0 + _, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) if err != nil { return errors.Wrapf(err, "创建代理记录失败") } - _, _ = agentResult.LastInsertId() } } // 4.7 初始化钱包 wallet := &model.AgentWallet{ + Id: uuid.NewString(), AgentId: newAgent.Id, } if _, err := l.svcCtx.AgentWalletModel.Insert(transCtx, session, wallet); err != nil { @@ -238,15 +248,18 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type inviteCodeModel.Status = 1 // 已使用(使用后立即失效) } // 记录使用信息(用于统计,普通邀请码可以多次使用) - inviteCodeModel.UsedUserId = sql.NullInt64{Int64: userID, Valid: true} - inviteCodeModel.UsedAgentId = sql.NullInt64{Int64: newAgent.Id, Valid: true} - inviteCodeModel.UsedTime = sql.NullTime{Time: time.Now(), Valid: true} - if err := l.svcCtx.AgentInviteCodeModel.UpdateWithVersion(transCtx, session, inviteCodeModel); err != nil { - return errors.Wrapf(err, "更新邀请码状态失败") + inviteCodeModel.UsedUserId = sql.NullString{String: userID, Valid: true} + if inviteCodeModel != nil { + inviteCodeModel.UsedAgentId = sql.NullString{String: newAgent.Id, Valid: true} + inviteCodeModel.UsedTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := l.svcCtx.AgentInviteCodeModel.UpdateWithVersion(transCtx, session, inviteCodeModel); err != nil { + return errors.Wrapf(err, "更新邀请码状态失败") + } } // 4.9 记录邀请码使用历史(用于统计和查询) usage := &model.AgentInviteCodeUsage{ + Id: uuid.NewString(), InviteCodeId: inviteCodeModel.Id, Code: inviteCodeModel.Code, UserId: userID, @@ -272,15 +285,46 @@ func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *type } now := time.Now().Unix() + agent, _ := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + var code int64 + if agent != nil { + code = agent.AgentCode + } return &types.AgentApplyResp{ AccessToken: token, AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + AgentCode: code, }, nil } +func (l *ApplyForAgentLogic) findAgentByCode(ctx context.Context, code int64) (*model.Agent, error) { + builder := l.svcCtx.AgentModel.SelectBuilder().Where("agent_code = ? AND del_state = ?", code, globalkey.DelStateNo).Limit(1) + agents, err := l.svcCtx.AgentModel.FindAll(ctx, builder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询上级代理失败, %v", err) + } + if len(agents) == 0 { + return nil, errors.Wrapf(xerr.NewErrMsg("上级邀请码不存在"), "") + } + return agents[0], nil +} + +func (l *ApplyForAgentLogic) allocateAgentCode(ctx context.Context, session sqlx.Session) (int64, error) { + builder := l.svcCtx.AgentModel.SelectBuilder().OrderBy("agent_code DESC").Limit(1) + rows, err := l.svcCtx.AgentModel.FindAll(ctx, builder, "") + if err != nil { + return 0, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理编码失败, %v", err) + } + var next int64 = 16800 + if len(rows) > 0 && rows[0].AgentCode > 0 { + next = rows[0].AgentCode + 1 + } + return next, nil +} + // findTeamLeader 查找团队首领(钻石代理) -func (l *ApplyForAgentLogic) findTeamLeader(ctx context.Context, agentId int64) (int64, error) { +func (l *ApplyForAgentLogic) findTeamLeader(ctx context.Context, agentId string) (string, error) { currentId := agentId maxDepth := 100 depth := 0 @@ -290,22 +334,22 @@ func (l *ApplyForAgentLogic) findTeamLeader(ctx context.Context, agentId int64) Where("child_id = ? AND relation_type = ? AND del_state = ?", currentId, 1, 0) relations, err := l.svcCtx.AgentRelationModel.FindAll(ctx, builder, "") if err != nil { - return 0, err + return "", err } if len(relations) == 0 { agent, err := l.svcCtx.AgentModel.FindOne(ctx, currentId) if err != nil { - return 0, err + return "", err } if agent.Level == 3 { return agent.Id, nil } - return 0, nil + return "", nil } parentAgent, err := l.svcCtx.AgentModel.FindOne(ctx, relations[0].ParentId) if err != nil { - return 0, err + return "", err } if parentAgent.Level == 3 { @@ -316,5 +360,5 @@ func (l *ApplyForAgentLogic) findTeamLeader(ctx context.Context, agentId int64) depth++ } - return 0, nil + return "", nil } diff --git a/app/main/api/internal/logic/agent/applyupgradelogic.go b/app/main/api/internal/logic/agent/applyupgradelogic.go index 685cbbb..950051f 100644 --- a/app/main/api/internal/logic/agent/applyupgradelogic.go +++ b/app/main/api/internal/logic/agent/applyupgradelogic.go @@ -7,6 +7,7 @@ import ( "ycc-server/common/ctxdata" "ycc-server/common/xerr" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -64,7 +65,7 @@ func (l *ApplyUpgradeLogic) ApplyUpgrade(req *types.ApplyUpgradeReq) (resp *type } // 4. 查找原直接上级(用于返佣) - var rebateAgentId int64 + var rebateAgentId string parent, err := l.svcCtx.AgentService.FindDirectParent(l.ctx, agent.Id) if err != nil && !errors.Is(err, model.ErrNotFound) { return nil, errors.Wrapf(err, "查找直接上级失败") @@ -74,10 +75,11 @@ func (l *ApplyUpgradeLogic) ApplyUpgrade(req *types.ApplyUpgradeReq) (resp *type } // 5. 创建升级记录(待支付状态) - var upgradeId int64 + var upgradeId string err = l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 5.1 创建升级记录(状态为待支付) upgradeRecord := &model.AgentUpgrade{ + Id: uuid.NewString(), AgentId: agent.Id, FromLevel: fromLevel, ToLevel: toLevel, @@ -86,17 +88,16 @@ func (l *ApplyUpgradeLogic) ApplyUpgrade(req *types.ApplyUpgradeReq) (resp *type RebateAmount: rebateAmount, Status: 1, // 待支付(1=待支付,2=已支付,3=已完成,4=已取消) } - if rebateAgentId > 0 { - upgradeRecord.RebateAgentId = sql.NullInt64{Int64: rebateAgentId, Valid: true} + if rebateAgentId != "" { + upgradeRecord.RebateAgentId = sql.NullString{String: rebateAgentId, Valid: true} } - upgradeResult, err := l.svcCtx.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord) + _, err := l.svcCtx.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord) if err != nil { return errors.Wrapf(err, "创建升级记录失败") } - upgradeId, _ = upgradeResult.LastInsertId() - // 注意:升级操作将在支付成功后通过支付回调完成 + upgradeId = upgradeRecord.Id return nil }) diff --git a/app/main/api/internal/logic/agent/applywithdrawallogic.go b/app/main/api/internal/logic/agent/applywithdrawallogic.go index ef588a9..4afe366 100644 --- a/app/main/api/internal/logic/agent/applywithdrawallogic.go +++ b/app/main/api/internal/logic/agent/applywithdrawallogic.go @@ -10,6 +10,7 @@ import ( "ycc-server/common/xerr" "ycc-server/pkg/lzkit/lzUtils" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -88,7 +89,7 @@ func (l *ApplyWithdrawalLogic) ApplyWithdrawal(req *types.ApplyWithdrawalReq) (r withdrawNo := fmt.Sprintf("WD%d%d", time.Now().Unix(), agent.Id) // 8. 使用事务处理提现申请 - var withdrawalId int64 + var withdrawalId string err = l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 8.1 冻结余额 wallet.FrozenBalance += req.Amount @@ -99,6 +100,7 @@ func (l *ApplyWithdrawalLogic) ApplyWithdrawal(req *types.ApplyWithdrawalReq) (r // 8.2 创建提现记录 withdrawal := &model.AgentWithdrawal{ + Id: uuid.New().String(), AgentId: agent.Id, WithdrawNo: withdrawNo, PayeeAccount: req.PayeeAccount, @@ -109,11 +111,11 @@ func (l *ApplyWithdrawalLogic) ApplyWithdrawal(req *types.ApplyWithdrawalReq) (r Status: 1, // 处理中(待审核) } - withdrawalResult, err := l.svcCtx.AgentWithdrawalModel.Insert(transCtx, session, withdrawal) + _, err := l.svcCtx.AgentWithdrawalModel.Insert(transCtx, session, withdrawal) if err != nil { return errors.Wrapf(err, "创建提现记录失败") } - withdrawalId, _ = withdrawalResult.LastInsertId() + withdrawalId = withdrawal.Id // 8.3 创建扣税记录 taxRecord := &model.AgentWithdrawalTax{ @@ -154,7 +156,7 @@ type TaxInfo struct { } // calculateTax 计算税费 -func (l *ApplyWithdrawalLogic) calculateTax(ctx context.Context, agentId int64, amount float64, yearMonth int64) (*TaxInfo, error) { +func (l *ApplyWithdrawalLogic) calculateTax(ctx context.Context, agentId string, amount float64, yearMonth int64) (*TaxInfo, error) { // 获取税率配置(默认6%) taxRate := 0.06 config, err := l.svcCtx.AgentConfigModel.FindOneByConfigKey(ctx, "tax_rate") diff --git a/app/main/api/internal/logic/agent/deleteinvitecodelogic.go b/app/main/api/internal/logic/agent/deleteinvitecodelogic.go index 410deab..98467fe 100644 --- a/app/main/api/internal/logic/agent/deleteinvitecodelogic.go +++ b/app/main/api/internal/logic/agent/deleteinvitecodelogic.go @@ -53,7 +53,7 @@ func (l *DeleteInviteCodeLogic) DeleteInviteCode(req *types.DeleteInviteCodeReq) } // 3. 验证邀请码是否属于当前代理 - if !inviteCode.AgentId.Valid || inviteCode.AgentId.Int64 != agent.Id { + if !inviteCode.AgentId.Valid || inviteCode.AgentId.String != agent.Id { return nil, errors.Wrapf(xerr.NewErrMsg("无权删除此邀请码"), "") } diff --git a/app/main/api/internal/logic/agent/generateinvitecodelogic.go b/app/main/api/internal/logic/agent/generateinvitecodelogic.go index 9d4ec9f..a7ab754 100644 --- a/app/main/api/internal/logic/agent/generateinvitecodelogic.go +++ b/app/main/api/internal/logic/agent/generateinvitecodelogic.go @@ -87,9 +87,9 @@ func (l *GenerateInviteCodeLogic) GenerateInviteCode(req *types.GenerateInviteCo // 创建邀请码记录 inviteCode := &model.AgentInviteCode{ Code: code, - AgentId: sql.NullInt64{Int64: agent.Id, Valid: true}, + AgentId: sql.NullString{String: agent.Id, Valid: true}, TargetLevel: 1, // 代理发放的邀请码,目标等级为普通代理 - Status: 0, // 未使用 + Status: 0, // 未使用 ExpireTime: expireTime, Remark: sql.NullString{String: req.Remark, Valid: req.Remark != ""}, } diff --git a/app/main/api/internal/logic/agent/generatinglinklogic.go b/app/main/api/internal/logic/agent/generatinglinklogic.go index 74c1205..fa766c8 100644 --- a/app/main/api/internal/logic/agent/generatinglinklogic.go +++ b/app/main/api/internal/logic/agent/generatinglinklogic.go @@ -22,6 +22,7 @@ import ( "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" + "github.com/google/uuid" "github.com/zeromicro/go-zero/core/logx" ) @@ -69,15 +70,17 @@ func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取等级加成配置失败, %v", err) } - // 4. 计算实际底价(产品基础底价 + 等级加成) - basePrice := productConfig.BasePrice - actualBasePrice := basePrice + float64(levelBonus) - systemMaxPrice := productConfig.SystemMaxPrice - - // 5. 验证设定价格范围 - if req.SetPrice < actualBasePrice || req.SetPrice > systemMaxPrice { - return nil, errors.Wrapf(xerr.NewErrMsg("设定价格必须在 %.2f 到 %.2f 之间"), "设定价格必须在 %.2f 到 %.2f 之间", actualBasePrice, systemMaxPrice) - } + basePrice := productConfig.BasePrice + actualBasePrice := basePrice + float64(levelBonus) + systemMaxPrice := productConfig.SystemMaxPrice + upliftAmount, err := l.getLevelMaxUpliftAmount(agentModel.Level) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取等级上调金额失败, %v", err) + } + levelMaxPrice := systemMaxPrice + upliftAmount + if req.SetPrice < actualBasePrice || req.SetPrice > levelMaxPrice { + return nil, errors.Wrapf(xerr.NewErrMsg("设定价格必须在 %.2f 到 %.2f 之间"), "设定价格必须在 %.2f 到 %.2f 之间", actualBasePrice, levelMaxPrice) + } // 6. 检查是否已存在相同的链接(同一代理、同一产品、同一价格) builder := l.svcCtx.AgentLinkModel.SelectBuilder().Where(squirrel.And{ @@ -98,7 +101,7 @@ func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) if targetPath == "" { targetPath = "/agent/promotionInquire/" } - shortLink, err := l.getOrCreateShortLink(1, existingLinks[0].Id, 0, existingLinks[0].LinkIdentifier, "", targetPath) + shortLink, err := l.getOrCreateShortLink(1, existingLinks[0].Id, "", existingLinks[0].LinkIdentifier, "", targetPath) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取或创建短链失败, %v", err) } @@ -132,6 +135,7 @@ func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) // 9. 保存推广链接 agentLink := &model.AgentLink{ + // Id: uuid.NewString(), AgentId: agentModel.Id, UserId: userID, ProductId: req.ProductId, @@ -140,16 +144,12 @@ func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) ActualBasePrice: actualBasePrice, } - result, err := l.svcCtx.AgentLinkModel.Insert(l.ctx, nil, agentLink) + _, err = l.svcCtx.AgentLinkModel.Insert(l.ctx, nil, agentLink) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "保存推广链接失败, %v", err) } - // 获取插入的ID - linkId, err := result.LastInsertId() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广链接ID失败, %v", err) - } + linkId := agentLink.Id // 使用默认target_path(如果未提供) targetPath := req.TargetPath @@ -158,7 +158,7 @@ func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) } // 生成短链(类型:1=推广报告) - shortLink, err := l.createShortLink(1, linkId, 0, encrypted, "", targetPath) + shortLink, err := l.createShortLink(1, linkId, "", encrypted, "", targetPath) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成短链失败, %v", err) } @@ -205,6 +205,30 @@ func (l *GeneratingLinkLogic) getLevelBonus(level int64) (int64, error) { return int64(value), nil } +func (l *GeneratingLinkLogic) getLevelMaxUpliftAmount(level int64) (float64, error) { + var key string + switch level { + case 2: + key = "gold_max_uplift_amount" + case 3: + key = "diamond_max_uplift_amount" + default: + return 0, nil + } + config, err := l.svcCtx.AgentConfigModel.FindOneByConfigKey(l.ctx, key) + if err != nil { + return 0, nil + } + v, err := strconv.ParseFloat(config.ConfigValue, 64) + if err != nil { + return 0, nil + } + if v < 0 { + return 0, nil + } + return v, nil +} + // getOrCreateShortLink 获取或创建短链 // type: 1=推广报告(promotion), 2=邀请好友(invite) // linkId: 推广链接ID(仅推广报告使用) @@ -212,20 +236,20 @@ func (l *GeneratingLinkLogic) getLevelBonus(level int64) (int64, error) { // linkIdentifier: 推广链接标识(仅推广报告使用) // inviteCode: 邀请码(仅邀请好友使用) // targetPath: 目标地址(前端传入) -func (l *GeneratingLinkLogic) getOrCreateShortLink(linkType int64, linkId, inviteCodeId int64, linkIdentifier, inviteCode, targetPath string) (string, error) { +func (l *GeneratingLinkLogic) getOrCreateShortLink(linkType int64, linkId, inviteCodeId string, linkIdentifier, inviteCode, targetPath string) (string, error) { // 先查询是否已存在短链 var existingShortLink *model.AgentShortLink var err error if linkType == 1 { // 推广报告类型,使用link_id查询 - if linkId > 0 { - existingShortLink, err = l.svcCtx.AgentShortLinkModel.FindOneByLinkIdTypeDelState(l.ctx, sql.NullInt64{Int64: linkId, Valid: true}, linkType, globalkey.DelStateNo) + if linkId != "" { + existingShortLink, err = l.svcCtx.AgentShortLinkModel.FindOneByLinkIdTypeDelState(l.ctx, sql.NullString{String: linkId, Valid: true}, linkType, globalkey.DelStateNo) } } else { // 邀请好友类型,使用invite_code_id查询 - if inviteCodeId > 0 { - existingShortLink, err = l.svcCtx.AgentShortLinkModel.FindOneByInviteCodeIdTypeDelState(l.ctx, sql.NullInt64{Int64: inviteCodeId, Valid: true}, linkType, globalkey.DelStateNo) + if inviteCodeId != "" { + existingShortLink, err = l.svcCtx.AgentShortLinkModel.FindOneByInviteCodeIdTypeDelState(l.ctx, sql.NullString{String: inviteCodeId, Valid: true}, linkType, globalkey.DelStateNo) } } @@ -244,7 +268,7 @@ func (l *GeneratingLinkLogic) getOrCreateShortLink(linkType int64, linkId, invit // createShortLink 创建短链 // type: 1=推广报告(promotion), 2=邀请好友(invite) -func (l *GeneratingLinkLogic) createShortLink(linkType int64, linkId, inviteCodeId int64, linkIdentifier, inviteCode, targetPath string) (string, error) { +func (l *GeneratingLinkLogic) createShortLink(linkType int64, linkId, inviteCodeId string, linkIdentifier, inviteCode, targetPath string) (string, error) { promotionConfig := l.svcCtx.Config.Promotion // 如果没有配置推广域名,返回空字符串(保持向后兼容) @@ -291,6 +315,7 @@ func (l *GeneratingLinkLogic) createShortLink(linkType int64, linkId, inviteCode // 创建短链记录 shortLink := &model.AgentShortLink{ + Id: uuid.NewString(), Type: linkType, ShortCode: shortCode, TargetPath: targetPath, @@ -300,13 +325,13 @@ func (l *GeneratingLinkLogic) createShortLink(linkType int64, linkId, inviteCode // 根据类型设置对应字段 if linkType == 1 { // 推广报告类型 - shortLink.LinkId = sql.NullInt64{Int64: linkId, Valid: linkId > 0} + shortLink.LinkId = sql.NullString{String: linkId, Valid: linkId != ""} if linkIdentifier != "" { shortLink.LinkIdentifier = sql.NullString{String: linkIdentifier, Valid: true} } } else if linkType == 2 { // 邀请好友类型 - shortLink.InviteCodeId = sql.NullInt64{Int64: inviteCodeId, Valid: inviteCodeId > 0} + shortLink.InviteCodeId = sql.NullString{String: inviteCodeId, Valid: inviteCodeId != ""} if inviteCode != "" { shortLink.InviteCode = sql.NullString{String: inviteCode, Valid: true} } diff --git a/app/main/api/internal/logic/agent/getagentinfologic.go b/app/main/api/internal/logic/agent/getagentinfologic.go index 728fafc..513368b 100644 --- a/app/main/api/internal/logic/agent/getagentinfologic.go +++ b/app/main/api/internal/logic/agent/getagentinfologic.go @@ -40,14 +40,14 @@ func (l *GetAgentInfoLogic) GetAgentInfo() (resp *types.AgentInfoResp, err error if errors.Is(err, model.ErrNotFound) { // 不是代理,返回空信息 return &types.AgentInfoResp{ - AgentId: 0, - Level: 0, - LevelName: "", - Region: "", - Mobile: "", - WechatId: "", - TeamLeaderId: 0, - IsRealName: false, + AgentId: "", + Level: 0, + LevelName: "", + Region: "", + Mobile: "", + WechatId: "", + TeamLeaderId: "", + IsRealName: false, }, nil } return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败, %v", err) @@ -76,9 +76,9 @@ func (l *GetAgentInfoLogic) GetAgentInfo() (resp *types.AgentInfoResp, err error } // 获取团队首领ID - teamLeaderId := int64(0) + teamLeaderId := "" if agent.TeamLeaderId.Valid { - teamLeaderId = agent.TeamLeaderId.Int64 + teamLeaderId = agent.TeamLeaderId.String } // 获取区域 @@ -88,14 +88,15 @@ func (l *GetAgentInfoLogic) GetAgentInfo() (resp *types.AgentInfoResp, err error } return &types.AgentInfoResp{ - AgentId: agent.Id, - Level: agent.Level, - LevelName: l.getLevelName(agent.Level), - Region: region, - Mobile: mobile, - WechatId: wechatId, - TeamLeaderId: teamLeaderId, - IsRealName: isRealName, + AgentId: agent.Id, + Level: agent.Level, + LevelName: l.getLevelName(agent.Level), + Region: region, + Mobile: mobile, + WechatId: wechatId, + TeamLeaderId: teamLeaderId, + IsRealName: isRealName, + AgentCode: agent.AgentCode, }, nil } diff --git a/app/main/api/internal/logic/agent/getagentproductconfiglogic.go b/app/main/api/internal/logic/agent/getagentproductconfiglogic.go index ee083d0..d6110c0 100644 --- a/app/main/api/internal/logic/agent/getagentproductconfiglogic.go +++ b/app/main/api/internal/logic/agent/getagentproductconfiglogic.go @@ -78,9 +78,9 @@ func (l *GetAgentProductConfigLogic) GetAgentProductConfig() (resp *types.AgentP // 计算该产品的实际底价 productActualBasePrice := productBasePrice + float64(levelBonus) - // 价格范围:实际底价 ≤ 设定价格 ≤ 产品配置的最高价格 - priceRangeMin := productActualBasePrice - priceRangeMax := productConfig.SystemMaxPrice + priceRangeMin := productActualBasePrice + upliftAmount, _ := l.getLevelMaxUpliftAmount(agentModel.Level) + priceRangeMax := productConfig.SystemMaxPrice + upliftAmount // 使用产品配置的提价阈值和手续费比例,如果为NULL则使用0 productPriceThreshold := 0.0 @@ -144,3 +144,27 @@ func (l *GetAgentProductConfigLogic) getLevelBonus(level int64) (int64, error) { } return int64(value), nil } + +func (l *GetAgentProductConfigLogic) getLevelMaxUpliftAmount(level int64) (float64, error) { + var key string + switch level { + case 2: + key = "gold_max_uplift_amount" + case 3: + key = "diamond_max_uplift_amount" + default: + return 0, nil + } + config, err := l.svcCtx.AgentConfigModel.FindOneByConfigKey(l.ctx, key) + if err != nil { + return 0, nil + } + v, err := strconv.ParseFloat(config.ConfigValue, 64) + if err != nil { + return 0, nil + } + if v < 0 { + return 0, nil + } + return v, nil +} diff --git a/app/main/api/internal/logic/agent/getcommissionlistlogic.go b/app/main/api/internal/logic/agent/getcommissionlistlogic.go index 7d831ab..7791d36 100644 --- a/app/main/api/internal/logic/agent/getcommissionlistlogic.go +++ b/app/main/api/internal/logic/agent/getcommissionlistlogic.go @@ -78,7 +78,7 @@ func (l *GetCommissionListLogic) GetCommissionList(req *types.GetCommissionListR for _, commission := range commissions { // 查询产品名称 productName := "" - if commission.ProductId > 0 { + if commission.ProductId != "" { product, err := l.svcCtx.ProductModel.FindOne(l.ctx, commission.ProductId) if err == nil { productName = product.ProductName @@ -87,7 +87,7 @@ func (l *GetCommissionListLogic) GetCommissionList(req *types.GetCommissionListR // 查询订单号 orderNo := "" - if commission.OrderId > 0 { + if commission.OrderId != "" { order, err := l.svcCtx.OrderModel.FindOne(l.ctx, commission.OrderId) if err == nil { orderNo = order.OrderNo diff --git a/app/main/api/internal/logic/agent/getconversionratelogic.go b/app/main/api/internal/logic/agent/getconversionratelogic.go index 9e712fd..92d01f4 100644 --- a/app/main/api/internal/logic/agent/getconversionratelogic.go +++ b/app/main/api/internal/logic/agent/getconversionratelogic.go @@ -59,7 +59,7 @@ func (l *GetConversionRateLogic) GetConversionRate() (resp *types.ConversionRate } // calculateSubordinateConversionRate 计算下级转化率(考虑历史关系) -func (l *GetConversionRateLogic) calculateSubordinateConversionRate(parentAgentId int64) types.ConversionRateData { +func (l *GetConversionRateLogic) calculateSubordinateConversionRate(parentAgentId string) types.ConversionRateData { // 使用Asia/Shanghai时区,与数据库保持一致 loc, _ := time.LoadLocation("Asia/Shanghai") now := time.Now().In(loc) @@ -120,7 +120,7 @@ func (l *GetConversionRateLogic) calculateSubordinateConversionRate(parentAgentI // calculateConversionRate 计算转化率 // agentId > 0 时统计该代理的转化率,否则统计 subordinateIds 列表的转化率 -func (l *GetConversionRateLogic) calculateConversionRate(agentId int64, subordinateIds []int64) types.ConversionRateData { +func (l *GetConversionRateLogic) calculateConversionRate(agentId string, subordinateIds []string) types.ConversionRateData { // 使用Asia/Shanghai时区,与数据库保持一致 loc, _ := time.LoadLocation("Asia/Shanghai") now := time.Now().In(loc) @@ -182,13 +182,13 @@ func (l *GetConversionRateLogic) calculateConversionRate(agentId int64, subordin } // calculatePeriodConversion 计算指定时间段的转化率数据 -func (l *GetConversionRateLogic) calculatePeriodConversion(agentId int64, subordinateIds []int64, periodLabel string, startTime, endTime time.Time) types.PeriodConversionData { +func (l *GetConversionRateLogic) calculatePeriodConversion(agentId string, subordinateIds []string, periodLabel string, startTime, endTime time.Time) types.PeriodConversionData { // 构建 agent_order 查询条件 agentOrderBuilder := l.svcCtx.AgentOrderModel.SelectBuilder(). Where("del_state = ?", globalkey.DelStateNo). Where("create_time >= ? AND create_time < ?", startTime, endTime) - if agentId > 0 { + if agentId != "" { // 统计我的转化率 agentOrderBuilder = agentOrderBuilder.Where("agent_id = ?", agentId) } else if len(subordinateIds) > 0 { @@ -208,7 +208,7 @@ func (l *GetConversionRateLogic) calculatePeriodConversion(agentId int64, subord } // 添加调试日志 - if agentId == 0 && len(subordinateIds) > 0 { + if agentId == "" && len(subordinateIds) > 0 { l.Infof("calculatePeriodConversion: 统计下级转化率,periodLabel=%s, startTime=%v, endTime=%v, subordinateIds数量=%d", periodLabel, startTime, endTime, len(subordinateIds)) } @@ -228,7 +228,7 @@ func (l *GetConversionRateLogic) calculatePeriodConversion(agentId int64, subord } if len(agentOrders) == 0 { - if agentId == 0 && len(subordinateIds) > 0 { + if agentId == "" && len(subordinateIds) > 0 { l.Infof("calculatePeriodConversion: 未找到代理订单,periodLabel=%s, startTime=%v, endTime=%v", periodLabel, startTime, endTime) } @@ -245,7 +245,7 @@ func (l *GetConversionRateLogic) calculatePeriodConversion(agentId int64, subord l.Infof("calculatePeriodConversion: 找到代理订单数量=%d, periodLabel=%s", len(agentOrders), periodLabel) // 收集订单ID - orderIds := make([]int64, 0, len(agentOrders)) + orderIds := make([]string, 0, len(agentOrders)) for _, ao := range agentOrders { orderIds = append(orderIds, ao.OrderId) } @@ -271,8 +271,8 @@ func (l *GetConversionRateLogic) calculatePeriodConversion(agentId int64, subord // 统计查询订单数、付费订单数、用户数和总金额 var totalAmount float64 paidOrderCount := 0 - queryUserSet := make(map[int64]bool) - paidUserSet := make(map[int64]bool) + queryUserSet := make(map[string]bool) + paidUserSet := make(map[string]bool) for _, order := range orders { // 查询用户数(所有订单的用户,去重) @@ -303,7 +303,7 @@ func (l *GetConversionRateLogic) calculatePeriodConversion(agentId int64, subord // 结合使用agent_rebate表和agent_order表: // 1. 查询量:通过agent_order表统计所有查询(包括未付费的) // 2. 付费量和金额:通过agent_rebate表统计(只有付费的订单才会产生返佣) -func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgentId int64, periodLabel string, startTime, endTime time.Time) types.PeriodConversionData { +func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgentId string, periodLabel string, startTime, endTime time.Time) types.PeriodConversionData { // 1. 查询agent_rebate表:获取所有曾经给当前用户产生返佣的source_agent_id(这些代理在某个时间点是下级) // 不限制时间,获取所有历史返佣记录,用于确定哪些代理曾经是下级 rebateBuilder := l.svcCtx.AgentRebateModel.SelectBuilder(). @@ -324,9 +324,9 @@ func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgen } // 收集所有曾经产生返佣的source_agent_id(这些代理在某个时间点是下级) - sourceAgentIdSet := make(map[int64]bool) - paidOrderIdSet := make(map[int64]bool) // 已付费的订单ID(有返佣的订单) - paidOrderIdToAmount := make(map[int64]float64) // 已付费订单的金额 + sourceAgentIdSet := make(map[string]bool) + paidOrderIdSet := make(map[string]bool) // 已付费的订单ID(有返佣的订单) + paidOrderIdToAmount := make(map[string]float64) // 已付费订单的金额 for _, rebate := range allRebates { sourceAgentIdSet[rebate.SourceAgentId] = true @@ -351,7 +351,7 @@ func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgen } } - sourceAgentIds := make([]int64, 0, len(sourceAgentIdSet)) + sourceAgentIds := make([]string, 0, len(sourceAgentIdSet)) for agentId := range sourceAgentIdSet { sourceAgentIds = append(sourceAgentIds, agentId) } @@ -391,8 +391,8 @@ func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgen } // 3. 通过order_id去重,获取所有订单ID(用于查询订单详情) - orderIdSet := make(map[int64]bool) - orderIdToAgentOrder := make(map[int64]*model.AgentOrder) + orderIdSet := make(map[string]bool) + orderIdToAgentOrder := make(map[string]*model.AgentOrder) for _, ao := range agentOrders { orderIdSet[ao.OrderId] = true @@ -406,7 +406,7 @@ func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgen } } - orderIds := make([]int64, 0, len(orderIdSet)) + orderIds := make([]string, 0, len(orderIdSet)) for orderId := range orderIdSet { orderIds = append(orderIds, orderId) } @@ -459,8 +459,8 @@ func (l *GetConversionRateLogic) calculateSubordinatePeriodConversion(parentAgen // 6. 统计查询订单数、付费订单数、用户数和总金额 var totalAmount float64 paidOrderCount := 0 - queryUserSet := make(map[int64]bool) - paidUserSet := make(map[int64]bool) + queryUserSet := make(map[string]bool) + paidUserSet := make(map[string]bool) for _, order := range orders { // 查询用户数(所有订单的用户,去重) diff --git a/app/main/api/internal/logic/agent/getinvitelinklogic.go b/app/main/api/internal/logic/agent/getinvitelinklogic.go index c4b6129..76f1c9d 100644 --- a/app/main/api/internal/logic/agent/getinvitelinklogic.go +++ b/app/main/api/internal/logic/agent/getinvitelinklogic.go @@ -4,18 +4,22 @@ import ( "context" "database/sql" "fmt" + "strconv" + "strings" "time" "ycc-server/app/main/model" "ycc-server/common/ctxdata" "ycc-server/common/globalkey" "ycc-server/common/tool" "ycc-server/common/xerr" + "ycc-server/pkg/lzkit/crypto" "github.com/pkg/errors" "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" + "github.com/google/uuid" "github.com/zeromicro/go-zero/core/logx" ) @@ -53,41 +57,51 @@ func (l *GetInviteLinkLogic) GetInviteLink(req *types.GetInviteLinkReq) (resp *t return nil, errors.Wrapf(xerr.NewErrMsg("邀请码不能为空"), "") } - // 3. 查询邀请码是否存在且属于当前代理 - inviteCodeRecord, err := l.svcCtx.AgentInviteCodeModel.FindOneByCode(l.ctx, req.InviteCode) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码不存在"), "") - } + ref := strings.TrimSpace(req.InviteCode) + var inviteCodeRecord *model.AgentInviteCode + inviteCodeRecord, err = l.svcCtx.AgentInviteCodeModel.FindOneByCode(l.ctx, ref) + if err != nil && !errors.Is(err, model.ErrNotFound) { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请码失败, %v", err) } - // 4. 验证邀请码是否属于当前代理 - if !inviteCodeRecord.AgentId.Valid || inviteCodeRecord.AgentId.Int64 != agent.Id { - return nil, errors.Wrapf(xerr.NewErrMsg("无权使用此邀请码"), "") - } - - // 5. 验证邀请码状态 - if inviteCodeRecord.Status != 0 { - if inviteCodeRecord.Status == 1 { - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已使用"), "") + if inviteCodeRecord != nil { + if !inviteCodeRecord.AgentId.Valid || inviteCodeRecord.AgentId.String != agent.Id { + return nil, errors.Wrapf(xerr.NewErrMsg("无权使用此邀请码"), "") + } + if inviteCodeRecord.Status != 0 { + if inviteCodeRecord.Status == 1 { + return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已使用"), "") + } + return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已失效"), "") + } + if inviteCodeRecord.ExpireTime.Valid && inviteCodeRecord.ExpireTime.Time.Before(time.Now()) { + return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "") + } + } else { + if codeVal, parseErr := strconv.ParseInt(ref, 10, 64); parseErr == nil && codeVal > 0 { + if agent.AgentCode != codeVal { + return nil, errors.Wrapf(xerr.NewErrMsg("无权使用此邀请码"), "") + } + } else { + encMobile, _ := crypto.EncryptMobile(ref, l.svcCtx.Config.Encrypt.SecretKey) + if encMobile != agent.Mobile { + return nil, errors.Wrapf(xerr.NewErrMsg("邀请信息无效"), "") + } } - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已失效"), "") - } - - // 6. 验证邀请码是否过期 - if inviteCodeRecord.ExpireTime.Valid && inviteCodeRecord.ExpireTime.Time.Before(time.Now()) { - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "") } // 7. 使用默认target_path(如果未提供) targetPath := req.TargetPath if targetPath == "" { - targetPath = fmt.Sprintf("/register?invite_code=%s", req.InviteCode) + targetPath = fmt.Sprintf("/register?invite_code=%s", ref) } - // 8. 生成短链(类型:2=邀请好友) - shortLink, err := l.createInviteShortLink(inviteCodeRecord.Id, req.InviteCode, targetPath) + shortLink, err := l.createInviteShortLink(func() string { + if inviteCodeRecord != nil { + return inviteCodeRecord.Id + } + return "" + }(), ref, targetPath) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成短链失败, %v", err) } @@ -98,7 +112,7 @@ func (l *GetInviteLinkLogic) GetInviteLink(req *types.GetInviteLinkReq) (resp *t } // createInviteShortLink 创建邀请好友短链 -func (l *GetInviteLinkLogic) createInviteShortLink(inviteCodeId int64, inviteCode, targetPath string) (string, error) { +func (l *GetInviteLinkLogic) createInviteShortLink(inviteCodeId string, inviteCode, targetPath string) (string, error) { promotionConfig := l.svcCtx.Config.Promotion // 如果没有配置推广域名,返回空字符串(保持向后兼容) @@ -108,7 +122,7 @@ func (l *GetInviteLinkLogic) createInviteShortLink(inviteCodeId int64, inviteCod } // 先查询是否已存在短链 - existingShortLink, err := l.svcCtx.AgentShortLinkModel.FindOneByInviteCodeIdTypeDelState(l.ctx, sql.NullInt64{Int64: inviteCodeId, Valid: true}, 2, globalkey.DelStateNo) + existingShortLink, err := l.svcCtx.AgentShortLinkModel.FindOneByInviteCodeIdTypeDelState(l.ctx, sql.NullString{String: inviteCodeId, Valid: inviteCodeId != ""}, 2, globalkey.DelStateNo) if err == nil && existingShortLink != nil { // 已存在短链,直接返回 return fmt.Sprintf("%s/s/%s", promotionConfig.PromotionDomain, existingShortLink.ShortCode), nil @@ -118,6 +132,17 @@ func (l *GetInviteLinkLogic) createInviteShortLink(inviteCodeId int64, inviteCod return "", errors.Wrapf(err, "查询短链失败") } + // 如果没有邀请码ID(例如使用手机号或代理码),按邀请码字符串尝试查找以避免重复创建 + if inviteCodeId == "" && inviteCode != "" { + existingByCode, err2 := l.svcCtx.AgentShortLinkModel.FindOneByInviteCodeTypeDelState(l.ctx, sql.NullString{String: inviteCode, Valid: true}, 2, globalkey.DelStateNo) + if err2 == nil && existingByCode != nil { + return fmt.Sprintf("%s/s/%s", promotionConfig.PromotionDomain, existingByCode.ShortCode), nil + } + if err2 != nil && !errors.Is(err2, model.ErrNotFound) { + return "", errors.Wrapf(err2, "查询短链失败") + } + } + // 生成短链标识(6位随机字符串,大小写字母+数字) var shortCode string maxRetries := 10 // 最大重试次数 @@ -140,8 +165,9 @@ func (l *GetInviteLinkLogic) createInviteShortLink(inviteCodeId int64, inviteCod // 创建短链记录(类型:2=邀请好友) shortLink := &model.AgentShortLink{ + Id: uuid.NewString(), Type: 2, // 邀请好友 - InviteCodeId: sql.NullInt64{Int64: inviteCodeId, Valid: inviteCodeId > 0}, + InviteCodeId: sql.NullString{String: inviteCodeId, Valid: inviteCodeId != ""}, InviteCode: sql.NullString{String: inviteCode, Valid: inviteCode != ""}, ShortCode: shortCode, TargetPath: targetPath, diff --git a/app/main/api/internal/logic/agent/getlevelprivilegelogic.go b/app/main/api/internal/logic/agent/getlevelprivilegelogic.go index 93f2c0a..eb086ab 100644 --- a/app/main/api/internal/logic/agent/getlevelprivilegelogic.go +++ b/app/main/api/internal/logic/agent/getlevelprivilegelogic.go @@ -76,9 +76,11 @@ func (l *GetLevelPrivilegeLogic) GetLevelPrivilege() (resp *types.GetLevelPrivil currentBonus = level1Bonus } - // 获取升级返佣配置 + // 获取升级返佣与费用配置 upgradeToGoldRebate := getConfigFloat("upgrade_to_gold_rebate", 139.0) upgradeToDiamondRebate := getConfigFloat("upgrade_to_diamond_rebate", 680.0) + upgradeToGoldFee := getConfigFloat("upgrade_to_gold_fee", 199.0) + upgradeToDiamondFee := getConfigFloat("upgrade_to_diamond_fee", 980.0) // 获取直接上级返佣配置 directParentAmountDiamond := getConfigFloat("direct_parent_amount_diamond", 6.0) @@ -140,7 +142,11 @@ func (l *GetLevelPrivilegeLogic) GetLevelPrivilege() (resp *types.GetLevelPrivil } return &types.GetLevelPrivilegeResp{ - Levels: levels, + Levels: levels, + UpgradeToGoldFee: upgradeToGoldFee, + UpgradeToDiamondFee: upgradeToDiamondFee, + UpgradeToGoldRebate: upgradeToGoldRebate, + UpgradeToDiamondRebate: upgradeToDiamondRebate, }, nil } diff --git a/app/main/api/internal/logic/agent/getlinkdatalogic.go b/app/main/api/internal/logic/agent/getlinkdatalogic.go index 20a7870..fc66305 100644 --- a/app/main/api/internal/logic/agent/getlinkdatalogic.go +++ b/app/main/api/internal/logic/agent/getlinkdatalogic.go @@ -52,7 +52,7 @@ func (l *GetLinkDataLogic) GetLinkData(req *types.GetLinkDataReq) (resp *types.G } // 创建featureId到sort的映射,用于后续排序 - featureSortMap := make(map[int64]int64) + featureSortMap := make(map[string]int64) for _, productFeature := range productFeatureAll { featureSortMap[productFeature.FeatureId] = productFeature.Sort } @@ -62,18 +62,18 @@ func (l *GetLinkDataLogic) GetLinkData(req *types.GetLinkDataReq) (resp *types.G for _, productFeature := range productFeatureAll { source <- productFeature.FeatureId } - }, func(item interface{}, writer mr.Writer[*model.Feature], cancel func(error)) { - id := item.(int64) + }, func(item interface{}, writer mr.Writer[*model.Feature], cancel func(error)) { + id := item.(string) - feature, findFeatureErr := l.svcCtx.FeatureModel.FindOne(l.ctx, id) - if findFeatureErr != nil { - logx.WithContext(l.ctx).Errorf("获取产品功能失败: %d, err:%v", id, findFeatureErr) - return - } - if feature != nil && feature.Id > 0 { - writer.Write(feature) - } - }, func(pipe <-chan *model.Feature, cancel func(error)) { + feature, findFeatureErr := l.svcCtx.FeatureModel.FindOne(l.ctx, id) + if findFeatureErr != nil { + logx.WithContext(l.ctx).Errorf("获取产品功能失败: %s, err:%v", id, findFeatureErr) + return + } + if feature != nil && feature.Id != "" { + writer.Write(feature) + } + }, func(pipe <-chan *model.Feature, cancel func(error)) { for item := range pipe { var feature types.Feature _ = copier.Copy(&feature, item) diff --git a/app/main/api/internal/logic/agent/getpromotionquerylistlogic.go b/app/main/api/internal/logic/agent/getpromotionquerylistlogic.go new file mode 100644 index 0000000..be064b9 --- /dev/null +++ b/app/main/api/internal/logic/agent/getpromotionquerylistlogic.go @@ -0,0 +1,88 @@ +package agent + +import ( + "context" + "ycc-server/app/main/model" + "ycc-server/common/ctxdata" + "ycc-server/common/globalkey" + "ycc-server/common/xerr" + + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" +) + +type GetPromotionQueryListLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetPromotionQueryListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetPromotionQueryListLogic { + return &GetPromotionQueryListLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetPromotionQueryListLogic) GetPromotionQueryList(req *types.GetPromotionQueryListReq) (resp *types.GetPromotionQueryListResp, 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, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrMsg("您不是代理"), "") + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败, %v", err) + } + + // 查询当前代理的代理订单,按创建时间倒序分页 + builder := l.svcCtx.AgentOrderModel.SelectBuilder(). + Where("agent_id = ? AND del_state = ?", agent.Id, globalkey.DelStateNo) + + orders, _, err := l.svcCtx.AgentOrderModel.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) + } + + // 组装查询报告列表(只展示已创建的查询) + list := make([]types.PromotionQueryItem, 0, len(orders)) + for _, ao := range orders { + // 查询对应的报告 + q, qErr := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, ao.OrderId) + if qErr != nil { + if errors.Is(qErr, model.ErrNotFound) { + // 订单对应的查询尚未创建,跳过展示 + continue + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询报告失败, %v", qErr) + } + + // 获取产品名称 + product, pErr := l.svcCtx.ProductModel.FindOne(l.ctx, ao.ProductId) + if pErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询产品信息失败, %v", pErr) + } + + item := types.PromotionQueryItem{} + _ = copier.Copy(&item, q) + item.Id = q.Id + item.OrderId = q.OrderId + item.ProductName = product.ProductName + item.CreateTime = q.CreateTime.Format("2006-01-02 15:04:05") + item.QueryState = q.QueryState + list = append(list, item) + } + + return &types.GetPromotionQueryListResp{ + Total: int64(len(list)), // 前端仅展示已创建查询条目 + List: list, + }, nil +} diff --git a/app/main/api/internal/logic/agent/getrebatelistlogic.go b/app/main/api/internal/logic/agent/getrebatelistlogic.go index 556986c..4d404eb 100644 --- a/app/main/api/internal/logic/agent/getrebatelistlogic.go +++ b/app/main/api/internal/logic/agent/getrebatelistlogic.go @@ -85,7 +85,7 @@ func (l *GetRebateListLogic) GetRebateList(req *types.GetRebateListReq) (resp *t for _, rebate := range rebates { // 查询订单号 orderNo := "" - if rebate.OrderId > 0 { + if rebate.OrderId != "" { order, err := l.svcCtx.OrderModel.FindOne(l.ctx, rebate.OrderId) if err == nil { orderNo = order.OrderNo @@ -95,7 +95,7 @@ func (l *GetRebateListLogic) GetRebateList(req *types.GetRebateListReq) (resp *t // 查询来源代理手机号和等级 sourceAgentMobile := "" sourceAgentLevel := int64(0) - if rebate.SourceAgentId > 0 { + if rebate.SourceAgentId != "" { sourceAgent, err := l.svcCtx.AgentModel.FindOne(l.ctx, rebate.SourceAgentId) if err == nil { if sourceAgent.Mobile != "" { diff --git a/app/main/api/internal/logic/agent/getsubordinatecontributiondetaillogic.go b/app/main/api/internal/logic/agent/getsubordinatecontributiondetaillogic.go index 7bd64b3..d0a9f3e 100644 --- a/app/main/api/internal/logic/agent/getsubordinatecontributiondetaillogic.go +++ b/app/main/api/internal/logic/agent/getsubordinatecontributiondetaillogic.go @@ -184,7 +184,7 @@ func (l *GetSubordinateContributionDetailLogic) GetSubordinateContributionDetail } // isSubordinate 递归检查 targetId 是否是 parentId 的下级(直接或间接) -func (l *GetSubordinateContributionDetailLogic) isSubordinate(parentId, targetId int64) bool { +func (l *GetSubordinateContributionDetailLogic) isSubordinate(parentId, targetId string) bool { // 查询直接下级 builder := l.svcCtx.AgentRelationModel.SelectBuilder(). Where("parent_id = ? AND relation_type = ? AND del_state = ?", parentId, 1, globalkey.DelStateNo) @@ -215,7 +215,7 @@ func (l *GetSubordinateContributionDetailLogic) countDistinctOrders(ctx context. return 0 } - orderIdSet := make(map[int64]bool) + orderIdSet := make(map[string]bool) for _, rebate := range rebates { orderIdSet[rebate.OrderId] = true } @@ -224,7 +224,7 @@ func (l *GetSubordinateContributionDetailLogic) countDistinctOrders(ctx context. } // getOrderList 获取订单列表(仅显示有返佣的订单) -func (l *GetSubordinateContributionDetailLogic) getOrderList(ctx context.Context, agentId, subordinateId int64, page, pageSize int64) ([]types.OrderItem, int64, error) { +func (l *GetSubordinateContributionDetailLogic) getOrderList(ctx context.Context, agentId, subordinateId string, page, pageSize int64) ([]types.OrderItem, int64, error) { // 1. 查询所有返佣记录 rebateBuilder := l.svcCtx.AgentRebateModel.SelectBuilder(). Where("agent_id = ? AND source_agent_id = ? AND del_state = ?", agentId, subordinateId, globalkey.DelStateNo). @@ -247,14 +247,14 @@ func (l *GetSubordinateContributionDetailLogic) getOrderList(ctx context.Context // 2. 在内存中去重订单ID,并按创建时间排序 type OrderRebateInfo struct { - OrderId int64 - RebateId int64 - ProductId int64 + OrderId string + RebateId string + ProductId string RebateAmount float64 CreateTime time.Time } - orderMap := make(map[int64]*OrderRebateInfo) // orderId -> 最新的返佣信息 + orderMap := make(map[string]*OrderRebateInfo) // orderId -> 最新的返佣信息 for _, rebate := range allRebates { if existing, ok := orderMap[rebate.OrderId]; ok { // 如果已存在,保留创建时间最新的 @@ -303,7 +303,7 @@ func (l *GetSubordinateContributionDetailLogic) getOrderList(ctx context.Context // 5. 组装订单列表 var resultList []types.OrderItem - productCache := make(map[int64]string) // 产品ID -> 产品名称缓存 + productCache := make(map[string]string) // 产品ID -> 产品名称缓存 for _, orderInfo := range pagedOrderList { // 查询订单信息 @@ -344,7 +344,7 @@ func (l *GetSubordinateContributionDetailLogic) getOrderList(ctx context.Context } // getInviteList 获取邀请列表 -func (l *GetSubordinateContributionDetailLogic) getInviteList(ctx context.Context, subordinateId int64, page, pageSize int64) ([]types.InviteItem, int64, error) { +func (l *GetSubordinateContributionDetailLogic) getInviteList(ctx context.Context, subordinateId string, page, pageSize int64) ([]types.InviteItem, int64, error) { // 查询总数 builder := l.svcCtx.AgentRelationModel.SelectBuilder(). Where("parent_id = ? AND relation_type = ? AND del_state = ?", subordinateId, 1, globalkey.DelStateNo) diff --git a/app/main/api/internal/logic/agent/getteamlistlogic.go b/app/main/api/internal/logic/agent/getteamlistlogic.go index c4b76bf..3477c53 100644 --- a/app/main/api/internal/logic/agent/getteamlistlogic.go +++ b/app/main/api/internal/logic/agent/getteamlistlogic.go @@ -50,12 +50,12 @@ func (l *GetTeamListLogic) GetTeamList(req *types.GetTeamListReq) (resp *types.G } // 2. 递归查询所有下级(直接+间接) - allSubordinateIds := make(map[int64]bool) - directSubordinateIds := make(map[int64]bool) + allSubordinateIds := make(map[string]bool) + directSubordinateIds := make(map[string]bool) // 递归函数:收集所有下级ID - var collectSubordinates func(int64) error - collectSubordinates = func(parentId int64) error { + var collectSubordinates func(string) error + collectSubordinates = func(parentId string) error { // 查询直接下级 builder := l.svcCtx.AgentRelationModel.SelectBuilder(). Where("parent_id = ? AND relation_type = ? AND del_state = ?", parentId, 1, globalkey.DelStateNo) @@ -94,7 +94,7 @@ func (l *GetTeamListLogic) GetTeamList(req *types.GetTeamListReq) (resp *types.G } // 4. 将下级ID转换为切片用于查询 - subordinateIds := make([]int64, 0, len(allSubordinateIds)) + subordinateIds := make([]string, 0, len(allSubordinateIds)) for id := range allSubordinateIds { subordinateIds = append(subordinateIds, id) } @@ -183,7 +183,7 @@ func (l *GetTeamListLogic) GetTeamList(req *types.GetTeamListReq) (resp *types.G // calculateTeamStatistics 计算团队统计数据 // 注意:所有统计都基于 subordinateIds(下级ID列表),不包含自己的数据 -func (l *GetTeamListLogic) calculateTeamStatistics(agentId int64, subordinateIds []int64, todayStart, monthStart time.Time) types.TeamStatistics { +func (l *GetTeamListLogic) calculateTeamStatistics(agentId string, subordinateIds []string, todayStart, monthStart time.Time) types.TeamStatistics { // 团队成员总数:只统计下级,不包括自己 stats := types.TeamStatistics{ TotalMembers: int64(len(subordinateIds)), @@ -213,7 +213,7 @@ func (l *GetTeamListLogic) calculateTeamStatistics(agentId int64, subordinateIds Where("agent_id = ? AND del_state = ?", agentId, globalkey.DelStateNo). Where("source_agent_id != ?", agentId). // 明确排除自己 Where(squirrel.Eq{"source_agent_id": subordinateIds}) - + // 统计去重的订单数量 totalQueries := l.countDistinctOrders(l.ctx, rebateBuilder) stats.TotalQueries = totalQueries @@ -259,7 +259,7 @@ func (l *GetTeamListLogic) countDistinctOrders(ctx context.Context, builder squi return 0 } - orderIdSet := make(map[int64]bool) + orderIdSet := make(map[string]bool) for _, rebate := range rebates { orderIdSet[rebate.OrderId] = true } @@ -275,7 +275,7 @@ func (l *GetTeamListLogic) countDistinctOrdersForMember(ctx context.Context, bui return 0 } - orderIdSet := make(map[int64]bool) + orderIdSet := make(map[string]bool) for _, rebate := range rebates { orderIdSet[rebate.OrderId] = true } @@ -284,7 +284,7 @@ func (l *GetTeamListLogic) countDistinctOrdersForMember(ctx context.Context, bui } // buildTeamMemberItem 构建团队成员项 -func (l *GetTeamListLogic) buildTeamMemberItem(agentId int64, member *model.Agent, directSubordinateIds map[int64]bool, todayStart time.Time) types.TeamMemberItem { +func (l *GetTeamListLogic) buildTeamMemberItem(agentId string, member *model.Agent, directSubordinateIds map[string]bool, todayStart time.Time) types.TeamMemberItem { levelName := "" switch member.Level { case 1: diff --git a/app/main/api/internal/logic/agent/getteamstatisticslogic.go b/app/main/api/internal/logic/agent/getteamstatisticslogic.go index 01cdb44..698be2d 100644 --- a/app/main/api/internal/logic/agent/getteamstatisticslogic.go +++ b/app/main/api/internal/logic/agent/getteamstatisticslogic.go @@ -47,12 +47,12 @@ func (l *GetTeamStatisticsLogic) GetTeamStatistics() (resp *types.TeamStatistics } // 2. 递归查询所有下级(直接+间接) - allSubordinateIds := make(map[int64]bool) - directSubordinateIds := make(map[int64]bool) + allSubordinateIds := make(map[string]bool) + directSubordinateIds := make(map[string]bool) // 递归函数:收集所有下级ID - var collectSubordinates func(int64) error - collectSubordinates = func(parentId int64) error { + var collectSubordinates func(string) error + collectSubordinates = func(parentId string) error { // 查询直接下级 builder := l.svcCtx.AgentRelationModel.SelectBuilder(). Where("parent_id = ? AND relation_type = ? AND del_state = ?", parentId, 1, globalkey.DelStateNo) @@ -63,23 +63,23 @@ func (l *GetTeamStatisticsLogic) GetTeamStatistics() (resp *types.TeamStatistics for _, relation := range relations { // 如果是第一层,标记为直接下级 - if parentId == agent.Id { - directSubordinateIds[relation.ChildId] = true - } - // 添加到所有下级集合 - allSubordinateIds[relation.ChildId] = true - // 递归查询下级的下级 - if err := collectSubordinates(relation.ChildId); err != nil { - return err - } - } - return nil - } + if parentId == agent.Id { + directSubordinateIds[relation.ChildId] = true + } + // 添加到所有下级集合 + allSubordinateIds[relation.ChildId] = true + // 递归查询下级的下级 + if err := collectSubordinates(relation.ChildId); err != nil { + return err + } + } + return nil + } // 开始递归收集所有下级 - if err := collectSubordinates(agent.Id); err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询下级关系失败, %v", err) - } + if err := collectSubordinates(agent.Id); err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询下级关系失败, %v", err) + } // 3. 获取当前时间用于统计今日和本月新增 now := time.Now() @@ -100,10 +100,10 @@ func (l *GetTeamStatisticsLogic) GetTeamStatistics() (resp *types.TeamStatistics } // 5. 将下级ID转换为切片用于查询 - subordinateIds := make([]int64, 0, len(allSubordinateIds)) - for id := range allSubordinateIds { - subordinateIds = append(subordinateIds, id) - } + subordinateIds := make([]string, 0, len(allSubordinateIds)) + for id := range allSubordinateIds { + subordinateIds = append(subordinateIds, id) + } // 6. 查询所有下级代理信息 builder := l.svcCtx.AgentModel.SelectBuilder(). diff --git a/app/main/api/internal/logic/agent/getupgraderebatelistlogic.go b/app/main/api/internal/logic/agent/getupgraderebatelistlogic.go index 82f7235..70e6a98 100644 --- a/app/main/api/internal/logic/agent/getupgraderebatelistlogic.go +++ b/app/main/api/internal/logic/agent/getupgraderebatelistlogic.go @@ -82,7 +82,7 @@ func (l *GetUpgradeRebateListLogic) GetUpgradeRebateList(req *types.GetUpgradeRe for _, upgrade := range upgrades { // 查询来源代理手机号(升级的代理) sourceAgentMobile := "" - if upgrade.AgentId > 0 { + if upgrade.AgentId != "" { sourceAgent, err := l.svcCtx.AgentModel.FindOne(l.ctx, upgrade.AgentId) if err == nil { if sourceAgent.Mobile != "" { diff --git a/app/main/api/internal/logic/agent/registerbyinvitecodelogic.go b/app/main/api/internal/logic/agent/registerbyinvitecodelogic.go index f87b182..be625cb 100644 --- a/app/main/api/internal/logic/agent/registerbyinvitecodelogic.go +++ b/app/main/api/internal/logic/agent/registerbyinvitecodelogic.go @@ -5,12 +5,15 @@ import ( "database/sql" "fmt" "os" + "strconv" "time" "ycc-server/app/main/model" "ycc-server/common/ctxdata" + "ycc-server/common/globalkey" "ycc-server/common/xerr" "ycc-server/pkg/lzkit/crypto" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -57,33 +60,26 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn } } - // 1. 查询邀请码 - inviteCodeModel, err := l.svcCtx.AgentInviteCodeModel.FindOneByCode(l.ctx, req.InviteCode) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码不存在"), "") - } + var inviteCodeModel *model.AgentInviteCode + inviteCodeModel, err = l.svcCtx.AgentInviteCodeModel.FindOneByCode(l.ctx, req.Referrer) + if err != nil && !errors.Is(err, model.ErrNotFound) { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请码失败, %v", err) } - - // 2. 验证邀请码状态 - // 钻石级别的邀请码只能使用一次,使用后立即失效 - // 普通级别的邀请码可以无限使用 - if inviteCodeModel.Status != 0 { - if inviteCodeModel.Status == 1 { - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已使用"), "") + if inviteCodeModel != nil { + if inviteCodeModel.Status != 0 { + if inviteCodeModel.Status == 1 { + return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已使用"), "") + } + return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已失效"), "") + } + if inviteCodeModel.ExpireTime.Valid && inviteCodeModel.ExpireTime.Time.Before(time.Now()) { + return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "") } - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已失效"), "") - } - - // 3. 验证邀请码是否过期 - if inviteCodeModel.ExpireTime.Valid && inviteCodeModel.ExpireTime.Time.Before(time.Now()) { - return nil, errors.Wrapf(xerr.NewErrMsg("邀请码已过期"), "") } // 4. 使用事务处理注册 - var userID int64 - var agentID int64 + var userID string + var agentID string var agentLevel int64 err = l.svcCtx.AgentInviteCodeModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { @@ -113,15 +109,11 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn // 注意:非微信环境下 claims 为 nil,此逻辑不会执行,直接使用已存在的 user.Id claims, err := ctxdata.GetClaimsFromCtx(l.ctx) if err == nil && claims != nil && claims.UserType == model.UserTypeTemp { - userTemp, err := l.svcCtx.UserTempModel.FindOne(l.ctx, claims.UserId) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询临时用户失败, %v", err) - } - userAuth, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, user.Id, userTemp.AuthType) + userAuth, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, user.Id, claims.AuthType) if err != nil && !errors.Is(err, model.ErrNotFound) { return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户认证失败, %v", err) } - if userAuth != nil && userAuth.AuthKey != userTemp.AuthKey { + if userAuth != nil && userAuth.AuthKey != claims.AuthKey { return errors.Wrapf(xerr.NewErrMsg("该手机号已绑定其他微信号"), "") } // 绑定临时用户到正式用户 @@ -134,19 +126,37 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn userID = user.Id } - // 4.2 获取邀请码信息 - targetLevel := inviteCodeModel.TargetLevel - var parentAgentId int64 = 0 - if inviteCodeModel.AgentId.Valid { - parentAgentId = inviteCodeModel.AgentId.Int64 + var targetLevel int64 + var parentAgentId string + if inviteCodeModel != nil { + targetLevel = inviteCodeModel.TargetLevel + if inviteCodeModel.AgentId.Valid { + parentAgentId = inviteCodeModel.AgentId.String + } + } else { + if codeVal, parseErr := strconv.ParseInt(req.Referrer, 10, 64); parseErr == nil && codeVal > 0 { + parentAgent, err := l.findAgentByCode(transCtx, codeVal) + if err != nil { + return errors.Wrapf(err, "") + } + parentAgentId = parentAgent.Id + targetLevel = 1 + } else { + encRefMobile, _ := crypto.EncryptMobile(req.Referrer, l.svcCtx.Config.Encrypt.SecretKey) + agents, findErr := l.svcCtx.AgentModel.FindAll(transCtx, l.svcCtx.AgentModel.SelectBuilder().Where("mobile = ? AND del_state = ?", encRefMobile, globalkey.DelStateNo).Limit(1), "") + if findErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询上级代理失败, %v", findErr) + } + if len(agents) == 0 { + return errors.Wrapf(xerr.NewErrMsg("邀请信息无效"), "") + } + parentAgentId = agents[0].Id + targetLevel = 1 + } } // 4.3 创建代理记录 - newAgent := &model.Agent{ - UserId: userID, - Level: targetLevel, - Mobile: encryptedMobile, - } + newAgent := &model.Agent{Id: uuid.NewString(), UserId: userID, Level: targetLevel, Mobile: encryptedMobile} if req.Region != "" { newAgent.Region = sql.NullString{String: req.Region, Valid: true} } @@ -155,7 +165,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn } // 4.4 处理上级关系 - if parentAgentId > 0 { + if parentAgentId != "" { // 查找上级代理 parentAgent, err := l.svcCtx.AgentModel.FindOne(transCtx, parentAgentId) if err != nil { @@ -172,57 +182,50 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn if err != nil { return errors.Wrapf(err, "查找团队首领失败") } - if teamLeaderId > 0 { - newAgent.TeamLeaderId = sql.NullInt64{Int64: teamLeaderId, Valid: true} + if teamLeaderId != "" { + newAgent.TeamLeaderId = sql.NullString{String: teamLeaderId, Valid: true} } - // 先插入代理记录 - agentResult, err := l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) + newAgent.AgentCode = 0 + _, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) if err != nil { return errors.Wrapf(err, "创建代理记录失败") } - agentID, _ = agentResult.LastInsertId() - newAgent.Id = agentID + agentID = newAgent.Id // 建立关系 - relation := &model.AgentRelation{ - ParentId: parentAgent.Id, - ChildId: agentID, - RelationType: 1, // 直接关系 - } + relation := &model.AgentRelation{Id: uuid.NewString(), ParentId: parentAgent.Id, ChildId: agentID, RelationType: 1} if _, err := l.svcCtx.AgentRelationModel.Insert(transCtx, session, relation); err != nil { return errors.Wrapf(err, "建立代理关系失败") } } else { // 平台发放的钻石邀请码,独立成团队 if targetLevel == 3 { - // 先插入代理记录 - agentResult, err := l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) + newAgent.AgentCode = 0 + _, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) if err != nil { return errors.Wrapf(err, "创建代理记录失败") } - agentID, _ = agentResult.LastInsertId() - newAgent.Id = agentID + agentID = newAgent.Id // 设置自己为团队首领 - newAgent.TeamLeaderId = sql.NullInt64{Int64: agentID, Valid: true} + newAgent.TeamLeaderId = sql.NullString{String: agentID, Valid: true} if err := l.svcCtx.AgentModel.UpdateInTransaction(transCtx, session, newAgent); err != nil { return errors.Wrapf(err, "更新团队首领失败") } } else { // 普通/黄金代理,但没有上级(异常情况) - agentResult, err := l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) + newAgent.AgentCode = 0 + _, err = l.svcCtx.AgentModel.Insert(transCtx, session, newAgent) if err != nil { return errors.Wrapf(err, "创建代理记录失败") } - agentID, _ = agentResult.LastInsertId() + agentID = newAgent.Id } } // 4.5 初始化钱包 - wallet := &model.AgentWallet{ - AgentId: agentID, - } + wallet := &model.AgentWallet{Id: uuid.NewString(), AgentId: agentID} if _, err := l.svcCtx.AgentWalletModel.Insert(transCtx, session, wallet); err != nil { return errors.Wrapf(err, "初始化钱包失败") } @@ -234,25 +237,21 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn // 钻石邀请码:使用后失效 inviteCodeModel.Status = 1 // 已使用(使用后立即失效) } - // 记录使用信息(用于统计,普通邀请码可以多次使用) - inviteCodeModel.UsedUserId = sql.NullInt64{Int64: userID, Valid: true} - inviteCodeModel.UsedAgentId = sql.NullInt64{Int64: agentID, Valid: true} - inviteCodeModel.UsedTime = sql.NullTime{Time: time.Now(), Valid: true} - if err := l.svcCtx.AgentInviteCodeModel.UpdateWithVersion(transCtx, session, inviteCodeModel); err != nil { - return errors.Wrapf(err, "更新邀请码状态失败") + if inviteCodeModel != nil { + inviteCodeModel.UsedUserId = sql.NullString{String: userID, Valid: true} + inviteCodeModel.UsedAgentId = sql.NullString{String: agentID, Valid: true} + inviteCodeModel.UsedTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := l.svcCtx.AgentInviteCodeModel.UpdateWithVersion(transCtx, session, inviteCodeModel); err != nil { + return errors.Wrapf(err, "更新邀请码状态失败") + } } // 4.7 记录邀请码使用历史(用于统计和查询) - usage := &model.AgentInviteCodeUsage{ - InviteCodeId: inviteCodeModel.Id, - Code: inviteCodeModel.Code, - UserId: userID, - AgentId: agentID, - AgentLevel: targetLevel, - UsedTime: time.Now(), - } - if _, err := l.svcCtx.AgentInviteCodeUsageModel.Insert(transCtx, session, usage); err != nil { - return errors.Wrapf(err, "记录邀请码使用历史失败") + if inviteCodeModel != nil { + usage := &model.AgentInviteCodeUsage{Id: uuid.NewString(), InviteCodeId: inviteCodeModel.Id, Code: inviteCodeModel.Code, UserId: userID, AgentId: agentID, AgentLevel: targetLevel, UsedTime: time.Now()} + if _, err := l.svcCtx.AgentInviteCodeUsageModel.Insert(transCtx, session, usage); err != nil { + return errors.Wrapf(err, "记录邀请码使用历史失败") + } } agentLevel = targetLevel @@ -280,6 +279,7 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn case 3: levelName = "钻石" } + agent, _ := l.svcCtx.AgentModel.FindOne(l.ctx, agentID) return &types.RegisterByInviteCodeResp{ AccessToken: token, AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, @@ -287,11 +287,17 @@ func (l *RegisterByInviteCodeLogic) RegisterByInviteCode(req *types.RegisterByIn AgentId: agentID, Level: agentLevel, LevelName: levelName, + AgentCode: func() int64 { + if agent != nil { + return agent.AgentCode + } + return 0 + }(), }, nil } // findTeamLeader 查找团队首领(钻石代理) -func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId int64) (int64, error) { +func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId string) (string, error) { currentId := agentId maxDepth := 100 depth := 0 @@ -301,22 +307,22 @@ func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId Where("child_id = ? AND relation_type = ? AND del_state = ?", currentId, 1, 0) relations, err := l.svcCtx.AgentRelationModel.FindAll(ctx, builder, "") if err != nil { - return 0, err + return "", err } if len(relations) == 0 { agent, err := l.svcCtx.AgentModel.FindOne(ctx, currentId) if err != nil { - return 0, err + return "", err } if agent.Level == 3 { return agent.Id, nil } - return 0, nil + return "", nil } parentAgent, err := l.svcCtx.AgentModel.FindOne(ctx, relations[0].ParentId) if err != nil { - return 0, err + return "", err } if parentAgent.Level == 3 { @@ -327,5 +333,30 @@ func (l *RegisterByInviteCodeLogic) findTeamLeader(ctx context.Context, agentId depth++ } - return 0, nil + return "", nil +} + +func (l *RegisterByInviteCodeLogic) findAgentByCode(ctx context.Context, code int64) (*model.Agent, error) { + builder := l.svcCtx.AgentModel.SelectBuilder().Where("agent_code = ? AND del_state = ?", code, globalkey.DelStateNo).Limit(1) + agents, err := l.svcCtx.AgentModel.FindAll(ctx, builder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询上级代理失败, %v", err) + } + if len(agents) == 0 { + return nil, errors.Wrapf(xerr.NewErrMsg("上级邀请码不存在"), "") + } + return agents[0], nil +} + +func (l *RegisterByInviteCodeLogic) allocateAgentCode(ctx context.Context, session sqlx.Session) (int64, error) { + builder := l.svcCtx.AgentModel.SelectBuilder().OrderBy("agent_code DESC").Limit(1) + rows, err := l.svcCtx.AgentModel.FindAll(ctx, builder, "") + if err != nil { + return 0, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理编码失败, %v", err) + } + var next int64 = 16800 + if len(rows) > 0 && rows[0].AgentCode > 0 { + next = rows[0].AgentCode + 1 + } + return next, nil } diff --git a/app/main/api/internal/logic/agent/shortlinkredirectlogic.go b/app/main/api/internal/logic/agent/shortlinkredirectlogic.go index 2f80d9e..51adef8 100644 --- a/app/main/api/internal/logic/agent/shortlinkredirectlogic.go +++ b/app/main/api/internal/logic/agent/shortlinkredirectlogic.go @@ -60,15 +60,10 @@ func (l *ShortLinkRedirectLogic) ShortLinkRedirect(shortCode string, r *http.Req } } } else if shortLink.Type == 2 { - // 邀请好友类型:验证邀请码是否存在 if shortLink.InviteCode.Valid && shortLink.InviteCode.String != "" { _, err = l.svcCtx.AgentInviteCodeModel.FindOneByCode(l.ctx, shortLink.InviteCode.String) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - return errors.Wrapf(xerr.NewErrCode(xerr.REUQEST_PARAM_ERROR), "邀请码不存在或已失效") - } + if err != nil && !errors.Is(err, model.ErrNotFound) { l.Errorf("查询邀请码失败: %v", err) - // 即使查询失败,也继续重定向,避免影响用户体验 } } } @@ -111,4 +106,3 @@ func (l *ShortLinkRedirectLogic) ShortLinkRedirect(shortCode string, r *http.Req return nil } - diff --git a/app/main/api/internal/logic/agent/upgradesubordinatelogic.go b/app/main/api/internal/logic/agent/upgradesubordinatelogic.go index 8f7b19a..15fad45 100644 --- a/app/main/api/internal/logic/agent/upgradesubordinatelogic.go +++ b/app/main/api/internal/logic/agent/upgradesubordinatelogic.go @@ -9,6 +9,7 @@ import ( "ycc-server/common/xerr" "ycc-server/pkg/lzkit/lzUtils" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -79,21 +80,21 @@ func (l *UpgradeSubordinateLogic) UpgradeSubordinate(req *types.UpgradeSubordina err = l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 7.1 创建升级记录 upgradeRecord := &model.AgentUpgrade{ + Id: uuid.New().String(), AgentId: subordinateAgent.Id, FromLevel: 1, // 普通 ToLevel: toLevel, UpgradeType: 2, // 钻石升级下级 UpgradeFee: 0, // 免费 RebateAmount: 0, // 无返佣 - OperatorAgentId: sql.NullInt64{Int64: operatorAgent.Id, Valid: true}, + OperatorAgentId: sql.NullString{String: operatorAgent.Id, Valid: true}, Status: 1, // 待处理 } - upgradeResult, err := l.svcCtx.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord) + _, err := l.svcCtx.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord) if err != nil { return errors.Wrapf(err, "创建升级记录失败") } - upgradeId, _ := upgradeResult.LastInsertId() // 7.2 执行升级操作 if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, subordinateAgent.Id, toLevel, 2, 0, 0, "", operatorAgent.Id); err != nil { @@ -101,7 +102,6 @@ func (l *UpgradeSubordinateLogic) UpgradeSubordinate(req *types.UpgradeSubordina } // 7.3 更新升级记录状态 - upgradeRecord.Id = upgradeId upgradeRecord.Status = 2 // 已完成 upgradeRecord.Remark = lzUtils.StringToNullString("钻石代理升级下级成功") if err := l.svcCtx.AgentUpgradeModel.UpdateWithVersion(transCtx, session, upgradeRecord); err != nil { @@ -121,7 +121,7 @@ func (l *UpgradeSubordinateLogic) UpgradeSubordinate(req *types.UpgradeSubordina } // isSubordinate 递归检查 targetId 是否是 parentId 的下级(直接或间接) -func (l *UpgradeSubordinateLogic) isSubordinate(parentId, targetId int64) bool { +func (l *UpgradeSubordinateLogic) isSubordinate(parentId, targetId string) bool { // 查询直接下级 builder := l.svcCtx.AgentRelationModel.SelectBuilder(). Where("parent_id = ? AND relation_type = ? AND del_state = ?", parentId, 1, globalkey.DelStateNo) diff --git a/app/main/api/internal/logic/app/getappconfiglogic.go b/app/main/api/internal/logic/app/getappconfiglogic.go new file mode 100644 index 0000000..b120647 --- /dev/null +++ b/app/main/api/internal/logic/app/getappconfiglogic.go @@ -0,0 +1,42 @@ +package app + +import ( + "context" + "strconv" + + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAppConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAppConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAppConfigLogic { + return &GetAppConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAppConfigLogic) GetAppConfig() (resp *types.GetAppConfigResp, err error) { + retentionDays := int64(0) + cfg, cfgErr := l.svcCtx.QueryCleanupConfigModel.FindOneByConfigKey(l.ctx, "retention_days") + if cfgErr == nil && cfg.Status == 1 { + if v, parseErr := strconv.ParseInt(cfg.ConfigValue, 10, 64); parseErr == nil && v >= 0 { + retentionDays = v + } + } else if cfgErr != nil && cfgErr != model.ErrNotFound { + l.Errorf("获取清理配置失败: %v", cfgErr) + } + + return &types.GetAppConfigResp{ + QueryRetentionDays: retentionDays, + }, nil +} diff --git a/app/main/api/internal/logic/authorization/downloadauthorizationdocumentlogic.go b/app/main/api/internal/logic/authorization/downloadauthorizationdocumentlogic.go index 488bd6a..67f121b 100644 --- a/app/main/api/internal/logic/authorization/downloadauthorizationdocumentlogic.go +++ b/app/main/api/internal/logic/authorization/downloadauthorizationdocumentlogic.go @@ -28,13 +28,13 @@ func (l *DownloadAuthorizationDocumentLogic) DownloadAuthorizationDocument(req * // 1. 从数据库获取授权书信息 authDoc, err := l.svcCtx.AuthorizationDocumentModel.FindOne(l.ctx, req.DocumentId) if err != nil { - logx.Errorf("获取授权书失败: documentId=%d, error=%v", req.DocumentId, err) + logx.Errorf("获取授权书失败: documentId=%s, error=%v", req.DocumentId, err) return nil, err } // 2. 检查授权书状态 if authDoc.Status != "active" { - logx.Errorf("授权书状态异常: documentId=%d, status=%s", req.DocumentId, authDoc.Status) + logx.Errorf("授权书状态异常: documentId=%s, status=%s", req.DocumentId, authDoc.Status) return nil, errors.New("授权书不可用") } diff --git a/app/main/api/internal/logic/authorization/getauthorizationdocumentbyorderlogic.go b/app/main/api/internal/logic/authorization/getauthorizationdocumentbyorderlogic.go index c489f67..7610b30 100644 --- a/app/main/api/internal/logic/authorization/getauthorizationdocumentbyorderlogic.go +++ b/app/main/api/internal/logic/authorization/getauthorizationdocumentbyorderlogic.go @@ -37,7 +37,7 @@ func (l *GetAuthorizationDocumentByOrderLogic) GetAuthorizationDocumentByOrder(r // 只返回状态为active的授权书 if authDoc.Status == "active" { fullFileURL := l.svcCtx.AuthorizationService.GetFullFileURL(authDoc.FileUrl) - + documents = append(documents, types.AuthorizationDocumentInfo{ DocumentId: authDoc.Id, UserId: authDoc.UserId, diff --git a/app/main/api/internal/logic/pay/alipaycallbacklogic.go b/app/main/api/internal/logic/pay/alipaycallbacklogic.go index 6a088c8..cdfcc6f 100644 --- a/app/main/api/internal/logic/pay/alipaycallbacklogic.go +++ b/app/main/api/internal/logic/pay/alipaycallbacklogic.go @@ -182,7 +182,7 @@ func (l *AlipayCallbackLogic) handleAgentUpgradeOrderPayment(w http.ResponseWrit if order.Status == "paid" { err := l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 8.1 执行升级操作 - if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, upgradeRecord.AgentId, upgradeRecord.ToLevel, upgradeRecord.UpgradeType, upgradeRecord.UpgradeFee, upgradeRecord.RebateAmount, orderNo, 0); err != nil { + if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, upgradeRecord.AgentId, upgradeRecord.ToLevel, upgradeRecord.UpgradeType, upgradeRecord.UpgradeFee, upgradeRecord.RebateAmount, orderNo, ""); err != nil { return errors.Wrapf(err, "执行升级操作失败") } diff --git a/app/main/api/internal/logic/pay/iapcallbacklogic.go b/app/main/api/internal/logic/pay/iapcallbacklogic.go index df8495e..f853c64 100644 --- a/app/main/api/internal/logic/pay/iapcallbacklogic.go +++ b/app/main/api/internal/logic/pay/iapcallbacklogic.go @@ -2,11 +2,12 @@ package pay import ( "context" + "fmt" + "time" "ycc-server/app/main/api/internal/svc" "ycc-server/app/main/api/internal/types" "ycc-server/common/xerr" "ycc-server/pkg/lzkit/lzUtils" - "time" "github.com/pkg/errors" @@ -29,7 +30,7 @@ func NewIapCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *IapCa func (l *IapCallbackLogic) IapCallback(req *types.IapCallbackReq) error { // Step 1: 查找订单 - order, findOrderErr := l.svcCtx.OrderModel.FindOne(l.ctx, req.OrderID) + order, findOrderErr := l.svcCtx.OrderModel.FindOne(l.ctx, fmt.Sprintf("%d", req.OrderID)) if findOrderErr != nil { logx.Errorf("苹果内购支付回调,查找订单失败: %+v", findOrderErr) return nil diff --git a/app/main/api/internal/logic/pay/paymentlogic.go b/app/main/api/internal/logic/pay/paymentlogic.go index 936a696..a443261 100644 --- a/app/main/api/internal/logic/pay/paymentlogic.go +++ b/app/main/api/internal/logic/pay/paymentlogic.go @@ -16,6 +16,7 @@ import ( "ycc-server/common/xerr" "ycc-server/pkg/lzkit/lzUtils" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/logx" @@ -31,7 +32,7 @@ type PaymentTypeResp struct { amount float64 outTradeNo string description string - orderID int64 // 订单ID,用于开发环境测试支付模式 + orderID string // 订单ID,用于开发环境测试支付模式 } func NewPaymentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentLogic { @@ -45,7 +46,7 @@ func NewPaymentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentLo func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, err error) { var paymentTypeResp *PaymentTypeResp var prepayData interface{} - var orderID int64 + var orderID string // 检查是否为开发环境的测试支付模式 env := os.Getenv("ENV") @@ -77,14 +78,14 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, // 注意:订单状态更新在事务外进行,避免在事务中查询不到订单的问题 if isDevTestPayment { // 获取订单ID(从 QueryOrderPayment 返回的 orderID) - if paymentTypeResp.orderID <= 0 { + if paymentTypeResp.orderID == "" { return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "开发测试模式,订单ID无效") } orderID = paymentTypeResp.orderID // 在事务中只记录订单ID,不更新订单状态 // 订单状态的更新和后续流程在事务提交后处理 - logx.Infof("开发环境测试支付模式:订单 %s (ID: %d) 将在事务提交后更新状态", paymentTypeResp.outTradeNo, orderID) + logx.Infof("开发环境测试支付模式:订单 %s (ID: %s) 将在事务提交后更新状态", paymentTypeResp.outTradeNo, orderID) // 返回测试支付标识 prepayData = "test_payment_success" @@ -110,7 +111,7 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, } // 开发环境测试支付模式:事务提交后处理订单状态更新和后续流程 - if isDevTestPayment && paymentTypeResp != nil && paymentTypeResp.orderID > 0 { + if isDevTestPayment && paymentTypeResp != nil && paymentTypeResp.orderID != "" { // 使用 goroutine 异步处理,确保事务已完全提交 go func() { // 短暂延迟,确保事务已完全提交到数据库 @@ -121,7 +122,7 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, // 查找订单并更新状态为已支付 order, findOrderErr := l.svcCtx.OrderModel.FindOne(context.Background(), finalOrderID) if findOrderErr != nil { - logx.Errorf("开发测试模式,查找订单失败,订单ID: %d, 错误: %v", finalOrderID, findOrderErr) + logx.Errorf("开发测试模式,查找订单失败,订单ID: %s, 错误: %v", finalOrderID, findOrderErr) return } @@ -133,17 +134,17 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, // 空报告模式:在 PaymentPlatform 字段中标记,用于后续生成空报告 if isEmptyReportMode { order.PaymentPlatform = "test_empty" - logx.Infof("开发环境空报告模式:订单 %s (ID: %d) 已标记为空报告模式", paymentTypeResp.outTradeNo, finalOrderID) + logx.Infof("开发环境空报告模式:订单 %s (ID: %s) 已标记为空报告模式", paymentTypeResp.outTradeNo, finalOrderID) } // 更新订单状态(在事务外执行) updateErr := l.svcCtx.OrderModel.UpdateWithVersion(context.Background(), nil, order) if updateErr != nil { - logx.Errorf("开发测试模式,更新订单状态失败,订单ID: %d, 错误: %+v", finalOrderID, updateErr) + logx.Errorf("开发测试模式,更新订单状态失败,订单ID: %s, 错误: %+v", finalOrderID, updateErr) return } - logx.Infof("开发环境测试支付模式:订单 %s (ID: %d) 已自动标记为已支付", paymentTypeResp.outTradeNo, finalOrderID) + logx.Infof("开发环境测试支付模式:订单 %s (ID: %s) 已自动标记为已支付", paymentTypeResp.outTradeNo, finalOrderID) // 再次短暂延迟,确保订单状态更新已提交 time.Sleep(100 * time.Millisecond) @@ -162,7 +163,7 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, // 执行升级操作 err := l.svcCtx.AgentWalletModel.Trans(context.Background(), func(transCtx context.Context, session sqlx.Session) error { - if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, upgradeRecord.AgentId, upgradeRecord.ToLevel, upgradeRecord.UpgradeType, upgradeRecord.UpgradeFee, upgradeRecord.RebateAmount, paymentTypeResp.outTradeNo, 0); err != nil { + if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, upgradeRecord.AgentId, upgradeRecord.ToLevel, upgradeRecord.UpgradeType, upgradeRecord.UpgradeFee, upgradeRecord.RebateAmount, paymentTypeResp.outTradeNo, ""); err != nil { return errors.Wrapf(err, "执行升级操作失败") } @@ -179,14 +180,14 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, if err != nil { logx.Errorf("开发测试模式,处理升级订单失败,订单号: %s, 错误: %+v", paymentTypeResp.outTradeNo, err) } else { - logx.Infof("开发测试模式,代理升级成功,订单号: %s, 代理ID: %d", paymentTypeResp.outTradeNo, upgradeRecord.AgentId) + logx.Infof("开发测试模式,代理升级成功,订单号: %s, 代理ID: %s", paymentTypeResp.outTradeNo, upgradeRecord.AgentId) } } else { // 查询订单:发送支付成功通知任务,触发后续流程(生成报告和代理处理) if sendErr := l.svcCtx.AsynqService.SendQueryTask(finalOrderID); sendErr != nil { - logx.Errorf("开发测试模式,发送支付成功通知任务失败,订单ID: %d, 错误: %+v", finalOrderID, sendErr) + logx.Errorf("开发测试模式,发送支付成功通知任务失败,订单ID: %s, 错误: %+v", finalOrderID, sendErr) } else { - logx.Infof("开发测试模式,已发送支付成功通知任务,订单ID: %d", finalOrderID) + logx.Infof("开发测试模式,已发送支付成功通知任务,订单ID: %s", finalOrderID) } } }() @@ -247,8 +248,8 @@ func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Ses if user.Inside == 1 { amount = 0.01 } - var orderID int64 order := model.Order{ + Id: uuid.NewString(), OrderNo: outTradeNo, UserId: userID, ProductId: product.Id, @@ -257,15 +258,11 @@ func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Ses Amount: amount, Status: "pending", } - orderInsertResult, insertOrderErr := l.svcCtx.OrderModel.Insert(l.ctx, session, &order) + _, 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 + orderID := order.Id // 如果是代理推广订单,创建完整的代理订单记录 if data.AgentIdentifier != "" && agentLinkModel != nil { @@ -279,7 +276,7 @@ func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Ses productConfig, err := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, product.Id) if err != nil { if errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单失败,产品配置不存在, productId: %d,请先在后台配置产品价格参数", product.Id) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单失败,产品配置不存在, productId: %s,请先在后台配置产品价格参数", product.Id) } return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 查询产品配置失败: %+v", err) } @@ -314,6 +311,7 @@ func (l *PaymentLogic) QueryOrderPayment(req *types.PaymentReq, session sqlx.Ses // 创建代理订单记录 agentOrder := model.AgentOrder{ + Id: uuid.NewString(), AgentId: agentLinkModel.AgentId, OrderId: orderID, ProductId: product.Id, @@ -346,10 +344,7 @@ func (l *PaymentLogic) AgentUpgradeOrderPayment(req *types.PaymentReq, session s } // 1. 解析升级记录ID - upgradeId, err := strconv.ParseInt(req.Id, 10, 64) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的升级记录ID: %s", req.Id) - } + upgradeId := req.Id // 2. 查找升级记录 upgradeRecord, err := l.svcCtx.AgentUpgradeModel.FindOne(l.ctx, upgradeId) @@ -374,8 +369,12 @@ func (l *PaymentLogic) AgentUpgradeOrderPayment(req *types.PaymentReq, session s return nil, errors.Wrapf(xerr.NewErrMsg("无权支付此升级订单"), "") } - // 5. 生成订单号(使用 U_ 前缀表示升级订单) - outTradeNo := fmt.Sprintf("U_%d_%d", upgradeId, time.Now().Unix()) + // 5. 生成订单号(升级订单前缀 U_,限制长度不超过32) + base := l.svcCtx.AlipayService.GenerateOutTradeNo() + outTradeNo := "U_" + base + if len(outTradeNo) > 32 { + outTradeNo = outTradeNo[:32] + } // 6. 获取用户信息(用于内部用户判断) user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) @@ -391,9 +390,10 @@ func (l *PaymentLogic) AgentUpgradeOrderPayment(req *types.PaymentReq, session s // 8. 创建订单记录 order := model.Order{ + Id: uuid.NewString(), OrderNo: outTradeNo, UserId: userID, - ProductId: 0, // 升级订单没有产品ID + ProductId: "", // 升级订单没有产品ID PaymentPlatform: req.PayMethod, PaymentScene: "app", Amount: amount, @@ -403,10 +403,8 @@ func (l *PaymentLogic) AgentUpgradeOrderPayment(req *types.PaymentReq, session s if insertOrderErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建订单失败: %+v", insertOrderErr) } - orderID, lastInsertIdErr := orderInsertResult.LastInsertId() - if lastInsertIdErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取订单ID失败: %+v", lastInsertIdErr) - } + _ = orderInsertResult + orderID := order.Id // 9. 更新升级记录的订单号 upgradeRecord.OrderNo = lzUtils.StringToNullString(outTradeNo) @@ -425,10 +423,10 @@ func (l *PaymentLogic) AgentUpgradeOrderPayment(req *types.PaymentReq, session s description := fmt.Sprintf("代理升级:%s → %s", fromLevelName, toLevelName) return &PaymentTypeResp{ - amount: amount, - outTradeNo: outTradeNo, + amount: amount, + outTradeNo: outTradeNo, description: description, - orderID: orderID, + orderID: orderID, }, nil } diff --git a/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go b/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go index bb608fc..e6d1d51 100644 --- a/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go +++ b/app/main/api/internal/logic/pay/wechatpaycallbacklogic.go @@ -177,7 +177,7 @@ func (l *WechatPayCallbackLogic) handleAgentUpgradeOrderPayment(w http.ResponseW if order.Status == "paid" { err := l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { // 8.1 执行升级操作 - if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, upgradeRecord.AgentId, upgradeRecord.ToLevel, upgradeRecord.UpgradeType, upgradeRecord.UpgradeFee, upgradeRecord.RebateAmount, orderNo, 0); err != nil { + if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, upgradeRecord.AgentId, upgradeRecord.ToLevel, upgradeRecord.UpgradeType, upgradeRecord.UpgradeFee, upgradeRecord.RebateAmount, orderNo, ""); err != nil { return errors.Wrapf(err, "执行升级操作失败") } diff --git a/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go b/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go index e32c3b5..48985af 100644 --- a/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go +++ b/app/main/api/internal/logic/pay/wechatpayrefundcallbacklogic.go @@ -174,7 +174,7 @@ func (l *WechatPayRefundCallbackLogic) WechatPayRefundCallback(w http.ResponseWr var statusDetermined bool = false if notification.Status != nil { - status = *notification.Status + status = *notification.Status statusDetermined = true } else if notification.SuccessTime != nil && !notification.SuccessTime.IsZero() { // 如果Status为空但SuccessTime有值,说明退款成功 @@ -219,7 +219,7 @@ func (l *WechatPayRefundCallbackLogic) WechatPayRefundCallback(w http.ResponseWr } // findLatestPendingRefund 查找订单最新的pending状态退款记录 -func (l *WechatPayRefundCallbackLogic) findLatestPendingRefund(ctx context.Context, orderId int64) (*model.OrderRefund, error) { +func (l *WechatPayRefundCallbackLogic) findLatestPendingRefund(ctx context.Context, orderId string) (*model.OrderRefund, error) { // 使用SelectBuilder查询最新的pending状态退款记录 builder := l.svcCtx.OrderRefundModel.SelectBuilder(). Where("order_id = ? AND status = ? AND del_state = ?", orderId, model.OrderRefundStatusPending, globalkey.DelStateNo). diff --git a/app/main/api/internal/logic/product/getproductappbyenlogic.go b/app/main/api/internal/logic/product/getproductappbyenlogic.go index 3399806..6eadbf8 100644 --- a/app/main/api/internal/logic/product/getproductappbyenlogic.go +++ b/app/main/api/internal/logic/product/getproductappbyenlogic.go @@ -53,14 +53,14 @@ func (l *GetProductAppByEnLogic) GetProductAppByEn(req *types.GetProductByEnRequ source <- productFeature.FeatureId } }, func(item interface{}, writer mr.Writer[*model.Feature], cancel func(error)) { - id := item.(int64) + id := item.(string) 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 { + if feature != nil && feature.Id != "" { writer.Write(feature) } }, func(pipe <-chan *model.Feature, cancel func(error)) { diff --git a/app/main/api/internal/logic/product/getproductbyenlogic.go b/app/main/api/internal/logic/product/getproductbyenlogic.go index 609852b..561147b 100644 --- a/app/main/api/internal/logic/product/getproductbyenlogic.go +++ b/app/main/api/internal/logic/product/getproductbyenlogic.go @@ -2,9 +2,10 @@ package product import ( "context" + "fmt" + "sort" "ycc-server/app/main/model" "ycc-server/common/xerr" - "sort" "github.com/Masterminds/squirrel" "github.com/jinzhu/copier" @@ -44,13 +45,13 @@ func (l *GetProductByEnLogic) GetProductByEn(req *types.GetProductByEnRequest) ( if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品关联错误: %v", err) } - + // 创建featureId到sort的映射,用于后续排序 - featureSortMap := make(map[int64]int64) + featureSortMap := make(map[string]int64) for _, productFeature := range productFeatureAll { - featureSortMap[productFeature.FeatureId] = productFeature.Sort + featureSortMap[fmt.Sprintf("%d", productFeature.FeatureId)] = productFeature.Sort } - + var product types.Product err = copier.Copy(&product, productModel) if err != nil { @@ -61,14 +62,14 @@ func (l *GetProductByEnLogic) GetProductByEn(req *types.GetProductByEnRequest) ( source <- productFeature.FeatureId } }, func(item interface{}, writer mr.Writer[*model.Feature], cancel func(error)) { - id := item.(int64) + id := item.(string) 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 { + if feature != nil && feature.Id != "" { writer.Write(feature) } }, func(pipe <-chan *model.Feature, cancel func(error)) { diff --git a/app/main/api/internal/logic/query/query_common.go b/app/main/api/internal/logic/query/query_common.go new file mode 100644 index 0000000..9df0fb4 --- /dev/null +++ b/app/main/api/internal/logic/query/query_common.go @@ -0,0 +1,157 @@ +package query + +import ( + "context" + "database/sql" + "encoding/hex" + "encoding/json" + "fmt" + "ycc-server/common/xerr" + "ycc-server/pkg/lzkit/crypto" + "ycc-server/pkg/lzkit/lzUtils" + + "github.com/jinzhu/copier" + "github.com/pkg/errors" + + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" +) + +func ProcessQueryData(queryData sql.NullString, target *[]types.QueryItem, key []byte) error { + queryDataStr := lzUtils.NullStringToString(queryData) + if queryDataStr == "" { + return nil + } + decryptedData, decryptErr := crypto.AesDecrypt(queryDataStr, key) + if decryptErr != nil { + return decryptErr + } + var decryptedArray []map[string]interface{} + unmarshalErr := json.Unmarshal(decryptedData, &decryptedArray) + if unmarshalErr != nil { + return unmarshalErr + } + if len(*target) == 0 { + *target = make([]types.QueryItem, len(decryptedArray)) + } + for i := 0; i < len(decryptedArray); i++ { + (*target)[i].Data = decryptedArray[i] + } + return nil +} + +func ProcessQueryParams(QueryParams string, target *map[string]interface{}, key []byte) error { + decryptedData, decryptErr := crypto.AesDecrypt(QueryParams, key) + if decryptErr != nil { + return decryptErr + } + unmarshalErr := json.Unmarshal(decryptedData, target) + if unmarshalErr != nil { + return unmarshalErr + } + return nil +} + +func UpdateFeatureAndProductFeature(ctx context.Context, svcCtx *svc.ServiceContext, productID string, target *[]types.QueryItem) error { + for i := len(*target) - 1; i >= 0; i-- { + queryItem := &(*target)[i] + data, ok := queryItem.Data.(map[string]interface{}) + if !ok { + return fmt.Errorf("queryItem.Data 必须是 map[string]interface{} 类型") + } + apiID, ok := data["apiID"].(string) + if !ok { + return fmt.Errorf("queryItem.Data 中的 apiID 必须是字符串类型") + } + feature, err := svcCtx.FeatureModel.FindOneByApiId(ctx, apiID) + if err != nil { + *target = append((*target)[:i], (*target)[i+1:]...) + continue + } + builder := svcCtx.ProductFeatureModel.SelectBuilder().Where("product_id = ?", productID) + productFeatures, err := svcCtx.ProductFeatureModel.FindAll(ctx, builder, "") + if err != nil { + return fmt.Errorf("查询 ProductFeatureModel 错误: %v", err) + } + sort := 0 + for _, pf := range productFeatures { + if pf.FeatureId == feature.Id { + sort = int(pf.Sort) + break + } + } + featureData := map[string]interface{}{ + "featureName": feature.Name, + "sort": sort, + } + queryItem.Feature = featureData + } + return nil +} + +func BuildEncryptedQuery(ctx context.Context, svcCtx *svc.ServiceContext, queryModel *model.Query) (string, error) { + 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 := svcCtx.Config.Encrypt.SecretKey + key, decodeErr := hex.DecodeString(secretKey) + if decodeErr != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", decodeErr) + } + processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) + if processParamsErr != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告参数处理失败: %v", processParamsErr) + } + processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) + if processErr != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", processErr) + } + updateErr := UpdateFeatureAndProductFeature(ctx, svcCtx, queryModel.ProductId, &query.QueryData) + if updateErr != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", updateErr) + } + err := copier.Copy(&query, queryModel) + if err != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结构体复制失败, %v", err) + } + product, err := svcCtx.ProductModel.FindOne(ctx, queryModel.ProductId) + if err != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) + } + query.Product = product.ProductEn + query.ProductName = product.ProductName + queryBytes, marshalErr := json.Marshal(query) + if marshalErr != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 序列化查询结果失败: %v", marshalErr) + } + encryptedQuery, encryptErr := crypto.AesEncrypt(queryBytes, key) + if encryptErr != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 加密查询结果失败: %v", encryptErr) + } + return encryptedQuery, nil +} + +func IsOrderAgent(ctx context.Context, svcCtx *svc.ServiceContext, userId string, orderId string) (bool, error) { + agent, err := svcCtx.AgentModel.FindOneByUserId(ctx, userId) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return false, nil + } + return false, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败, %v", err) + } + if agent == nil { + return false, nil + } + agentOrder, err := svcCtx.AgentOrderModel.FindOneByOrderId(ctx, orderId) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return false, nil + } + return false, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理订单失败, %v", err) + } + if agentOrder == nil { + return false, nil + } + return agentOrder.AgentId == agent.Id, nil +} diff --git a/app/main/api/internal/logic/query/querydetailbyorderidlogic.go b/app/main/api/internal/logic/query/querydetailbyorderidlogic.go index 83165ef..81632e3 100644 --- a/app/main/api/internal/logic/query/querydetailbyorderidlogic.go +++ b/app/main/api/internal/logic/query/querydetailbyorderidlogic.go @@ -1,24 +1,16 @@ package query import ( - "context" - "database/sql" - "encoding/hex" - "encoding/json" - "fmt" - "ycc-server/common/ctxdata" - "ycc-server/common/xerr" - "ycc-server/pkg/lzkit/crypto" - "ycc-server/pkg/lzkit/lzUtils" + "context" + "ycc-server/common/ctxdata" + "ycc-server/common/xerr" + "github.com/pkg/errors" - "github.com/jinzhu/copier" - "github.com/pkg/errors" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - - "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/logx" ) type QueryDetailByOrderIdLogic struct { @@ -54,169 +46,31 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB if err != nil { return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找用户错误: %v", err) } - if user.Inside != 1 { - // 安全验证:确保订单属于当前用户 - if order.UserId != userId { - return "", errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "无权查看此订单报告") - } - } + if user.Inside != 1 { + // 安全验证:确保订单属于当前用户,或为该订单的代理 + if order.UserId != userId { + isAgent, aerr := IsOrderAgent(l.ctx, l.svcCtx, userId, order.Id) + if aerr != nil { + return "", aerr + } + if !isAgent { + return "", errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "无权查看此订单报告") + } + } + } // 检查订单状态 if order.Status != "paid" { return "", errors.Wrapf(xerr.NewErrMsg("订单未支付,无法查看报告"), "") } - // 获取报告信息 - queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, req.OrderId) - if err != nil { - return "", 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 "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", decodeErr) - } - processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) - if processParamsErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告参数处理失败: %v", processParamsErr) - } - processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) - if processErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", processErr) - } - updateFeatureAndProductFeatureErr := l.UpdateFeatureAndProductFeature(queryModel.ProductId, &query.QueryData) - if updateFeatureAndProductFeatureErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", updateFeatureAndProductFeatureErr) - } - // 复制报告数据 - err = copier.Copy(&query, queryModel) - if err != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结构体复制失败, %v", err) - } - product, err := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) - if err != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) - } - query.ProductName = product.ProductName - query.Product = product.ProductEn - queryBytes, marshalErr := json.Marshal(query) - if marshalErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 序列化查询结果失败: %v", marshalErr) - } - - encryptedQuery, encryptErr := crypto.AesEncrypt(queryBytes, key) - if encryptErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 加密查询结果失败: %v", encryptErr) - } - - return encryptedQuery, nil -} - -// ProcessQueryData 解密和反序列化 QueryData -func ProcessQueryData(queryData sql.NullString, target *[]types.QueryItem, key []byte) error { - queryDataStr := lzUtils.NullStringToString(queryData) - if queryDataStr == "" { - return nil - } - - // 解密数据 - decryptedData, decryptErr := crypto.AesDecrypt(queryDataStr, key) - if decryptErr != nil { - return decryptErr - } - - // 解析 JSON 数组 - var decryptedArray []map[string]interface{} - unmarshalErr := json.Unmarshal(decryptedData, &decryptedArray) - if unmarshalErr != nil { - return unmarshalErr - } - - // 确保 target 具有正确的长度 - if len(*target) == 0 { - *target = make([]types.QueryItem, len(decryptedArray)) - } - - // 填充解密后的数据到 target - for i := 0; i < len(decryptedArray); i++ { - // 直接填充解密数据到 Data 字段 - (*target)[i].Data = decryptedArray[i] - } - return nil -} -func (l *QueryDetailByOrderIdLogic) 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 -} - -// 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 + queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, req.OrderId) + if err != nil { + return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) + } + respStr, buildErr := BuildEncryptedQuery(l.ctx, l.svcCtx, queryModel) + if buildErr != nil { + return "", buildErr + } + return respStr, nil } diff --git a/app/main/api/internal/logic/query/querydetailbyordernologic.go b/app/main/api/internal/logic/query/querydetailbyordernologic.go index 1aef47c..0085592 100644 --- a/app/main/api/internal/logic/query/querydetailbyordernologic.go +++ b/app/main/api/internal/logic/query/querydetailbyordernologic.go @@ -2,14 +2,9 @@ package query import ( "context" - "encoding/hex" - "encoding/json" - "fmt" "ycc-server/common/ctxdata" "ycc-server/common/xerr" - "ycc-server/pkg/lzkit/crypto" - "github.com/jinzhu/copier" "github.com/pkg/errors" "ycc-server/app/main/api/internal/svc" @@ -49,9 +44,15 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB return "", errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } - // 安全验证:确保订单属于当前用户 + // 安全验证:确保订单属于当前用户,或为该订单的代理 if order.UserId != userId { - return "", errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "无权查看此订单报告") + isAgent, aerr := IsOrderAgent(l.ctx, l.svcCtx, userId, order.Id) + if aerr != nil { + return "", aerr + } + if !isAgent { + return "", errors.Wrapf(xerr.NewErrCode(xerr.LOGIC_QUERY_NOT_FOUND), "无权查看此订单报告") + } } // 检查订单状态 @@ -59,108 +60,13 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB return "", errors.Wrapf(xerr.NewErrMsg("订单未支付,无法查看报告"), "") } - // 获取报告信息 queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, order.Id) if err != nil { return "", 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 "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", decodeErr) + respStr, buildErr := BuildEncryptedQuery(l.ctx, l.svcCtx, queryModel) + if buildErr != nil { + return "", buildErr } - processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) - if processParamsErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告参数处理失败: %v", processParamsErr) - } - processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) - if processErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", processErr) - } - updateFeatureAndProductFeatureErr := l.UpdateFeatureAndProductFeature(queryModel.ProductId, &query.QueryData) - if updateFeatureAndProductFeatureErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结果处理失败: %v", updateFeatureAndProductFeatureErr) - } - // 复制报告数据 - err = copier.Copy(&query, queryModel) - if err != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 报告结构体复制失败, %v", err) - } - product, err := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) - if err != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) - } - query.Product = product.ProductEn - query.ProductName = product.ProductName - queryBytes, marshalErr := json.Marshal(query) - if marshalErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 序列化查询结果失败: %v", marshalErr) - } - - encryptedQuery, encryptErr := crypto.AesEncrypt(queryBytes, key) - if encryptErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 加密查询结果失败: %v", encryptErr) - } - - return encryptedQuery, 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 + return respStr, nil } diff --git a/app/main/api/internal/logic/query/queryexamplelogic copy.go b/app/main/api/internal/logic/query/queryexamplelogic copy.go deleted file mode 100644 index 4884189..0000000 --- a/app/main/api/internal/logic/query/queryexamplelogic copy.go +++ /dev/null @@ -1,152 +0,0 @@ -package query - -// import ( -// "context" -// "encoding/hex" -// "fmt" -// "ycc-server/app/main/api/internal/svc" -// "ycc-server/app/main/api/internal/types" -// "ycc-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/main/api/internal/logic/query/querygeneratesharelinklogic.go b/app/main/api/internal/logic/query/querygeneratesharelinklogic.go index 256f16f..252352d 100644 --- a/app/main/api/internal/logic/query/querygeneratesharelinklogic.go +++ b/app/main/api/internal/logic/query/querygeneratesharelinklogic.go @@ -38,13 +38,13 @@ func (l *QueryGenerateShareLinkLogic) QueryGenerateShareLink(req *types.QueryGen } // 检查参数 - if (req.OrderId == nil || *req.OrderId == 0) && (req.OrderNo == nil || *req.OrderNo == "") { + if (req.OrderId == nil || *req.OrderId == "") && (req.OrderNo == nil || *req.OrderNo == "") { return nil, errors.Wrapf(xerr.NewErrMsg("订单ID和订单号不能同时为空"), "") } var order *model.Order // 优先使用OrderId查询 - if req.OrderId != nil && *req.OrderId != 0 { + if req.OrderId != nil && *req.OrderId != "" { order, err = l.svcCtx.OrderModel.FindOne(l.ctx, *req.OrderId) if err != nil { if errors.Is(err, model.ErrNotFound) { diff --git a/app/main/api/internal/logic/query/queryserviceagentlogic.go b/app/main/api/internal/logic/query/queryserviceagentlogic.go index e7d51b1..d498f84 100644 --- a/app/main/api/internal/logic/query/queryserviceagentlogic.go +++ b/app/main/api/internal/logic/query/queryserviceagentlogic.go @@ -1,11 +1,11 @@ package query import ( - "context" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" + "context" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" - "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/logx" ) type QueryServiceAgentLogic struct { @@ -23,5 +23,11 @@ func NewQueryServiceAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) } func (l *QueryServiceAgentLogic) QueryServiceAgent(req *types.QueryServiceReq) (resp *types.QueryServiceResp, err error) { - return &types.QueryServiceResp{}, nil + 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) + } + proxy := NewQueryServiceLogic(l.ctx, l.svcCtx) + return proxy.PreprocessLogic(req, req.Product) } diff --git a/app/main/api/internal/logic/query/queryservicelogic.go b/app/main/api/internal/logic/query/queryservicelogic.go index 9162d11..eb986f5 100644 --- a/app/main/api/internal/logic/query/queryservicelogic.go +++ b/app/main/api/internal/logic/query/queryservicelogic.go @@ -100,17 +100,17 @@ func (l *QueryServiceLogic) ProcessMarriageLogic(req *types.QueryServiceReq) (*t "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %v", err) } // 获取当前时间戳 @@ -160,16 +160,16 @@ func (l *QueryServiceLogic) ProcessHomeServiceLogic(req *types.QueryServiceReq) "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -221,16 +221,16 @@ func (l *QueryServiceLogic) ProcessRiskAssessmentLogic(req *types.QueryServiceRe "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -281,16 +281,16 @@ func (l *QueryServiceLogic) ProcessCompanyInfoLogic(req *types.QueryServiceReq) "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -342,16 +342,16 @@ func (l *QueryServiceLogic) ProcessRentalInfoLogic(req *types.QueryServiceReq) ( "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -403,16 +403,16 @@ func (l *QueryServiceLogic) ProcessPreLoanBackgroundCheckLogic(req *types.QueryS "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -463,16 +463,16 @@ func (l *QueryServiceLogic) ProcessBackgroundCheckLogic(req *types.QueryServiceR "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) - } + userID, userType, 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, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -521,16 +521,16 @@ func (l *QueryServiceLogic) ProcessPersonalDataLogic(req *types.QueryServiceReq) "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) - } + userID, userType, err := l.GetOrCreateUser() + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) + } cacheNo, cacheDataErr := l.CacheData(params, "personalData", userID) if cacheDataErr != nil { return nil, cacheDataErr } - token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -579,16 +579,16 @@ func (l *QueryServiceLogic) ProcessConsumerFinanceReportLogic(req *types.QuerySe "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) - } + userID, userType, err := l.GetOrCreateUser() + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 处理用户失败: %v", err) + } cacheNo, cacheDataErr := l.CacheData(params, "consumerFinanceReport", userID) if cacheDataErr != nil { return nil, cacheDataErr } - token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) } @@ -677,7 +677,7 @@ func (l *QueryServiceLogic) Verify(Name string, IDCard string, Mobile string) er } // 缓存 -func (l *QueryServiceLogic) CacheData(params map[string]interface{}, Product string, userID int64) (string, error) { +func (l *QueryServiceLogic) CacheData(params map[string]interface{}, Product string, userID string) (string, error) { agentIdentifier, _ := l.ctx.Value("agentIdentifier").(string) secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) @@ -714,34 +714,14 @@ func (l *QueryServiceLogic) CacheData(params map[string]interface{}, Product str // 1. 如果上下文中已有用户ID,直接返回 // 2. 如果是代理查询或APP请求,创建新用户 // 3. 其他情况返回未登录错误 -func (l *QueryServiceLogic) GetOrCreateUser() (int64, error) { - // 尝试获取用户ID - claims, err := ctxdata.GetClaimsFromCtx(l.ctx) - if err != nil { - return 0, err - } - userID := claims.UserId - return userID, nil - - // // 如果不是未登录错误,说明是其他错误,直接返回 - // 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) +func (l *QueryServiceLogic) GetOrCreateUser() (string, int64, error) { + claims, err := ctxdata.GetClaimsFromCtx(l.ctx) + if err == nil && claims != nil { + return claims.UserId, claims.UserType, nil + } + userID, regErr := l.svcCtx.UserService.RegisterUUIDUser(l.ctx) + if regErr != nil { + return "", 0, regErr + } + return userID, model.UserTypeTemp, nil } diff --git a/app/main/api/internal/logic/query/querysharedetaillogic.go b/app/main/api/internal/logic/query/querysharedetaillogic.go index c5e52af..d8fe5ab 100644 --- a/app/main/api/internal/logic/query/querysharedetaillogic.go +++ b/app/main/api/internal/logic/query/querysharedetaillogic.go @@ -140,7 +140,7 @@ func (l *QueryShareDetailLogic) encryptShareDetail(detail interface{}, key []byt return encrypted, nil } -func (l *QueryShareDetailLogic) UpdateFeatureAndProductFeature(productID int64, target *[]types.QueryItem) error { +func (l *QueryShareDetailLogic) UpdateFeatureAndProductFeature(productID string, target *[]types.QueryItem) error { // 遍历 target 数组,使用倒序遍历,以便删除元素时不影响索引 for i := len(*target) - 1; i >= 0; i-- { queryItem := &(*target)[i] diff --git a/app/main/api/internal/logic/user/authlogic.go b/app/main/api/internal/logic/user/authlogic.go new file mode 100644 index 0000000..d67113e --- /dev/null +++ b/app/main/api/internal/logic/user/authlogic.go @@ -0,0 +1,144 @@ +package user + +import ( + "context" + "time" + + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" + + "github.com/google/uuid" + "github.com/pkg/errors" +) + +type AuthLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAuthLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AuthLogic { + return &AuthLogic{ctx: ctx, svcCtx: svcCtx} +} + +func (l *AuthLogic) Auth(req *types.AuthReq) (*types.AuthResp, error) { + var userID string + var userType int64 + var authType string + var authKey string + + switch req.Platform { + case model.PlatformH5: + authType = model.UserAuthTypeUUID + authKey = uuid.NewString() + user, err := l.findOrCreateUserByAuth(authType, authKey) + if err != nil { + return nil, err + } + userID = user.Id + userType = l.getUserType(user) + case model.PlatformWxH5: + openid, err := l.svcCtx.VerificationService.GetWechatH5OpenID(l.ctx, req.Code) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取WxH5 OpenID失败: %v", err) + } + authType = model.UserAuthTypeWxh5OpenID + authKey = openid + userAuth, err := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, authType, authKey) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户授权失败: %v", err) + } + if userAuth != nil { + user, _ := l.svcCtx.UserModel.FindOne(l.ctx, userAuth.UserId) + userID = user.Id + userType = l.getUserType(user) + } else { + user, err := l.createUserWithAuth(authType, authKey) + if err != nil { + return nil, err + } + userID = user.Id + userType = model.UserTypeTemp + } + case model.PlatformWxMini: + openid, err := l.svcCtx.VerificationService.GetWechatMiniOpenID(l.ctx, req.Code) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取WxMini OpenID失败: %v", err) + } + authType = model.UserAuthTypeWxMiniOpenID + authKey = openid + userAuth, err := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, authType, authKey) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户授权失败: %v", err) + } + if userAuth != nil { + user, _ := l.svcCtx.UserModel.FindOne(l.ctx, userAuth.UserId) + userID = user.Id + userType = l.getUserType(user) + } else { + user, err := l.createUserWithAuth(authType, authKey) + if err != nil { + return nil, err + } + userID = user.Id + userType = model.UserTypeTemp + } + default: + return nil, errors.Wrapf(xerr.NewErrMsg("不支持的平台类型"), "platform=%s", req.Platform) + } + + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成Token失败: %v", err) + } + now := time.Now().Unix() + user, _ := l.svcCtx.UserModel.FindOne(l.ctx, userID) + hasMobile := user.Mobile.Valid + isAgent := false + if hasMobile { + agent, _ := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + isAgent = agent != nil + } + return &types.AuthResp{ + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + UserType: userType, + HasMobile: hasMobile, + IsAgent: isAgent, + }, nil +} + +func (l *AuthLogic) findOrCreateUserByAuth(authType, authKey string) (*model.User, error) { + userAuth, err := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, authType, authKey) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找用户授权失败: %v", err) + } + if userAuth != nil { + user, err := l.svcCtx.UserModel.FindOne(l.ctx, userAuth.UserId) + return user, err + } + return l.createUserWithAuth(authType, authKey) +} + +func (l *AuthLogic) createUserWithAuth(authType, authKey string) (*model.User, error) { + user := &model.User{Id: uuid.NewString()} + _, err := l.svcCtx.UserModel.Insert(l.ctx, nil, user) + if err != nil { + return nil, err + } + ua := &model.UserAuth{Id: uuid.NewString(), UserId: user.Id, AuthType: authType, AuthKey: authKey} + _, err = l.svcCtx.UserAuthModel.Insert(l.ctx, nil, ua) + if err != nil { + return nil, err + } + return l.svcCtx.UserModel.FindOne(l.ctx, user.Id) +} + +func (l *AuthLogic) getUserType(user *model.User) int64 { + if user.Mobile.Valid { + return model.UserTypeNormal + } + return model.UserTypeTemp +} diff --git a/app/main/api/internal/logic/user/bindmobilelogic.go b/app/main/api/internal/logic/user/bindmobilelogic.go index 386dd22..9d34f41 100644 --- a/app/main/api/internal/logic/user/bindmobilelogic.go +++ b/app/main/api/internal/logic/user/bindmobilelogic.go @@ -14,9 +14,11 @@ import ( "ycc-server/common/xerr" "ycc-server/pkg/lzkit/crypto" + "github.com/google/uuid" "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 { @@ -34,75 +36,207 @@ func NewBindMobileLogic(ctx context.Context, svcCtx *svc.ServiceContext) *BindMo } func (l *BindMobileLogic) BindMobile(req *types.BindMobileReq) (resp *types.BindMobileResp, err error) { + // 从上下文中获取当前登录态的用户声明(可能是临时用户或正式用户),包含UserId/AuthType/AuthKey claims, err := ctxdata.GetClaimsFromCtx(l.ctx) if err != nil && !errors.Is(err, ctxdata.ErrNoInCtx) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "绑定手机号, %v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户信息失败: %v", err) } + + // 当前登录用户信息(用于后续合并/绑定) + currentUserID := claims.UserId + currentAuthType := claims.AuthType + currentAuthKey := claims.AuthKey + + // 加密手机号(所有手机号以密文存储) 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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err) } - // 开发环境下跳过验证码校验 + // 非开发环境下校验短信验证码(从Redis读取并比对) if os.Getenv("ENV") != "development" { - // 检查手机号是否在一分钟内已发送过验证码 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.NewErrMsg("验证码已过期"), "") } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取验证码redis缓存失败, mobile: %s, err: %+v", encryptedMobile, err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "读取验证码失败: %v", err) } if cacheCode != req.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机登录, 验证码不正确: %s", encryptedMobile) - } - } - var userID int64 - 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 { - // 进行平台绑定 - if claims != nil { - if req.Mobile != "18889793585" { - if claims.UserType == model.UserTypeTemp { - userTemp, err := l.svcCtx.UserTempModel.FindOne(l.ctx, claims.UserId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, 读取临时用户失败: %v", err) - } - userAuth, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, user.Id, userTemp.AuthType) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "绑定手机号, 读取用户认证失败: %v", err) - } - if userAuth != nil && userAuth.AuthKey != userTemp.AuthKey { - return nil, errors.Wrapf(xerr.NewErrMsg("该手机号已绑定其他微信号"), "绑定手机号, 临时用户已注册: %s", encryptedMobile) - } - err = l.svcCtx.UserService.TempUserBindUser(l.ctx, nil, user.Id) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "绑定手机号, 临时用户绑定用户失败: %+v", err) - } - } - } - } - userID = user.Id - } else { - // 创建账号,并绑定手机号 - userID, err = l.svcCtx.UserService.RegisterUser(l.ctx, encryptedMobile) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "绑定手机号, 注册用户失败: %+v", err) + return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "") } } - token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) + // 通过加密后的手机号查找目标用户(手机号用户视为正式用户) + targetUser, 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) + } + + var finalUserID string + if targetUser == nil { + // 手机号不存在:直接将当前用户升级为正式用户(写入mobile与mobile认证) + finalUserID = currentUserID + currentUser, err := l.svcCtx.UserModel.FindOne(l.ctx, currentUserID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找当前用户失败: %v", err) + } + currentUser.Mobile = sql.NullString{String: encryptedMobile, Valid: true} + if _, err := l.svcCtx.UserModel.Update(l.ctx, nil, currentUser); err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新手机号失败: %v", err) + } + // 记录mobile认证(确保后续可通过手机号登录) + if _, err := l.svcCtx.UserAuthModel.Insert(l.ctx, nil, &model.UserAuth{Id: uuid.NewString(), UserId: finalUserID, AuthType: model.UserAuthTypeMobile, AuthKey: encryptedMobile}); err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建手机号认证失败: %v", err) + } + // 发放正式用户token + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, finalUserID, model.UserTypeNormal) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成Token失败: %v", err) + } + now := time.Now().Unix() + return &types.BindMobileResp{AccessToken: token, AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter}, nil + } + + // 手机号已存在:进入账号合并或快捷登录流程 + finalUserID = targetUser.Id + // 保护校验:若将不同用户进行合并,确保源用户不存在代理记录(临时用户不应为代理) + if currentUserID != finalUserID { + agent, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, currentUserID) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) + } + if agent != nil { + return nil, errors.Wrapf(xerr.NewErrMsg("账号数据异常:源用户存在代理记录,请联系技术支持"), "") + } + } + // 查找当前登录态使用的认证(例如uuid或微信openid)是否已存在 + existingAuth, err := l.svcCtx.UserAuthModel.FindOneByAuthTypeAuthKey(l.ctx, currentAuthType, currentAuthKey) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找认证信息失败: %v", err) + } + // 如果当前认证已属于目标手机号用户,直接发放token(无需合并) + if existingAuth != nil && existingAuth.UserId == finalUserID { + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, finalUserID, model.UserTypeNormal) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成Token失败: %v", err) + } + now := time.Now().Unix() + return &types.BindMobileResp{AccessToken: token, AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter}, nil + } + + // 微信唯一性约束(按类型): + // - H5 与 小程序各自只能绑定一个 openid(互不影响) + if currentAuthType == model.UserAuthTypeWxh5OpenID { + wxh5Auth, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, finalUserID, model.UserAuthTypeWxh5OpenID) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找认证信息失败: %v", err) + } + if wxh5Auth != nil && wxh5Auth.AuthKey != currentAuthKey { + return nil, errors.Wrapf(xerr.NewErrMsg("该手机号已绑定其他H5微信号"), "") + } + } + if currentAuthType == model.UserAuthTypeWxMiniOpenID { + wxminiAuth, err := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(l.ctx, finalUserID, model.UserAuthTypeWxMiniOpenID) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找认证信息失败: %v", err) + } + if wxminiAuth != nil && wxminiAuth.AuthKey != currentAuthKey { + return nil, errors.Wrapf(xerr.NewErrMsg("该手机号已绑定其他小程序微信号"), "") + } + } + + // 事务处理: + // - 将当前登录态的认证(uuid / 微信openid 等)绑定到目标手机号用户(finalUserID) + // - 将源用户(currentUserID)的业务数据(订单、报告)迁移到目标用户,避免数据分裂 + // - 对源用户执行软删除,清理无主临时账号,保持数据一致性 + // 注意:所有步骤必须在同一个事务中执行,任何一步失败均会回滚,确保原子性 + err = l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + // 1) 认证绑定处理(UUID替换策略) + if currentAuthType == model.UserAuthTypeUUID { + targetUUIDAuth, _ := l.svcCtx.UserAuthModel.FindOneByUserIdAuthType(ctx, finalUserID, model.UserAuthTypeUUID) + if existingAuth != nil && existingAuth.UserId != finalUserID { + if targetUUIDAuth != nil { + if targetUUIDAuth.AuthKey != currentAuthKey { + if err := l.svcCtx.UserAuthModel.Delete(ctx, session, existingAuth.Id); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除旧UUID认证失败: %v", err) + } + targetUUIDAuth.AuthKey = currentAuthKey + if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, targetUUIDAuth); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新目标UUID认证失败: %v", err) + } + } else { + if err := l.svcCtx.UserAuthModel.Delete(ctx, session, existingAuth.Id); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除重复UUID认证失败: %v", err) + } + } + } else { + existingAuth.UserId = finalUserID + if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, existingAuth); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "迁移UUID认证失败: %v", err) + } + } + } else if existingAuth == nil { + if targetUUIDAuth != nil { + if targetUUIDAuth.AuthKey != currentAuthKey { + targetUUIDAuth.AuthKey = currentAuthKey + if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, targetUUIDAuth); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新目标UUID认证失败: %v", err) + } + } + } else { + _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, &model.UserAuth{Id: uuid.NewString(), UserId: finalUserID, AuthType: currentAuthType, AuthKey: currentAuthKey}) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建UUID认证失败: %v", err) + } + } + } + } else { + if existingAuth != nil && existingAuth.UserId != finalUserID { + existingAuth.UserId = finalUserID + if _, err := l.svcCtx.UserAuthModel.Update(ctx, session, existingAuth); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新认证绑定失败: %v", err) + } + } else if existingAuth == nil { + _, err := l.svcCtx.UserAuthModel.Insert(ctx, session, &model.UserAuth{Id: uuid.NewString(), UserId: finalUserID, AuthType: currentAuthType, AuthKey: currentAuthKey}) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建认证绑定失败: %v", err) + } + } + } + + // 2) 业务数据迁移 + // 当源用户与目标用户不同时,迁移源用户的订单与报告归属到finalUserID,避免合并后数据仍挂在旧用户 + if currentUserID != finalUserID { + if err := l.svcCtx.OrderModel.UpdateUserIDWithSession(ctx, session, currentUserID, finalUserID); err != nil { + return err + } + if err := l.svcCtx.QueryModel.UpdateUserIDWithSession(ctx, session, currentUserID, finalUserID); err != nil { + return err + } + + // 3) 源用户软删除 + // 软删源用户(通常为临时用户),防止遗留无效账号;软删可保留历史痕迹,满足审计需求 + currentUser, err := l.svcCtx.UserModel.FindOne(ctx, currentUserID) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查找当前用户失败: %v", err) + } + if err := l.svcCtx.UserModel.DeleteSoft(ctx, session, currentUser); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "删除当前用户失败: %v", err) + } + } + return nil + }) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "绑定手机号, 生成token失败: %+v", err) + return nil, err + } + + // 合并完成后生成并返回正式用户token + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, finalUserID, model.UserTypeNormal) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成Token失败: %v", err) } now := time.Now().Unix() - return &types.BindMobileResp{ - AccessToken: token, - AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, - RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, - }, nil + return &types.BindMobileResp{AccessToken: token, AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter}, nil } diff --git a/app/main/api/internal/logic/user/mobilecodeloginlogic.go b/app/main/api/internal/logic/user/mobilecodeloginlogic.go index 3ea0dc3..4701dff 100644 --- a/app/main/api/internal/logic/user/mobilecodeloginlogic.go +++ b/app/main/api/internal/logic/user/mobilecodeloginlogic.go @@ -53,22 +53,18 @@ func (l *MobileCodeLoginLogic) MobileCodeLogin(req *types.MobileCodeLoginReq) (r return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机登录, 验证码不正确: %s", encryptedMobile) } } - var userID int64 + var userID string 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 { - userID, err = l.svcCtx.UserService.RegisterUser(l.ctx, encryptedMobile) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 注册用户失败: %+v", err) - } - } else { - userID = user.Id + return nil, errors.Wrapf(xerr.NewErrMsg("用户不存在"), "手机登录, 用户不存在: %s", encryptedMobile) } + userID = user.Id token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, model.UserTypeNormal) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 生成token失败 : %d", userID) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 生成token失败 : %s", userID) } // 获取当前时间戳 diff --git a/app/main/api/internal/logic/user/wxh5authlogic.go b/app/main/api/internal/logic/user/wxh5authlogic.go index 242e67c..417bc1e 100644 --- a/app/main/api/internal/logic/user/wxh5authlogic.go +++ b/app/main/api/internal/logic/user/wxh5authlogic.go @@ -1,21 +1,22 @@ package user import ( - "context" - "ycc-server/app/main/model" - "ycc-server/common/xerr" - "encoding/json" - "fmt" - "io" - "net/http" - "time" + "context" + "ycc-server/app/main/model" + "ycc-server/common/xerr" + "encoding/json" + "fmt" + "io" + "net/http" + "time" - "github.com/pkg/errors" + "github.com/google/uuid" + "github.com/pkg/errors" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" - "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/logx" ) type WxH5AuthLogic struct { @@ -46,41 +47,29 @@ func (l *WxH5AuthLogic) WxH5Auth(req *types.WXH5AuthReq) (resp *types.WXH5AuthRe } // Step 3: 处理用户信息 - var userID int64 - var userType int64 - if userAuth != nil { - // 已存在用户,直接登录 - userID = userAuth.UserId - userType = model.UserTypeNormal - } else { - // 检查临时用户表 - userTemp, err := l.svcCtx.UserTempModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWxh5OpenID, accessTokenResp.Openid) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户临时信息失败: %v", err) - } - - if userTemp == nil { - // 创建临时用户记录 - userTemp = &model.UserTemp{ - AuthType: model.UserAuthTypeWxh5OpenID, - AuthKey: accessTokenResp.Openid, - } - result, err := l.svcCtx.UserTempModel.Insert(l.ctx, nil, userTemp) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建临时用户信息失败: %v", err) - } - userID, err = result.LastInsertId() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取新创建的临时用户ID失败: %v", err) - } - } else { - userID = userTemp.Id - } - userType = model.UserTypeTemp - } + var userID string + var userType int64 + if userAuth != nil { + // 已存在用户,直接登录 + userID = userAuth.UserId + userType = model.UserTypeNormal + } else { + user := &model.User{Id: uuid.NewString()} + _, err := l.svcCtx.UserModel.Insert(l.ctx, nil, user) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + ua := &model.UserAuth{Id: uuid.NewString(), UserId: user.Id, AuthType: model.UserAuthTypeWxh5OpenID, AuthKey: accessTokenResp.Openid} + _, err = l.svcCtx.UserAuthModel.Insert(l.ctx, nil, ua) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户授权失败: %v", err) + } + userID = user.Id + userType = model.UserTypeTemp + } // Step 4: 生成JWT Token - token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成JWT token失败: %v", err) } diff --git a/app/main/api/internal/logic/user/wxminiauthlogic.go b/app/main/api/internal/logic/user/wxminiauthlogic.go index 13e4b28..d94842a 100644 --- a/app/main/api/internal/logic/user/wxminiauthlogic.go +++ b/app/main/api/internal/logic/user/wxminiauthlogic.go @@ -1,20 +1,21 @@ package user import ( - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "time" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" - "ycc-server/app/main/api/internal/svc" - "ycc-server/app/main/api/internal/types" - "ycc-server/app/main/model" - "ycc-server/common/xerr" + "ycc-server/app/main/api/internal/svc" + "ycc-server/app/main/api/internal/types" + "ycc-server/app/main/model" + "ycc-server/common/xerr" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" + "github.com/google/uuid" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" ) type WxMiniAuthLogic struct { @@ -45,41 +46,29 @@ func (l *WxMiniAuthLogic) WxMiniAuth(req *types.WXMiniAuthReq) (resp *types.WXMi } // 3. 处理用户信息 - var userID int64 - var userType int64 - if userAuth != nil { - // 已存在用户,直接登录 - userID = userAuth.UserId - userType = model.UserTypeNormal - } else { - // 注册临时用户 - userTemp, err := l.svcCtx.UserTempModel.FindOneByAuthTypeAuthKey(l.ctx, model.UserAuthTypeWxMiniOpenID, sessionKeyResp.Openid) - if err != nil && !errors.Is(err, model.ErrNotFound) { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询用户临时信息失败: %v", err) - } - if userTemp == nil { - // 创建新的临时用户 - userTemp = &model.UserTemp{} - userTemp.AuthType = model.UserAuthTypeWxMiniOpenID - userTemp.AuthKey = sessionKeyResp.Openid - result, err := l.svcCtx.UserTempModel.Insert(l.ctx, nil, userTemp) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建临时用户信息失败: %v", err) - } - // 获取新创建的临时用户ID - userID, err = result.LastInsertId() - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取新创建的临时用户ID失败: %v", err) - } - } else { - // 使用已存在的临时用户ID - userID = userTemp.Id - } - userType = model.UserTypeTemp - } + var userID string + var userType int64 + if userAuth != nil { + // 已存在用户,直接登录 + userID = userAuth.UserId + userType = model.UserTypeNormal + } else { + user := &model.User{Id: uuid.NewString()} + _, err := l.svcCtx.UserModel.Insert(l.ctx, nil, user) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户失败: %v", err) + } + ua := &model.UserAuth{Id: uuid.NewString(), UserId: user.Id, AuthType: model.UserAuthTypeWxMiniOpenID, AuthKey: sessionKeyResp.Openid} + _, err = l.svcCtx.UserAuthModel.Insert(l.ctx, nil, ua) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建用户授权失败: %v", err) + } + userID = user.Id + userType = model.UserTypeTemp + } // 4. 生成JWT Token - token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) + token, err := l.svcCtx.UserService.GeneralUserToken(l.ctx, userID, userType) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成JWT Token失败: %v", err) } diff --git a/app/main/api/internal/middleware/adminauthinterceptormiddleware.go b/app/main/api/internal/middleware/adminauthinterceptormiddleware.go index b929424..abccf02 100644 --- a/app/main/api/internal/middleware/adminauthinterceptormiddleware.go +++ b/app/main/api/internal/middleware/adminauthinterceptormiddleware.go @@ -129,7 +129,7 @@ func (m *AdminAuthInterceptorMiddleware) validateJWT(r *http.Request) (*jwtx.Jwt } // validateApiPermission 验证API权限 -func (m *AdminAuthInterceptorMiddleware) validateApiPermission(ctx context.Context, userId int64, method, path string) error { +func (m *AdminAuthInterceptorMiddleware) validateApiPermission(ctx context.Context, userId string, method, path string) error { // 1. 获取用户角色 userRoles, err := m.getUserRoles(ctx, userId) if err != nil { @@ -167,35 +167,35 @@ func (m *AdminAuthInterceptorMiddleware) validateApiPermission(ctx context.Conte } // getUserRoles 获取用户角色 -func (m *AdminAuthInterceptorMiddleware) getUserRoles(ctx context.Context, userId int64) ([]int64, error) { - builder := m.AdminUserRoleModel.SelectBuilder().Where("user_id = ?", userId) - userRoles, err := m.AdminUserRoleModel.FindAll(ctx, builder, "") - if err != nil { - return nil, err - } +func (m *AdminAuthInterceptorMiddleware) getUserRoles(ctx context.Context, userId string) ([]string, error) { + builder := m.AdminUserRoleModel.SelectBuilder().Where("user_id = ?", userId) + userRoles, err := m.AdminUserRoleModel.FindAll(ctx, builder, "") + if err != nil { + return nil, err + } - var roleIds []int64 - for _, userRole := range userRoles { - roleIds = append(roleIds, userRole.RoleId) - } + var roleIds []string + for _, userRole := range userRoles { + roleIds = append(roleIds, userRole.RoleId) + } - return roleIds, nil + return roleIds, nil } // isSuperAdmin 检查是否为超级管理员 -func (m *AdminAuthInterceptorMiddleware) isSuperAdmin(ctx context.Context, roleIds []int64) bool { - // 检查是否有超级管理员角色 - for _, roleId := range roleIds { - role, err := m.AdminRoleModel.FindOne(ctx, roleId) - if err != nil { - continue - } - // 检查是否为超级管理员角色 - if role.RoleCode == model.AdminRoleCodeSuper { - return true - } - } - return false +func (m *AdminAuthInterceptorMiddleware) isSuperAdmin(ctx context.Context, roleIds []string) bool { + // 检查是否有超级管理员角色 + for _, roleId := range roleIds { + role, err := m.AdminRoleModel.FindOne(ctx, roleId) + if err != nil { + continue + } + // 检查是否为超级管理员角色 + if role.RoleCode == model.AdminRoleCodeSuper { + return true + } + } + return false } // getApiByMethodAndPath 根据方法和路径获取API信息 @@ -216,19 +216,19 @@ func (m *AdminAuthInterceptorMiddleware) getApiByMethodAndPath(ctx context.Conte } // checkRoleApiPermission 检查角色是否有API权限 -func (m *AdminAuthInterceptorMiddleware) checkRoleApiPermission(ctx context.Context, roleIds []int64, apiId int64) (bool, error) { - for _, roleId := range roleIds { - // 检查角色是否有该API权限 - _, err := m.AdminRoleApiModel.FindOneByRoleIdApiId(ctx, roleId, apiId) - if err == nil { - // 找到权限记录,说明有权限 - return true, nil - } - // 如果错误不是NotFound,说明是其他错误 - if !errors.Is(err, model.ErrNotFound) { - return false, err - } - } +func (m *AdminAuthInterceptorMiddleware) checkRoleApiPermission(ctx context.Context, roleIds []string, apiId string) (bool, error) { + for _, roleId := range roleIds { + // 检查角色是否有该API权限 + _, err := m.AdminRoleApiModel.FindOneByRoleIdApiId(ctx, roleId, apiId) + if err == nil { + // 找到权限记录,说明有权限 + return true, nil + } + // 如果错误不是NotFound,说明是其他错误 + if !errors.Is(err, model.ErrNotFound) { + return false, err + } + } - return false, nil + return false, nil } diff --git a/app/main/api/internal/queue/agentProcess.go b/app/main/api/internal/queue/agentProcess.go index 9418b86..9eb59f6 100644 --- a/app/main/api/internal/queue/agentProcess.go +++ b/app/main/api/internal/queue/agentProcess.go @@ -30,34 +30,34 @@ func (l *AgentProcessHandler) ProcessTask(ctx context.Context, t *asynq.Task) er } // 获取订单信息 - order, err := l.svcCtx.OrderModel.FindOne(ctx, payload.OrderID) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - logx.Errorf("代理处理任务失败,订单不存在: orderID=%d", payload.OrderID) - return asynq.SkipRetry // 订单不存在,跳过重试 - } - return fmt.Errorf("查询订单失败: orderID=%d, err=%w", payload.OrderID, err) - } + order, err := l.svcCtx.OrderModel.FindOne(ctx, payload.OrderID) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + logx.Errorf("代理处理任务失败,订单不存在: orderID=%s", payload.OrderID) + return asynq.SkipRetry // 订单不存在,跳过重试 + } + return fmt.Errorf("查询订单失败: orderID=%s, err=%w", payload.OrderID, err) + } // 检查订单状态 - if order.Status != "paid" { - logx.Infof("代理处理任务跳过,订单未支付: orderID=%d, status=%s", payload.OrderID, order.Status) - return nil // 订单未支付,不处理,不重试 - } + if order.Status != "paid" { + logx.Infof("代理处理任务跳过,订单未支付: orderID=%s, status=%s", payload.OrderID, order.Status) + return nil // 订单未支付,不处理,不重试 + } // 调用代理处理服务 err = l.svcCtx.AgentService.AgentProcess(ctx, order) - if err != nil { - // 记录错误日志,但不阻塞报告流程 - logx.Errorf("代理处理失败,订单ID: %d, 错误: %v", payload.OrderID, err) - // 返回错误以触发重试机制 - return fmt.Errorf("代理处理失败: orderID=%d, err=%w", payload.OrderID, err) - } + if err != nil { + // 记录错误日志,但不阻塞报告流程 + logx.Errorf("代理处理失败,订单ID: %s, 错误: %v", payload.OrderID, err) + // 返回错误以触发重试机制 + return fmt.Errorf("代理处理失败: orderID=%s, err=%w", payload.OrderID, err) + } // 注意:解冻任务现在通过定时任务扫描处理,不再需要发送延迟任务 // 定时任务每5分钟扫描一次待解冻的任务,更加可靠 - logx.Infof("代理处理成功,订单ID: %d,冻结任务(如有)将由定时任务自动处理", payload.OrderID) + logx.Infof("代理处理成功,订单ID: %s,冻结任务(如有)将由定时任务自动处理", payload.OrderID) - logx.Infof("代理处理成功,订单ID: %d", payload.OrderID) - return nil + logx.Infof("代理处理成功,订单ID: %s", payload.OrderID) + return nil } diff --git a/app/main/api/internal/queue/cleanQueryData.go b/app/main/api/internal/queue/cleanQueryData.go index ee9abb6..13b5a0e 100644 --- a/app/main/api/internal/queue/cleanQueryData.go +++ b/app/main/api/internal/queue/cleanQueryData.go @@ -10,6 +10,7 @@ import ( "ycc-server/app/main/model" "ycc-server/common/globalkey" + "github.com/google/uuid" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -115,6 +116,7 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) // 创建清理日志记录(只创建一次) cleanupLog := &model.QueryCleanupLog{ + Id: uuid.New().String(), CleanupTime: now, CleanupBefore: cleanupBefore, Status: 1, @@ -122,13 +124,11 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) } // 先创建清理日志记录 - var cleanupLogId int64 err = l.svcCtx.QueryCleanupLogModel.Trans(taskCtx, func(logCtx context.Context, logSession sqlx.Session) error { - cleanupLogInsertResult, insertErr := l.svcCtx.QueryCleanupLogModel.Insert(logCtx, logSession, cleanupLog) + _, insertErr := l.svcCtx.QueryCleanupLogModel.Insert(logCtx, logSession, cleanupLog) if insertErr != nil { return insertErr } - cleanupLogId, insertErr = cleanupLogInsertResult.LastInsertId() return insertErr }) if err != nil { @@ -136,11 +136,11 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) return err } - logx.Infof("创建清理日志记录成功,日志ID: %d", cleanupLogId) + logx.Infof("创建清理日志记录成功,日志ID: %s", cleanupLog.Id) // 分批处理,每个批次使用独立事务 batchCount := 0 - lastProcessedId := int64(0) + lastProcessedId := "" for { // 检查是否被取消(优雅关闭支持) @@ -148,7 +148,7 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) case <-taskCtx.Done(): logx.Infof("清理任务被取消,已处理 %d 批次,共删除 %d 条记录", batchCount, cleanupLog.AffectedRows) // 更新清理日志状态 - l.updateCleanupLogStatus(taskCtx, cleanupLogId, cleanupLog, fmt.Errorf("任务被取消")) + l.updateCleanupLogStatus(taskCtx, cleanupLog.Id, cleanupLog, fmt.Errorf("任务被取消")) return taskCtx.Err() default: // 继续处理 @@ -165,7 +165,7 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) Limit(uint64(batchSize)) // 如果已处理过,从上次处理的ID之后继续 - if lastProcessedId > 0 { + if lastProcessedId != "" { builder = builder.Where("id > ?", lastProcessedId) } @@ -191,7 +191,8 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) // 3. 保存清理明细 for _, query := range batchQueries { detail := &model.QueryCleanupDetail{ - CleanupLogId: cleanupLogId, + Id: uuid.New().String(), + CleanupLogId: cleanupLog.Id, QueryId: query.Id, OrderId: query.OrderId, UserId: query.UserId, @@ -214,7 +215,7 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) if batchErr != nil { // 批次失败,更新清理日志状态 logx.Errorf("批次处理失败(批次 %d): %v", batchCount+1, batchErr) - l.updateCleanupLogStatus(taskCtx, cleanupLogId, cleanupLog, batchErr) + l.updateCleanupLogStatus(taskCtx, cleanupLog.Id, cleanupLog, batchErr) return batchErr } @@ -238,7 +239,7 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) } // 更新清理日志状态为成功 - l.updateCleanupLogStatus(taskCtx, cleanupLogId, cleanupLog, nil) + l.updateCleanupLogStatus(taskCtx, cleanupLog.Id, cleanupLog, nil) duration := time.Since(startTime) logx.Infof("%s - 查询数据清理完成,共处理 %d 批次,删除 %d 条记录,耗时 %v", @@ -247,10 +248,10 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) } // updateCleanupLogStatus 更新清理日志状态 -func (l *CleanQueryDataHandler) updateCleanupLogStatus(ctx context.Context, logId int64, cleanupLog *model.QueryCleanupLog, err error) { +func (l *CleanQueryDataHandler) updateCleanupLogStatus(ctx context.Context, logId string, cleanupLog *model.QueryCleanupLog, err error) { err = l.svcCtx.QueryCleanupLogModel.Trans(ctx, func(updateCtx context.Context, updateSession sqlx.Session) error { // 查询当前日志记录 - currentLog, findErr := l.svcCtx.QueryCleanupLogModel.FindOne(updateCtx, logId) + currentLog, findErr := l.svcCtx.QueryCleanupLogModel.FindOne(updateCtx, cleanupLog.Id) if findErr != nil { return findErr } diff --git a/app/main/api/internal/queue/paySuccessNotify.go b/app/main/api/internal/queue/paySuccessNotify.go index d8d20da..0fcc958 100644 --- a/app/main/api/internal/queue/paySuccessNotify.go +++ b/app/main/api/internal/queue/paySuccessNotify.go @@ -14,6 +14,7 @@ import ( "ycc-server/pkg/lzkit/crypto" "ycc-server/pkg/lzkit/lzUtils" + "github.com/google/uuid" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" ) @@ -28,9 +29,7 @@ func NewPaySuccessNotifyUserHandler(svcCtx *svc.ServiceContext) *PaySuccessNotif } } -var payload struct { - OrderID int64 `json:"order_id"` -} +var payload types.MsgPaySuccessQueryPayload func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq.Task) error { // 从任务的负载中解码数据 @@ -41,18 +40,18 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. order, err := l.svcCtx.OrderModel.FindOne(ctx, payload.OrderID) if err != nil { // 订单不存在,记录详细日志并跳过重试 - logx.Errorf("支付成功通知任务失败:订单不存在,订单ID: %d, 错误: %v", payload.OrderID, err) + logx.Errorf("支付成功通知任务失败:订单不存在,订单ID: %s, 错误: %v", payload.OrderID, err) return asynq.SkipRetry // 订单不存在时跳过重试,避免重复失败 } env := os.Getenv("ENV") if order.Status != "paid" && env != "development" { - err = fmt.Errorf("无效的订单: %d", payload.OrderID) + err = fmt.Errorf("无效的订单: %s", 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) + return fmt.Errorf("找不到相关产品: orderID: %s, productID: %s", payload.OrderID, order.ProductId) } redisKey := fmt.Sprintf(types.QueryCacheKey, order.UserId, order.OrderNo) cache, cacheErr := l.svcCtx.Redis.GetCtx(ctx, redisKey) @@ -75,22 +74,20 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. } query := &model.Query{ + Id: uuid.NewString(), OrderId: order.Id, UserId: order.UserId, ProductId: product.Id, QueryParams: data.Params, QueryState: "pending", } - result, insertQueryErr := l.svcCtx.QueryModel.Insert(ctx, nil, query) + _, 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) - } + // 插入后使用预生成的查询ID + queryId := query.Id // 从数据库中查询完整的查询记录 query, err = l.svcCtx.QueryModel.FindOne(ctx, queryId) @@ -147,7 +144,7 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. var encryptData string if isEmptyReportMode { // 空报告模式:生成空的报告数据,跳过API调用 - logx.Infof("空报告模式:订单 %s (ID: %d) 跳过API调用,生成空报告", order.OrderNo, order.Id) + logx.Infof("空报告模式:订单 %s (ID: %s) 跳过API调用,生成空报告", order.OrderNo, order.Id) // 生成空报告数据结构(根据实际报告格式生成) emptyReportData := []byte(`[]`) // 空数组,表示没有数据 @@ -191,12 +188,12 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. // 报告生成成功后,发送代理处理异步任务(不阻塞报告流程) if asyncErr := l.svcCtx.AsynqService.SendAgentProcessTask(order.Id); asyncErr != nil { // 代理处理任务发送失败,只记录日志,不影响报告流程 - logx.Errorf("发送代理处理任务失败,订单ID: %d, 错误: %v", order.Id, asyncErr) + logx.Errorf("发送代理处理任务失败,订单ID: %s, 错误: %v", order.Id, asyncErr) } _, delErr := l.svcCtx.Redis.DelCtx(ctx, redisKey) if delErr != nil { - logx.Errorf("删除Redis缓存失败,但任务已成功处理,订单ID: %d, 错误: %v", order.Id, delErr) + logx.Errorf("删除Redis缓存失败,但任务已成功处理,订单ID: %s, 错误: %v", order.Id, delErr) } return nil @@ -209,7 +206,7 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error 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) + logx.Errorf("删除Redis缓存失败,订单ID: %s, 错误: %v", order.Id, delErr) } if order.Status == "paid" && query.QueryState == "pending" { @@ -235,12 +232,12 @@ func (l *PaySuccessNotifyUserHandler) handleError(ctx context.Context, err error return asynq.SkipRetry } if refund.IsSuccess() { - logx.Errorf("支付宝退款成功, orderID: %d", order.Id) + logx.Errorf("支付宝退款成功, orderID: %s", order.Id) // 更新订单状态为退款 order.Status = "refunded" updateOrderErr := l.svcCtx.OrderModel.UpdateWithVersion(ctx, nil, order) if updateOrderErr != nil { - logx.Errorf("更新订单状态失败,订单ID: %d, 错误: %v", order.Id, updateOrderErr) + logx.Errorf("更新订单状态失败,订单ID: %s, 错误: %v", order.Id, updateOrderErr) return fmt.Errorf("更新订单状态失败: %v", updateOrderErr) } return asynq.SkipRetry diff --git a/app/main/api/internal/queue/unfreezeCommission.go b/app/main/api/internal/queue/unfreezeCommission.go index 9e533ca..8e5c8ee 100644 --- a/app/main/api/internal/queue/unfreezeCommission.go +++ b/app/main/api/internal/queue/unfreezeCommission.go @@ -35,30 +35,30 @@ func (l *UnfreezeCommissionHandler) ProcessTask(ctx context.Context, t *asynq.Ta } // 1. 查询冻结任务 - freezeTask, err := l.svcCtx.AgentFreezeTaskModel.FindOne(ctx, payload.FreezeTaskId) - if err != nil { - if errors.Is(err, model.ErrNotFound) { - logx.Errorf("解冻任务失败,冻结任务不存在: freezeTaskId=%d", payload.FreezeTaskId) - return asynq.SkipRetry // 任务不存在,跳过重试 - } - return fmt.Errorf("查询冻结任务失败: freezeTaskId=%d, err=%w", payload.FreezeTaskId, err) - } + freezeTask, err := l.svcCtx.AgentFreezeTaskModel.FindOne(ctx, payload.FreezeTaskId) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + logx.Errorf("解冻任务失败,冻结任务不存在: freezeTaskId=%s", payload.FreezeTaskId) + return asynq.SkipRetry // 任务不存在,跳过重试 + } + return fmt.Errorf("查询冻结任务失败: freezeTaskId=%s, err=%w", payload.FreezeTaskId, err) + } // 2. 检查任务状态 - if freezeTask.Status != 1 { - logx.Infof("解冻任务跳过,任务已处理: freezeTaskId=%d, status=%d", payload.FreezeTaskId, freezeTask.Status) - return nil // 任务已处理,不重试 - } + if freezeTask.Status != 1 { + logx.Infof("解冻任务跳过,任务已处理: freezeTaskId=%s, status=%d", payload.FreezeTaskId, freezeTask.Status) + return nil // 任务已处理,不重试 + } // 3. 检查解冻时间是否已到 - if time.Now().Before(freezeTask.UnfreezeTime) { - logx.Infof("解冻任务跳过,未到解冻时间: freezeTaskId=%d, unfreezeTime=%v", payload.FreezeTaskId, freezeTask.UnfreezeTime) - // 重新发送延迟任务 - if err := l.svcCtx.AsynqService.SendUnfreezeTask(payload.FreezeTaskId, freezeTask.UnfreezeTime); err != nil { - logx.Errorf("重新发送解冻任务失败: freezeTaskId=%d, err=%v", payload.FreezeTaskId, err) - } - return nil - } + if time.Now().Before(freezeTask.UnfreezeTime) { + logx.Infof("解冻任务跳过,未到解冻时间: freezeTaskId=%s, unfreezeTime=%v", payload.FreezeTaskId, freezeTask.UnfreezeTime) + // 重新发送延迟任务 + if err := l.svcCtx.AsynqService.SendUnfreezeTask(payload.FreezeTaskId, freezeTask.UnfreezeTime); err != nil { + logx.Errorf("重新发送解冻任务失败: freezeTaskId=%s, err=%v", payload.FreezeTaskId, err) + } + return nil + } // 4. 使用事务处理解冻 err = l.svcCtx.AgentFreezeTaskModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error { @@ -71,9 +71,9 @@ func (l *UnfreezeCommissionHandler) ProcessTask(ctx context.Context, t *asynq.Ta // 4.2 更新钱包(解冻余额) wallet, walletErr := l.svcCtx.AgentWalletModel.FindOneByAgentId(transCtx, freezeTask.AgentId) - if walletErr != nil { - return pkgerrors.Wrapf(walletErr, "查询钱包失败, agentId: %d", freezeTask.AgentId) - } + if walletErr != nil { + return pkgerrors.Wrapf(walletErr, "查询钱包失败, agentId: %s", freezeTask.AgentId) + } wallet.FrozenBalance -= freezeTask.FreezeAmount wallet.Balance += freezeTask.FreezeAmount @@ -84,11 +84,11 @@ func (l *UnfreezeCommissionHandler) ProcessTask(ctx context.Context, t *asynq.Ta return nil }) - if err != nil { - logx.Errorf("解冻任务处理失败: freezeTaskId=%d, err=%v", payload.FreezeTaskId, err) - return fmt.Errorf("解冻任务处理失败: freezeTaskId=%d, err=%w", payload.FreezeTaskId, err) - } + if err != nil { + logx.Errorf("解冻任务处理失败: freezeTaskId=%s, err=%v", payload.FreezeTaskId, err) + return fmt.Errorf("解冻任务处理失败: freezeTaskId=%s, err=%w", payload.FreezeTaskId, err) + } - logx.Infof("解冻任务处理成功: freezeTaskId=%d, agentId=%d, amount=%.2f", payload.FreezeTaskId, freezeTask.AgentId, freezeTask.FreezeAmount) - return nil + logx.Infof("解冻任务处理成功: freezeTaskId=%s, agentId=%s, amount=%.2f", payload.FreezeTaskId, freezeTask.AgentId, freezeTask.FreezeAmount) + return nil } diff --git a/app/main/api/internal/service/agentService.go b/app/main/api/internal/service/agentService.go index c30b42a..cda806e 100644 --- a/app/main/api/internal/service/agentService.go +++ b/app/main/api/internal/service/agentService.go @@ -11,6 +11,7 @@ import ( "ycc-server/common/globalkey" "ycc-server/pkg/lzkit/lzUtils" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" @@ -205,20 +206,21 @@ func (s *AgentService) calculatePriceCost(setPrice, priceThreshold, priceFeeRate // giveAgentCommission 发放代理佣金 // orderPrice: 订单单价,用于判断是否需要冻结 // 返回:freezeTaskId(如果有冻结任务),error -func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Session, agentId, orderId, productId int64, amount float64, orderPrice float64) (int64, error) { +func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Session, agentId, orderId, productId string, amount float64, orderPrice float64) (string, error) { // 1. 创建佣金记录 commission := &model.AgentCommission{ + Id: uuid.NewString(), AgentId: agentId, OrderId: orderId, ProductId: productId, Amount: amount, Status: 1, // 已发放 } - commissionResult, err := s.AgentCommissionModel.Insert(ctx, session, commission) + _, err := s.AgentCommissionModel.Insert(ctx, session, commission) if err != nil { - return 0, errors.Wrapf(err, "创建佣金记录失败") + return "", errors.Wrapf(err, "创建佣金记录失败") } - commissionId, _ := commissionResult.LastInsertId() + commissionId := commission.Id // 2. 判断是否需要冻结 // 2.1 获取冻结阈值配置(默认100元) @@ -231,7 +233,7 @@ func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Ses // 2.2 判断订单单价是否达到冻结阈值 freezeAmount := 0.0 - var freezeTaskId int64 = 0 + var freezeTaskId string = "" if orderPrice >= freezeThreshold { // 2.3 获取冻结比例配置(默认10%) freezeRatio, err := s.getConfigFloat(ctx, "commission_freeze_ratio") @@ -266,6 +268,7 @@ func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Ses // 创建冻结任务记录 freezeTask := &model.AgentFreezeTask{ + Id: uuid.NewString(), AgentId: agentId, OrderId: orderId, CommissionId: commissionId, @@ -277,18 +280,18 @@ func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Ses UnfreezeTime: unfreezeTime, Remark: lzUtils.StringToNullString(fmt.Sprintf("订单单价%.2f元,冻结比例%.2f%%,解冻天数%d天", orderPrice, freezeRatio*100, unfreezeDays)), } - freezeTaskResult, err := s.AgentFreezeTaskModel.Insert(ctx, session, freezeTask) + _, err = s.AgentFreezeTaskModel.Insert(ctx, session, freezeTask) if err != nil { - return 0, errors.Wrapf(err, "创建冻结任务失败") + return "", errors.Wrapf(err, "创建冻结任务失败") } - freezeTaskId, _ = freezeTaskResult.LastInsertId() + freezeTaskId = freezeTask.Id } } // 3. 更新钱包余额 wallet, err := s.AgentWalletModel.FindOneByAgentId(ctx, agentId) if err != nil { - return 0, errors.Wrapf(err, "查询钱包失败, agentId: %d", agentId) + return "", errors.Wrapf(err, "查询钱包失败, agentId: %s", agentId) } // 实际到账金额 = 佣金金额 - 冻结金额 @@ -298,14 +301,14 @@ func (s *AgentService) giveAgentCommission(ctx context.Context, session sqlx.Ses wallet.FrozenBalance += freezeAmount wallet.TotalEarnings += amount // 累计收益包含冻结部分 if err := s.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil { - return 0, errors.Wrapf(err, "更新钱包失败") + return "", errors.Wrapf(err, "更新钱包失败") } return freezeTaskId, nil } // distributeLevelBonus 分配等级加成返佣给上级链 -func (s *AgentService) distributeLevelBonus(ctx context.Context, session sqlx.Session, agent *model.Agent, orderId, productId int64, levelBonus float64, levelBonusInt int64) error { +func (s *AgentService) distributeLevelBonus(ctx context.Context, session sqlx.Session, agent *model.Agent, orderId, productId string, levelBonus float64, levelBonusInt int64) error { // 钻石代理:等级加成为0,无返佣分配 if agent.Level == 3 { return nil @@ -377,7 +380,7 @@ func (s *AgentService) distributeLevelBonus(ctx context.Context, session sqlx.Se // 注意:findDiamondParent 和 findGoldParent 会自动跳过中间的所有普通代理, // // 直接向上查找到第一个钻石或黄金代理 -func (s *AgentService) distributeNormalAgentBonus(ctx context.Context, session sqlx.Session, agent *model.Agent, orderId, productId int64, amount float64, levelBonusInt int64) error { +func (s *AgentService) distributeNormalAgentBonus(ctx context.Context, session sqlx.Session, agent *model.Agent, orderId, productId string, amount float64, levelBonusInt int64) error { // 1. 查找直接上级 parent, err := s.findDirectParent(ctx, agent.Id) if err != nil && !errors.Is(err, model.ErrNotFound) { @@ -626,18 +629,19 @@ func (s *AgentService) getRebateConfigFloat(ctx context.Context, configKey strin } // giveRebate 发放返佣 -func (s *AgentService) giveRebate(ctx context.Context, session sqlx.Session, agentId, sourceAgentId, orderId, productId int64, amount float64, levelBonus int64, rebateType int64) error { - // 1. 创建返佣记录 - rebate := &model.AgentRebate{ - AgentId: agentId, - SourceAgentId: sourceAgentId, - OrderId: orderId, - ProductId: productId, - RebateType: rebateType, - LevelBonus: float64(levelBonus), // 等级加成金额 - RebateAmount: amount, - Status: 1, // 已发放 - } +func (s *AgentService) giveRebate(ctx context.Context, session sqlx.Session, agentId, sourceAgentId, orderId, productId string, amount float64, levelBonus int64, rebateType int64) error { + // 1. 创建返佣记录 + rebate := &model.AgentRebate{ + Id: uuid.NewString(), + AgentId: agentId, + SourceAgentId: sourceAgentId, + OrderId: orderId, + ProductId: productId, + RebateType: rebateType, + LevelBonus: float64(levelBonus), // 等级加成金额 + RebateAmount: amount, + Status: 1, // 已发放 + } if _, err := s.AgentRebateModel.Insert(ctx, session, rebate); err != nil { return errors.Wrapf(err, "创建返佣记录失败") } @@ -658,12 +662,12 @@ func (s *AgentService) giveRebate(ctx context.Context, session sqlx.Session, age } // FindDirectParent 查找直接上级(公开方法) -func (s *AgentService) FindDirectParent(ctx context.Context, agentId int64) (*model.Agent, error) { +func (s *AgentService) FindDirectParent(ctx context.Context, agentId string) (*model.Agent, error) { return s.findDirectParent(ctx, agentId) } // findDirectParent 查找直接上级 -func (s *AgentService) findDirectParent(ctx context.Context, agentId int64) (*model.Agent, error) { +func (s *AgentService) findDirectParent(ctx context.Context, agentId string) (*model.Agent, error) { // 查找关系类型为1(直接关系)的上级 builder := s.AgentRelationModel.SelectBuilder() builder = builder.Where("child_id = ? AND relation_type = ? AND del_state = ?", agentId, 1, globalkey.DelStateNo) @@ -692,7 +696,7 @@ func (s *AgentService) findDirectParent(ctx context.Context, agentId int64) (*mo // - 普通 -> 普通 -> 钻石:会找到钻石(跳过中间的普通代理) // - 普通 -> 黄金 -> 钻石:会找到钻石(跳过黄金代理) // - 普通 -> 普通 -> 黄金:返回 ErrNotFound(没有钻石) -func (s *AgentService) findDiamondParent(ctx context.Context, agentId int64) (*model.Agent, error) { +func (s *AgentService) findDiamondParent(ctx context.Context, agentId string) (*model.Agent, error) { currentId := agentId maxDepth := 100 // 防止无限循环 depth := 0 @@ -732,7 +736,7 @@ func (s *AgentService) findDiamondParent(ctx context.Context, agentId int64) (*m // - 普通 -> 普通 -> 黄金:会找到黄金(跳过中间的普通代理) // - 普通 -> 黄金:会找到黄金 // - 普通 -> 普通 -> 钻石:返回 ErrNotFound(跳过钻石,继续查找黄金,但找不到) -func (s *AgentService) findGoldParent(ctx context.Context, agentId int64) (*model.Agent, error) { +func (s *AgentService) findGoldParent(ctx context.Context, agentId string) (*model.Agent, error) { currentId := agentId maxDepth := 100 // 防止无限循环 depth := 0 @@ -784,7 +788,7 @@ func (s *AgentService) getConfigInt(ctx context.Context, configKey string) (int6 } // ProcessUpgrade 处理代理升级 -func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId, toLevel int64, upgradeType int64, upgradeFee, rebateAmount float64, orderNo string, operatorAgentId int64) error { +func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId string, toLevel int64, upgradeType int64, upgradeFee, rebateAmount float64, orderNo string, operatorAgentId string) error { return s.AgentWalletModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error { // 1. 获取代理信息 agent, err := s.AgentModel.FindOne(transCtx, agentId) @@ -820,7 +824,7 @@ func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId, toLevel int6 if needDetach { // 脱离前先获取原直接上级及其上级的信息(用于后续重新连接) oldParent, oldParentErr := s.findDirectParent(transCtx, agentId) - var grandparentId int64 = 0 + var grandparentId string = "" if oldParentErr == nil && oldParent != nil { // 查找原上级的上级 grandparent, grandparentErr := s.findDirectParent(transCtx, oldParent.Id) @@ -835,7 +839,7 @@ func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId, toLevel int6 } // 脱离后,尝试连接到原上级的上级 - if grandparentId > 0 { + if grandparentId != "" { if err := s.reconnectToGrandparent(transCtx, session, agentId, toLevel, grandparentId); err != nil { return errors.Wrapf(err, "重新连接上级关系失败") } @@ -844,7 +848,7 @@ func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId, toLevel int6 // 5. 如果升级为钻石,独立成新团队 if toLevel == 3 { - agent.TeamLeaderId = sql.NullInt64{Int64: agentId, Valid: true} + agent.TeamLeaderId = sql.NullString{String: agentId, Valid: true} // 更新所有下级的团队首领 if err := s.updateChildrenTeamLeader(transCtx, session, agentId, agentId); err != nil { return errors.Wrapf(err, "更新下级团队首领失败") @@ -855,8 +859,8 @@ func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId, toLevel int6 if err != nil && !errors.Is(err, model.ErrNotFound) { return errors.Wrapf(err, "查找团队首领失败") } - if teamLeaderId > 0 { - agent.TeamLeaderId = sql.NullInt64{Int64: teamLeaderId, Valid: true} + if teamLeaderId != "" { + agent.TeamLeaderId = sql.NullString{String: teamLeaderId, Valid: true} } } @@ -899,7 +903,7 @@ func (s *AgentService) needDetachFromParent(ctx context.Context, agent *model.Ag } // detachFromParent 脱离直接上级关系 -func (s *AgentService) detachFromParent(ctx context.Context, session sqlx.Session, agentId int64) error { +func (s *AgentService) detachFromParent(ctx context.Context, session sqlx.Session, agentId string) error { // 查找直接关系 builder := s.AgentRelationModel.SelectBuilder(). Where("child_id = ? AND relation_type = ? AND del_state = ?", agentId, 1, globalkey.DelStateNo) @@ -926,7 +930,7 @@ func (s *AgentService) detachFromParent(ctx context.Context, session sqlx.Sessio } // reconnectToGrandparent 重新连接到原上级的上级(如果存在且符合条件) -func (s *AgentService) reconnectToGrandparent(ctx context.Context, session sqlx.Session, agentId int64, newLevel int64, grandparentId int64) error { +func (s *AgentService) reconnectToGrandparent(ctx context.Context, session sqlx.Session, agentId string, newLevel int64, grandparentId string) error { // 获取原上级的上级信息 grandparent, err := s.AgentModel.FindOne(ctx, grandparentId) if err != nil { @@ -967,11 +971,12 @@ func (s *AgentService) reconnectToGrandparent(ctx context.Context, session sqlx. } // 创建新的关系连接到原上级的上级 - relation := &model.AgentRelation{ - ParentId: grandparent.Id, - ChildId: agentId, - RelationType: 1, // 直接关系 - } + relation := &model.AgentRelation{ + Id: uuid.NewString(), + ParentId: grandparent.Id, + ChildId: agentId, + RelationType: 1, // 直接关系 + } if _, err := s.AgentRelationModel.Insert(ctx, session, relation); err != nil { return errors.Wrapf(err, "创建新关系失败") } @@ -980,10 +985,10 @@ func (s *AgentService) reconnectToGrandparent(ctx context.Context, session sqlx. } // updateChildrenTeamLeader 更新所有下级的团队首领 -func (s *AgentService) updateChildrenTeamLeader(ctx context.Context, session sqlx.Session, agentId, teamLeaderId int64) error { +func (s *AgentService) updateChildrenTeamLeader(ctx context.Context, session sqlx.Session, agentId, teamLeaderId string) error { // 递归更新所有下级 - var updateChildren func(int64) error - updateChildren = func(parentId int64) error { + var updateChildren func(string) error + updateChildren = func(parentId string) error { // 查找直接下级 builder := s.AgentRelationModel.SelectBuilder(). Where("parent_id = ? AND relation_type = ? AND del_state = ?", parentId, 1, globalkey.DelStateNo) @@ -998,9 +1003,9 @@ func (s *AgentService) updateChildrenTeamLeader(ctx context.Context, session sql continue } - child.TeamLeaderId = sql.NullInt64{Int64: teamLeaderId, Valid: true} + child.TeamLeaderId = sql.NullString{String: teamLeaderId, Valid: true} if err := s.AgentModel.UpdateWithVersion(ctx, session, child); err != nil { - return errors.Wrapf(err, "更新下级团队首领失败, childId: %d", child.Id) + return errors.Wrapf(err, "更新下级团队首领失败, childId: %s", child.Id) } // 递归更新下级的下级 @@ -1016,24 +1021,24 @@ func (s *AgentService) updateChildrenTeamLeader(ctx context.Context, session sql } // findTeamLeaderId 查找团队首领ID(钻石代理) -func (s *AgentService) findTeamLeaderId(ctx context.Context, agentId int64) (int64, error) { +func (s *AgentService) findTeamLeaderId(ctx context.Context, agentId string) (string, error) { diamondParent, err := s.findDiamondParent(ctx, agentId) if err != nil { if errors.Is(err, model.ErrNotFound) { - return 0, nil + return "", nil } - return 0, err + return "", err } return diamondParent.Id, nil } // giveRebateForUpgrade 发放升级返佣 // 注意:升级返佣信息记录在 agent_upgrade 表中(rebate_agent_id 和 rebate_amount),不需要在 agent_rebate 表中创建记录 -func (s *AgentService) giveRebateForUpgrade(ctx context.Context, session sqlx.Session, parentAgentId, upgradeAgentId int64, amount float64, orderNo string) error { +func (s *AgentService) giveRebateForUpgrade(ctx context.Context, session sqlx.Session, parentAgentId, upgradeAgentId string, amount float64, orderNo string) error { // 更新钱包余额 wallet, err := s.AgentWalletModel.FindOneByAgentId(ctx, parentAgentId) if err != nil { - return errors.Wrapf(err, "查询钱包失败, agentId: %d", parentAgentId) + return errors.Wrapf(err, "查询钱包失败, agentId: %s", parentAgentId) } wallet.Balance += amount diff --git a/app/main/api/internal/service/apiRegistryService.go b/app/main/api/internal/service/apiRegistryService.go index bf722ef..f5252a5 100644 --- a/app/main/api/internal/service/apiRegistryService.go +++ b/app/main/api/internal/service/apiRegistryService.go @@ -1,16 +1,17 @@ package service import ( - "context" - "fmt" - "regexp" - "strings" + "context" + "fmt" + "regexp" + "strings" - "ycc-server/app/main/model" + "ycc-server/app/main/model" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/rest" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/rest" + "github.com/google/uuid" ) type ApiRegistryService struct { @@ -26,27 +27,27 @@ func NewApiRegistryService(adminApiModel model.AdminApiModel) *ApiRegistryServic // RegisterAllApis 自动注册所有API到数据库 func (s *ApiRegistryService) RegisterAllApis(ctx context.Context, routes []rest.Route) error { logx.Infof("开始注册API,共 %d 个路由", len(routes)) - + registeredCount := 0 skippedCount := 0 - + for _, route := range routes { // 跳过不需要权限控制的API if s.shouldSkipApi(route.Path) { skippedCount++ continue } - + // 解析API信息 apiInfo := s.parseRouteToApi(route) - + // 检查是否已存在 existing, err := s.adminApiModel.FindOneByApiCode(ctx, apiInfo.ApiCode) if err != nil && !errors.Is(err, model.ErrNotFound) { logx.Errorf("查询API失败: %v, apiCode: %s", err, apiInfo.ApiCode) continue } - + // 如果不存在则插入 if existing == nil { _, err = s.adminApiModel.Insert(ctx, nil, apiInfo) @@ -63,7 +64,7 @@ func (s *ApiRegistryService) RegisterAllApis(ctx context.Context, routes []rest. existing.Method = apiInfo.Method existing.Url = apiInfo.Url existing.Description = apiInfo.Description - + _, err = s.adminApiModel.Update(ctx, nil, existing) if err != nil { logx.Errorf("更新API失败: %v, apiCode: %s", err, apiInfo.ApiCode) @@ -73,7 +74,7 @@ func (s *ApiRegistryService) RegisterAllApis(ctx context.Context, routes []rest. } } } - + logx.Infof("API注册完成,新增: %d, 跳过: %d", registeredCount, skippedCount) return nil } @@ -94,13 +95,13 @@ func (s *ApiRegistryService) shouldSkipApi(path string) bool { "/api/v1/authorization/", // 授权接口 "/health", // 健康检查 } - + for _, skipPath := range skipPaths { if strings.HasPrefix(path, skipPath) { return true } } - + return false } @@ -108,33 +109,34 @@ func (s *ApiRegistryService) shouldSkipApi(path string) bool { func (s *ApiRegistryService) parseRouteToApi(route rest.Route) *model.AdminApi { // 生成API编码 apiCode := s.generateApiCode(route.Method, route.Path) - + // 生成API名称 apiName := s.generateApiName(route.Path) - + // 生成描述 description := s.generateDescription(route.Method, route.Path) - - return &model.AdminApi{ - ApiName: apiName, - ApiCode: apiCode, - Method: route.Method, - Url: route.Path, - Status: 1, // 默认启用 - Description: description, - } + + return &model.AdminApi{ + Id: uuid.NewString(), + ApiName: apiName, + ApiCode: apiCode, + Method: route.Method, + Url: route.Path, + Status: 1, // 默认启用 + Description: description, + } } // generateApiCode 生成API编码 func (s *ApiRegistryService) generateApiCode(method, path string) string { // 移除路径参数,如 :id cleanPath := regexp.MustCompile(`/:[\w]+`).ReplaceAllString(path, "") - + // 转换为小写并替换特殊字符 apiCode := strings.ToLower(method) + "_" + strings.ReplaceAll(cleanPath, "/", "_") apiCode = strings.TrimPrefix(apiCode, "_") apiCode = strings.TrimSuffix(apiCode, "_") - + return apiCode } @@ -145,52 +147,52 @@ func (s *ApiRegistryService) generateApiName(path string) string { if len(parts) < 3 { return path } - + // 获取模块名和操作名 module := parts[len(parts)-2] action := parts[len(parts)-1] - + // 转换为中文描述 moduleMap := map[string]string{ - "agent": "代理管理", - "auth": "认证管理", - "feature": "功能管理", - "menu": "菜单管理", - "notification": "通知管理", - "order": "订单管理", + "agent": "代理管理", + "auth": "认证管理", + "feature": "功能管理", + "menu": "菜单管理", + "notification": "通知管理", + "order": "订单管理", "platform_user": "平台用户", - "product": "产品管理", - "query": "查询管理", - "role": "角色管理", - "user": "用户管理", + "product": "产品管理", + "query": "查询管理", + "role": "角色管理", + "user": "用户管理", } - + actionMap := map[string]string{ - "list": "列表", - "create": "创建", - "update": "更新", - "delete": "删除", - "detail": "详情", - "login": "登录", - "config": "配置", - "example": "示例", - "refund": "退款", - "link": "链接", - "stats": "统计", - "cleanup": "清理", - "record": "记录", + "list": "列表", + "create": "创建", + "update": "更新", + "delete": "删除", + "detail": "详情", + "login": "登录", + "config": "配置", + "example": "示例", + "refund": "退款", + "link": "链接", + "stats": "统计", + "cleanup": "清理", + "record": "记录", } - + moduleName := moduleMap[module] if moduleName == "" { moduleName = module } - + actionName := actionMap[action] if actionName == "" { actionName = action } - + return fmt.Sprintf("%s-%s", moduleName, actionName) } @@ -202,14 +204,14 @@ func (s *ApiRegistryService) generateDescription(method, path string) string { "PUT": "更新", "DELETE": "删除", } - + methodDesc := methodMap[method] if methodDesc == "" { methodDesc = method } - + apiName := s.generateApiName(path) - + return fmt.Sprintf("%s%s", methodDesc, apiName) } diff --git a/app/main/api/internal/service/apirequestService.go b/app/main/api/internal/service/apirequestService.go index a410a95..873e4fb 100644 --- a/app/main/api/internal/service/apirequestService.go +++ b/app/main/api/internal/service/apirequestService.go @@ -58,26 +58,26 @@ type APIResponseData struct { } // ProcessRequests 处理请求 -func (a *ApiRequestService) ProcessRequests(params []byte, productID int64) ([]byte, error) { +func (a *ApiRequestService) ProcessRequests(params []byte, productID string) ([]byte, error) { var ctx, cancel = context.WithCancel(context.Background()) defer cancel() - build := a.productFeatureModel.SelectBuilder().Where(squirrel.Eq{ - "product_id": productID, - }) + 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)) + var featureIDs []string + isImportantMap := make(map[string]int64, len(productFeatureList)) for _, pf := range productFeatureList { - featureIDs = append(featureIDs, pf.FeatureId) - isImportantMap[pf.FeatureId] = pf.IsImportant + 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}) + builder := a.featureModel.SelectBuilder().Where(squirrel.Eq{"id": featureIDs}) featureList, findFeatureErr := a.featureModel.FindAll(ctx, builder, "") if findFeatureErr != nil { return nil, findFeatureErr @@ -114,7 +114,7 @@ func (a *ApiRequestService) ProcessRequests(params []byte, productID int64) ([]b preprocessErr error ) // 若 isImportantMap[feature.ID] == 1,则表示需要在出错时重试 - isImportant := isImportantMap[feature.Id] == 1 + isImportant := isImportantMap[feature.Id] == 1 tryCount := 0 for { tryCount++ diff --git a/app/main/api/internal/service/asynqService.go b/app/main/api/internal/service/asynqService.go index 5a33149..a613455 100644 --- a/app/main/api/internal/service/asynqService.go +++ b/app/main/api/internal/service/asynqService.go @@ -3,10 +3,10 @@ package service import ( + "encoding/json" "time" "ycc-server/app/main/api/internal/config" "ycc-server/app/main/api/internal/types" - "encoding/json" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" @@ -31,14 +31,14 @@ func NewAsynqService(c config.Config) *AsynqService { func (s *AsynqService) Close() error { return s.client.Close() } -func (s *AsynqService) SendQueryTask(orderID int64) error { +func (s *AsynqService) SendQueryTask(orderID string) error { // 准备任务的 payload payload := types.MsgPaySuccessQueryPayload{ OrderID: orderID, } payloadBytes, err := json.Marshal(payload) if err != nil { - logx.Errorf("发送异步任务失败 (无法编码 payload): %v, 订单号: %d", err, orderID) + logx.Errorf("发送异步任务失败 (无法编码 payload): %v, 订单号: %s", err, orderID) return err // 直接返回错误,避免继续执行 } @@ -51,24 +51,24 @@ func (s *AsynqService) SendQueryTask(orderID int64) error { // 将任务加入队列并获取任务信息 info, err := s.client.Enqueue(task) if err != nil { - logx.Errorf("发送异步任务失败 (加入队列失败): %+v, 订单号: %d", err, orderID) + logx.Errorf("发送异步任务失败 (加入队列失败): %+v, 订单号: %s", err, orderID) return err } // 记录成功日志,带上任务 ID 和队列信息 - logx.Infof("发送异步任务成功,任务ID: %s, 队列: %s, 订单号: %d", info.ID, info.Queue, orderID) + logx.Infof("发送异步任务成功,任务ID: %s, 队列: %s, 订单号: %s", info.ID, info.Queue, orderID) return nil } // SendAgentProcessTask 发送代理处理任务 -func (s *AsynqService) SendAgentProcessTask(orderID int64) error { +func (s *AsynqService) SendAgentProcessTask(orderID string) error { // 准备任务的 payload payload := types.MsgAgentProcessPayload{ OrderID: orderID, } payloadBytes, err := json.Marshal(payload) if err != nil { - logx.Errorf("发送代理处理任务失败 (无法编码 payload): %v, 订单号: %d", err, orderID) + logx.Errorf("发送代理处理任务失败 (无法编码 payload): %v, 订单号: %s", err, orderID) return err } @@ -81,31 +81,31 @@ func (s *AsynqService) SendAgentProcessTask(orderID int64) error { // 将任务加入队列并获取任务信息 info, err := s.client.Enqueue(task) if err != nil { - logx.Errorf("发送代理处理任务失败 (加入队列失败): %+v, 订单号: %d", err, orderID) + logx.Errorf("发送代理处理任务失败 (加入队列失败): %+v, 订单号: %s", err, orderID) return err } // 记录成功日志,带上任务 ID 和队列信息 - logx.Infof("发送代理处理任务成功,任务ID: %s, 队列: %s, 订单号: %d", info.ID, info.Queue, orderID) + logx.Infof("发送代理处理任务成功,任务ID: %s, 队列: %s, 订单号: %s", info.ID, info.Queue, orderID) return nil } // SendUnfreezeTask 发送解冻任务(延迟执行) -func (s *AsynqService) SendUnfreezeTask(freezeTaskId int64, processAt time.Time) error { +func (s *AsynqService) SendUnfreezeTask(freezeTaskId string, processAt time.Time) error { // 准备任务的 payload payload := types.MsgUnfreezeCommissionPayload{ FreezeTaskId: freezeTaskId, } payloadBytes, err := json.Marshal(payload) if err != nil { - logx.Errorf("发送解冻任务失败 (无法编码 payload): %v, 冻结任务ID: %d", err, freezeTaskId) + logx.Errorf("发送解冻任务失败 (无法编码 payload): %v, 冻结任务ID: %s", err, freezeTaskId) return err } options := []asynq.Option{ - asynq.MaxRetry(5), // 设置最大重试次数 - asynq.ProcessAt(processAt), // 延迟到指定时间执行 - asynq.Queue("critical"), // 使用关键队列 + asynq.MaxRetry(5), // 设置最大重试次数 + asynq.ProcessAt(processAt), // 延迟到指定时间执行 + asynq.Queue("critical"), // 使用关键队列 } // 创建任务 task := asynq.NewTask(types.MsgUnfreezeCommission, payloadBytes, options...) @@ -113,11 +113,11 @@ func (s *AsynqService) SendUnfreezeTask(freezeTaskId int64, processAt time.Time) // 将任务加入队列并获取任务信息 info, err := s.client.Enqueue(task) if err != nil { - logx.Errorf("发送解冻任务失败 (加入队列失败): %+v, 冻结任务ID: %d", err, freezeTaskId) + logx.Errorf("发送解冻任务失败 (加入队列失败): %+v, 冻结任务ID: %s", err, freezeTaskId) return err } // 记录成功日志,带上任务 ID 和队列信息 - logx.Infof("发送解冻任务成功,任务ID: %s, 队列: %s, 冻结任务ID: %d, 执行时间: %v", info.ID, info.Queue, freezeTaskId, processAt) + logx.Infof("发送解冻任务成功,任务ID: %s, 队列: %s, 冻结任务ID: %s, 执行时间: %v", info.ID, info.Queue, freezeTaskId, processAt) return nil -} \ No newline at end of file +} diff --git a/app/main/api/internal/service/authorizationService.go b/app/main/api/internal/service/authorizationService.go index 61fd403..11b5104 100644 --- a/app/main/api/internal/service/authorizationService.go +++ b/app/main/api/internal/service/authorizationService.go @@ -11,6 +11,7 @@ import ( "ycc-server/app/main/api/internal/config" "ycc-server/app/main/model" + "github.com/google/uuid" "github.com/jung-kurt/gofpdf" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" @@ -36,9 +37,9 @@ func NewAuthorizationService(c config.Config, authDocModel model.AuthorizationDo // GenerateAuthorizationDocument 生成授权书PDF func (s *AuthorizationService) GenerateAuthorizationDocument( ctx context.Context, - userID int64, - orderID int64, - queryID int64, + userID string, + orderID string, + queryID string, userInfo map[string]interface{}, ) (*model.AuthorizationDocument, error) { // 1. 生成PDF内容 @@ -56,7 +57,7 @@ func (s *AuthorizationService) GenerateAuthorizationDocument( } // 3. 生成文件名和路径 - fileName := fmt.Sprintf("auth_%d_%d_%s.pdf", userID, orderID, time.Now().Format("20060102_150405")) + fileName := fmt.Sprintf("auth_%s_%s_%s.pdf", userID, orderID, time.Now().Format("20060102_150405")) filePath := filepath.Join(dirPath, fileName) // 只存储相对路径,不包含域名 relativePath := fmt.Sprintf("%s/%s/%s", year, month, fileName) @@ -68,6 +69,7 @@ func (s *AuthorizationService) GenerateAuthorizationDocument( // 5. 保存到数据库 authDoc := &model.AuthorizationDocument{ + Id: uuid.NewString(), UserId: userID, OrderId: orderID, QueryId: queryID, @@ -80,15 +82,14 @@ func (s *AuthorizationService) GenerateAuthorizationDocument( ExpireTime: sql.NullTime{Valid: false}, // 永久保留,不设置过期时间 } - result, err := s.authDocModel.Insert(ctx, nil, authDoc) + _, err = s.authDocModel.Insert(ctx, nil, authDoc) if err != nil { // 如果数据库保存失败,删除已创建的文件 os.Remove(filePath) return nil, errors.Wrapf(err, "保存授权书记录失败") } - authDoc.Id, _ = result.LastInsertId() - logx.Infof("授权书生成成功: userID=%d, orderID=%d, filePath=%s", userID, orderID, filePath) + logx.Infof("授权书生成成功: userID=%s, orderID=%s, filePath=%s", userID, orderID, filePath) return authDoc, nil } diff --git a/app/main/api/internal/service/userService.go b/app/main/api/internal/service/userService.go index 237e448..fb37bbd 100644 --- a/app/main/api/internal/service/userService.go +++ b/app/main/api/internal/service/userService.go @@ -2,12 +2,12 @@ package service import ( "context" + "database/sql" "ycc-server/app/main/api/internal/config" "ycc-server/app/main/model" "ycc-server/common/ctxdata" jwtx "ycc-server/common/jwt" "ycc-server/common/xerr" - "database/sql" "github.com/google/uuid" "github.com/pkg/errors" @@ -18,17 +18,15 @@ type UserService struct { Config *config.Config userModel model.UserModel userAuthModel model.UserAuthModel - userTempModel model.UserTempModel agentModel model.AgentModel } // NewUserService 创建UserService实例 -func NewUserService(config *config.Config, userModel model.UserModel, userAuthModel model.UserAuthModel, userTempModel model.UserTempModel, agentModel model.AgentModel) *UserService { +func NewUserService(config *config.Config, userModel model.UserModel, userAuthModel model.UserAuthModel, agentModel model.AgentModel) *UserService { return &UserService{ Config: config, userModel: userModel, userAuthModel: userAuthModel, - userTempModel: userTempModel, agentModel: agentModel, } } @@ -40,51 +38,42 @@ func (s *UserService) GenerateUUIDUserId(ctx context.Context) (string, error) { } // RegisterUUIDUser 注册UUID用户,返回用户ID -func (s *UserService) RegisterUUIDUser(ctx context.Context) (int64, error) { +func (s *UserService) RegisterUUIDUser(ctx context.Context) (string, error) { // 生成UUID uuidStr, err := s.GenerateUUIDUserId(ctx) if err != nil { - return 0, err + return "", err } - var userId int64 + var userId string 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 + user := &model.User{Id: uuid.NewString()} + if _, userInsertErr := s.userModel.Insert(ctx, session, user); userInsertErr != nil { + return userInsertErr } - 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 + userId = user.Id + userAuth := &model.UserAuth{Id: uuid.NewString(), UserId: userId, AuthType: model.UserAuthTypeUUID, AuthKey: uuidStr} + _, userAuthInsertErr := s.userAuthModel.Insert(ctx, session, userAuth) + return userAuthInsertErr }) if err != nil { - return 0, err + return "", err } return userId, nil } -// generalUserToken 生成用户token -func (s *UserService) GeneralUserToken(ctx context.Context, userID int64, userType int64) (string, error) { +// GeneralUserToken 生成用户token +func (s *UserService) GeneralUserToken(ctx context.Context, userID string, userType int64) (string, error) { platform, err := ctxdata.GetPlatformFromCtx(ctx) if err != nil { return "", err } var isAgent int64 - var agentID int64 + var agentID string + var authType string + var authKey string if userType == model.UserTypeNormal { agent, err := s.agentModel.FindOneByUserId(ctx, userID) if err != nil && !errors.Is(err, model.ErrNotFound) { @@ -94,13 +83,17 @@ func (s *UserService) GeneralUserToken(ctx context.Context, userID int64, userTy agentID = agent.Id isAgent = model.AgentStatusYes } - } else { - userTemp, err := s.userTempModel.FindOne(ctx, userID) - if err != nil { - return "", err + userAuth, err := s.userAuthModel.FindOneByUserIdAuthType(ctx, userID, model.UserAuthTypeMobile) + if err == nil && userAuth != nil { + authType = userAuth.AuthType + authKey = userAuth.AuthKey } - if userTemp != nil { - userID = userTemp.Id + } else { + platAuthType := s.getAuthTypeByPlatform(platform) + ua, err := s.userAuthModel.FindOneByUserIdAuthType(ctx, userID, platAuthType) + if err == nil && ua != nil { + authType = ua.AuthType + authKey = ua.AuthKey } } token, generaErr := jwtx.GenerateJwtToken(jwtx.JwtClaims{ @@ -109,95 +102,93 @@ func (s *UserService) GeneralUserToken(ctx context.Context, userID int64, userTy Platform: platform, UserType: userType, IsAgent: isAgent, + AuthType: authType, + AuthKey: authKey, }, s.Config.JwtAuth.AccessSecret, s.Config.JwtAuth.AccessExpire) if generaErr != nil { - return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "更新token, 生成token失败 : %d", userID) + return "", errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "更新token, 生成token失败 : %s", userID) } return token, nil } +func (s *UserService) getAuthTypeByPlatform(platform string) string { + switch platform { + case model.PlatformWxMini: + return model.UserAuthTypeWxMiniOpenID + case model.PlatformWxH5: + return model.UserAuthTypeWxh5OpenID + case model.PlatformH5, model.PlatformApp: + return model.UserAuthTypeUUID + default: + return model.UserAuthTypeUUID + } +} + // RegisterUser 注册用户,返回用户ID // 传入手机号,自动注册,如果ctx存在临时用户则临时用户转为正式用户 -func (s *UserService) RegisterUser(ctx context.Context, mobile string) (int64, error) { +func (s *UserService) RegisterUser(ctx context.Context, mobile string) (string, error) { claims, err := ctxdata.GetClaimsFromCtx(ctx) if err != nil && !errors.Is(err, ctxdata.ErrNoInCtx) { - return 0, err + return "", err } user, err := s.userModel.FindOneByMobile(ctx, sql.NullString{String: mobile, Valid: true}) if err != nil && !errors.Is(err, model.ErrNotFound) { - return 0, err + return "", err } if user != nil { - return 0, errors.New("用户已注册") + return "", errors.New("用户已注册") } // 普通注册 if claims == nil { - var userId int64 + var userId string err = s.userModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { - user := &model.User{ - Mobile: sql.NullString{String: mobile, Valid: true}, + user := &model.User{Id: uuid.NewString(), Mobile: sql.NullString{String: mobile, Valid: true}} + if _, userInsertErr := s.userModel.Insert(ctx, session, user); userInsertErr != nil { + return userInsertErr } - result, err := s.userModel.Insert(ctx, session, user) - if err != nil { - return err + userId = user.Id + _, userAuthInsertErr := s.userAuthModel.Insert(ctx, session, &model.UserAuth{Id: uuid.NewString(), UserId: userId, AuthType: model.UserAuthTypeMobile, AuthKey: mobile}) + if userAuthInsertErr != nil { + return userAuthInsertErr } - userId, err = result.LastInsertId() - if err != nil { - return err - } - s.userAuthModel.Insert(ctx, session, &model.UserAuth{ - UserId: userId, - AuthType: model.UserAuthTypeMobile, - AuthKey: mobile, - }) return nil }) if err != nil { - return 0, err + return "", err } return userId, nil } // 双重判断是否已经注册 if claims.UserType == model.UserTypeNormal { - return 0, errors.New("用户已注册") + return "", errors.New("用户已注册") } - var userId int64 + var userId string // 临时转正式注册 err = s.userModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { - user := &model.User{ - Mobile: sql.NullString{String: mobile, Valid: true}, + user := &model.User{Id: uuid.NewString(), Mobile: sql.NullString{String: mobile, Valid: true}} + if _, userInsertErr := s.userModel.Insert(ctx, session, user); userInsertErr != nil { + return userInsertErr } - result, err := s.userModel.Insert(ctx, session, user) - if err != nil { - return err + userId = user.Id + _, userAuthInsertErr := s.userAuthModel.Insert(ctx, session, &model.UserAuth{Id: uuid.NewString(), UserId: userId, AuthType: model.UserAuthTypeMobile, AuthKey: mobile}) + if userAuthInsertErr != nil { + return userAuthInsertErr } - userId, err = result.LastInsertId() - if err != nil { - return err - } - _, err = s.userAuthModel.Insert(ctx, session, &model.UserAuth{ - UserId: userId, - AuthType: model.UserAuthTypeMobile, - AuthKey: mobile, - }) - if err != nil { - return err - } - err = s.TempUserBindUser(ctx, session, userId) - if err != nil { - return err + tempUserBindErr := s.TempUserBindUser(ctx, session, userId) + if tempUserBindErr != nil { + return tempUserBindErr } return nil }) if err != nil { - return 0, err + return "", err } return userId, nil } // TempUserBindUser 临时用户绑定用户 -func (s *UserService) TempUserBindUser(ctx context.Context, session sqlx.Session, normalUserID int64) error { +func (s *UserService) TempUserBindUser(ctx context.Context, session sqlx.Session, normalUserID string) error { claims, err := ctxdata.GetClaimsFromCtx(ctx) if err != nil && !errors.Is(err, ctxdata.ErrNoInCtx) { return err @@ -207,38 +198,17 @@ func (s *UserService) TempUserBindUser(ctx context.Context, session sqlx.Session return errors.New("无临时用户") } - // 使用事务上下文查询临时用户 - userTemp, err := s.userTempModel.FindOne(ctx, claims.UserId) - if err != nil { - return err - } - - // 检查是否已经注册过 - userAuth, err := s.userAuthModel.FindOneByAuthTypeAuthKey(ctx, userTemp.AuthType, userTemp.AuthKey) + existingAuth, err := s.userAuthModel.FindOneByAuthTypeAuthKey(ctx, claims.AuthType, claims.AuthKey) if err != nil && !errors.Is(err, model.ErrNotFound) { return err } - if userAuth != nil { + if existingAuth != nil { return errors.New("临时用户已注册") } if session == nil { err := s.userAuthModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { - _, err = s.userAuthModel.Insert(ctx, session, &model.UserAuth{ - UserId: normalUserID, - AuthType: userTemp.AuthType, - AuthKey: userTemp.AuthKey, - }) - if err != nil { - return err - } - - // 重新获取最新的userTemp数据,确保版本号是最新的 - latestUserTemp, err := s.userTempModel.FindOne(ctx, claims.UserId) - if err != nil { - return err - } - err = s.userTempModel.DeleteSoft(ctx, session, latestUserTemp) + _, err = s.userAuthModel.Insert(ctx, session, &model.UserAuth{Id: uuid.NewString(), UserId: normalUserID, AuthType: claims.AuthType, AuthKey: claims.AuthKey}) if err != nil { return err } @@ -249,48 +219,10 @@ func (s *UserService) TempUserBindUser(ctx context.Context, session sqlx.Session } return nil } else { - _, err = s.userAuthModel.Insert(ctx, session, &model.UserAuth{ - UserId: normalUserID, - AuthType: userTemp.AuthType, - AuthKey: userTemp.AuthKey, - }) - if err != nil { - return err - } - - // 重新获取最新的userTemp数据,确保版本号是最新的 - latestUserTemp, err := s.userTempModel.FindOne(ctx, claims.UserId) - if err != nil { - return err - } - err = s.userTempModel.DeleteSoft(ctx, session, latestUserTemp) + _, err = s.userAuthModel.Insert(ctx, session, &model.UserAuth{Id: uuid.NewString(), UserId: normalUserID, AuthType: claims.AuthType, AuthKey: claims.AuthKey}) if err != nil { return err } return nil } } - -// _bak_RegisterUUIDUser 注册UUID用户,返回用户ID -func (s *UserService) _bak_RegisterUUIDUser(ctx context.Context) error { - // 生成UUID - uuidStr, err := s.GenerateUUIDUserId(ctx) - if err != nil { - return err - } - - err = s.userTempModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { - // 创建用户临时记录 - userTemp := &model.UserTemp{ - AuthType: model.UserAuthTypeUUID, - AuthKey: uuidStr, - } - _, err := s.userTempModel.Insert(ctx, session, userTemp) - return err - }) - if err != nil { - return err - } - - return nil -} diff --git a/app/main/api/internal/service/verificationService.go b/app/main/api/internal/service/verificationService.go index 53e0ce7..8ba5e6e 100644 --- a/app/main/api/internal/service/verificationService.go +++ b/app/main/api/internal/service/verificationService.go @@ -1,12 +1,15 @@ package service import ( - "ycc-server/app/main/api/internal/config" - tianyuanapi "ycc-server/app/main/api/internal/service/tianyuanapi_sdk" - "encoding/json" - "fmt" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "ycc-server/app/main/api/internal/config" + tianyuanapi "ycc-server/app/main/api/internal/service/tianyuanapi_sdk" - "github.com/tidwall/gjson" + "github.com/tidwall/gjson" ) type VerificationService struct { c config.Config @@ -150,3 +153,55 @@ func (r *VerificationService) ThreeFactorVerification(request ThreeFactorVerific }, nil } } + +// GetWechatH5OpenID 通过code获取微信H5 OpenID +func (r *VerificationService) GetWechatH5OpenID(ctx context.Context, code string) (string, error) { + appID := r.c.WechatH5.AppID + appSecret := r.c.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 "", err + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + var data struct { + Openid string `json:"openid"` + } + if err := json.Unmarshal(body, &data); err != nil { + return "", err + } + if data.Openid == "" { + return "", fmt.Errorf("openid为空") + } + return data.Openid, nil +} + +// GetWechatMiniOpenID 通过code获取微信小程序 OpenID +func (r *VerificationService) GetWechatMiniOpenID(ctx context.Context, code string) (string, error) { + appID := r.c.WechatMini.AppID + appSecret := r.c.WechatMini.AppSecret + url := fmt.Sprintf("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", appID, appSecret, code) + resp, err := http.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + var data struct { + Openid string `json:"openid"` + } + if err := json.Unmarshal(body, &data); err != nil { + return "", err + } + if data.Openid == "" { + return "", fmt.Errorf("openid为空") + } + return data.Openid, nil +} diff --git a/app/main/api/internal/svc/servicecontext.go b/app/main/api/internal/svc/servicecontext.go index 6278ffb..3d9150b 100644 --- a/app/main/api/internal/svc/servicecontext.go +++ b/app/main/api/internal/svc/servicecontext.go @@ -28,7 +28,6 @@ type ServiceContext struct { // 用户相关模型 UserModel model.UserModel UserAuthModel model.UserAuthModel - UserTempModel model.UserTempModel // 产品相关模型 ProductModel model.ProductModel @@ -110,7 +109,6 @@ func NewServiceContext(c config.Config) *ServiceContext { // ============================== 用户相关模型 ============================== userModel := model.NewUserModel(db, cacheConf) userAuthModel := model.NewUserAuthModel(db, cacheConf) - userTempModel := model.NewUserTempModel(db, cacheConf) // ============================== 产品相关模型 ============================== productModel := model.NewProductModel(db, cacheConf) @@ -181,7 +179,7 @@ func NewServiceContext(c config.Config) *ServiceContext { agentRelationModel, agentLinkModel, agentOrderModel, agentCommissionModel, agentRebateModel, agentUpgradeModel, agentWithdrawalModel, agentConfigModel, agentProductConfigModel, agentRealNameModel, agentWithdrawalTaxModel, agentFreezeTaskModel) - userService := service.NewUserService(&c, userModel, userAuthModel, userTempModel, agentModel) + userService := service.NewUserService(&c, userModel, userAuthModel, agentModel) dictService := service.NewDictService(adminDictTypeModel, adminDictDataModel) imageService := service.NewImageService() authorizationService := service.NewAuthorizationService(c, authorizationDocumentModel) @@ -210,7 +208,6 @@ func NewServiceContext(c config.Config) *ServiceContext { // 用户相关模型 UserModel: userModel, UserAuthModel: userAuthModel, - UserTempModel: userTempModel, // 产品相关模型 ProductModel: productModel, diff --git a/app/main/api/internal/types/adminagent.go b/app/main/api/internal/types/adminagent.go index f6c5a92..35e185e 100644 --- a/app/main/api/internal/types/adminagent.go +++ b/app/main/api/internal/types/adminagent.go @@ -12,7 +12,7 @@ type AdminAuditAgentResp struct { } type AdminAuditWithdrawalReq struct { - WithdrawalId int64 `json:"withdrawal_id"` // 提现记录ID + WithdrawalId string `json:"withdrawal_id"` // 提现记录ID Status int64 `json:"status"` // 审核状态:2=通过,3=拒绝 Remark string `json:"remark"` // 备注 } @@ -32,11 +32,11 @@ type AdminGenerateDiamondInviteCodeResp struct { } type AdminGetAgentCommissionListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - OrderId *int64 `form:"order_id,optional"` // 订单ID(可选) - Status *int64 `form:"status,optional"` // 状态(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + OrderId *string `form:"order_id,optional"` // 订单ID(可选) + Status *int64 `form:"status,optional"` // 状态(可选) } type AdminGetAgentCommissionListResp struct { @@ -45,21 +45,23 @@ type AdminGetAgentCommissionListResp struct { } type AdminGetAgentConfigResp struct { - LevelBonus LevelBonusConfig `json:"level_bonus"` // 等级加成配置 - UpgradeFee UpgradeFeeConfig `json:"upgrade_fee"` // 升级费用配置 - UpgradeRebate UpgradeRebateConfig `json:"upgrade_rebate"` // 升级返佣配置 - DirectParentRebate DirectParentRebateConfig `json:"direct_parent_rebate"` // 直接上级返佣配置 - MaxGoldRebateAmount float64 `json:"max_gold_rebate_amount"` // 黄金代理最大返佣金额 - CommissionFreeze CommissionFreezeConfig `json:"commission_freeze"` // 佣金冻结配置 - TaxRate float64 `json:"tax_rate"` // 税率 - TaxExemptionAmount float64 `json:"tax_exemption_amount"` // 免税额度 + LevelBonus LevelBonusConfig `json:"level_bonus"` // 等级加成配置 + UpgradeFee UpgradeFeeConfig `json:"upgrade_fee"` // 升级费用配置 + UpgradeRebate UpgradeRebateConfig `json:"upgrade_rebate"` // 升级返佣配置 + DirectParentRebate DirectParentRebateConfig `json:"direct_parent_rebate"` // 直接上级返佣配置 + MaxGoldRebateAmount float64 `json:"max_gold_rebate_amount"` // 黄金代理最大返佣金额 + CommissionFreeze CommissionFreezeConfig `json:"commission_freeze"` // 佣金冻结配置 + TaxRate float64 `json:"tax_rate"` // 税率 + TaxExemptionAmount float64 `json:"tax_exemption_amount"` // 免税额度 + GoldMaxUpliftAmount float64 `json:"gold_max_uplift_amount"` + DiamondMaxUpliftAmount float64 `json:"diamond_max_uplift_amount"` } type AdminGetAgentLinkListReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - ProductId *int64 `form:"product_id,optional"` // 产品ID(可选) + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + ProductId *string `form:"product_id,optional"` // 产品ID(可选) LinkIdentifier *string `form:"link_identifier,optional"` // 推广码(可选) } @@ -74,7 +76,7 @@ type AdminGetAgentListReq struct { Mobile *string `form:"mobile,optional"` // 手机号(可选) Region *string `form:"region,optional"` // 区域(可选) Level *int64 `form:"level,optional"` // 等级(可选) - TeamLeaderId *int64 `form:"team_leader_id,optional"` // 团队首领ID(可选) + TeamLeaderId *string `form:"team_leader_id,optional"` // 团队首领ID(可选) } type AdminGetAgentListResp struct { @@ -83,11 +85,11 @@ type AdminGetAgentListResp struct { } type AdminGetAgentOrderListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - OrderId *int64 `form:"order_id,optional"` // 订单ID(可选) - ProcessStatus *int64 `form:"process_status,optional"` // 处理状态(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + OrderId *string `form:"order_id,optional"` // 订单ID(可选) + ProcessStatus *int64 `form:"process_status,optional"` // 处理状态(可选) } type AdminGetAgentOrderListResp struct { @@ -98,7 +100,7 @@ type AdminGetAgentOrderListResp struct { type AdminGetAgentProductConfigListReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 - ProductId *int64 `form:"product_id,optional"` // 产品ID(可选) + ProductId *string `form:"product_id,optional"` // 产品ID(可选) ProductName *string `form:"product_name,optional"` // 产品名称(可选,用于搜索) } @@ -108,10 +110,10 @@ type AdminGetAgentProductConfigListResp struct { } type AdminGetAgentRealNameListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - Status *int64 `form:"status,optional"` // 状态(可选):1=未验证,2=已通过 + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + Status *int64 `form:"status,optional"` // 状态(可选):1=未验证,2=已通过 } type AdminGetAgentRealNameListResp struct { @@ -120,11 +122,11 @@ type AdminGetAgentRealNameListResp struct { } type AdminGetAgentRebateListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - SourceAgentId *int64 `form:"source_agent_id,optional"` // 来源代理ID(可选) - RebateType *int64 `form:"rebate_type,optional"` // 返佣类型(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + SourceAgentId *string `form:"source_agent_id,optional"` // 来源代理ID(可选) + RebateType *int64 `form:"rebate_type,optional"` // 返佣类型(可选) } type AdminGetAgentRebateListResp struct { @@ -133,11 +135,11 @@ type AdminGetAgentRebateListResp struct { } type AdminGetAgentUpgradeListReq struct { - Page int64 `form:"page"` // 页码 - PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) - UpgradeType *int64 `form:"upgrade_type,optional"` // 升级类型(可选) - Status *int64 `form:"status,optional"` // 状态(可选) + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"pageSize"` // 每页数量 + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) + UpgradeType *int64 `form:"upgrade_type,optional"` // 升级类型(可选) + Status *int64 `form:"status,optional"` // 状态(可选) } type AdminGetAgentUpgradeListResp struct { @@ -148,7 +150,7 @@ type AdminGetAgentUpgradeListResp struct { type AdminGetAgentWithdrawalListReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 - AgentId *int64 `form:"agent_id,optional"` // 代理ID(可选) + AgentId *string `form:"agent_id,optional"` // 代理ID(可选) Status *int64 `form:"status,optional"` // 状态(可选) WithdrawNo *string `form:"withdraw_no,optional"` // 提现单号(可选) } @@ -162,7 +164,7 @@ type AdminGetInviteCodeListReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"pageSize"` // 每页数量 Code *string `form:"code,optional"` // 邀请码(可选) - AgentId *int64 `form:"agent_id,optional"` // 发放代理ID(可选,NULL表示平台发放) + AgentId *string `form:"agent_id,optional"` // 发放代理ID(可选,NULL表示平台发放) TargetLevel *int64 `form:"target_level,optional"` // 目标等级(可选) Status *int64 `form:"status,optional"` // 状态(可选) } @@ -173,14 +175,16 @@ type AdminGetInviteCodeListResp struct { } type AdminUpdateAgentConfigReq struct { - LevelBonus *LevelBonusConfig `json:"level_bonus,optional"` // 等级加成配置 - UpgradeFee *UpgradeFeeConfig `json:"upgrade_fee,optional"` // 升级费用配置 - UpgradeRebate *UpgradeRebateConfig `json:"upgrade_rebate,optional"` // 升级返佣配置 - DirectParentRebate *DirectParentRebateConfig `json:"direct_parent_rebate,optional"` // 直接上级返佣配置 - MaxGoldRebateAmount *float64 `json:"max_gold_rebate_amount,optional"` // 黄金代理最大返佣金额 - CommissionFreeze *CommissionFreezeConfig `json:"commission_freeze,optional"` // 佣金冻结配置 - TaxRate *float64 `json:"tax_rate,optional"` // 税率 - TaxExemptionAmount *float64 `json:"tax_exemption_amount,optional"` // 免税额度 + LevelBonus *LevelBonusConfig `json:"level_bonus,optional"` // 等级加成配置 + UpgradeFee *UpgradeFeeConfig `json:"upgrade_fee,optional"` // 升级费用配置 + UpgradeRebate *UpgradeRebateConfig `json:"upgrade_rebate,optional"` // 升级返佣配置 + DirectParentRebate *DirectParentRebateConfig `json:"direct_parent_rebate,optional"` // 直接上级返佣配置 + MaxGoldRebateAmount *float64 `json:"max_gold_rebate_amount,optional"` // 黄金代理最大返佣金额 + CommissionFreeze *CommissionFreezeConfig `json:"commission_freeze,optional"` // 佣金冻结配置 + TaxRate *float64 `json:"tax_rate,optional"` // 税率 + TaxExemptionAmount *float64 `json:"tax_exemption_amount,optional"` // 免税额度 + GoldMaxUpliftAmount *float64 `json:"gold_max_uplift_amount,optional"` + DiamondMaxUpliftAmount *float64 `json:"diamond_max_uplift_amount,optional"` } type AdminUpdateAgentConfigResp struct { @@ -188,7 +192,7 @@ type AdminUpdateAgentConfigResp struct { } type AdminUpdateAgentProductConfigReq struct { - Id int64 `json:"id"` // 主键 + Id string `json:"id"` // 主键 BasePrice float64 `json:"base_price"` // 基础底价 PriceRangeMax float64 `json:"price_range_max"` // 最高定价(对应数据库 system_max_price) PriceThreshold *float64 `json:"price_threshold,optional"` // 提价标准阈值(可选) diff --git a/app/main/api/internal/types/adminapi.go b/app/main/api/internal/types/adminapi.go index 3a7cd8e..ab72640 100644 --- a/app/main/api/internal/types/adminapi.go +++ b/app/main/api/internal/types/adminapi.go @@ -2,8 +2,8 @@ package types type AdminBatchUpdateApiStatusReq struct { - Ids []int64 `json:"ids"` - Status int64 `json:"status"` + Ids []string `json:"ids"` + Status int64 `json:"status"` } type AdminBatchUpdateApiStatusResp struct { @@ -20,11 +20,11 @@ type AdminCreateApiReq struct { } type AdminCreateApiResp struct { - Id int64 `json:"id"` + Id string `json:"id"` } type AdminDeleteApiReq struct { - Id int64 `path:"id"` + Id string `path:"id"` } type AdminDeleteApiResp struct { @@ -32,7 +32,7 @@ type AdminDeleteApiResp struct { } type AdminGetApiDetailReq struct { - Id int64 `path:"id"` + Id string `path:"id"` } type AdminGetApiDetailResp struct { @@ -53,7 +53,7 @@ type AdminGetApiListResp struct { } type AdminUpdateApiReq struct { - Id int64 `path:"id"` + Id string `path:"id"` ApiName string `json:"api_name"` ApiCode string `json:"api_code"` Method string `json:"method"` diff --git a/app/main/api/internal/types/adminfeature.go b/app/main/api/internal/types/adminfeature.go index 76a0bb8..7b479e8 100644 --- a/app/main/api/internal/types/adminfeature.go +++ b/app/main/api/internal/types/adminfeature.go @@ -2,7 +2,7 @@ package types type AdminConfigFeatureExampleReq struct { - FeatureId int64 `json:"feature_id"` // 功能ID + FeatureId string `json:"feature_id"` // 功能ID Data string `json:"data"` // 示例数据JSON } @@ -16,11 +16,11 @@ type AdminCreateFeatureReq struct { } type AdminCreateFeatureResp struct { - Id int64 `json:"id"` // 功能ID + Id string `json:"id"` // 功能ID } type AdminDeleteFeatureReq struct { - Id int64 `path:"id"` // 功能ID + Id string `path:"id"` // 功能ID } type AdminDeleteFeatureResp struct { @@ -28,11 +28,11 @@ type AdminDeleteFeatureResp struct { } type AdminGetFeatureDetailReq struct { - Id int64 `path:"id"` // 功能ID + Id string `path:"id"` // 功能ID } type AdminGetFeatureDetailResp struct { - Id int64 `json:"id"` // 功能ID + Id string `json:"id"` // 功能ID ApiId string `json:"api_id"` // API标识 Name string `json:"name"` // 描述 CreateTime string `json:"create_time"` // 创建时间 @@ -40,12 +40,12 @@ type AdminGetFeatureDetailResp struct { } type AdminGetFeatureExampleReq struct { - FeatureId int64 `path:"feature_id"` // 功能ID + FeatureId string `path:"feature_id"` // 功能ID } type AdminGetFeatureExampleResp struct { - Id int64 `json:"id"` // 示例数据ID - FeatureId int64 `json:"feature_id"` // 功能ID + Id string `json:"id"` // 示例数据ID + FeatureId string `json:"feature_id"` // 功能ID ApiId string `json:"api_id"` // API标识 Data string `json:"data"` // 示例数据JSON CreateTime string `json:"create_time"` // 创建时间 @@ -65,7 +65,7 @@ type AdminGetFeatureListResp struct { } type AdminUpdateFeatureReq struct { - Id int64 `path:"id"` // 功能ID + Id string `path:"id"` // 功能ID ApiId *string `json:"api_id,optional"` // API标识 Name *string `json:"name,optional"` // 描述 } diff --git a/app/main/api/internal/types/adminmenu.go b/app/main/api/internal/types/adminmenu.go index a0e8e70..90597ff 100644 --- a/app/main/api/internal/types/adminmenu.go +++ b/app/main/api/internal/types/adminmenu.go @@ -2,7 +2,7 @@ package types type CreateMenuReq struct { - Pid int64 `json:"pid,optional"` // 父菜单ID + Pid string `json:"pid,optional"` // 父菜单ID Name string `json:"name"` // 路由名称 Path string `json:"path,optional"` // 路由路径 Component string `json:"component,optional"` // 组件路径 @@ -14,11 +14,11 @@ type CreateMenuReq struct { } type CreateMenuResp struct { - Id int64 `json:"id"` // 菜单ID + Id string `json:"id"` // 菜单ID } type DeleteMenuReq struct { - Id int64 `path:"id"` // 菜单ID + Id string `path:"id"` // 菜单ID } type DeleteMenuResp struct { @@ -39,12 +39,12 @@ type GetMenuAllResp struct { } type GetMenuDetailReq struct { - Id int64 `path:"id"` // 菜单ID + Id string `path:"id"` // 菜单ID } type GetMenuDetailResp struct { - Id int64 `json:"id"` // 菜单ID - Pid int64 `json:"pid"` // 父菜单ID + Id string `json:"id"` // 菜单ID + Pid string `json:"pid"` // 父菜单ID Name string `json:"name"` // 路由名称 Path string `json:"path"` // 路由路径 Component string `json:"component"` // 组件路径 @@ -65,8 +65,8 @@ type GetMenuListReq struct { } type MenuListItem struct { - Id int64 `json:"id"` // 菜单ID - Pid int64 `json:"pid"` // 父菜单ID + Id string `json:"id"` // 菜单ID + Pid string `json:"pid"` // 父菜单ID Name string `json:"name"` // 路由名称 Path string `json:"path"` // 路由路径 Component string `json:"component"` // 组件路径 @@ -80,8 +80,8 @@ type MenuListItem struct { } type UpdateMenuReq struct { - Id int64 `path:"id"` // 菜单ID - Pid int64 `json:"pid,optional"` // 父菜单ID + Id string `path:"id"` // 菜单ID + Pid *string `json:"pid,optional"` // 父菜单ID Name string `json:"name"` // 路由名称 Path string `json:"path,optional"` // 路由路径 Component string `json:"component,optional"` // 组件路径 diff --git a/app/main/api/internal/types/adminnotification.go b/app/main/api/internal/types/adminnotification.go index 4a72c91..c00cfa4 100644 --- a/app/main/api/internal/types/adminnotification.go +++ b/app/main/api/internal/types/adminnotification.go @@ -13,11 +13,11 @@ type AdminCreateNotificationReq struct { } type AdminCreateNotificationResp struct { - Id int64 `json:"id"` // 通知ID + Id string `json:"id"` // 通知ID } type AdminDeleteNotificationReq struct { - Id int64 `path:"id"` // 通知ID + Id string `path:"id"` // 通知ID } type AdminDeleteNotificationResp struct { @@ -25,11 +25,11 @@ type AdminDeleteNotificationResp struct { } type AdminGetNotificationDetailReq struct { - Id int64 `path:"id"` // 通知ID + Id string `path:"id"` // 通知ID } type AdminGetNotificationDetailResp struct { - Id int64 `json:"id"` // 通知ID + Id string `json:"id"` // 通知ID Title string `json:"title"` // 通知标题 Content string `json:"content"` // 通知内容 NotificationPage string `json:"notification_page"` // 通知页面 @@ -58,7 +58,7 @@ type AdminGetNotificationListResp struct { } type AdminUpdateNotificationReq struct { - Id int64 `path:"id"` // 通知ID + Id string `path:"id"` // 通知ID Title *string `json:"title,optional"` // 通知标题 Content *string `json:"content,optional"` // 通知内容 NotificationPage *string `json:"notification_page,optional"` // 通知页面 diff --git a/app/main/api/internal/types/adminorder.go b/app/main/api/internal/types/adminorder.go index 5eea448..3597af1 100644 --- a/app/main/api/internal/types/adminorder.go +++ b/app/main/api/internal/types/adminorder.go @@ -12,11 +12,11 @@ type AdminCreateOrderReq struct { } type AdminCreateOrderResp struct { - Id int64 `json:"id"` // 订单ID + Id string `json:"id"` // 订单ID } type AdminDeleteOrderReq struct { - Id int64 `path:"id"` // 订单ID + Id string `path:"id"` // 订单ID } type AdminDeleteOrderResp struct { @@ -24,11 +24,11 @@ type AdminDeleteOrderResp struct { } type AdminGetOrderDetailReq struct { - Id int64 `path:"id"` // 订单ID + Id string `path:"id"` // 订单ID } type AdminGetOrderDetailResp struct { - Id int64 `json:"id"` // 订单ID + Id string `json:"id"` // 订单ID OrderNo string `json:"order_no"` // 商户订单号 PlatformOrderId string `json:"platform_order_id"` // 支付订单号 ProductName string `json:"product_name"` // 产品名称 @@ -69,7 +69,7 @@ type AdminGetOrderListResp struct { } type AdminRefundOrderReq struct { - Id int64 `path:"id"` // 订单ID + Id string `path:"id"` // 订单ID RefundAmount float64 `json:"refund_amount"` // 退款金额 RefundReason string `json:"refund_reason"` // 退款原因 } @@ -81,7 +81,7 @@ type AdminRefundOrderResp struct { } type AdminRetryAgentProcessReq struct { - Id int64 `path:"id"` // 订单ID + Id string `path:"id"` // 订单ID } type AdminRetryAgentProcessResp struct { @@ -91,7 +91,7 @@ type AdminRetryAgentProcessResp struct { } type AdminUpdateOrderReq struct { - Id int64 `path:"id"` // 订单ID + Id string `path:"id"` // 订单ID OrderNo *string `json:"order_no,optional"` // 商户订单号 PlatformOrderId *string `json:"platform_order_id,optional"` // 支付订单号 ProductName *string `json:"product_name,optional"` // 产品名称 diff --git a/app/main/api/internal/types/adminplatformuser.go b/app/main/api/internal/types/adminplatformuser.go index 4781e36..b94897a 100644 --- a/app/main/api/internal/types/adminplatformuser.go +++ b/app/main/api/internal/types/adminplatformuser.go @@ -10,11 +10,11 @@ type AdminCreatePlatformUserReq struct { } type AdminCreatePlatformUserResp struct { - Id int64 `json:"id"` // 用户ID + Id string `json:"id"` // 用户ID } type AdminDeletePlatformUserReq struct { - Id int64 `path:"id"` // 用户ID + Id string `path:"id"` // 用户ID } type AdminDeletePlatformUserResp struct { @@ -22,11 +22,11 @@ type AdminDeletePlatformUserResp struct { } type AdminGetPlatformUserDetailReq struct { - Id int64 `path:"id"` // 用户ID + Id string `path:"id"` // 用户ID } type AdminGetPlatformUserDetailResp struct { - Id int64 `json:"id"` // 用户ID + Id string `json:"id"` // 用户ID Mobile string `json:"mobile"` // 手机号 Nickname string `json:"nickname"` // 昵称 Info string `json:"info"` // 备注信息 @@ -53,7 +53,7 @@ type AdminGetPlatformUserListResp struct { } type AdminUpdatePlatformUserReq struct { - Id int64 `path:"id"` // 用户ID + Id string `path:"id"` // 用户ID Mobile *string `json:"mobile,optional"` // 手机号 Password *string `json:"password,optional"` // 密码 Nickname *string `json:"nickname,optional"` // 昵称 diff --git a/app/main/api/internal/types/adminproduct.go b/app/main/api/internal/types/adminproduct.go index 5bda1a0..9ccb519 100644 --- a/app/main/api/internal/types/adminproduct.go +++ b/app/main/api/internal/types/adminproduct.go @@ -11,11 +11,11 @@ type AdminCreateProductReq struct { } type AdminCreateProductResp struct { - Id int64 `json:"id"` // 产品ID + Id string `json:"id"` // 产品ID } type AdminDeleteProductReq struct { - Id int64 `path:"id"` // 产品ID + Id string `path:"id"` // 产品ID } type AdminDeleteProductResp struct { @@ -23,11 +23,11 @@ type AdminDeleteProductResp struct { } type AdminGetProductDetailReq struct { - Id int64 `path:"id"` // 产品ID + Id string `path:"id"` // 产品ID } type AdminGetProductDetailResp struct { - Id int64 `json:"id"` // 产品ID + Id string `json:"id"` // 产品ID ProductName string `json:"product_name"` // 服务名 ProductEn string `json:"product_en"` // 英文名 Description string `json:"description"` // 描述 @@ -39,13 +39,13 @@ type AdminGetProductDetailResp struct { } type AdminGetProductFeatureListReq struct { - ProductId int64 `path:"product_id"` // 产品ID + ProductId string `path:"product_id"` // 产品ID } type AdminGetProductFeatureListResp struct { - Id int64 `json:"id"` // 关联ID - ProductId int64 `json:"product_id"` // 产品ID - FeatureId int64 `json:"feature_id"` // 功能ID + Id string `json:"id"` // 关联ID + ProductId string `json:"product_id"` // 产品ID + FeatureId string `json:"feature_id"` // 功能ID ApiId string `json:"api_id"` // API标识 Name string `json:"name"` // 功能描述 Sort int64 `json:"sort"` // 排序 @@ -68,7 +68,7 @@ type AdminGetProductListResp struct { } type AdminUpdateProductFeaturesReq struct { - ProductId int64 `path:"product_id"` // 产品ID + ProductId string `path:"product_id"` // 产品ID Features []ProductFeatureItem `json:"features"` // 功能列表 } @@ -77,7 +77,7 @@ type AdminUpdateProductFeaturesResp struct { } type AdminUpdateProductReq struct { - Id int64 `path:"id"` // 产品ID + Id string `path:"id"` // 产品ID ProductName *string `json:"product_name,optional"` // 服务名 ProductEn *string `json:"product_en,optional"` // 英文名 Description *string `json:"description,optional"` // 描述 diff --git a/app/main/api/internal/types/adminquery.go b/app/main/api/internal/types/adminquery.go index 001ab69..d110276 100644 --- a/app/main/api/internal/types/adminquery.go +++ b/app/main/api/internal/types/adminquery.go @@ -10,9 +10,9 @@ type AdminGetQueryCleanupConfigListResp struct { } type AdminGetQueryCleanupDetailListReq struct { - LogId int64 `path:"log_id"` // 清理日志ID - Page int64 `form:"page,default=1"` // 页码 - PageSize int64 `form:"page_size,default=20"` // 每页数量 + LogId string `path:"log_id"` // 清理日志ID + Page int64 `form:"page,default=1"` // 页码 + PageSize int64 `form:"page_size,default=20"` // 每页数量 } type AdminGetQueryCleanupDetailListResp struct { @@ -34,13 +34,13 @@ type AdminGetQueryCleanupLogListResp struct { } type AdminGetQueryDetailByOrderIdReq struct { - OrderId int64 `path:"order_id"` + OrderId string `path:"order_id"` } type AdminGetQueryDetailByOrderIdResp struct { - Id int64 `json:"id"` // 主键ID - OrderId int64 `json:"order_id"` // 订单ID - UserId int64 `json:"user_id"` // 用户ID + Id string `json:"id"` // 主键ID + OrderId string `json:"order_id"` // 订单ID + UserId string `json:"user_id"` // 用户ID ProductName string `json:"product_name"` // 产品ID QueryParams map[string]interface{} `json:"query_params"` QueryData []AdminQueryItem `json:"query_data"` @@ -50,7 +50,7 @@ type AdminGetQueryDetailByOrderIdResp struct { } type AdminUpdateQueryCleanupConfigReq struct { - Id int64 `json:"id"` // 主键ID + Id string `json:"id"` // 主键ID ConfigValue string `json:"config_value"` // 配置值 Status int64 `json:"status"` // 状态:1-启用,0-禁用 } diff --git a/app/main/api/internal/types/adminrole.go b/app/main/api/internal/types/adminrole.go index 083c59c..202d50f 100644 --- a/app/main/api/internal/types/adminrole.go +++ b/app/main/api/internal/types/adminrole.go @@ -2,20 +2,20 @@ package types 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列表 + 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 []string `json:"menu_ids"` // 关联的菜单ID列表 } type CreateRoleResp struct { - Id int64 `json:"id"` // 角色ID + Id string `json:"id"` // 角色ID } type DeleteRoleReq struct { - Id int64 `path:"id"` // 角色ID + Id string `path:"id"` // 角色ID } type DeleteRoleResp struct { @@ -23,19 +23,19 @@ type DeleteRoleResp struct { } type GetRoleDetailReq struct { - Id int64 `path:"id"` // 角色ID + Id string `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列表 + Id string `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 []string `json:"menu_ids"` // 关联的菜单ID列表 } type GetRoleListReq struct { @@ -52,13 +52,13 @@ type GetRoleListResp struct { } 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列表 + Id string `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 []string `json:"menu_ids,optional"` // 关联的菜单ID列表 } type UpdateRoleResp struct { diff --git a/app/main/api/internal/types/adminroleapi.go b/app/main/api/internal/types/adminroleapi.go index ed17fa4..32030da 100644 --- a/app/main/api/internal/types/adminroleapi.go +++ b/app/main/api/internal/types/adminroleapi.go @@ -2,8 +2,8 @@ package types type AdminAssignRoleApiReq struct { - RoleId int64 `json:"role_id"` - ApiIds []int64 `json:"api_ids"` + RoleId string `json:"role_id"` + ApiIds []string `json:"api_ids"` } type AdminAssignRoleApiResp struct { @@ -19,7 +19,7 @@ type AdminGetAllApiListResp struct { } type AdminGetRoleApiListReq struct { - RoleId int64 `path:"role_id"` + RoleId string `path:"role_id"` } type AdminGetRoleApiListResp struct { @@ -27,8 +27,8 @@ type AdminGetRoleApiListResp struct { } type AdminRemoveRoleApiReq struct { - RoleId int64 `json:"role_id"` - ApiIds []int64 `json:"api_ids"` + RoleId string `json:"role_id"` + ApiIds []string `json:"api_ids"` } type AdminRemoveRoleApiResp struct { @@ -36,8 +36,8 @@ type AdminRemoveRoleApiResp struct { } type AdminUpdateRoleApiReq struct { - RoleId int64 `json:"role_id"` - ApiIds []int64 `json:"api_ids"` + RoleId string `json:"role_id"` + ApiIds []string `json:"api_ids"` } type AdminUpdateRoleApiResp struct { diff --git a/app/main/api/internal/types/adminuser.go b/app/main/api/internal/types/adminuser.go index a908698..e06158a 100644 --- a/app/main/api/internal/types/adminuser.go +++ b/app/main/api/internal/types/adminuser.go @@ -2,18 +2,18 @@ package types 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列表 + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status,default=1"` // 状态:0-禁用,1-启用 + RoleIds []string `json:"role_ids"` // 关联的角色ID列表 } type AdminCreateUserResp struct { - Id int64 `json:"id"` // 用户ID + Id string `json:"id"` // 用户ID } type AdminDeleteUserReq struct { - Id int64 `path:"id"` // 用户ID + Id string `path:"id"` // 用户ID } type AdminDeleteUserResp struct { @@ -21,17 +21,17 @@ type AdminDeleteUserResp struct { } type AdminGetUserDetailReq struct { - Id int64 `path:"id"` // 用户ID + Id string `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列表 + Id string `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 []string `json:"role_ids"` // 关联的角色ID列表 } type AdminGetUserListReq struct { @@ -48,7 +48,7 @@ type AdminGetUserListResp struct { } type AdminResetPasswordReq struct { - Id int64 `path:"id"` // 用户ID + Id string `path:"id"` // 用户ID Password string `json:"password"` // 新密码 } @@ -57,11 +57,11 @@ type AdminResetPasswordResp struct { } 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列表 + Id string `path:"id"` // 用户ID + Username *string `json:"username,optional"` // 用户名 + RealName *string `json:"real_name,optional"` // 真实姓名 + Status *int64 `json:"status,optional"` // 状态:0-禁用,1-启用 + RoleIds []string `json:"role_ids,optional"` // 关联的角色ID列表 } type AdminUpdateUserResp struct { diff --git a/app/main/api/internal/types/agent.go b/app/main/api/internal/types/agent.go index aea1d59..3e72729 100644 --- a/app/main/api/internal/types/agent.go +++ b/app/main/api/internal/types/agent.go @@ -2,20 +2,23 @@ package types type AgentApplyReq struct { - Region string `json:"region,optional"` // 区域(可选) - Mobile string `json:"mobile"` // 手机号 - Code string `json:"code"` // 验证码 - InviteCode string `json:"invite_code"` // 邀请码(必填,只能通过邀请码成为代理) + Region string `json:"region,optional"` + Mobile string `json:"mobile"` + Code string `json:"code"` + Referrer string `json:"referrer"` + InviteCode string `json:"invite_code,optional"` + AgentCode int64 `json:"agent_code,optional"` } type AgentApplyResp struct { AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` RefreshAfter int64 `json:"refreshAfter"` + AgentCode int64 `json:"agent_code"` } type AgentGeneratingLinkReq struct { - ProductId int64 `json:"product_id"` // 产品ID + ProductId string `json:"product_id"` // 产品ID SetPrice float64 `json:"set_price"` // 设定价格 TargetPath string `json:"target_path,optional"` // 目标地址(可选,默认为推广报告页面) } @@ -26,14 +29,15 @@ type AgentGeneratingLinkResp struct { } type AgentInfoResp struct { - AgentId int64 `json:"agent_id"` // 代理ID - Level int64 `json:"level"` // 代理等级:1=普通,2=黄金,3=钻石 - LevelName string `json:"level_name"` // 等级名称 - Region string `json:"region"` // 区域(可选) - Mobile string `json:"mobile"` // 手机号 - WechatId string `json:"wechat_id"` // 微信号(可选) - TeamLeaderId int64 `json:"team_leader_id"` // 团队首领ID - IsRealName bool `json:"is_real_name"` // 是否已实名 + AgentId string `json:"agent_id"` + Level int64 `json:"level"` + LevelName string `json:"level_name"` + Region string `json:"region"` + Mobile string `json:"mobile"` + WechatId string `json:"wechat_id"` + TeamLeaderId string `json:"team_leader_id"` + IsRealName bool `json:"is_real_name"` + AgentCode int64 `json:"agent_code"` } type AgentProductConfigResp struct { @@ -45,7 +49,7 @@ type ApplyUpgradeReq struct { } type ApplyUpgradeResp struct { - UpgradeId int64 `json:"upgrade_id"` // 升级记录ID + UpgradeId string `json:"upgrade_id"` // 升级记录ID OrderNo string `json:"order_no"` // 支付订单号 } @@ -56,7 +60,7 @@ type ApplyWithdrawalReq struct { } type ApplyWithdrawalResp struct { - WithdrawalId int64 `json:"withdrawal_id"` // 提现记录ID + WithdrawalId string `json:"withdrawal_id"` // 提现记录ID WithdrawalNo string `json:"withdrawal_no"` // 提现单号 } @@ -66,7 +70,7 @@ type ConversionRateResp struct { } type DeleteInviteCodeReq struct { - Id int64 `json:"id"` // 邀请码ID + Id string `json:"id"` // 邀请码ID } type DeleteInviteCodeResp struct { @@ -113,7 +117,11 @@ type GetInviteLinkResp struct { } type GetLevelPrivilegeResp struct { - Levels []LevelPrivilegeItem `json:"levels"` // 各等级特权信息列表 + Levels []LevelPrivilegeItem `json:"levels"` + UpgradeToGoldFee float64 `json:"upgrade_to_gold_fee"` + UpgradeToDiamondFee float64 `json:"upgrade_to_diamond_fee"` + UpgradeToGoldRebate float64 `json:"upgrade_to_gold_rebate"` + UpgradeToDiamondRebate float64 `json:"upgrade_to_diamond_rebate"` } type GetLinkDataReq struct { @@ -121,8 +129,8 @@ type GetLinkDataReq struct { } type GetLinkDataResp struct { - AgentId int64 `json:"agent_id"` // 代理ID - ProductId int64 `json:"product_id"` // 产品ID + AgentId string `json:"agent_id"` // 代理ID + ProductId string `json:"product_id"` // 产品ID SetPrice float64 `json:"set_price"` // 代理设定价格 ActualBasePrice float64 `json:"actual_base_price"` // 实际底价 ProductName string `json:"product_name"` // 产品名称 @@ -132,6 +140,16 @@ type GetLinkDataResp struct { Features []Feature `json:"features"` // 产品功能列表 } +type GetPromotionQueryListReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数量 +} + +type GetPromotionQueryListResp struct { + Total int64 `json:"total"` // 总数 + List []PromotionQueryItem `json:"list"` // 列表 +} + type GetRebateListReq struct { Page int64 `form:"page"` // 页码 PageSize int64 `form:"page_size"` // 每页数量 @@ -157,7 +175,7 @@ type GetRevenueInfoResp struct { } type GetSubordinateContributionDetailReq struct { - SubordinateId int64 `form:"subordinate_id"` // 下级代理ID + SubordinateId string `form:"subordinate_id"` // 下级代理ID Page int64 `form:"page"` // 页码 PageSize int64 `form:"page_size"` // 每页数量 TabType string `form:"tab_type,optional"` // 标签页类型:order=订单列表,invite=邀请列表 @@ -240,20 +258,23 @@ type RealNameAuthResp struct { } type RegisterByInviteCodeReq struct { - InviteCode string `json:"invite_code"` // 邀请码 - Mobile string `json:"mobile"` // 手机号 - Code string `json:"code"` // 验证码 - Region string `json:"region,optional"` // 区域(可选) - WechatId string `json:"wechat_id,optional"` // 微信号(可选) + Referrer string `json:"referrer"` + InviteCode string `json:"invite_code,optional"` + AgentCode int64 `json:"agent_code,optional"` + Mobile string `json:"mobile"` + Code string `json:"code"` + Region string `json:"region,optional"` + WechatId string `json:"wechat_id,optional"` } type RegisterByInviteCodeResp struct { AccessToken string `json:"accessToken"` AccessExpire int64 `json:"accessExpire"` RefreshAfter int64 `json:"refreshAfter"` - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 代理等级 LevelName string `json:"level_name"` // 等级名称 + AgentCode int64 `json:"agent_code"` } type ShortLinkRedirectResp struct { @@ -270,8 +291,8 @@ type TeamStatisticsResp struct { } type UpgradeSubordinateReq struct { - SubordinateId int64 `json:"subordinate_id"` // 下级代理ID - ToLevel int64 `json:"to_level"` // 目标等级(只能是2=黄金) + SubordinateId string `json:"subordinate_id"` // 下级代理ID + ToLevel int64 `json:"to_level"` // 目标等级(只能是2=黄金) } type UpgradeSubordinateResp struct { diff --git a/app/main/api/internal/types/app.go b/app/main/api/internal/types/app.go index afb7f20..ae36846 100644 --- a/app/main/api/internal/types/app.go +++ b/app/main/api/internal/types/app.go @@ -1,6 +1,10 @@ // Code generated by goctl. DO NOT EDIT. package types +type GetAppConfigResp struct { + QueryRetentionDays int64 `json:"query_retention_days"` +} + type HealthCheckResp struct { Status string `json:"status"` // 服务状态 Message string `json:"message"` // 状态信息 diff --git a/app/main/api/internal/types/authorization.go b/app/main/api/internal/types/authorization.go index 7030697..fd60ff7 100644 --- a/app/main/api/internal/types/authorization.go +++ b/app/main/api/internal/types/authorization.go @@ -2,7 +2,7 @@ package types type DownloadAuthorizationDocumentReq struct { - DocumentId int64 `json:"documentId" validate:"required"` // 授权书ID + DocumentId string `json:"documentId" validate:"required"` // 授权书ID } type DownloadAuthorizationDocumentResp struct { @@ -11,7 +11,7 @@ type DownloadAuthorizationDocumentResp struct { } type GetAuthorizationDocumentByOrderReq struct { - OrderId int64 `json:"orderId" validate:"required"` // 订单ID + OrderId string `json:"orderId" validate:"required"` // 订单ID } type GetAuthorizationDocumentByOrderResp struct { @@ -19,14 +19,14 @@ type GetAuthorizationDocumentByOrderResp struct { } type GetAuthorizationDocumentReq struct { - DocumentId int64 `json:"documentId" validate:"required"` // 授权书ID + DocumentId string `json:"documentId" validate:"required"` // 授权书ID } type GetAuthorizationDocumentResp struct { - DocumentId int64 `json:"documentId"` // 授权书ID - UserId int64 `json:"userId"` // 用户ID - OrderId int64 `json:"orderId"` // 订单ID - QueryId int64 `json:"queryId"` // 查询ID + DocumentId string `json:"documentId"` // 授权书ID + UserId string `json:"userId"` // 用户ID + OrderId string `json:"orderId"` // 订单ID + QueryId string `json:"queryId"` // 查询ID FileName string `json:"fileName"` // 文件名 FileUrl string `json:"fileUrl"` // 文件访问URL FileSize int64 `json:"fileSize"` // 文件大小 diff --git a/app/main/api/internal/types/encrypPayload.go b/app/main/api/internal/types/encrypPayload.go index 3c6e385..4c61dad 100644 --- a/app/main/api/internal/types/encrypPayload.go +++ b/app/main/api/internal/types/encrypPayload.go @@ -1,6 +1,6 @@ package types type QueryShareLinkPayload struct { - OrderId int64 `json:"order_id"` - ExpireAt int64 `json:"expire_at"` + OrderId string `json:"order_id"` + ExpireAt int64 `json:"expire_at"` } diff --git a/app/main/api/internal/types/pay.go b/app/main/api/internal/types/pay.go index 0811a6d..5e672a1 100644 --- a/app/main/api/internal/types/pay.go +++ b/app/main/api/internal/types/pay.go @@ -2,7 +2,7 @@ package types type IapCallbackReq struct { - OrderID int64 `json:"order_id" validate:"required"` + OrderID string `json:"order_id" validate:"required"` TransactionReceipt string `json:"transaction_receipt" validate:"required"` } diff --git a/app/main/api/internal/types/payload.go b/app/main/api/internal/types/payload.go index f638db8..7bdbe3f 100644 --- a/app/main/api/internal/types/payload.go +++ b/app/main/api/internal/types/payload.go @@ -1,13 +1,13 @@ package types type MsgPaySuccessQueryPayload struct { - OrderID int64 `json:"order_id"` + OrderID string `json:"order_id"` } type MsgAgentProcessPayload struct { - OrderID int64 `json:"order_id"` + OrderID string `json:"order_id"` } type MsgUnfreezeCommissionPayload struct { - FreezeTaskId int64 `json:"freeze_task_id"` // 冻结任务ID -} \ No newline at end of file + FreezeTaskId string `json:"freeze_task_id"` // 冻结任务ID +} diff --git a/app/main/api/internal/types/product.go b/app/main/api/internal/types/product.go index 0787aa2..f5e6c9a 100644 --- a/app/main/api/internal/types/product.go +++ b/app/main/api/internal/types/product.go @@ -6,7 +6,7 @@ type GetProductByEnRequest struct { } type GetProductByIDRequest struct { - Id int64 `path:"id"` + Id string `path:"id"` } type ProductResponse struct { diff --git a/app/main/api/internal/types/query.go b/app/main/api/internal/types/query.go index 525fe3d..012e8ad 100644 --- a/app/main/api/internal/types/query.go +++ b/app/main/api/internal/types/query.go @@ -2,7 +2,7 @@ package types type QueryDetailByOrderIdReq struct { - OrderId int64 `path:"order_id"` + OrderId string `path:"order_id"` } type QueryDetailByOrderNoReq struct { @@ -14,7 +14,7 @@ type QueryExampleReq struct { } type QueryGenerateShareLinkReq struct { - OrderId *int64 `json:"order_id,optional"` + OrderId *string `json:"order_id,optional"` OrderNo *string `json:"order_no,optional"` } @@ -44,7 +44,7 @@ type QueryProvisionalOrderResp struct { } type QueryRetryReq struct { - Id int64 `path:"id"` + Id string `path:"id"` } type QueryRetryResp struct { @@ -80,11 +80,11 @@ type QuerySingleTestResp struct { } type UpdateQueryDataReq struct { - Id int64 `json:"id"` // 查询ID + Id string `json:"id"` // 查询ID QueryData string `json:"query_data"` // 查询数据(未加密的JSON) } type UpdateQueryDataResp struct { - Id int64 `json:"id"` + Id string `json:"id"` UpdatedAt string `json:"updated_at"` // 更新时间 } diff --git a/app/main/api/internal/types/queryMap.go b/app/main/api/internal/types/queryMap.go index 15c3365..775fc16 100644 --- a/app/main/api/internal/types/queryMap.go +++ b/app/main/api/internal/types/queryMap.go @@ -120,8 +120,8 @@ type AgentQueryData struct { Code string `json:"code"` } type AgentIdentifier struct { - AgentID int64 `json:"agent_id"` // 代理ID - ProductID int64 `json:"product_id"` // 产品ID + AgentID string `json:"agent_id"` // 代理ID + ProductID string `json:"product_id"` // 产品ID SetPrice float64 `json:"set_price"` // 代理设定价格 } diff --git a/app/main/api/internal/types/types.go b/app/main/api/internal/types/types.go index cf2c014..d8c406d 100644 --- a/app/main/api/internal/types/types.go +++ b/app/main/api/internal/types/types.go @@ -2,7 +2,7 @@ package types type AdminApiInfo struct { - Id int64 `json:"id"` + Id string `json:"id"` ApiName string `json:"api_name"` ApiCode string `json:"api_code"` Method string `json:"method"` @@ -29,9 +29,9 @@ type AdminQueryItem struct { } type AdminRoleApiInfo struct { - Id int64 `json:"id"` - RoleId int64 `json:"role_id"` - ApiId int64 `json:"api_id"` + Id string `json:"id"` + RoleId string `json:"role_id"` + ApiId string `json:"api_id"` ApiName string `json:"api_name"` ApiCode string `json:"api_code"` Method string `json:"method"` @@ -41,18 +41,18 @@ type AdminRoleApiInfo struct { } 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列表 + Id string `json:"id"` // 用户ID + Username string `json:"username"` // 用户名 + RealName string `json:"real_name"` // 真实姓名 + Status int64 `json:"status"` // 状态:0-禁用,1-启用 + CreateTime string `json:"create_time"` // 创建时间 + RoleIds []string `json:"role_ids"` // 关联的角色ID列表 } type AgentCommissionListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - OrderId int64 `json:"order_id"` // 订单ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + OrderId string `json:"order_id"` // 订单ID ProductName string `json:"product_name"` // 产品名称 Amount float64 `json:"amount"` // 金额 Status int64 `json:"status"` // 状态 @@ -60,9 +60,9 @@ type AgentCommissionListItem struct { } type AgentLinkListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - ProductId int64 `json:"product_id"` // 产品ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 SetPrice float64 `json:"set_price"` // 设定价格 ActualBasePrice float64 `json:"actual_base_price"` // 实际底价 @@ -71,14 +71,15 @@ type AgentLinkListItem struct { } type AgentListItem struct { - Id int64 `json:"id"` // 主键 - UserId int64 `json:"user_id"` // 用户ID - Level int64 `json:"level"` // 等级:1=普通,2=黄金,3=钻石 - LevelName string `json:"level_name"` // 等级名称 - Region string `json:"region"` // 区域 - Mobile string `json:"mobile"` // 手机号 - WechatId string `json:"wechat_id"` // 微信号 - TeamLeaderId int64 `json:"team_leader_id"` // 团队首领ID + Id string `json:"id"` // 主键 + UserId string `json:"user_id"` // 用户ID + Level int64 `json:"level"` // 等级:1=普通,2=黄金,3=钻石 + LevelName string `json:"level_name"` // 等级名称 + Region string `json:"region"` // 区域 + Mobile string `json:"mobile"` // 手机号 + WechatId string `json:"wechat_id"` // 微信号 + TeamLeaderId string `json:"team_leader_id"` // 团队首领ID + AgentCode int64 `json:"agent_code"` Balance float64 `json:"balance"` // 钱包余额 TotalEarnings float64 `json:"total_earnings"` // 累计收益 FrozenBalance float64 `json:"frozen_balance"` // 冻结余额 @@ -88,10 +89,10 @@ type AgentListItem struct { } type AgentOrderListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID - OrderId int64 `json:"order_id"` // 订单ID - ProductId int64 `json:"product_id"` // 产品ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID + OrderId string `json:"order_id"` // 订单ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 OrderAmount float64 `json:"order_amount"` // 订单金额 SetPrice float64 `json:"set_price"` // 设定价格 @@ -103,8 +104,8 @@ type AgentOrderListItem struct { } type AgentProductConfigItem struct { - Id int64 `json:"id"` // 主键 - ProductId int64 `json:"product_id"` // 产品ID + Id string `json:"id"` // 主键 + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 BasePrice float64 `json:"base_price"` // 基础底价 PriceRangeMin float64 `json:"price_range_min"` // 最低定价 @@ -115,8 +116,8 @@ type AgentProductConfigItem struct { } type AgentRealNameListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID Name string `json:"name"` // 姓名 IdCard string `json:"id_card"` // 身份证号 Mobile string `json:"mobile"` // 手机号 @@ -126,18 +127,18 @@ type AgentRealNameListItem struct { } type AgentRebateListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 获得返佣的代理ID - SourceAgentId int64 `json:"source_agent_id"` // 来源代理ID - OrderId int64 `json:"order_id"` // 订单ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 获得返佣的代理ID + SourceAgentId string `json:"source_agent_id"` // 来源代理ID + OrderId string `json:"order_id"` // 订单ID RebateType int64 `json:"rebate_type"` // 返佣类型 Amount float64 `json:"amount"` // 金额 CreateTime string `json:"create_time"` // 创建时间 } type AgentUpgradeListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID FromLevel int64 `json:"from_level"` // 原等级 ToLevel int64 `json:"to_level"` // 目标等级 UpgradeType int64 `json:"upgrade_type"` // 升级类型 @@ -148,8 +149,8 @@ type AgentUpgradeListItem struct { } type AgentWithdrawalListItem struct { - Id int64 `json:"id"` // 主键 - AgentId int64 `json:"agent_id"` // 代理ID + Id string `json:"id"` // 主键 + AgentId string `json:"agent_id"` // 代理ID WithdrawNo string `json:"withdraw_no"` // 提现单号 Amount float64 `json:"amount"` // 金额 TaxAmount float64 `json:"tax_amount"` // 税费金额 @@ -162,10 +163,10 @@ type AgentWithdrawalListItem struct { } type AuthorizationDocumentInfo struct { - DocumentId int64 `json:"documentId"` // 授权书ID - UserId int64 `json:"userId"` // 用户ID - OrderId int64 `json:"orderId"` // 订单ID - QueryId int64 `json:"queryId"` // 查询ID + DocumentId string `json:"documentId"` // 授权书ID + UserId string `json:"userId"` // 用户ID + OrderId string `json:"orderId"` // 订单ID + QueryId string `json:"queryId"` // 查询ID FileName string `json:"fileName"` // 文件名 FileUrl string `json:"fileUrl"` // 文件访问URL FileSize int64 `json:"fileSize"` // 文件大小 @@ -181,8 +182,8 @@ type CommissionFreezeConfig struct { } type CommissionItem struct { - Id int64 `json:"id"` // 记录ID - OrderId int64 `json:"order_id"` // 订单ID + Id string `json:"id"` // 记录ID + OrderId string `json:"order_id"` // 订单ID OrderNo string `json:"order_no"` // 订单号 ProductName string `json:"product_name"` // 产品名称 Amount float64 `json:"amount"` // 佣金金额 @@ -203,13 +204,13 @@ type DirectParentRebateConfig struct { } type Feature struct { - ID int64 `json:"id"` // 功能ID + ID string `json:"id"` // 功能ID ApiID string `json:"api_id"` // API标识 Name string `json:"name"` // 功能描述 } type FeatureListItem struct { - Id int64 `json:"id"` // 功能ID + Id string `json:"id"` // 功能ID ApiId string `json:"api_id"` // API标识 Name string `json:"name"` // 描述 CreateTime string `json:"create_time"` // 创建时间 @@ -217,7 +218,7 @@ type FeatureListItem struct { } type InviteCodeItem struct { - Id int64 `json:"id"` // 记录ID + Id string `json:"id"` // 记录ID Code string `json:"code"` // 邀请码 TargetLevel int64 `json:"target_level"` // 目标等级 Status int64 `json:"status"` // 状态:0=未使用,1=已使用,2=已失效 @@ -228,14 +229,14 @@ type InviteCodeItem struct { } type InviteCodeListItem struct { - Id int64 `json:"id"` // 主键 + Id string `json:"id"` // 主键 Code string `json:"code"` // 邀请码 - AgentId int64 `json:"agent_id"` // 发放代理ID(0表示平台发放) + AgentId string `json:"agent_id"` // 发放代理ID(0表示平台发放) AgentMobile string `json:"agent_mobile"` // 发放代理手机号 TargetLevel int64 `json:"target_level"` // 目标等级 Status int64 `json:"status"` // 状态:0=未使用,1=已使用,2=已失效 - UsedUserId int64 `json:"used_user_id"` // 使用用户ID - UsedAgentId int64 `json:"used_agent_id"` // 使用代理ID + UsedUserId string `json:"used_user_id"` // 使用用户ID + UsedAgentId string `json:"used_agent_id"` // 使用代理ID UsedTime string `json:"used_time"` // 使用时间 ExpireTime string `json:"expire_time"` // 过期时间 Remark string `json:"remark"` // 备注 @@ -243,7 +244,7 @@ type InviteCodeListItem struct { } type InviteItem struct { - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 等级 LevelName string `json:"level_name"` // 等级名称 Mobile string `json:"mobile"` // 手机号 @@ -285,7 +286,7 @@ type Notification struct { } type NotificationListItem struct { - Id int64 `json:"id"` // 通知ID + Id string `json:"id"` // 通知ID Title string `json:"title"` // 通知标题 NotificationPage string `json:"notification_page"` // 通知页面 Content string `json:"content"` // 通知内容 @@ -300,7 +301,7 @@ type NotificationListItem struct { type OrderItem struct { OrderNo string `json:"order_no"` // 订单号 - ProductId int64 `json:"product_id"` // 产品ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 OrderAmount float64 `json:"order_amount"` // 订单金额 RebateAmount float64 `json:"rebate_amount"` // 返佣金额 @@ -308,7 +309,7 @@ type OrderItem struct { } type OrderListItem struct { - Id int64 `json:"id"` // 订单ID + Id string `json:"id"` // 订单ID OrderNo string `json:"order_no"` // 商户订单号 PlatformOrderId string `json:"platform_order_id"` // 支付订单号 ProductName string `json:"product_name"` // 产品名称 @@ -340,7 +341,7 @@ type PeriodConversionData struct { } type PlatformUserListItem struct { - Id int64 `json:"id"` // 用户ID + Id string `json:"id"` // 用户ID Mobile string `json:"mobile"` // 手机号 Nickname string `json:"nickname"` // 昵称 Info string `json:"info"` // 备注信息 @@ -359,7 +360,7 @@ type Product struct { } type ProductConfigItem struct { - ProductId int64 `json:"product_id"` // 产品ID + ProductId string `json:"product_id"` // 产品ID ProductName string `json:"product_name"` // 产品名称 ProductEn string `json:"product_en"` // 产品英文标识 ActualBasePrice float64 `json:"actual_base_price"` // 实际底价 @@ -370,14 +371,14 @@ type ProductConfigItem struct { } type ProductFeatureItem struct { - FeatureId int64 `json:"feature_id"` // 功能ID - Sort int64 `json:"sort"` // 排序 - Enable int64 `json:"enable"` // 是否启用 - IsImportant int64 `json:"is_important"` // 是否重要 + FeatureId string `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 + Id string `json:"id"` // 产品ID ProductName string `json:"product_name"` // 服务名 ProductEn string `json:"product_en"` // 英文名 Description string `json:"description"` // 描述 @@ -388,10 +389,18 @@ type ProductListItem struct { UpdateTime string `json:"update_time"` // 更新时间 } +type PromotionQueryItem struct { + Id string `json:"id"` // 查询ID + OrderId string `json:"order_id"` // 订单ID + ProductName string `json:"product_name"` // 产品名称 + CreateTime string `json:"create_time"` // 创建时间 + QueryState string `json:"query_state"` // 查询状态 +} + type Query struct { - Id int64 `json:"id"` // 主键ID - OrderId int64 `json:"order_id"` // 订单ID - UserId int64 `json:"user_id"` // 用户ID + Id string `json:"id"` // 主键ID + OrderId string `json:"order_id"` // 订单ID + UserId string `json:"user_id"` // 用户ID Product string `json:"product"` // 产品ID ProductName string `json:"product_name"` // 产品ID QueryParams map[string]interface{} `json:"query_params"` @@ -402,7 +411,7 @@ type Query struct { } type QueryCleanupConfigItem struct { - Id int64 `json:"id"` // 主键ID + Id string `json:"id"` // 主键ID ConfigKey string `json:"config_key"` // 配置键 ConfigValue string `json:"config_value"` // 配置值 ConfigDesc string `json:"config_desc"` // 配置描述 @@ -412,11 +421,11 @@ type QueryCleanupConfigItem struct { } 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 + Id string `json:"id"` // 主键ID + CleanupLogId string `json:"cleanup_log_id"` // 清理日志ID + QueryId string `json:"query_id"` // 查询ID + OrderId string `json:"order_id"` // 订单ID + UserId string `json:"user_id"` // 用户ID ProductName string `json:"product_name"` // 产品名称 QueryState string `json:"query_state"` // 查询状态 CreateTimeOld string `json:"create_time_old"` // 原创建时间 @@ -424,7 +433,7 @@ type QueryCleanupDetailItem struct { } type QueryCleanupLogItem struct { - Id int64 `json:"id"` // 主键ID + Id string `json:"id"` // 主键ID CleanupTime string `json:"cleanup_time"` // 清理时间 CleanupBefore string `json:"cleanup_before"` // 清理截止时间 Status int64 `json:"status"` // 状态:1-成功,2-失败 @@ -448,11 +457,11 @@ type QueryResp struct { } type RebateItem struct { - Id int64 `json:"id"` // 记录ID - SourceAgentId int64 `json:"source_agent_id"` // 来源代理ID + Id string `json:"id"` // 记录ID + SourceAgentId string `json:"source_agent_id"` // 来源代理ID SourceAgentMobile string `json:"source_agent_mobile"` // 来源代理手机号 SourceAgentLevel int64 `json:"source_agent_level"` // 来源代理等级:1=普通,2=黄金,3=钻石 - OrderId int64 `json:"order_id"` // 订单ID + OrderId string `json:"order_id"` // 订单ID OrderNo string `json:"order_no"` // 订单号 RebateType int64 `json:"rebate_type"` // 返佣类型:1=直接上级,2=钻石上级,3=黄金上级 Amount float64 `json:"amount"` // 返佣金额 @@ -466,18 +475,18 @@ type RebateStatistics struct { } 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列表 + Id string `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 []string `json:"menu_ids"` // 关联的菜单ID列表 } type SubordinateItem struct { - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 等级 LevelName string `json:"level_name"` // 等级名称 Mobile string `json:"mobile"` // 手机号 @@ -487,7 +496,7 @@ type SubordinateItem struct { } type TeamMemberItem struct { - AgentId int64 `json:"agent_id"` // 代理ID + AgentId string `json:"agent_id"` // 代理ID Level int64 `json:"level"` // 等级 LevelName string `json:"level_name"` // 等级名称 Mobile string `json:"mobile"` // 手机号 @@ -516,12 +525,11 @@ type TeamStatistics struct { type UpgradeFeeConfig struct { NormalToGold float64 `json:"normal_to_gold"` // 普通→黄金:199 NormalToDiamond float64 `json:"normal_to_diamond"` // 普通→钻石:980 - GoldToDiamond float64 `json:"gold_to_diamond"` // 黄金→钻石:980 } type UpgradeItem struct { - Id int64 `json:"id"` // 记录ID - AgentId int64 `json:"agent_id"` // 代理ID + Id string `json:"id"` // 记录ID + AgentId string `json:"agent_id"` // 代理ID FromLevel int64 `json:"from_level"` // 原等级 ToLevel int64 `json:"to_level"` // 目标等级 UpgradeType int64 `json:"upgrade_type"` // 升级类型:1=自主付费,2=钻石升级 @@ -537,8 +545,8 @@ type UpgradeRebateConfig struct { } type UpgradeRebateItem struct { - Id int64 `json:"id"` // 记录ID - SourceAgentId int64 `json:"source_agent_id"` // 来源代理ID(升级的代理) + Id string `json:"id"` // 记录ID + SourceAgentId string `json:"source_agent_id"` // 来源代理ID(升级的代理) SourceAgentMobile string `json:"source_agent_mobile"` // 来源代理手机号 OrderNo string `json:"order_no"` // 订单号 FromLevel int64 `json:"from_level"` // 原等级 @@ -548,14 +556,14 @@ type UpgradeRebateItem struct { } type User struct { - Id int64 `json:"id"` + Id string `json:"id"` Mobile string `json:"mobile"` NickName string `json:"nickName"` UserType int64 `json:"userType"` } type WithdrawalItem struct { - Id int64 `json:"id"` // 记录ID + Id string `json:"id"` // 记录ID WithdrawalNo string `json:"withdrawal_no"` // 提现单号 Amount float64 `json:"amount"` // 提现金额 TaxAmount float64 `json:"tax_amount"` // 税费金额 diff --git a/app/main/api/internal/types/user.go b/app/main/api/internal/types/user.go index dd5b290..f0d32b7 100644 --- a/app/main/api/internal/types/user.go +++ b/app/main/api/internal/types/user.go @@ -1,6 +1,20 @@ // Code generated by goctl. DO NOT EDIT. package types +type AuthReq struct { + Platform string `json:"platform"` // browser|wxh5|wxmini + Code string `json:"code,optional"` +} + +type AuthResp struct { + AccessToken string `json:"accessToken"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` + UserType int64 `json:"userType"` + HasMobile bool `json:"hasMobile"` + IsAgent bool `json:"isAgent"` +} + type BindMobileReq struct { Mobile string `json:"mobile" validate:"required,mobile"` Code string `json:"code" validate:"required"` diff --git a/app/main/model/adminApiModel_gen.go b/app/main/model/adminApiModel_gen.go index 090d95b..02963f8 100644 --- a/app/main/model/adminApiModel_gen.go +++ b/app/main/model/adminApiModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminApiFieldNames = builder.RawFieldNames(&AdminApi{}) adminApiRows = strings.Join(adminApiFieldNames, ",") - adminApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminApiFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminApiFieldNames, "`create_time`", "`update_time`"), ",") adminApiRowsWithPlaceHolder = strings.Join(stringx.Remove(adminApiFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminApiIdPrefix = "cache:ycc:adminApi:id:" - cacheHmAdminApiApiCodePrefix = "cache:ycc:adminApi:apiCode:" + cacheYccAdminApiIdPrefix = "cache:ycc:adminApi:id:" + cacheYccAdminApiApiCodePrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminApiModel struct { @@ -57,7 +58,7 @@ type ( } AdminApi struct { - Id int64 `db:"id"` + Id string `db:"id"` CreateTime time.Time `db:"create_time"` UpdateTime time.Time `db:"update_time"` DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -81,21 +82,38 @@ func newAdminApiModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminApiMode func (m *defaultAdminApiModel) Insert(ctx context.Context, session sqlx.Session, data *AdminApi) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheHmAdminApiApiCodePrefix, data.ApiCode) - hmAdminApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminApiIdPrefix, data.Id) + m.insertUUID(data) + yccAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheYccAdminApiApiCodePrefix, data.ApiCode) + yccAdminApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminApiIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminApiApiCodeKey, hmAdminApiIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ApiName, data.ApiCode, data.Method, data.Url, data.Status, data.Description) + }, yccAdminApiApiCodeKey, yccAdminApiIdKey) +} +func (m *defaultAdminApiModel) insertUUID(data *AdminApi) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminApiModel) FindOne(ctx context.Context, id int64) (*AdminApi, error) { - hmAdminApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminApiIdPrefix, id) +func (m *defaultAdminApiModel) FindOne(ctx context.Context, id string) (*AdminApi, error) { + yccAdminApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminApiIdPrefix, id) var resp AdminApi - err := m.QueryRowCtx(ctx, &resp, hmAdminApiIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminApiIdKey, 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) }) @@ -110,9 +128,9 @@ func (m *defaultAdminApiModel) FindOne(ctx context.Context, id int64) (*AdminApi } func (m *defaultAdminApiModel) FindOneByApiCode(ctx context.Context, apiCode string) (*AdminApi, error) { - hmAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheHmAdminApiApiCodePrefix, apiCode) + yccAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheYccAdminApiApiCodePrefix, apiCode) var resp AdminApi - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminApiApiCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminApiApiCodeKey, 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 @@ -134,15 +152,15 @@ func (m *defaultAdminApiModel) Update(ctx context.Context, session sqlx.Session, if err != nil { return nil, err } - hmAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheHmAdminApiApiCodePrefix, data.ApiCode) - hmAdminApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminApiIdPrefix, data.Id) + yccAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheYccAdminApiApiCodePrefix, data.ApiCode) + yccAdminApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminApiIdPrefix, 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) - }, hmAdminApiApiCodeKey, hmAdminApiIdKey) + }, yccAdminApiApiCodeKey, yccAdminApiIdKey) } func (m *defaultAdminApiModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminApi) error { @@ -157,15 +175,15 @@ func (m *defaultAdminApiModel) UpdateWithVersion(ctx context.Context, session sq if err != nil { return err } - hmAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheHmAdminApiApiCodePrefix, data.ApiCode) - hmAdminApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminApiIdPrefix, data.Id) + yccAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheYccAdminApiApiCodePrefix, data.ApiCode) + yccAdminApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminApiIdPrefix, 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) - }, hmAdminApiApiCodeKey, hmAdminApiIdKey) + }, yccAdminApiApiCodeKey, yccAdminApiIdKey) if err != nil { return err } @@ -382,25 +400,25 @@ func (m *defaultAdminApiModel) Trans(ctx context.Context, fn func(ctx context.Co 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 { +func (m *defaultAdminApiModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheHmAdminApiApiCodePrefix, data.ApiCode) - hmAdminApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminApiIdPrefix, id) + yccAdminApiApiCodeKey := fmt.Sprintf("%s%v", cacheYccAdminApiApiCodePrefix, data.ApiCode) + yccAdminApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminApiIdPrefix, 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) - }, hmAdminApiApiCodeKey, hmAdminApiIdKey) + }, yccAdminApiApiCodeKey, yccAdminApiIdKey) return err } func (m *defaultAdminApiModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminApiIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminApiIdPrefix, 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) diff --git a/app/main/model/adminDictDataModel_gen.go b/app/main/model/adminDictDataModel_gen.go index 22d4270..b2b2cd6 100644 --- a/app/main/model/adminDictDataModel_gen.go +++ b/app/main/model/adminDictDataModel_gen.go @@ -8,34 +8,35 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminDictDataFieldNames = builder.RawFieldNames(&AdminDictData{}) adminDictDataRows = strings.Join(adminDictDataFieldNames, ",") - adminDictDataRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictDataFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminDictDataRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictDataFieldNames, "`create_time`", "`update_time`"), ",") adminDictDataRowsWithPlaceHolder = strings.Join(stringx.Remove(adminDictDataFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminDictDataIdPrefix = "cache:ycc:adminDictycc:id:" - cacheHmAdminDictDataDictTypeDictLabelPrefix = "cache:ycc:adminDictycc:dictType:dictLabel:" - cacheHmAdminDictDataDictTypeDictValuePrefix = "cache:ycc:adminDictycc:dictType:dictValue:" + cacheYccAdminDictDataIdPrefix = "cache:ycc:adminDictData:id:" + cacheYccAdminDictDataDictTypeDictLabelPrefix = "cache:ycc:adminDictData:dictType:dictLabel:" + cacheYccAdminDictDataDictTypeDictValuePrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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) @@ -50,7 +51,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminDictDataModel struct { @@ -59,7 +60,7 @@ type ( } AdminDictData struct { - Id int64 `db:"id"` + Id string `db:"id"` CreateTime time.Time `db:"create_time"` UpdateTime time.Time `db:"update_time"` DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -83,22 +84,39 @@ func newAdminDictDataModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminDi func (m *defaultAdminDictDataModel) Insert(ctx context.Context, session sqlx.Session, data *AdminDictData) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) - hmAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) - hmAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictDataIdPrefix, data.Id) + m.insertUUID(data) + yccAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + yccAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + yccAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictDataIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminDictDataDictTypeDictLabelKey, hmAdminDictDataDictTypeDictValueKey, hmAdminDictDataIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictLabel, data.DictValue, data.DictSort, data.Status, data.Remark) + }, yccAdminDictDataDictTypeDictLabelKey, yccAdminDictDataDictTypeDictValueKey, yccAdminDictDataIdKey) +} +func (m *defaultAdminDictDataModel) insertUUID(data *AdminDictData) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminDictDataModel) FindOne(ctx context.Context, id int64) (*AdminDictData, error) { - hmAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictDataIdPrefix, id) +func (m *defaultAdminDictDataModel) FindOne(ctx context.Context, id string) (*AdminDictData, error) { + yccAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictDataIdPrefix, id) var resp AdminDictData - err := m.QueryRowCtx(ctx, &resp, hmAdminDictDataIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminDictDataIdKey, 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) }) @@ -113,9 +131,9 @@ func (m *defaultAdminDictDataModel) FindOne(ctx context.Context, id int64) (*Adm } func (m *defaultAdminDictDataModel) FindOneByDictTypeDictLabel(ctx context.Context, dictType string, dictLabel string) (*AdminDictData, error) { - hmAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictLabelPrefix, dictType, dictLabel) + yccAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictLabelPrefix, dictType, dictLabel) var resp AdminDictData - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminDictDataDictTypeDictLabelKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminDictDataDictTypeDictLabelKey, 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 @@ -133,9 +151,9 @@ func (m *defaultAdminDictDataModel) FindOneByDictTypeDictLabel(ctx context.Conte } func (m *defaultAdminDictDataModel) FindOneByDictTypeDictValue(ctx context.Context, dictType string, dictValue int64) (*AdminDictData, error) { - hmAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictValuePrefix, dictType, dictValue) + yccAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictValuePrefix, dictType, dictValue) var resp AdminDictData - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminDictDataDictTypeDictValueKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminDictDataDictTypeDictValueKey, 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 @@ -157,16 +175,16 @@ func (m *defaultAdminDictDataModel) Update(ctx context.Context, session sqlx.Ses if err != nil { return nil, err } - hmAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) - hmAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) - hmAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictDataIdPrefix, data.Id) + yccAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + yccAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + yccAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictDataIdPrefix, 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) - }, hmAdminDictDataDictTypeDictLabelKey, hmAdminDictDataDictTypeDictValueKey, hmAdminDictDataIdKey) + }, yccAdminDictDataDictTypeDictLabelKey, yccAdminDictDataDictTypeDictValueKey, yccAdminDictDataIdKey) } func (m *defaultAdminDictDataModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminDictData) error { @@ -181,16 +199,16 @@ func (m *defaultAdminDictDataModel) UpdateWithVersion(ctx context.Context, sessi if err != nil { return err } - hmAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) - hmAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) - hmAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictDataIdPrefix, data.Id) + yccAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + yccAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + yccAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictDataIdPrefix, 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) - }, hmAdminDictDataDictTypeDictLabelKey, hmAdminDictDataDictTypeDictValueKey, hmAdminDictDataIdKey) + }, yccAdminDictDataDictTypeDictLabelKey, yccAdminDictDataDictTypeDictValueKey, yccAdminDictDataIdKey) if err != nil { return err } @@ -407,26 +425,26 @@ func (m *defaultAdminDictDataModel) Trans(ctx context.Context, fn func(ctx conte 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 { +func (m *defaultAdminDictDataModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) - hmAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheHmAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) - hmAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictDataIdPrefix, id) + yccAdminDictDataDictTypeDictLabelKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictLabelPrefix, data.DictType, data.DictLabel) + yccAdminDictDataDictTypeDictValueKey := fmt.Sprintf("%s%v:%v", cacheYccAdminDictDataDictTypeDictValuePrefix, data.DictType, data.DictValue) + yccAdminDictDataIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictDataIdPrefix, 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) - }, hmAdminDictDataDictTypeDictLabelKey, hmAdminDictDataDictTypeDictValueKey, hmAdminDictDataIdKey) + }, yccAdminDictDataDictTypeDictLabelKey, yccAdminDictDataDictTypeDictValueKey, yccAdminDictDataIdKey) return err } func (m *defaultAdminDictDataModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminDictDataIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminDictDataIdPrefix, 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) diff --git a/app/main/model/adminDictTypeModel_gen.go b/app/main/model/adminDictTypeModel_gen.go index eef8675..9ed7a87 100644 --- a/app/main/model/adminDictTypeModel_gen.go +++ b/app/main/model/adminDictTypeModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminDictTypeFieldNames = builder.RawFieldNames(&AdminDictType{}) adminDictTypeRows = strings.Join(adminDictTypeFieldNames, ",") - adminDictTypeRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminDictTypeRowsExpectAutoSet = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`create_time`", "`update_time`"), ",") adminDictTypeRowsWithPlaceHolder = strings.Join(stringx.Remove(adminDictTypeFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminDictTypeIdPrefix = "cache:ycc:adminDictType:id:" - cacheHmAdminDictTypeDictTypePrefix = "cache:ycc:adminDictType:dictType:" + cacheYccAdminDictTypeIdPrefix = "cache:ycc:adminDictType:id:" + cacheYccAdminDictTypeDictTypePrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminDictTypeModel struct { @@ -57,7 +58,7 @@ type ( } AdminDictType struct { - Id int64 `db:"id"` + Id string `db:"id"` CreateTime time.Time `db:"create_time"` UpdateTime time.Time `db:"update_time"` DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -79,21 +80,38 @@ func newAdminDictTypeModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminDi func (m *defaultAdminDictTypeModel) Insert(ctx context.Context, session sqlx.Session, data *AdminDictType) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeDictTypePrefix, data.DictType) - hmAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeIdPrefix, data.Id) + m.insertUUID(data) + yccAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeDictTypePrefix, data.DictType) + yccAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminDictTypeDictTypeKey, hmAdminDictTypeIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.DictType, data.DictName, data.Status, data.Remark) + }, yccAdminDictTypeDictTypeKey, yccAdminDictTypeIdKey) +} +func (m *defaultAdminDictTypeModel) insertUUID(data *AdminDictType) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminDictTypeModel) FindOne(ctx context.Context, id int64) (*AdminDictType, error) { - hmAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeIdPrefix, id) +func (m *defaultAdminDictTypeModel) FindOne(ctx context.Context, id string) (*AdminDictType, error) { + yccAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeIdPrefix, id) var resp AdminDictType - err := m.QueryRowCtx(ctx, &resp, hmAdminDictTypeIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminDictTypeIdKey, 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) }) @@ -108,9 +126,9 @@ func (m *defaultAdminDictTypeModel) FindOne(ctx context.Context, id int64) (*Adm } func (m *defaultAdminDictTypeModel) FindOneByDictType(ctx context.Context, dictType string) (*AdminDictType, error) { - hmAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeDictTypePrefix, dictType) + yccAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeDictTypePrefix, dictType) var resp AdminDictType - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminDictTypeDictTypeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminDictTypeDictTypeKey, 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 @@ -132,15 +150,15 @@ func (m *defaultAdminDictTypeModel) Update(ctx context.Context, session sqlx.Ses if err != nil { return nil, err } - hmAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeDictTypePrefix, data.DictType) - hmAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeIdPrefix, data.Id) + yccAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeDictTypePrefix, data.DictType) + yccAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeIdPrefix, 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) - }, hmAdminDictTypeDictTypeKey, hmAdminDictTypeIdKey) + }, yccAdminDictTypeDictTypeKey, yccAdminDictTypeIdKey) } func (m *defaultAdminDictTypeModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminDictType) error { @@ -155,15 +173,15 @@ func (m *defaultAdminDictTypeModel) UpdateWithVersion(ctx context.Context, sessi if err != nil { return err } - hmAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeDictTypePrefix, data.DictType) - hmAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeIdPrefix, data.Id) + yccAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeDictTypePrefix, data.DictType) + yccAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeIdPrefix, 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) - }, hmAdminDictTypeDictTypeKey, hmAdminDictTypeIdKey) + }, yccAdminDictTypeDictTypeKey, yccAdminDictTypeIdKey) if err != nil { return err } @@ -380,25 +398,25 @@ func (m *defaultAdminDictTypeModel) Trans(ctx context.Context, fn func(ctx conte 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 { +func (m *defaultAdminDictTypeModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeDictTypePrefix, data.DictType) - hmAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheHmAdminDictTypeIdPrefix, id) + yccAdminDictTypeDictTypeKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeDictTypePrefix, data.DictType) + yccAdminDictTypeIdKey := fmt.Sprintf("%s%v", cacheYccAdminDictTypeIdPrefix, 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) - }, hmAdminDictTypeDictTypeKey, hmAdminDictTypeIdKey) + }, yccAdminDictTypeDictTypeKey, yccAdminDictTypeIdKey) return err } func (m *defaultAdminDictTypeModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminDictTypeIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminDictTypeIdPrefix, 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) diff --git a/app/main/model/adminMenuModel_gen.go b/app/main/model/adminMenuModel_gen.go index 46ea771..15630dc 100644 --- a/app/main/model/adminMenuModel_gen.go +++ b/app/main/model/adminMenuModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminMenuFieldNames = builder.RawFieldNames(&AdminMenu{}) adminMenuRows = strings.Join(adminMenuFieldNames, ",") - adminMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminMenuFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminMenuFieldNames, "`create_time`", "`update_time`"), ",") adminMenuRowsWithPlaceHolder = strings.Join(stringx.Remove(adminMenuFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminMenuIdPrefix = "cache:ycc:adminMenu:id:" - cacheHmAdminMenuNamePathPrefix = "cache:ycc:adminMenu:name:path:" + cacheYccAdminMenuIdPrefix = "cache:ycc:adminMenu:id:" + cacheYccAdminMenuNamePathPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminMenuModel struct { @@ -57,13 +58,13 @@ type ( } AdminMenu struct { - Id int64 `db:"id"` + Id string `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 + Pid sql.NullString `db:"pid"` // 父菜单ID Name string `db:"name"` // 路由名称 Path string `db:"path"` // 路由路径 Component string `db:"component"` // 组件路径 @@ -84,21 +85,38 @@ func newAdminMenuModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminMenuMo func (m *defaultAdminMenuModel) Insert(ctx context.Context, session sqlx.Session, data *AdminMenu) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminMenuIdPrefix, data.Id) - hmAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheHmAdminMenuNamePathPrefix, data.Name, data.Path) + m.insertUUID(data) + yccAdminMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminMenuIdPrefix, data.Id) + yccAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheYccAdminMenuNamePathPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminMenuIdKey, hmAdminMenuNamePathKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.Pid, data.Name, data.Path, data.Component, data.Redirect, data.Meta, data.Status, data.Type, data.Sort) + }, yccAdminMenuIdKey, yccAdminMenuNamePathKey) +} +func (m *defaultAdminMenuModel) insertUUID(data *AdminMenu) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminMenuModel) FindOne(ctx context.Context, id int64) (*AdminMenu, error) { - hmAdminMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminMenuIdPrefix, id) +func (m *defaultAdminMenuModel) FindOne(ctx context.Context, id string) (*AdminMenu, error) { + yccAdminMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminMenuIdPrefix, id) var resp AdminMenu - err := m.QueryRowCtx(ctx, &resp, hmAdminMenuIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminMenuIdKey, 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) }) @@ -113,9 +131,9 @@ func (m *defaultAdminMenuModel) FindOne(ctx context.Context, id int64) (*AdminMe } func (m *defaultAdminMenuModel) FindOneByNamePath(ctx context.Context, name string, path string) (*AdminMenu, error) { - hmAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheHmAdminMenuNamePathPrefix, name, path) + yccAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheYccAdminMenuNamePathPrefix, name, path) var resp AdminMenu - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminMenuNamePathKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminMenuNamePathKey, 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 @@ -137,15 +155,15 @@ func (m *defaultAdminMenuModel) Update(ctx context.Context, session sqlx.Session if err != nil { return nil, err } - hmAdminMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminMenuIdPrefix, data.Id) - hmAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheHmAdminMenuNamePathPrefix, data.Name, data.Path) + yccAdminMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminMenuIdPrefix, data.Id) + yccAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheYccAdminMenuNamePathPrefix, 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) - }, hmAdminMenuIdKey, hmAdminMenuNamePathKey) + }, yccAdminMenuIdKey, yccAdminMenuNamePathKey) } func (m *defaultAdminMenuModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminMenu) error { @@ -160,15 +178,15 @@ func (m *defaultAdminMenuModel) UpdateWithVersion(ctx context.Context, session s if err != nil { return err } - hmAdminMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminMenuIdPrefix, data.Id) - hmAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheHmAdminMenuNamePathPrefix, data.Name, data.Path) + yccAdminMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminMenuIdPrefix, data.Id) + yccAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheYccAdminMenuNamePathPrefix, 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) - }, hmAdminMenuIdKey, hmAdminMenuNamePathKey) + }, yccAdminMenuIdKey, yccAdminMenuNamePathKey) if err != nil { return err } @@ -385,25 +403,25 @@ func (m *defaultAdminMenuModel) Trans(ctx context.Context, fn func(ctx context.C 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 { +func (m *defaultAdminMenuModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminMenuIdPrefix, id) - hmAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheHmAdminMenuNamePathPrefix, data.Name, data.Path) + yccAdminMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminMenuIdPrefix, id) + yccAdminMenuNamePathKey := fmt.Sprintf("%s%v:%v", cacheYccAdminMenuNamePathPrefix, 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) - }, hmAdminMenuIdKey, hmAdminMenuNamePathKey) + }, yccAdminMenuIdKey, yccAdminMenuNamePathKey) return err } func (m *defaultAdminMenuModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminMenuIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminMenuIdPrefix, 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) diff --git a/app/main/model/adminRoleApiModel_gen.go b/app/main/model/adminRoleApiModel_gen.go index 51ef776..3fb8aac 100644 --- a/app/main/model/adminRoleApiModel_gen.go +++ b/app/main/model/adminRoleApiModel_gen.go @@ -8,34 +8,35 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminRoleApiFieldNames = builder.RawFieldNames(&AdminRoleApi{}) adminRoleApiRows = strings.Join(adminRoleApiFieldNames, ",") - adminRoleApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleApiRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`create_time`", "`update_time`"), ",") adminRoleApiRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleApiFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminRoleApiIdPrefix = "cache:ycc:adminRoleApi:id:" - cacheHmAdminRoleApiRoleIdApiIdPrefix = "cache:ycc:adminRoleApi:roleId:apiId:" + cacheYccAdminRoleApiIdPrefix = "cache:ycc:adminRoleApi:id:" + cacheYccAdminRoleApiRoleIdApiIdPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*AdminRoleApi, error) + FindOneByRoleIdApiId(ctx context.Context, roleId string, apiId string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminRoleApiModel struct { @@ -57,14 +58,14 @@ type ( } AdminRoleApi struct { - Id int64 `db:"id"` + Id string `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 + RoleId string `db:"role_id"` + ApiId string `db:"api_id"` } ) @@ -77,21 +78,38 @@ func newAdminRoleApiModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRol func (m *defaultAdminRoleApiModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRoleApi) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleApiIdPrefix, data.Id) - hmAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + m.insertUUID(data) + yccAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleApiIdPrefix, data.Id) + yccAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleApiRoleIdApiIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminRoleApiIdKey, hmAdminRoleApiRoleIdApiIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.ApiId) + }, yccAdminRoleApiIdKey, yccAdminRoleApiRoleIdApiIdKey) +} +func (m *defaultAdminRoleApiModel) insertUUID(data *AdminRoleApi) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminRoleApiModel) FindOne(ctx context.Context, id int64) (*AdminRoleApi, error) { - hmAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleApiIdPrefix, id) +func (m *defaultAdminRoleApiModel) FindOne(ctx context.Context, id string) (*AdminRoleApi, error) { + yccAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleApiIdPrefix, id) var resp AdminRoleApi - err := m.QueryRowCtx(ctx, &resp, hmAdminRoleApiIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminRoleApiIdKey, 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) }) @@ -105,10 +123,10 @@ func (m *defaultAdminRoleApiModel) FindOne(ctx context.Context, id int64) (*Admi } } -func (m *defaultAdminRoleApiModel) FindOneByRoleIdApiId(ctx context.Context, roleId int64, apiId int64) (*AdminRoleApi, error) { - hmAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleApiRoleIdApiIdPrefix, roleId, apiId) +func (m *defaultAdminRoleApiModel) FindOneByRoleIdApiId(ctx context.Context, roleId string, apiId string) (*AdminRoleApi, error) { + yccAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleApiRoleIdApiIdPrefix, roleId, apiId) var resp AdminRoleApi - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminRoleApiRoleIdApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminRoleApiRoleIdApiIdKey, 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 @@ -130,15 +148,15 @@ func (m *defaultAdminRoleApiModel) Update(ctx context.Context, session sqlx.Sess if err != nil { return nil, err } - hmAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleApiIdPrefix, data.Id) - hmAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + yccAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleApiIdPrefix, data.Id) + yccAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleApiRoleIdApiIdPrefix, 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) - }, hmAdminRoleApiIdKey, hmAdminRoleApiRoleIdApiIdKey) + }, yccAdminRoleApiIdKey, yccAdminRoleApiRoleIdApiIdKey) } func (m *defaultAdminRoleApiModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRoleApi) error { @@ -153,15 +171,15 @@ func (m *defaultAdminRoleApiModel) UpdateWithVersion(ctx context.Context, sessio if err != nil { return err } - hmAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleApiIdPrefix, data.Id) - hmAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + yccAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleApiIdPrefix, data.Id) + yccAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleApiRoleIdApiIdPrefix, 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) - }, hmAdminRoleApiIdKey, hmAdminRoleApiRoleIdApiIdKey) + }, yccAdminRoleApiIdKey, yccAdminRoleApiRoleIdApiIdKey) if err != nil { return err } @@ -378,25 +396,25 @@ func (m *defaultAdminRoleApiModel) Trans(ctx context.Context, fn func(ctx contex 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 { +func (m *defaultAdminRoleApiModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleApiIdPrefix, id) - hmAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleApiRoleIdApiIdPrefix, data.RoleId, data.ApiId) + yccAdminRoleApiIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleApiIdPrefix, id) + yccAdminRoleApiRoleIdApiIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleApiRoleIdApiIdPrefix, 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) - }, hmAdminRoleApiIdKey, hmAdminRoleApiRoleIdApiIdKey) + }, yccAdminRoleApiIdKey, yccAdminRoleApiRoleIdApiIdKey) return err } func (m *defaultAdminRoleApiModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminRoleApiIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminRoleApiIdPrefix, 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) diff --git a/app/main/model/adminRoleMenuModel_gen.go b/app/main/model/adminRoleMenuModel_gen.go index 66697c1..28d7bb3 100644 --- a/app/main/model/adminRoleMenuModel_gen.go +++ b/app/main/model/adminRoleMenuModel_gen.go @@ -8,34 +8,35 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminRoleMenuFieldNames = builder.RawFieldNames(&AdminRoleMenu{}) adminRoleMenuRows = strings.Join(adminRoleMenuFieldNames, ",") - adminRoleMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleMenuRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`create_time`", "`update_time`"), ",") adminRoleMenuRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleMenuFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminRoleMenuIdPrefix = "cache:ycc:adminRoleMenu:id:" - cacheHmAdminRoleMenuRoleIdMenuIdPrefix = "cache:ycc:adminRoleMenu:roleId:menuId:" + cacheYccAdminRoleMenuIdPrefix = "cache:ycc:adminRoleMenu:id:" + cacheYccAdminRoleMenuRoleIdMenuIdPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*AdminRoleMenu, error) + FindOneByRoleIdMenuId(ctx context.Context, roleId string, menuId string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminRoleMenuModel struct { @@ -57,14 +58,14 @@ type ( } AdminRoleMenu struct { - Id int64 `db:"id"` + Id string `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 + RoleId string `db:"role_id"` + MenuId string `db:"menu_id"` } ) @@ -77,21 +78,38 @@ func newAdminRoleMenuModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRo func (m *defaultAdminRoleMenuModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRoleMenu) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleMenuIdPrefix, data.Id) - hmAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + m.insertUUID(data) + yccAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleMenuIdPrefix, data.Id) + yccAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleMenuRoleIdMenuIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminRoleMenuIdKey, hmAdminRoleMenuRoleIdMenuIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.RoleId, data.MenuId) + }, yccAdminRoleMenuIdKey, yccAdminRoleMenuRoleIdMenuIdKey) +} +func (m *defaultAdminRoleMenuModel) insertUUID(data *AdminRoleMenu) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminRoleMenuModel) FindOne(ctx context.Context, id int64) (*AdminRoleMenu, error) { - hmAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleMenuIdPrefix, id) +func (m *defaultAdminRoleMenuModel) FindOne(ctx context.Context, id string) (*AdminRoleMenu, error) { + yccAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleMenuIdPrefix, id) var resp AdminRoleMenu - err := m.QueryRowCtx(ctx, &resp, hmAdminRoleMenuIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminRoleMenuIdKey, 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) }) @@ -105,10 +123,10 @@ func (m *defaultAdminRoleMenuModel) FindOne(ctx context.Context, id int64) (*Adm } } -func (m *defaultAdminRoleMenuModel) FindOneByRoleIdMenuId(ctx context.Context, roleId int64, menuId int64) (*AdminRoleMenu, error) { - hmAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleMenuRoleIdMenuIdPrefix, roleId, menuId) +func (m *defaultAdminRoleMenuModel) FindOneByRoleIdMenuId(ctx context.Context, roleId string, menuId string) (*AdminRoleMenu, error) { + yccAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleMenuRoleIdMenuIdPrefix, roleId, menuId) var resp AdminRoleMenu - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminRoleMenuRoleIdMenuIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminRoleMenuRoleIdMenuIdKey, 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 @@ -130,15 +148,15 @@ func (m *defaultAdminRoleMenuModel) Update(ctx context.Context, session sqlx.Ses if err != nil { return nil, err } - hmAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleMenuIdPrefix, data.Id) - hmAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + yccAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleMenuIdPrefix, data.Id) + yccAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleMenuRoleIdMenuIdPrefix, 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) - }, hmAdminRoleMenuIdKey, hmAdminRoleMenuRoleIdMenuIdKey) + }, yccAdminRoleMenuIdKey, yccAdminRoleMenuRoleIdMenuIdKey) } func (m *defaultAdminRoleMenuModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRoleMenu) error { @@ -153,15 +171,15 @@ func (m *defaultAdminRoleMenuModel) UpdateWithVersion(ctx context.Context, sessi if err != nil { return err } - hmAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleMenuIdPrefix, data.Id) - hmAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + yccAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleMenuIdPrefix, data.Id) + yccAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleMenuRoleIdMenuIdPrefix, 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) - }, hmAdminRoleMenuIdKey, hmAdminRoleMenuRoleIdMenuIdKey) + }, yccAdminRoleMenuIdKey, yccAdminRoleMenuRoleIdMenuIdKey) if err != nil { return err } @@ -378,25 +396,25 @@ func (m *defaultAdminRoleMenuModel) Trans(ctx context.Context, fn func(ctx conte 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 { +func (m *defaultAdminRoleMenuModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleMenuIdPrefix, id) - hmAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminRoleMenuRoleIdMenuIdPrefix, data.RoleId, data.MenuId) + yccAdminRoleMenuIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleMenuIdPrefix, id) + yccAdminRoleMenuRoleIdMenuIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminRoleMenuRoleIdMenuIdPrefix, 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) - }, hmAdminRoleMenuIdKey, hmAdminRoleMenuRoleIdMenuIdKey) + }, yccAdminRoleMenuIdKey, yccAdminRoleMenuRoleIdMenuIdKey) return err } func (m *defaultAdminRoleMenuModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminRoleMenuIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminRoleMenuIdPrefix, 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) diff --git a/app/main/model/adminRoleModel_gen.go b/app/main/model/adminRoleModel_gen.go index 4347ea3..7d4f329 100644 --- a/app/main/model/adminRoleModel_gen.go +++ b/app/main/model/adminRoleModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminRoleFieldNames = builder.RawFieldNames(&AdminRole{}) adminRoleRows = strings.Join(adminRoleFieldNames, ",") - adminRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminRoleFieldNames, "`create_time`", "`update_time`"), ",") adminRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(adminRoleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminRoleIdPrefix = "cache:ycc:adminRole:id:" - cacheHmAdminRoleRoleCodePrefix = "cache:ycc:adminRole:roleCode:" + cacheYccAdminRoleIdPrefix = "cache:ycc:adminRole:id:" + cacheYccAdminRoleRoleCodePrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminRoleModel struct { @@ -57,7 +58,7 @@ type ( } AdminRole struct { - Id int64 `db:"id"` + Id string `db:"id"` CreateTime time.Time `db:"create_time"` UpdateTime time.Time `db:"update_time"` DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -80,21 +81,38 @@ func newAdminRoleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminRoleMo func (m *defaultAdminRoleModel) Insert(ctx context.Context, session sqlx.Session, data *AdminRole) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleIdPrefix, data.Id) - hmAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheHmAdminRoleRoleCodePrefix, data.RoleCode) + m.insertUUID(data) + yccAdminRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleIdPrefix, data.Id) + yccAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheYccAdminRoleRoleCodePrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminRoleIdKey, hmAdminRoleRoleCodeKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.RoleName, data.RoleCode, data.Description, data.Status, data.Sort) + }, yccAdminRoleIdKey, yccAdminRoleRoleCodeKey) +} +func (m *defaultAdminRoleModel) insertUUID(data *AdminRole) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminRoleModel) FindOne(ctx context.Context, id int64) (*AdminRole, error) { - hmAdminRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleIdPrefix, id) +func (m *defaultAdminRoleModel) FindOne(ctx context.Context, id string) (*AdminRole, error) { + yccAdminRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleIdPrefix, id) var resp AdminRole - err := m.QueryRowCtx(ctx, &resp, hmAdminRoleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminRoleIdKey, 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) }) @@ -109,9 +127,9 @@ func (m *defaultAdminRoleModel) FindOne(ctx context.Context, id int64) (*AdminRo } func (m *defaultAdminRoleModel) FindOneByRoleCode(ctx context.Context, roleCode string) (*AdminRole, error) { - hmAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheHmAdminRoleRoleCodePrefix, roleCode) + yccAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheYccAdminRoleRoleCodePrefix, roleCode) var resp AdminRole - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminRoleRoleCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminRoleRoleCodeKey, 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 @@ -133,15 +151,15 @@ func (m *defaultAdminRoleModel) Update(ctx context.Context, session sqlx.Session if err != nil { return nil, err } - hmAdminRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleIdPrefix, data.Id) - hmAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheHmAdminRoleRoleCodePrefix, data.RoleCode) + yccAdminRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleIdPrefix, data.Id) + yccAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheYccAdminRoleRoleCodePrefix, 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) - }, hmAdminRoleIdKey, hmAdminRoleRoleCodeKey) + }, yccAdminRoleIdKey, yccAdminRoleRoleCodeKey) } func (m *defaultAdminRoleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminRole) error { @@ -156,15 +174,15 @@ func (m *defaultAdminRoleModel) UpdateWithVersion(ctx context.Context, session s if err != nil { return err } - hmAdminRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleIdPrefix, data.Id) - hmAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheHmAdminRoleRoleCodePrefix, data.RoleCode) + yccAdminRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleIdPrefix, data.Id) + yccAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheYccAdminRoleRoleCodePrefix, 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) - }, hmAdminRoleIdKey, hmAdminRoleRoleCodeKey) + }, yccAdminRoleIdKey, yccAdminRoleRoleCodeKey) if err != nil { return err } @@ -381,25 +399,25 @@ func (m *defaultAdminRoleModel) Trans(ctx context.Context, fn func(ctx context.C 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 { +func (m *defaultAdminRoleModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminRoleIdPrefix, id) - hmAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheHmAdminRoleRoleCodePrefix, data.RoleCode) + yccAdminRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminRoleIdPrefix, id) + yccAdminRoleRoleCodeKey := fmt.Sprintf("%s%v", cacheYccAdminRoleRoleCodePrefix, 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) - }, hmAdminRoleIdKey, hmAdminRoleRoleCodeKey) + }, yccAdminRoleIdKey, yccAdminRoleRoleCodeKey) return err } func (m *defaultAdminRoleModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminRoleIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminRoleIdPrefix, 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) diff --git a/app/main/model/adminUserModel_gen.go b/app/main/model/adminUserModel_gen.go index b93acd3..48774e4 100644 --- a/app/main/model/adminUserModel_gen.go +++ b/app/main/model/adminUserModel_gen.go @@ -8,34 +8,35 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminUserFieldNames = builder.RawFieldNames(&AdminUser{}) adminUserRows = strings.Join(adminUserFieldNames, ",") - adminUserRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminUserRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserFieldNames, "`create_time`", "`update_time`"), ",") adminUserRowsWithPlaceHolder = strings.Join(stringx.Remove(adminUserFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminUserIdPrefix = "cache:ycc:adminUser:id:" - cacheHmAdminUserRealNamePrefix = "cache:ycc:adminUser:realName:" - cacheHmAdminUserUsernamePrefix = "cache:ycc:adminUser:username:" + cacheYccAdminUserIdPrefix = "cache:ycc:adminUser:id:" + cacheYccAdminUserRealNamePrefix = "cache:ycc:adminUser:realName:" + cacheYccAdminUserUsernamePrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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) @@ -50,7 +51,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminUserModel struct { @@ -59,7 +60,7 @@ type ( } AdminUser struct { - Id int64 `db:"id"` + Id string `db:"id"` CreateTime time.Time `db:"create_time"` UpdateTime time.Time `db:"update_time"` DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -81,22 +82,39 @@ func newAdminUserModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminUserMo func (m *defaultAdminUserModel) Insert(ctx context.Context, session sqlx.Session, data *AdminUser) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminUserIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserIdPrefix, data.Id) - hmAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheHmAdminUserRealNamePrefix, data.RealName) - hmAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheHmAdminUserUsernamePrefix, data.Username) + m.insertUUID(data) + yccAdminUserIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserIdPrefix, data.Id) + yccAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheYccAdminUserRealNamePrefix, data.RealName) + yccAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheYccAdminUserUsernamePrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminUserIdKey, hmAdminUserRealNameKey, hmAdminUserUsernameKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.Username, data.Password, data.RealName, data.Status) + }, yccAdminUserIdKey, yccAdminUserRealNameKey, yccAdminUserUsernameKey) +} +func (m *defaultAdminUserModel) insertUUID(data *AdminUser) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminUserModel) FindOne(ctx context.Context, id int64) (*AdminUser, error) { - hmAdminUserIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserIdPrefix, id) +func (m *defaultAdminUserModel) FindOne(ctx context.Context, id string) (*AdminUser, error) { + yccAdminUserIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserIdPrefix, id) var resp AdminUser - err := m.QueryRowCtx(ctx, &resp, hmAdminUserIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminUserIdKey, 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) }) @@ -111,9 +129,9 @@ func (m *defaultAdminUserModel) FindOne(ctx context.Context, id int64) (*AdminUs } func (m *defaultAdminUserModel) FindOneByRealName(ctx context.Context, realName string) (*AdminUser, error) { - hmAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheHmAdminUserRealNamePrefix, realName) + yccAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheYccAdminUserRealNamePrefix, realName) var resp AdminUser - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminUserRealNameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminUserRealNameKey, 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 @@ -131,9 +149,9 @@ func (m *defaultAdminUserModel) FindOneByRealName(ctx context.Context, realName } func (m *defaultAdminUserModel) FindOneByUsername(ctx context.Context, username string) (*AdminUser, error) { - hmAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheHmAdminUserUsernamePrefix, username) + yccAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheYccAdminUserUsernamePrefix, username) var resp AdminUser - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminUserUsernameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminUserUsernameKey, 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 @@ -155,16 +173,16 @@ func (m *defaultAdminUserModel) Update(ctx context.Context, session sqlx.Session if err != nil { return nil, err } - hmAdminUserIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserIdPrefix, data.Id) - hmAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheHmAdminUserRealNamePrefix, data.RealName) - hmAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheHmAdminUserUsernamePrefix, data.Username) + yccAdminUserIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserIdPrefix, data.Id) + yccAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheYccAdminUserRealNamePrefix, data.RealName) + yccAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheYccAdminUserUsernamePrefix, 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) - }, hmAdminUserIdKey, hmAdminUserRealNameKey, hmAdminUserUsernameKey) + }, yccAdminUserIdKey, yccAdminUserRealNameKey, yccAdminUserUsernameKey) } func (m *defaultAdminUserModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminUser) error { @@ -179,16 +197,16 @@ func (m *defaultAdminUserModel) UpdateWithVersion(ctx context.Context, session s if err != nil { return err } - hmAdminUserIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserIdPrefix, data.Id) - hmAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheHmAdminUserRealNamePrefix, data.RealName) - hmAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheHmAdminUserUsernamePrefix, data.Username) + yccAdminUserIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserIdPrefix, data.Id) + yccAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheYccAdminUserRealNamePrefix, data.RealName) + yccAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheYccAdminUserUsernamePrefix, 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) - }, hmAdminUserIdKey, hmAdminUserRealNameKey, hmAdminUserUsernameKey) + }, yccAdminUserIdKey, yccAdminUserRealNameKey, yccAdminUserUsernameKey) if err != nil { return err } @@ -405,26 +423,26 @@ func (m *defaultAdminUserModel) Trans(ctx context.Context, fn func(ctx context.C 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 { +func (m *defaultAdminUserModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminUserIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserIdPrefix, id) - hmAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheHmAdminUserRealNamePrefix, data.RealName) - hmAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheHmAdminUserUsernamePrefix, data.Username) + yccAdminUserIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserIdPrefix, id) + yccAdminUserRealNameKey := fmt.Sprintf("%s%v", cacheYccAdminUserRealNamePrefix, data.RealName) + yccAdminUserUsernameKey := fmt.Sprintf("%s%v", cacheYccAdminUserUsernamePrefix, 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) - }, hmAdminUserIdKey, hmAdminUserRealNameKey, hmAdminUserUsernameKey) + }, yccAdminUserIdKey, yccAdminUserRealNameKey, yccAdminUserUsernameKey) return err } func (m *defaultAdminUserModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminUserIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminUserIdPrefix, 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) diff --git a/app/main/model/adminUserRoleModel_gen.go b/app/main/model/adminUserRoleModel_gen.go index 0381c87..67eb120 100644 --- a/app/main/model/adminUserRoleModel_gen.go +++ b/app/main/model/adminUserRoleModel_gen.go @@ -8,34 +8,35 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( adminUserRoleFieldNames = builder.RawFieldNames(&AdminUserRole{}) adminUserRoleRows = strings.Join(adminUserRoleFieldNames, ",") - adminUserRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + adminUserRoleRowsExpectAutoSet = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`create_time`", "`update_time`"), ",") adminUserRoleRowsWithPlaceHolder = strings.Join(stringx.Remove(adminUserRoleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAdminUserRoleIdPrefix = "cache:ycc:adminUserRole:id:" - cacheHmAdminUserRoleUserIdRoleIdPrefix = "cache:ycc:adminUserRole:userId:roleId:" + cacheYccAdminUserRoleIdPrefix = "cache:ycc:adminUserRole:id:" + cacheYccAdminUserRoleUserIdRoleIdPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*AdminUserRole, error) + FindOneByUserIdRoleId(ctx context.Context, userId string, roleId string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAdminUserRoleModel struct { @@ -57,14 +58,14 @@ type ( } AdminUserRole struct { - Id int64 `db:"id"` + Id string `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 + UserId string `db:"user_id"` + RoleId string `db:"role_id"` } ) @@ -77,21 +78,38 @@ func newAdminUserRoleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAdminUs func (m *defaultAdminUserRoleModel) Insert(ctx context.Context, session sqlx.Session, data *AdminUserRole) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserRoleIdPrefix, data.Id) - hmAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + m.insertUUID(data) + yccAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserRoleIdPrefix, data.Id) + yccAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminUserRoleUserIdRoleIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmAdminUserRoleIdKey, hmAdminUserRoleUserIdRoleIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.UserId, data.RoleId) + }, yccAdminUserRoleIdKey, yccAdminUserRoleUserIdRoleIdKey) +} +func (m *defaultAdminUserRoleModel) insertUUID(data *AdminUserRole) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAdminUserRoleModel) FindOne(ctx context.Context, id int64) (*AdminUserRole, error) { - hmAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserRoleIdPrefix, id) +func (m *defaultAdminUserRoleModel) FindOne(ctx context.Context, id string) (*AdminUserRole, error) { + yccAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserRoleIdPrefix, id) var resp AdminUserRole - err := m.QueryRowCtx(ctx, &resp, hmAdminUserRoleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAdminUserRoleIdKey, 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) }) @@ -105,10 +123,10 @@ func (m *defaultAdminUserRoleModel) FindOne(ctx context.Context, id int64) (*Adm } } -func (m *defaultAdminUserRoleModel) FindOneByUserIdRoleId(ctx context.Context, userId int64, roleId int64) (*AdminUserRole, error) { - hmAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminUserRoleUserIdRoleIdPrefix, userId, roleId) +func (m *defaultAdminUserRoleModel) FindOneByUserIdRoleId(ctx context.Context, userId string, roleId string) (*AdminUserRole, error) { + yccAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminUserRoleUserIdRoleIdPrefix, userId, roleId) var resp AdminUserRole - err := m.QueryRowIndexCtx(ctx, &resp, hmAdminUserRoleUserIdRoleIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccAdminUserRoleUserIdRoleIdKey, 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 @@ -130,15 +148,15 @@ func (m *defaultAdminUserRoleModel) Update(ctx context.Context, session sqlx.Ses if err != nil { return nil, err } - hmAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserRoleIdPrefix, data.Id) - hmAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + yccAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserRoleIdPrefix, data.Id) + yccAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminUserRoleUserIdRoleIdPrefix, 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) - }, hmAdminUserRoleIdKey, hmAdminUserRoleUserIdRoleIdKey) + }, yccAdminUserRoleIdKey, yccAdminUserRoleUserIdRoleIdKey) } func (m *defaultAdminUserRoleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AdminUserRole) error { @@ -153,15 +171,15 @@ func (m *defaultAdminUserRoleModel) UpdateWithVersion(ctx context.Context, sessi if err != nil { return err } - hmAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserRoleIdPrefix, data.Id) - hmAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + yccAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserRoleIdPrefix, data.Id) + yccAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminUserRoleUserIdRoleIdPrefix, 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) - }, hmAdminUserRoleIdKey, hmAdminUserRoleUserIdRoleIdKey) + }, yccAdminUserRoleIdKey, yccAdminUserRoleUserIdRoleIdKey) if err != nil { return err } @@ -378,25 +396,25 @@ func (m *defaultAdminUserRoleModel) Trans(ctx context.Context, fn func(ctx conte 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 { +func (m *defaultAdminUserRoleModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheHmAdminUserRoleIdPrefix, id) - hmAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheHmAdminUserRoleUserIdRoleIdPrefix, data.UserId, data.RoleId) + yccAdminUserRoleIdKey := fmt.Sprintf("%s%v", cacheYccAdminUserRoleIdPrefix, id) + yccAdminUserRoleUserIdRoleIdKey := fmt.Sprintf("%s%v:%v", cacheYccAdminUserRoleUserIdRoleIdPrefix, 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) - }, hmAdminUserRoleIdKey, hmAdminUserRoleUserIdRoleIdKey) + }, yccAdminUserRoleIdKey, yccAdminUserRoleUserIdRoleIdKey) return err } func (m *defaultAdminUserRoleModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAdminUserRoleIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAdminUserRoleIdPrefix, 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) diff --git a/app/main/model/agentCommissionModel_gen.go b/app/main/model/agentCommissionModel_gen.go index e1b643d..7b7cf99 100644 --- a/app/main/model/agentCommissionModel_gen.go +++ b/app/main/model/agentCommissionModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentCommissionFieldNames = builder.RawFieldNames(&AgentCommission{}) agentCommissionRows = strings.Join(agentCommissionFieldNames, ",") - agentCommissionRowsExpectAutoSet = strings.Join(stringx.Remove(agentCommissionFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentCommissionRowsExpectAutoSet = strings.Join(stringx.Remove(agentCommissionFieldNames, "`create_time`", "`update_time`"), ",") agentCommissionRowsWithPlaceHolder = strings.Join(stringx.Remove(agentCommissionFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentCommissionIdPrefix = "cache:ycc:agentCommission:id:" @@ -32,7 +34,7 @@ var ( type ( agentCommissionModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentCommission) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentCommission, error) + FindOne(ctx context.Context, id string) (*AgentCommission, error) Update(ctx context.Context, session sqlx.Session, data *AgentCommission) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentCommission) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -45,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommission, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentCommission, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentCommission, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentCommissionModel struct { @@ -54,10 +56,10 @@ type ( } AgentCommission struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID - OrderId int64 `db:"order_id"` // 订单ID - ProductId int64 `db:"product_id"` // 产品ID + Id string `db:"id"` + AgentId string `db:"agent_id"` + OrderId string `db:"order_id"` + ProductId string `db:"product_id"` Amount float64 `db:"amount"` // 佣金金额 Status int64 `db:"status"` // 状态:1=已发放,2=已冻结,3=已取消 CreateTime time.Time `db:"create_time"` // 创建时间 @@ -77,17 +79,34 @@ func newAgentCommissionModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgent func (m *defaultAgentCommissionModel) Insert(ctx context.Context, session sqlx.Session, data *AgentCommission) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheYccAgentCommissionIdPrefix, 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, agentCommissionRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentCommissionRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.ProductId, data.Amount, data.Status, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.OrderId, data.ProductId, data.Amount, data.Status, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.ProductId, data.Amount, data.Status, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.OrderId, data.ProductId, data.Amount, data.Status, data.DeleteTime, data.DelState, data.Version) }, yccAgentCommissionIdKey) } +func (m *defaultAgentCommissionModel) insertUUID(data *AgentCommission) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentCommissionModel) FindOne(ctx context.Context, id int64) (*AgentCommission, error) { +func (m *defaultAgentCommissionModel) FindOne(ctx context.Context, id string) (*AgentCommission, error) { yccAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheYccAgentCommissionIdPrefix, id) var resp AgentCommission err := m.QueryRowCtx(ctx, &resp, yccAgentCommissionIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -347,7 +366,7 @@ func (m *defaultAgentCommissionModel) Trans(ctx context.Context, fn func(ctx con func (m *defaultAgentCommissionModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentCommissionModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentCommissionModel) Delete(ctx context.Context, session sqlx.Session, id string) error { yccAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheYccAgentCommissionIdPrefix, 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) diff --git a/app/main/model/agentConfigModel_gen.go b/app/main/model/agentConfigModel_gen.go index d214dd2..5253075 100644 --- a/app/main/model/agentConfigModel_gen.go +++ b/app/main/model/agentConfigModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentConfigFieldNames = builder.RawFieldNames(&AgentConfig{}) agentConfigRows = strings.Join(agentConfigFieldNames, ",") - agentConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentConfigFieldNames, "`create_time`", "`update_time`"), ",") agentConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(agentConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentConfigIdPrefix = "cache:ycc:agentConfig:id:" @@ -33,7 +35,7 @@ var ( type ( agentConfigModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentConfig) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentConfig, error) + FindOne(ctx context.Context, id string) (*AgentConfig, error) FindOneByConfigKey(ctx context.Context, configKey string) (*AgentConfig, error) Update(ctx context.Context, session sqlx.Session, data *AgentConfig) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentConfig) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentConfig, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentConfig, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentConfig, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentConfigModel struct { @@ -56,7 +58,7 @@ type ( } AgentConfig struct { - Id int64 `db:"id"` // 主键ID + Id string `db:"id"` ConfigKey string `db:"config_key"` // 配置键 ConfigValue string `db:"config_value"` // 配置值 ConfigType string `db:"config_type"` // 配置类型:price=价格,bonus=等级加成,upgrade=升级费用,rebate=返佣,tax=税费 @@ -78,18 +80,35 @@ func newAgentConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentConf func (m *defaultAgentConfigModel) Insert(ctx context.Context, session sqlx.Session, data *AgentConfig) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheYccAgentConfigConfigKeyPrefix, data.ConfigKey) yccAgentConfigIdKey := fmt.Sprintf("%s%v", cacheYccAgentConfigIdPrefix, 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, agentConfigRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentConfigRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.ConfigKey, data.ConfigValue, data.ConfigType, data.Description, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.ConfigKey, data.ConfigValue, data.ConfigType, data.Description, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.ConfigKey, data.ConfigValue, data.ConfigType, data.Description, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.ConfigKey, data.ConfigValue, data.ConfigType, data.Description, data.DeleteTime, data.DelState, data.Version) }, yccAgentConfigConfigKeyKey, yccAgentConfigIdKey) } +func (m *defaultAgentConfigModel) insertUUID(data *AgentConfig) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentConfigModel) FindOne(ctx context.Context, id int64) (*AgentConfig, error) { +func (m *defaultAgentConfigModel) FindOne(ctx context.Context, id string) (*AgentConfig, error) { yccAgentConfigIdKey := fmt.Sprintf("%s%v", cacheYccAgentConfigIdPrefix, id) var resp AgentConfig err := m.QueryRowCtx(ctx, &resp, yccAgentConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -379,7 +398,7 @@ func (m *defaultAgentConfigModel) Trans(ctx context.Context, fn func(ctx context func (m *defaultAgentConfigModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentConfigModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentConfigModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentFreezeTaskModel_gen.go b/app/main/model/agentFreezeTaskModel_gen.go index 0b53fc7..50dfcfb 100644 --- a/app/main/model/agentFreezeTaskModel_gen.go +++ b/app/main/model/agentFreezeTaskModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentFreezeTaskFieldNames = builder.RawFieldNames(&AgentFreezeTask{}) agentFreezeTaskRows = strings.Join(agentFreezeTaskFieldNames, ",") - agentFreezeTaskRowsExpectAutoSet = strings.Join(stringx.Remove(agentFreezeTaskFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentFreezeTaskRowsExpectAutoSet = strings.Join(stringx.Remove(agentFreezeTaskFieldNames, "`create_time`", "`update_time`"), ",") agentFreezeTaskRowsWithPlaceHolder = strings.Join(stringx.Remove(agentFreezeTaskFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentFreezeTaskIdPrefix = "cache:ycc:agentFreezeTask:id:" @@ -32,7 +34,7 @@ var ( type ( agentFreezeTaskModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentFreezeTask) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentFreezeTask, error) + FindOne(ctx context.Context, id string) (*AgentFreezeTask, error) Update(ctx context.Context, session sqlx.Session, data *AgentFreezeTask) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentFreezeTask) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -45,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentFreezeTask, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentFreezeTask, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentFreezeTask, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentFreezeTaskModel struct { @@ -54,10 +56,10 @@ type ( } AgentFreezeTask struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID - OrderId int64 `db:"order_id"` // 订单ID - CommissionId int64 `db:"commission_id"` // 佣金记录ID + Id string `db:"id"` + AgentId string `db:"agent_id"` + OrderId string `db:"order_id"` + CommissionId string `db:"commission_id"` FreezeAmount float64 `db:"freeze_amount"` // 冻结金额 OrderPrice float64 `db:"order_price"` // 订单单价 FreezeRatio float64 `db:"freeze_ratio"` // 冻结比例(例如:0.1000表示10%) @@ -83,17 +85,34 @@ func newAgentFreezeTaskModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgent func (m *defaultAgentFreezeTaskModel) Insert(ctx context.Context, session sqlx.Session, data *AgentFreezeTask) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentFreezeTaskIdKey := fmt.Sprintf("%s%v", cacheYccAgentFreezeTaskIdPrefix, 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, agentFreezeTaskRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentFreezeTaskRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.CommissionId, data.FreezeAmount, data.OrderPrice, data.FreezeRatio, data.Status, data.FreezeTime, data.UnfreezeTime, data.ActualUnfreezeTime, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.OrderId, data.CommissionId, data.FreezeAmount, data.OrderPrice, data.FreezeRatio, data.Status, data.FreezeTime, data.UnfreezeTime, data.ActualUnfreezeTime, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.CommissionId, data.FreezeAmount, data.OrderPrice, data.FreezeRatio, data.Status, data.FreezeTime, data.UnfreezeTime, data.ActualUnfreezeTime, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.OrderId, data.CommissionId, data.FreezeAmount, data.OrderPrice, data.FreezeRatio, data.Status, data.FreezeTime, data.UnfreezeTime, data.ActualUnfreezeTime, data.Remark, data.DeleteTime, data.DelState, data.Version) }, yccAgentFreezeTaskIdKey) } +func (m *defaultAgentFreezeTaskModel) insertUUID(data *AgentFreezeTask) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentFreezeTaskModel) FindOne(ctx context.Context, id int64) (*AgentFreezeTask, error) { +func (m *defaultAgentFreezeTaskModel) FindOne(ctx context.Context, id string) (*AgentFreezeTask, error) { yccAgentFreezeTaskIdKey := fmt.Sprintf("%s%v", cacheYccAgentFreezeTaskIdPrefix, id) var resp AgentFreezeTask err := m.QueryRowCtx(ctx, &resp, yccAgentFreezeTaskIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -353,7 +372,7 @@ func (m *defaultAgentFreezeTaskModel) Trans(ctx context.Context, fn func(ctx con func (m *defaultAgentFreezeTaskModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentFreezeTaskModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentFreezeTaskModel) Delete(ctx context.Context, session sqlx.Session, id string) error { yccAgentFreezeTaskIdKey := fmt.Sprintf("%s%v", cacheYccAgentFreezeTaskIdPrefix, 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) diff --git a/app/main/model/agentInviteCodeModel_gen.go b/app/main/model/agentInviteCodeModel_gen.go index d515a54..c0b0025 100644 --- a/app/main/model/agentInviteCodeModel_gen.go +++ b/app/main/model/agentInviteCodeModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentInviteCodeFieldNames = builder.RawFieldNames(&AgentInviteCode{}) agentInviteCodeRows = strings.Join(agentInviteCodeFieldNames, ",") - agentInviteCodeRowsExpectAutoSet = strings.Join(stringx.Remove(agentInviteCodeFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentInviteCodeRowsExpectAutoSet = strings.Join(stringx.Remove(agentInviteCodeFieldNames, "`create_time`", "`update_time`"), ",") agentInviteCodeRowsWithPlaceHolder = strings.Join(stringx.Remove(agentInviteCodeFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentInviteCodeIdPrefix = "cache:ycc:agentInviteCode:id:" @@ -33,7 +35,7 @@ var ( type ( agentInviteCodeModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentInviteCode) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentInviteCode, error) + FindOne(ctx context.Context, id string) (*AgentInviteCode, error) FindOneByCode(ctx context.Context, code string) (*AgentInviteCode, error) Update(ctx context.Context, session sqlx.Session, data *AgentInviteCode) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentInviteCode) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentInviteCode, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentInviteCode, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentInviteCode, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentInviteCodeModel struct { @@ -56,21 +58,21 @@ type ( } AgentInviteCode struct { - Id int64 `db:"id"` // 主键ID - Code string `db:"code"` // 邀请码(唯一) - AgentId sql.NullInt64 `db:"agent_id"` // 发放代理ID(NULL表示平台发放的钻石邀请码) - TargetLevel int64 `db:"target_level"` // 目标等级:1=普通,2=黄金,3=钻石 - Status int64 `db:"status"` // 状态:0=未使用,1=已使用,2=已失效(所有邀请码只能使用一次,使用后立即失效) - UsedUserId sql.NullInt64 `db:"used_user_id"` // 使用用户ID - UsedAgentId sql.NullInt64 `db:"used_agent_id"` // 使用代理ID - UsedTime sql.NullTime `db:"used_time"` // 使用时间 - ExpireTime sql.NullTime `db:"expire_time"` // 过期时间(可选) - Remark sql.NullString `db:"remark"` // 备注 - 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"` // 版本号(乐观锁) + Id string `db:"id"` + Code string `db:"code"` // 邀请码(唯一) + AgentId sql.NullString `db:"agent_id"` + TargetLevel int64 `db:"target_level"` // 目标等级:1=普通,2=黄金,3=钻石 + Status int64 `db:"status"` // 状态:0=未使用,1=已使用,2=已失效(所有邀请码只能使用一次,使用后立即失效) + UsedUserId sql.NullString `db:"used_user_id"` + UsedAgentId sql.NullString `db:"used_agent_id"` + UsedTime sql.NullTime `db:"used_time"` // 使用时间 + ExpireTime sql.NullTime `db:"expire_time"` // 过期时间(可选) + Remark sql.NullString `db:"remark"` // 备注 + 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"` // 版本号(乐观锁) } ) @@ -83,18 +85,35 @@ func newAgentInviteCodeModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgent func (m *defaultAgentInviteCodeModel) Insert(ctx context.Context, session sqlx.Session, data *AgentInviteCode) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentInviteCodeCodeKey := fmt.Sprintf("%s%v", cacheYccAgentInviteCodeCodePrefix, data.Code) yccAgentInviteCodeIdKey := fmt.Sprintf("%s%v", cacheYccAgentInviteCodeIdPrefix, 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, agentInviteCodeRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentInviteCodeRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Code, data.AgentId, data.TargetLevel, data.Status, data.UsedUserId, data.UsedAgentId, data.UsedTime, data.ExpireTime, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.Code, data.AgentId, data.TargetLevel, data.Status, data.UsedUserId, data.UsedAgentId, data.UsedTime, data.ExpireTime, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.Code, data.AgentId, data.TargetLevel, data.Status, data.UsedUserId, data.UsedAgentId, data.UsedTime, data.ExpireTime, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.Code, data.AgentId, data.TargetLevel, data.Status, data.UsedUserId, data.UsedAgentId, data.UsedTime, data.ExpireTime, data.Remark, data.DeleteTime, data.DelState, data.Version) }, yccAgentInviteCodeCodeKey, yccAgentInviteCodeIdKey) } +func (m *defaultAgentInviteCodeModel) insertUUID(data *AgentInviteCode) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentInviteCodeModel) FindOne(ctx context.Context, id int64) (*AgentInviteCode, error) { +func (m *defaultAgentInviteCodeModel) FindOne(ctx context.Context, id string) (*AgentInviteCode, error) { yccAgentInviteCodeIdKey := fmt.Sprintf("%s%v", cacheYccAgentInviteCodeIdPrefix, id) var resp AgentInviteCode err := m.QueryRowCtx(ctx, &resp, yccAgentInviteCodeIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -384,7 +403,7 @@ func (m *defaultAgentInviteCodeModel) Trans(ctx context.Context, fn func(ctx con func (m *defaultAgentInviteCodeModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentInviteCodeModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentInviteCodeModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentInviteCodeUsageModel_gen.go b/app/main/model/agentInviteCodeUsageModel_gen.go index ebbe8c7..e9782e1 100644 --- a/app/main/model/agentInviteCodeUsageModel_gen.go +++ b/app/main/model/agentInviteCodeUsageModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentInviteCodeUsageFieldNames = builder.RawFieldNames(&AgentInviteCodeUsage{}) agentInviteCodeUsageRows = strings.Join(agentInviteCodeUsageFieldNames, ",") - agentInviteCodeUsageRowsExpectAutoSet = strings.Join(stringx.Remove(agentInviteCodeUsageFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentInviteCodeUsageRowsExpectAutoSet = strings.Join(stringx.Remove(agentInviteCodeUsageFieldNames, "`create_time`", "`update_time`"), ",") agentInviteCodeUsageRowsWithPlaceHolder = strings.Join(stringx.Remove(agentInviteCodeUsageFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentInviteCodeUsageIdPrefix = "cache:ycc:agentInviteCodeUsage:id:" @@ -32,7 +34,7 @@ var ( type ( agentInviteCodeUsageModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentInviteCodeUsage) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentInviteCodeUsage, error) + FindOne(ctx context.Context, id string) (*AgentInviteCodeUsage, error) Update(ctx context.Context, session sqlx.Session, data *AgentInviteCodeUsage) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentInviteCodeUsage) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -45,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentInviteCodeUsage, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentInviteCodeUsage, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentInviteCodeUsage, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentInviteCodeUsageModel struct { @@ -54,18 +56,18 @@ type ( } AgentInviteCodeUsage struct { - Id int64 `db:"id"` // 主键ID - InviteCodeId int64 `db:"invite_code_id"` // 邀请码ID(关联agent_invite_code表) - Code string `db:"code"` // 邀请码(冗余字段,便于查询) - UserId int64 `db:"user_id"` // 使用用户ID - AgentId int64 `db:"agent_id"` // 成为的代理ID - AgentLevel int64 `db:"agent_level"` // 代理等级:1=普通,2=黄金,3=钻石 - UsedTime time.Time `db:"used_time"` // 使用时间 - 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"` // 版本号(乐观锁) + Id string `db:"id"` + InviteCodeId string `db:"invite_code_id"` + Code string `db:"code"` // 邀请码(冗余字段,便于查询) + UserId string `db:"user_id"` + AgentId string `db:"agent_id"` + AgentLevel int64 `db:"agent_level"` // 代理等级:1=普通,2=黄金,3=钻石 + UsedTime time.Time `db:"used_time"` // 使用时间 + 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"` // 版本号(乐观锁) } ) @@ -78,17 +80,34 @@ func newAgentInviteCodeUsageModel(conn sqlx.SqlConn, c cache.CacheConf) *default func (m *defaultAgentInviteCodeUsageModel) Insert(ctx context.Context, session sqlx.Session, data *AgentInviteCodeUsage) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentInviteCodeUsageIdKey := fmt.Sprintf("%s%v", cacheYccAgentInviteCodeUsageIdPrefix, 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, agentInviteCodeUsageRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentInviteCodeUsageRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.InviteCodeId, data.Code, data.UserId, data.AgentId, data.AgentLevel, data.UsedTime, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.InviteCodeId, data.Code, data.UserId, data.AgentId, data.AgentLevel, data.UsedTime, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.InviteCodeId, data.Code, data.UserId, data.AgentId, data.AgentLevel, data.UsedTime, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.InviteCodeId, data.Code, data.UserId, data.AgentId, data.AgentLevel, data.UsedTime, data.DeleteTime, data.DelState, data.Version) }, yccAgentInviteCodeUsageIdKey) } +func (m *defaultAgentInviteCodeUsageModel) insertUUID(data *AgentInviteCodeUsage) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentInviteCodeUsageModel) FindOne(ctx context.Context, id int64) (*AgentInviteCodeUsage, error) { +func (m *defaultAgentInviteCodeUsageModel) FindOne(ctx context.Context, id string) (*AgentInviteCodeUsage, error) { yccAgentInviteCodeUsageIdKey := fmt.Sprintf("%s%v", cacheYccAgentInviteCodeUsageIdPrefix, id) var resp AgentInviteCodeUsage err := m.QueryRowCtx(ctx, &resp, yccAgentInviteCodeUsageIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -348,7 +367,7 @@ func (m *defaultAgentInviteCodeUsageModel) Trans(ctx context.Context, fn func(ct func (m *defaultAgentInviteCodeUsageModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentInviteCodeUsageModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentInviteCodeUsageModel) Delete(ctx context.Context, session sqlx.Session, id string) error { yccAgentInviteCodeUsageIdKey := fmt.Sprintf("%s%v", cacheYccAgentInviteCodeUsageIdPrefix, 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) diff --git a/app/main/model/agentLinkModel_gen.go b/app/main/model/agentLinkModel_gen.go index 013c353..b53974d 100644 --- a/app/main/model/agentLinkModel_gen.go +++ b/app/main/model/agentLinkModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentLinkFieldNames = builder.RawFieldNames(&AgentLink{}) agentLinkRows = strings.Join(agentLinkFieldNames, ",") - agentLinkRowsExpectAutoSet = strings.Join(stringx.Remove(agentLinkFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentLinkRowsExpectAutoSet = strings.Join(stringx.Remove(agentLinkFieldNames, "`create_time`", "`update_time`"), ",") agentLinkRowsWithPlaceHolder = strings.Join(stringx.Remove(agentLinkFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentLinkIdPrefix = "cache:ycc:agentLink:id:" @@ -34,8 +36,8 @@ var ( type ( agentLinkModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentLink) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentLink, error) - FindOneByAgentIdProductIdSetPriceDelState(ctx context.Context, agentId int64, productId int64, setPrice float64, delState int64) (*AgentLink, error) + FindOne(ctx context.Context, id string) (*AgentLink, error) + FindOneByAgentIdProductIdSetPriceDelState(ctx context.Context, agentId string, productId string, setPrice float64, delState int64) (*AgentLink, error) FindOneByLinkIdentifier(ctx context.Context, linkIdentifier string) (*AgentLink, error) Update(ctx context.Context, session sqlx.Session, data *AgentLink) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentLink) error @@ -49,7 +51,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentLink, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentLink, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentLink, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentLinkModel struct { @@ -58,10 +60,10 @@ type ( } AgentLink struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID - UserId int64 `db:"user_id"` // 用户ID - ProductId int64 `db:"product_id"` // 产品ID + Id string `db:"id"` + AgentId string `db:"agent_id"` + UserId string `db:"user_id"` + ProductId string `db:"product_id"` LinkIdentifier string `db:"link_identifier"` // 推广链接标识(加密) SetPrice float64 `db:"set_price"` // 代理设定价格 ActualBasePrice float64 `db:"actual_base_price"` // 实际底价(基础底价+等级加成) @@ -82,19 +84,36 @@ func newAgentLinkModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentLinkMo func (m *defaultAgentLinkModel) Insert(ctx context.Context, session sqlx.Session, data *AgentLink) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentLinkAgentIdProductIdSetPriceDelStateKey := fmt.Sprintf("%s%v:%v:%v:%v", cacheYccAgentLinkAgentIdProductIdSetPriceDelStatePrefix, data.AgentId, data.ProductId, data.SetPrice, data.DelState) yccAgentLinkIdKey := fmt.Sprintf("%s%v", cacheYccAgentLinkIdPrefix, data.Id) yccAgentLinkLinkIdentifierKey := fmt.Sprintf("%s%v", cacheYccAgentLinkLinkIdentifierPrefix, data.LinkIdentifier) 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, agentLinkRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentLinkRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.UserId, data.ProductId, data.LinkIdentifier, data.SetPrice, data.ActualBasePrice, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.UserId, data.ProductId, data.LinkIdentifier, data.SetPrice, data.ActualBasePrice, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.UserId, data.ProductId, data.LinkIdentifier, data.SetPrice, data.ActualBasePrice, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.UserId, data.ProductId, data.LinkIdentifier, data.SetPrice, data.ActualBasePrice, data.DeleteTime, data.DelState, data.Version) }, yccAgentLinkAgentIdProductIdSetPriceDelStateKey, yccAgentLinkIdKey, yccAgentLinkLinkIdentifierKey) } +func (m *defaultAgentLinkModel) insertUUID(data *AgentLink) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentLinkModel) FindOne(ctx context.Context, id int64) (*AgentLink, error) { +func (m *defaultAgentLinkModel) FindOne(ctx context.Context, id string) (*AgentLink, error) { yccAgentLinkIdKey := fmt.Sprintf("%s%v", cacheYccAgentLinkIdPrefix, id) var resp AgentLink err := m.QueryRowCtx(ctx, &resp, yccAgentLinkIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -111,7 +130,7 @@ func (m *defaultAgentLinkModel) FindOne(ctx context.Context, id int64) (*AgentLi } } -func (m *defaultAgentLinkModel) FindOneByAgentIdProductIdSetPriceDelState(ctx context.Context, agentId int64, productId int64, setPrice float64, delState int64) (*AgentLink, error) { +func (m *defaultAgentLinkModel) FindOneByAgentIdProductIdSetPriceDelState(ctx context.Context, agentId string, productId string, setPrice float64, delState int64) (*AgentLink, error) { yccAgentLinkAgentIdProductIdSetPriceDelStateKey := fmt.Sprintf("%s%v:%v:%v:%v", cacheYccAgentLinkAgentIdProductIdSetPriceDelStatePrefix, agentId, productId, setPrice, delState) var resp AgentLink err := m.QueryRowIndexCtx(ctx, &resp, yccAgentLinkAgentIdProductIdSetPriceDelStateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -406,7 +425,7 @@ func (m *defaultAgentLinkModel) Trans(ctx context.Context, fn func(ctx context.C func (m *defaultAgentLinkModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentLinkModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentLinkModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentModel_gen.go b/app/main/model/agentModel_gen.go index d209c2f..7acbd24 100644 --- a/app/main/model/agentModel_gen.go +++ b/app/main/model/agentModel_gen.go @@ -8,34 +8,37 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( agentFieldNames = builder.RawFieldNames(&Agent{}) agentRows = strings.Join(agentFieldNames, ",") - agentRowsExpectAutoSet = strings.Join(stringx.Remove(agentFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentRowsExpectAutoSet = strings.Join(stringx.Remove(agentFieldNames, "`create_time`", "`update_time`"), ",") agentRowsWithPlaceHolder = strings.Join(stringx.Remove(agentFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheYccAgentIdPrefix = "cache:ycc:agent:id:" - cacheYccAgentUserIdPrefix = "cache:ycc:agent:userId:" + cacheYccAgentIdPrefix = "cache:ycc:agent:id:" + cacheYccAgentAgentCodePrefix = "cache:ycc:agent:agentCode:" + cacheYccAgentUserIdPrefix = "cache:ycc:agent:userId:" ) type ( agentModel interface { Insert(ctx context.Context, session sqlx.Session, data *Agent) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Agent, error) - FindOneByUserId(ctx context.Context, userId int64) (*Agent, error) + FindOne(ctx context.Context, id string) (*Agent, error) + FindOneByAgentCode(ctx context.Context, agentCode int64) (*Agent, error) + FindOneByUserId(ctx context.Context, userId string) (*Agent, error) Update(ctx context.Context, session sqlx.Session, data *Agent) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Agent) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -48,7 +51,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Agent, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Agent, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Agent, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentModel struct { @@ -57,18 +60,20 @@ type ( } Agent struct { - Id int64 `db:"id"` // 主键ID - UserId int64 `db:"user_id"` // 用户ID - Level int64 `db:"level"` // 代理等级:1=普通,2=黄金,3=钻石 - Region sql.NullString `db:"region"` // 区域(可选) - Mobile string `db:"mobile"` // 手机号(加密) - WechatId sql.NullString `db:"wechat_id"` // 微信号 - TeamLeaderId sql.NullInt64 `db:"team_leader_id"` // 团队首领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"` // 版本号(乐观锁) + Id string `db:"id"` + UserId string `db:"user_id"` + AgentCode int64 `db:"agent_code"` // 代理编码(从16800开始递增) + Level int64 `db:"level"` // 代理等级:1=普通,2=黄金,3=钻石 + Region sql.NullString `db:"region"` // 区域(可选) + Mobile string `db:"mobile"` // 手机号(加密) + WechatId sql.NullString `db:"wechat_id"` // 微信号 + TeamLeaderId sql.NullString `db:"team_leader_id"` + InviteCodeId sql.NullString `db:"invite_code_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"` // 版本号(乐观锁) } ) @@ -81,18 +86,36 @@ func newAgentModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentModel { func (m *defaultAgentModel) Insert(ctx context.Context, session sqlx.Session, data *Agent) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) + yccAgentAgentCodeKey := fmt.Sprintf("%s%v", cacheYccAgentAgentCodePrefix, data.AgentCode) yccAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentIdPrefix, data.Id) yccAgentUserIdKey := fmt.Sprintf("%s%v", cacheYccAgentUserIdPrefix, 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, agentRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.UserId, data.Level, data.Region, data.Mobile, data.WechatId, data.TeamLeaderId, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.UserId, data.AgentCode, data.Level, data.Region, data.Mobile, data.WechatId, data.TeamLeaderId, data.InviteCodeId, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.UserId, data.Level, data.Region, data.Mobile, data.WechatId, data.TeamLeaderId, data.DeleteTime, data.DelState, data.Version) - }, yccAgentIdKey, yccAgentUserIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.UserId, data.AgentCode, data.Level, data.Region, data.Mobile, data.WechatId, data.TeamLeaderId, data.InviteCodeId, data.DeleteTime, data.DelState, data.Version) + }, yccAgentAgentCodeKey, yccAgentIdKey, yccAgentUserIdKey) +} +func (m *defaultAgentModel) insertUUID(data *Agent) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAgentModel) FindOne(ctx context.Context, id int64) (*Agent, error) { +func (m *defaultAgentModel) FindOne(ctx context.Context, id string) (*Agent, error) { yccAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentIdPrefix, id) var resp Agent err := m.QueryRowCtx(ctx, &resp, yccAgentIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -109,7 +132,27 @@ func (m *defaultAgentModel) FindOne(ctx context.Context, id int64) (*Agent, erro } } -func (m *defaultAgentModel) FindOneByUserId(ctx context.Context, userId int64) (*Agent, error) { +func (m *defaultAgentModel) FindOneByAgentCode(ctx context.Context, agentCode int64) (*Agent, error) { + yccAgentAgentCodeKey := fmt.Sprintf("%s%v", cacheYccAgentAgentCodePrefix, agentCode) + var resp Agent + err := m.QueryRowIndexCtx(ctx, &resp, yccAgentAgentCodeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `agent_code` = ? and del_state = ? limit 1", agentRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, agentCode, 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 *defaultAgentModel) FindOneByUserId(ctx context.Context, userId string) (*Agent, error) { yccAgentUserIdKey := fmt.Sprintf("%s%v", cacheYccAgentUserIdPrefix, userId) var resp Agent err := m.QueryRowIndexCtx(ctx, &resp, yccAgentUserIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -134,15 +177,16 @@ func (m *defaultAgentModel) Update(ctx context.Context, session sqlx.Session, ne if err != nil { return nil, err } + yccAgentAgentCodeKey := fmt.Sprintf("%s%v", cacheYccAgentAgentCodePrefix, data.AgentCode) yccAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentIdPrefix, data.Id) yccAgentUserIdKey := fmt.Sprintf("%s%v", cacheYccAgentUserIdPrefix, 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, agentRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.UserId, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + return session.ExecCtx(ctx, query, newData.UserId, newData.AgentCode, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.InviteCodeId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) } - return conn.ExecCtx(ctx, query, newData.UserId, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) - }, yccAgentIdKey, yccAgentUserIdKey) + return conn.ExecCtx(ctx, query, newData.UserId, newData.AgentCode, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.InviteCodeId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, yccAgentAgentCodeKey, yccAgentIdKey, yccAgentUserIdKey) } func (m *defaultAgentModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Agent) error { @@ -157,15 +201,16 @@ func (m *defaultAgentModel) UpdateWithVersion(ctx context.Context, session sqlx. if err != nil { return err } + yccAgentAgentCodeKey := fmt.Sprintf("%s%v", cacheYccAgentAgentCodePrefix, data.AgentCode) yccAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentIdPrefix, data.Id) yccAgentUserIdKey := fmt.Sprintf("%s%v", cacheYccAgentUserIdPrefix, 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, agentRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.UserId, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + return session.ExecCtx(ctx, query, newData.UserId, newData.AgentCode, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.InviteCodeId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) } - return conn.ExecCtx(ctx, query, newData.UserId, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) - }, yccAgentIdKey, yccAgentUserIdKey) + return conn.ExecCtx(ctx, query, newData.UserId, newData.AgentCode, newData.Level, newData.Region, newData.Mobile, newData.WechatId, newData.TeamLeaderId, newData.InviteCodeId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, yccAgentAgentCodeKey, yccAgentIdKey, yccAgentUserIdKey) if err != nil { return err } @@ -382,12 +427,13 @@ func (m *defaultAgentModel) Trans(ctx context.Context, fn func(ctx context.Conte func (m *defaultAgentModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } + yccAgentAgentCodeKey := fmt.Sprintf("%s%v", cacheYccAgentAgentCodePrefix, data.AgentCode) yccAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentIdPrefix, id) yccAgentUserIdKey := fmt.Sprintf("%s%v", cacheYccAgentUserIdPrefix, data.UserId) _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { @@ -396,7 +442,7 @@ func (m *defaultAgentModel) Delete(ctx context.Context, session sqlx.Session, id return session.ExecCtx(ctx, query, id) } return conn.ExecCtx(ctx, query, id) - }, yccAgentIdKey, yccAgentUserIdKey) + }, yccAgentAgentCodeKey, yccAgentIdKey, yccAgentUserIdKey) return err } func (m *defaultAgentModel) formatPrimary(primary interface{}) string { diff --git a/app/main/model/agentOrderModel_gen.go b/app/main/model/agentOrderModel_gen.go index c84fc49..cd7eae4 100644 --- a/app/main/model/agentOrderModel_gen.go +++ b/app/main/model/agentOrderModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentOrderFieldNames = builder.RawFieldNames(&AgentOrder{}) agentOrderRows = strings.Join(agentOrderFieldNames, ",") - agentOrderRowsExpectAutoSet = strings.Join(stringx.Remove(agentOrderFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentOrderRowsExpectAutoSet = strings.Join(stringx.Remove(agentOrderFieldNames, "`create_time`", "`update_time`"), ",") agentOrderRowsWithPlaceHolder = strings.Join(stringx.Remove(agentOrderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentOrderIdPrefix = "cache:ycc:agentOrder:id:" @@ -33,8 +35,8 @@ var ( type ( agentOrderModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentOrder) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentOrder, error) - FindOneByOrderId(ctx context.Context, orderId int64) (*AgentOrder, error) + FindOne(ctx context.Context, id string) (*AgentOrder, error) + FindOneByOrderId(ctx context.Context, orderId string) (*AgentOrder, error) Update(ctx context.Context, session sqlx.Session, data *AgentOrder) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentOrder) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentOrder, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentOrder, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentOrder, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentOrderModel struct { @@ -56,10 +58,10 @@ type ( } AgentOrder struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID - OrderId int64 `db:"order_id"` // 订单ID - ProductId int64 `db:"product_id"` // 产品ID + Id string `db:"id"` + AgentId string `db:"agent_id"` + OrderId string `db:"order_id"` + ProductId string `db:"product_id"` OrderAmount float64 `db:"order_amount"` // 订单金额(用户实际支付金额,冗余字段) SetPrice float64 `db:"set_price"` // 代理设定价格 ActualBasePrice float64 `db:"actual_base_price"` // 实际底价(基础底价+等级加成) @@ -85,18 +87,35 @@ func newAgentOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentOrder func (m *defaultAgentOrderModel) Insert(ctx context.Context, session sqlx.Session, data *AgentOrder) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentOrderIdKey := fmt.Sprintf("%s%v", cacheYccAgentOrderIdPrefix, data.Id) yccAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheYccAgentOrderOrderIdPrefix, 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, agentOrderRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentOrderRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.ProductId, data.OrderAmount, data.SetPrice, data.ActualBasePrice, data.PriceCost, data.AgentProfit, data.ProcessStatus, data.ProcessTime, data.ProcessRemark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.OrderId, data.ProductId, data.OrderAmount, data.SetPrice, data.ActualBasePrice, data.PriceCost, data.AgentProfit, data.ProcessStatus, data.ProcessTime, data.ProcessRemark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.ProductId, data.OrderAmount, data.SetPrice, data.ActualBasePrice, data.PriceCost, data.AgentProfit, data.ProcessStatus, data.ProcessTime, data.ProcessRemark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.OrderId, data.ProductId, data.OrderAmount, data.SetPrice, data.ActualBasePrice, data.PriceCost, data.AgentProfit, data.ProcessStatus, data.ProcessTime, data.ProcessRemark, data.DeleteTime, data.DelState, data.Version) }, yccAgentOrderIdKey, yccAgentOrderOrderIdKey) } +func (m *defaultAgentOrderModel) insertUUID(data *AgentOrder) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentOrderModel) FindOne(ctx context.Context, id int64) (*AgentOrder, error) { +func (m *defaultAgentOrderModel) FindOne(ctx context.Context, id string) (*AgentOrder, error) { yccAgentOrderIdKey := fmt.Sprintf("%s%v", cacheYccAgentOrderIdPrefix, id) var resp AgentOrder err := m.QueryRowCtx(ctx, &resp, yccAgentOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -113,7 +132,7 @@ func (m *defaultAgentOrderModel) FindOne(ctx context.Context, id int64) (*AgentO } } -func (m *defaultAgentOrderModel) FindOneByOrderId(ctx context.Context, orderId int64) (*AgentOrder, error) { +func (m *defaultAgentOrderModel) FindOneByOrderId(ctx context.Context, orderId string) (*AgentOrder, error) { yccAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheYccAgentOrderOrderIdPrefix, orderId) var resp AgentOrder err := m.QueryRowIndexCtx(ctx, &resp, yccAgentOrderOrderIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -386,7 +405,7 @@ func (m *defaultAgentOrderModel) Trans(ctx context.Context, fn func(ctx context. func (m *defaultAgentOrderModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentOrderModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentProductConfigModel_gen.go b/app/main/model/agentProductConfigModel_gen.go index 6c81aec..91fb36a 100644 --- a/app/main/model/agentProductConfigModel_gen.go +++ b/app/main/model/agentProductConfigModel_gen.go @@ -8,22 +8,25 @@ import ( "fmt" "strings" + "reflect" "time" + "ycc-server/common/globalkey" + "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" - "ycc-server/common/globalkey" ) var ( agentProductConfigFieldNames = builder.RawFieldNames(&AgentProductConfig{}) agentProductConfigRows = strings.Join(agentProductConfigFieldNames, ",") - agentProductConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentProductConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentProductConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentProductConfigFieldNames, "`create_time`", "`update_time`"), ",") agentProductConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(agentProductConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentProductConfigIdPrefix = "cache:ycc:agentProductConfig:id:" @@ -33,8 +36,8 @@ var ( type ( agentProductConfigModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentProductConfig) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentProductConfig, error) - FindOneByProductId(ctx context.Context, productId int64) (*AgentProductConfig, error) + FindOne(ctx context.Context, id string) (*AgentProductConfig, error) + FindOneByProductId(ctx context.Context, productId string) (*AgentProductConfig, error) Update(ctx context.Context, session sqlx.Session, data *AgentProductConfig) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentProductConfig) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -47,7 +50,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentProductConfig, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentProductConfig, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentProductConfig, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentProductConfigModel struct { @@ -56,8 +59,8 @@ type ( } AgentProductConfig struct { - Id int64 `db:"id"` // 主键ID - ProductId int64 `db:"product_id"` // 产品ID + Id string `db:"id"` + ProductId string `db:"product_id"` BasePrice float64 `db:"base_price"` // 基础底价(BasePrice) SystemMaxPrice float64 `db:"system_max_price"` // 系统价格上限(SystemMaxPrice) PriceThreshold sql.NullFloat64 `db:"price_threshold"` // 提价标准阈值(PriceThreshold) @@ -79,18 +82,35 @@ func newAgentProductConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAg func (m *defaultAgentProductConfigModel) Insert(ctx context.Context, session sqlx.Session, data *AgentProductConfig) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheYccAgentProductConfigIdPrefix, data.Id) yccAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheYccAgentProductConfigProductIdPrefix, data.ProductId) 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, agentProductConfigRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentProductConfigRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.ProductId, data.BasePrice, data.SystemMaxPrice, data.PriceThreshold, data.PriceFeeRate, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.ProductId, data.BasePrice, data.SystemMaxPrice, data.PriceThreshold, data.PriceFeeRate, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.ProductId, data.BasePrice, data.SystemMaxPrice, data.PriceThreshold, data.PriceFeeRate, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.ProductId, data.BasePrice, data.SystemMaxPrice, data.PriceThreshold, data.PriceFeeRate, data.DeleteTime, data.DelState, data.Version) }, yccAgentProductConfigIdKey, yccAgentProductConfigProductIdKey) } +func (m *defaultAgentProductConfigModel) insertUUID(data *AgentProductConfig) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentProductConfigModel) FindOne(ctx context.Context, id int64) (*AgentProductConfig, error) { +func (m *defaultAgentProductConfigModel) FindOne(ctx context.Context, id string) (*AgentProductConfig, error) { yccAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheYccAgentProductConfigIdPrefix, id) var resp AgentProductConfig err := m.QueryRowCtx(ctx, &resp, yccAgentProductConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -107,7 +127,7 @@ func (m *defaultAgentProductConfigModel) FindOne(ctx context.Context, id int64) } } -func (m *defaultAgentProductConfigModel) FindOneByProductId(ctx context.Context, productId int64) (*AgentProductConfig, error) { +func (m *defaultAgentProductConfigModel) FindOneByProductId(ctx context.Context, productId string) (*AgentProductConfig, error) { yccAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheYccAgentProductConfigProductIdPrefix, productId) var resp AgentProductConfig err := m.QueryRowIndexCtx(ctx, &resp, yccAgentProductConfigProductIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -380,7 +400,7 @@ func (m *defaultAgentProductConfigModel) Trans(ctx context.Context, fn func(ctx func (m *defaultAgentProductConfigModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentProductConfigModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentProductConfigModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentRealNameModel_gen.go b/app/main/model/agentRealNameModel_gen.go index 942a738..0c2ad32 100644 --- a/app/main/model/agentRealNameModel_gen.go +++ b/app/main/model/agentRealNameModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentRealNameFieldNames = builder.RawFieldNames(&AgentRealName{}) agentRealNameRows = strings.Join(agentRealNameFieldNames, ",") - agentRealNameRowsExpectAutoSet = strings.Join(stringx.Remove(agentRealNameFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentRealNameRowsExpectAutoSet = strings.Join(stringx.Remove(agentRealNameFieldNames, "`create_time`", "`update_time`"), ",") agentRealNameRowsWithPlaceHolder = strings.Join(stringx.Remove(agentRealNameFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentRealNameIdPrefix = "cache:ycc:agentRealName:id:" @@ -33,8 +35,8 @@ var ( type ( agentRealNameModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentRealName) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentRealName, error) - FindOneByAgentId(ctx context.Context, agentId int64) (*AgentRealName, error) + FindOne(ctx context.Context, id string) (*AgentRealName, error) + FindOneByAgentId(ctx context.Context, agentId string) (*AgentRealName, error) Update(ctx context.Context, session sqlx.Session, data *AgentRealName) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentRealName) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRealName, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentRealName, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentRealName, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentRealNameModel struct { @@ -56,8 +58,8 @@ type ( } AgentRealName struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID + Id string `db:"id"` + AgentId string `db:"agent_id"` Name string `db:"name"` // 真实姓名 IdCard string `db:"id_card"` // 身份证号(加密) Mobile string `db:"mobile"` // 手机号(加密) @@ -79,18 +81,35 @@ func newAgentRealNameModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentRe func (m *defaultAgentRealNameModel) Insert(ctx context.Context, session sqlx.Session, data *AgentRealName) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentRealNameAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentRealNameAgentIdPrefix, data.AgentId) yccAgentRealNameIdKey := fmt.Sprintf("%s%v", cacheYccAgentRealNameIdPrefix, 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, agentRealNameRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentRealNameRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.Name, data.IdCard, data.Mobile, data.VerifyTime, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.Name, data.IdCard, data.Mobile, data.VerifyTime, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.Name, data.IdCard, data.Mobile, data.VerifyTime, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.Name, data.IdCard, data.Mobile, data.VerifyTime, data.DeleteTime, data.DelState, data.Version) }, yccAgentRealNameAgentIdKey, yccAgentRealNameIdKey) } +func (m *defaultAgentRealNameModel) insertUUID(data *AgentRealName) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentRealNameModel) FindOne(ctx context.Context, id int64) (*AgentRealName, error) { +func (m *defaultAgentRealNameModel) FindOne(ctx context.Context, id string) (*AgentRealName, error) { yccAgentRealNameIdKey := fmt.Sprintf("%s%v", cacheYccAgentRealNameIdPrefix, id) var resp AgentRealName err := m.QueryRowCtx(ctx, &resp, yccAgentRealNameIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -107,7 +126,7 @@ func (m *defaultAgentRealNameModel) FindOne(ctx context.Context, id int64) (*Age } } -func (m *defaultAgentRealNameModel) FindOneByAgentId(ctx context.Context, agentId int64) (*AgentRealName, error) { +func (m *defaultAgentRealNameModel) FindOneByAgentId(ctx context.Context, agentId string) (*AgentRealName, error) { yccAgentRealNameAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentRealNameAgentIdPrefix, agentId) var resp AgentRealName err := m.QueryRowIndexCtx(ctx, &resp, yccAgentRealNameAgentIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -380,7 +399,7 @@ func (m *defaultAgentRealNameModel) Trans(ctx context.Context, fn func(ctx conte func (m *defaultAgentRealNameModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentRealNameModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentRealNameModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentRebateModel_gen.go b/app/main/model/agentRebateModel_gen.go index eb5e1b3..c5acc10 100644 --- a/app/main/model/agentRebateModel_gen.go +++ b/app/main/model/agentRebateModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentRebateFieldNames = builder.RawFieldNames(&AgentRebate{}) agentRebateRows = strings.Join(agentRebateFieldNames, ",") - agentRebateRowsExpectAutoSet = strings.Join(stringx.Remove(agentRebateFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentRebateRowsExpectAutoSet = strings.Join(stringx.Remove(agentRebateFieldNames, "`create_time`", "`update_time`"), ",") agentRebateRowsWithPlaceHolder = strings.Join(stringx.Remove(agentRebateFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentRebateIdPrefix = "cache:ycc:agentRebate:id:" @@ -32,7 +34,7 @@ var ( type ( agentRebateModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentRebate) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentRebate, error) + FindOne(ctx context.Context, id string) (*AgentRebate, error) Update(ctx context.Context, session sqlx.Session, data *AgentRebate) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentRebate) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -45,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRebate, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentRebate, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentRebate, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentRebateModel struct { @@ -54,20 +56,20 @@ type ( } AgentRebate struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 获得返佣的代理ID - SourceAgentId int64 `db:"source_agent_id"` // 来源代理ID(推广订单的代理) - OrderId int64 `db:"order_id"` // 订单ID - ProductId int64 `db:"product_id"` // 产品ID - RebateType int64 `db:"rebate_type"` // 返佣类型:1=直接上级返佣,2=钻石上级返佣,3=黄金上级返佣 - LevelBonus float64 `db:"level_bonus"` // 等级加成金额(来源代理的等级加成) - RebateAmount float64 `db:"rebate_amount"` // 返佣金额 - Status int64 `db:"status"` // 状态:1=已发放,2=已冻结,3=已取消 - 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"` // 版本号(乐观锁) + Id string `db:"id"` + AgentId string `db:"agent_id"` + SourceAgentId string `db:"source_agent_id"` + OrderId string `db:"order_id"` + ProductId string `db:"product_id"` + RebateType int64 `db:"rebate_type"` // 返佣类型:1=直接上级返佣,2=钻石上级返佣,3=黄金上级返佣 + LevelBonus float64 `db:"level_bonus"` // 等级加成金额(来源代理的等级加成) + RebateAmount float64 `db:"rebate_amount"` // 返佣金额 + Status int64 `db:"status"` // 状态:1=已发放,2=已冻结,3=已取消 + 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"` // 版本号(乐观锁) } ) @@ -80,17 +82,34 @@ func newAgentRebateModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentReba func (m *defaultAgentRebateModel) Insert(ctx context.Context, session sqlx.Session, data *AgentRebate) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentRebateIdKey := fmt.Sprintf("%s%v", cacheYccAgentRebateIdPrefix, 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, agentRebateRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentRebateRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.SourceAgentId, data.OrderId, data.ProductId, data.RebateType, data.LevelBonus, data.RebateAmount, data.Status, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.SourceAgentId, data.OrderId, data.ProductId, data.RebateType, data.LevelBonus, data.RebateAmount, data.Status, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.SourceAgentId, data.OrderId, data.ProductId, data.RebateType, data.LevelBonus, data.RebateAmount, data.Status, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.SourceAgentId, data.OrderId, data.ProductId, data.RebateType, data.LevelBonus, data.RebateAmount, data.Status, data.DeleteTime, data.DelState, data.Version) }, yccAgentRebateIdKey) } +func (m *defaultAgentRebateModel) insertUUID(data *AgentRebate) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentRebateModel) FindOne(ctx context.Context, id int64) (*AgentRebate, error) { +func (m *defaultAgentRebateModel) FindOne(ctx context.Context, id string) (*AgentRebate, error) { yccAgentRebateIdKey := fmt.Sprintf("%s%v", cacheYccAgentRebateIdPrefix, id) var resp AgentRebate err := m.QueryRowCtx(ctx, &resp, yccAgentRebateIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -350,7 +369,7 @@ func (m *defaultAgentRebateModel) Trans(ctx context.Context, fn func(ctx context func (m *defaultAgentRebateModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentRebateModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentRebateModel) Delete(ctx context.Context, session sqlx.Session, id string) error { yccAgentRebateIdKey := fmt.Sprintf("%s%v", cacheYccAgentRebateIdPrefix, 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) diff --git a/app/main/model/agentRelationModel_gen.go b/app/main/model/agentRelationModel_gen.go index 2fea6fa..2e7384c 100644 --- a/app/main/model/agentRelationModel_gen.go +++ b/app/main/model/agentRelationModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentRelationFieldNames = builder.RawFieldNames(&AgentRelation{}) agentRelationRows = strings.Join(agentRelationFieldNames, ",") - agentRelationRowsExpectAutoSet = strings.Join(stringx.Remove(agentRelationFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentRelationRowsExpectAutoSet = strings.Join(stringx.Remove(agentRelationFieldNames, "`create_time`", "`update_time`"), ",") agentRelationRowsWithPlaceHolder = strings.Join(stringx.Remove(agentRelationFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentRelationIdPrefix = "cache:ycc:agentRelation:id:" @@ -33,8 +35,8 @@ var ( type ( agentRelationModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentRelation) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentRelation, error) - FindOneByParentIdChildIdRelationType(ctx context.Context, parentId int64, childId int64, relationType int64) (*AgentRelation, error) + FindOne(ctx context.Context, id string) (*AgentRelation, error) + FindOneByParentIdChildIdRelationType(ctx context.Context, parentId string, childId string, relationType int64) (*AgentRelation, error) Update(ctx context.Context, session sqlx.Session, data *AgentRelation) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentRelation) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRelation, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentRelation, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentRelation, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentRelationModel struct { @@ -56,9 +58,9 @@ type ( } AgentRelation struct { - Id int64 `db:"id"` // 主键ID - ParentId int64 `db:"parent_id"` // 上级代理ID - ChildId int64 `db:"child_id"` // 下级代理ID + Id string `db:"id"` + ParentId string `db:"parent_id"` + ChildId string `db:"child_id"` RelationType int64 `db:"relation_type"` // 关系类型:1=直接关系,2=已脱离(历史记录) DetachReason sql.NullString `db:"detach_reason"` // 脱离原因:upgrade=升级脱离 DetachTime sql.NullTime `db:"detach_time"` // 脱离时间 @@ -79,18 +81,35 @@ func newAgentRelationModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentRe func (m *defaultAgentRelationModel) Insert(ctx context.Context, session sqlx.Session, data *AgentRelation) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentRelationIdKey := fmt.Sprintf("%s%v", cacheYccAgentRelationIdPrefix, data.Id) yccAgentRelationParentIdChildIdRelationTypeKey := fmt.Sprintf("%s%v:%v:%v", cacheYccAgentRelationParentIdChildIdRelationTypePrefix, data.ParentId, data.ChildId, data.RelationType) 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, agentRelationRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentRelationRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.ParentId, data.ChildId, data.RelationType, data.DetachReason, data.DetachTime, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.ParentId, data.ChildId, data.RelationType, data.DetachReason, data.DetachTime, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.ParentId, data.ChildId, data.RelationType, data.DetachReason, data.DetachTime, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.ParentId, data.ChildId, data.RelationType, data.DetachReason, data.DetachTime, data.DeleteTime, data.DelState, data.Version) }, yccAgentRelationIdKey, yccAgentRelationParentIdChildIdRelationTypeKey) } +func (m *defaultAgentRelationModel) insertUUID(data *AgentRelation) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentRelationModel) FindOne(ctx context.Context, id int64) (*AgentRelation, error) { +func (m *defaultAgentRelationModel) FindOne(ctx context.Context, id string) (*AgentRelation, error) { yccAgentRelationIdKey := fmt.Sprintf("%s%v", cacheYccAgentRelationIdPrefix, id) var resp AgentRelation err := m.QueryRowCtx(ctx, &resp, yccAgentRelationIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -107,7 +126,7 @@ func (m *defaultAgentRelationModel) FindOne(ctx context.Context, id int64) (*Age } } -func (m *defaultAgentRelationModel) FindOneByParentIdChildIdRelationType(ctx context.Context, parentId int64, childId int64, relationType int64) (*AgentRelation, error) { +func (m *defaultAgentRelationModel) FindOneByParentIdChildIdRelationType(ctx context.Context, parentId string, childId string, relationType int64) (*AgentRelation, error) { yccAgentRelationParentIdChildIdRelationTypeKey := fmt.Sprintf("%s%v:%v:%v", cacheYccAgentRelationParentIdChildIdRelationTypePrefix, parentId, childId, relationType) var resp AgentRelation err := m.QueryRowIndexCtx(ctx, &resp, yccAgentRelationParentIdChildIdRelationTypeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -380,7 +399,7 @@ func (m *defaultAgentRelationModel) Trans(ctx context.Context, fn func(ctx conte func (m *defaultAgentRelationModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentRelationModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentRelationModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentShortLinkModel.go b/app/main/model/agentShortLinkModel.go index 8ce3e38..26dab0b 100644 --- a/app/main/model/agentShortLinkModel.go +++ b/app/main/model/agentShortLinkModel.go @@ -1,6 +1,10 @@ package model import ( + "context" + "database/sql" + + "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/sqlx" ) @@ -12,6 +16,7 @@ type ( // and implement the added methods in customAgentShortLinkModel. AgentShortLinkModel interface { agentShortLinkModel + FindOneByInviteCodeTypeDelState(ctx context.Context, inviteCode sql.NullString, tp int64, delState int64) (*AgentShortLink, error) } customAgentShortLinkModel struct { @@ -25,3 +30,17 @@ func NewAgentShortLinkModel(conn sqlx.SqlConn, c cache.CacheConf) AgentShortLink defaultAgentShortLinkModel: newAgentShortLinkModel(conn, c), } } + +func (m *customAgentShortLinkModel) FindOneByInviteCodeTypeDelState(ctx context.Context, inviteCode sql.NullString, tp int64, delState int64) (*AgentShortLink, error) { + builder := m.SelectBuilder(). + Where("invite_code = ? AND type = ? AND del_state = ?", inviteCode, tp, delState). + Limit(1) + rows, err := m.FindAll(ctx, builder, "") + if err != nil { + return nil, errors.Wrapf(err, "query short link by invite_code failed") + } + if len(rows) == 0 { + return nil, ErrNotFound + } + return rows[0], nil +} diff --git a/app/main/model/agentShortLinkModel_gen.go b/app/main/model/agentShortLinkModel_gen.go index 6dd4e0f..8c6a726 100644 --- a/app/main/model/agentShortLinkModel_gen.go +++ b/app/main/model/agentShortLinkModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentShortLinkFieldNames = builder.RawFieldNames(&AgentShortLink{}) agentShortLinkRows = strings.Join(agentShortLinkFieldNames, ",") - agentShortLinkRowsExpectAutoSet = strings.Join(stringx.Remove(agentShortLinkFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentShortLinkRowsExpectAutoSet = strings.Join(stringx.Remove(agentShortLinkFieldNames, "`create_time`", "`update_time`"), ",") agentShortLinkRowsWithPlaceHolder = strings.Join(stringx.Remove(agentShortLinkFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentShortLinkIdPrefix = "cache:ycc:agentShortLink:id:" @@ -35,9 +37,9 @@ var ( type ( agentShortLinkModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentShortLink) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentShortLink, error) - FindOneByInviteCodeIdTypeDelState(ctx context.Context, inviteCodeId sql.NullInt64, tp int64, delState int64) (*AgentShortLink, error) - FindOneByLinkIdTypeDelState(ctx context.Context, linkId sql.NullInt64, tp int64, delState int64) (*AgentShortLink, error) + FindOne(ctx context.Context, id string) (*AgentShortLink, error) + FindOneByInviteCodeIdTypeDelState(ctx context.Context, inviteCodeId sql.NullString, tp int64, delState int64) (*AgentShortLink, error) + FindOneByLinkIdTypeDelState(ctx context.Context, linkId sql.NullString, tp int64, delState int64) (*AgentShortLink, error) FindOneByShortCodeDelState(ctx context.Context, shortCode string, delState int64) (*AgentShortLink, error) Update(ctx context.Context, session sqlx.Session, data *AgentShortLink) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentShortLink) error @@ -51,7 +53,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentShortLink, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentShortLink, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentShortLink, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentShortLinkModel struct { @@ -60,10 +62,10 @@ type ( } AgentShortLink struct { - Id int64 `db:"id"` // 主键ID - Type int64 `db:"type"` // 类型:1=推广报告(promotion),2=邀请好友(invite) - LinkId sql.NullInt64 `db:"link_id"` // 推广链接ID(关联agent_link表,仅推广报告类型使用) - InviteCodeId sql.NullInt64 `db:"invite_code_id"` // 邀请码ID(关联agent_invite_code表,仅邀请好友类型使用) + Id string `db:"id"` + Type int64 `db:"type"` // 类型:1=推广报告(promotion),2=邀请好友(invite) + LinkId sql.NullString `db:"link_id"` + InviteCodeId sql.NullString `db:"invite_code_id"` LinkIdentifier sql.NullString `db:"link_identifier"` // 推广链接标识(加密,仅推广报告类型使用) InviteCode sql.NullString `db:"invite_code"` // 邀请码(仅邀请好友类型使用) ShortCode string `db:"short_code"` // 短链标识(6位随机字符串) @@ -86,20 +88,37 @@ func newAgentShortLinkModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentS func (m *defaultAgentShortLinkModel) Insert(ctx context.Context, session sqlx.Session, data *AgentShortLink) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentShortLinkIdKey := fmt.Sprintf("%s%v", cacheYccAgentShortLinkIdPrefix, data.Id) yccAgentShortLinkInviteCodeIdTypeDelStateKey := fmt.Sprintf("%s%v:%v:%v", cacheYccAgentShortLinkInviteCodeIdTypeDelStatePrefix, data.InviteCodeId, data.Type, data.DelState) yccAgentShortLinkLinkIdTypeDelStateKey := fmt.Sprintf("%s%v:%v:%v", cacheYccAgentShortLinkLinkIdTypeDelStatePrefix, data.LinkId, data.Type, data.DelState) yccAgentShortLinkShortCodeDelStateKey := fmt.Sprintf("%s%v:%v", cacheYccAgentShortLinkShortCodeDelStatePrefix, data.ShortCode, data.DelState) 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, agentShortLinkRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentShortLinkRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Type, data.LinkId, data.InviteCodeId, data.LinkIdentifier, data.InviteCode, data.ShortCode, data.TargetPath, data.PromotionDomain, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.Type, data.LinkId, data.InviteCodeId, data.LinkIdentifier, data.InviteCode, data.ShortCode, data.TargetPath, data.PromotionDomain, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.Type, data.LinkId, data.InviteCodeId, data.LinkIdentifier, data.InviteCode, data.ShortCode, data.TargetPath, data.PromotionDomain, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.Type, data.LinkId, data.InviteCodeId, data.LinkIdentifier, data.InviteCode, data.ShortCode, data.TargetPath, data.PromotionDomain, data.DeleteTime, data.DelState, data.Version) }, yccAgentShortLinkIdKey, yccAgentShortLinkInviteCodeIdTypeDelStateKey, yccAgentShortLinkLinkIdTypeDelStateKey, yccAgentShortLinkShortCodeDelStateKey) } +func (m *defaultAgentShortLinkModel) insertUUID(data *AgentShortLink) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentShortLinkModel) FindOne(ctx context.Context, id int64) (*AgentShortLink, error) { +func (m *defaultAgentShortLinkModel) FindOne(ctx context.Context, id string) (*AgentShortLink, error) { yccAgentShortLinkIdKey := fmt.Sprintf("%s%v", cacheYccAgentShortLinkIdPrefix, id) var resp AgentShortLink err := m.QueryRowCtx(ctx, &resp, yccAgentShortLinkIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -116,7 +135,7 @@ func (m *defaultAgentShortLinkModel) FindOne(ctx context.Context, id int64) (*Ag } } -func (m *defaultAgentShortLinkModel) FindOneByInviteCodeIdTypeDelState(ctx context.Context, inviteCodeId sql.NullInt64, tp int64, delState int64) (*AgentShortLink, error) { +func (m *defaultAgentShortLinkModel) FindOneByInviteCodeIdTypeDelState(ctx context.Context, inviteCodeId sql.NullString, tp int64, delState int64) (*AgentShortLink, error) { yccAgentShortLinkInviteCodeIdTypeDelStateKey := fmt.Sprintf("%s%v:%v:%v", cacheYccAgentShortLinkInviteCodeIdTypeDelStatePrefix, inviteCodeId, tp, delState) var resp AgentShortLink err := m.QueryRowIndexCtx(ctx, &resp, yccAgentShortLinkInviteCodeIdTypeDelStateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -136,7 +155,7 @@ func (m *defaultAgentShortLinkModel) FindOneByInviteCodeIdTypeDelState(ctx conte } } -func (m *defaultAgentShortLinkModel) FindOneByLinkIdTypeDelState(ctx context.Context, linkId sql.NullInt64, tp int64, delState int64) (*AgentShortLink, error) { +func (m *defaultAgentShortLinkModel) FindOneByLinkIdTypeDelState(ctx context.Context, linkId sql.NullString, tp int64, delState int64) (*AgentShortLink, error) { yccAgentShortLinkLinkIdTypeDelStateKey := fmt.Sprintf("%s%v:%v:%v", cacheYccAgentShortLinkLinkIdTypeDelStatePrefix, linkId, tp, delState) var resp AgentShortLink err := m.QueryRowIndexCtx(ctx, &resp, yccAgentShortLinkLinkIdTypeDelStateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -433,7 +452,7 @@ func (m *defaultAgentShortLinkModel) Trans(ctx context.Context, fn func(ctx cont func (m *defaultAgentShortLinkModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentShortLinkModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentShortLinkModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentUpgradeModel_gen.go b/app/main/model/agentUpgradeModel_gen.go index c8d1779..2d9c144 100644 --- a/app/main/model/agentUpgradeModel_gen.go +++ b/app/main/model/agentUpgradeModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentUpgradeFieldNames = builder.RawFieldNames(&AgentUpgrade{}) agentUpgradeRows = strings.Join(agentUpgradeFieldNames, ",") - agentUpgradeRowsExpectAutoSet = strings.Join(stringx.Remove(agentUpgradeFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentUpgradeRowsExpectAutoSet = strings.Join(stringx.Remove(agentUpgradeFieldNames, "`create_time`", "`update_time`"), ",") agentUpgradeRowsWithPlaceHolder = strings.Join(stringx.Remove(agentUpgradeFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentUpgradeIdPrefix = "cache:ycc:agentUpgrade:id:" @@ -32,7 +34,7 @@ var ( type ( agentUpgradeModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentUpgrade) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentUpgrade, error) + FindOne(ctx context.Context, id string) (*AgentUpgrade, error) Update(ctx context.Context, session sqlx.Session, data *AgentUpgrade) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentUpgrade) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -45,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentUpgrade, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentUpgrade, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentUpgrade, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentUpgradeModel struct { @@ -54,23 +56,23 @@ type ( } AgentUpgrade struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 被升级的代理ID - FromLevel int64 `db:"from_level"` // 原等级:1=普通,2=黄金,3=钻石 - ToLevel int64 `db:"to_level"` // 目标等级:1=普通,2=黄金,3=钻石 - UpgradeType int64 `db:"upgrade_type"` // 升级类型:1=自主付费,2=钻石升级下级 - UpgradeFee float64 `db:"upgrade_fee"` // 升级费用 - RebateAmount float64 `db:"rebate_amount"` // 返佣金额(给原直接上级) - RebateAgentId sql.NullInt64 `db:"rebate_agent_id"` // 返佣代理ID(原直接上级) - OperatorAgentId sql.NullInt64 `db:"operator_agent_id"` // 操作代理ID(如果是钻石升级下级,记录操作者) - OrderNo sql.NullString `db:"order_no"` // 支付订单号(如果是自主付费) - Status int64 `db:"status"` // 状态:1=待处理,2=已完成,3=已失败 - Remark sql.NullString `db:"remark"` // 备注 - 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"` // 版本号(乐观锁) + Id string `db:"id"` + AgentId string `db:"agent_id"` + FromLevel int64 `db:"from_level"` // 原等级:1=普通,2=黄金,3=钻石 + ToLevel int64 `db:"to_level"` // 目标等级:1=普通,2=黄金,3=钻石 + UpgradeType int64 `db:"upgrade_type"` // 升级类型:1=自主付费,2=钻石升级下级 + UpgradeFee float64 `db:"upgrade_fee"` // 升级费用 + RebateAmount float64 `db:"rebate_amount"` // 返佣金额(给原直接上级) + RebateAgentId sql.NullString `db:"rebate_agent_id"` + OperatorAgentId sql.NullString `db:"operator_agent_id"` + OrderNo sql.NullString `db:"order_no"` // 支付订单号(如果是自主付费) + Status int64 `db:"status"` // 状态:1=待处理,2=已完成,3=已失败 + Remark sql.NullString `db:"remark"` // 备注 + 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"` // 版本号(乐观锁) } ) @@ -83,17 +85,34 @@ func newAgentUpgradeModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentUpg func (m *defaultAgentUpgradeModel) Insert(ctx context.Context, session sqlx.Session, data *AgentUpgrade) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentUpgradeIdKey := fmt.Sprintf("%s%v", cacheYccAgentUpgradeIdPrefix, 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, agentUpgradeRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentUpgradeRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.FromLevel, data.ToLevel, data.UpgradeType, data.UpgradeFee, data.RebateAmount, data.RebateAgentId, data.OperatorAgentId, data.OrderNo, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.FromLevel, data.ToLevel, data.UpgradeType, data.UpgradeFee, data.RebateAmount, data.RebateAgentId, data.OperatorAgentId, data.OrderNo, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.FromLevel, data.ToLevel, data.UpgradeType, data.UpgradeFee, data.RebateAmount, data.RebateAgentId, data.OperatorAgentId, data.OrderNo, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.FromLevel, data.ToLevel, data.UpgradeType, data.UpgradeFee, data.RebateAmount, data.RebateAgentId, data.OperatorAgentId, data.OrderNo, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) }, yccAgentUpgradeIdKey) } +func (m *defaultAgentUpgradeModel) insertUUID(data *AgentUpgrade) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentUpgradeModel) FindOne(ctx context.Context, id int64) (*AgentUpgrade, error) { +func (m *defaultAgentUpgradeModel) FindOne(ctx context.Context, id string) (*AgentUpgrade, error) { yccAgentUpgradeIdKey := fmt.Sprintf("%s%v", cacheYccAgentUpgradeIdPrefix, id) var resp AgentUpgrade err := m.QueryRowCtx(ctx, &resp, yccAgentUpgradeIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -353,7 +372,7 @@ func (m *defaultAgentUpgradeModel) Trans(ctx context.Context, fn func(ctx contex func (m *defaultAgentUpgradeModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentUpgradeModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentUpgradeModel) Delete(ctx context.Context, session sqlx.Session, id string) error { yccAgentUpgradeIdKey := fmt.Sprintf("%s%v", cacheYccAgentUpgradeIdPrefix, 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) diff --git a/app/main/model/agentWalletModel_gen.go b/app/main/model/agentWalletModel_gen.go index 5bb7b1c..c561fd0 100644 --- a/app/main/model/agentWalletModel_gen.go +++ b/app/main/model/agentWalletModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentWalletFieldNames = builder.RawFieldNames(&AgentWallet{}) agentWalletRows = strings.Join(agentWalletFieldNames, ",") - agentWalletRowsExpectAutoSet = strings.Join(stringx.Remove(agentWalletFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentWalletRowsExpectAutoSet = strings.Join(stringx.Remove(agentWalletFieldNames, "`create_time`", "`update_time`"), ",") agentWalletRowsWithPlaceHolder = strings.Join(stringx.Remove(agentWalletFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentWalletIdPrefix = "cache:ycc:agentWallet:id:" @@ -33,8 +35,8 @@ var ( type ( agentWalletModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentWallet) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentWallet, error) - FindOneByAgentId(ctx context.Context, agentId int64) (*AgentWallet, error) + FindOne(ctx context.Context, id string) (*AgentWallet, error) + FindOneByAgentId(ctx context.Context, agentId string) (*AgentWallet, error) Update(ctx context.Context, session sqlx.Session, data *AgentWallet) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentWallet) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWallet, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentWallet, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentWallet, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentWalletModel struct { @@ -56,8 +58,8 @@ type ( } AgentWallet struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID + Id string `db:"id"` + AgentId string `db:"agent_id"` Balance float64 `db:"balance"` // 可用余额 FrozenBalance float64 `db:"frozen_balance"` // 冻结余额 TotalEarnings float64 `db:"total_earnings"` // 累计收益 @@ -79,18 +81,35 @@ func newAgentWalletModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentWall func (m *defaultAgentWalletModel) Insert(ctx context.Context, session sqlx.Session, data *AgentWallet) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentWalletAgentIdPrefix, data.AgentId) yccAgentWalletIdKey := fmt.Sprintf("%s%v", cacheYccAgentWalletIdPrefix, 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, agentWalletRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWalletRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.Balance, data.FrozenBalance, data.TotalEarnings, data.WithdrawnAmount, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.Balance, data.FrozenBalance, data.TotalEarnings, data.WithdrawnAmount, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.Balance, data.FrozenBalance, data.TotalEarnings, data.WithdrawnAmount, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.Balance, data.FrozenBalance, data.TotalEarnings, data.WithdrawnAmount, data.DeleteTime, data.DelState, data.Version) }, yccAgentWalletAgentIdKey, yccAgentWalletIdKey) } +func (m *defaultAgentWalletModel) insertUUID(data *AgentWallet) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentWalletModel) FindOne(ctx context.Context, id int64) (*AgentWallet, error) { +func (m *defaultAgentWalletModel) FindOne(ctx context.Context, id string) (*AgentWallet, error) { yccAgentWalletIdKey := fmt.Sprintf("%s%v", cacheYccAgentWalletIdPrefix, id) var resp AgentWallet err := m.QueryRowCtx(ctx, &resp, yccAgentWalletIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -107,7 +126,7 @@ func (m *defaultAgentWalletModel) FindOne(ctx context.Context, id int64) (*Agent } } -func (m *defaultAgentWalletModel) FindOneByAgentId(ctx context.Context, agentId int64) (*AgentWallet, error) { +func (m *defaultAgentWalletModel) FindOneByAgentId(ctx context.Context, agentId string) (*AgentWallet, error) { yccAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheYccAgentWalletAgentIdPrefix, agentId) var resp AgentWallet err := m.QueryRowIndexCtx(ctx, &resp, yccAgentWalletAgentIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { @@ -380,7 +399,7 @@ func (m *defaultAgentWalletModel) Trans(ctx context.Context, fn func(ctx context func (m *defaultAgentWalletModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentWalletModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentWalletModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentWithdrawalModel_gen.go b/app/main/model/agentWithdrawalModel_gen.go index 2c52132..81ee0b7 100644 --- a/app/main/model/agentWithdrawalModel_gen.go +++ b/app/main/model/agentWithdrawalModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentWithdrawalFieldNames = builder.RawFieldNames(&AgentWithdrawal{}) agentWithdrawalRows = strings.Join(agentWithdrawalFieldNames, ",") - agentWithdrawalRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentWithdrawalRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`create_time`", "`update_time`"), ",") agentWithdrawalRowsWithPlaceHolder = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentWithdrawalIdPrefix = "cache:ycc:agentWithdrawal:id:" @@ -33,7 +35,7 @@ var ( type ( agentWithdrawalModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentWithdrawal, error) + FindOne(ctx context.Context, id string) (*AgentWithdrawal, error) FindOneByWithdrawNo(ctx context.Context, withdrawNo string) (*AgentWithdrawal, error) Update(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) error @@ -47,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWithdrawal, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentWithdrawal, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentWithdrawal, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentWithdrawalModel struct { @@ -56,8 +58,8 @@ type ( } AgentWithdrawal struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID + Id string `db:"id"` + AgentId string `db:"agent_id"` WithdrawNo string `db:"withdraw_no"` // 提现单号 PayeeAccount string `db:"payee_account"` // 收款账户 PayeeName string `db:"payee_name"` // 收款人姓名 @@ -83,18 +85,35 @@ func newAgentWithdrawalModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgent func (m *defaultAgentWithdrawalModel) Insert(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheYccAgentWithdrawalIdPrefix, data.Id) yccAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheYccAgentWithdrawalWithdrawNoPrefix, 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.AgentId, data.WithdrawNo, data.PayeeAccount, data.PayeeName, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.PayeeAccount, data.PayeeName, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.WithdrawNo, data.PayeeAccount, data.PayeeName, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.PayeeAccount, data.PayeeName, data.Amount, data.ActualAmount, data.TaxAmount, data.Status, data.Remark, data.DeleteTime, data.DelState, data.Version) }, yccAgentWithdrawalIdKey, yccAgentWithdrawalWithdrawNoKey) } +func (m *defaultAgentWithdrawalModel) insertUUID(data *AgentWithdrawal) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentWithdrawalModel) FindOne(ctx context.Context, id int64) (*AgentWithdrawal, error) { +func (m *defaultAgentWithdrawalModel) FindOne(ctx context.Context, id string) (*AgentWithdrawal, error) { yccAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheYccAgentWithdrawalIdPrefix, id) var resp AgentWithdrawal err := m.QueryRowCtx(ctx, &resp, yccAgentWithdrawalIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -384,7 +403,7 @@ func (m *defaultAgentWithdrawalModel) Trans(ctx context.Context, fn func(ctx con func (m *defaultAgentWithdrawalModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentWithdrawalModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentWithdrawalModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/agentWithdrawalTaxModel_gen.go b/app/main/model/agentWithdrawalTaxModel_gen.go index 5339dee..1a9916c 100644 --- a/app/main/model/agentWithdrawalTaxModel_gen.go +++ b/app/main/model/agentWithdrawalTaxModel_gen.go @@ -8,9 +8,11 @@ import ( "fmt" "strings" + "reflect" "time" "github.com/Masterminds/squirrel" + "github.com/google/uuid" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/builder" "github.com/zeromicro/go-zero/core/stores/cache" @@ -23,7 +25,7 @@ import ( var ( agentWithdrawalTaxFieldNames = builder.RawFieldNames(&AgentWithdrawalTax{}) agentWithdrawalTaxRows = strings.Join(agentWithdrawalTaxFieldNames, ",") - agentWithdrawalTaxRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalTaxFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentWithdrawalTaxRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalTaxFieldNames, "`create_time`", "`update_time`"), ",") agentWithdrawalTaxRowsWithPlaceHolder = strings.Join(stringx.Remove(agentWithdrawalTaxFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccAgentWithdrawalTaxIdPrefix = "cache:ycc:agentWithdrawalTax:id:" @@ -32,7 +34,7 @@ var ( type ( agentWithdrawalTaxModel interface { Insert(ctx context.Context, session sqlx.Session, data *AgentWithdrawalTax) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AgentWithdrawalTax, error) + FindOne(ctx context.Context, id string) (*AgentWithdrawalTax, error) Update(ctx context.Context, session sqlx.Session, data *AgentWithdrawalTax) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentWithdrawalTax) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -45,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWithdrawalTax, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentWithdrawalTax, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentWithdrawalTax, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAgentWithdrawalTaxModel struct { @@ -54,9 +56,9 @@ type ( } AgentWithdrawalTax struct { - Id int64 `db:"id"` // 主键ID - AgentId int64 `db:"agent_id"` // 代理ID - WithdrawalId int64 `db:"withdrawal_id"` // 提现记录ID + Id string `db:"id"` + AgentId string `db:"agent_id"` + WithdrawalId string `db:"withdrawal_id"` YearMonth int64 `db:"year_month"` // 年月(格式:YYYYMM) WithdrawalAmount float64 `db:"withdrawal_amount"` // 提现金额 TaxableAmount float64 `db:"taxable_amount"` // 应税金额 @@ -83,17 +85,34 @@ func newAgentWithdrawalTaxModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAg func (m *defaultAgentWithdrawalTaxModel) Insert(ctx context.Context, session sqlx.Session, data *AgentWithdrawalTax) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccAgentWithdrawalTaxIdKey := fmt.Sprintf("%s%v", cacheYccAgentWithdrawalTaxIdPrefix, 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, agentWithdrawalTaxRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWithdrawalTaxRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.AgentId, data.WithdrawalId, data.YearMonth, data.WithdrawalAmount, data.TaxableAmount, data.TaxRate, data.TaxAmount, data.ActualAmount, data.TaxStatus, data.TaxTime, data.Remark, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawalId, data.YearMonth, data.WithdrawalAmount, data.TaxableAmount, data.TaxRate, data.TaxAmount, data.ActualAmount, data.TaxStatus, data.TaxTime, data.Remark, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.AgentId, data.WithdrawalId, data.YearMonth, data.WithdrawalAmount, data.TaxableAmount, data.TaxRate, data.TaxAmount, data.ActualAmount, data.TaxStatus, data.TaxTime, data.Remark, data.DeleteTime, data.DelState, data.Version) + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawalId, data.YearMonth, data.WithdrawalAmount, data.TaxableAmount, data.TaxRate, data.TaxAmount, data.ActualAmount, data.TaxStatus, data.TaxTime, data.Remark, data.DeleteTime, data.DelState, data.Version) }, yccAgentWithdrawalTaxIdKey) } +func (m *defaultAgentWithdrawalTaxModel) insertUUID(data *AgentWithdrawalTax) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultAgentWithdrawalTaxModel) FindOne(ctx context.Context, id int64) (*AgentWithdrawalTax, error) { +func (m *defaultAgentWithdrawalTaxModel) FindOne(ctx context.Context, id string) (*AgentWithdrawalTax, error) { yccAgentWithdrawalTaxIdKey := fmt.Sprintf("%s%v", cacheYccAgentWithdrawalTaxIdPrefix, id) var resp AgentWithdrawalTax err := m.QueryRowCtx(ctx, &resp, yccAgentWithdrawalTaxIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -353,7 +372,7 @@ func (m *defaultAgentWithdrawalTaxModel) Trans(ctx context.Context, fn func(ctx func (m *defaultAgentWithdrawalTaxModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAgentWithdrawalTaxModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultAgentWithdrawalTaxModel) Delete(ctx context.Context, session sqlx.Session, id string) error { yccAgentWithdrawalTaxIdKey := fmt.Sprintf("%s%v", cacheYccAgentWithdrawalTaxIdPrefix, 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) diff --git a/app/main/model/authorizationDocumentModel.go b/app/main/model/authorizationDocumentModel.go index db02124..794c83b 100644 --- a/app/main/model/authorizationDocumentModel.go +++ b/app/main/model/authorizationDocumentModel.go @@ -14,7 +14,7 @@ type ( // and implement the added methods in customAuthorizationDocumentModel. AuthorizationDocumentModel interface { authorizationDocumentModel - FindByOrderId(ctx context.Context, orderId int64) ([]*AuthorizationDocument, error) + FindByOrderId(ctx context.Context, orderId string) ([]*AuthorizationDocument, error) } customAuthorizationDocumentModel struct { @@ -30,14 +30,14 @@ func NewAuthorizationDocumentModel(conn sqlx.SqlConn, c cache.CacheConf) Authori } // FindByOrderId 根据订单ID查询授权书列表 -func (m *customAuthorizationDocumentModel) FindByOrderId(ctx context.Context, orderId int64) ([]*AuthorizationDocument, error) { +func (m *customAuthorizationDocumentModel) FindByOrderId(ctx context.Context, orderId string) ([]*AuthorizationDocument, error) { query := `SELECT * FROM authorization_document WHERE order_id = ? AND del_state = 0 ORDER BY create_time DESC` - + var authDocs []*AuthorizationDocument err := m.QueryRowsNoCacheCtx(ctx, &authDocs, query, orderId) if err != nil { return nil, err } - + return authDocs, nil } diff --git a/app/main/model/authorizationDocumentModel_gen.go b/app/main/model/authorizationDocumentModel_gen.go index 7ae80b0..ca85246 100644 --- a/app/main/model/authorizationDocumentModel_gen.go +++ b/app/main/model/authorizationDocumentModel_gen.go @@ -8,32 +8,33 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( authorizationDocumentFieldNames = builder.RawFieldNames(&AuthorizationDocument{}) authorizationDocumentRows = strings.Join(authorizationDocumentFieldNames, ",") - authorizationDocumentRowsExpectAutoSet = strings.Join(stringx.Remove(authorizationDocumentFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + authorizationDocumentRowsExpectAutoSet = strings.Join(stringx.Remove(authorizationDocumentFieldNames, "`create_time`", "`update_time`"), ",") authorizationDocumentRowsWithPlaceHolder = strings.Join(stringx.Remove(authorizationDocumentFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmAuthorizationDocumentIdPrefix = "cache:ycc:authorizationDocument:id:" + cacheYccAuthorizationDocumentIdPrefix = "cache:ycc:authorizationDocument:id:" ) type ( authorizationDocumentModel interface { Insert(ctx context.Context, session sqlx.Session, data *AuthorizationDocument) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*AuthorizationDocument, error) + FindOne(ctx context.Context, id string) (*AuthorizationDocument, error) Update(ctx context.Context, session sqlx.Session, data *AuthorizationDocument) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AuthorizationDocument) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -46,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AuthorizationDocument, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AuthorizationDocument, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AuthorizationDocument, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultAuthorizationDocumentModel struct { @@ -55,10 +56,10 @@ type ( } AuthorizationDocument struct { - Id int64 `db:"id"` // 主键ID - UserId int64 `db:"user_id"` // 用户ID - OrderId int64 `db:"order_id"` // 订单ID - QueryId int64 `db:"query_id"` // 查询ID + Id string `db:"id"` + UserId string `db:"user_id"` + OrderId string `db:"order_id"` + QueryId string `db:"query_id"` FileName string `db:"file_name"` // 文件名 FilePath string `db:"file_path"` // 文件路径 FileUrl string `db:"file_url"` // 文件访问URL @@ -83,20 +84,37 @@ func newAuthorizationDocumentModel(conn sqlx.SqlConn, c cache.CacheConf) *defaul func (m *defaultAuthorizationDocumentModel) Insert(ctx context.Context, session sqlx.Session, data *AuthorizationDocument) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheHmAuthorizationDocumentIdPrefix, data.Id) + m.insertUUID(data) + yccAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheYccAuthorizationDocumentIdPrefix, 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, authorizationDocumentRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, authorizationDocumentRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version) + return session.ExecCtx(ctx, query, data.Id, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version) } - return conn.ExecCtx(ctx, query, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version) - }, hmAuthorizationDocumentIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version) + }, yccAuthorizationDocumentIdKey) +} +func (m *defaultAuthorizationDocumentModel) insertUUID(data *AuthorizationDocument) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultAuthorizationDocumentModel) FindOne(ctx context.Context, id int64) (*AuthorizationDocument, error) { - hmAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheHmAuthorizationDocumentIdPrefix, id) +func (m *defaultAuthorizationDocumentModel) FindOne(ctx context.Context, id string) (*AuthorizationDocument, error) { + yccAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheYccAuthorizationDocumentIdPrefix, id) var resp AuthorizationDocument - err := m.QueryRowCtx(ctx, &resp, hmAuthorizationDocumentIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccAuthorizationDocumentIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", authorizationDocumentRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -111,14 +129,14 @@ func (m *defaultAuthorizationDocumentModel) FindOne(ctx context.Context, id int6 } func (m *defaultAuthorizationDocumentModel) Update(ctx context.Context, session sqlx.Session, data *AuthorizationDocument) (sql.Result, error) { - hmAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheHmAuthorizationDocumentIdPrefix, data.Id) + yccAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheYccAuthorizationDocumentIdPrefix, 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, authorizationDocumentRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version, data.Id) } return conn.ExecCtx(ctx, query, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version, data.Id) - }, hmAuthorizationDocumentIdKey) + }, yccAuthorizationDocumentIdKey) } func (m *defaultAuthorizationDocumentModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AuthorizationDocument) error { @@ -129,14 +147,14 @@ func (m *defaultAuthorizationDocumentModel) UpdateWithVersion(ctx context.Contex var sqlResult sql.Result var err error - hmAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheHmAuthorizationDocumentIdPrefix, data.Id) + yccAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheYccAuthorizationDocumentIdPrefix, 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, authorizationDocumentRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) } return conn.ExecCtx(ctx, query, data.UserId, data.OrderId, data.QueryId, data.FileName, data.FilePath, data.FileUrl, data.FileSize, data.FileType, data.Status, data.ExpireTime, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) - }, hmAuthorizationDocumentIdKey) + }, yccAuthorizationDocumentIdKey) if err != nil { return err } @@ -353,19 +371,19 @@ func (m *defaultAuthorizationDocumentModel) Trans(ctx context.Context, fn func(c func (m *defaultAuthorizationDocumentModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultAuthorizationDocumentModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { - hmAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheHmAuthorizationDocumentIdPrefix, id) +func (m *defaultAuthorizationDocumentModel) Delete(ctx context.Context, session sqlx.Session, id string) error { + yccAuthorizationDocumentIdKey := fmt.Sprintf("%s%v", cacheYccAuthorizationDocumentIdPrefix, 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) - }, hmAuthorizationDocumentIdKey) + }, yccAuthorizationDocumentIdKey) return err } func (m *defaultAuthorizationDocumentModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmAuthorizationDocumentIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccAuthorizationDocumentIdPrefix, primary) } func (m *defaultAuthorizationDocumentModel) 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", authorizationDocumentRows, m.table) diff --git a/app/main/model/exampleModel_gen.go b/app/main/model/exampleModel_gen.go index 437101c..2dcaeae 100644 --- a/app/main/model/exampleModel_gen.go +++ b/app/main/model/exampleModel_gen.go @@ -8,36 +8,37 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( exampleFieldNames = builder.RawFieldNames(&Example{}) exampleRows = strings.Join(exampleFieldNames, ",") - exampleRowsExpectAutoSet = strings.Join(stringx.Remove(exampleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + exampleRowsExpectAutoSet = strings.Join(stringx.Remove(exampleFieldNames, "`create_time`", "`update_time`"), ",") exampleRowsWithPlaceHolder = strings.Join(stringx.Remove(exampleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmExampleIdPrefix = "cache:ycc:example:id:" - cacheHmExampleApiIdPrefix = "cache:ycc:example:apiId:" - cacheHmExampleFeatureIdPrefix = "cache:ycc:example:featureId:" + cacheYccExampleIdPrefix = "cache:ycc:example:id:" + cacheYccExampleApiIdPrefix = "cache:ycc:example:apiId:" + cacheYccExampleFeatureIdPrefix = "cache:ycc:example:featureId:" ) type ( exampleModel interface { Insert(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Example, error) + FindOne(ctx context.Context, id string) (*Example, error) FindOneByApiId(ctx context.Context, apiId string) (*Example, error) - FindOneByFeatureId(ctx context.Context, featureId int64) (*Example, error) + FindOneByFeatureId(ctx context.Context, featureId string) (*Example, error) Update(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Example) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -50,7 +51,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Example, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Example, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultExampleModel struct { @@ -59,15 +60,17 @@ type ( } Example 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"` // 删除状态 - Version int64 `db:"version"` // 版本号 - ApiId string `db:"api_id"` // API标识 - FeatureId int64 `db:"feature_id"` // 关联feature表的ID - Content string `db:"content"` // 内容 + Id string `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"` // 版本号 + ApiId string `db:"api_id"` // API标识 + FeatureId string `db:"feature_id"` + Content string `db:"content"` // 内容 + ProductIdUuid sql.NullString `db:"product_id_uuid"` + FeatureIdUuid sql.NullString `db:"feature_id_uuid"` } ) @@ -80,22 +83,39 @@ func newExampleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultExampleModel func (m *defaultExampleModel) Insert(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmExampleApiIdKey := fmt.Sprintf("%s%v", cacheHmExampleApiIdPrefix, data.ApiId) - hmExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheHmExampleFeatureIdPrefix, data.FeatureId) - hmExampleIdKey := fmt.Sprintf("%s%v", cacheHmExampleIdPrefix, data.Id) + m.insertUUID(data) + yccExampleApiIdKey := fmt.Sprintf("%s%v", cacheYccExampleApiIdPrefix, data.ApiId) + yccExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheYccExampleFeatureIdPrefix, data.FeatureId) + yccExampleIdKey := fmt.Sprintf("%s%v", cacheYccExampleIdPrefix, 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, exampleRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, exampleRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.FeatureId, data.Content) + return session.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.FeatureId, data.Content, data.ProductIdUuid, data.FeatureIdUuid) } - return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.FeatureId, data.Content) - }, hmExampleApiIdKey, hmExampleFeatureIdKey, hmExampleIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.FeatureId, data.Content, data.ProductIdUuid, data.FeatureIdUuid) + }, yccExampleApiIdKey, yccExampleFeatureIdKey, yccExampleIdKey) +} +func (m *defaultExampleModel) insertUUID(data *Example) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultExampleModel) FindOne(ctx context.Context, id int64) (*Example, error) { - hmExampleIdKey := fmt.Sprintf("%s%v", cacheHmExampleIdPrefix, id) +func (m *defaultExampleModel) FindOne(ctx context.Context, id string) (*Example, error) { + yccExampleIdKey := fmt.Sprintf("%s%v", cacheYccExampleIdPrefix, id) var resp Example - err := m.QueryRowCtx(ctx, &resp, hmExampleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccExampleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", exampleRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -110,9 +130,9 @@ func (m *defaultExampleModel) FindOne(ctx context.Context, id int64) (*Example, } func (m *defaultExampleModel) FindOneByApiId(ctx context.Context, apiId string) (*Example, error) { - hmExampleApiIdKey := fmt.Sprintf("%s%v", cacheHmExampleApiIdPrefix, apiId) + yccExampleApiIdKey := fmt.Sprintf("%s%v", cacheYccExampleApiIdPrefix, apiId) var resp Example - err := m.QueryRowIndexCtx(ctx, &resp, hmExampleApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccExampleApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `api_id` = ? and del_state = ? limit 1", exampleRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, apiId, globalkey.DelStateNo); err != nil { return nil, err @@ -129,10 +149,10 @@ func (m *defaultExampleModel) FindOneByApiId(ctx context.Context, apiId string) } } -func (m *defaultExampleModel) FindOneByFeatureId(ctx context.Context, featureId int64) (*Example, error) { - hmExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheHmExampleFeatureIdPrefix, featureId) +func (m *defaultExampleModel) FindOneByFeatureId(ctx context.Context, featureId string) (*Example, error) { + yccExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheYccExampleFeatureIdPrefix, featureId) var resp Example - err := m.QueryRowIndexCtx(ctx, &resp, hmExampleFeatureIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccExampleFeatureIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `feature_id` = ? and del_state = ? limit 1", exampleRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, featureId, globalkey.DelStateNo); err != nil { return nil, err @@ -154,16 +174,16 @@ func (m *defaultExampleModel) Update(ctx context.Context, session sqlx.Session, if err != nil { return nil, err } - hmExampleApiIdKey := fmt.Sprintf("%s%v", cacheHmExampleApiIdPrefix, data.ApiId) - hmExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheHmExampleFeatureIdPrefix, data.FeatureId) - hmExampleIdKey := fmt.Sprintf("%s%v", cacheHmExampleIdPrefix, data.Id) + yccExampleApiIdKey := fmt.Sprintf("%s%v", cacheYccExampleApiIdPrefix, data.ApiId) + yccExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheYccExampleFeatureIdPrefix, data.FeatureId) + yccExampleIdKey := fmt.Sprintf("%s%v", cacheYccExampleIdPrefix, 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, exampleRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id) + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.ProductIdUuid, newData.FeatureIdUuid, newData.Id) } - return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id) - }, hmExampleApiIdKey, hmExampleFeatureIdKey, hmExampleIdKey) + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.ProductIdUuid, newData.FeatureIdUuid, newData.Id) + }, yccExampleApiIdKey, yccExampleFeatureIdKey, yccExampleIdKey) } func (m *defaultExampleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Example) error { @@ -178,16 +198,16 @@ func (m *defaultExampleModel) UpdateWithVersion(ctx context.Context, session sql if err != nil { return err } - hmExampleApiIdKey := fmt.Sprintf("%s%v", cacheHmExampleApiIdPrefix, data.ApiId) - hmExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheHmExampleFeatureIdPrefix, data.FeatureId) - hmExampleIdKey := fmt.Sprintf("%s%v", cacheHmExampleIdPrefix, data.Id) + yccExampleApiIdKey := fmt.Sprintf("%s%v", cacheYccExampleApiIdPrefix, data.ApiId) + yccExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheYccExampleFeatureIdPrefix, data.FeatureId) + yccExampleIdKey := fmt.Sprintf("%s%v", cacheYccExampleIdPrefix, 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, exampleRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id, oldVersion) + return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.ProductIdUuid, newData.FeatureIdUuid, newData.Id, oldVersion) } - return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.Id, oldVersion) - }, hmExampleApiIdKey, hmExampleFeatureIdKey, hmExampleIdKey) + return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.FeatureId, newData.Content, newData.ProductIdUuid, newData.FeatureIdUuid, newData.Id, oldVersion) + }, yccExampleApiIdKey, yccExampleFeatureIdKey, yccExampleIdKey) if err != nil { return err } @@ -404,26 +424,26 @@ func (m *defaultExampleModel) Trans(ctx context.Context, fn func(ctx context.Con func (m *defaultExampleModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultExampleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultExampleModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmExampleApiIdKey := fmt.Sprintf("%s%v", cacheHmExampleApiIdPrefix, data.ApiId) - hmExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheHmExampleFeatureIdPrefix, data.FeatureId) - hmExampleIdKey := fmt.Sprintf("%s%v", cacheHmExampleIdPrefix, id) + yccExampleApiIdKey := fmt.Sprintf("%s%v", cacheYccExampleApiIdPrefix, data.ApiId) + yccExampleFeatureIdKey := fmt.Sprintf("%s%v", cacheYccExampleFeatureIdPrefix, data.FeatureId) + yccExampleIdKey := fmt.Sprintf("%s%v", cacheYccExampleIdPrefix, 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) - }, hmExampleApiIdKey, hmExampleFeatureIdKey, hmExampleIdKey) + }, yccExampleApiIdKey, yccExampleFeatureIdKey, yccExampleIdKey) return err } func (m *defaultExampleModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmExampleIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccExampleIdPrefix, primary) } func (m *defaultExampleModel) 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", exampleRows, m.table) diff --git a/app/main/model/featureModel_gen.go b/app/main/model/featureModel_gen.go index c4ce100..b9a2d96 100644 --- a/app/main/model/featureModel_gen.go +++ b/app/main/model/featureModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( featureFieldNames = builder.RawFieldNames(&Feature{}) featureRows = strings.Join(featureFieldNames, ",") - featureRowsExpectAutoSet = strings.Join(stringx.Remove(featureFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + featureRowsExpectAutoSet = strings.Join(stringx.Remove(featureFieldNames, "`create_time`", "`update_time`"), ",") featureRowsWithPlaceHolder = strings.Join(stringx.Remove(featureFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmFeatureIdPrefix = "cache:ycc:feature:id:" - cacheHmFeatureApiIdPrefix = "cache:ycc:feature:apiId:" + cacheYccFeatureIdPrefix = "cache:ycc:feature:id:" + cacheYccFeatureApiIdPrefix = "cache:ycc:feature:apiId:" ) type ( featureModel interface { Insert(ctx context.Context, session sqlx.Session, data *Feature) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Feature, error) + FindOne(ctx context.Context, id string) (*Feature, error) FindOneByApiId(ctx context.Context, apiId string) (*Feature, error) Update(ctx context.Context, session sqlx.Session, data *Feature) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Feature) error @@ -48,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Feature, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Feature, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Feature, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultFeatureModel struct { @@ -57,7 +58,7 @@ type ( } Feature struct { - Id int64 `db:"id"` // 主键ID + Id string `db:"id"` CreateTime time.Time `db:"create_time"` // 创建时间 UpdateTime time.Time `db:"update_time"` // 更新时间 DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -77,21 +78,38 @@ func newFeatureModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultFeatureModel func (m *defaultFeatureModel) Insert(ctx context.Context, session sqlx.Session, data *Feature) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmFeatureApiIdKey := fmt.Sprintf("%s%v", cacheHmFeatureApiIdPrefix, data.ApiId) - hmFeatureIdKey := fmt.Sprintf("%s%v", cacheHmFeatureIdPrefix, data.Id) + m.insertUUID(data) + yccFeatureApiIdKey := fmt.Sprintf("%s%v", cacheYccFeatureApiIdPrefix, data.ApiId) + yccFeatureIdKey := fmt.Sprintf("%s%v", cacheYccFeatureIdPrefix, 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, featureRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, featureRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.Name) + return session.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.Name) } - return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.Name) - }, hmFeatureApiIdKey, hmFeatureIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ApiId, data.Name) + }, yccFeatureApiIdKey, yccFeatureIdKey) +} +func (m *defaultFeatureModel) insertUUID(data *Feature) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultFeatureModel) FindOne(ctx context.Context, id int64) (*Feature, error) { - hmFeatureIdKey := fmt.Sprintf("%s%v", cacheHmFeatureIdPrefix, id) +func (m *defaultFeatureModel) FindOne(ctx context.Context, id string) (*Feature, error) { + yccFeatureIdKey := fmt.Sprintf("%s%v", cacheYccFeatureIdPrefix, id) var resp Feature - err := m.QueryRowCtx(ctx, &resp, hmFeatureIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccFeatureIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", featureRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -106,9 +124,9 @@ func (m *defaultFeatureModel) FindOne(ctx context.Context, id int64) (*Feature, } func (m *defaultFeatureModel) FindOneByApiId(ctx context.Context, apiId string) (*Feature, error) { - hmFeatureApiIdKey := fmt.Sprintf("%s%v", cacheHmFeatureApiIdPrefix, apiId) + yccFeatureApiIdKey := fmt.Sprintf("%s%v", cacheYccFeatureApiIdPrefix, apiId) var resp Feature - err := m.QueryRowIndexCtx(ctx, &resp, hmFeatureApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccFeatureApiIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `api_id` = ? and del_state = ? limit 1", featureRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, apiId, globalkey.DelStateNo); err != nil { return nil, err @@ -130,15 +148,15 @@ func (m *defaultFeatureModel) Update(ctx context.Context, session sqlx.Session, if err != nil { return nil, err } - hmFeatureApiIdKey := fmt.Sprintf("%s%v", cacheHmFeatureApiIdPrefix, data.ApiId) - hmFeatureIdKey := fmt.Sprintf("%s%v", cacheHmFeatureIdPrefix, data.Id) + yccFeatureApiIdKey := fmt.Sprintf("%s%v", cacheYccFeatureApiIdPrefix, data.ApiId) + yccFeatureIdKey := fmt.Sprintf("%s%v", cacheYccFeatureIdPrefix, 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, featureRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.Name, newData.Id) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.Name, newData.Id) - }, hmFeatureApiIdKey, hmFeatureIdKey) + }, yccFeatureApiIdKey, yccFeatureIdKey) } func (m *defaultFeatureModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Feature) error { @@ -153,15 +171,15 @@ func (m *defaultFeatureModel) UpdateWithVersion(ctx context.Context, session sql if err != nil { return err } - hmFeatureApiIdKey := fmt.Sprintf("%s%v", cacheHmFeatureApiIdPrefix, data.ApiId) - hmFeatureIdKey := fmt.Sprintf("%s%v", cacheHmFeatureIdPrefix, data.Id) + yccFeatureApiIdKey := fmt.Sprintf("%s%v", cacheYccFeatureApiIdPrefix, data.ApiId) + yccFeatureIdKey := fmt.Sprintf("%s%v", cacheYccFeatureIdPrefix, 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, featureRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.Name, newData.Id, oldVersion) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ApiId, newData.Name, newData.Id, oldVersion) - }, hmFeatureApiIdKey, hmFeatureIdKey) + }, yccFeatureApiIdKey, yccFeatureIdKey) if err != nil { return err } @@ -378,25 +396,25 @@ func (m *defaultFeatureModel) Trans(ctx context.Context, fn func(ctx context.Con func (m *defaultFeatureModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultFeatureModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultFeatureModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmFeatureApiIdKey := fmt.Sprintf("%s%v", cacheHmFeatureApiIdPrefix, data.ApiId) - hmFeatureIdKey := fmt.Sprintf("%s%v", cacheHmFeatureIdPrefix, id) + yccFeatureApiIdKey := fmt.Sprintf("%s%v", cacheYccFeatureApiIdPrefix, data.ApiId) + yccFeatureIdKey := fmt.Sprintf("%s%v", cacheYccFeatureIdPrefix, 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) - }, hmFeatureApiIdKey, hmFeatureIdKey) + }, yccFeatureApiIdKey, yccFeatureIdKey) return err } func (m *defaultFeatureModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmFeatureIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccFeatureIdPrefix, primary) } func (m *defaultFeatureModel) 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", featureRows, m.table) diff --git a/app/main/model/globalNotificationsModel_gen.go b/app/main/model/globalNotificationsModel_gen.go index 9a2eda9..bf72010 100644 --- a/app/main/model/globalNotificationsModel_gen.go +++ b/app/main/model/globalNotificationsModel_gen.go @@ -8,32 +8,33 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( globalNotificationsFieldNames = builder.RawFieldNames(&GlobalNotifications{}) globalNotificationsRows = strings.Join(globalNotificationsFieldNames, ",") - globalNotificationsRowsExpectAutoSet = strings.Join(stringx.Remove(globalNotificationsFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + globalNotificationsRowsExpectAutoSet = strings.Join(stringx.Remove(globalNotificationsFieldNames, "`create_time`", "`update_time`"), ",") globalNotificationsRowsWithPlaceHolder = strings.Join(stringx.Remove(globalNotificationsFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmGlobalNotificationsIdPrefix = "cache:ycc:globalNotifications:id:" + cacheYccGlobalNotificationsIdPrefix = "cache:ycc:globalNotifications:id:" ) type ( globalNotificationsModel interface { Insert(ctx context.Context, session sqlx.Session, data *GlobalNotifications) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*GlobalNotifications, error) + FindOne(ctx context.Context, id string) (*GlobalNotifications, error) Update(ctx context.Context, session sqlx.Session, data *GlobalNotifications) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *GlobalNotifications) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -46,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*GlobalNotifications, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*GlobalNotifications, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*GlobalNotifications, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultGlobalNotificationsModel struct { @@ -55,7 +56,7 @@ type ( } GlobalNotifications struct { - Id int64 `db:"id"` + Id string `db:"id"` Title string `db:"title"` Content string `db:"content"` NotificationPage string `db:"notification_page"` @@ -81,20 +82,37 @@ func newGlobalNotificationsModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultG func (m *defaultGlobalNotificationsModel) Insert(ctx context.Context, session sqlx.Session, data *GlobalNotifications) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheHmGlobalNotificationsIdPrefix, data.Id) + m.insertUUID(data) + yccGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheYccGlobalNotificationsIdPrefix, 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, globalNotificationsRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, globalNotificationsRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime) + return session.ExecCtx(ctx, query, data.Id, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime) } - return conn.ExecCtx(ctx, query, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime) - }, hmGlobalNotificationsIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime) + }, yccGlobalNotificationsIdKey) +} +func (m *defaultGlobalNotificationsModel) insertUUID(data *GlobalNotifications) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultGlobalNotificationsModel) FindOne(ctx context.Context, id int64) (*GlobalNotifications, error) { - hmGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheHmGlobalNotificationsIdPrefix, id) +func (m *defaultGlobalNotificationsModel) FindOne(ctx context.Context, id string) (*GlobalNotifications, error) { + yccGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheYccGlobalNotificationsIdPrefix, id) var resp GlobalNotifications - err := m.QueryRowCtx(ctx, &resp, hmGlobalNotificationsIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccGlobalNotificationsIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", globalNotificationsRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -109,14 +127,14 @@ func (m *defaultGlobalNotificationsModel) FindOne(ctx context.Context, id int64) } func (m *defaultGlobalNotificationsModel) Update(ctx context.Context, session sqlx.Session, data *GlobalNotifications) (sql.Result, error) { - hmGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheHmGlobalNotificationsIdPrefix, data.Id) + yccGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheYccGlobalNotificationsIdPrefix, 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, globalNotificationsRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime, data.Id) } return conn.ExecCtx(ctx, query, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime, data.Id) - }, hmGlobalNotificationsIdKey) + }, yccGlobalNotificationsIdKey) } func (m *defaultGlobalNotificationsModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *GlobalNotifications) error { @@ -127,14 +145,14 @@ func (m *defaultGlobalNotificationsModel) UpdateWithVersion(ctx context.Context, var sqlResult sql.Result var err error - hmGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheHmGlobalNotificationsIdPrefix, data.Id) + yccGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheYccGlobalNotificationsIdPrefix, 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, globalNotificationsRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime, data.Id, oldVersion) } return conn.ExecCtx(ctx, query, data.Title, data.Content, data.NotificationPage, data.StartDate, data.EndDate, data.StartTime, data.EndTime, data.Status, data.DelState, data.Version, data.DeleteTime, data.Id, oldVersion) - }, hmGlobalNotificationsIdKey) + }, yccGlobalNotificationsIdKey) if err != nil { return err } @@ -351,19 +369,19 @@ func (m *defaultGlobalNotificationsModel) Trans(ctx context.Context, fn func(ctx func (m *defaultGlobalNotificationsModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultGlobalNotificationsModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { - hmGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheHmGlobalNotificationsIdPrefix, id) +func (m *defaultGlobalNotificationsModel) Delete(ctx context.Context, session sqlx.Session, id string) error { + yccGlobalNotificationsIdKey := fmt.Sprintf("%s%v", cacheYccGlobalNotificationsIdPrefix, 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) - }, hmGlobalNotificationsIdKey) + }, yccGlobalNotificationsIdKey) return err } func (m *defaultGlobalNotificationsModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmGlobalNotificationsIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccGlobalNotificationsIdPrefix, primary) } func (m *defaultGlobalNotificationsModel) 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", globalNotificationsRows, m.table) diff --git a/app/main/model/orderModel.go b/app/main/model/orderModel.go index 6bf505c..753aa4b 100644 --- a/app/main/model/orderModel.go +++ b/app/main/model/orderModel.go @@ -1,6 +1,10 @@ package model import ( + "context" + "database/sql" + "fmt" + "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/sqlx" ) @@ -12,6 +16,7 @@ type ( // and implement the added methods in customOrderModel. OrderModel interface { orderModel + UpdateUserIDWithSession(ctx context.Context, session sqlx.Session, sourceUserID, targetUserID string) error } customOrderModel struct { @@ -25,3 +30,26 @@ func NewOrderModel(conn sqlx.SqlConn, c cache.CacheConf) OrderModel { defaultOrderModel: newOrderModel(conn, c), } } + +func (m *customOrderModel) UpdateUserIDWithSession(ctx context.Context, session sqlx.Session, sourceUserID, targetUserID string) error { + builder := m.defaultOrderModel.SelectBuilder().Where("user_id = ?", sourceUserID) + rows, err := m.defaultOrderModel.FindAll(ctx, builder, "") + if err != nil { + return err + } + + keys := make([]string, 0, len(rows)*2) + for _, r := range rows { + keys = append(keys, fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, r.Id)) + keys = append(keys, fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, r.OrderNo)) + } + + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("UPDATE %s SET user_id = ? WHERE user_id = ?", m.defaultOrderModel.tableName()) + if session != nil { + return session.ExecCtx(ctx, query, targetUserID, sourceUserID) + } + return conn.ExecCtx(ctx, query, targetUserID, sourceUserID) + }, keys...) + return err +} diff --git a/app/main/model/orderModel_gen.go b/app/main/model/orderModel_gen.go index b8cd9e4..d9ea90b 100644 --- a/app/main/model/orderModel_gen.go +++ b/app/main/model/orderModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( orderFieldNames = builder.RawFieldNames(&Order{}) orderRows = strings.Join(orderFieldNames, ",") - orderRowsExpectAutoSet = strings.Join(stringx.Remove(orderFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + orderRowsExpectAutoSet = strings.Join(stringx.Remove(orderFieldNames, "`create_time`", "`update_time`"), ",") orderRowsWithPlaceHolder = strings.Join(stringx.Remove(orderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmOrderIdPrefix = "cache:ycc:order:id:" - cacheHmOrderOrderNoPrefix = "cache:ycc:order:orderNo:" + cacheYccOrderIdPrefix = "cache:ycc:order:id:" + cacheYccOrderOrderNoPrefix = "cache:ycc:order:orderNo:" ) type ( orderModel interface { Insert(ctx context.Context, session sqlx.Session, data *Order) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Order, error) + FindOne(ctx context.Context, id string) (*Order, error) FindOneByOrderNo(ctx context.Context, orderNo string) (*Order, error) Update(ctx context.Context, session sqlx.Session, data *Order) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Order) error @@ -48,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Order, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Order, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Order, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultOrderModel struct { @@ -57,10 +58,10 @@ type ( } Order struct { - Id int64 `db:"id"` // 主键ID - OrderNo string `db:"order_no"` // 自生成的订单号 - UserId int64 `db:"user_id"` // 用户ID - ProductId int64 `db:"product_id"` // 产品ID(软关联到产品表) + Id string `db:"id"` + OrderNo string `db:"order_no"` // 自生成的订单号 + UserId string `db:"user_id"` + ProductId string `db:"product_id"` PaymentPlatform string `db:"payment_platform"` // 支付平台(支付宝、微信、苹果内购、其他) PaymentScene string `db:"payment_scene"` // 支付场景(App、H5、微信小程序、公众号) PlatformOrderId sql.NullString `db:"platform_order_id"` // 支付平台订单号 @@ -86,21 +87,38 @@ func newOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultOrderModel { func (m *defaultOrderModel) Insert(ctx context.Context, session sqlx.Session, data *Order) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, data.Id) - hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo) + m.insertUUID(data) + yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, data.Id) + yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo) 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, orderRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, orderRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime) + return session.ExecCtx(ctx, query, data.Id, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime) } - return conn.ExecCtx(ctx, query, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime) - }, hmOrderIdKey, hmOrderOrderNoKey) + return conn.ExecCtx(ctx, query, data.Id, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime) + }, yccOrderIdKey, yccOrderOrderNoKey) +} +func (m *defaultOrderModel) insertUUID(data *Order) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultOrderModel) FindOne(ctx context.Context, id int64) (*Order, error) { - hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, id) +func (m *defaultOrderModel) FindOne(ctx context.Context, id string) (*Order, error) { + yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, id) var resp Order - err := m.QueryRowCtx(ctx, &resp, hmOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", orderRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -115,9 +133,9 @@ func (m *defaultOrderModel) FindOne(ctx context.Context, id int64) (*Order, erro } func (m *defaultOrderModel) FindOneByOrderNo(ctx context.Context, orderNo string) (*Order, error) { - hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, orderNo) + yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, orderNo) var resp Order - err := m.QueryRowIndexCtx(ctx, &resp, hmOrderOrderNoKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccOrderOrderNoKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `order_no` = ? and del_state = ? limit 1", orderRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, orderNo, globalkey.DelStateNo); err != nil { return nil, err @@ -139,15 +157,15 @@ func (m *defaultOrderModel) Update(ctx context.Context, session sqlx.Session, ne if err != nil { return nil, err } - hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, data.Id) - hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo) + yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, data.Id) + yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo) 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, orderRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id) } return conn.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id) - }, hmOrderIdKey, hmOrderOrderNoKey) + }, yccOrderIdKey, yccOrderOrderNoKey) } func (m *defaultOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Order) error { @@ -162,15 +180,15 @@ func (m *defaultOrderModel) UpdateWithVersion(ctx context.Context, session sqlx. if err != nil { return err } - hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, data.Id) - hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo) + yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, data.Id) + yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo) 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, orderRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id, oldVersion) } return conn.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id, oldVersion) - }, hmOrderIdKey, hmOrderOrderNoKey) + }, yccOrderIdKey, yccOrderOrderNoKey) if err != nil { return err } @@ -387,25 +405,25 @@ func (m *defaultOrderModel) Trans(ctx context.Context, fn func(ctx context.Conte func (m *defaultOrderModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultOrderModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, id) - hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo) + yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, id) + yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo) _, 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) - }, hmOrderIdKey, hmOrderOrderNoKey) + }, yccOrderIdKey, yccOrderOrderNoKey) return err } func (m *defaultOrderModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, primary) } func (m *defaultOrderModel) 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", orderRows, m.table) diff --git a/app/main/model/orderRefundModel_gen.go b/app/main/model/orderRefundModel_gen.go index 2884bad..3a36937 100644 --- a/app/main/model/orderRefundModel_gen.go +++ b/app/main/model/orderRefundModel_gen.go @@ -8,23 +8,24 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( orderRefundFieldNames = builder.RawFieldNames(&OrderRefund{}) orderRefundRows = strings.Join(orderRefundFieldNames, ",") - orderRefundRowsExpectAutoSet = strings.Join(stringx.Remove(orderRefundFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + orderRefundRowsExpectAutoSet = strings.Join(stringx.Remove(orderRefundFieldNames, "`create_time`", "`update_time`"), ",") orderRefundRowsWithPlaceHolder = strings.Join(stringx.Remove(orderRefundFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" cacheYccOrderRefundIdPrefix = "cache:ycc:orderRefund:id:" @@ -35,7 +36,7 @@ var ( type ( orderRefundModel interface { Insert(ctx context.Context, session sqlx.Session, data *OrderRefund) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*OrderRefund, error) + FindOne(ctx context.Context, id string) (*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) @@ -50,7 +51,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultOrderRefundModel struct { @@ -59,11 +60,11 @@ type ( } 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 + Id string `db:"id"` + RefundNo string `db:"refund_no"` // 退款单号 + OrderId string `db:"order_id"` + UserId string `db:"user_id"` + ProductId string `db:"product_id"` PlatformRefundId sql.NullString `db:"platform_refund_id"` // 支付平台退款单号 RefundAmount float64 `db:"refund_amount"` // 退款金额 RefundReason sql.NullString `db:"refund_reason"` // 退款原因 @@ -87,19 +88,36 @@ func newOrderRefundModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultOrderRefu func (m *defaultOrderRefundModel) Insert(ctx context.Context, session sqlx.Session, data *OrderRefund) (sql.Result, error) { data.DelState = globalkey.DelStateNo + m.insertUUID(data) yccOrderRefundIdKey := fmt.Sprintf("%s%v", cacheYccOrderRefundIdPrefix, data.Id) yccOrderRefundPlatformRefundIdKey := fmt.Sprintf("%s%v", cacheYccOrderRefundPlatformRefundIdPrefix, data.PlatformRefundId) yccOrderRefundRefundNoKey := fmt.Sprintf("%s%v", cacheYccOrderRefundRefundNoPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) + return conn.ExecCtx(ctx, query, data.Id, 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) }, yccOrderRefundIdKey, yccOrderRefundPlatformRefundIdKey, yccOrderRefundRefundNoKey) } +func (m *defaultOrderRefundModel) insertUUID(data *OrderRefund) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } +} -func (m *defaultOrderRefundModel) FindOne(ctx context.Context, id int64) (*OrderRefund, error) { +func (m *defaultOrderRefundModel) FindOne(ctx context.Context, id string) (*OrderRefund, error) { yccOrderRefundIdKey := fmt.Sprintf("%s%v", cacheYccOrderRefundIdPrefix, id) var resp OrderRefund err := m.QueryRowCtx(ctx, &resp, yccOrderRefundIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { @@ -411,7 +429,7 @@ func (m *defaultOrderRefundModel) Trans(ctx context.Context, fn func(ctx context 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 { +func (m *defaultOrderRefundModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err diff --git a/app/main/model/productFeatureModel_gen.go b/app/main/model/productFeatureModel_gen.go index ad4b3c1..fdc7d3b 100644 --- a/app/main/model/productFeatureModel_gen.go +++ b/app/main/model/productFeatureModel_gen.go @@ -8,34 +8,33 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( productFeatureFieldNames = builder.RawFieldNames(&ProductFeature{}) productFeatureRows = strings.Join(productFeatureFieldNames, ",") - productFeatureRowsExpectAutoSet = strings.Join(stringx.Remove(productFeatureFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + productFeatureRowsExpectAutoSet = strings.Join(stringx.Remove(productFeatureFieldNames, "`create_time`", "`update_time`"), ",") productFeatureRowsWithPlaceHolder = strings.Join(stringx.Remove(productFeatureFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmProductFeatureIdPrefix = "cache:ycc:productFeature:id:" - cacheHmProductFeatureProductIdFeatureIdPrefix = "cache:ycc:productFeature:productId:featureId:" + cacheYccProductFeatureIdPrefix = "cache:ycc:productFeature:id:" ) type ( productFeatureModel interface { Insert(ctx context.Context, session sqlx.Session, data *ProductFeature) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*ProductFeature, error) - FindOneByProductIdFeatureId(ctx context.Context, productId int64, featureId int64) (*ProductFeature, error) + FindOne(ctx context.Context, id string) (*ProductFeature, error) Update(ctx context.Context, session sqlx.Session, data *ProductFeature) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *ProductFeature) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -48,7 +47,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*ProductFeature, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*ProductFeature, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*ProductFeature, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultProductFeatureModel struct { @@ -57,17 +56,19 @@ type ( } ProductFeature struct { - Id int64 `db:"id"` // 主键ID - ProductId int64 `db:"product_id"` // 产品ID - FeatureId int64 `db:"feature_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"` // 删除状态 - Version int64 `db:"version"` // 版本号 - Sort int64 `db:"sort"` - IsImportant int64 `db:"is_important"` - Enable int64 `db:"enable"` + Id string `db:"id"` + ProductId string `db:"product_id"` + FeatureId string `db:"feature_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"` // 版本号 + Sort int64 `db:"sort"` + IsImportant int64 `db:"is_important"` + Enable int64 `db:"enable"` + ProductIdUuid sql.NullString `db:"product_id_uuid"` + FeatureIdUuid sql.NullString `db:"feature_id_uuid"` } ) @@ -80,21 +81,37 @@ func newProductFeatureModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultProduc func (m *defaultProductFeatureModel) Insert(ctx context.Context, session sqlx.Session, data *ProductFeature) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmProductFeatureIdKey := fmt.Sprintf("%s%v", cacheHmProductFeatureIdPrefix, data.Id) - hmProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheHmProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) + m.insertUUID(data) + yccProductFeatureIdKey := fmt.Sprintf("%s%v", cacheYccProductFeatureIdPrefix, 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, productFeatureRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, productFeatureRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable) + return session.ExecCtx(ctx, query, data.Id, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable, data.ProductIdUuid, data.FeatureIdUuid) } - return conn.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable) - }, hmProductFeatureIdKey, hmProductFeatureProductIdFeatureIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable, data.ProductIdUuid, data.FeatureIdUuid) + }, yccProductFeatureIdKey) +} +func (m *defaultProductFeatureModel) insertUUID(data *ProductFeature) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultProductFeatureModel) FindOne(ctx context.Context, id int64) (*ProductFeature, error) { - hmProductFeatureIdKey := fmt.Sprintf("%s%v", cacheHmProductFeatureIdPrefix, id) +func (m *defaultProductFeatureModel) FindOne(ctx context.Context, id string) (*ProductFeature, error) { + yccProductFeatureIdKey := fmt.Sprintf("%s%v", cacheYccProductFeatureIdPrefix, id) var resp ProductFeature - err := m.QueryRowCtx(ctx, &resp, hmProductFeatureIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccProductFeatureIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", productFeatureRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -108,63 +125,33 @@ func (m *defaultProductFeatureModel) FindOne(ctx context.Context, id int64) (*Pr } } -func (m *defaultProductFeatureModel) FindOneByProductIdFeatureId(ctx context.Context, productId int64, featureId int64) (*ProductFeature, error) { - hmProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheHmProductFeatureProductIdFeatureIdPrefix, productId, featureId) - var resp ProductFeature - err := m.QueryRowIndexCtx(ctx, &resp, hmProductFeatureProductIdFeatureIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { - query := fmt.Sprintf("select %s from %s where `product_id` = ? and `feature_id` = ? and del_state = ? limit 1", productFeatureRows, m.table) - if err := conn.QueryRowCtx(ctx, &resp, query, productId, featureId, 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 *defaultProductFeatureModel) Update(ctx context.Context, session sqlx.Session, newData *ProductFeature) (sql.Result, error) { - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return nil, err - } - hmProductFeatureIdKey := fmt.Sprintf("%s%v", cacheHmProductFeatureIdPrefix, data.Id) - hmProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheHmProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) +func (m *defaultProductFeatureModel) Update(ctx context.Context, session sqlx.Session, data *ProductFeature) (sql.Result, error) { + yccProductFeatureIdKey := fmt.Sprintf("%s%v", cacheYccProductFeatureIdPrefix, 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, productFeatureRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.ProductId, newData.FeatureId, newData.DeleteTime, newData.DelState, newData.Version, newData.Sort, newData.IsImportant, newData.Enable, newData.Id) + return session.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable, data.ProductIdUuid, data.FeatureIdUuid, data.Id) } - return conn.ExecCtx(ctx, query, newData.ProductId, newData.FeatureId, newData.DeleteTime, newData.DelState, newData.Version, newData.Sort, newData.IsImportant, newData.Enable, newData.Id) - }, hmProductFeatureIdKey, hmProductFeatureProductIdFeatureIdKey) + return conn.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable, data.ProductIdUuid, data.FeatureIdUuid, data.Id) + }, yccProductFeatureIdKey) } -func (m *defaultProductFeatureModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *ProductFeature) error { +func (m *defaultProductFeatureModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *ProductFeature) error { - oldVersion := newData.Version - newData.Version += 1 + oldVersion := data.Version + data.Version += 1 var sqlResult sql.Result var err error - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return err - } - hmProductFeatureIdKey := fmt.Sprintf("%s%v", cacheHmProductFeatureIdPrefix, data.Id) - hmProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheHmProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) + yccProductFeatureIdKey := fmt.Sprintf("%s%v", cacheYccProductFeatureIdPrefix, 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, productFeatureRowsWithPlaceHolder) if session != nil { - return session.ExecCtx(ctx, query, newData.ProductId, newData.FeatureId, newData.DeleteTime, newData.DelState, newData.Version, newData.Sort, newData.IsImportant, newData.Enable, newData.Id, oldVersion) + return session.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable, data.ProductIdUuid, data.FeatureIdUuid, data.Id, oldVersion) } - return conn.ExecCtx(ctx, query, newData.ProductId, newData.FeatureId, newData.DeleteTime, newData.DelState, newData.Version, newData.Sort, newData.IsImportant, newData.Enable, newData.Id, oldVersion) - }, hmProductFeatureIdKey, hmProductFeatureProductIdFeatureIdKey) + return conn.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable, data.ProductIdUuid, data.FeatureIdUuid, data.Id, oldVersion) + }, yccProductFeatureIdKey) if err != nil { return err } @@ -381,25 +368,19 @@ func (m *defaultProductFeatureModel) Trans(ctx context.Context, fn func(ctx cont func (m *defaultProductFeatureModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultProductFeatureModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { - data, err := m.FindOne(ctx, id) - if err != nil { - return err - } - - hmProductFeatureIdKey := fmt.Sprintf("%s%v", cacheHmProductFeatureIdPrefix, id) - hmProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheHmProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) - _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { +func (m *defaultProductFeatureModel) Delete(ctx context.Context, session sqlx.Session, id string) error { + yccProductFeatureIdKey := fmt.Sprintf("%s%v", cacheYccProductFeatureIdPrefix, 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) - }, hmProductFeatureIdKey, hmProductFeatureProductIdFeatureIdKey) + }, yccProductFeatureIdKey) return err } func (m *defaultProductFeatureModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmProductFeatureIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccProductFeatureIdPrefix, primary) } func (m *defaultProductFeatureModel) 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", productFeatureRows, m.table) diff --git a/app/main/model/productModel_gen.go b/app/main/model/productModel_gen.go index c14bafe..95a5310 100644 --- a/app/main/model/productModel_gen.go +++ b/app/main/model/productModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( productFieldNames = builder.RawFieldNames(&Product{}) productRows = strings.Join(productFieldNames, ",") - productRowsExpectAutoSet = strings.Join(stringx.Remove(productFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + productRowsExpectAutoSet = strings.Join(stringx.Remove(productFieldNames, "`create_time`", "`update_time`"), ",") productRowsWithPlaceHolder = strings.Join(stringx.Remove(productFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmProductIdPrefix = "cache:ycc:product:id:" - cacheHmProductProductEnPrefix = "cache:ycc:product:productEn:" + cacheYccProductIdPrefix = "cache:ycc:product:id:" + cacheYccProductProductEnPrefix = "cache:ycc:product:productEn:" ) type ( productModel interface { Insert(ctx context.Context, session sqlx.Session, data *Product) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Product, error) + FindOne(ctx context.Context, id string) (*Product, error) FindOneByProductEn(ctx context.Context, productEn string) (*Product, error) Update(ctx context.Context, session sqlx.Session, data *Product) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Product) error @@ -48,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Product, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Product, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Product, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultProductModel struct { @@ -57,7 +58,7 @@ type ( } Product struct { - Id int64 `db:"id"` // 主键ID + Id string `db:"id"` CreateTime time.Time `db:"create_time"` // 创建时间 UpdateTime time.Time `db:"update_time"` // 更新时间 DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -81,21 +82,38 @@ func newProductModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultProductModel func (m *defaultProductModel) Insert(ctx context.Context, session sqlx.Session, data *Product) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmProductIdKey := fmt.Sprintf("%s%v", cacheHmProductIdPrefix, data.Id) - hmProductProductEnKey := fmt.Sprintf("%s%v", cacheHmProductProductEnPrefix, data.ProductEn) + m.insertUUID(data) + yccProductIdKey := fmt.Sprintf("%s%v", cacheYccProductIdPrefix, data.Id) + yccProductProductEnKey := fmt.Sprintf("%s%v", cacheYccProductProductEnPrefix, data.ProductEn) 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, productRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, productRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ProductName, data.ProductEn, data.Description, data.Notes, data.CostPrice, data.SellPrice) + return session.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ProductName, data.ProductEn, data.Description, data.Notes, data.CostPrice, data.SellPrice) } - return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.ProductName, data.ProductEn, data.Description, data.Notes, data.CostPrice, data.SellPrice) - }, hmProductIdKey, hmProductProductEnKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ProductName, data.ProductEn, data.Description, data.Notes, data.CostPrice, data.SellPrice) + }, yccProductIdKey, yccProductProductEnKey) +} +func (m *defaultProductModel) insertUUID(data *Product) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultProductModel) FindOne(ctx context.Context, id int64) (*Product, error) { - hmProductIdKey := fmt.Sprintf("%s%v", cacheHmProductIdPrefix, id) +func (m *defaultProductModel) FindOne(ctx context.Context, id string) (*Product, error) { + yccProductIdKey := fmt.Sprintf("%s%v", cacheYccProductIdPrefix, id) var resp Product - err := m.QueryRowCtx(ctx, &resp, hmProductIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccProductIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", productRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -110,9 +128,9 @@ func (m *defaultProductModel) FindOne(ctx context.Context, id int64) (*Product, } func (m *defaultProductModel) FindOneByProductEn(ctx context.Context, productEn string) (*Product, error) { - hmProductProductEnKey := fmt.Sprintf("%s%v", cacheHmProductProductEnPrefix, productEn) + yccProductProductEnKey := fmt.Sprintf("%s%v", cacheYccProductProductEnPrefix, productEn) var resp Product - err := m.QueryRowIndexCtx(ctx, &resp, hmProductProductEnKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccProductProductEnKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `product_en` = ? and del_state = ? limit 1", productRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, productEn, globalkey.DelStateNo); err != nil { return nil, err @@ -134,15 +152,15 @@ func (m *defaultProductModel) Update(ctx context.Context, session sqlx.Session, if err != nil { return nil, err } - hmProductIdKey := fmt.Sprintf("%s%v", cacheHmProductIdPrefix, data.Id) - hmProductProductEnKey := fmt.Sprintf("%s%v", cacheHmProductProductEnPrefix, data.ProductEn) + yccProductIdKey := fmt.Sprintf("%s%v", cacheYccProductIdPrefix, data.Id) + yccProductProductEnKey := fmt.Sprintf("%s%v", cacheYccProductProductEnPrefix, data.ProductEn) 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, productRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ProductName, newData.ProductEn, newData.Description, newData.Notes, newData.CostPrice, newData.SellPrice, newData.Id) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ProductName, newData.ProductEn, newData.Description, newData.Notes, newData.CostPrice, newData.SellPrice, newData.Id) - }, hmProductIdKey, hmProductProductEnKey) + }, yccProductIdKey, yccProductProductEnKey) } func (m *defaultProductModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Product) error { @@ -157,15 +175,15 @@ func (m *defaultProductModel) UpdateWithVersion(ctx context.Context, session sql if err != nil { return err } - hmProductIdKey := fmt.Sprintf("%s%v", cacheHmProductIdPrefix, data.Id) - hmProductProductEnKey := fmt.Sprintf("%s%v", cacheHmProductProductEnPrefix, data.ProductEn) + yccProductIdKey := fmt.Sprintf("%s%v", cacheYccProductIdPrefix, data.Id) + yccProductProductEnKey := fmt.Sprintf("%s%v", cacheYccProductProductEnPrefix, data.ProductEn) 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, productRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ProductName, newData.ProductEn, newData.Description, newData.Notes, newData.CostPrice, newData.SellPrice, newData.Id, oldVersion) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.ProductName, newData.ProductEn, newData.Description, newData.Notes, newData.CostPrice, newData.SellPrice, newData.Id, oldVersion) - }, hmProductIdKey, hmProductProductEnKey) + }, yccProductIdKey, yccProductProductEnKey) if err != nil { return err } @@ -382,25 +400,25 @@ func (m *defaultProductModel) Trans(ctx context.Context, fn func(ctx context.Con func (m *defaultProductModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultProductModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultProductModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmProductIdKey := fmt.Sprintf("%s%v", cacheHmProductIdPrefix, id) - hmProductProductEnKey := fmt.Sprintf("%s%v", cacheHmProductProductEnPrefix, data.ProductEn) + yccProductIdKey := fmt.Sprintf("%s%v", cacheYccProductIdPrefix, id) + yccProductProductEnKey := fmt.Sprintf("%s%v", cacheYccProductProductEnPrefix, data.ProductEn) _, 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) - }, hmProductIdKey, hmProductProductEnKey) + }, yccProductIdKey, yccProductProductEnKey) return err } func (m *defaultProductModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmProductIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccProductIdPrefix, primary) } func (m *defaultProductModel) 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", productRows, m.table) diff --git a/app/main/model/queryCleanupConfigModel_gen.go b/app/main/model/queryCleanupConfigModel_gen.go index 6490dde..6a14ccb 100644 --- a/app/main/model/queryCleanupConfigModel_gen.go +++ b/app/main/model/queryCleanupConfigModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( queryCleanupConfigFieldNames = builder.RawFieldNames(&QueryCleanupConfig{}) queryCleanupConfigRows = strings.Join(queryCleanupConfigFieldNames, ",") - queryCleanupConfigRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryCleanupConfigRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupConfigFieldNames, "`create_time`", "`update_time`"), ",") queryCleanupConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(queryCleanupConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmQueryCleanupConfigIdPrefix = "cache:ycc:queryCleanupConfig:id:" - cacheHmQueryCleanupConfigConfigKeyPrefix = "cache:ycc:queryCleanupConfig:configKey:" + cacheYccQueryCleanupConfigIdPrefix = "cache:ycc:queryCleanupConfig:id:" + cacheYccQueryCleanupConfigConfigKeyPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -48,7 +49,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultQueryCleanupConfigModel struct { @@ -57,7 +58,7 @@ type ( } QueryCleanupConfig struct { - Id int64 `db:"id"` // 主键ID + Id string `db:"id"` CreateTime time.Time `db:"create_time"` // 创建时间 UpdateTime time.Time `db:"update_time"` // 更新时间 DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -79,21 +80,38 @@ func newQueryCleanupConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQu func (m *defaultQueryCleanupConfigModel) Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupConfig) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) - hmQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigIdPrefix, data.Id) + m.insertUUID(data) + yccQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + yccQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmQueryCleanupConfigConfigKeyKey, hmQueryCleanupConfigIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.ConfigKey, data.ConfigValue, data.ConfigDesc, data.Status) + }, yccQueryCleanupConfigConfigKeyKey, yccQueryCleanupConfigIdKey) +} +func (m *defaultQueryCleanupConfigModel) insertUUID(data *QueryCleanupConfig) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultQueryCleanupConfigModel) FindOne(ctx context.Context, id int64) (*QueryCleanupConfig, error) { - hmQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigIdPrefix, id) +func (m *defaultQueryCleanupConfigModel) FindOne(ctx context.Context, id string) (*QueryCleanupConfig, error) { + yccQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigIdPrefix, id) var resp QueryCleanupConfig - err := m.QueryRowCtx(ctx, &resp, hmQueryCleanupConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccQueryCleanupConfigIdKey, 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) }) @@ -108,9 +126,9 @@ func (m *defaultQueryCleanupConfigModel) FindOne(ctx context.Context, id int64) } func (m *defaultQueryCleanupConfigModel) FindOneByConfigKey(ctx context.Context, configKey string) (*QueryCleanupConfig, error) { - hmQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigConfigKeyPrefix, configKey) + yccQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigConfigKeyPrefix, configKey) var resp QueryCleanupConfig - err := m.QueryRowIndexCtx(ctx, &resp, hmQueryCleanupConfigConfigKeyKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccQueryCleanupConfigConfigKeyKey, 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 @@ -132,15 +150,15 @@ func (m *defaultQueryCleanupConfigModel) Update(ctx context.Context, session sql if err != nil { return nil, err } - hmQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) - hmQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigIdPrefix, data.Id) + yccQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + yccQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigIdPrefix, 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) - }, hmQueryCleanupConfigConfigKeyKey, hmQueryCleanupConfigIdKey) + }, yccQueryCleanupConfigConfigKeyKey, yccQueryCleanupConfigIdKey) } func (m *defaultQueryCleanupConfigModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *QueryCleanupConfig) error { @@ -155,15 +173,15 @@ func (m *defaultQueryCleanupConfigModel) UpdateWithVersion(ctx context.Context, if err != nil { return err } - hmQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) - hmQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigIdPrefix, data.Id) + yccQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + yccQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigIdPrefix, 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) - }, hmQueryCleanupConfigConfigKeyKey, hmQueryCleanupConfigIdKey) + }, yccQueryCleanupConfigConfigKeyKey, yccQueryCleanupConfigIdKey) if err != nil { return err } @@ -380,25 +398,25 @@ func (m *defaultQueryCleanupConfigModel) Trans(ctx context.Context, fn func(ctx 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 { +func (m *defaultQueryCleanupConfigModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) - hmQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigIdPrefix, id) + yccQueryCleanupConfigConfigKeyKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigConfigKeyPrefix, data.ConfigKey) + yccQueryCleanupConfigIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigIdPrefix, 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) - }, hmQueryCleanupConfigConfigKeyKey, hmQueryCleanupConfigIdKey) + }, yccQueryCleanupConfigConfigKeyKey, yccQueryCleanupConfigIdKey) return err } func (m *defaultQueryCleanupConfigModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmQueryCleanupConfigIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccQueryCleanupConfigIdPrefix, 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) diff --git a/app/main/model/queryCleanupDetailModel_gen.go b/app/main/model/queryCleanupDetailModel_gen.go index 3e4dfdc..9ad222e 100644 --- a/app/main/model/queryCleanupDetailModel_gen.go +++ b/app/main/model/queryCleanupDetailModel_gen.go @@ -8,32 +8,33 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( queryCleanupDetailFieldNames = builder.RawFieldNames(&QueryCleanupDetail{}) queryCleanupDetailRows = strings.Join(queryCleanupDetailFieldNames, ",") - queryCleanupDetailRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupDetailFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryCleanupDetailRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupDetailFieldNames, "`create_time`", "`update_time`"), ",") queryCleanupDetailRowsWithPlaceHolder = strings.Join(stringx.Remove(queryCleanupDetailFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmQueryCleanupDetailIdPrefix = "cache:ycc:queryCleanupDetail:id:" + cacheYccQueryCleanupDetailIdPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -46,7 +47,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultQueryCleanupDetailModel struct { @@ -55,17 +56,17 @@ type ( } 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 + Id string `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"` // 删除状态:0-未删除,1-已删除 + Version int64 `db:"version"` // 版本号 + CleanupLogId string `db:"cleanup_log_id"` + QueryId string `db:"query_id"` + OrderId string `db:"order_id"` + UserId string `db:"user_id"` + ProductId string `db:"product_id"` QueryState string `db:"query_state"` // 查询状态 CreateTimeOld time.Time `db:"create_time_old"` // 原记录创建时间 } @@ -80,20 +81,37 @@ func newQueryCleanupDetailModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQu func (m *defaultQueryCleanupDetailModel) Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupDetailIdPrefix, data.Id) + m.insertUUID(data) + yccQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupDetailIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmQueryCleanupDetailIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.CleanupLogId, data.QueryId, data.OrderId, data.UserId, data.ProductId, data.QueryState, data.CreateTimeOld) + }, yccQueryCleanupDetailIdKey) +} +func (m *defaultQueryCleanupDetailModel) insertUUID(data *QueryCleanupDetail) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultQueryCleanupDetailModel) FindOne(ctx context.Context, id int64) (*QueryCleanupDetail, error) { - hmQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupDetailIdPrefix, id) +func (m *defaultQueryCleanupDetailModel) FindOne(ctx context.Context, id string) (*QueryCleanupDetail, error) { + yccQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupDetailIdPrefix, id) var resp QueryCleanupDetail - err := m.QueryRowCtx(ctx, &resp, hmQueryCleanupDetailIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccQueryCleanupDetailIdKey, 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) }) @@ -108,14 +126,14 @@ func (m *defaultQueryCleanupDetailModel) FindOne(ctx context.Context, id int64) } func (m *defaultQueryCleanupDetailModel) Update(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) (sql.Result, error) { - hmQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupDetailIdPrefix, data.Id) + yccQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupDetailIdPrefix, 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) - }, hmQueryCleanupDetailIdKey) + }, yccQueryCleanupDetailIdKey) } func (m *defaultQueryCleanupDetailModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupDetail) error { @@ -126,14 +144,14 @@ func (m *defaultQueryCleanupDetailModel) UpdateWithVersion(ctx context.Context, var sqlResult sql.Result var err error - hmQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupDetailIdPrefix, data.Id) + yccQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupDetailIdPrefix, 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) - }, hmQueryCleanupDetailIdKey) + }, yccQueryCleanupDetailIdKey) if err != nil { return err } @@ -350,19 +368,19 @@ func (m *defaultQueryCleanupDetailModel) Trans(ctx context.Context, fn func(ctx 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 { - hmQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupDetailIdPrefix, id) +func (m *defaultQueryCleanupDetailModel) Delete(ctx context.Context, session sqlx.Session, id string) error { + yccQueryCleanupDetailIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupDetailIdPrefix, 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) - }, hmQueryCleanupDetailIdKey) + }, yccQueryCleanupDetailIdKey) return err } func (m *defaultQueryCleanupDetailModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmQueryCleanupDetailIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccQueryCleanupDetailIdPrefix, 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) diff --git a/app/main/model/queryCleanupLogModel_gen.go b/app/main/model/queryCleanupLogModel_gen.go index 459d7ee..d4a5bb1 100644 --- a/app/main/model/queryCleanupLogModel_gen.go +++ b/app/main/model/queryCleanupLogModel_gen.go @@ -8,32 +8,33 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( queryCleanupLogFieldNames = builder.RawFieldNames(&QueryCleanupLog{}) queryCleanupLogRows = strings.Join(queryCleanupLogFieldNames, ",") - queryCleanupLogRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupLogFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryCleanupLogRowsExpectAutoSet = strings.Join(stringx.Remove(queryCleanupLogFieldNames, "`create_time`", "`update_time`"), ",") queryCleanupLogRowsWithPlaceHolder = strings.Join(stringx.Remove(queryCleanupLogFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmQueryCleanupLogIdPrefix = "cache:ycc:queryCleanupLog:id:" + cacheYccQueryCleanupLogIdPrefix = "cache:ycc: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) + FindOne(ctx context.Context, id string) (*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 @@ -46,7 +47,7 @@ type ( 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 + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultQueryCleanupLogModel struct { @@ -55,7 +56,7 @@ type ( } QueryCleanupLog struct { - Id int64 `db:"id"` // 主键ID + Id string `db:"id"` CreateTime time.Time `db:"create_time"` // 创建时间 UpdateTime time.Time `db:"update_time"` // 更新时间 DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -79,20 +80,37 @@ func newQueryCleanupLogModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQuery func (m *defaultQueryCleanupLogModel) Insert(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupLogIdPrefix, data.Id) + m.insertUUID(data) + yccQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupLogIdPrefix, 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) + 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 session.ExecCtx(ctx, query, data.Id, 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) - }, hmQueryCleanupLogIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.CleanupTime, data.CleanupBefore, data.AffectedRows, data.Status, data.ErrorMsg, data.Remark) + }, yccQueryCleanupLogIdKey) +} +func (m *defaultQueryCleanupLogModel) insertUUID(data *QueryCleanupLog) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultQueryCleanupLogModel) FindOne(ctx context.Context, id int64) (*QueryCleanupLog, error) { - hmQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupLogIdPrefix, id) +func (m *defaultQueryCleanupLogModel) FindOne(ctx context.Context, id string) (*QueryCleanupLog, error) { + yccQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupLogIdPrefix, id) var resp QueryCleanupLog - err := m.QueryRowCtx(ctx, &resp, hmQueryCleanupLogIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccQueryCleanupLogIdKey, 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) }) @@ -107,14 +125,14 @@ func (m *defaultQueryCleanupLogModel) FindOne(ctx context.Context, id int64) (*Q } func (m *defaultQueryCleanupLogModel) Update(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) (sql.Result, error) { - hmQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupLogIdPrefix, data.Id) + yccQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupLogIdPrefix, 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) - }, hmQueryCleanupLogIdKey) + }, yccQueryCleanupLogIdKey) } func (m *defaultQueryCleanupLogModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *QueryCleanupLog) error { @@ -125,14 +143,14 @@ func (m *defaultQueryCleanupLogModel) UpdateWithVersion(ctx context.Context, ses var sqlResult sql.Result var err error - hmQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupLogIdPrefix, data.Id) + yccQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupLogIdPrefix, 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) - }, hmQueryCleanupLogIdKey) + }, yccQueryCleanupLogIdKey) if err != nil { return err } @@ -349,19 +367,19 @@ func (m *defaultQueryCleanupLogModel) Trans(ctx context.Context, fn func(ctx con 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 { - hmQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheHmQueryCleanupLogIdPrefix, id) +func (m *defaultQueryCleanupLogModel) Delete(ctx context.Context, session sqlx.Session, id string) error { + yccQueryCleanupLogIdKey := fmt.Sprintf("%s%v", cacheYccQueryCleanupLogIdPrefix, 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) - }, hmQueryCleanupLogIdKey) + }, yccQueryCleanupLogIdKey) return err } func (m *defaultQueryCleanupLogModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmQueryCleanupLogIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccQueryCleanupLogIdPrefix, 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) diff --git a/app/main/model/queryModel.go b/app/main/model/queryModel.go index f43c145..35d09bc 100644 --- a/app/main/model/queryModel.go +++ b/app/main/model/queryModel.go @@ -1,24 +1,26 @@ package model import ( - "context" - "ycc-server/common/globalkey" - "fmt" - "time" + "context" + "database/sql" + "ycc-server/common/globalkey" + "fmt" + "time" - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" ) var _ QueryModel = (*customQueryModel)(nil) type ( - // QueryModel is an interface to be customized, add more methods here, - // and implement the added methods in customQueryModel. - QueryModel interface { - queryModel - DeleteBefore(ctx context.Context, before time.Time) (int64, error) - } + // QueryModel is an interface to be customized, add more methods here, + // and implement the added methods in customQueryModel. + QueryModel interface { + queryModel + DeleteBefore(ctx context.Context, before time.Time) (int64, error) + UpdateUserIDWithSession(ctx context.Context, session sqlx.Session, sourceUserID, targetUserID string) error + } customQueryModel struct { *defaultQueryModel @@ -27,9 +29,9 @@ type ( // NewQueryModel returns a model for the database table. func NewQueryModel(conn sqlx.SqlConn, c cache.CacheConf) QueryModel { - return &customQueryModel{ - defaultQueryModel: newQueryModel(conn, c), - } + return &customQueryModel{ + defaultQueryModel: newQueryModel(conn, c), + } } func (m *customQueryModel) DeleteBefore(ctx context.Context, before time.Time) (int64, error) { @@ -58,3 +60,26 @@ func (m *customQueryModel) DeleteBefore(ctx context.Context, before time.Time) ( return affected, nil } + +func (m *customQueryModel) UpdateUserIDWithSession(ctx context.Context, session sqlx.Session, sourceUserID, targetUserID string) error { + builder := m.defaultQueryModel.SelectBuilder().Where("user_id = ?", sourceUserID) + rows, err := m.defaultQueryModel.FindAll(ctx, builder, "") + if err != nil { + return err + } + + keys := make([]string, 0, len(rows)*2) + for _, r := range rows { + keys = append(keys, fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, r.Id)) + keys = append(keys, fmt.Sprintf("%s%v", cacheYccQueryOrderIdPrefix, r.OrderId)) + } + + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("UPDATE %s SET user_id = ? WHERE user_id = ?", m.defaultQueryModel.tableName()) + if session != nil { + return session.ExecCtx(ctx, query, targetUserID, sourceUserID) + } + return conn.ExecCtx(ctx, query, targetUserID, sourceUserID) + }, keys...) + return err +} diff --git a/app/main/model/queryModel_gen.go b/app/main/model/queryModel_gen.go index 8b3b194..e9016e2 100644 --- a/app/main/model/queryModel_gen.go +++ b/app/main/model/queryModel_gen.go @@ -8,34 +8,35 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( queryFieldNames = builder.RawFieldNames(&Query{}) queryRows = strings.Join(queryFieldNames, ",") - queryRowsExpectAutoSet = strings.Join(stringx.Remove(queryFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + queryRowsExpectAutoSet = strings.Join(stringx.Remove(queryFieldNames, "`create_time`", "`update_time`"), ",") queryRowsWithPlaceHolder = strings.Join(stringx.Remove(queryFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmQueryIdPrefix = "cache:ycc:query:id:" - cacheHmQueryOrderIdPrefix = "cache:ycc:query:orderId:" + cacheYccQueryIdPrefix = "cache:ycc:query:id:" + cacheYccQueryOrderIdPrefix = "cache:ycc:query:orderId:" ) type ( queryModel interface { Insert(ctx context.Context, session sqlx.Session, data *Query) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*Query, error) - FindOneByOrderId(ctx context.Context, orderId int64) (*Query, error) + FindOne(ctx context.Context, id string) (*Query, error) + FindOneByOrderId(ctx context.Context, orderId string) (*Query, error) Update(ctx context.Context, session sqlx.Session, data *Query) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Query) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -48,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Query, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Query, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Query, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultQueryModel struct { @@ -57,10 +58,10 @@ type ( } Query struct { - Id int64 `db:"id"` // 主键ID - OrderId int64 `db:"order_id"` // 订单ID(软关联到订单表) - UserId int64 `db:"user_id"` // 用户ID(直接关联到用户) - ProductId int64 `db:"product_id"` // 产品ID(直接关联到产品) + Id string `db:"id"` + OrderId string `db:"order_id"` + UserId string `db:"user_id"` + ProductId string `db:"product_id"` QueryParams string `db:"query_params"` // 查询params数据 QueryData sql.NullString `db:"query_data"` // 查询结果数据 QueryState string `db:"query_state"` // 查询状态 @@ -81,21 +82,38 @@ func newQueryModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultQueryModel { func (m *defaultQueryModel) Insert(ctx context.Context, session sqlx.Session, data *Query) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmQueryIdKey := fmt.Sprintf("%s%v", cacheHmQueryIdPrefix, data.Id) - hmQueryOrderIdKey := fmt.Sprintf("%s%v", cacheHmQueryOrderIdPrefix, data.OrderId) + m.insertUUID(data) + yccQueryIdKey := fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, data.Id) + yccQueryOrderIdKey := fmt.Sprintf("%s%v", cacheYccQueryOrderIdPrefix, 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, queryRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, queryRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.OrderId, data.UserId, data.ProductId, data.QueryParams, data.QueryData, data.QueryState, data.DelState, data.Version, data.DeleteTime) + return session.ExecCtx(ctx, query, data.Id, data.OrderId, data.UserId, data.ProductId, data.QueryParams, data.QueryData, data.QueryState, data.DelState, data.Version, data.DeleteTime) } - return conn.ExecCtx(ctx, query, data.OrderId, data.UserId, data.ProductId, data.QueryParams, data.QueryData, data.QueryState, data.DelState, data.Version, data.DeleteTime) - }, hmQueryIdKey, hmQueryOrderIdKey) + return conn.ExecCtx(ctx, query, data.Id, data.OrderId, data.UserId, data.ProductId, data.QueryParams, data.QueryData, data.QueryState, data.DelState, data.Version, data.DeleteTime) + }, yccQueryIdKey, yccQueryOrderIdKey) +} +func (m *defaultQueryModel) insertUUID(data *Query) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultQueryModel) FindOne(ctx context.Context, id int64) (*Query, error) { - hmQueryIdKey := fmt.Sprintf("%s%v", cacheHmQueryIdPrefix, id) +func (m *defaultQueryModel) FindOne(ctx context.Context, id string) (*Query, error) { + yccQueryIdKey := fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, id) var resp Query - err := m.QueryRowCtx(ctx, &resp, hmQueryIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccQueryIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", queryRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -109,10 +127,10 @@ func (m *defaultQueryModel) FindOne(ctx context.Context, id int64) (*Query, erro } } -func (m *defaultQueryModel) FindOneByOrderId(ctx context.Context, orderId int64) (*Query, error) { - hmQueryOrderIdKey := fmt.Sprintf("%s%v", cacheHmQueryOrderIdPrefix, orderId) +func (m *defaultQueryModel) FindOneByOrderId(ctx context.Context, orderId string) (*Query, error) { + yccQueryOrderIdKey := fmt.Sprintf("%s%v", cacheYccQueryOrderIdPrefix, orderId) var resp Query - err := m.QueryRowIndexCtx(ctx, &resp, hmQueryOrderIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccQueryOrderIdKey, 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", queryRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, orderId, globalkey.DelStateNo); err != nil { return nil, err @@ -134,15 +152,15 @@ func (m *defaultQueryModel) Update(ctx context.Context, session sqlx.Session, ne if err != nil { return nil, err } - hmQueryIdKey := fmt.Sprintf("%s%v", cacheHmQueryIdPrefix, data.Id) - hmQueryOrderIdKey := fmt.Sprintf("%s%v", cacheHmQueryOrderIdPrefix, data.OrderId) + yccQueryIdKey := fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, data.Id) + yccQueryOrderIdKey := fmt.Sprintf("%s%v", cacheYccQueryOrderIdPrefix, 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, queryRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.OrderId, newData.UserId, newData.ProductId, newData.QueryParams, newData.QueryData, newData.QueryState, newData.DelState, newData.Version, newData.DeleteTime, newData.Id) } return conn.ExecCtx(ctx, query, newData.OrderId, newData.UserId, newData.ProductId, newData.QueryParams, newData.QueryData, newData.QueryState, newData.DelState, newData.Version, newData.DeleteTime, newData.Id) - }, hmQueryIdKey, hmQueryOrderIdKey) + }, yccQueryIdKey, yccQueryOrderIdKey) } func (m *defaultQueryModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Query) error { @@ -157,15 +175,15 @@ func (m *defaultQueryModel) UpdateWithVersion(ctx context.Context, session sqlx. if err != nil { return err } - hmQueryIdKey := fmt.Sprintf("%s%v", cacheHmQueryIdPrefix, data.Id) - hmQueryOrderIdKey := fmt.Sprintf("%s%v", cacheHmQueryOrderIdPrefix, data.OrderId) + yccQueryIdKey := fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, data.Id) + yccQueryOrderIdKey := fmt.Sprintf("%s%v", cacheYccQueryOrderIdPrefix, 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, queryRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.OrderId, newData.UserId, newData.ProductId, newData.QueryParams, newData.QueryData, newData.QueryState, newData.DelState, newData.Version, newData.DeleteTime, newData.Id, oldVersion) } return conn.ExecCtx(ctx, query, newData.OrderId, newData.UserId, newData.ProductId, newData.QueryParams, newData.QueryData, newData.QueryState, newData.DelState, newData.Version, newData.DeleteTime, newData.Id, oldVersion) - }, hmQueryIdKey, hmQueryOrderIdKey) + }, yccQueryIdKey, yccQueryOrderIdKey) if err != nil { return err } @@ -382,25 +400,25 @@ func (m *defaultQueryModel) Trans(ctx context.Context, fn func(ctx context.Conte func (m *defaultQueryModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultQueryModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultQueryModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmQueryIdKey := fmt.Sprintf("%s%v", cacheHmQueryIdPrefix, id) - hmQueryOrderIdKey := fmt.Sprintf("%s%v", cacheHmQueryOrderIdPrefix, data.OrderId) + yccQueryIdKey := fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, id) + yccQueryOrderIdKey := fmt.Sprintf("%s%v", cacheYccQueryOrderIdPrefix, 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) - }, hmQueryIdKey, hmQueryOrderIdKey) + }, yccQueryIdKey, yccQueryOrderIdKey) return err } func (m *defaultQueryModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmQueryIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccQueryIdPrefix, primary) } func (m *defaultQueryModel) 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", queryRows, m.table) diff --git a/app/main/model/userAuthModel_gen.go b/app/main/model/userAuthModel_gen.go index c32cbb7..0998d64 100644 --- a/app/main/model/userAuthModel_gen.go +++ b/app/main/model/userAuthModel_gen.go @@ -8,36 +8,37 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( userAuthFieldNames = builder.RawFieldNames(&UserAuth{}) userAuthRows = strings.Join(userAuthFieldNames, ",") - userAuthRowsExpectAutoSet = strings.Join(stringx.Remove(userAuthFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + userAuthRowsExpectAutoSet = strings.Join(stringx.Remove(userAuthFieldNames, "`create_time`", "`update_time`"), ",") userAuthRowsWithPlaceHolder = strings.Join(stringx.Remove(userAuthFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmUserAuthIdPrefix = "cache:ycc:userAuth:id:" - cacheHmUserAuthAuthTypeAuthKeyPrefix = "cache:ycc:userAuth:authType:authKey:" - cacheHmUserAuthUserIdAuthTypePrefix = "cache:ycc:userAuth:userId:authType:" + cacheYccUserAuthIdPrefix = "cache:ycc:userAuth:id:" + cacheYccUserAuthAuthTypeAuthKeyPrefix = "cache:ycc:userAuth:authType:authKey:" + cacheYccUserAuthUserIdAuthTypePrefix = "cache:ycc:userAuth:userId:authType:" ) type ( userAuthModel interface { Insert(ctx context.Context, session sqlx.Session, data *UserAuth) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*UserAuth, error) + FindOne(ctx context.Context, id string) (*UserAuth, error) FindOneByAuthTypeAuthKey(ctx context.Context, authType string, authKey string) (*UserAuth, error) - FindOneByUserIdAuthType(ctx context.Context, userId int64, authType string) (*UserAuth, error) + FindOneByUserIdAuthType(ctx context.Context, userId string, authType string) (*UserAuth, error) Update(ctx context.Context, session sqlx.Session, data *UserAuth) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *UserAuth) error Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error @@ -50,7 +51,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*UserAuth, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*UserAuth, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*UserAuth, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultUserAuthModel struct { @@ -59,13 +60,13 @@ type ( } UserAuth struct { - Id int64 `db:"id"` + Id string `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"` + UserId string `db:"user_id"` AuthKey string `db:"auth_key"` // 平台唯一id AuthType string `db:"auth_type"` // 平台类型 } @@ -80,22 +81,39 @@ func newUserAuthModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultUserAuthMode func (m *defaultUserAuthModel) Insert(ctx context.Context, session sqlx.Session, data *UserAuth) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) - hmUserAuthIdKey := fmt.Sprintf("%s%v", cacheHmUserAuthIdPrefix, data.Id) - hmUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) + m.insertUUID(data) + yccUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + yccUserAuthIdKey := fmt.Sprintf("%s%v", cacheYccUserAuthIdPrefix, data.Id) + yccUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) 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, userAuthRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?)", m.table, userAuthRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.UserId, data.AuthKey, data.AuthType) + return session.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.UserId, data.AuthKey, data.AuthType) } - return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.UserId, data.AuthKey, data.AuthType) - }, hmUserAuthAuthTypeAuthKeyKey, hmUserAuthIdKey, hmUserAuthUserIdAuthTypeKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.UserId, data.AuthKey, data.AuthType) + }, yccUserAuthAuthTypeAuthKeyKey, yccUserAuthIdKey, yccUserAuthUserIdAuthTypeKey) +} +func (m *defaultUserAuthModel) insertUUID(data *UserAuth) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultUserAuthModel) FindOne(ctx context.Context, id int64) (*UserAuth, error) { - hmUserAuthIdKey := fmt.Sprintf("%s%v", cacheHmUserAuthIdPrefix, id) +func (m *defaultUserAuthModel) FindOne(ctx context.Context, id string) (*UserAuth, error) { + yccUserAuthIdKey := fmt.Sprintf("%s%v", cacheYccUserAuthIdPrefix, id) var resp UserAuth - err := m.QueryRowCtx(ctx, &resp, hmUserAuthIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccUserAuthIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", userAuthRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -110,9 +128,9 @@ func (m *defaultUserAuthModel) FindOne(ctx context.Context, id int64) (*UserAuth } func (m *defaultUserAuthModel) FindOneByAuthTypeAuthKey(ctx context.Context, authType string, authKey string) (*UserAuth, error) { - hmUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthAuthTypeAuthKeyPrefix, authType, authKey) + yccUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthAuthTypeAuthKeyPrefix, authType, authKey) var resp UserAuth - err := m.QueryRowIndexCtx(ctx, &resp, hmUserAuthAuthTypeAuthKeyKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccUserAuthAuthTypeAuthKeyKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `auth_type` = ? and `auth_key` = ? and del_state = ? limit 1", userAuthRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, authType, authKey, globalkey.DelStateNo); err != nil { return nil, err @@ -129,10 +147,10 @@ func (m *defaultUserAuthModel) FindOneByAuthTypeAuthKey(ctx context.Context, aut } } -func (m *defaultUserAuthModel) FindOneByUserIdAuthType(ctx context.Context, userId int64, authType string) (*UserAuth, error) { - hmUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthUserIdAuthTypePrefix, userId, authType) +func (m *defaultUserAuthModel) FindOneByUserIdAuthType(ctx context.Context, userId string, authType string) (*UserAuth, error) { + yccUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthUserIdAuthTypePrefix, userId, authType) var resp UserAuth - err := m.QueryRowIndexCtx(ctx, &resp, hmUserAuthUserIdAuthTypeKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccUserAuthUserIdAuthTypeKey, 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 `auth_type` = ? and del_state = ? limit 1", userAuthRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, userId, authType, globalkey.DelStateNo); err != nil { return nil, err @@ -154,16 +172,16 @@ func (m *defaultUserAuthModel) Update(ctx context.Context, session sqlx.Session, if err != nil { return nil, err } - hmUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) - hmUserAuthIdKey := fmt.Sprintf("%s%v", cacheHmUserAuthIdPrefix, data.Id) - hmUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) + yccUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + yccUserAuthIdKey := fmt.Sprintf("%s%v", cacheYccUserAuthIdPrefix, data.Id) + yccUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) 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, userAuthRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.AuthKey, newData.AuthType, newData.Id) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.AuthKey, newData.AuthType, newData.Id) - }, hmUserAuthAuthTypeAuthKeyKey, hmUserAuthIdKey, hmUserAuthUserIdAuthTypeKey) + }, yccUserAuthAuthTypeAuthKeyKey, yccUserAuthIdKey, yccUserAuthUserIdAuthTypeKey) } func (m *defaultUserAuthModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *UserAuth) error { @@ -178,16 +196,16 @@ func (m *defaultUserAuthModel) UpdateWithVersion(ctx context.Context, session sq if err != nil { return err } - hmUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) - hmUserAuthIdKey := fmt.Sprintf("%s%v", cacheHmUserAuthIdPrefix, data.Id) - hmUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) + yccUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + yccUserAuthIdKey := fmt.Sprintf("%s%v", cacheYccUserAuthIdPrefix, data.Id) + yccUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) 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, userAuthRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.AuthKey, newData.AuthType, newData.Id, oldVersion) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.UserId, newData.AuthKey, newData.AuthType, newData.Id, oldVersion) - }, hmUserAuthAuthTypeAuthKeyKey, hmUserAuthIdKey, hmUserAuthUserIdAuthTypeKey) + }, yccUserAuthAuthTypeAuthKeyKey, yccUserAuthIdKey, yccUserAuthUserIdAuthTypeKey) if err != nil { return err } @@ -404,26 +422,26 @@ func (m *defaultUserAuthModel) Trans(ctx context.Context, fn func(ctx context.Co func (m *defaultUserAuthModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultUserAuthModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultUserAuthModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) - hmUserAuthIdKey := fmt.Sprintf("%s%v", cacheHmUserAuthIdPrefix, id) - hmUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheHmUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) + yccUserAuthAuthTypeAuthKeyKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthAuthTypeAuthKeyPrefix, data.AuthType, data.AuthKey) + yccUserAuthIdKey := fmt.Sprintf("%s%v", cacheYccUserAuthIdPrefix, id) + yccUserAuthUserIdAuthTypeKey := fmt.Sprintf("%s%v:%v", cacheYccUserAuthUserIdAuthTypePrefix, data.UserId, data.AuthType) _, 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) - }, hmUserAuthAuthTypeAuthKeyKey, hmUserAuthIdKey, hmUserAuthUserIdAuthTypeKey) + }, yccUserAuthAuthTypeAuthKeyKey, yccUserAuthIdKey, yccUserAuthUserIdAuthTypeKey) return err } func (m *defaultUserAuthModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmUserAuthIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccUserAuthIdPrefix, primary) } func (m *defaultUserAuthModel) 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", userAuthRows, m.table) diff --git a/app/main/model/userModel_gen.go b/app/main/model/userModel_gen.go index e45f1cd..8697db0 100644 --- a/app/main/model/userModel_gen.go +++ b/app/main/model/userModel_gen.go @@ -8,33 +8,34 @@ import ( "fmt" "strings" + "reflect" "time" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" + "github.com/google/uuid" "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" + "ycc-server/common/globalkey" ) var ( userFieldNames = builder.RawFieldNames(&User{}) userRows = strings.Join(userFieldNames, ",") - userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "`create_time`", "`update_time`"), ",") userRowsWithPlaceHolder = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - cacheHmUserIdPrefix = "cache:ycc:user:id:" - cacheHmUserMobilePrefix = "cache:ycc:user:mobile:" + cacheYccUserIdPrefix = "cache:ycc:user:id:" + cacheYccUserMobilePrefix = "cache:ycc:user:mobile:" ) type ( userModel interface { Insert(ctx context.Context, session sqlx.Session, data *User) (sql.Result, error) - FindOne(ctx context.Context, id int64) (*User, error) + FindOne(ctx context.Context, id string) (*User, error) FindOneByMobile(ctx context.Context, mobile sql.NullString) (*User, error) Update(ctx context.Context, session sqlx.Session, data *User) (sql.Result, error) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *User) error @@ -48,7 +49,7 @@ type ( FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*User, int64, error) FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*User, error) FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*User, error) - Delete(ctx context.Context, session sqlx.Session, id int64) error + Delete(ctx context.Context, session sqlx.Session, id string) error } defaultUserModel struct { @@ -57,7 +58,7 @@ type ( } User struct { - Id int64 `db:"id"` + Id string `db:"id"` CreateTime time.Time `db:"create_time"` UpdateTime time.Time `db:"update_time"` DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 @@ -80,21 +81,38 @@ func newUserModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultUserModel { func (m *defaultUserModel) Insert(ctx context.Context, session sqlx.Session, data *User) (sql.Result, error) { data.DelState = globalkey.DelStateNo - hmUserIdKey := fmt.Sprintf("%s%v", cacheHmUserIdPrefix, data.Id) - hmUserMobileKey := fmt.Sprintf("%s%v", cacheHmUserMobilePrefix, data.Mobile) + m.insertUUID(data) + yccUserIdKey := fmt.Sprintf("%s%v", cacheYccUserIdPrefix, data.Id) + yccUserMobileKey := fmt.Sprintf("%s%v", cacheYccUserMobilePrefix, data.Mobile) 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, userRowsExpectAutoSet) + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, userRowsExpectAutoSet) if session != nil { - return session.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Mobile, data.Password, data.Nickname, data.Info, data.Inside) + return session.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.Mobile, data.Password, data.Nickname, data.Info, data.Inside) } - return conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Mobile, data.Password, data.Nickname, data.Info, data.Inside) - }, hmUserIdKey, hmUserMobileKey) + return conn.ExecCtx(ctx, query, data.Id, data.DeleteTime, data.DelState, data.Version, data.Mobile, data.Password, data.Nickname, data.Info, data.Inside) + }, yccUserIdKey, yccUserMobileKey) +} +func (m *defaultUserModel) insertUUID(data *User) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } -func (m *defaultUserModel) FindOne(ctx context.Context, id int64) (*User, error) { - hmUserIdKey := fmt.Sprintf("%s%v", cacheHmUserIdPrefix, id) +func (m *defaultUserModel) FindOne(ctx context.Context, id string) (*User, error) { + yccUserIdKey := fmt.Sprintf("%s%v", cacheYccUserIdPrefix, id) var resp User - err := m.QueryRowCtx(ctx, &resp, hmUserIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + err := m.QueryRowCtx(ctx, &resp, yccUserIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", userRows, m.table) return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) }) @@ -109,9 +127,9 @@ func (m *defaultUserModel) FindOne(ctx context.Context, id int64) (*User, error) } func (m *defaultUserModel) FindOneByMobile(ctx context.Context, mobile sql.NullString) (*User, error) { - hmUserMobileKey := fmt.Sprintf("%s%v", cacheHmUserMobilePrefix, mobile) + yccUserMobileKey := fmt.Sprintf("%s%v", cacheYccUserMobilePrefix, mobile) var resp User - err := m.QueryRowIndexCtx(ctx, &resp, hmUserMobileKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + err := m.QueryRowIndexCtx(ctx, &resp, yccUserMobileKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { query := fmt.Sprintf("select %s from %s where `mobile` = ? and del_state = ? limit 1", userRows, m.table) if err := conn.QueryRowCtx(ctx, &resp, query, mobile, globalkey.DelStateNo); err != nil { return nil, err @@ -133,15 +151,15 @@ func (m *defaultUserModel) Update(ctx context.Context, session sqlx.Session, new if err != nil { return nil, err } - hmUserIdKey := fmt.Sprintf("%s%v", cacheHmUserIdPrefix, data.Id) - hmUserMobileKey := fmt.Sprintf("%s%v", cacheHmUserMobilePrefix, data.Mobile) + yccUserIdKey := fmt.Sprintf("%s%v", cacheYccUserIdPrefix, data.Id) + yccUserMobileKey := fmt.Sprintf("%s%v", cacheYccUserMobilePrefix, data.Mobile) 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, userRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Mobile, newData.Password, newData.Nickname, newData.Info, newData.Inside, newData.Id) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Mobile, newData.Password, newData.Nickname, newData.Info, newData.Inside, newData.Id) - }, hmUserIdKey, hmUserMobileKey) + }, yccUserIdKey, yccUserMobileKey) } func (m *defaultUserModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *User) error { @@ -156,15 +174,15 @@ func (m *defaultUserModel) UpdateWithVersion(ctx context.Context, session sqlx.S if err != nil { return err } - hmUserIdKey := fmt.Sprintf("%s%v", cacheHmUserIdPrefix, data.Id) - hmUserMobileKey := fmt.Sprintf("%s%v", cacheHmUserMobilePrefix, data.Mobile) + yccUserIdKey := fmt.Sprintf("%s%v", cacheYccUserIdPrefix, data.Id) + yccUserMobileKey := fmt.Sprintf("%s%v", cacheYccUserMobilePrefix, data.Mobile) 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, userRowsWithPlaceHolder) if session != nil { return session.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Mobile, newData.Password, newData.Nickname, newData.Info, newData.Inside, newData.Id, oldVersion) } return conn.ExecCtx(ctx, query, newData.DeleteTime, newData.DelState, newData.Version, newData.Mobile, newData.Password, newData.Nickname, newData.Info, newData.Inside, newData.Id, oldVersion) - }, hmUserIdKey, hmUserMobileKey) + }, yccUserIdKey, yccUserMobileKey) if err != nil { return err } @@ -381,25 +399,25 @@ func (m *defaultUserModel) Trans(ctx context.Context, fn func(ctx context.Contex func (m *defaultUserModel) SelectBuilder() squirrel.SelectBuilder { return squirrel.Select().From(m.table) } -func (m *defaultUserModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { +func (m *defaultUserModel) Delete(ctx context.Context, session sqlx.Session, id string) error { data, err := m.FindOne(ctx, id) if err != nil { return err } - hmUserIdKey := fmt.Sprintf("%s%v", cacheHmUserIdPrefix, id) - hmUserMobileKey := fmt.Sprintf("%s%v", cacheHmUserMobilePrefix, data.Mobile) + yccUserIdKey := fmt.Sprintf("%s%v", cacheYccUserIdPrefix, id) + yccUserMobileKey := fmt.Sprintf("%s%v", cacheYccUserMobilePrefix, data.Mobile) _, 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) - }, hmUserIdKey, hmUserMobileKey) + }, yccUserIdKey, yccUserMobileKey) return err } func (m *defaultUserModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheHmUserIdPrefix, primary) + return fmt.Sprintf("%s%v", cacheYccUserIdPrefix, primary) } func (m *defaultUserModel) 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", userRows, m.table) diff --git a/common/ctxdata/ctxData.go b/common/ctxdata/ctxData.go index cb2da89..534664d 100644 --- a/common/ctxdata/ctxData.go +++ b/common/ctxdata/ctxData.go @@ -4,7 +4,6 @@ import ( "context" "ycc-server/app/main/model" jwtx "ycc-server/common/jwt" - "encoding/json" "errors" "fmt" ) @@ -17,40 +16,25 @@ var ( ErrInvalidUserId = errors.New("用户ID格式无效") // 数据异常 ) -// GetUidFromCtx 从 context 中获取用户 ID -func GetUidFromCtx(ctx context.Context) (int64, error) { +// GetUidFromCtx 从 context 中获取用户 ID(字符串) +func GetUidFromCtx(ctx context.Context) (string, error) { // 尝试从上下文中获取 jwtUserId value := ctx.Value(CtxKeyJwtUserId) - if value == nil { - claims, err := GetClaimsFromCtx(ctx) - if err != nil { - return 0, err - } - return claims.UserId, nil - } + if value == nil { + claims, err := GetClaimsFromCtx(ctx) + if err != nil { + return "", err + } + return claims.UserId, nil + } // 根据值的类型进行不同处理 - switch v := value.(type) { - case json.Number: - // 如果是 json.Number 类型,转换为 int64 - uid, err := v.Int64() - if err != nil { - return 0, fmt.Errorf("%w: %v", ErrInvalidUserId, err) - } - return uid, nil - case int64: - // 如果已经是 int64 类型,直接返回 - return v, nil - case float64: - // 有些JSON解析器可能会将数字解析为float64 - return int64(v), nil - case int: - // 处理int类型 - return int64(v), nil - default: - // 其他类型都视为无效 - return 0, fmt.Errorf("%w: 期望类型 json.Number 或 int64, 实际类型 %T", ErrInvalidUserId, value) - } + switch v := value.(type) { + case string: + return v, nil + default: + return "", fmt.Errorf("%w: 期望类型 string, 实际类型 %T", ErrInvalidUserId, value) + } } func GetClaimsFromCtx(ctx context.Context) (*jwtx.JwtClaims, error) { diff --git a/common/jwt/jwtx.go b/common/jwt/jwtx.go index 1fd93c7..f51c211 100644 --- a/common/jwt/jwtx.go +++ b/common/jwt/jwtx.go @@ -11,13 +11,15 @@ import ( const ExtraKey = "extra" type JwtClaims struct { - UserId int64 `json:"userId"` - AgentId int64 `json:"agentId"` + UserId string `json:"userId"` + AgentId string `json:"agentId"` Platform string `json:"platform"` // 用户身份类型:0-临时用户,1-正式用户 UserType int64 `json:"userType"` // 是否代理:0-否,1-是 - IsAgent int64 `json:"isAgent"` + IsAgent int64 `json:"isAgent"` + AuthType string `json:"authType"` + AuthKey string `json:"authKey"` } // MapToJwtClaims 将 map[string]interface{} 转换为 JwtClaims 结构体 diff --git a/common/jwt/jwtx_test.go b/common/jwt/jwtx_test.go index 13740f2..a14082a 100644 --- a/common/jwt/jwtx_test.go +++ b/common/jwt/jwtx_test.go @@ -11,8 +11,8 @@ import ( func TestGenerateJwtToken(t *testing.T) { // 测试数据 testClaims := JwtClaims{ - UserId: 1, - AgentId: 0, + UserId: "1", + AgentId: "", Platform: "wxh5", UserType: 0, IsAgent: 0, @@ -37,8 +37,8 @@ func TestGenerateJwtToken(t *testing.T) { { name: "不同用户数据", claims: JwtClaims{ - UserId: 99999, - AgentId: 11111, + UserId: "99999", + AgentId: "", Platform: "mobile", UserType: 0, IsAgent: 1, @@ -103,8 +103,8 @@ func TestGenerateJwtToken(t *testing.T) { if claims, ok := parsedToken.Claims.(jwt.MapClaims); ok { // 验证userId if userId, exists := claims["userId"]; exists { - if int64(userId.(float64)) != tt.claims.UserId { - t.Errorf("token中的userId不匹配,期望%d,实际%v", tt.claims.UserId, userId) + if userId.(string) != tt.claims.UserId { + t.Errorf("token中的userId不匹配,期望%s,实际%v", tt.claims.UserId, userId) } } else { t.Error("token中缺少userId字段") @@ -144,8 +144,8 @@ func TestGenerateJwtToken(t *testing.T) { func TestGenerateJwtTokenAndParse(t *testing.T) { // 测试生成token后能够正确解析 testClaims := JwtClaims{ - UserId: 12345, - AgentId: 67890, + UserId: "12345", + AgentId: "", Platform: "web", UserType: 1, IsAgent: 0, @@ -188,8 +188,8 @@ func TestGenerateJwtTokenAndParse(t *testing.T) { func BenchmarkGenerateJwtToken(t *testing.B) { // 性能测试 testClaims := JwtClaims{ - UserId: 12345, - AgentId: 67890, + UserId: "12345", + AgentId: "", Platform: "web", UserType: 1, IsAgent: 0, @@ -209,8 +209,8 @@ func BenchmarkGenerateJwtToken(t *testing.B) { func TestParseJwtToken(t *testing.T) { // 使用你修改的测试数据 testClaims := JwtClaims{ - UserId: 6, - AgentId: 0, + UserId: "6", + AgentId: "", Platform: "wxh5", UserType: 0, IsAgent: 0, @@ -347,8 +347,8 @@ func TestParseCustomJwtToken(t *testing.T) { func TestGenerateAndParseWithRealData(t *testing.T) { // 使用真实数据生成token realClaims := JwtClaims{ - UserId: 1, - AgentId: 0, + UserId: "1", + AgentId: "", Platform: "wxh5", UserType: 0, IsAgent: 0, diff --git a/db/migrations/uuid_fk_char36.sql b/db/migrations/uuid_fk_char36.sql new file mode 100644 index 0000000..6169cb2 --- /dev/null +++ b/db/migrations/uuid_fk_char36.sql @@ -0,0 +1,93 @@ +BEGIN; +ALTER TABLE `user_auth` + MODIFY COLUMN `user_id` CHAR(36) NOT NULL; +ALTER TABLE `query_cleanup_detail` + MODIFY COLUMN `cleanup_log_id` CHAR(36) NOT NULL, + MODIFY COLUMN `query_id` CHAR(36) NOT NULL, + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `query` + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `product_feature` + MODIFY COLUMN `product_id` CHAR(36) NOT NULL, + MODIFY COLUMN `feature_id` CHAR(36) NOT NULL; +ALTER TABLE `order_refund` + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `order` + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `example` + MODIFY COLUMN `feature_id` CHAR(36) NOT NULL; +ALTER TABLE `authorization_document` + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `query_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_withdrawal_tax` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `withdrawal_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_withdrawal` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_wallet` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_upgrade` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `rebate_agent_id` CHAR(36) NULL, + MODIFY COLUMN `operator_agent_id` CHAR(36) NULL; +ALTER TABLE `agent_short_link` + MODIFY COLUMN `link_id` CHAR(36) NULL, + MODIFY COLUMN `invite_code_id` CHAR(36) NULL; +ALTER TABLE `agent_relation` + MODIFY COLUMN `parent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `child_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_rebate` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `source_agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_real_name` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_product_config` + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_order` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_link` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_invite_code_usage` + MODIFY COLUMN `invite_code_id` CHAR(36) NOT NULL, + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_invite_code` + MODIFY COLUMN `agent_id` CHAR(36) NULL, + MODIFY COLUMN `used_user_id` CHAR(36) NULL, + MODIFY COLUMN `used_agent_id` CHAR(36) NULL; +ALTER TABLE `agent_freeze_task` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `commission_id` CHAR(36) NOT NULL; +ALTER TABLE `agent_commission` + MODIFY COLUMN `agent_id` CHAR(36) NOT NULL, + MODIFY COLUMN `order_id` CHAR(36) NOT NULL, + MODIFY COLUMN `product_id` CHAR(36) NOT NULL; +ALTER TABLE `agent` + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `team_leader_id` CHAR(36) NULL, + MODIFY COLUMN `invite_code_id` CHAR(36) NULL; +ALTER TABLE `admin_user_role` + MODIFY COLUMN `user_id` CHAR(36) NOT NULL, + MODIFY COLUMN `role_id` CHAR(36) NOT NULL; +ALTER TABLE `admin_role_menu` + MODIFY COLUMN `role_id` CHAR(36) NOT NULL, + MODIFY COLUMN `menu_id` CHAR(36) NOT NULL; +ALTER TABLE `admin_role_api` + MODIFY COLUMN `role_id` CHAR(36) NOT NULL, + MODIFY COLUMN `api_id` CHAR(36) NOT NULL; +COMMIT; diff --git a/deploy/script/gen_models.ps1 b/deploy/script/gen_models.ps1 index 9e540bc..e171a87 100644 --- a/deploy/script/gen_models.ps1 +++ b/deploy/script/gen_models.ps1 @@ -1,64 +1,68 @@ # 设置输出编码为UTF-8 +[Console]::InputEncoding = [System.Text.Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +$OutputEncoding = [System.Text.Encoding]::UTF8 +chcp.com 65001 | Out-Null # 目录配置 $OUTPUT_DIR = "./model" $TARGET_DIR = "../../app/main/model" +$HOME_DIR = Join-Path $PSScriptRoot "..\template" # 表名列表 $tables = @( # ============================================ # 新代理系统表 # ============================================ - "admin_api", - "admin_dict_data", - "admin_dict_type", - "admin_menu", - "admin_promotion_link", - "admin_promotion_link_stats_history", - "admin_promotion_link_stats_total", - "admin_promotion_order", - "admin_role", - "admin_role_api", - "admin_role_menu", - "admin_user", - "admin_user_role", - "agent", - "agent_commission", - "agent_config", - "agent_freeze_task", - "agent_invite_code", - "agent_invite_code_usage", - "agent_link", - "agent_order", - "agent_product_config", - "agent_real_name", - "agent_rebate", - "agent_relation", - "agent_short_link", - "agent_upgrade", - "agent_wallet", - "agent_withdrawal", - "agent_withdrawal_tax", - "authorization_document", - "example", - "feature", - "global_notifications", - "order", - "order_refund", - "product", - "product_feature", - "query", - "query_cleanup_config", - "query_cleanup_detail", - "query_cleanup_log", - "user", - "user_auth" + # "admin_api", + # "admin_dict_data", + # "admin_dict_type", + # "admin_menu", + # "admin_promotion_link", + # "admin_promotion_link_stats_history", + # "admin_promotion_link_stats_total", + # "admin_promotion_order", + # "admin_role", + # "admin_role_api", + # "admin_role_menu", + # "admin_user", + # "admin_user_role", + # "agent", + # "agent_commission", + "agent_config" + # "agent_freeze_task", + # "agent_invite_code", + # "agent_invite_code_usage", + # "agent_link", + # "agent_order", + # "agent_product_config", + # "agent_real_name", + # "agent_rebate", + # "agent_relation", + # "agent_short_link", + # "agent_upgrade", + # "agent_wallet", + # "agent_withdrawal", + # "agent_withdrawal_tax", + # "authorization_document", + # "example", + # "feature", + # "global_notifications", + # "order", + # "order_refund", + # "product", + # "product_feature", + # "query", + # "query_cleanup_config", + # "query_cleanup_detail", + # "query_cleanup_log", + # "user", + # "user_auth" ) # 为每个表生成模型 foreach ($table in $tables) { Write-Host "正在生成表: $table" -ForegroundColor Green - goctl model mysql datasource -url="ycc:5vg67b3UNHu8@tcp(127.0.0.1:21001)/ycc" -table="$table" -dir="./model" --home="../template" -cache=true --style=goZero + goctl model mysql datasource -url="ycc:5vg67b3UNHu8@tcp(127.0.0.1:21001)/ycc" -table="$table" -dir="./model" --home="$HOME_DIR" -cache=true --style=goZero # 移动生成的文件到目标目录 if (Test-Path $OUTPUT_DIR) { @@ -122,3 +126,6 @@ foreach ($table in $tables) { Write-Host "" Write-Host '所有模型文件生成并移动完成!' -ForegroundColor Green +if (Test-Path $OUTPUT_DIR) { + Get-ChildItem -Path $OUTPUT_DIR -File | Remove-Item -Force +} diff --git a/deploy/script/model/vars.go b/deploy/script/model/vars.go deleted file mode 100644 index 81462b5..0000000 --- a/deploy/script/model/vars.go +++ /dev/null @@ -1,9 +0,0 @@ -package model - -import ( - "errors" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -var ErrNotFound = sqlx.ErrNotFound -var ErrNoRowsUpdate = errors.New("update db no rows change") \ No newline at end of file diff --git a/deploy/sql/user_system_refactor.sql b/deploy/sql/user_system_refactor.sql index f32497f..8dfd90c 100644 --- a/deploy/sql/user_system_refactor.sql +++ b/deploy/sql/user_system_refactor.sql @@ -15,6 +15,10 @@ ALTER TABLE `user_auth` DROP INDEX IF EXISTS `uk_auth_type_key`; ALTER TABLE `user_auth` ADD UNIQUE INDEX `uk_auth_type_key` (`auth_type`, `auth_key`) COMMENT '确保同一个认证方式只能绑定一个用户'; +-- 允许一个用户绑定同一认证类型的多个记录(例如多个UUID) +ALTER TABLE `user_auth` DROP INDEX IF EXISTS `unique_userId_key`; +ALTER TABLE `user_auth` ADD INDEX `idx_user_id_auth_type` (`user_id`, `auth_type`); + -- ============================================ -- 第二部分:删除UserTemp表(开发环境直接删除) -- ============================================ @@ -41,4 +45,4 @@ DROP TABLE IF EXISTS `user_temp`; -- ============================================ -- 1. 此脚本适用于开发环境,直接删除UserTemp表 -- 2. 如果生产环境有数据,请使用完整版迁移脚本 --- 3. 执行后,确保代码中已移除所有对UserTemp表的引用 \ No newline at end of file +-- 3. 执行后,确保代码中已移除所有对UserTemp表的引用 diff --git a/deploy/sql/user_temp_migration.sql b/deploy/sql/user_temp_migration.sql new file mode 100644 index 0000000..17e4bad --- /dev/null +++ b/deploy/sql/user_temp_migration.sql @@ -0,0 +1,45 @@ +-- 将 user_temp 迁移为 user(mobile 为空)与 user_auth + +START TRANSACTION; + +-- 1) 迁移临时用户到 user(mobile 置为空) +INSERT INTO + `user` ( + `delete_time`, + `del_state`, + `version`, + `mobile`, + `password`, + `nickname`, + `info`, + `inside` + ) +SELECT NULL, 0, COALESCE(ut.version, 0), NULL, NULL, NULL, '', 0 +FROM `user_temp` ut +WHERE + ut.del_state = 0; + +-- 2) 将临时认证迁移到 user_auth(按插入顺序关联最近插入的 user.id) +INSERT INTO + `user_auth` ( + `delete_time`, + `del_state`, + `version`, + `user_id`, + `auth_key`, + `auth_type` + ) +SELECT NULL, 0, COALESCE(ut.version, 0), u.id, ut.auth_key, ut.auth_type +FROM `user_temp` ut + JOIN `user` u ON u.del_state = 0 + AND u.mobile IS NULL +WHERE + ut.del_state = 0; + +-- 注意:以上为示意,实际生产应通过显式映射(如临时ID与新UserID映射表)确保一一对应,避免笛卡尔匹配。 + +COMMIT; + +-- 唯一索引保障 +ALTER TABLE `user_auth` +ADD UNIQUE INDEX `idx_auth_type_key` (`auth_type`, `auth_key`); \ No newline at end of file diff --git a/deploy/template/model/import-no-cache.tpl b/deploy/template/model/import-no-cache.tpl index 6652cde..68a78f7 100644 --- a/deploy/template/model/import-no-cache.tpl +++ b/deploy/template/model/import-no-cache.tpl @@ -1,16 +1,18 @@ import ( - "context" - "database/sql" - "fmt" - "strings" + "context" + "database/sql" + "fmt" + "strings" - {{if .time}}"time"{{end}} + {{if .time}}"time"{{end}} + "reflect" - "ycc-server/common/globalkey" - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/builder" - "github.com/zeromicro/go-zero/core/stores/sqlc" - "github.com/zeromicro/go-zero/core/stores/sqlx" - "github.com/zeromicro/go-zero/core/stringx" + "ycc-server/common/globalkey" + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "github.com/google/uuid" ) diff --git a/deploy/template/model/import.tpl b/deploy/template/model/import.tpl index bcf5a3c..b4fe799 100644 --- a/deploy/template/model/import.tpl +++ b/deploy/template/model/import.tpl @@ -1,17 +1,19 @@ import ( - "context" - "database/sql" - "fmt" - "strings" + "context" + "database/sql" + "fmt" + "strings" - {{if .time}}"time"{{end}} + {{if .time}}"time"{{end}} + "reflect" - "ycc-server/common/globalkey" - "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" + "ycc-server/common/globalkey" + "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" + "github.com/google/uuid" ) diff --git a/deploy/template/model/insert.tpl b/deploy/template/model/insert.tpl index d8060e8..528e0f2 100644 --- a/deploy/template/model/insert.tpl +++ b/deploy/template/model/insert.tpl @@ -1,17 +1,34 @@ func (m *default{{.upperStartCamelObject}}Model) Insert(ctx context.Context,session sqlx.Session, data *{{.upperStartCamelObject}}) (sql.Result,error) { - data.DelState = globalkey.DelStateNo - {{if .withCache}}{{.keys}} - return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { - query := fmt.Sprintf("insert into %s (%s) values ({{.expression}})", m.table, {{.lowerStartCamelObject}}RowsExpectAutoSet) - if session != nil{ - return session.ExecCtx(ctx,query,{{.expressionValues}}) - } - return conn.ExecCtx(ctx, query, {{.expressionValues}}) - }, {{.keyValues}}){{else}} - query := fmt.Sprintf("insert into %s (%s) values ({{.expression}})", m.table, {{.lowerStartCamelObject}}RowsExpectAutoSet) - if session != nil{ - return session.ExecCtx(ctx,query,{{.expressionValues}}) - } - return m.conn.ExecCtx(ctx, query, {{.expressionValues}}){{end}} + data.DelState = globalkey.DelStateNo + m.insertUUID(data) + {{if .withCache}}{{.keys}} + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values ({{.expression}})", m.table, {{.lowerStartCamelObject}}RowsExpectAutoSet) + if session != nil{ + return session.ExecCtx(ctx,query,{{.expressionValues}}) + } + return conn.ExecCtx(ctx, query, {{.expressionValues}}) + }, {{.keyValues}}){{else}} + query := fmt.Sprintf("insert into %s (%s) values ({{.expression}})", m.table, {{.lowerStartCamelObject}}RowsExpectAutoSet) + if session != nil{ + return session.ExecCtx(ctx,query,{{.expressionValues}}) + } + return m.conn.ExecCtx(ctx, query, {{.expressionValues}}){{end}} +} +func (m *default{{.upperStartCamelObject}}Model) insertUUID(data *{{.upperStartCamelObject}}) { + t := reflect.TypeOf(data).Elem() + v := reflect.ValueOf(data).Elem() + for i := 0; i < t.NumField(); i++ { + sf := t.Field(i) + if sf.Tag.Get("db") == "id" { + f := v.Field(i) + if f.IsValid() && f.CanSet() && f.Kind() == reflect.String { + if f.String() == "" { + f.SetString(uuid.NewString()) + } + } + break + } + } } diff --git a/deploy/template/model/types.tpl b/deploy/template/model/types.tpl index d551a4f..fe08ba2 100644 --- a/deploy/template/model/types.tpl +++ b/deploy/template/model/types.tpl @@ -1,15 +1,15 @@ type ( - {{.lowerStartCamelObject}}Model interface{ - {{.method}} - } + {{.lowerStartCamelObject}}Model interface{ + {{.method}} + } - default{{.upperStartCamelObject}}Model struct { - {{if .withCache}}sqlc.CachedConn{{else}}conn sqlx.SqlConn{{end}} - table string - } + default{{.upperStartCamelObject}}Model struct { + {{if .withCache}}sqlc.CachedConn{{else}}conn sqlx.SqlConn{{end}} + table string + } - {{.upperStartCamelObject}} struct { - {{.fields}} - } + {{.upperStartCamelObject}} struct { + {{.fields}} + } )