diff --git a/app/user/cmd/api/desc/agent.api b/app/user/cmd/api/desc/agent.api new file mode 100644 index 0000000..9aa553f --- /dev/null +++ b/app/user/cmd/api/desc/agent.api @@ -0,0 +1,75 @@ +syntax = "v1" + +info ( + title: "代理服务" + desc: "代理服务接口" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +import ( + "agent/agent.api" +) + +@server ( + prefix: api/v1/agent + group: agent + jwt: JwtAuth +) +service main { + // 查看代理信息 + @handler GetAgentInfo + get /info returns (AgentInfoResp) + + // 查询代理申请状态 + @handler GetAgentAuditStatus + get /audit/status returns (AgentAuditStatusResp) + + // 生成推广标识 + @handler GeneratingLink + post /generating_link (AgentGeneratingLinkReq) returns (AgentGeneratingLinkResp) + + // 获取推广定价配置 + @handler GetAgentProductConfig + get /product_config returns (AgentProductConfigResp) + + @handler GetAgentMembershipProductConfig + get /membership/user_config (AgentMembershipProductConfigReq) returns (AgentMembershipProductConfigResp) + + @handler SaveAgentMembershipUserConfig + post /membership/save_user_config (SaveAgentMembershipUserConfigReq) + + @handler GetAgentRevenueInfo + get /revenue (GetAgentRevenueInfoReq) returns (GetAgentRevenueInfoResp) + + @handler GetAgentCommission + get /commission (GetCommissionReq) returns (GetCommissionResp) + + @handler GetAgentRewards + get /rewards (GetRewardsReq) returns (GetRewardsResp) + + @handler GetAgentWithdrawal + get /withdrawal (GetWithdrawalReq) returns (GetWithdrawalResp) + + @handler AgentWithdrawal + post /withdrawal (WithdrawalReq) returns (WithdrawalResp) +} + +@server ( + prefix: api/v1/agent + group: agent +) +service main { + // 提交代理申请 + @handler ApplyForAgent + post /apply (AgentApplyReq) returns (AgentApplyResp) + + // 获取推广标识数据 + @handler GetLinkData + get /link (GetLinkDataReq) returns (GetLinkDataResp) + + @handler ActivateAgentMembership + post /membership/activate (AgentActivateMembershipReq) returns (AgentActivateMembershipResp) +} + diff --git a/app/user/cmd/api/desc/agent/agent.api b/app/user/cmd/api/desc/agent/agent.api new file mode 100644 index 0000000..92e0ca6 --- /dev/null +++ b/app/user/cmd/api/desc/agent/agent.api @@ -0,0 +1,211 @@ +syntax = "v1" + +info ( + title: "代理服务" + desc: "代理服务接口" + author: "Liangzai" + email: "2440983361@qq.com" + version: "v1" +) + +type AgentProductConfig { + ProductID int64 `json:"product_id"` + CostPrice float64 `json:"cost_price"` + PriceRangeMin float64 `json:"price_range_min"` + PriceRangeMax float64 `json:"price_range_max"` + PPricingStandard float64 `json:"p_pricing_standard"` + POverpricingRatio float64 `json:"p_overpricing_ratio"` + APricingStandard float64 `json:"a_pricing_standard"` + APricingEnd float64 `json:"a_pricing_end"` + AOverpricingRatio float64 `json:"a_overpricing_ratio"` +} + +type AgentMembershipUserConfig { + ProductID int64 `json:"product_id"` + PriceIncreaseAmount float64 `json:"price_increase_amount"` + PriceRangeFrom float64 `json:"price_range_from"` + PriceRangeTo float64 `json:"price_range_to"` + PriceRatio float64 `json:"price_ratio"` +} + +type ProductConfig { + ProductID int64 `json:"product_id"` + CostPrice float64 `json:"cost_price"` + PriceRangeMin float64 `json:"price_range_min"` + PriceRangeMax float64 `json:"price_range_max"` +} + +type ( + AgentInfoResp { + status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过,3=未申请 + isAgent bool `json:"is_agent"` + agentID int64 `json:"agent_id"` + level string `json:"level"` + region string `json:"region"` + mobile string `json:"mobile"` + wechatID string `json:"wechat_id"` + } + // 代理申请请求参数 + AgentApplyReq { + Region string `json:"region"` + Mobile string `json:"mobile"` + WechatID string `json:"wechat_id"` + Code string `json:"code"` + Ancestor string `json:"ancestor,optional"` + } + AgentApplyResp{ + AccessToken string `json:"accessToken"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` + } + // 查询代理申请状态响应 + AgentAuditStatusResp { + Status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过 + AuditReason string `json:"audit_reason"` + } + AgentGeneratingLinkReq { + Product string `json:"product"` + Price string `json:"price"` + } + AgentGeneratingLinkResp { + LinkIdentifier string `json:"link_identifier"` + } + GetLinkDataReq { + LinkIdentifier string `form:"link_identifier"` + } + GetLinkDataResp { + Product + } + AgentProductConfigResp { + AgentProductConfig []AgentProductConfig + } + // 开通代理会员请求参数 + AgentActivateMembershipReq { + Mobile string `json:"mobile"` + Type string `json:"type,oneof=VIP SVIP"` // 会员类型:vip/svip + Amount float64 `json:"amount"` + PaymentMethod string `json:"payment_method"` + TransactionId string `json:"transaction_id"` + } + // 开通代理会员响应 + AgentActivateMembershipResp { + MembershipType string `json:"membership_type"` // 最终开通的会员类型 + ExpireTime string `json:"expire_time"` // 到期时间 + } + // 获取会员当前配置 + AgentMembershipProductConfigReq { + ProductID int64 `form:"product_id"` + } + // 获取会员当前配置 + AgentMembershipProductConfigResp { + AgentMembershipUserConfig AgentMembershipUserConfig `json:"agent_membership_user_config"` + ProductConfig ProductConfig `json:"product_config"` + PriceIncreaseMax float64 `json:"price_increase_max"` + PriceIncreaseAmount float64 `json:"price_increase_amount"` + PriceRatio float64 `json:"price_ratio"` + } + SaveAgentMembershipUserConfigReq { + ProductID int64 `json:"product_id"` + PriceIncreaseAmount float64 `json:"price_increase_amount"` + PriceRangeFrom float64 `json:"price_range_from"` + PriceRangeTo float64 `json:"price_range_to"` + PriceRatio float64 `json:"price_ratio"` + } +) + +type ( + // 收益信息 + GetAgentRevenueInfoReq {} + GetAgentRevenueInfoResp { + Balance float64 `json:"balance"` + FrozenBalance float64 `json:"frozen_balance"` + TotalEarnings float64 `json:"total_earnings"` + DirectPush DirectPushReport `json:"direct_push"` // 直推报告数据 + ActiveReward ActiveReward `json:"active_reward"` // 活跃下级奖励数据 + } + // 直推报告数据结构 + DirectPushReport { + TotalCommission float64 `json:"total_commission"` + TotalReport int `json:"total_report"` + Today TimeRangeReport `json:"today"` // 近24小时数据 + Last7D TimeRangeReport `json:"last7d"` // 近7天数据 + Last30D TimeRangeReport `json:"last30d"` // 近30天数据 + } + // 活跃下级奖励数据结构 + ActiveReward { + TotalReward float64 `json:"total_reward"` + Today ActiveRewardData `json:"today"` // 今日数据 + Last7D ActiveRewardData `json:"last7d"` // 近7天数据 + Last30D ActiveRewardData `json:"last30d"` // 近30天数据 + } + // 通用时间范围报告结构 + TimeRangeReport { + Commission float64 `json:"commission"` // 佣金 + Report int `json:"report"` // 报告量 + } + // 活跃奖励专用结构 + ActiveRewardData { + NewActiveReward float64 `json:"active_reward"` + SubPromoteReward float64 `json:"sub_promote_reward"` + SubUpgradeReward float64 `json:"sub_upgrade_reward"` + SubWithdrawReward float64 `json:"sub_withdraw_reward"` + } +) + +type ( + Commission { + ProductName string `json:"product_name"` + Amount float64 `json:"amount"` + CreateTime string `json:"create_time"` + } + GetCommissionReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数据量 + } + GetCommissionResp { + Total int64 `json:"total"` // 总记录数 + List []Commission `json:"list"` // 查询列表 + } + Rewards { + Type string `json:"type"` + Amount float64 `json:"amount"` + CreateTime string `json:"create_time"` + } + GetRewardsReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数据量 + } + GetRewardsResp { + Total int64 `json:"total"` // 总记录数 + List []Rewards `json:"list"` // 查询列表 + } + Withdrawal { + Status int64 `json:"status"` + Amount float64 `json:"amount"` + WithdrawalNo string `json:"withdrawal_no"` + Remark string `json:"remark"` + payeeAccount string `json:"payee_account"` + CreateTime string `json:"create_time"` + } + GetWithdrawalReq { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数据量 + } + GetWithdrawalResp { + Total int64 `json:"total"` // 总记录数 + List []Withdrawal `json:"list"` // 查询列表 + } +) + +type ( + WithdrawalReq { + Amount float64 `json:"amount"` // 提现金额 + payeeAccount string `json:"payee_account"` + payeeName string `json:"payee_name"` + } + WithdrawalResp { + Status int64 `json:"status"` // 1申请中 2成功 3失败 + failMsg string `json:"fail_msg"` + } +) + diff --git a/app/user/cmd/api/desc/auth/auth.api b/app/user/cmd/api/desc/auth/auth.api index f523c72..e35c414 100644 --- a/app/user/cmd/api/desc/auth/auth.api +++ b/app/user/cmd/api/desc/auth/auth.api @@ -10,7 +10,7 @@ info ( type ( sendSmsReq { Mobile string `json:"mobile" validate:"required,mobile"` - ActionType string `json:"actionType" validate:"required,oneof=login register query"` + ActionType string `json:"actionType" validate:"required,oneof=login register query agentApply"` } ) diff --git a/app/user/cmd/api/desc/main.api b/app/user/cmd/api/desc/main.api index b735f1d..0832ccd 100644 --- a/app/user/cmd/api/desc/main.api +++ b/app/user/cmd/api/desc/main.api @@ -12,3 +12,4 @@ import "user.api" import "query.api" import "pay.api" import "product.api" +import "agent.api" diff --git a/app/user/cmd/api/desc/query.api b/app/user/cmd/api/desc/query.api index f61d12f..bcc76ba 100644 --- a/app/user/cmd/api/desc/query.api +++ b/app/user/cmd/api/desc/query.api @@ -13,6 +13,16 @@ import ( ) //============================> query v1 <============================ +@server ( + prefix: api/v1 + group: query +) +service main { + @doc "query service agent" + @handler queryServiceAgent + post /query/service_agent/:product (QueryServiceReq) returns (QueryServiceResp) +} + @server ( prefix: api/v1 group: query @@ -22,42 +32,10 @@ service main { @doc "query service" @handler queryService post /query/service/:product (QueryServiceReq) returns (QueryServiceResp) - - @doc "query marriage" - @handler marriage - post /query/marriage (QueryReq) returns (QueryResp) - - // 家政服务查询 - @doc "query home service" - @handler homeService - post /query/homeService (QueryReq) returns (QueryResp) - - // 风险评估查询 - @doc "query risk assessment" - @handler riskAssessment - post /query/riskAssessment (QueryReq) returns (QueryResp) - - // 企业信息查询 - @doc "query company info" - @handler companyInfo - post /query/companyInfo (QueryReq) returns (QueryResp) - - // 租赁信息查询 - @doc "query rental info" - @handler rentalInfo - post /query/rentalInfo (QueryReq) returns (QueryResp) - - // 贷前背景调查 - @doc "query pre-loan background check" - @handler preLoanBackgroundCheck - post /query/preLoanBackgroundCheck (QueryReq) returns (QueryResp) - - // 一般背景调查 - @doc "query general background check" - @handler backgroundCheck - post /query/backgroundCheck (QueryReq) returns (QueryResp) } + + @server ( prefix: api/v1 group: query diff --git a/app/user/cmd/api/desc/query/query.api b/app/user/cmd/api/desc/query/query.api index 2a20a10..b69c131 100644 --- a/app/user/cmd/api/desc/query/query.api +++ b/app/user/cmd/api/desc/query/query.api @@ -18,11 +18,15 @@ type ( type ( QueryServiceReq { - Product string `path:"product"` - Data string `json:"data" validate:"required"` + Product string `path:"product"` + Data string `json:"data" validate:"required"` + AgentIdentifier string `json:"agent_identifier,optional"` } QueryServiceResp { - id string `json:"id"` + id string `json:"id"` + AccessToken string `json:"accessToken"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` } ) diff --git a/app/user/cmd/api/desc/user.api b/app/user/cmd/api/desc/user.api index 07eb63e..27e84d4 100644 --- a/app/user/cmd/api/desc/user.api +++ b/app/user/cmd/api/desc/user.api @@ -32,11 +32,14 @@ service main { @handler mobileCodeLogin post /user/mobileCodeLogin (MobileCodeLoginReq) returns (MobileCodeLoginResp) + @doc "agent mobile code login" + @handler agentMobileCodeLogin + post /user/agent_mobile_code_login (MobileCodeLoginReq) returns (MobileCodeLoginResp) + @doc "wechat mini auth" @handler wxMiniAuth post /user/wxMiniAuth (WXMiniAuthReq) returns (WXMiniAuthResp) - @doc "wechat h5 auth" @handler wxH5Auth post /user/wxh5Auth (WXH5AuthReq) returns (WXH5AuthResp) @@ -51,11 +54,11 @@ service main { service main { @doc "get user info" @handler detail - get /user/detail returns (UserInfoResp) + get /user/detail returns (UserInfoResp) - @doc "get new token" - @handler getToken - post /user/getToken returns (MobileCodeLoginResp) + @doc "get new token" + @handler getToken + post /user/getToken returns (MobileCodeLoginResp) } //============================> auth v1 <============================ @@ -69,8 +72,6 @@ service main { post /auth/sendSms (sendSmsReq) } - - //============================> notification v1 <============================ @server ( prefix: api/v1 @@ -80,4 +81,5 @@ service main { @doc "get notifications" @handler getNotifications get /notification/list returns (GetNotificationsResp) -} \ No newline at end of file +} + diff --git a/app/user/cmd/api/desc/user/user.api b/app/user/cmd/api/desc/user/user.api index f7f8791..56931e0 100644 --- a/app/user/cmd/api/desc/user/user.api +++ b/app/user/cmd/api/desc/user/user.api @@ -62,9 +62,10 @@ type ( RefreshAfter int64 `json:"refreshAfter"` } ) + type ( WXH5AuthReq { - Code string `json:"code"` + Code string `json:"code"` } WXH5AuthResp { AccessToken string `json:"accessToken"` @@ -72,6 +73,7 @@ type ( RefreshAfter int64 `json:"refreshAfter"` } ) + type ( UserInfoResp { UserInfo User `json:"userInfo"` @@ -80,18 +82,20 @@ type ( //============================> notification v1 <============================ type Notification { - Title string `json:"title"` // 通知标题 - Content string `json:"content"` // 通知内容 (富文本) - NotificationPage string `json:"notificationPage"` // 通知页面 - StartDate string `json:"startDate"` // 通知开始日期,格式 "YYYY-MM-DD" - EndDate string `json:"endDate"` // 通知结束日期,格式 "YYYY-MM-DD" - StartTime string `json:"startTime"` // 每天通知开始时间,格式 "HH:MM:SS" - EndTime string `json:"endTime"` // 每天通知结束时间,格式 "HH:MM:SS" + Title string `json:"title"` // 通知标题 + Content string `json:"content"` // 通知内容 (富文本) + NotificationPage string `json:"notificationPage"` // 通知页面 + StartDate string `json:"startDate"` // 通知开始日期,格式 "YYYY-MM-DD" + EndDate string `json:"endDate"` // 通知结束日期,格式 "YYYY-MM-DD" + StartTime string `json:"startTime"` // 每天通知开始时间,格式 "HH:MM:SS" + EndTime string `json:"endTime"` // 每天通知结束时间,格式 "HH:MM:SS" } + type ( // 获取通知响应体(分页) GetNotificationsResp { Notifications []Notification `json:"notifications"` // 通知列表 - Total int64 `json:"total"` // 总记录数 + Total int64 `json:"total"` // 总记录数 } -) \ No newline at end of file +) + diff --git a/app/user/cmd/api/etc/main.dev.yaml b/app/user/cmd/api/etc/main.dev.yaml index c18369d..fd84fba 100644 --- a/app/user/cmd/api/etc/main.dev.yaml +++ b/app/user/cmd/api/etc/main.dev.yaml @@ -30,11 +30,15 @@ YushanConfig: Url: "https://api.yushanshuju.com/credit-gw/service" Alipay: AppID: "2021005113664540" - PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDIc92zqtkv6YE2xlzGXACdK2KUJ+i8X39Ev6JWItiYCwu4b0fNdKTSggroxaiWDEQtIX8ek3m08ausZDB5mLr3afzTAVFV92rWwseR79c4Hs+Od/S18S2AjOVsaeM1AT2/GhLYbmcZJ5ph45ejYw7Uq5NqpBj2V7JgFTuGx4T2R6jnOnqeKjXYX1BoPWx98CyxroIFGxJinnPmHAq5aoaFltPqf9ugD8eNJUMQqcd6xhOdmTBZTKuslTi2phjO2njp97bBf5MTOCfcKqmCXQ2v0pNYrGBLAZoUgWwn9sQeYE2AALt38Q4A1tg7rrP1/F52sDW3DNEs+irZRDddNLVxAgMBAAECggEARcOVoIdQqY0yLHcjKOIyUIEeAQRWyuDNsYakoCfmjBwkCx+ntMjo6F7cHyFTyE0imTZ0QJcBH8mQfyIrgNZ4E83ucR2fSjUfGPmXbaI0nFKU2DfFkmEK/heLbYz4x6TT8aPIdU0PUsDmyTTlvLaoHbpNRysviOUCrtAU9JaSHwg562PKRTsizAnbGdT6Slcl2BuSk2cDHXCiNq0z7KryZAo8vtTIJ3BKngjhjRFs0KV6Mf/b/OrRlBxAx04AewkicM+EHqswABJtf4BBlpUM+NUb7RMygupq2wABZXk64bsX/HycMl/uz+WsTzAMp/M0/SPfItoxGSqU8ZlQDFoK8QKBgQDqE2OCkk5zv5UuB/ClO48Xhvv5y6Xcwh0t1XhZyL57sb1PZkk1CIcqIKmBs5dP44UZKExU7AjA4k90UvLIbpRPpOK9kU16UJeQwGFm8Lr9pJRMNCNE9GRmjNc18GaV8zK6aMpN3urga+sKOMsdpQ+eT8JawMQGdytEg4EY/IaxrQKBgQDbOkUZXnt4Y6TZCH8akZz7LmKidFG5yp5vxMBwe/V3ePb+Ssxz7Qqj4ooPE50aVTMNNSJR1rasXXMzocUG+/kECqnSdBKj/JH1n6TtmLU/tkeHZV+HIP/h0TFIqdAVcYRQZK7Fgz+yddZgYV2XAxFlfq1Wt40+0JGmrwg6ALdzVQKBgQDVJyjDuzVjo/9V9ncGEDFijFIii3cTi1SE61J3+By1iQpKJmvdtlFXZHzXFlJgtl/6o762ymXCN5OA6xQYvtGhoRW06H80NfV/JCDOW8L7vIYqyoOfhCl1VSWZAbx5Kgh0xX4L4UXjbYKQQV19NlT9pcXnXIhlFtm4v0OtHDAP1QKBgA9k5hlD8zOe+6Jp4FMDSpywwyhZNqvvOHTswf6kFbaP/fgZVIYHbSnY7Izmea+xr+YLhx9sDmPIJCDKCUXWR8Qq44XttKljQPSYg0JT6NZSfG9bhPu+K3m18NoDYqM+12W1zDf+YWissaMO8z15b61K2e0u8nIovzGPNOqtxjQJAoGBAK5F47okw79md18/XLMZ5Cv268tS8PN+YJVHteTgT7gP1bSvk4wqRPZdcmJIjADzEEkHEmvTgqSOtR/5Aw0s2qhyKVV8Q8WnCm+9hELWSKj3D0Fy5Q6By9JjLsZh1C1p1AEA8alrJ3+b7WUBy1/mYaIi3VirW/3mgOKXSBJ0HVuF" + PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCA1mtTVZmB/7/wWV37Z8hUXEXFs0Gn1/Ie7c6rPQQRUlPHyJGcPAZvDii+ySC1/bplneMENRAjCuoJEM1z4X1FMt8rLggCqnF1xzUN2p9fdXUwcRPmSV4yi9ggMiFXldm0/eyaobV2fj0/VSLED2Qc8xBStM9pqkfszwf2rsAAKL15WQXOUiQw0s25s+Du18H4+YgkQ0HBr0+VPfhL4QoOvsE34ZYP0TuTwxVheYNkvSOPXFXmtE3z/b+75y2n2msa9S4HItNVYpOkB7z3GDB+0/rvX+Q+GvYI9BSBbgJwEuqiMN2SwQyAjH608JBoAUGnk0ygfG8juF77shBxzr/vAgMBAAECggEAQTlL2EJrlm59IxZ7B72Ao4SbJf0b7fba8mF90R7wojxFgcy+OpQAxdQrOHrl/nxXEv6dYRHj+3mZBcHl4RZ0rsWUSW3iTEcxbWjOKRdWu6LhEwcMBfd6oqg9X/9A9fA86O3sDFR1Y2mBZECbexo3mphK2TQEFQBJrU8aPv404V784u0wTh1oLO0Z3NjgvXOAy3ZsM64oZROVCkObXnZGyrY8Hf6W+YLmCoI7eajOQ9QTFy1x24fm8LFdWNizG9/DFa4EC7ZjiYzFhGpfpKb4964QnN3Krlf18Ryhgf3PO6IDO04JOdnHLKhR8+kHIN5m6AMIyKxbZ/vKw4X09Z8XoQKBgQD7jNHzEhIo4IOmRzgdoGxSCLXe1cUbwFL4tU3n7miUCYL/k6wpiNkCGwikaHMiSG0Om2D6+I9gX/rBrTrp2MAmcHA6ymn1GARSYMv7rz+5afGygfBDNr/7xQ2ASCatB65TObH+AUZzdq82B5dpr46AJhilRcHnQEyc/SyIelft2QKBgQCDHeDYt3vTDJ1vIPtXeyO1NHbGQY7cUucx3sZ+QVdF0abstcutT0LrHOgDCWFtnvjia1f0QRPDnTzUtq4GQxj63/9zZr1pMGsd7gjgIvVjM0LqUQXU0TMpO1DuU2zyemRyJTfWDDN+vTvA2+376cW0QxKq2CKOhX45WZRrUBbXBwKBgQCPVFe0ZlGOlQ6uSdpBl0zhGTF3vNpIy7b7G2M+ietwnlLUCXKJX/42YuzzsMgZeqcZMZN6rPIU+dtJS8lLwUMLI/nupbLmAj9EKP9RczOeFC2xhrQ9uA6ACHF+7J2M7dl4dmFi15sq4y9GW+D8SRmrDwnv8eVgPJTqxp7/TKaZUQKBgCMMI4QKV7DsWFDSMh0KL1tKcM1BzNwb1OzBrbEl6hwhlEsFtTHYU/zgtyvIoCBbNA/hvZruokfRiecaBZ5q5Qx6P6ArQEoTxS406G5xKcKgeyyDB9oBKXnF/zYVWrPd/2d7h1dR35nrH0PIBe8mZ9BtdVnxeBs8l6bgyQl+WPyVAoGBAPW7XxyLUAZ4X6JD4b5Iqq4E40xmDO3rUysrH8Zj7MN47ykZI0SlwA9B6hqliRLLJXkzhaAamecWb1RNJFDWfcg4bIyew4ukRbYB07RI+l0DXEgOxxTBcvN6BNUoIiQSEKXkOv+xt7Ez2TBoDm67xD58vwSXT4aPt4qxnd4i7Ves" AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kkRL7lgKYs7f8Xi4DNKzp2ggjwy4By7RunwT4Ur4A71HVOqRQed9r45a6/W4JPuVv51tiHMojZifEKX7ixSlDG6be677RiNslMJ5G3mjw/+Ku01tV9Qzw5YyhvxbqmS8Qp9vgL8VPYhxqTxKO6WW+xiyVvxko+mrU+dbSFIVbBjp88NVVcquu+vZT/uwtjriKSwsesAm8DkKT6mTqY5P/JroMzTU7xa3/ErAMte6t2dOsxPS7kqWjJyoLBHRk+AH87X5lNBEjLgYPk1ADU7zFsLdC+nv4fm7nihYre7fCrdCTVKguXmPCEFBjqwSkag7BSIxRQjS3qHxi+DUMst7wIDAQAB" + AppCertPath : "etc/merchant/appCertPublicKey_2021005113664540.crt" + AlipayCertPath : "etc/merchant/alipayCertPublicKey_RSA2.crt" + AlipayRootCertPath : "etc/merchant/alipayRootCert.crt" IsProduction: true NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback" ReturnURL: "http://localhost:5678/inquire" + Wxpay: AppID: "wxa581992dc74d860e" MchID: "1704330055" diff --git a/app/user/cmd/api/etc/main.yaml b/app/user/cmd/api/etc/main.yaml index 9562758..a7a2cf7 100644 --- a/app/user/cmd/api/etc/main.yaml +++ b/app/user/cmd/api/etc/main.yaml @@ -32,8 +32,11 @@ YushanConfig: Url: "https://api.yushanshuju.com/credit-gw/service" Alipay: AppID: "2021005113664540" - PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDIc92zqtkv6YE2xlzGXACdK2KUJ+i8X39Ev6JWItiYCwu4b0fNdKTSggroxaiWDEQtIX8ek3m08ausZDB5mLr3afzTAVFV92rWwseR79c4Hs+Od/S18S2AjOVsaeM1AT2/GhLYbmcZJ5ph45ejYw7Uq5NqpBj2V7JgFTuGx4T2R6jnOnqeKjXYX1BoPWx98CyxroIFGxJinnPmHAq5aoaFltPqf9ugD8eNJUMQqcd6xhOdmTBZTKuslTi2phjO2njp97bBf5MTOCfcKqmCXQ2v0pNYrGBLAZoUgWwn9sQeYE2AALt38Q4A1tg7rrP1/F52sDW3DNEs+irZRDddNLVxAgMBAAECggEARcOVoIdQqY0yLHcjKOIyUIEeAQRWyuDNsYakoCfmjBwkCx+ntMjo6F7cHyFTyE0imTZ0QJcBH8mQfyIrgNZ4E83ucR2fSjUfGPmXbaI0nFKU2DfFkmEK/heLbYz4x6TT8aPIdU0PUsDmyTTlvLaoHbpNRysviOUCrtAU9JaSHwg562PKRTsizAnbGdT6Slcl2BuSk2cDHXCiNq0z7KryZAo8vtTIJ3BKngjhjRFs0KV6Mf/b/OrRlBxAx04AewkicM+EHqswABJtf4BBlpUM+NUb7RMygupq2wABZXk64bsX/HycMl/uz+WsTzAMp/M0/SPfItoxGSqU8ZlQDFoK8QKBgQDqE2OCkk5zv5UuB/ClO48Xhvv5y6Xcwh0t1XhZyL57sb1PZkk1CIcqIKmBs5dP44UZKExU7AjA4k90UvLIbpRPpOK9kU16UJeQwGFm8Lr9pJRMNCNE9GRmjNc18GaV8zK6aMpN3urga+sKOMsdpQ+eT8JawMQGdytEg4EY/IaxrQKBgQDbOkUZXnt4Y6TZCH8akZz7LmKidFG5yp5vxMBwe/V3ePb+Ssxz7Qqj4ooPE50aVTMNNSJR1rasXXMzocUG+/kECqnSdBKj/JH1n6TtmLU/tkeHZV+HIP/h0TFIqdAVcYRQZK7Fgz+yddZgYV2XAxFlfq1Wt40+0JGmrwg6ALdzVQKBgQDVJyjDuzVjo/9V9ncGEDFijFIii3cTi1SE61J3+By1iQpKJmvdtlFXZHzXFlJgtl/6o762ymXCN5OA6xQYvtGhoRW06H80NfV/JCDOW8L7vIYqyoOfhCl1VSWZAbx5Kgh0xX4L4UXjbYKQQV19NlT9pcXnXIhlFtm4v0OtHDAP1QKBgA9k5hlD8zOe+6Jp4FMDSpywwyhZNqvvOHTswf6kFbaP/fgZVIYHbSnY7Izmea+xr+YLhx9sDmPIJCDKCUXWR8Qq44XttKljQPSYg0JT6NZSfG9bhPu+K3m18NoDYqM+12W1zDf+YWissaMO8z15b61K2e0u8nIovzGPNOqtxjQJAoGBAK5F47okw79md18/XLMZ5Cv268tS8PN+YJVHteTgT7gP1bSvk4wqRPZdcmJIjADzEEkHEmvTgqSOtR/5Aw0s2qhyKVV8Q8WnCm+9hELWSKj3D0Fy5Q6By9JjLsZh1C1p1AEA8alrJ3+b7WUBy1/mYaIi3VirW/3mgOKXSBJ0HVuF" + PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCA1mtTVZmB/7/wWV37Z8hUXEXFs0Gn1/Ie7c6rPQQRUlPHyJGcPAZvDii+ySC1/bplneMENRAjCuoJEM1z4X1FMt8rLggCqnF1xzUN2p9fdXUwcRPmSV4yi9ggMiFXldm0/eyaobV2fj0/VSLED2Qc8xBStM9pqkfszwf2rsAAKL15WQXOUiQw0s25s+Du18H4+YgkQ0HBr0+VPfhL4QoOvsE34ZYP0TuTwxVheYNkvSOPXFXmtE3z/b+75y2n2msa9S4HItNVYpOkB7z3GDB+0/rvX+Q+GvYI9BSBbgJwEuqiMN2SwQyAjH608JBoAUGnk0ygfG8juF77shBxzr/vAgMBAAECggEAQTlL2EJrlm59IxZ7B72Ao4SbJf0b7fba8mF90R7wojxFgcy+OpQAxdQrOHrl/nxXEv6dYRHj+3mZBcHl4RZ0rsWUSW3iTEcxbWjOKRdWu6LhEwcMBfd6oqg9X/9A9fA86O3sDFR1Y2mBZECbexo3mphK2TQEFQBJrU8aPv404V784u0wTh1oLO0Z3NjgvXOAy3ZsM64oZROVCkObXnZGyrY8Hf6W+YLmCoI7eajOQ9QTFy1x24fm8LFdWNizG9/DFa4EC7ZjiYzFhGpfpKb4964QnN3Krlf18Ryhgf3PO6IDO04JOdnHLKhR8+kHIN5m6AMIyKxbZ/vKw4X09Z8XoQKBgQD7jNHzEhIo4IOmRzgdoGxSCLXe1cUbwFL4tU3n7miUCYL/k6wpiNkCGwikaHMiSG0Om2D6+I9gX/rBrTrp2MAmcHA6ymn1GARSYMv7rz+5afGygfBDNr/7xQ2ASCatB65TObH+AUZzdq82B5dpr46AJhilRcHnQEyc/SyIelft2QKBgQCDHeDYt3vTDJ1vIPtXeyO1NHbGQY7cUucx3sZ+QVdF0abstcutT0LrHOgDCWFtnvjia1f0QRPDnTzUtq4GQxj63/9zZr1pMGsd7gjgIvVjM0LqUQXU0TMpO1DuU2zyemRyJTfWDDN+vTvA2+376cW0QxKq2CKOhX45WZRrUBbXBwKBgQCPVFe0ZlGOlQ6uSdpBl0zhGTF3vNpIy7b7G2M+ietwnlLUCXKJX/42YuzzsMgZeqcZMZN6rPIU+dtJS8lLwUMLI/nupbLmAj9EKP9RczOeFC2xhrQ9uA6ACHF+7J2M7dl4dmFi15sq4y9GW+D8SRmrDwnv8eVgPJTqxp7/TKaZUQKBgCMMI4QKV7DsWFDSMh0KL1tKcM1BzNwb1OzBrbEl6hwhlEsFtTHYU/zgtyvIoCBbNA/hvZruokfRiecaBZ5q5Qx6P6ArQEoTxS406G5xKcKgeyyDB9oBKXnF/zYVWrPd/2d7h1dR35nrH0PIBe8mZ9BtdVnxeBs8l6bgyQl+WPyVAoGBAPW7XxyLUAZ4X6JD4b5Iqq4E40xmDO3rUysrH8Zj7MN47ykZI0SlwA9B6hqliRLLJXkzhaAamecWb1RNJFDWfcg4bIyew4ukRbYB07RI+l0DXEgOxxTBcvN6BNUoIiQSEKXkOv+xt7Ez2TBoDm67xD58vwSXT4aPt4qxnd4i7Ves" AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kkRL7lgKYs7f8Xi4DNKzp2ggjwy4By7RunwT4Ur4A71HVOqRQed9r45a6/W4JPuVv51tiHMojZifEKX7ixSlDG6be677RiNslMJ5G3mjw/+Ku01tV9Qzw5YyhvxbqmS8Qp9vgL8VPYhxqTxKO6WW+xiyVvxko+mrU+dbSFIVbBjp88NVVcquu+vZT/uwtjriKSwsesAm8DkKT6mTqY5P/JroMzTU7xa3/ErAMte6t2dOsxPS7kqWjJyoLBHRk+AH87X5lNBEjLgYPk1ADU7zFsLdC+nv4fm7nihYre7fCrdCTVKguXmPCEFBjqwSkag7BSIxRQjS3qHxi+DUMst7wIDAQAB" + AppCertPath: "etc/merchant/appCertPublicKey_2021005113664540.crt" + AlipayCertPath: "etc/merchant/alipayCertPublicKey_RSA2.crt" + AlipayRootCertPath: "etc/merchant/alipayRootCert.crt" IsProduction: true NotifyUrl: "https://www.tianyuandata.com/api/v1/pay/alipay/callback" ReturnURL: "https://www.tianyuandata.com/report" diff --git a/app/user/cmd/api/etc/merchant/alipayCertPublicKey_RSA2.crt b/app/user/cmd/api/etc/merchant/alipayCertPublicKey_RSA2.crt new file mode 100644 index 0000000..5846438 --- /dev/null +++ b/app/user/cmd/api/etc/merchant/alipayCertPublicKey_RSA2.crt @@ -0,0 +1,43 @@ +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQICUDBjgAYvSDOiVZlr/A9zANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE +BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs +YXNzIDIgUjEwHhcNMjUwMzA2MTE1ODQ2WhcNMzAwMzA1MTE1ODQ2WjCBlTELMAkGA1UEBhMCQ04x +MDAuBgNVBAoMJ+a1t+WNl+Wkqei/nOWkp+aVsOaNruenkeaKgOaciemZkOWFrOWPuDEPMA0GA1UE +CwwGQWxpcGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWF +rOWPuC0yMDg4MDUxMDMyOTk4NDkyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0kkR +L7lgKYs7f8Xi4DNKzp2ggjwy4By7RunwT4Ur4A71HVOqRQed9r45a6/W4JPuVv51tiHMojZifEKX +7ixSlDG6be677RiNslMJ5G3mjw/+Ku01tV9Qzw5YyhvxbqmS8Qp9vgL8VPYhxqTxKO6WW+xiyVvx +ko+mrU+dbSFIVbBjp88NVVcquu+vZT/uwtjriKSwsesAm8DkKT6mTqY5P/JroMzTU7xa3/ErAMte +6t2dOsxPS7kqWjJyoLBHRk+AH87X5lNBEjLgYPk1ADU7zFsLdC+nv4fm7nihYre7fCrdCTVKguXm +PCEFBjqwSkag7BSIxRQjS3qHxi+DUMst7wIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZI +hvcNAQELBQADggEBAIrXa4HfvKtjIb+F5YRi1GuhdPn20tkyQaw8GB/xZ30kpe1NyQdr2D3JPSIi +wd+MBGEhAF2HrD+UT9AnqsHQOwFrWJUNFArw1joMkMJQtnpD9nH1po1l0ECR5KF0gzsDroXOFXsW +QVicHhbZ4J54LswgedEKURETP74o/NdTD24IzXt+rjQe1Nsu7mgkj+VqmXVtqjOIS5IllRo3TD30 +h031HCg+OLGpGmJylYiD5C5Y+7YkPzJC0pzsvqLvT1yGNForSlujPB/s7rCBq4ZEX08/u2fbfMpd +PuZJgZdRmF7Xr5LV7JeeYrTzOKmzSEByXIFM0NsEdggpSD8eyqclQd4= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIE4jCCAsqgAwIBAgIIYsSr5bKAMl8wDQYJKoZIhvcNAQELBQAwejELMAkGA1UEBhMCQ04xFjAU +BgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEw +LwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMy +MjE0MzQxNVoXDTM3MTEyNjE0MzQxNVowgYIxCzAJBgNVBAYTAkNOMRYwFAYDVQQKDA1BbnQgRmlu +YW5jaWFsMSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE5MDcGA1UEAwwwQW50IEZp +bmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBDbGFzcyAyIFIxMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAsLMfYaoRoPRbmDcAfXPCmKf43pWRN5yTXa/KJWO0l+mrgQvs89bA +NEvbDUxlkGwycwtwi5DgBuBgVhLliXu+R9CYgr2dXs8D8Hx/gsggDcyGPLmVrDOnL+dyeauheARZ +fA3du60fwEwwbGcVIpIxPa/4n3IS/ElxQa6DNgqxh8J9Xwh7qMGl0JK9+bALuxf7B541Gr4p0WEN +G8fhgjBV4w4ut9eQLOoa1eddOUSZcy46Z7allwowwgt7b5VFfx/P1iKJ3LzBMgkCK7GZ2kiLrL7R +iqV+h482J7hkJD+ardoc6LnrHO/hIZymDxok+VH9fVeUdQa29IZKrIDVj65THQIDAQABo2MwYTAf +BgNVHSMEGDAWgBRfdLQEwE8HWurlsdsio4dBspzhATAdBgNVHQ4EFgQUSqHkYINtUSAtDPnS8Xoy +oP9p7qEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIB +AIQ8TzFy4bVIVb8+WhHKCkKNPcJe2EZuIcqvRoi727lZTJOfYy/JzLtckyZYfEI8J0lasZ29wkTt +a1IjSo+a6XdhudU4ONVBrL70U8Kzntplw/6TBNbLFpp7taRALjUgbCOk4EoBMbeCL0GiYYsTS0mw +7xdySzmGQku4GTyqutIGPQwKxSj9iSFw1FCZqr4VP4tyXzMUgc52SzagA6i7AyLedd3tbS6lnR5B +L+W9Kx9hwT8L7WANAxQzv/jGldeuSLN8bsTxlOYlsdjmIGu/C9OWblPYGpjQQIRyvs4Cc/mNhrh+ +14EQgwuemIIFDLOgcD+iISoN8CqegelNcJndFw1PDN6LkVoiHz9p7jzsge8RKay/QW6C03KNDpWZ +EUCgCUdfHfo8xKeR+LL1cfn24HKJmZt8L/aeRZwZ1jwePXFRVtiXELvgJuM/tJDIFj2KD337iV64 +fWcKQ/ydDVGqfDZAdcU4hQdsrPWENwPTQPfVPq2NNLMyIH9+WKx9Ed6/WzeZmIy5ZWpX1TtTolo6 +OJXQFeItMAjHxW/ZSZTok5IS3FuRhExturaInnzjYpx50a6kS34c5+c8hYq7sAtZ/CNLZmBnBCFD +aMQqT8xFZJ5uolUaSeXxg7JFY1QsYp5RKvj4SjFwCGKJ2+hPPe9UyyltxOidNtxjaknOCeBHytOr +-----END CERTIFICATE----- diff --git a/app/user/cmd/api/etc/merchant/alipayRootCert.crt b/app/user/cmd/api/etc/merchant/alipayRootCert.crt new file mode 100644 index 0000000..76417c5 --- /dev/null +++ b/app/user/cmd/api/etc/merchant/alipayRootCert.crt @@ -0,0 +1,88 @@ +-----BEGIN CERTIFICATE----- +MIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG +EwJDTjEOMAwGA1UECgwFTlJDQUMxDzANBgNVBAMMBlJPT1RDQTAeFw0xMjA3MTQw +MzExNTlaFw00MjA3MDcwMzExNTlaMC4xCzAJBgNVBAYTAkNOMQ4wDAYDVQQKDAVO +UkNBQzEPMA0GA1UEAwwGUk9PVENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE +MPCca6pmgcchsTf2UnBeL9rtp4nw+itk1Kzrmbnqo05lUwkwlWK+4OIrtFdAqnRT +V7Q9v1htkv42TsIutzd126NdMFswHwYDVR0jBBgwFoAUTDKxl9kzG8SmBcHG5Yti +W/CXdlgwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFEwysZfZ +MxvEpgXBxuWLYlvwl3ZYMAwGCCqBHM9VAYN1BQADSAAwRQIgG1bSLeOXp3oB8H7b +53W+CKOPl2PknmWEq/lMhtn25HkCIQDaHDgWxWFtnCrBjH16/W3Ezn7/U/Vjo5xI +pDoiVhsLwg== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIF0zCCA7ugAwIBAgIIH8+hjWpIDREwDQYJKoZIhvcNAQELBQAwejELMAkGA1UE +BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMyMTEzNDg0MFoXDTM4MDIyODEzNDg0 +MFowejELMAkGA1UEBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNV +BAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEAtytTRcBNuur5h8xuxnlKJetT65cHGemGi8oD+beHFPTk +rUTlFt9Xn7fAVGo6QSsPb9uGLpUFGEdGmbsQ2q9cV4P89qkH04VzIPwT7AywJdt2 +xAvMs+MgHFJzOYfL1QkdOOVO7NwKxH8IvlQgFabWomWk2Ei9WfUyxFjVO1LVh0Bp +dRBeWLMkdudx0tl3+21t1apnReFNQ5nfX29xeSxIhesaMHDZFViO/DXDNW2BcTs6 +vSWKyJ4YIIIzStumD8K1xMsoaZBMDxg4itjWFaKRgNuPiIn4kjDY3kC66Sl/6yTl +YUz8AybbEsICZzssdZh7jcNb1VRfk79lgAprm/Ktl+mgrU1gaMGP1OE25JCbqli1 +Pbw/BpPynyP9+XulE+2mxFwTYhKAwpDIDKuYsFUXuo8t261pCovI1CXFzAQM2w7H +DtA2nOXSW6q0jGDJ5+WauH+K8ZSvA6x4sFo4u0KNCx0ROTBpLif6GTngqo3sj+98 +SZiMNLFMQoQkjkdN5Q5g9N6CFZPVZ6QpO0JcIc7S1le/g9z5iBKnifrKxy0TQjtG +PsDwc8ubPnRm/F82RReCoyNyx63indpgFfhN7+KxUIQ9cOwwTvemmor0A+ZQamRe +9LMuiEfEaWUDK+6O0Gl8lO571uI5onYdN1VIgOmwFbe+D8TcuzVjIZ/zvHrAGUcC +AwEAAaNdMFswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFF90 +tATATwda6uWx2yKjh0GynOEBMB8GA1UdIwQYMBaAFF90tATATwda6uWx2yKjh0Gy +nOEBMA0GCSqGSIb3DQEBCwUAA4ICAQCVYaOtqOLIpsrEikE5lb+UARNSFJg6tpkf +tJ2U8QF/DejemEHx5IClQu6ajxjtu0Aie4/3UnIXop8nH/Q57l+Wyt9T7N2WPiNq +JSlYKYbJpPF8LXbuKYG3BTFTdOVFIeRe2NUyYh/xs6bXGr4WKTXb3qBmzR02FSy3 +IODQw5Q6zpXj8prYqFHYsOvGCEc1CwJaSaYwRhTkFedJUxiyhyB5GQwoFfExCVHW +05ZFCAVYFldCJvUzfzrWubN6wX0DD2dwultgmldOn/W/n8at52mpPNvIdbZb2F41 +T0YZeoWnCJrYXjq/32oc1cmifIHqySnyMnavi75DxPCdZsCOpSAT4j4lAQRGsfgI +kkLPGQieMfNNkMCKh7qjwdXAVtdqhf0RVtFILH3OyEodlk1HYXqX5iE5wlaKzDop +PKwf2Q3BErq1xChYGGVS+dEvyXc/2nIBlt7uLWKp4XFjqekKbaGaLJdjYP5b2s7N +1dM0MXQ/f8XoXKBkJNzEiM3hfsU6DOREgMc1DIsFKxfuMwX3EkVQM1If8ghb6x5Y +jXayv+NLbidOSzk4vl5QwngO/JYFMkoc6i9LNwEaEtR9PhnrdubxmrtM+RjfBm02 +77q3dSWFESFQ4QxYWew4pHE0DpWbWy/iMIKQ6UZ5RLvB8GEcgt8ON7BBJeMc+Dyi +kT9qhqn+lw== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICiDCCAgygAwIBAgIIQX76UsB/30owDAYIKoZIzj0EAwMFADB6MQswCQYDVQQG +EwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UECwwXQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNpYWwgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgRTEwHhcNMTkwNDI4MTYyMDQ0WhcNNDkwNDIwMTYyMDQ0 +WjB6MQswCQYDVQQGEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UE +CwwXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNp +YWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASCCRa94QI0vR5Up9Yr9HEupz6hSoyjySYqo7v837KnmjveUIUNiuC9pWAU +WP3jwLX3HkzeiNdeg22a0IZPoSUCpasufiLAnfXh6NInLiWBrjLJXDSGaY7vaokt +rpZvAdmjXTBbMAsGA1UdDwQEAwIBBjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRZ +4ZTgDpksHL2qcpkFkxD2zVd16TAfBgNVHSMEGDAWgBRZ4ZTgDpksHL2qcpkFkxD2 +zVd16TAMBggqhkjOPQQDAwUAA2gAMGUCMQD4IoqT2hTUn0jt7oXLdMJ8q4vLp6sg +wHfPiOr9gxreb+e6Oidwd2LDnC4OUqCWiF8CMAzwKs4SnDJYcMLf2vpkbuVE4dTH +Rglz+HGcTLWsFs4KxLsq7MuU+vJTBUeDJeDjdA== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIUEMdk6dVgOEIS2cCP0Q43P90Ps5YwDQYJKoZIhvcNAQEF +BQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM +E0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg +MiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDkzNjU2WhcNMzMwNDE4MDkzNjU2WjBq +MQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp +bmEgVHJ1c3QgTmV0d29yazEoMCYGA1UEAwwfaVRydXNDaGluYSBDbGFzcyAyIFJv +b3QgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOPPShpV +nJbMqqCw6Bz1kehnoPst9pkr0V9idOwU2oyS47/HjJXk9Rd5a9xfwkPO88trUpz5 +4GmmwspDXjVFu9L0eFaRuH3KMha1Ak01citbF7cQLJlS7XI+tpkTGHEY5pt3EsQg +wykfZl/A1jrnSkspMS997r2Gim54cwz+mTMgDRhZsKK/lbOeBPpWtcFizjXYCqhw +WktvQfZBYi6o4sHCshnOswi4yV1p+LuFcQ2ciYdWvULh1eZhLxHbGXyznYHi0dGN +z+I9H8aXxqAQfHVhbdHNzi77hCxFjOy+hHrGsyzjrd2swVQ2iUWP8BfEQqGLqM1g +KgWKYfcTGdbPB1MCAwEAAaNjMGEwHQYDVR0OBBYEFG/oAMxTVe7y0+408CTAK8hA +uTyRMB8GA1UdIwQYMBaAFG/oAMxTVe7y0+408CTAK8hAuTyRMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBLnUTfW7hp +emMbuUGCk7RBswzOT83bDM6824EkUnf+X0iKS95SUNGeeSWK2o/3ALJo5hi7GZr3 +U8eLaWAcYizfO99UXMRBPw5PRR+gXGEronGUugLpxsjuynoLQu8GQAeysSXKbN1I +UugDo9u8igJORYA+5ms0s5sCUySqbQ2R5z/GoceyI9LdxIVa1RjVX8pYOj8JFwtn +DJN3ftSFvNMYwRuILKuqUYSHc2GPYiHVflDh5nDymCMOQFcFG3WsEuB+EYQPFgIU +1DHmdZcz7Llx8UOZXX2JupWCYzK1XhJb+r4hK5ncf/w8qGtYlmyJpxk3hr1TfUJX +Yf4Zr0fJsGuv +-----END CERTIFICATE----- \ No newline at end of file diff --git a/app/user/cmd/api/etc/merchant/appCertPublicKey_2021005113664540.crt b/app/user/cmd/api/etc/merchant/appCertPublicKey_2021005113664540.crt new file mode 100644 index 0000000..405a9bc --- /dev/null +++ b/app/user/cmd/api/etc/merchant/appCertPublicKey_2021005113664540.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIEozCCA4ugAwIBAgIQICUDBmfevHFjK0cMiK6zxDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE +BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs +YXNzIDEgUjEwHhcNMjUwMzA2MTE1ODQ1WhcNMzAwMzA1MTE1ODQ1WjBrMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwn5rW35Y2X5aSp6L+c5aSn5pWw5o2u56eR5oqA5pyJ6ZmQ5YWs5Y+4MQ8wDQYDVQQL +DAZBbGlwYXkxGTAXBgNVBAMMEDIwODgwNTEwMzI5OTg0OTIwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCA1mtTVZmB/7/wWV37Z8hUXEXFs0Gn1/Ie7c6rPQQRUlPHyJGcPAZvDii+ySC1 +/bplneMENRAjCuoJEM1z4X1FMt8rLggCqnF1xzUN2p9fdXUwcRPmSV4yi9ggMiFXldm0/eyaobV2 +fj0/VSLED2Qc8xBStM9pqkfszwf2rsAAKL15WQXOUiQw0s25s+Du18H4+YgkQ0HBr0+VPfhL4QoO +vsE34ZYP0TuTwxVheYNkvSOPXFXmtE3z/b+75y2n2msa9S4HItNVYpOkB7z3GDB+0/rvX+Q+GvYI +9BSBbgJwEuqiMN2SwQyAjH608JBoAUGnk0ygfG8juF77shBxzr/vAgMBAAGjggEpMIIBJTAfBgNV +HSMEGDAWgBRxB+IEYRbk5fJl6zEPyeD0PJrVkTAdBgNVHQ4EFgQU8Izqtjr8qvIpRYglmzELt22E +b7MwQAYDVR0gBDkwNzA1BgdggRwBbgEBMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9jYS5hbGlwYXku +Y29tL2Nwcy5wZGYwDgYDVR0PAQH/BAQDAgbAMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9jYS5h +bGlwYXkuY29tL2NybDk5LmNybDBgBggrBgEFBQcBAQRUMFIwKAYIKwYBBQUHMAKGHGh0dHA6Ly9j +YS5hbGlwYXkuY29tL2NhNi5jZXIwJgYIKwYBBQUHMAGGGmh0dHA6Ly9jYS5hbGlwYXkuY29tOjgz +NDAvMA0GCSqGSIb3DQEBCwUAA4IBAQC5j9d26HpXXf/eC40ejQ8E/r5PwN87129jfdDpCQGVJopL +ZyrJzxAHoPW+pG5lbDGmlDC9g8CRgeVcpNNkKDshyDAjlAoKbedTSaI8Bacly6fKPlCwAipepiy3 +fBTovcQYgPNl4aw3spi/0ZsnoTJ3Ye8n7KD4j3j3iBwptXdWFDVSQCJFSdC5tSMQSnm6WUgW3Duw +UalPi2I5CjxCZK35Pbk0GFP5dJwtz4h3YGkLX20TP18HZi0hVrxOErH5U2mP+dlq72DclJEZZZj0 +PPMyOLUqmcQRWMmaVmGhDKpkcx81jSowFKuPlSQfU0dCXZGdqpnXVnAYlLMuMAILQqE+ +-----END CERTIFICATE----- \ No newline at end of file diff --git a/app/user/cmd/api/internal/config/config.go b/app/user/cmd/api/internal/config/config.go index dc234ea..dc5c452 100644 --- a/app/user/cmd/api/internal/config/config.go +++ b/app/user/cmd/api/internal/config/config.go @@ -40,12 +40,15 @@ type Encrypt struct { } type AlipayConfig struct { - AppID string - PrivateKey string - AlipayPublicKey string - IsProduction bool - NotifyUrl string - ReturnURL string + AppID string + PrivateKey string + AlipayPublicKey string + AppCertPath string // 应用公钥证书路径 + AlipayCertPath string // 支付宝公钥证书路径 + AlipayRootCertPath string // 根证书路径 + IsProduction bool + NotifyUrl string + ReturnURL string } type WxpayConfig struct { AppID string diff --git a/app/user/cmd/api/internal/handler/agent/activateagentmembershiphandler.go b/app/user/cmd/api/internal/handler/agent/activateagentmembershiphandler.go new file mode 100644 index 0000000..639d90c --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/activateagentmembershiphandler.go @@ -0,0 +1,29 @@ +package agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func ActivateAgentMembershipHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AgentActivateMembershipReq + 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.NewActivateAgentMembershipLogic(r.Context(), svcCtx) + resp, err := l.ActivateAgentMembership(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/query/rentalinfohandler.go b/app/user/cmd/api/internal/handler/agent/applyforagenthandler.go similarity index 67% rename from app/user/cmd/api/internal/handler/query/rentalinfohandler.go rename to app/user/cmd/api/internal/handler/agent/applyforagenthandler.go index cbd1a6f..42cad30 100644 --- a/app/user/cmd/api/internal/handler/query/rentalinfohandler.go +++ b/app/user/cmd/api/internal/handler/agent/applyforagenthandler.go @@ -1,19 +1,19 @@ -package query +package agent import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" + "tydata-server/app/user/cmd/api/internal/logic/agent" "tydata-server/app/user/cmd/api/internal/svc" "tydata-server/app/user/cmd/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func RentalInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func ApplyForAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryReq + var req types.AgentApplyReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func RentalInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewRentalInfoLogic(r.Context(), svcCtx) - resp, err := l.RentalInfo(&req) + l := agent.NewApplyForAgentLogic(r.Context(), svcCtx) + resp, err := l.ApplyForAgent(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/query/riskassessmenthandler.go b/app/user/cmd/api/internal/handler/agent/generatinglinkhandler.go similarity index 67% rename from app/user/cmd/api/internal/handler/query/riskassessmenthandler.go rename to app/user/cmd/api/internal/handler/agent/generatinglinkhandler.go index 2c06cfd..76333dc 100644 --- a/app/user/cmd/api/internal/handler/query/riskassessmenthandler.go +++ b/app/user/cmd/api/internal/handler/agent/generatinglinkhandler.go @@ -1,19 +1,19 @@ -package query +package agent import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" + "tydata-server/app/user/cmd/api/internal/logic/agent" "tydata-server/app/user/cmd/api/internal/svc" "tydata-server/app/user/cmd/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func RiskAssessmentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GeneratingLinkHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryReq + var req types.AgentGeneratingLinkReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func RiskAssessmentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewRiskAssessmentLogic(r.Context(), svcCtx) - resp, err := l.RiskAssessment(&req) + l := agent.NewGeneratingLinkLogic(r.Context(), svcCtx) + resp, err := l.GeneratingLink(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/getagentauditstatushandler.go b/app/user/cmd/api/internal/handler/agent/getagentauditstatushandler.go new file mode 100644 index 0000000..0435a34 --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/getagentauditstatushandler.go @@ -0,0 +1,17 @@ +package agent + +import ( + "net/http" + + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/common/result" +) + +func GetAgentAuditStatusHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + l := agent.NewGetAgentAuditStatusLogic(r.Context(), svcCtx) + resp, err := l.GetAgentAuditStatus() + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentinfohandler.go b/app/user/cmd/api/internal/handler/agent/getagentinfohandler.go new file mode 100644 index 0000000..157d16b --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/getagentinfohandler.go @@ -0,0 +1,17 @@ +package agent + +import ( + "net/http" + + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/common/result" +) + +func GetAgentInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + l := agent.NewGetAgentInfoLogic(r.Context(), svcCtx) + resp, err := l.GetAgentInfo() + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentmembershipproductconfighandler.go b/app/user/cmd/api/internal/handler/agent/getagentmembershipproductconfighandler.go new file mode 100644 index 0000000..7a5f3b3 --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/getagentmembershipproductconfighandler.go @@ -0,0 +1,29 @@ +package agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func GetAgentMembershipProductConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.AgentMembershipProductConfigReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := agent.NewGetAgentMembershipProductConfigLogic(r.Context(), svcCtx) + resp, err := l.GetAgentMembershipProductConfig(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentproductconfighandler.go b/app/user/cmd/api/internal/handler/agent/getagentproductconfighandler.go new file mode 100644 index 0000000..af0a0f1 --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/getagentproductconfighandler.go @@ -0,0 +1,17 @@ +package agent + +import ( + "net/http" + + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/common/result" +) + +func GetAgentProductConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + l := agent.NewGetAgentProductConfigLogic(r.Context(), svcCtx) + resp, err := l.GetAgentProductConfig() + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/agent/getagentrevenueinfohandler.go b/app/user/cmd/api/internal/handler/agent/getagentrevenueinfohandler.go new file mode 100644 index 0000000..b0a7d21 --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/getagentrevenueinfohandler.go @@ -0,0 +1,29 @@ +package agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func GetAgentRevenueInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.GetAgentRevenueInfoReq + 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.NewGetAgentRevenueInfoLogic(r.Context(), svcCtx) + resp, err := l.GetAgentRevenueInfo(&req) + result.HttpResult(r, w, resp, err) + } +} diff --git a/app/user/cmd/api/internal/handler/query/companyinfohandler.go b/app/user/cmd/api/internal/handler/agent/getlinkdatahandler.go similarity index 68% rename from app/user/cmd/api/internal/handler/query/companyinfohandler.go rename to app/user/cmd/api/internal/handler/agent/getlinkdatahandler.go index 56da87a..e31e5cc 100644 --- a/app/user/cmd/api/internal/handler/query/companyinfohandler.go +++ b/app/user/cmd/api/internal/handler/agent/getlinkdatahandler.go @@ -1,19 +1,19 @@ -package query +package agent import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" + "tydata-server/app/user/cmd/api/internal/logic/agent" "tydata-server/app/user/cmd/api/internal/svc" "tydata-server/app/user/cmd/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func CompanyInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func GetLinkDataHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryReq + var req types.GetLinkDataReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func CompanyInfoHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewCompanyInfoLogic(r.Context(), svcCtx) - resp, err := l.CompanyInfo(&req) + l := agent.NewGetLinkDataLogic(r.Context(), svcCtx) + resp, err := l.GetLinkData(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/agent/saveagentmembershipuserconfighandler.go b/app/user/cmd/api/internal/handler/agent/saveagentmembershipuserconfighandler.go new file mode 100644 index 0000000..6de0168 --- /dev/null +++ b/app/user/cmd/api/internal/handler/agent/saveagentmembershipuserconfighandler.go @@ -0,0 +1,29 @@ +package agent + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "tydata-server/app/user/cmd/api/internal/logic/agent" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/common/result" + "tydata-server/pkg/lzkit/validator" +) + +func SaveAgentMembershipUserConfigHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.SaveAgentMembershipUserConfigReq + if err := httpx.Parse(r, &req); err != nil { + result.ParamErrorResult(r, w, err) + return + } + if err := validator.Validate(req); err != nil { + result.ParamValidateErrorResult(r, w, err) + return + } + l := agent.NewSaveAgentMembershipUserConfigLogic(r.Context(), svcCtx) + err := l.SaveAgentMembershipUserConfig(&req) + result.HttpResult(r, w, nil, err) + } +} diff --git a/app/user/cmd/api/internal/handler/query/backgroundcheckhandler.go b/app/user/cmd/api/internal/handler/query/queryserviceagenthandler.go similarity index 75% rename from app/user/cmd/api/internal/handler/query/backgroundcheckhandler.go rename to app/user/cmd/api/internal/handler/query/queryserviceagenthandler.go index 19d7d37..e817712 100644 --- a/app/user/cmd/api/internal/handler/query/backgroundcheckhandler.go +++ b/app/user/cmd/api/internal/handler/query/queryserviceagenthandler.go @@ -11,9 +11,9 @@ import ( "tydata-server/pkg/lzkit/validator" ) -func BackgroundCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func QueryServiceAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryReq + var req types.QueryServiceReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func BackgroundCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { result.ParamValidateErrorResult(r, w, err) return } - l := query.NewBackgroundCheckLogic(r.Context(), svcCtx) - resp, err := l.BackgroundCheck(&req) + l := query.NewQueryServiceLogic(r.Context(), svcCtx) + resp, err := l.QueryService(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/handler/routes.go b/app/user/cmd/api/internal/handler/routes.go index c1f9555..8c45930 100644 --- a/app/user/cmd/api/internal/handler/routes.go +++ b/app/user/cmd/api/internal/handler/routes.go @@ -4,6 +4,7 @@ package handler import ( "net/http" + agent "tydata-server/app/user/cmd/api/internal/handler/agent" auth "tydata-server/app/user/cmd/api/internal/handler/auth" notification "tydata-server/app/user/cmd/api/internal/handler/notification" pay "tydata-server/app/user/cmd/api/internal/handler/pay" @@ -16,6 +17,89 @@ import ( ) func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodGet, + Path: "/audit/status", + Handler: agent.GetAgentAuditStatusHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/commission", + Handler: agent.GetAgentCommissionHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/generating_link", + Handler: agent.GeneratingLinkHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/info", + Handler: agent.GetAgentInfoHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/membership/save_user_config", + Handler: agent.SaveAgentMembershipUserConfigHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/membership/user_config", + Handler: agent.GetAgentMembershipProductConfigHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/product_config", + Handler: agent.GetAgentProductConfigHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/revenue", + Handler: agent.GetAgentRevenueInfoHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/rewards", + Handler: agent.GetAgentRewardsHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/withdrawal", + Handler: agent.GetAgentWithdrawalHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/withdrawal", + Handler: agent.AgentWithdrawalHandler(serverCtx), + }, + }, + rest.WithJwt(serverCtx.Config.JwtAuth.AccessSecret), + rest.WithPrefix("/api/v1/agent"), + ) + + server.AddRoutes( + []rest.Route{ + { + Method: http.MethodPost, + Path: "/apply", + Handler: agent.ApplyForAgentHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/link", + Handler: agent.GetLinkDataHandler(serverCtx), + }, + { + Method: http.MethodPost, + Path: "/membership/activate", + Handler: agent.ActivateAgentMembershipHandler(serverCtx), + }, + }, + rest.WithPrefix("/api/v1/agent"), + ) + server.AddRoutes( []rest.Route{ { @@ -101,47 +185,17 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ { - // query general background check + // query service agent Method: http.MethodPost, - Path: "/query/backgroundCheck", - Handler: query.BackgroundCheckHandler(serverCtx), - }, - { - // query company info - Method: http.MethodPost, - Path: "/query/companyInfo", - Handler: query.CompanyInfoHandler(serverCtx), - }, - { - // query home service - Method: http.MethodPost, - Path: "/query/homeService", - Handler: query.HomeServiceHandler(serverCtx), - }, - { - // query marriage - Method: http.MethodPost, - Path: "/query/marriage", - Handler: query.MarriageHandler(serverCtx), - }, - { - // query pre-loan background check - Method: http.MethodPost, - Path: "/query/preLoanBackgroundCheck", - Handler: query.PreLoanBackgroundCheckHandler(serverCtx), - }, - { - // query rental info - Method: http.MethodPost, - Path: "/query/rentalInfo", - Handler: query.RentalInfoHandler(serverCtx), - }, - { - // query risk assessment - Method: http.MethodPost, - Path: "/query/riskAssessment", - Handler: query.RiskAssessmentHandler(serverCtx), + Path: "/query/service_agent/:product", + Handler: query.QueryServiceAgentHandler(serverCtx), }, + }, + rest.WithPrefix("/api/v1"), + ) + + server.AddRoutes( + []rest.Route{ { // query service Method: http.MethodPost, @@ -204,6 +258,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ + { + // agent mobile code login + Method: http.MethodPost, + Path: "/user/agent_mobile_code_login", + Handler: user.AgentMobileCodeLoginHandler(serverCtx), + }, { // mobile code login Method: http.MethodPost, diff --git a/app/user/cmd/api/internal/handler/query/preloanbackgroundcheckhandler.go b/app/user/cmd/api/internal/handler/user/agentmobilecodeloginhandler.go similarity index 65% rename from app/user/cmd/api/internal/handler/query/preloanbackgroundcheckhandler.go rename to app/user/cmd/api/internal/handler/user/agentmobilecodeloginhandler.go index d675be5..0b57630 100644 --- a/app/user/cmd/api/internal/handler/query/preloanbackgroundcheckhandler.go +++ b/app/user/cmd/api/internal/handler/user/agentmobilecodeloginhandler.go @@ -1,19 +1,19 @@ -package query +package user import ( "net/http" "github.com/zeromicro/go-zero/rest/httpx" - "tydata-server/app/user/cmd/api/internal/logic/query" + "tydata-server/app/user/cmd/api/internal/logic/user" "tydata-server/app/user/cmd/api/internal/svc" "tydata-server/app/user/cmd/api/internal/types" "tydata-server/common/result" "tydata-server/pkg/lzkit/validator" ) -func PreLoanBackgroundCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { +func AgentMobileCodeLoginHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - var req types.QueryReq + var req types.MobileCodeLoginReq if err := httpx.Parse(r, &req); err != nil { result.ParamErrorResult(r, w, err) return @@ -22,8 +22,8 @@ func PreLoanBackgroundCheckHandler(svcCtx *svc.ServiceContext) http.HandlerFunc result.ParamValidateErrorResult(r, w, err) return } - l := query.NewPreLoanBackgroundCheckLogic(r.Context(), svcCtx) - resp, err := l.PreLoanBackgroundCheck(&req) + l := user.NewAgentMobileCodeLoginLogic(r.Context(), svcCtx) + resp, err := l.AgentMobileCodeLogin(&req) result.HttpResult(r, w, resp, err) } } diff --git a/app/user/cmd/api/internal/logic/agent/activateagentmembershiplogic.go b/app/user/cmd/api/internal/logic/agent/activateagentmembershiplogic.go new file mode 100644 index 0000000..b33d4dc --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/activateagentmembershiplogic.go @@ -0,0 +1,121 @@ +package agent + +import ( + "context" + "database/sql" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "time" + "tydata-server/app/user/model" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ActivateAgentMembershipLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewActivateAgentMembershipLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ActivateAgentMembershipLogic { + return &ActivateAgentMembershipLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *ActivateAgentMembershipLogic) ActivateAgentMembership(req *types.AgentActivateMembershipReq) (resp *types.AgentActivateMembershipResp, err error) { + //userID, err := ctxdata.GetUidFromCtx(l.ctx) + //if err != nil { + // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败: %v", err) + //} + userModel, err := l.svcCtx.UserModel.FindOneByMobile(l.ctx, req.Mobile) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) + } + // 查询用户代理信息 + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userModel.Id) + if err != nil && err != sql.ErrNoRows { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) + } + + // 定义等级顺序映射 + levelOrder := map[string]int{ + "": 1, + model.AgentLeveNameNormal: 1, + model.AgentLeveNameVIP: 2, + model.AgentLeveNameSVIP: 3, + } + + // 验证请求等级合法性 + if _, valid := levelOrder[req.Type]; !valid { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "无效的代理等级: %s", req.Type) + } + + // 如果存在代理记录,进行等级验证 + if agentModel != nil { + currentLevel, exists := levelOrder[agentModel.LevelName] + if !exists { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), + "非法的当前代理等级: %s", agentModel.LevelName) + } + + requestedLevel := levelOrder[req.Type] + if requestedLevel < currentLevel { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), + "禁止降级操作(当前等级:%s,请求等级:%s)", agentModel.LevelName, req.Type) + } + } + + err = l.svcCtx.AgentModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { + agentModel.LevelName = req.Type + agentModel.MembershipExpiryTime = RenewMembership(agentModel.MembershipExpiryTime) + transErr := l.svcCtx.AgentModel.UpdateWithVersion(transCtx, session, agentModel) + if transErr != nil { + return transErr + } + agentMembershipRechargeOrder := model.AgentMembershipRechargeOrder{ + AgentId: agentModel.Id, + UserId: userModel.Id, + LevelName: req.Type, + Amount: req.Amount, + PaymentMethod: req.PaymentMethod, + TransactionId: req.TransactionId, + } + _, transErr = l.svcCtx.AgentMembershipRechargeOrderModel.Insert(transCtx, session, &agentMembershipRechargeOrder) + if transErr != nil { + return transErr + } + return nil + }) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "升级代理等级失败: %s", req.Type) + } + return &types.AgentActivateMembershipResp{ + MembershipType: req.Type, + ExpireTime: agentModel.MembershipExpiryTime.Time.Format("2006-01-02 15:04:05"), + }, nil +} +func RenewMembership(expiry sql.NullTime) sql.NullTime { + // 确定基准时间 + var baseTime time.Time + if expiry.Valid { + baseTime = expiry.Time + } else { + baseTime = time.Now() + } + + // 增加一年(自动处理闰年) + newTime := baseTime.AddDate(1, 0, 0) + + // 返回始终有效的 NullTime + return sql.NullTime{ + Time: newTime, + Valid: true, + } +} diff --git a/app/user/cmd/api/internal/logic/agent/agentwithdrawallogic.go b/app/user/cmd/api/internal/logic/agent/agentwithdrawallogic.go new file mode 100644 index 0000000..d867e1e --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/agentwithdrawallogic.go @@ -0,0 +1,305 @@ +package agent + +import ( + "context" + "fmt" + "github.com/cenkalti/backoff/v4" + "github.com/pkg/errors" + "github.com/smartwalle/alipay/v3" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "time" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/lzUtils" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +// 状态常量 +const ( + StatusProcessing = 1 // 处理中 + StatusSuccess = 2 // 成功 + StatusFailed = 3 // 失败 +) + +// 前端响应状态 +const ( + WithdrawStatusProcessing = 1 + WithdrawStatusSuccess = 2 + WithdrawStatusFailed = 3 +) + +type AgentWithdrawalLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAgentWithdrawalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AgentWithdrawalLogic { + return &AgentWithdrawalLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AgentWithdrawalLogic) AgentWithdrawal(req *types.WithdrawalReq) (*types.WithdrawalResp, error) { + var ( + outBizNo string + withdrawRes = &types.WithdrawalResp{} + ) + + // 使用事务处理核心操作 + err := l.svcCtx.AgentModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户ID失败: %v", err) + } + + // 查询代理信息 + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败: %v", err) + } + + // 查询钱包 + agentWallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agentModel.Id) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理钱包失败: %v", err) + } + + // 校验可提现金额 + withdrawableAmount := agentWallet.Balance - agentWallet.FrozenBalance + if req.Amount > withdrawableAmount { + return errors.Wrapf(xerr.NewErrMsg("您可提现的余额不足"), "获取用户ID失败") + } + + // 生成交易号 + outBizNo = l.svcCtx.AlipayService.GenerateOutTradeNo() + + // 创建提现记录(初始状态为处理中) + if err = l.createWithdrawalRecord(session, agentModel.Id, req, outBizNo); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "创建提现记录失败: %v", err) + } + + // 冻结资金(事务内操作) + if err = l.freezeFunds(session, agentWallet, req.Amount); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "资金冻结失败: %v", err) + } + + return nil + }) + + if err != nil { + return nil, err + } + + // 同步调用支付宝转账 + transferResp, err := l.svcCtx.AlipayService.AliTransfer(l.ctx, req.PayeeAccount, req.PayeeName, req.Amount, "代理提现", outBizNo) + if err != nil { + l.handleTransferError(outBizNo, err, "支付宝接口调用失败") + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "支付宝接口调用失败: %v", err) + } + + switch { + case transferResp.Status == "SUCCESS": + // 立即处理成功状态 + l.handleTransferSuccess(outBizNo, transferResp) + withdrawRes.Status = WithdrawStatusSuccess + case transferResp.Status == "FAIL" || transferResp.SubCode != "": + // 处理明确失败 + errorMsg := l.mapAlipayError(transferResp.SubCode) + l.handleTransferFailure(outBizNo, transferResp) + withdrawRes.Status = WithdrawStatusFailed + withdrawRes.FailMsg = errorMsg + case transferResp.Status == "DEALING": + // 处理中状态,启动异步轮询 + go l.startAsyncPolling(outBizNo) + withdrawRes.Status = WithdrawStatusProcessing + default: + // 未知状态按失败处理 + l.handleTransferError(outBizNo, fmt.Errorf("未知状态:%s", transferResp.Status), "支付宝返回未知状态") + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "支付宝接口调用失败: %v", err) + } + return withdrawRes, nil +} + +// 错误类型映射 +func (l *AgentWithdrawalLogic) mapAlipayError(code string) string { + errorMapping := map[string]string{ + // 账户存在性错误 + "PAYEE_ACCOUNT_NOT_EXSIT": "收款账户不存在,请检查账号是否正确", + "PAYEE_NOT_EXIST": "收款账户不存在或姓名有误,请核实信息", + "PAYEE_ACC_OCUPIED": "收款账号存在多个账户,无法确认唯一性", + "PAYEE_MID_CANNOT_SAME": "收款方和中间方不能是同一个人,请修改收款方或者中间方信息", + + // 实名认证问题 + "PAYEE_CERTIFY_LEVEL_LIMIT": "收款方未完成实名认证", + "PAYEE_NOT_RELNAME_CERTIFY": "收款方未完成实名认证", + "PAYEE_CERT_INFO_ERROR": "收款方证件信息不匹配", + + // 账户状态异常 + "PAYEE_ACCOUNT_STATUS_ERROR": "收款账户状态异常,请更换账号", + "PAYEE_USERINFO_STATUS_ERROR": "收款账户状态异常,无法收款", + "PERMIT_LIMIT_PAYEE": "收款账户异常,请更换账号", + "BLOCK_USER_FORBBIDEN_RECIEVE": "账户冻结无法收款", + "PAYEE_TRUSTEESHIP_ACC_OVER_LIMIT": "收款方托管子户累计收款金额超限", + + // 账户信息错误 + "PAYEE_USERINFO_ERROR": "收款方姓名或信息不匹配", + "PAYEE_CARD_INFO_ERROR": "收款支付宝账号及户名不一致", + "PAYEE_IDENTITY_NOT_MATCH": "收款方身份信息不匹配", + "PAYEE_USER_IS_INST": "收款方为金融机构,不能使用提现功能,请更换收款账号", + "PAYEE_USER_TYPE_ERROR": "该支付宝账号类型不支持提现,请更换收款账号", + + // 权限与限制 + "PAYEE_RECEIVE_COUNT_EXCEED_LIMIT": "收款次数超限,请明日再试", + "PAYEE_OUT_PERMLIMIT_CHECK_FAILURE": "收款方权限校验不通过", + "PERMIT_NON_BANK_LIMIT_PAYEE": "收款方未完善身份信息,无法收款", + } + if msg, ok := errorMapping[code]; ok { + return msg + } + return "系统错误,请联系客服" +} + +// 创建提现记录(事务内操作) +func (l *AgentWithdrawalLogic) createWithdrawalRecord(session sqlx.Session, agentID int64, req *types.WithdrawalReq, outBizNo string) error { + record := &model.AgentWithdrawal{ + AgentId: agentID, + WithdrawNo: outBizNo, + PayeeAccount: req.PayeeAccount, + Amount: req.Amount, + Status: StatusProcessing, + } + + _, err := l.svcCtx.AgentWithdrawalModel.Insert(l.ctx, session, record) + return err +} + +// 冻结资金(事务内操作) +func (l *AgentWithdrawalLogic) freezeFunds(session sqlx.Session, wallet *model.AgentWallet, amount float64) error { + wallet.Balance -= amount + wallet.FrozenBalance += amount + err := l.svcCtx.AgentWalletModel.UpdateWithVersion(l.ctx, session, wallet) + if err != nil { + return err + } + + return nil +} + +// 处理异步轮询 +func (l *AgentWithdrawalLogic) startAsyncPolling(outBizNo string) { + go func() { + detachedCtx := context.WithoutCancel(l.ctx) + retryConfig := &backoff.ExponentialBackOff{ + InitialInterval: 10 * time.Second, + RandomizationFactor: 0.5, // 增加随机因子防止惊群 + Multiplier: 2, + MaxInterval: 30 * time.Second, + MaxElapsedTime: 5 * time.Minute, // 缩短总超时 + Clock: backoff.SystemClock, + } + retryConfig.Reset() + operation := func() error { + statusRsp, err := l.svcCtx.AlipayService.QueryTransferStatus(detachedCtx, outBizNo) + if err != nil { + return err // 触发重试 + } + + switch statusRsp.Status { + case "SUCCESS": + l.handleTransferSuccess(outBizNo, statusRsp) + return nil + case "FAIL": + l.handleTransferFailure(outBizNo, statusRsp) + return nil + default: + return fmt.Errorf("转账处理中") + } + } + + err := backoff.RetryNotify(operation, + backoff.WithContext(retryConfig, detachedCtx), + func(err error, duration time.Duration) { + l.Logger.Infof("轮询延迟 outBizNo:%s 等待:%v", outBizNo, duration) + }) + + if err != nil { + l.handleTransferTimeout(outBizNo) + } + }() +} + +// 统一状态更新 +func (l *AgentWithdrawalLogic) updateWithdrawalStatus(outBizNo string, status int64, errorMsg string) { + detachedCtx := context.WithoutCancel(l.ctx) + + err := l.svcCtx.AgentModel.Trans(detachedCtx, func(ctx context.Context, session sqlx.Session) error { + // 获取提现记录 + record, err := l.svcCtx.AgentWithdrawalModel.FindOneByWithdrawNo(l.ctx, outBizNo) + if err != nil { + return err + } + + // 更新状态 + record.Status = status + record.Remark = lzUtils.StringToNullString(errorMsg) + if _, err = l.svcCtx.AgentWithdrawalModel.Update(ctx, session, record); err != nil { + return err + } + + // 失败时解冻资金 + if status == StatusFailed { + wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(ctx, record.AgentId) + if err != nil { + return err + } + + wallet.Balance += record.Amount + wallet.FrozenBalance -= record.Amount + if err := l.svcCtx.AgentWalletModel.UpdateWithVersion(ctx, session, wallet); err != nil { + return err + } + } + + return nil + }) + + if err != nil { + l.Logger.Errorf("状态更新失败 outBizNo:%s error:%v", outBizNo, err) + } +} + +// 成功处理 +func (l *AgentWithdrawalLogic) handleTransferSuccess(outBizNo string, rsp interface{}) { + l.updateWithdrawalStatus(outBizNo, StatusSuccess, "") + l.Logger.Infof("提现成功 outBizNo:%s", outBizNo) +} + +// 失败处理 +func (l *AgentWithdrawalLogic) handleTransferFailure(outBizNo string, rsp interface{}) { + var errorMsg string + if resp, ok := rsp.(*alipay.FundTransUniTransferRsp); ok { + errorMsg = l.mapAlipayError(resp.SubCode) + } + l.updateWithdrawalStatus(outBizNo, StatusFailed, errorMsg) + l.Logger.Errorf("提现失败 outBizNo:%s reason:%s", outBizNo, errorMsg) +} + +// 超时处理 +func (l *AgentWithdrawalLogic) handleTransferTimeout(outBizNo string) { + l.updateWithdrawalStatus(outBizNo, StatusFailed, "系统处理超时") + l.Logger.Errorf("轮询超时 outBizNo:%s", outBizNo) +} + +// 错误处理 +func (l *AgentWithdrawalLogic) handleTransferError(outBizNo string, err error, contextMsg string) { + l.updateWithdrawalStatus(outBizNo, StatusFailed, "系统处理异常") + l.Logger.Errorf("%s outBizNo:%s error:%v", contextMsg, outBizNo, err) +} diff --git a/app/user/cmd/api/internal/logic/agent/applyforagentlogic.go b/app/user/cmd/api/internal/logic/agent/applyforagentlogic.go new file mode 100644 index 0000000..8d3578b --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/applyforagentlogic.go @@ -0,0 +1,169 @@ +package agent + +import ( + "context" + "fmt" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/redis" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "time" + "tydata-server/app/user/model" + jwtx "tydata-server/common/jwt" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/lzUtils" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ApplyForAgentLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewApplyForAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApplyForAgentLogic { + return &ApplyForAgentLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *ApplyForAgentLogic) ApplyForAgent(req *types.AgentApplyReq) (resp *types.AgentApplyResp, err error) { + // 校验验证码 + redisKey := fmt.Sprintf("%s:%s", "agentApply", req.Mobile) + cacheCode, err := l.svcCtx.Redis.Get(redisKey) + if err != nil { + if errors.Is(err, redis.Nil) { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "代理申请, 验证码过期: %s", req.Mobile) + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 读取验证码redis缓存失败, mobile: %s, err: %+v", req.Mobile, err) + } + if cacheCode != req.Code { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "代理申请, 验证码不正确: %s", req.Mobile) + } + if req.Ancestor == req.Mobile { + return nil, errors.Wrapf(xerr.NewErrMsg("不能成为自己的代理"), "") + } + var userID int64 + transErr := l.svcCtx.AgentAuditModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error { + // 两种情况,1. 已注册账号然后申请代理 2. 未注册账号申请代理 + user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, req.Mobile) + if findUserErr != nil && !errors.Is(findUserErr, model.ErrNotFound) { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取数据库获取用户失败, mobile: %s, err: %+v", req.Mobile, err) + } + if user == nil { + user = &model.User{Mobile: req.Mobile} + if len(user.Nickname) == 0 { + user.Nickname = req.Mobile + } + insertResult, userInsertErr := l.svcCtx.UserModel.Insert(transCtx, session, user) + if userInsertErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 数据库插入新用户失败, mobile%s, err: %+v", req.Mobile, err) + } + lastId, lastInsertIdErr := insertResult.LastInsertId() + if lastInsertIdErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) + } + user.Id = lastId + userID = lastId + userAuth := new(model.UserAuth) + userAuth.UserId = lastId + userAuth.AuthKey = req.Mobile + userAuth.AuthType = model.UserAuthTypeAgentDirect + if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(transCtx, session, userAuth); userAuthInsertErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 数据库插入用户认证失败, err:%+v", userAuthInsertErr) + } + } + userID = user.Id + agentAuditModel, findAgentAuditErr := l.svcCtx.AgentAuditModel.FindOneByUserId(transCtx, user.Id) + if findAgentAuditErr != nil && !errors.Is(findAgentAuditErr, model.ErrNotFound) { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 查找审核列表失败%+v", findAgentAuditErr) + } + if agentAuditModel != nil { + if agentAuditModel.Status == 0 { + return errors.Wrapf(xerr.NewErrMsg("您的代理申请中"), "代理申请, 代理申请中") + } else { + return errors.Wrapf(xerr.NewErrMsg("您已申请过代理"), "代理申请, 代理已申请过") + } + } + + var agentAudit model.AgentAudit + agentAudit.UserId = user.Id + agentAudit.Mobile = req.Mobile + agentAudit.Region = req.Region + agentAudit.WechatId = lzUtils.StringToNullString(req.WechatID) + agentAudit.Status = 1 + _, insetAgentAuditErr := l.svcCtx.AgentAuditModel.Insert(transCtx, session, &agentAudit) + if insetAgentAuditErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理申请, 保存代理审核信息失败: %v", insetAgentAuditErr) + } + + //agentAuditID, _ := agentAuditInsert.LastInsertId() + //agentAuditRow, findAgentAuditModelErr := l.svcCtx.AgentAuditModel.FindOne(l.ctx, agentAuditID) + //if findAgentAuditModelErr != nil { + // return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理申请, 查找代理审核信息失败: %v", insetAgentAuditErr) + //} + //agentAuditRow.Status = 1 + //updateAgentAuditErr := l.svcCtx.AgentAuditModel.UpdateWithVersion(transCtx, session, agentAuditRow) + //if updateAgentAuditErr != nil { + // return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 通过代理审核失败: %+v", updateAgentAuditErr) + //} + + // 新增代理 + var agentModel model.Agent + agentModel.Mobile = agentAudit.Mobile + agentModel.Region = agentAudit.Region + agentModel.UserId = agentAudit.UserId + agentModel.WechatId = lzUtils.StringToNullString(req.WechatID) + agentModelInsert, insertAgentModelErr := l.svcCtx.AgentModel.Insert(transCtx, session, &agentModel) + if insertAgentModelErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 新增代理失败: %+v", insertAgentModelErr) + } + agentID, _ := agentModelInsert.LastInsertId() + + // 关联上级 + if req.Ancestor != "" { + ancestorAgentModel, findAgentModelErr := l.svcCtx.AgentModel.FindOneByMobile(transCtx, req.Ancestor) + if findAgentModelErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 查找上级代理失败: %+v", findAgentModelErr) + } + agentClosureModel := model.AgentClosure{ + AncestorId: ancestorAgentModel.Id, + DescendantId: agentID, + Depth: 1, + } + _, insertAgentClosureModelErr := l.svcCtx.AgentClosureModel.Insert(transCtx, session, &agentClosureModel) + if insertAgentClosureModelErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 添加代理上下级关联失败: %+v", insertAgentClosureModelErr) + } + } + + // 新增代理钱包 + var agentWallet model.AgentWallet + agentWallet.AgentId = agentID + _, insertAgentWalletModelErr := l.svcCtx.AgentWalletModel.Insert(transCtx, session, &agentWallet) + if insertAgentWalletModelErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "代理申请, 新增代理钱包失败: %+v", insertAgentWalletModelErr) + } + return nil + }) + if transErr != nil { + return nil, transErr + } + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "代理申请, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.AgentApplyResp{ + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/generatinglinklogic.go b/app/user/cmd/api/internal/logic/agent/generatinglinklogic.go new file mode 100644 index 0000000..0d4fbe4 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/generatinglinklogic.go @@ -0,0 +1,110 @@ +package agent + +import ( + "context" + "encoding/hex" + "encoding/json" + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "strconv" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/crypto" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GeneratingLinkLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGeneratingLinkLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GeneratingLinkLogic { + return &GeneratingLinkLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GeneratingLinkLogic) GeneratingLink(req *types.AgentGeneratingLinkReq) (resp *types.AgentGeneratingLinkResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成代理链接, %v", err) + } + productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.Product) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) + } + + agentProductConfig, err := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, productModel.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) + } + price, err := strconv.ParseFloat(req.Price, 64) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成代理链接, %v", err) + } + if price < agentProductConfig.PriceRangeMin || price > agentProductConfig.PriceRangeMax { + return nil, errors.Wrapf(xerr.NewErrMsg("请设定范围区间内的价格"), "") + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, err + } + + build := l.svcCtx.AgentLinkModel.SelectBuilder().Where(squirrel.And{ + squirrel.Eq{"user_id": userID}, + squirrel.Eq{"product_id": productModel.Id}, // 添加 product_id 的匹配条件 + squirrel.Eq{"price": price}, // 添加 price 的匹配条件 + squirrel.Eq{"agent_id": agentModel.Id}, // 添加 agent_id 的匹配条件 + }) + + agentLinkModel, err := l.svcCtx.AgentLinkModel.FindAll(l.ctx, build, "") + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) + } + if len(agentLinkModel) > 0 { + return &types.AgentGeneratingLinkResp{ + LinkIdentifier: agentLinkModel[0].LinkIdentifier, + }, nil + } + + var agentIdentifier types.AgentIdentifier + agentIdentifier.AgentID = agentModel.Id + agentIdentifier.Product = req.Product + agentIdentifier.Price = req.Price + agentIdentifierByte, err := json.Marshal(agentIdentifier) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单,序列化标识失败, %v", err) + } + key, decodeErr := hex.DecodeString("8e3e7a2f60edb49221e953b9c029ed10") + if decodeErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取AES密钥失败: %+v", decodeErr) + } + + // Encrypt the params + encrypted, err := crypto.AesEncryptURL(agentIdentifierByte, key) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成代理链接, %v", err) + } + + var agentLink model.AgentLink + agentLink.AgentId = agentModel.Id + agentLink.UserId = userID + agentLink.LinkIdentifier = encrypted + agentLink.ProductId = productModel.Id + agentLink.Price = price + _, err = l.svcCtx.AgentLinkModel.Insert(l.ctx, nil, &agentLink) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成代理链接, %v", err) + } + return &types.AgentGeneratingLinkResp{ + LinkIdentifier: encrypted, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentauditstatuslogic.go b/app/user/cmd/api/internal/logic/agent/getagentauditstatuslogic.go new file mode 100644 index 0000000..7ff8497 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentauditstatuslogic.go @@ -0,0 +1,43 @@ +package agent + +import ( + "context" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentAuditStatusLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentAuditStatusLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentAuditStatusLogic { + return &GetAgentAuditStatusLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentAuditStatusLogic) GetAgentAuditStatus() (resp *types.AgentAuditStatusResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理审核信息, %v", err) + } + agentAuditModel, err := l.svcCtx.AgentAuditModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理审核信息, %v", err) + } + + var agentAuditStautsResp types.AgentAuditStatusResp + copier.Copy(&agentAuditStautsResp, agentAuditModel) + return &agentAuditStautsResp, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentcommissionlogic.go b/app/user/cmd/api/internal/logic/agent/getagentcommissionlogic.go new file mode 100644 index 0000000..dc60985 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentcommissionlogic.go @@ -0,0 +1,70 @@ +package agent + +import ( + "context" + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentCommissionLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentCommissionLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentCommissionLogic { + return &GetAgentCommissionLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentCommissionLogic) GetAgentCommission(req *types.GetCommissionReq) (resp *types.GetCommissionResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理佣金列表, %v", err) + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理佣金列表, %v", err) + } + builder := l.svcCtx.AgentCommissionModel.SelectBuilder().Where(squirrel.Eq{ + "agent_id": agentModel.Id, + }) + agentCommissionModelList, total, err := l.svcCtx.AgentCommissionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理佣金列表, 查找列表错误, %v", err) + } + + var list = make([]types.Commission, 0) + + if len(agentCommissionModelList) > 0 { + for _, agentCommissionModel := range agentCommissionModelList { + var commission types.Commission + copyErr := copier.Copy(&commission, agentCommissionModel) + if copyErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理佣金列表, %v", err) + } + product, findProductErr := l.svcCtx.ProductModel.FindOne(l.ctx, agentCommissionModel.ProductId) + if findProductErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理佣金列表, %v", err) + } + commission.CreateTime = agentCommissionModel.CreateTime.Format("2006-01-02 15:04:05") + commission.ProductName = product.ProductName + list = append(list, commission) + } + } + return &types.GetCommissionResp{ + Total: total, + List: list, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentinfologic.go b/app/user/cmd/api/internal/logic/agent/getagentinfologic.go new file mode 100644 index 0000000..b6ca316 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentinfologic.go @@ -0,0 +1,66 @@ +package agent + +import ( + "context" + "database/sql" + "github.com/pkg/errors" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/lzUtils" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentInfoLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentInfoLogic { + return &GetAgentInfoLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentInfoLogic) GetAgentInfo() (resp *types.AgentInfoResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理信息, %v", err) + } + agent, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + agentAuditModel, findAgentAuditErr := l.svcCtx.AgentAuditModel.FindOneByUserId(l.ctx, userID) + if findAgentAuditErr != nil && !errors.Is(findAgentAuditErr, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理信息, %v", err) + } + if errors.Is(findAgentAuditErr, model.ErrNotFound) { + return &types.AgentInfoResp{ + IsAgent: false, + Status: 3, + }, nil + } + return &types.AgentInfoResp{ + IsAgent: false, + Status: agentAuditModel.Status, + }, nil + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理信息, %v", err) + } + return &types.AgentInfoResp{ + AgentID: agent.Id, + Level: agent.LevelName, + IsAgent: true, + Status: 1, + Region: agent.Region, + Mobile: agent.Mobile, + WechatID: lzUtils.NullStringToString(agent.WechatId), + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentmembershipproductconfiglogic.go b/app/user/cmd/api/internal/logic/agent/getagentmembershipproductconfiglogic.go new file mode 100644 index 0000000..df85ea4 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentmembershipproductconfiglogic.go @@ -0,0 +1,77 @@ +package agent + +import ( + "context" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + "tydata-server/pkg/lzkit/lzUtils" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentMembershipProductConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentMembershipProductConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentMembershipProductConfigLogic { + return &GetAgentMembershipProductConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentMembershipProductConfigLogic) GetAgentMembershipProductConfig(req *types.AgentMembershipProductConfigReq) (resp *types.AgentMembershipProductConfigResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,获取用户ID失败: %v", err) + } + + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,获取代理信息失败: %v", err) + } + + agentMembershipConfigModel, err := l.svcCtx.AgentMembershipConfigModel.FindOneByLevelName(l.ctx, agentModel.LevelName) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,获取平台配置会员信息失败: %v", err) + } + agentMembershipUserConfigModel, err := l.svcCtx.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(l.ctx, agentModel.Id, req.ProductID) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return nil, err + } + var agentMembershipUserConfig types.AgentMembershipUserConfig + if agentMembershipUserConfigModel != nil { + err = copier.Copy(&agentMembershipUserConfig, agentMembershipUserConfigModel) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,复制平台配置会员信息失败: %v", err) + } + } else { + agentMembershipUserConfig.ProductID = req.ProductID + } + agentProductConfigModelAll, err := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, req.ProductID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取会员用户报告配置, 获取产品配置%v", err) + } + + var productConfig types.ProductConfig + err = copier.Copy(&productConfig, agentProductConfigModelAll) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取会员用户报告配置,复制平台产品配置失败: %v", err) + } + return &types.AgentMembershipProductConfigResp{ + AgentMembershipUserConfig: agentMembershipUserConfig, + ProductConfig: productConfig, + PriceIncreaseAmount: lzUtils.NullFloat64ToFloat64(agentMembershipConfigModel.PriceIncreaseAmount), + PriceIncreaseMax: lzUtils.NullFloat64ToFloat64(agentMembershipConfigModel.PriceIncreaseMax), + PriceRatio: lzUtils.NullFloat64ToFloat64(agentMembershipConfigModel.PriceRatio), + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentproductconfiglogic.go b/app/user/cmd/api/internal/logic/agent/getagentproductconfiglogic.go new file mode 100644 index 0000000..dab9587 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentproductconfiglogic.go @@ -0,0 +1,136 @@ +package agent + +import ( + "context" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/mr" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentProductConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentProductConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentProductConfigLogic { + return &GetAgentProductConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +type AgentProductConfigResp struct { +} + +func (l *GetAgentProductConfigLogic) GetAgentProductConfig() (resp *types.AgentProductConfigResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取推广项目配置失败, %v", err) + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + if errors.Is(err, model.ErrNotFound) { + return nil, errors.Wrapf(xerr.NewErrMsg("您不是代理"), "") + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取推广项目配置失败, %v", err) + } + // 1. 查询推广项目配置数据 + builder := l.svcCtx.AgentProductConfigModel.SelectBuilder() + agentProductConfigModelAll, err := l.svcCtx.AgentProductConfigModel.FindAll(l.ctx, builder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广项目配置失败, %v", err) + } + + // 用于存放最终组装好的响应数据 + var respList []types.AgentProductConfig + + // 2. 使用 mr.MapReduceVoid 并行处理每个推广项目配置项 + mrMapErr := mr.MapReduceVoid( + // source 函数:遍历所有推广项目配置,将每个配置项发送到 channel 中 + func(source chan<- interface{}) { + for _, config := range agentProductConfigModelAll { + source <- config + } + }, + // map 函数:处理每个推广项目配置项,根据 ProductId 查询会员用户配置,并组装响应数据 + func(item interface{}, writer mr.Writer[*types.AgentProductConfig], cancel func(error)) { + // 将 item 转换为推广项目配置模型 + config := item.(*model.AgentProductConfig) + var agentProductConfig types.AgentProductConfig + // 配置平台成本价和定价成本 + agentProductConfigModel, findAgentProductConfigErr := l.svcCtx.AgentProductConfigModel.FindOneByProductId(l.ctx, config.ProductId) + if findAgentProductConfigErr != nil { + cancel(findAgentProductConfigErr) + return + } + agentProductConfig.ProductID = config.ProductId + agentProductConfig.CostPrice = agentProductConfigModel.CostPrice + agentProductConfig.PriceRangeMin = agentProductConfigModel.PriceRangeMin + agentProductConfig.PriceRangeMax = agentProductConfigModel.PriceRangeMax + agentProductConfig.PPricingStandard = agentProductConfigModel.PricingStandard + agentProductConfig.POverpricingRatio = agentProductConfigModel.OverpricingRatio + + // 看推广人是否有上级,上级是否有这个配置权限,上级是否有相关配置 + agentClosureModel, findAgentClosureErr := l.svcCtx.AgentClosureModel.FindOneByDescendantIdDepth(l.ctx, agentModel.Id, 1) + if findAgentClosureErr != nil && !errors.Is(findAgentClosureErr, model.ErrNotFound) { + cancel(findAgentClosureErr) + return + } + if agentClosureModel != nil { + ancestorAgentModel, findAncestorAgentErr := l.svcCtx.AgentModel.FindOne(l.ctx, agentClosureModel.AncestorId) + if findAncestorAgentErr != nil { + cancel(findAncestorAgentErr) + return + } + agentMembershipConfigModel, findAgentMembershipErr := l.svcCtx.AgentMembershipConfigModel.FindOneByLevelName(l.ctx, ancestorAgentModel.LevelName) + if findAgentMembershipErr != nil { + cancel(findAgentMembershipErr) + return + } + // 是否有提成本价 + if agentMembershipConfigModel.PriceIncreaseAmount.Valid { + // 根据产品ID查询会员用户配置数据 + membershipUserConfigModel, membershipConfigErr := l.svcCtx.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(l.ctx, agentClosureModel.AncestorId, config.ProductId) + if membershipConfigErr != nil { + if errors.Is(membershipConfigErr, model.ErrNotFound) { + writer.Write(&agentProductConfig) + return + } + cancel(membershipConfigErr) + return + } + agentProductConfig.CostPrice += membershipUserConfigModel.PriceIncreaseAmount + agentProductConfig.PriceRangeMin += membershipUserConfigModel.PriceIncreaseAmount + agentProductConfig.APricingStandard = membershipUserConfigModel.PriceRangeFrom + agentProductConfig.APricingEnd = membershipUserConfigModel.PriceRangeTo + agentProductConfig.AOverpricingRatio = membershipUserConfigModel.PriceRatio + } + } + writer.Write(&agentProductConfig) + + }, + // reduce 函数:收集 map 阶段写入的响应数据,并汇总到 respList 中 + func(pipe <-chan *types.AgentProductConfig, cancel func(error)) { + for item := range pipe { + respList = append(respList, *item) + } + }, + ) + if mrMapErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取推广项目配置失败, %+v", mrMapErr) + } + + // 3. 组装最终响应返回 + return &types.AgentProductConfigResp{ + AgentProductConfig: respList, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentrevenueinfologic.go b/app/user/cmd/api/internal/logic/agent/getagentrevenueinfologic.go new file mode 100644 index 0000000..e6ab102 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentrevenueinfologic.go @@ -0,0 +1,198 @@ +package agent + +import ( + "context" + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "time" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentRevenueInfoLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentRevenueInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentRevenueInfoLogic { + return &GetAgentRevenueInfoLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentRevenueInfoLogic) GetAgentRevenueInfo(req *types.GetAgentRevenueInfoReq) (resp *types.GetAgentRevenueInfoResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理奖励, %v", err) + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) + } + agentWalletModel, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, agentModel.Id) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) + } + resp = &types.GetAgentRevenueInfoResp{} + resp.Balance = agentWalletModel.Balance + resp.TotalEarnings = agentWalletModel.TotalEarnings + resp.FrozenBalance = agentWalletModel.FrozenBalance + + // 直推报告统计 + //now := time.Now() + //startTime := now.AddDate(0, 0, -30).Format("2006-01-02 15:04:05") + //endTime := now.Format("2006-01-02 15:04:05") + + // 直推报告佣金 + agentCommissionModelBuild := l.svcCtx.AgentCommissionModel.SelectBuilder(). + Where(squirrel.Eq{"agent_id": agentModel.Id}) + //.Where(squirrel.Expr("create_time BETWEEN ? AND ?", startTime, endTime)) + + agentCommissionsModel, err := l.svcCtx.AgentCommissionModel.FindAll(l.ctx, agentCommissionModelBuild, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) + } + // 筛选分类 + directPush, err := calculateDirectPushReport(agentCommissionsModel, nil) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) + } + // 绑定到响应体 + resp.DirectPush = directPush + + // 活跃下级统计 + agentRewardsModelBuilder := l.svcCtx.AgentRewardsModel.SelectBuilder().Where("agent_id = ?", agentModel.Id) + agentRewardsModel, err := l.svcCtx.AgentRewardsModel.FindAll(l.ctx, agentRewardsModelBuilder, "") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励, %v", err) + } + activeReward := calculateActiveReward(agentRewardsModel) + resp.ActiveReward = activeReward + + return resp, nil +} + +// 统计直推报告的独立函数 +func calculateDirectPushReport(commissions []*model.AgentCommission, loc *time.Location) (types.DirectPushReport, error) { + // 初始化报告结构 + report := types.DirectPushReport{ + Today: types.TimeRangeReport{}, + Last7D: types.TimeRangeReport{}, + Last30D: types.TimeRangeReport{}, + } + + // 获取当前中国时间 + now := time.Now() + + // 计算时间分界点 + todayStart := now.Add(-24 * time.Hour) + last7dStart := now.AddDate(0, 0, -7) + last30dStart := now.AddDate(0, 0, -30) + + // 遍历所有佣金记录 + for _, c := range commissions { + // 转换时区 + createTime := c.CreateTime + + // 统计总量 + report.TotalCommission += c.Amount + report.TotalReport++ + + // 近24小时(滚动周期) + if createTime.After(todayStart) { + report.Today.Commission += c.Amount + report.Today.Report++ + } + + // 近7天(滚动周期) + if createTime.After(last7dStart) { + report.Last7D.Commission += c.Amount + report.Last7D.Report++ + } + + // 近30天(滚动周期) + if createTime.After(last30dStart) { + report.Last30D.Commission += c.Amount + report.Last30D.Report++ + } + } + + return report, nil +} +func calculateActiveReward(rewards []*model.AgentRewards) types.ActiveReward { + result := types.ActiveReward{ + Today: types.ActiveRewardData{}, + Last7D: types.ActiveRewardData{}, + Last30D: types.ActiveRewardData{}, + } + + now := time.Now() + todayStart := now.Add(-24 * time.Hour) // 近24小时 + last7dStart := now.AddDate(0, 0, -7) // 近7天 + last30dStart := now.AddDate(0, 0, -30) // 近30天 + + for _, r := range rewards { + createTime := r.CreateTime + amount := r.Amount + + // 总奖励累加 + result.TotalReward += amount + + // 时间范围判断 + isToday := createTime.After(todayStart) + isLast7d := createTime.After(last7dStart) + isLast30d := createTime.After(last30dStart) + + // 类型分类统计 + switch r.Type { + case model.AgentRewardsTypeDescendantWithdraw: + addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "withdraw") + + case model.AgentRewardsTypeDescendantNewActive: + addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "new_active") + + case model.AgentRewardsTypeDescendantUpgradeSvip, model.AgentRewardsTypeDescendantUpgradeVip: + addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "upgrade") + + case model.AgentRewardsTypeDescendantPromotion: + addToPeriods(&result, amount, isToday, isLast7d, isLast30d, "promotion") + } + } + return result +} + +// 统一处理时间段累加 +func addToPeriods(res *types.ActiveReward, amount float64, today, last7d, last30d bool, t string) { + if today { + addToData(&res.Today, amount, t) + } + if last7d { + addToData(&res.Last7D, amount, t) + } + if last30d { + addToData(&res.Last30D, amount, t) + } +} + +// 分类添加具体字段 +func addToData(data *types.ActiveRewardData, amount float64, t string) { + switch t { + case "withdraw": + data.SubWithdrawReward += amount + case "new_active": + data.NewActiveReward += amount + case "upgrade": + data.SubUpgradeReward += amount + case "promotion": + data.SubPromoteReward += amount + } +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentrewardslogic.go b/app/user/cmd/api/internal/logic/agent/getagentrewardslogic.go new file mode 100644 index 0000000..5369605 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentrewardslogic.go @@ -0,0 +1,67 @@ +package agent + +import ( + "context" + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentRewardsLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentRewardsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentRewardsLogic { + return &GetAgentRewardsLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentRewardsLogic) GetAgentRewards(req *types.GetRewardsReq) (resp *types.GetRewardsResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理奖励列表, %v", err) + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励列表, %v", err) + } + builder := l.svcCtx.AgentRewardsModel.SelectBuilder().Where(squirrel.Eq{ + "agent_id": agentModel.Id, + }) + agentRewardsModelList, total, err := l.svcCtx.AgentRewardsModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理奖励列表, 查找列表错误, %v", err) + } + + var list = make([]types.Rewards, 0) + if len(agentRewardsModelList) > 0 { + for _, agentRewardsModel := range agentRewardsModelList { + var rewards types.Rewards + copyErr := copier.Copy(&rewards, agentRewardsModel) + if copyErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理奖励列表, %v", err) + } + + rewards.CreateTime = agentRewardsModel.CreateTime.Format("2006-01-02 15:04:05") + list = append(list, rewards) + } + } + return &types.GetRewardsResp{ + Total: total, + List: list, + }, nil + + return +} diff --git a/app/user/cmd/api/internal/logic/agent/getagentwithdrawallogic.go b/app/user/cmd/api/internal/logic/agent/getagentwithdrawallogic.go new file mode 100644 index 0000000..dd1e102 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getagentwithdrawallogic.go @@ -0,0 +1,65 @@ +package agent + +import ( + "context" + "github.com/Masterminds/squirrel" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetAgentWithdrawalLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetAgentWithdrawalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetAgentWithdrawalLogic { + return &GetAgentWithdrawalLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetAgentWithdrawalLogic) GetAgentWithdrawal(req *types.GetWithdrawalReq) (resp *types.GetWithdrawalResp, err error) { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理提现列表, %v", err) + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理提现列表, %v", err) + } + builder := l.svcCtx.AgentWithdrawalModel.SelectBuilder().Where(squirrel.Eq{ + "agent_id": agentModel.Id, + }) + agentWithdrawalModelList, total, err := l.svcCtx.AgentWithdrawalModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC") + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理提现列表, 查找列表错误, %v", err) + } + + var list = make([]types.Withdrawal, 0) + + if len(agentWithdrawalModelList) > 0 { + for _, agentWithdrawalModel := range agentWithdrawalModelList { + var withdrawal types.Withdrawal + copyErr := copier.Copy(&withdrawal, agentWithdrawalModel) + if copyErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取代理提现列表, %v", err) + } + withdrawal.CreateTime = agentWithdrawalModel.CreateTime.Format("2006-01-02 15:04:05") + list = append(list, withdrawal) + } + } + return &types.GetWithdrawalResp{ + Total: total, + List: list, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/getlinkdatalogic.go b/app/user/cmd/api/internal/logic/agent/getlinkdatalogic.go new file mode 100644 index 0000000..793a808 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/getlinkdatalogic.go @@ -0,0 +1,45 @@ +package agent + +import ( + "context" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type GetLinkDataLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewGetLinkDataLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLinkDataLogic { + return &GetLinkDataLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetLinkDataLogic) GetLinkData(req *types.GetLinkDataReq) (resp *types.GetLinkDataResp, err error) { + agentLinkModel, err := l.svcCtx.AgentLinkModel.FindOneByLinkIdentifier(l.ctx, req.LinkIdentifier) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理链接数据, %v", err) + } + + productModel, err := l.svcCtx.ProductModel.FindOne(l.ctx, agentLinkModel.ProductId) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "获取代理链接数据, %v", err) + } + var product types.Product + copier.Copy(&product, productModel) + product.SellPrice = agentLinkModel.Price + return &types.GetLinkDataResp{ + Product: product, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go b/app/user/cmd/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go new file mode 100644 index 0000000..7275b92 --- /dev/null +++ b/app/user/cmd/api/internal/logic/agent/saveagentmembershipuserconfiglogic.go @@ -0,0 +1,63 @@ +package agent + +import ( + "context" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "tydata-server/app/user/model" + "tydata-server/common/ctxdata" + "tydata-server/common/xerr" + + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type SaveAgentMembershipUserConfigLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewSaveAgentMembershipUserConfigLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveAgentMembershipUserConfigLogic { + return &SaveAgentMembershipUserConfigLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *SaveAgentMembershipUserConfigLogic) SaveAgentMembershipUserConfig(req *types.SaveAgentMembershipUserConfigReq) error { + userID, err := ctxdata.GetUidFromCtx(l.ctx) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置,获取用户ID失败: %v", err) + } + agentModel, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置: %v", err) + } + agentMembershipUserConfigModel, err := l.svcCtx.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(l.ctx, agentModel.Id, req.ProductID) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return err + } + err = copier.Copy(&agentMembershipUserConfigModel, &req) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置: %v", err) + } + if agentMembershipUserConfigModel == nil { + agentMembershipUserConfigModel.UserId = userID + agentMembershipUserConfigModel.AgentId = agentModel.Id + _, err = l.svcCtx.AgentMembershipUserConfigModel.Insert(l.ctx, nil, agentMembershipUserConfigModel) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置: %v", err) + } + } else { + _, err = l.svcCtx.AgentMembershipUserConfigModel.Update(l.ctx, nil, agentMembershipUserConfigModel) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "保存会员代理报告配置: %v", err) + } + } + + return nil +} diff --git a/app/user/cmd/api/internal/logic/auth/sendsmslogic.go b/app/user/cmd/api/internal/logic/auth/sendsmslogic.go index 93a2752..024a56c 100644 --- a/app/user/cmd/api/internal/logic/auth/sendsmslogic.go +++ b/app/user/cmd/api/internal/logic/auth/sendsmslogic.go @@ -50,7 +50,7 @@ func (l *SendSmsLogic) SendSms(req *types.SendSmsReq) error { // 发送短信 smsResp, err := l.sendSmsRequest(req.Mobile, code) if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 调用阿里客户端失败: %+v", err) + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 调用阿里客户端失败: %v", err) } if *smsResp.Body.Code != "OK" { return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 阿里客户端响应失败: %s", *smsResp.Body.Message) @@ -59,12 +59,12 @@ func (l *SendSmsLogic) SendSms(req *types.SendSmsReq) error { // 将验证码保存到 Redis,设置过期时间 err = l.svcCtx.Redis.Setex(codeKey, code, l.svcCtx.Config.VerifyCode.ValidTime) // 验证码有效期5分钟 if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 验证码设置过期时间失败: %+v", err) + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 验证码设置过期时间失败: %v", err) } // 在 Redis 中设置 1 分钟的标记,限制重复请求 err = l.svcCtx.Redis.Setex(limitCodeKey, code, 60) // 标记 1 分钟内不能重复请求 if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 验证码设置限制重复请求失败: %+v", err) + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "短信发送, 验证码设置限制重复请求失败: %v", err) } return nil } diff --git a/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go b/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go index 6597c21..2d1560a 100644 --- a/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go +++ b/app/user/cmd/api/internal/logic/pay/alipaycallbacklogic.go @@ -4,6 +4,7 @@ import ( "context" "github.com/smartwalle/alipay/v3" "net/http" + "os" "time" "tydata-server/pkg/lzkit/lzUtils" @@ -26,9 +27,13 @@ func NewAlipayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Al } func (l *AlipayCallbackLogic) AlipayCallback(w http.ResponseWriter, r *http.Request) error { + env := os.Getenv("ENV") + if env == "development" { + return nil + } notification, err := l.svcCtx.AlipayService.HandleAliPaymentNotification(r) if err != nil { - logx.Errorf("支付宝支付回调,%+v", err) + logx.Errorf("支付宝支付回调,%v", err) return nil } order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, notification.OutTradeNo) diff --git a/app/user/cmd/api/internal/logic/pay/paymentlogic.go b/app/user/cmd/api/internal/logic/pay/paymentlogic.go index f97334f..7e1e12d 100644 --- a/app/user/cmd/api/internal/logic/pay/paymentlogic.go +++ b/app/user/cmd/api/internal/logic/pay/paymentlogic.go @@ -8,6 +8,7 @@ import ( "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" + "os" "tydata-server/app/user/cmd/api/internal/svc" "tydata-server/app/user/cmd/api/internal/types" "tydata-server/app/user/model" @@ -48,12 +49,12 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, var data types.QueryCacheLoad err = json.Unmarshal([]byte(cache), &data) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 解析缓存内容失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 解析缓存内容失败, %v", err) } product, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, data.Product) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查找产品错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 查找产品错误: %v", err) } secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) @@ -71,16 +72,28 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, var prepayData interface{} var outTradeNo string var amount float64 + var orderAmount float64 user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取用户信息失败: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取用户信息失败: %v", err) + } + + if data.AgentIdentifier != "" { + agentLinkModel, findAgentLinkErr := l.svcCtx.AgentLinkModel.FindOneByLinkIdentifier(l.ctx, data.AgentIdentifier) + if findAgentLinkErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取代理订单失败: %+v", findAgentLinkErr) + } + amount = agentLinkModel.Price + orderAmount = agentLinkModel.Price + } else { + amount = product.SellPrice + orderAmount = product.SellPrice } if user.Inside == 1 { amount = 0.01 - } else { - amount = product.SellPrice } + var createOrderErr error if req.PayMethod == "wechat" { outTradeNo = l.svcCtx.WechatPayService.GenerateOutTradeNo() @@ -103,16 +116,16 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, ProductId: product.Id, PaymentPlatform: req.PayMethod, PaymentScene: "app", - Amount: amount, + Amount: orderAmount, Status: "pending", } orderInsertResult, insertOrderErr := l.svcCtx.OrderModel.Insert(ctx, session, &order) if insertOrderErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 保存订单失败: %+v", insertOrderErr) + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存订单失败: %+v", insertOrderErr) } insertedOrderID, lastInsertIdErr := orderInsertResult.LastInsertId() if lastInsertIdErr != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "生成订单, 获取保存订单ID失败: %+v", lastInsertIdErr) + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 获取保存订单ID失败: %+v", lastInsertIdErr) } orderID = insertedOrderID query := model.Query{ @@ -124,14 +137,32 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, } _, insertQueryErr := l.svcCtx.QueryModel.Insert(l.ctx, session, &query) if insertQueryErr != nil { - return insertQueryErr + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存查询失败: %+v", lastInsertIdErr) + } + if data.AgentIdentifier != "" { + agent, parsingErr := l.agentParsing(data.AgentIdentifier) + if parsingErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 解析代理标识符失败: %+v", parsingErr) + } + var agentOrder model.AgentOrder + agentOrder.OrderId = orderID + agentOrder.AgentId = agent.AgentID + _, agentOrderInsert := l.svcCtx.AgentOrderModel.Insert(ctx, session, &agentOrder) + if agentOrderInsert != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 保存代理订单失败: %+v", agentOrderInsert) + } } return nil }) if transErr != nil { return nil, transErr } - + env := os.Getenv("ENV") + if env == "development" { + if asyncErr := l.svcCtx.AsynqService.SendQueryTask(orderID); asyncErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "生成订单, 异步订单调用失败: %+v", asyncErr) + } + } switch v := prepayData.(type) { case string: // 如果 prepayData 是字符串类型,直接返回 @@ -140,3 +171,21 @@ func (l *PaymentLogic) Payment(req *types.PaymentReq) (resp *types.PaymentResp, return &types.PaymentResp{PrepayData: prepayData, OrderID: orderID}, nil } } +func (l *PaymentLogic) agentParsing(agentIdentifier string) (*types.AgentIdentifier, error) { + key, decodeErr := hex.DecodeString("8e3e7a2f60edb49221e953b9c029ed10") + if decodeErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取AES密钥失败: %+v", decodeErr) + } + // Encrypt the params + + encrypted, err := crypto.AesDecryptURL(agentIdentifier, key) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, %v", err) + } + var agentIdentifierStruct types.AgentIdentifier + err = json.Unmarshal(encrypted, &agentIdentifierStruct) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务,反序列化失败 %v", err) + } + return &agentIdentifierStruct, nil +} diff --git a/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go b/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go index 45e77c2..5db5b4b 100644 --- a/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go +++ b/app/user/cmd/api/internal/logic/pay/wechatpaycallbacklogic.go @@ -28,7 +28,7 @@ func NewWechatPayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) func (l *WechatPayCallbackLogic) WechatPayCallback(w http.ResponseWriter, r *http.Request) error { notification, err := l.svcCtx.WechatPayService.HandleWechatPayNotification(l.ctx, r) if err != nil { - logx.Errorf("微信支付回调,%+v", err) + logx.Errorf("微信支付回调,%v", err) return nil } order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo) diff --git a/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go b/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go index 66d8ac3..3cd8125 100644 --- a/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go +++ b/app/user/cmd/api/internal/logic/pay/wechatpayrefundcallbacklogic.go @@ -25,7 +25,7 @@ func NewWechatPayRefundCallbackLogic(ctx context.Context, svcCtx *svc.ServiceCon func (l *WechatPayRefundCallbackLogic) WechatPayRefundCallback(w http.ResponseWriter, r *http.Request) error { notification, err := l.svcCtx.WechatPayService.HandleRefundNotification(l.ctx, r) if err != nil { - logx.Errorf("微信退款回调,%+v", err) + logx.Errorf("微信退款回调,%v", err) return nil } order, findOrderErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *notification.OutTradeNo) diff --git a/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go b/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go index 41fc5df..9659fee 100644 --- a/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go +++ b/app/user/cmd/api/internal/logic/product/getproductbyenlogic.go @@ -32,7 +32,7 @@ func NewGetProductByEnLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Ge func (l *GetProductByEnLogic) GetProductByEn(req *types.GetProductByEnRequest) (resp *types.ProductResponse, err error) { productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.ProductEn) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品错误: %v", err) } build := l.svcCtx.ProductFeatureModel.SelectBuilder().Where(squirrel.Eq{ @@ -40,12 +40,12 @@ func (l *GetProductByEnLogic) GetProductByEn(req *types.GetProductByEnRequest) ( }) productFeatureAll, err := l.svcCtx.ProductFeatureModel.FindAll(l.ctx, build, "") if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品关联错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "产品查询, 查找产品关联错误: %v", err) } var product types.Product err = copier.Copy(&product, productModel) 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) } mr.MapReduceVoid(func(source chan<- interface{}) { for _, productFeature := range productFeatureAll { diff --git a/app/user/cmd/api/internal/logic/query/backgroundchecklogic.go b/app/user/cmd/api/internal/logic/query/backgroundchecklogic.go deleted file mode 100644 index 77f37a3..0000000 --- a/app/user/cmd/api/internal/logic/query/backgroundchecklogic.go +++ /dev/null @@ -1,140 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type BackgroundCheckLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewBackgroundCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *BackgroundCheckLogic { - return &BackgroundCheckLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *BackgroundCheckLogic) BackgroundCheck(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.BackgroundCheckReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "人事背调, 参数不正确: %+v", validatorErr) - } - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "backgroundcheck", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "人事背调, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "人事背调, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "人事背调, 验证码不正确: %s", data.Mobile) - } - - // 3、二要素三要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "人事背调, 二要素验证不通过: %+v", err) - //} - // 3、二要素三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "人事背调, 三要素验证不通过: %+v", err) - } - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "backgroundcheck", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "人事背调, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/companyinfologic.go b/app/user/cmd/api/internal/logic/query/companyinfologic.go deleted file mode 100644 index 4d1f3e7..0000000 --- a/app/user/cmd/api/internal/logic/query/companyinfologic.go +++ /dev/null @@ -1,140 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type CompanyInfoLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewCompanyInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CompanyInfoLogic { - return &CompanyInfoLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *CompanyInfoLogic) CompanyInfo(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.CompanyInfoReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "企业报告, 参数不正确: %+v", validatorErr) - } - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "companyinfo", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "企业报告, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "企业报告, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "企业报告, 验证码不正确: %s", data.Mobile) - } - - // 3、二要素三要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "企业报告, 二要素验证不通过: %+v", err) - //} - // 3、二要素三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "企业报告, 三要素验证不通过: %+v", err) - } - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "companyinfo", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "企业报告, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/homeservicelogic.go b/app/user/cmd/api/internal/logic/query/homeservicelogic.go deleted file mode 100644 index 9e81f86..0000000 --- a/app/user/cmd/api/internal/logic/query/homeservicelogic.go +++ /dev/null @@ -1,141 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type HomeServiceLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewHomeServiceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *HomeServiceLogic { - return &HomeServiceLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *HomeServiceLogic) HomeService(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.HomeServiceReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "家政服务, 参数不正确: %+v", validatorErr) - } - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "homeservice", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "家政服务, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "家政服务, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "家政服务, 验证码不正确: %s", data.Mobile) - } - - // 3、二要素三要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "家政服务, 二要素验证不通过: %+v", err) - //} - // 3、二要素三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "家政服务, 三要素验证不通过: %+v", err) - } - - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "homeservice", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "家政服务, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/marriagelogic.go b/app/user/cmd/api/internal/logic/query/marriagelogic.go deleted file mode 100644 index 751ee83..0000000 --- a/app/user/cmd/api/internal/logic/query/marriagelogic.go +++ /dev/null @@ -1,142 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/logx" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" -) - -type MarriageLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewMarriageLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MarriageLogic { - return &MarriageLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -const MERRIAGE = "marriage" - -func (l *MarriageLogic) Marriage(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.MarriageReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "婚恋评估, 参数不正确: %+v", validatorErr) - } - - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: MERRIAGE, - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "婚恋评估, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "婚恋评估, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "婚恋评估, 验证码不正确: %s", data.Mobile) - } - - //// 3、二要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "婚恋评估, 二要素验证不通过: %+v", err) - //} - // 3、三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "婚恋评估, 三要素验证不通过: %+v", err) - } - - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: MERRIAGE, - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/preloanbackgroundchecklogic.go b/app/user/cmd/api/internal/logic/query/preloanbackgroundchecklogic.go deleted file mode 100644 index 5cb0aa8..0000000 --- a/app/user/cmd/api/internal/logic/query/preloanbackgroundchecklogic.go +++ /dev/null @@ -1,140 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type PreLoanBackgroundCheckLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewPreLoanBackgroundCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PreLoanBackgroundCheckLogic { - return &PreLoanBackgroundCheckLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *PreLoanBackgroundCheckLogic) PreLoanBackgroundCheck(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.PreLoanBackgroundCheckReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "贷前背调, 参数不正确: %+v", validatorErr) - } - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "preloanbackgroundcheck", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "贷前背调, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "贷前背调, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "贷前背调, 验证码不正确: %s", data.Mobile) - } - - // 3、二要素三要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "贷前背调, 二要素验证不通过: %+v", err) - //} - // 3、二要素三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "贷前背调, 三要素验证不通过: %+v", err) - } - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "preloanbackgroundcheck", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "贷前背调, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go b/app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go index cf1ddac..df5afd6 100644 --- a/app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go +++ b/app/user/cmd/api/internal/logic/query/querydetailbyorderidlogic.go @@ -38,13 +38,13 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB // 获取订单信息 order, err := l.svcCtx.OrderModel.FindOne(l.ctx, req.OrderId) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } // 创建渐进式延迟策略实例 progressiveDelayOrder, err := delay.New(200*time.Millisecond, 3*time.Second, 10*time.Second, 1.5) 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) } // 等待订单状态变为 "paid" @@ -63,7 +63,7 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB // 再次查找订单 order, err = l.svcCtx.OrderModel.FindOne(l.ctx, req.OrderId) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找订单错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找订单错误: %v", err) } } if order.Status != "paid" { @@ -72,13 +72,13 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB // 获取报告信息 queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, req.OrderId) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } // 创建渐进式延迟实例 progressiveDelayQuery, err := delay.New(200*time.Millisecond, 3*time.Second, 10*time.Second, 1.5) 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) } // 等待 queryModel.QueryState 不再是 "pending" @@ -97,7 +97,7 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB // 再次查询 report 状态 queryModel, err = l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, req.OrderId) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } } @@ -114,7 +114,7 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", err) } processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) if processParamsErr != nil { @@ -131,11 +131,11 @@ func (l *QueryDetailByOrderIdLogic) QueryDetailByOrderId(req *types.QueryDetailB // 复制报告数据 err = copier.Copy(&query, queryModel) 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) } 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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) } query.ProductName = product.ProductName return &types.QueryDetailByOrderIdResp{ diff --git a/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go b/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go index 35dac9f..82d91db 100644 --- a/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go +++ b/app/user/cmd/api/internal/logic/query/querydetailbyordernologic.go @@ -34,13 +34,13 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB // 获取订单信息 order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } // 创建渐进式延迟策略实例 progressiveDelayOrder, err := delay.New(200*time.Millisecond, 3*time.Second, 10*time.Second, 1.5) 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) } // 等待订单状态变为 "paid" @@ -59,7 +59,7 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB // 再次查找订单 order, err = l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找订单错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找订单错误: %v", err) } } if order.Status != "paid" { @@ -68,13 +68,13 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB // 获取报告信息 queryModel, err := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, order.Id) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } // 创建渐进式延迟实例 progressiveDelayQuery, err := delay.New(200*time.Millisecond, 3*time.Second, 10*time.Second, 1.5) 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) } // 等待 queryModel.QueryState 不再是 "pending" @@ -93,7 +93,7 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB // 再次查询 report 状态 queryModel, err = l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, order.Id) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } } @@ -110,7 +110,7 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", err) } processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) if processParamsErr != nil { @@ -127,11 +127,11 @@ func (l *QueryDetailByOrderNoLogic) QueryDetailByOrderNo(req *types.QueryDetailB // 复制报告数据 err = copier.Copy(&query, queryModel) 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) } 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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) } query.ProductName = product.ProductName return &types.QueryDetailByOrderNoResp{ diff --git a/app/user/cmd/api/internal/logic/query/querydetaillogic.go b/app/user/cmd/api/internal/logic/query/querydetaillogic.go index 352bc9e..1f52b8e 100644 --- a/app/user/cmd/api/internal/logic/query/querydetaillogic.go +++ b/app/user/cmd/api/internal/logic/query/querydetaillogic.go @@ -33,7 +33,7 @@ func NewQueryDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Query func (l *QueryDetailLogic) QueryDetail(req *types.QueryDetailReq) (resp *types.QueryDetailResp, err error) { queryModel, err := l.svcCtx.QueryModel.FindOne(l.ctx, req.Id) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询, 查找报告错误: %v", err) } var query types.Query @@ -42,7 +42,7 @@ func (l *QueryDetailLogic) QueryDetail(req *types.QueryDetailReq) (resp *types.Q secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取AES解密解药失败, %v", err) } if lzUtils.NullStringToString(queryModel.QueryData) != "" { queryData, decryptErr := crypto.AesDecrypt(lzUtils.NullStringToString(queryModel.QueryData), key) @@ -56,11 +56,11 @@ func (l *QueryDetailLogic) QueryDetail(req *types.QueryDetailReq) (resp *types.Q } err = copier.Copy(&query, queryModel) 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) } 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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告查询, 获取商品信息失败, %v", err) } query.ProductName = product.ProductName return &types.QueryDetailResp{ diff --git a/app/user/cmd/api/internal/logic/query/queryexamplelogic.go b/app/user/cmd/api/internal/logic/query/queryexamplelogic.go index 567adfa..2462a03 100644 --- a/app/user/cmd/api/internal/logic/query/queryexamplelogic.go +++ b/app/user/cmd/api/internal/logic/query/queryexamplelogic.go @@ -60,7 +60,7 @@ func (l *QueryExampleLogic) QueryExample(req *types.QueryExampleReq) (resp *type secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取AES解密解药失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取AES解密解药失败, %v", err) } processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) if processParamsErr != nil { @@ -77,11 +77,11 @@ func (l *QueryExampleLogic) QueryExample(req *types.QueryExampleReq) (resp *type // 复制报告数据 err = copier.Copy(&query, queryModel) 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) } 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) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取商品信息失败, %v", err) } query.ProductName = product.ProductName return &types.QueryExampleResp{ diff --git a/app/user/cmd/api/internal/logic/query/querylistlogic.go b/app/user/cmd/api/internal/logic/query/querylistlogic.go index b2e7704..8112bac 100644 --- a/app/user/cmd/api/internal/logic/query/querylistlogic.go +++ b/app/user/cmd/api/internal/logic/query/querylistlogic.go @@ -38,7 +38,7 @@ func (l *QueryListLogic) QueryList(req *types.QueryListReq) (resp *types.QueryLi }) orderList, total, err := l.svcCtx.OrderModel.FindPageListByPageWithTotal(l.ctx, build, req.Page, req.PageSize, "create_time DESC") if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告列表查询, 查找订单列表错误, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告列表查询, 查找订单列表错误, %v", err) } var list []types.Query @@ -54,11 +54,11 @@ func (l *QueryListLogic) QueryList(req *types.QueryListReq) (resp *types.QueryLi query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") copyErr := copier.Copy(&query, queryModel) if copyErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告列表查询, 报告结构体复制失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告列表查询, 报告结构体复制失败, %v", err) } product, findProductErr := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) if findProductErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告列表查询, 获取商品信息失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "报告列表查询, 获取商品信息失败, %v", err) } query.ProductName = product.ProductName list = append(list, query) diff --git a/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go b/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go index a20aa64..4d3fe1a 100644 --- a/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go +++ b/app/user/cmd/api/internal/logic/query/queryprovisionalorderlogic.go @@ -41,17 +41,17 @@ func (l *QueryProvisionalOrderLogic) QueryProvisionalOrder(req *types.QueryProvi var data types.QueryCache err = json.Unmarshal([]byte(cache), &data) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 解析缓存内容失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 解析缓存内容失败, %v", err) } productModel, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, data.Product) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 查找产品错误: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 查找产品错误: %v", err) } var product types.Product err = copier.Copy(&product, productModel) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 用户信息结构体复制失败: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取临时订单, 用户信息结构体复制失败: %v", err) } return &types.QueryProvisionalOrderResp{ Name: data.Name, diff --git a/app/user/cmd/api/internal/logic/query/queryretrylogic.go b/app/user/cmd/api/internal/logic/query/queryretrylogic.go index 8500ef4..a946d8e 100644 --- a/app/user/cmd/api/internal/logic/query/queryretrylogic.go +++ b/app/user/cmd/api/internal/logic/query/queryretrylogic.go @@ -29,7 +29,7 @@ func (l *QueryRetryLogic) QueryRetry(req *types.QueryRetryReq) (resp *types.Quer query, err := l.svcCtx.QueryModel.FindOne(l.ctx, req.Id) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询重试, 查找报告失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "报告查询重试, 查找报告失败, %v", err) } if query.QueryState == "success" { return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.LOGIN_FAILED, "该报告不能重试"), "报告查询重试, 该报告不能重试, %d", query.Id) diff --git a/app/user/cmd/api/internal/logic/query/queryserviceagentlogic.go b/app/user/cmd/api/internal/logic/query/queryserviceagentlogic.go new file mode 100644 index 0000000..8d8e652 --- /dev/null +++ b/app/user/cmd/api/internal/logic/query/queryserviceagentlogic.go @@ -0,0 +1,27 @@ +package query + +import ( + "context" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type QueryServiceAgentLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewQueryServiceAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryServiceAgentLogic { + return &QueryServiceAgentLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *QueryServiceAgentLogic) QueryServiceAgent(req *types.QueryServiceReq) (resp *types.QueryServiceResp, err error) { + return &types.QueryServiceResp{}, nil +} diff --git a/app/user/cmd/api/internal/logic/query/queryservicelogic.go b/app/user/cmd/api/internal/logic/query/queryservicelogic.go index a267ac8..884756d 100644 --- a/app/user/cmd/api/internal/logic/query/queryservicelogic.go +++ b/app/user/cmd/api/internal/logic/query/queryservicelogic.go @@ -7,9 +7,12 @@ import ( "fmt" "github.com/pkg/errors" "github.com/zeromicro/go-zero/core/stores/redis" + "github.com/zeromicro/go-zero/core/stores/sqlx" "time" "tydata-server/app/user/cmd/api/internal/service" + "tydata-server/app/user/model" "tydata-server/common/ctxdata" + jwtx "tydata-server/common/jwt" "tydata-server/common/xerr" "tydata-server/pkg/lzkit/crypto" "tydata-server/pkg/lzkit/validator" @@ -35,9 +38,32 @@ func NewQueryServiceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Quer } func (l *QueryServiceLogic) QueryService(req *types.QueryServiceReq) (resp *types.QueryServiceResp, err error) { + if req.AgentIdentifier != "" { + l.ctx = context.WithValue(l.ctx, "agentIdentifier", req.AgentIdentifier) + return l.PreprocessLogic(req, req.Product) + } return l.PreprocessLogic(req, req.Product) } +//func (l *QueryServiceLogic) agentParsing(req *types.QueryServiceReq) (*types.AgentIdentifier, error) { +// key, decodeErr := hex.DecodeString("8e3e7a2f60edb49221e953b9c029ed10") +// if decodeErr != nil { +// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取AES密钥失败: %+v", decodeErr) +// } +// +// encrypted, err := crypto.AesDecryptURL(req.Product, key) +// if err != nil { +// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, %v", err) +// } +// var agentIdentifier types.AgentIdentifier +// err = json.Unmarshal(encrypted, &agentIdentifier) +// if err != nil { +// return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务,反序列化失败 %v", err) +// } +// l.ctx = context.WithValue(l.ctx, "agent", req.Agent) +// return &agentIdentifier, nil +//} + var productProcessors = map[string]func(*QueryServiceLogic, *types.QueryServiceReq) (*types.QueryServiceResp, error){ "marriage": (*QueryServiceLogic).ProcessMarriageLogic, "homeservice": (*QueryServiceLogic).ProcessHomeServiceLogic, @@ -72,10 +98,6 @@ func (l *QueryServiceLogic) PreprocessLogic(req *types.QueryServiceReq, product return nil, errors.New("未找到相应的处理程序") } func (l *QueryServiceLogic) ProcessMarriageLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) @@ -111,21 +133,31 @@ func (l *QueryServiceLogic) ProcessMarriageLogic(req *types.QueryServiceReq) (*t "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %v", err) + } cacheNo, cacheDataErr := l.CacheData(params, "marriage", userID) if cacheDataErr != nil { return nil, cacheDataErr } + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } - return &types.QueryServiceResp{Id: cacheNo}, nil + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } // 处理家政服务相关逻辑 - func (l *QueryServiceLogic) ProcessHomeServiceLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) @@ -161,20 +193,32 @@ func (l *QueryServiceLogic) ProcessHomeServiceLogic(req *types.QueryServiceReq) "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + 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 } - return &types.QueryServiceResp{Id: cacheNo}, nil + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } // 处理风险评估相关逻辑 func (l *QueryServiceLogic) ProcessRiskAssessmentLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) @@ -210,21 +254,32 @@ func (l *QueryServiceLogic) ProcessRiskAssessmentLogic(req *types.QueryServiceRe "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + 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 } - return &types.QueryServiceResp{Id: cacheNo}, nil + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } // 处理公司信息查询相关逻辑 func (l *QueryServiceLogic) ProcessCompanyInfoLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) if DecryptDataErr != nil { @@ -259,20 +314,32 @@ func (l *QueryServiceLogic) ProcessCompanyInfoLogic(req *types.QueryServiceReq) "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + 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 } - return &types.QueryServiceResp{Id: cacheNo}, nil + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } // 处理租赁信息查询相关逻辑 func (l *QueryServiceLogic) ProcessRentalInfoLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) @@ -308,20 +375,32 @@ func (l *QueryServiceLogic) ProcessRentalInfoLogic(req *types.QueryServiceReq) ( "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + 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 } - return &types.QueryServiceResp{Id: cacheNo}, nil + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } // 处理贷前背景检查相关逻辑 func (l *QueryServiceLogic) ProcessPreLoanBackgroundCheckLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) @@ -357,21 +436,32 @@ func (l *QueryServiceLogic) ProcessPreLoanBackgroundCheckLogic(req *types.QueryS "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + 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 } - return &types.QueryServiceResp{Id: cacheNo}, nil + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } // 处理人事背调相关逻辑 func (l *QueryServiceLogic) ProcessBackgroundCheckLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) - } - // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) if DecryptDataErr != nil { @@ -389,16 +479,16 @@ func (l *QueryServiceLogic) ProcessBackgroundCheckLogic(req *types.QueryServiceR } // 校验验证码 - verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) - if verifyCodeErr != nil { - return nil, verifyCodeErr - } - - // 校验三要素 - verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) - if verifyErr != nil { - return nil, verifyErr - } + //verifyCodeErr := l.VerifyCode(data.Mobile, data.Code) + //if verifyCodeErr != nil { + // return nil, verifyCodeErr + //} + // + //// 校验三要素 + //verifyErr := l.Verify(data.Name, data.IDCard, data.Mobile) + //if verifyErr != nil { + // return nil, verifyErr + //} // 缓存 params := map[string]interface{}{ @@ -406,12 +496,28 @@ func (l *QueryServiceLogic) ProcessBackgroundCheckLogic(req *types.QueryServiceR "id_card": data.IDCard, "mobile": data.Mobile, } + userID, err := l.GetOrCreateUser(data.Mobile) + 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 } - return &types.QueryServiceResp{Id: cacheNo}, nil + token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 生成token失败 : %d", userID) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.QueryServiceResp{ + Id: cacheNo, + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil } func (l *QueryServiceLogic) ProcessTocMarriageLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { @@ -652,7 +758,7 @@ func (l *QueryServiceLogic) ProcessTocPhoneThreeElementsLogic(req *types.QuerySe // AES解密 decryptData, DecryptDataErr := l.DecryptData(req.Data) if DecryptDataErr != nil { - return nil, DecryptDataErr + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后失败: %+v", DecryptDataErr) } // 校验参数 @@ -1096,7 +1202,23 @@ func (l *QueryServiceLogic) VerifyCode(mobile string, code string) error { // 二、三要素验证 func (l *QueryServiceLogic) Verify(Name string, IDCard string, Mobile string) error { - if l.svcCtx.Config.SystemConfig.ThreeVerify { + agent, ok := l.ctx.Value("agent").(bool) + if !ok { + agent = false + } + if !l.svcCtx.Config.SystemConfig.ThreeVerify || agent { + twoVerification := service.TwoFactorVerificationRequest{ + Name: Name, + IDCard: IDCard, + } + verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) + if err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "二要素验证失败: %v", err) + } + if !verification.Passed { + return errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "二要素验证不通过: %v", err) + } + } else { // 三要素验证 threeVerification := service.ThreeFactorVerificationRequest{ Name: Name, @@ -1105,22 +1227,10 @@ func (l *QueryServiceLogic) Verify(Name string, IDCard string, Mobile string) er } verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "三要素验证失败: %+v", err) + return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "三要素验证失败: %v", err) } if !verification.Passed { - return errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "三要素验证不通过: %+v", err) - } - } else { - twoVerification := service.TwoFactorVerificationRequest{ - Name: Name, - IDCard: IDCard, - } - verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "二要素验证失败: %+v", err) - } - if !verification.Passed { - return errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "二要素验证不通过: %+v", err) + return errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "三要素验证不通过: %v", err) } } return nil @@ -1128,9 +1238,11 @@ 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) { + agentIdentifier, _ := l.ctx.Value("agentIdentifier").(string) queryCache := types.QueryCacheLoad{ - Params: params, - Product: Product, + Params: params, + Product: Product, + AgentIdentifier: agentIdentifier, } jsonData, marshalErr := json.Marshal(queryCache) if marshalErr != nil { @@ -1144,3 +1256,51 @@ func (l *QueryServiceLogic) CacheData(params map[string]interface{}, Product str } return outTradeNo, nil } + +func (l *QueryServiceLogic) GetOrCreateUser(mobile string) (int64, error) { + agentIdentifier, ok := l.ctx.Value("agentIdentifier").(string) + if !ok || agentIdentifier == "" { + // 不是代理查询 + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return 0, getUidErr + } + return userID, nil + } + + userModel, err := l.svcCtx.UserModel.FindOneByMobile(l.ctx, mobile) + if err != nil && !errors.Is(err, model.ErrNotFound) { + return 0, err + } + // 没有则创建账号 + if userModel == nil { + userModel = &model.User{Mobile: mobile} + if len(userModel.Nickname) == 0 { + userModel.Nickname = mobile + } + if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, userModel) + if userInsertErr != nil { + return userInsertErr + } + lastId, lastInsertIdErr := insertResult.LastInsertId() + if lastInsertIdErr != nil { + return lastInsertIdErr + } + userModel.Id = lastId + + userAuth := new(model.UserAuth) + userAuth.UserId = lastId + userAuth.AuthKey = mobile + userAuth.AuthType = model.UserAuthTypeAgentPromote + if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil { + return userAuthInsertErr + } + + return nil + }); transErr != nil { + return 0, transErr + } + } + return userModel.Id, nil +} diff --git a/app/user/cmd/api/internal/logic/query/rentalinfologic.go b/app/user/cmd/api/internal/logic/query/rentalinfologic.go deleted file mode 100644 index 0695750..0000000 --- a/app/user/cmd/api/internal/logic/query/rentalinfologic.go +++ /dev/null @@ -1,140 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type RentalInfoLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewRentalInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RentalInfoLogic { - return &RentalInfoLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *RentalInfoLogic) RentalInfo(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.RentalInfoReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "租赁服务, 参数不正确: %+v", validatorErr) - } - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "rentalinfo", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "租赁服务, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "租赁服务, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "租赁服务, 验证码不正确: %s", data.Mobile) - } - - // 3、二要素三要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "租赁服务, 二要素验证不通过: %+v", err) - //} - // 3、二要素三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "租赁服务, 三要素验证不通过: %+v", err) - } - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "rentalinfo", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "租赁服务, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/query/riskassessmentlogic.go b/app/user/cmd/api/internal/logic/query/riskassessmentlogic.go deleted file mode 100644 index 8390b78..0000000 --- a/app/user/cmd/api/internal/logic/query/riskassessmentlogic.go +++ /dev/null @@ -1,140 +0,0 @@ -package query - -import ( - "context" - "encoding/hex" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" - "time" - "tydata-server/app/user/cmd/api/internal/service" - "tydata-server/common/ctxdata" - "tydata-server/common/xerr" - "tydata-server/pkg/lzkit/crypto" - "tydata-server/pkg/lzkit/validator" - - "tydata-server/app/user/cmd/api/internal/svc" - "tydata-server/app/user/cmd/api/internal/types" - - "github.com/zeromicro/go-zero/core/logx" -) - -type RiskAssessmentLogic struct { - logx.Logger - ctx context.Context - svcCtx *svc.ServiceContext -} - -func NewRiskAssessmentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RiskAssessmentLogic { - return &RiskAssessmentLogic{ - Logger: logx.WithContext(ctx), - ctx: ctx, - svcCtx: svcCtx, - } -} - -func (l *RiskAssessmentLogic) RiskAssessment(req *types.QueryReq) (resp *types.QueryResp, err error) { - userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) - if getUidErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 获取用户信息失败, %+v", getUidErr) - } - // 1、AES解密 - secretKey := l.svcCtx.Config.Encrypt.SecretKey - key, decodeErr := hex.DecodeString(secretKey) - if decodeErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 密钥获取失败: %+v", decodeErr) - } - decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key) - if aesDecryptErr != nil || len(decryptData) == 0 { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 解密失败: %+v", decodeErr) - } - - // 2、校验 - var data types.RiskAssessmentReq - if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 解密后的数据格式不正确: %+v", unmarshalErr) - } - - if validatorErr := validator.Validate(data); validatorErr != nil { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "个人风险, 参数不正确: %+v", validatorErr) - } - if data.Name == "刘福思" && data.IDCard == "45262419980929047X" && data.Mobile == "17776203797" { - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "riskassessment", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "婚恋评估, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil - } - // 校验验证码 - codeRedisKey := fmt.Sprintf("%s:%s", "query", data.Mobile) - cacheCode, err := l.svcCtx.Redis.Get(codeRedisKey) - if err != nil { - if errors.Is(err, redis.Nil) { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "个人风险, 验证码过期: %s", data.Mobile) - } - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "个人风险, 读取验证码redis缓存失败, mobile: %s, err: %+v", data.Mobile, err) - } - if cacheCode != data.Code { - return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "个人风险, 验证码不正确: %s", data.Mobile) - } - - // 3、二要素三要素核验 - //twoVerification := service.TwoFactorVerificationRequest{ - // Name: data.Name, - // IDCard: data.IDCard, - //} - //verification, err := l.svcCtx.VerificationService.TwoFactorVerification(twoVerification) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 二要素验证失败: %+v", err) - //} - //if !verification.Passed { - // return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "个人风险, 二要素验证不通过: %+v", err) - //} - // 3、二要素三要素核验 - threeVerification := service.ThreeFactorVerificationRequest{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - } - verification, err := l.svcCtx.VerificationService.ThreeFactorVerification(threeVerification) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 三要素验证失败: %+v", err) - } - if !verification.Passed { - return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.SERVER_COMMON_ERROR, verification.Err.Error()), "个人风险, 三要素验证不通过: %+v", err) - } - // 缓存 - queryCache := types.QueryCache{ - Name: data.Name, - IDCard: data.IDCard, - Mobile: data.Mobile, - Product: "riskassessment", - } - jsonData, marshalErr := json.Marshal(queryCache) - if marshalErr != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "个人风险, 序列化参数失败: %+v", marshalErr) - } - outTradeNo := l.svcCtx.WechatPayService.GenerateOutTradeNo() - redisKey := fmt.Sprintf("%d:%s", userID, outTradeNo) - cacheErr := l.svcCtx.Redis.SetexCtx(l.ctx, redisKey, string(jsonData), int(2*time.Hour)) - if cacheErr != nil { - return nil, cacheErr - } - - return &types.QueryResp{Id: outTradeNo}, nil -} diff --git a/app/user/cmd/api/internal/logic/user/agentmobilecodeloginlogic.go b/app/user/cmd/api/internal/logic/user/agentmobilecodeloginlogic.go new file mode 100644 index 0000000..862cb92 --- /dev/null +++ b/app/user/cmd/api/internal/logic/user/agentmobilecodeloginlogic.go @@ -0,0 +1,91 @@ +package user + +import ( + "context" + "fmt" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/redis" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "time" + "tydata-server/app/user/cmd/api/internal/svc" + "tydata-server/app/user/cmd/api/internal/types" + "tydata-server/app/user/model" + jwtx "tydata-server/common/jwt" + "tydata-server/common/xerr" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AgentMobileCodeLoginLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewAgentMobileCodeLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AgentMobileCodeLoginLogic { + return &AgentMobileCodeLoginLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *AgentMobileCodeLoginLogic) AgentMobileCodeLogin(req *types.MobileCodeLoginReq) (resp *types.MobileCodeLoginResp, err error) { + // 检查手机号是否在一分钟内已发送过验证码 + redisKey := fmt.Sprintf("%s:%s", "query", req.Mobile) + cacheCode, err := l.svcCtx.Redis.Get(redisKey) + if err != nil { + if errors.Is(err, redis.Nil) { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码已过期"), "手机登录, 验证码过期: %s", req.Mobile) + } + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取验证码redis缓存失败, mobile: %s, err: %+v", req.Mobile, err) + } + if cacheCode != req.Code { + return nil, errors.Wrapf(xerr.NewErrMsg("验证码不正确"), "手机登录, 验证码不正确: %s", req.Mobile) + } + + user, findUserErr := l.svcCtx.UserModel.FindOneByMobile(l.ctx, req.Mobile) + if findUserErr != nil && findUserErr != model.ErrNotFound { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机登录, 读取数据库获取用户失败, mobile: %s, err: %+v", req.Mobile, err) + } + if user == nil { + user = &model.User{Mobile: req.Mobile} + if len(user.Nickname) == 0 { + user.Nickname = req.Mobile + } + if transErr := l.svcCtx.UserModel.Trans(l.ctx, func(ctx context.Context, session sqlx.Session) error { + insertResult, userInsertErr := l.svcCtx.UserModel.Insert(ctx, session, user) + if userInsertErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入新用户失败, mobile%s, err: %+v", req.Mobile, err) + } + lastId, lastInsertIdErr := insertResult.LastInsertId() + if lastInsertIdErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 获取新用户ID失败, err:%+v, user:%+v", lastInsertIdErr, user) + } + user.Id = lastId + + userAuth := new(model.UserAuth) + userAuth.UserId = lastId + userAuth.AuthKey = req.Mobile + userAuth.AuthType = model.UserAuthTypeH5Mobile + if _, userAuthInsertErr := l.svcCtx.UserAuthModel.Insert(ctx, session, userAuth); userAuthInsertErr != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "手机注册, 数据库插入用户认证失败, err:%+v", userAuthInsertErr) + } + return nil + }); transErr != nil { + return nil, transErr + } + } + token, generaErr := jwtx.GenerateJwtToken(user.Id, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) + if generaErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "手机登录, 生成token失败 : %d", user.Id) + } + + // 获取当前时间戳 + now := time.Now().Unix() + return &types.MobileCodeLoginResp{ + AccessToken: token, + AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, + RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, + }, nil +} diff --git a/app/user/cmd/api/internal/logic/user/detaillogic.go b/app/user/cmd/api/internal/logic/user/detaillogic.go index 618628e..5ce405d 100644 --- a/app/user/cmd/api/internal/logic/user/detaillogic.go +++ b/app/user/cmd/api/internal/logic/user/detaillogic.go @@ -29,16 +29,16 @@ func NewDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DetailLogi func (l *DetailLogic) Detail() (resp *types.UserInfoResp, err error) { userID, err := ctxdata.GetUidFromCtx(l.ctx) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, %v", err) } user, err := l.svcCtx.UserModel.FindOne(l.ctx, userID) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户信息, 数据库查询用户信息失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "用户信息, 数据库查询用户信息失败, %v", err) } var userInfo types.User err = copier.Copy(&userInfo, user) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, 用户信息结构体复制失败, %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, 用户信息结构体复制失败, %v", err) } return &types.UserInfoResp{ UserInfo: userInfo, diff --git a/app/user/cmd/api/internal/logic/user/gettokenlogic.go b/app/user/cmd/api/internal/logic/user/gettokenlogic.go index 1e8b7d3..2532925 100644 --- a/app/user/cmd/api/internal/logic/user/gettokenlogic.go +++ b/app/user/cmd/api/internal/logic/user/gettokenlogic.go @@ -31,7 +31,7 @@ func NewGetTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetToken func (l *GetTokenLogic) GetToken() (resp *types.MobileCodeLoginResp, err error) { userID, err := ctxdata.GetUidFromCtx(l.ctx) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "用户信息, %+v", err) + return nil, errors.Wrapf(xerr.NewErrMsg(""), "用户信息, %v", err) } token, generaErr := jwtx.GenerateJwtToken(userID, l.svcCtx.Config.JwtAuth.AccessSecret, l.svcCtx.Config.JwtAuth.AccessExpire) if generaErr != nil { @@ -44,5 +44,4 @@ func (l *GetTokenLogic) GetToken() (resp *types.MobileCodeLoginResp, err error) AccessExpire: now + l.svcCtx.Config.JwtAuth.AccessExpire, RefreshAfter: now + l.svcCtx.Config.JwtAuth.RefreshAfter, }, nil - } diff --git a/app/user/cmd/api/internal/logic/user/wxh5authlogic.go b/app/user/cmd/api/internal/logic/user/wxh5authlogic.go index 177ba44..8c6ed75 100644 --- a/app/user/cmd/api/internal/logic/user/wxh5authlogic.go +++ b/app/user/cmd/api/internal/logic/user/wxh5authlogic.go @@ -37,7 +37,7 @@ func (l *WxH5AuthLogic) WxH5Auth(req *types.WXH5AuthReq) (resp *types.WXH5AuthRe // Step 1: 使用code获取access_token accessTokenResp, err := GetAccessToken(req.Code) if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取access_token失败: %+v", err) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取access_token失败: %v", err) } // Step 2: 查找用户授权信息 diff --git a/app/user/cmd/api/internal/queue/paySuccessNotify.go b/app/user/cmd/api/internal/queue/paySuccessNotify.go index 5edbfc0..827d863 100644 --- a/app/user/cmd/api/internal/queue/paySuccessNotify.go +++ b/app/user/cmd/api/internal/queue/paySuccessNotify.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" + "os" "tydata-server/app/user/cmd/api/internal/svc" "tydata-server/app/user/model" "tydata-server/pkg/lzkit/crypto" @@ -37,7 +38,9 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. if err != nil { return fmt.Errorf("无效的订单ID: %d, %v", payload.OrderID, err) } - if order.Status != "paid" { + // + env := os.Getenv("ENV") + if order.Status != "paid" && env != "development" { err = fmt.Errorf("无效的订单: %d", payload.OrderID) logx.Errorf("处理任务失败,原因: %v", err) return asynq.SkipRetry @@ -58,6 +61,7 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. logx.Errorf("处理任务失败,原因: %v", err) return asynq.SkipRetry } + secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) if decodeErr != nil { @@ -95,6 +99,11 @@ func (l *PaySuccessNotifyUserHandler) ProcessTask(ctx context.Context, t *asynq. return l.handleError(ctx, updateQueryErr, order, query) } + err = l.svcCtx.AgentService.AgentProcess(ctx, order) + if err != nil { + return l.handleError(ctx, err, order, query) + } + return nil } diff --git a/app/user/cmd/api/internal/service/agentService.go b/app/user/cmd/api/internal/service/agentService.go new file mode 100644 index 0000000..02e8434 --- /dev/null +++ b/app/user/cmd/api/internal/service/agentService.go @@ -0,0 +1,335 @@ +package service + +import ( + "context" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "tydata-server/app/user/cmd/api/internal/config" + "tydata-server/app/user/model" + "tydata-server/pkg/lzkit/lzUtils" +) + +type AgentService struct { + config config.Config + AgentModel model.AgentModel + AgentAuditModel model.AgentAuditModel + AgentClosureModel model.AgentClosureModel + AgentCommissionModel model.AgentCommissionModel + AgentCommissionDeductionModel model.AgentCommissionDeductionModel + AgentWalletModel model.AgentWalletModel + AgentLinkModel model.AgentLinkModel + AgentOrderModel model.AgentOrderModel + AgentRewardsModel model.AgentRewardsModel + AgentMembershipConfigModel model.AgentMembershipConfigModel + AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel + AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel + AgentProductConfigModel model.AgentProductConfigModel + AgentPlatformDeductionModel model.AgentPlatformDeductionModel + AgentActiveStatModel model.AgentActiveStatModel + AgentWithdrawalModel model.AgentWithdrawalModel +} + +func NewAgentService(c config.Config, agentModel model.AgentModel, agentAuditModel model.AgentAuditModel, + agentClosureModel model.AgentClosureModel, agentCommissionModel model.AgentCommissionModel, + agentCommissionDeductionModel model.AgentCommissionDeductionModel, agentWalletModel model.AgentWalletModel, agentLinkModel model.AgentLinkModel, agentOrderModel model.AgentOrderModel, agentRewardsModel model.AgentRewardsModel, + agentMembershipConfigModel model.AgentMembershipConfigModel, + agentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel, + agentMembershipUserConfigModel model.AgentMembershipUserConfigModel, + agentProductConfigModel model.AgentProductConfigModel, agentPlatformDeductionModel model.AgentPlatformDeductionModel, + agentActiveStatModel model.AgentActiveStatModel, agentWithdrawalModel model.AgentWithdrawalModel) *AgentService { + + return &AgentService{ + config: c, + AgentModel: agentModel, + AgentAuditModel: agentAuditModel, + AgentClosureModel: agentClosureModel, + AgentCommissionModel: agentCommissionModel, + AgentCommissionDeductionModel: agentCommissionDeductionModel, + AgentWalletModel: agentWalletModel, + AgentLinkModel: agentLinkModel, + AgentOrderModel: agentOrderModel, + AgentRewardsModel: agentRewardsModel, + AgentMembershipConfigModel: agentMembershipConfigModel, + AgentMembershipRechargeOrderModel: agentMembershipRechargeOrderModel, + AgentMembershipUserConfigModel: agentMembershipUserConfigModel, + AgentProductConfigModel: agentProductConfigModel, + AgentPlatformDeductionModel: agentPlatformDeductionModel, + AgentActiveStatModel: agentActiveStatModel, + AgentWithdrawalModel: agentWithdrawalModel, + } +} + +// AgentProcess 推广单成功 +func (l *AgentService) AgentProcess(ctx context.Context, order *model.Order) error { + // 获取是否该订单是代理推广订单 + agentOrderModel, err := l.AgentOrderModel.FindOneByOrderId(ctx, order.Id) + if err != nil { + return err + } + // 事务 + transErr := l.AgentWalletModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error { + agentID := agentOrderModel.AgentId + agentProductConfigModel, findAgentProductConfigModelErr := l.AgentProductConfigModel.FindOneByProductId(transCtx, order.ProductId) + if findAgentProductConfigModelErr != nil { + return findAgentProductConfigModelErr + } + // 平台底价成本 + PlatformCostAmount, platformCostErr := l.PlatformCost(transCtx, agentID, agentProductConfigModel, session) + if platformCostErr != nil { + return platformCostErr + } + + // 平台提价成本 + PlatformPricingAmount, platformPricingErr := l.PlatformPricing(transCtx, agentID, order.Amount, agentProductConfigModel, session) + if platformPricingErr != nil { + return platformPricingErr + } + + // 查找上级 + AgentClosureModel, findAgentClosureModelErr := l.AgentClosureModel.FindOneByDescendantIdDepth(transCtx, agentID, 1) + if findAgentClosureModelErr != nil && !errors.Is(findAgentClosureModelErr, model.ErrNotFound) { + return findAgentClosureModelErr + } + + var descendantDeductedAmount = 0.00 + if AgentClosureModel != nil { + AncestorId := AgentClosureModel.AncestorId + AncestorModel, findAgentModelErr := l.AgentModel.FindOne(transCtx, AncestorId) + if findAgentModelErr != nil != errors.Is(findAgentModelErr, model.ErrNotFound) { + return findAgentModelErr + } + if AgentClosureModel != nil { + AgentMembershipConfigModel, findAgentMembersipConfigModelErr := l.AgentMembershipConfigModel.FindOneByLevelName(ctx, AncestorModel.LevelName) + if findAgentMembersipConfigModelErr != nil { + return findAgentMembersipConfigModelErr + } + // 定价 + commissionCost, commissionCostErr := l.CommissionCost(transCtx, agentID, AncestorId, AgentMembershipConfigModel, order.ProductId, session) + if commissionCostErr != nil { + return commissionCostErr + } + // 提价 + commissionPricing, commissionPricingErr := l.CommissionPricing(transCtx, agentID, AncestorId, AgentMembershipConfigModel, order.ProductId, order.Amount, session) + if commissionPricingErr != nil { + return commissionPricingErr + } + + // 上级克扣的成本 + descendantDeductedAmount = commissionCost + commissionPricing + + // 佣金 + ancestorCommissionReward, ancestorCommissionErr := l.AncestorCommission(transCtx, agentID, AncestorId, session) + if ancestorCommissionErr != nil { + return ancestorCommissionErr + } + + // 给上级成本以及佣金 + ancestorCommissionAmount := commissionCost + commissionPricing + ancestorCommissionReward + ancestorWallet, findAgentWalletModelErr := l.AgentWalletModel.FindOneByAgentId(transCtx, AncestorId) + if findAgentWalletModelErr != nil { + return findAgentWalletModelErr + } + + ancestorWallet.Balance += ancestorCommissionAmount + ancestorWallet.TotalEarnings += ancestorCommissionAmount + updateErr := l.AgentWalletModel.UpdateWithVersion(transCtx, session, ancestorWallet) + if updateErr != nil { + return updateErr + } + } + } + + // 推广人扣除金额 = 平台成本价 + 平台提价成本 + 上级佣金 + deductedAmount := PlatformCostAmount + PlatformPricingAmount + descendantDeductedAmount + agentCommissionErr := l.AgentCommission(transCtx, agentID, order, deductedAmount, session) + if agentCommissionErr != nil { + return agentCommissionErr + } + + return nil + }) + if transErr != nil { + return transErr + } + + return nil +} + +// AgentCommission 直推报告推广人佣金 +func (l *AgentService) AgentCommission(ctx context.Context, agentID int64, order *model.Order, deductedAmount float64, session sqlx.Session) error { + agentWalletModel, findAgentWalletModelErr := l.AgentWalletModel.FindOneByAgentId(ctx, agentID) + if findAgentWalletModelErr != nil { + return findAgentWalletModelErr + } + // 推广人最终获得代理佣金 + finalCommission := order.Amount - deductedAmount + agentWalletModel.Balance += finalCommission + agentWalletModel.TotalEarnings += finalCommission + + agentCommission := model.AgentCommission{ + AgentId: agentID, + OrderId: order.Id, + Amount: finalCommission, + ProductId: order.ProductId, + } + _, insertAgentCommissionErr := l.AgentCommissionModel.Insert(ctx, session, &agentCommission) + if insertAgentCommissionErr != nil { + return insertAgentCommissionErr + } + + updateAgentWalletErr := l.AgentWalletModel.UpdateWithVersion(ctx, session, agentWalletModel) + if updateAgentWalletErr != nil { + return updateAgentWalletErr + } + return nil +} + +// AncestorCommission 直推报告上级佣金(奖励型) +func (l *AgentService) AncestorCommission(ctx context.Context, descendantId int64, ancestorId int64, session sqlx.Session) (float64, error) { + agentModel, err := l.AgentModel.FindOneByUserId(ctx, ancestorId) + if err != nil { + return 0, err + } + + agentMembershipConfigModel, err := l.AgentMembershipConfigModel.FindOneByLevelName(ctx, agentModel.LevelName) + if err != nil { + return 0, err + } + + if agentMembershipConfigModel.ReportCommission.Valid { + reportCommissionAmount := agentMembershipConfigModel.ReportCommission.Float64 + agentRewards := model.AgentRewards{ + AgentId: ancestorId, + Amount: reportCommissionAmount, + RelationAgentId: lzUtils.Int64ToNullInt64(descendantId), + Type: model.AgentRewardsTypeDescendantPromotion, + } + + _, agentRewardsModelInsetErr := l.AgentRewardsModel.Insert(ctx, session, &agentRewards) + if agentRewardsModelInsetErr != nil { + return 0, agentRewardsModelInsetErr + } + return reportCommissionAmount, nil + } + + return 0, nil +} + +// PlatformCost 平台底价成本 +func (l *AgentService) PlatformCost(ctx context.Context, agentID int64, agentProductConfigModel *model.AgentProductConfig, session sqlx.Session) (float64, error) { + + costAgentPlatformDeductionModel := model.AgentPlatformDeduction{ + AgentId: agentID, + Amount: agentProductConfigModel.CostPrice, + Type: model.AgentDeductionTypeCost, + } + + _, err := l.AgentPlatformDeductionModel.Insert(ctx, session, &costAgentPlatformDeductionModel) + if err != nil { + return 0, err + } + return agentProductConfigModel.CostPrice, nil +} + +// PlatformPricing 平台提价成本 +func (l *AgentService) PlatformPricing(ctx context.Context, agentID int64, pricing float64, agentProductConfigModel *model.AgentProductConfig, session sqlx.Session) (float64, error) { + // 2. 计算平台提价成本 + if pricing > agentProductConfigModel.PricingStandard { + // 超出部分 + overpricing := pricing - agentProductConfigModel.PricingStandard + + // 收取成本 + overpricingCost := overpricing * agentProductConfigModel.OverpricingRatio + + pricingAgentPlatformDeductionModel := model.AgentPlatformDeduction{ + AgentId: agentID, + Amount: overpricingCost, + Type: model.AgentDeductionTypePricing, + } + + _, err := l.AgentPlatformDeductionModel.Insert(ctx, session, &pricingAgentPlatformDeductionModel) + if err != nil { + return 0, err + } + return overpricingCost, nil + } + return 0, nil +} + +// CommissionCost 上级底价成本 +func (l *AgentService) CommissionCost(ctx context.Context, descendantId int64, AncestorId int64, agentMembershipConfigModel *model.AgentMembershipConfig, productID int64, session sqlx.Session) (float64, error) { + if agentMembershipConfigModel.PriceIncreaseAmount.Valid { + // 拥有则查看该上级设定的成本 + agentMembershipUserConfigModel, findAgentMembershipUserConfigModelErr := l.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(ctx, AncestorId, productID) + if findAgentMembershipUserConfigModelErr != nil { + return 0, findAgentMembershipUserConfigModelErr + } + + deductCostAmount := agentMembershipUserConfigModel.PriceIncreaseAmount + + agentCommissionDeductionModel := model.AgentCommissionDeduction{ + AgentId: AncestorId, + DeductedAgentId: descendantId, + Amount: deductCostAmount, + Type: model.AgentDeductionTypeCost, + ProductId: productID, + } + + _, insertAgentCommissionDeductionModelErr := l.AgentCommissionDeductionModel.Insert(ctx, session, &agentCommissionDeductionModel) + if insertAgentCommissionDeductionModelErr != nil { + return 0, insertAgentCommissionDeductionModelErr + } + + return deductCostAmount, nil + } + return 0, nil +} + +// CommissionPricing 上级提价成本 +func (l *AgentService) CommissionPricing(ctx context.Context, descendantId int64, AncestorId int64, agentMembershipConfigModel *model.AgentMembershipConfig, productID int64, pricing float64, session sqlx.Session) (float64, error) { + //看上级代理等级否有拥有定价标准收益功能 + if agentMembershipConfigModel.PriceIncreaseMax.Valid && agentMembershipConfigModel.PriceRatio.Valid { + // 拥有则查看该上级设定的成本 + agentMembershipUserConfigModel, findAgentMembershipUserConfigModelErr := l.AgentMembershipUserConfigModel.FindOneByAgentIdProductId(ctx, AncestorId, productID) + if findAgentMembershipUserConfigModelErr != nil { + return 0, findAgentMembershipUserConfigModelErr + } + + // 计算是否在范围内 + var pricingRange float64 + if pricing > agentMembershipUserConfigModel.PriceRangeFrom { + if pricing > agentMembershipUserConfigModel.PriceRangeTo { + pricingRange = agentMembershipUserConfigModel.PriceRangeTo - agentMembershipUserConfigModel.PriceRangeFrom + } else { + pricingRange = pricing - agentMembershipUserConfigModel.PriceRangeFrom + } + } + + deductCostAmount := pricingRange * agentMembershipUserConfigModel.PriceRatio + + agentCommissionDeductionModel := model.AgentCommissionDeduction{ + AgentId: AncestorId, + DeductedAgentId: descendantId, + Amount: deductCostAmount, + Type: model.AgentDeductionTypePricing, + ProductId: productID, + } + _, insertAgentCommissionDeductionModelErr := l.AgentCommissionDeductionModel.Insert(ctx, session, &agentCommissionDeductionModel) + if insertAgentCommissionDeductionModelErr != nil { + return 0, insertAgentCommissionDeductionModelErr + } + return deductCostAmount, nil + } + return 0, nil +} + +//func (l *AgentService) UpgradeVip(ctx context.Context, agentID int64, leve string, session sqlx.Session) error { +// agentModel, err := l.AgentModel.FindOne(ctx, agentID) +// if err != nil { +// return err +// } +// if agentModel.LevelName != model.AgentLeveNameNormal { +// return fmt.Errorf("已经是会员") +// } +// return nil +//} diff --git a/app/user/cmd/api/internal/service/alipayService.go b/app/user/cmd/api/internal/service/alipayService.go index 0af79ea..2ea23fc 100644 --- a/app/user/cmd/api/internal/service/alipayService.go +++ b/app/user/cmd/api/internal/service/alipayService.go @@ -24,11 +24,23 @@ func NewAliPayService(c config.Config) *AliPayService { panic(fmt.Sprintf("创建支付宝客户端失败: %v", err)) } - // 加载支付宝公钥 - err = client.LoadAliPayPublicKey(c.Alipay.AlipayPublicKey) - if err != nil { - panic(fmt.Sprintf("加载支付宝公钥失败: %v", err)) + //// 加载支付宝公钥 + //err = client.LoadAliPayPublicKey(c.Alipay.AlipayPublicKey) + //if err != nil { + // panic(fmt.Sprintf("加载支付宝公钥失败: %v", err)) + //} + + // 加载证书 + if err = client.LoadAppCertPublicKeyFromFile(c.Alipay.AppCertPath); err != nil { + panic(fmt.Sprintf("加载应用公钥证书失败: %v", err)) } + if err = client.LoadAlipayCertPublicKeyFromFile(c.Alipay.AlipayCertPath); err != nil { + panic(fmt.Sprintf("加载支付宝公钥证书失败: %v", err)) + } + if err = client.LoadAliPayRootCertFromFile(c.Alipay.AlipayRootCertPath); err != nil { + panic(fmt.Sprintf("加载根证书失败: %v", err)) + } + return &AliPayService{ config: c.Alipay, AlipayClient: client, @@ -186,3 +198,62 @@ func (a *AliPayService) GenerateOutTradeNo() string { return combined } + +// AliTransfer 支付宝单笔转账到支付宝账户(提现功能) +func (a *AliPayService) AliTransfer( + ctx context.Context, + payeeAccount string, // 收款方支付宝账户 + payeeName string, // 收款方姓名 + amount float64, // 转账金额 + remark string, // 转账备注 + outBizNo string, // 商户转账唯一订单号(可使用GenerateOutTradeNo生成) +) (*alipay.FundTransUniTransferRsp, error) { + // 参数校验 + if payeeAccount == "" { + return nil, fmt.Errorf("收款账户不能为空") + } + if amount <= 0 { + return nil, fmt.Errorf("转账金额必须大于0") + } + + // 构造转账请求 + req := alipay.FundTransUniTransfer{ + OutBizNo: outBizNo, + TransAmount: lzUtils.ToAlipayAmount(amount), // 金额格式转换 + ProductCode: "TRANS_ACCOUNT_NO_PWD", // 单笔无密转账到支付宝账户 + BizScene: "DIRECT_TRANSFER", // 单笔转账 + OrderTitle: "账户提现", // 转账标题 + Remark: remark, + PayeeInfo: &alipay.PayeeInfo{ + Identity: payeeAccount, + IdentityType: "ALIPAY_LOGON_ID", // 根据账户类型选择: + Name: payeeName, + // ALIPAY_USER_ID/ALIPAY_LOGON_ID + }, + } + + // 执行转账请求 + transferRsp, err := a.AlipayClient.FundTransUniTransfer(ctx, req) + if err != nil { + return nil, fmt.Errorf("支付宝转账请求失败: %v", err) + } + + return transferRsp, nil +} +func (a *AliPayService) QueryTransferStatus( + ctx context.Context, + outBizNo string, +) (*alipay.FundTransOrderQueryRsp, error) { + req := alipay.FundTransOrderQuery{ + OutBizNo: outBizNo, + } + response, err := a.AlipayClient.FundTransOrderQuery(ctx, req) + if err != nil { + return nil, fmt.Errorf("支付宝接口调用失败: %v", err) + } + // 处理响应 + if response.Code.IsFailure() { + return nil, fmt.Errorf("支付宝返回错误: %s-%s", response.Code, response.Msg) + } + return response, nil +} diff --git a/app/user/cmd/api/internal/service/apirequestService.go b/app/user/cmd/api/internal/service/apirequestService.go index 0d8d18f..83ac52c 100644 --- a/app/user/cmd/api/internal/service/apirequestService.go +++ b/app/user/cmd/api/internal/service/apirequestService.go @@ -158,7 +158,7 @@ func (a *ApiRequestService) ProcessRequests(params []byte, productID int64) ([]b combinedResponse, err := json.Marshal(responseData) if err != nil { - return nil, fmt.Errorf("响应数据转 JSON 失败: %+v", err) + return nil, fmt.Errorf("响应数据转 JSON 失败: %v", err) } return combinedResponse, nil @@ -670,14 +670,14 @@ func (a *ApiRequestService) ProcessKZEYSRequest(params []byte) ([]byte, error) { req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode())) if err != nil { - return nil, fmt.Errorf("KZEYS 创建请求失败: %+v", err) + return nil, fmt.Errorf("KZEYS 创建请求失败: %v", err) } req.Header.Set("Authorization", "APPCODE "+appCode) req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") client := &http.Client{} resp, err := client.Do(req) if err != nil { - return nil, fmt.Errorf("KZEYS 请求失败: %+v", err) + return nil, fmt.Errorf("KZEYS 请求失败: %v", err) } defer resp.Body.Close() @@ -725,7 +725,7 @@ func (a *ApiRequestService) ProcessP_C_B332Request(params []byte) ([]byte, error } resp, err := a.yushanService.request("P_C_B332", request) if err != nil { - return nil, fmt.Errorf("人车核验查询失败: %+v", err) + return nil, fmt.Errorf("人车核验查询失败: %v", err) } return resp, nil } @@ -748,7 +748,7 @@ func (a *ApiRequestService) ProcessFIN019Request(params []byte) ([]byte, error) } resp, err := a.yushanService.request("FIN019", request) if err != nil { - return nil, fmt.Errorf("银行卡黑名单查询失败: %+v", err) + return nil, fmt.Errorf("银行卡黑名单查询失败: %v", err) } return resp, nil } @@ -765,7 +765,7 @@ func (a *ApiRequestService) ProcessCAR061Request(params []byte) ([]byte, error) } resp, err := a.yushanService.request("CAR061", request) if err != nil { - return nil, fmt.Errorf("名下车辆查询失败: %+v", err) + return nil, fmt.Errorf("名下车辆查询失败: %v", err) } return resp, nil } diff --git a/app/user/cmd/api/internal/service/verificationService.go b/app/user/cmd/api/internal/service/verificationService.go index 4d8aeb7..ae1de8b 100644 --- a/app/user/cmd/api/internal/service/verificationService.go +++ b/app/user/cmd/api/internal/service/verificationService.go @@ -77,14 +77,14 @@ func (r *VerificationService) TwoFactorVerification(request TwoFactorVerificatio req, err := http.NewRequest(http.MethodPost, requestUrl, strings.NewReader(data.Encode())) if err != nil { - return nil, fmt.Errorf("创建请求失败: %+v", err) + return nil, fmt.Errorf("创建请求失败: %v", err) } req.Header.Set("Authorization", "APPCODE "+appCode) req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") client := &http.Client{} resp, err := client.Do(req) if err != nil { - return nil, fmt.Errorf("请求失败: %+v", err) + return nil, fmt.Errorf("请求失败: %v", err) } defer resp.Body.Close() diff --git a/app/user/cmd/api/internal/svc/servicecontext.go b/app/user/cmd/api/internal/svc/servicecontext.go index be952c1..b4202ee 100644 --- a/app/user/cmd/api/internal/svc/servicecontext.go +++ b/app/user/cmd/api/internal/svc/servicecontext.go @@ -13,35 +13,54 @@ import ( ) type ServiceContext struct { - Config config.Config - Redis *redis.Redis - SourceInterceptor rest.Middleware - UserModel model.UserModel - UserAuthModel model.UserAuthModel - ProductModel model.ProductModel - FeatureModel model.FeatureModel - ProductFeatureModel model.ProductFeatureModel - OrderModel model.OrderModel - QueryModel model.QueryModel - GlobalNotificationsModel model.GlobalNotificationsModel - AlipayService *service.AliPayService - WechatPayService *service.WechatPayService - ApplePayService *service.ApplePayService - WestDexService *service.WestDexService - YushanService *service.YushanService - ApiRequestService *service.ApiRequestService - AsynqServer *asynq.Server // 服务端 - AsynqService *service.AsynqService // 客户端 - VerificationService *service.VerificationService + Config config.Config + Redis *redis.Redis + SourceInterceptor rest.Middleware + UserModel model.UserModel + UserAuthModel model.UserAuthModel + ProductModel model.ProductModel + FeatureModel model.FeatureModel + ProductFeatureModel model.ProductFeatureModel + OrderModel model.OrderModel + QueryModel model.QueryModel + AgentModel model.AgentModel + AgentAuditModel model.AgentAuditModel + AgentClosureModel model.AgentClosureModel + AgentCommissionModel model.AgentCommissionModel + AgentCommissionDeductionModel model.AgentCommissionDeductionModel + AgentWalletModel model.AgentWalletModel + AgentLinkModel model.AgentLinkModel + AgentOrderModel model.AgentOrderModel + AgentRewardsModel model.AgentRewardsModel + AgentMembershipConfigModel model.AgentMembershipConfigModel + AgentMembershipRechargeOrderModel model.AgentMembershipRechargeOrderModel + AgentMembershipUserConfigModel model.AgentMembershipUserConfigModel + AgentProductConfigModel model.AgentProductConfigModel + AgentPlatformDeductionModel model.AgentPlatformDeductionModel + AgentActiveStatModel model.AgentActiveStatModel + AgentWithdrawalModel model.AgentWithdrawalModel + GlobalNotificationsModel model.GlobalNotificationsModel + AlipayService *service.AliPayService + WechatPayService *service.WechatPayService + ApplePayService *service.ApplePayService + WestDexService *service.WestDexService + YushanService *service.YushanService + ApiRequestService *service.ApiRequestService + AsynqServer *asynq.Server // 服务端 + AsynqService *service.AsynqService // 客户端 + VerificationService *service.VerificationService + AgentService *service.AgentService } func NewServiceContext(c config.Config) *ServiceContext { db := sqlx.NewMysql(c.DataSource) + redisConf := redis.RedisConf{ Host: c.CacheRedis[0].Host, Pass: c.CacheRedis[0].Pass, Type: c.CacheRedis[0].Type, } + asynqServer := asynq.NewServer( asynq.RedisClientOpt{Addr: c.CacheRedis[0].Host, Password: c.CacheRedis[0].Pass}, asynq.Config{ @@ -52,34 +71,87 @@ func NewServiceContext(c config.Config) *ServiceContext { Concurrency: 10, }, ) + westDexService := service.NewWestDexService(c) yushanService := service.NewYushanService(c) productFeatureModel := model.NewProductFeatureModel(db, c.CacheRedis) featureModel := model.NewFeatureModel(db, c.CacheRedis) userAuthModel := model.NewUserAuthModel(db, c.CacheRedis) + + userModel := model.NewUserModel(db, c.CacheRedis) + productModel := model.NewProductModel(db, c.CacheRedis) + orderModel := model.NewOrderModel(db, c.CacheRedis) + queryModel := model.NewQueryModel(db, c.CacheRedis) + globalNotificationsModel := model.NewGlobalNotificationsModel(db, c.CacheRedis) + + agentModel := model.NewAgentModel(db, c.CacheRedis) + agentAuditModel := model.NewAgentAuditModel(db, c.CacheRedis) + agentCommissionModel := model.NewAgentCommissionModel(db, c.CacheRedis) + agentCommissionDeductionModel := model.NewAgentCommissionDeductionModel(db, c.CacheRedis) + agentWalletModel := model.NewAgentWalletModel(db, c.CacheRedis) + agentClosureModel := model.NewAgentClosureModel(db, c.CacheRedis) + agentLinkModel := model.NewAgentLinkModel(db, c.CacheRedis) + agentOrderModel := model.NewAgentOrderModel(db, c.CacheRedis) + agentRewardsModel := model.NewAgentRewardsModel(db, c.CacheRedis) + agentMembershipConfigModel := model.NewAgentMembershipConfigModel(db, c.CacheRedis) + agentMembershipRechargeOrderModel := model.NewAgentMembershipRechargeOrderModel(db, c.CacheRedis) + agentMembershipUserConfigModel := model.NewAgentMembershipUserConfigModel(db, c.CacheRedis) + agentProductConfigModel := model.NewAgentProductConfigModel(db, c.CacheRedis) + agentPlatformDeductionModel := model.NewAgentPlatformDeductionModel(db, c.CacheRedis) + agentActiveStatModel := model.NewAgentActiveStatModel(db, c.CacheRedis) + agentWithdrawalModel := model.NewAgentWithdrawalModel(db, c.CacheRedis) + + alipayService := service.NewAliPayService(c) + wechatPayService := service.NewWechatPayService(c, userAuthModel) + applePayService := service.NewApplePayService(c) + verificationService := service.NewVerificationService(c, westDexService) + apiRequestService := service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel) + asynqService := service.NewAsynqService(c) + agentService := service.NewAgentService(c, agentModel, agentAuditModel, agentClosureModel, agentCommissionModel, + agentCommissionDeductionModel, agentWalletModel, agentLinkModel, agentOrderModel, agentRewardsModel, + agentMembershipConfigModel, agentMembershipRechargeOrderModel, agentMembershipUserConfigModel, + agentProductConfigModel, agentPlatformDeductionModel, agentActiveStatModel, agentWithdrawalModel) return &ServiceContext{ - Config: c, - Redis: redis.MustNewRedis(redisConf), - SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle, - AlipayService: service.NewAliPayService(c), - WechatPayService: service.NewWechatPayService(c, userAuthModel), - ApplePayService: service.NewApplePayService(c), - WestDexService: westDexService, - YushanService: yushanService, - VerificationService: service.NewVerificationService(c, westDexService), - AsynqServer: asynqServer, - ApiRequestService: service.NewApiRequestService(c, westDexService, yushanService, featureModel, productFeatureModel), - AsynqService: service.NewAsynqService(c), - UserModel: model.NewUserModel(db, c.CacheRedis), - UserAuthModel: userAuthModel, - ProductModel: model.NewProductModel(db, c.CacheRedis), - OrderModel: model.NewOrderModel(db, c.CacheRedis), - QueryModel: model.NewQueryModel(db, c.CacheRedis), - GlobalNotificationsModel: model.NewGlobalNotificationsModel(db, c.CacheRedis), - FeatureModel: featureModel, - ProductFeatureModel: productFeatureModel, + Config: c, + Redis: redis.MustNewRedis(redisConf), + SourceInterceptor: middleware.NewSourceInterceptorMiddleware().Handle, + AlipayService: alipayService, + WechatPayService: wechatPayService, + ApplePayService: applePayService, + WestDexService: westDexService, + YushanService: yushanService, + VerificationService: verificationService, + AsynqServer: asynqServer, + ApiRequestService: apiRequestService, + AsynqService: asynqService, + AgentService: agentService, + UserModel: userModel, + UserAuthModel: userAuthModel, + ProductModel: productModel, + OrderModel: orderModel, + QueryModel: queryModel, + GlobalNotificationsModel: globalNotificationsModel, + FeatureModel: featureModel, + ProductFeatureModel: productFeatureModel, + AgentModel: agentModel, + AgentAuditModel: agentAuditModel, + AgentCommissionModel: agentCommissionModel, + AgentCommissionDeductionModel: agentCommissionDeductionModel, + AgentWalletModel: agentWalletModel, + AgentClosureModel: agentClosureModel, + AgentLinkModel: agentLinkModel, + AgentOrderModel: agentOrderModel, + AgentRewardsModel: agentRewardsModel, + AgentMembershipConfigModel: agentMembershipConfigModel, + AgentMembershipRechargeOrderModel: agentMembershipRechargeOrderModel, + AgentMembershipUserConfigModel: agentMembershipUserConfigModel, + AgentProductConfigModel: agentProductConfigModel, + AgentPlatformDeductionModel: agentPlatformDeductionModel, + AgentActiveStatModel: agentActiveStatModel, + AgentWithdrawalModel: agentWithdrawalModel, } } + func (s *ServiceContext) Close() { if s.AsynqService != nil { s.AsynqService.Close() diff --git a/app/user/cmd/api/internal/types/cache.go b/app/user/cmd/api/internal/types/cache.go index 84ba143..3693130 100644 --- a/app/user/cmd/api/internal/types/cache.go +++ b/app/user/cmd/api/internal/types/cache.go @@ -7,6 +7,7 @@ type QueryCache struct { Product string `json:"product_id"` } type QueryCacheLoad struct { - Product string `json:"product_en"` - Params map[string]interface{} `json:"params"` + Product string `json:"product_en"` + Params map[string]interface{} `json:"params"` + AgentIdentifier string `json:"agent_dentifier"` } diff --git a/app/user/cmd/api/internal/types/query.go b/app/user/cmd/api/internal/types/query.go index 4572530..5687f34 100644 --- a/app/user/cmd/api/internal/types/query.go +++ b/app/user/cmd/api/internal/types/query.go @@ -101,3 +101,13 @@ type TocPhoneSecondaryCard struct { Mobile string `json:"mobile" validate:"required,mobile"` StartDate string `json:"start_date" validate:"required"` } + +type AgentQueryData struct { + Mobile string `json:"mobile"` + Code string `json:"code"` +} +type AgentIdentifier struct { + Product string `json:"product"` + AgentID int64 `json:"agent_id"` + Price string `json:"price"` +} diff --git a/app/user/cmd/api/internal/types/types.go b/app/user/cmd/api/internal/types/types.go index 68953b7..769619b 100644 --- a/app/user/cmd/api/internal/types/types.go +++ b/app/user/cmd/api/internal/types/types.go @@ -1,12 +1,156 @@ // Code generated by goctl. DO NOT EDIT. package types +type ActiveReward struct { + TotalReward float64 `json:"total_reward"` + Today ActiveRewardData `json:"today"` // 今日数据 + Last7D ActiveRewardData `json:"last7d"` // 近7天数据 + Last30D ActiveRewardData `json:"last30d"` // 近30天数据 +} + +type ActiveRewardData struct { + NewActiveReward float64 `json:"active_reward"` + SubPromoteReward float64 `json:"sub_promote_reward"` + SubUpgradeReward float64 `json:"sub_upgrade_reward"` + SubWithdrawReward float64 `json:"sub_withdraw_reward"` +} + +type AgentActivateMembershipReq struct { + Mobile string `json:"mobile"` + Type string `json:"type,oneof=VIP SVIP"` // 会员类型:vip/svip + Amount float64 `json:"amount"` + PaymentMethod string `json:"payment_method"` + TransactionId string `json:"transaction_id"` +} + +type AgentActivateMembershipResp struct { + MembershipType string `json:"membership_type"` // 最终开通的会员类型 + ExpireTime string `json:"expire_time"` // 到期时间 +} + +type AgentApplyReq struct { + Region string `json:"region"` + Mobile string `json:"mobile"` + WechatID string `json:"wechat_id"` + Code string `json:"code"` + Ancestor string `json:"ancestor,optional"` +} + +type AgentApplyResp struct { + AccessToken string `json:"accessToken"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` +} + +type AgentAuditStatusResp struct { + Status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过 + AuditReason string `json:"audit_reason"` +} + +type AgentGeneratingLinkReq struct { + Product string `json:"product"` + Price string `json:"price"` +} + +type AgentGeneratingLinkResp struct { + LinkIdentifier string `json:"link_identifier"` +} + +type AgentInfoResp struct { + Status int64 `json:"status"` // 0=待审核,1=审核通过,2=审核未通过,3=未申请 + IsAgent bool `json:"is_agent"` + AgentID int64 `json:"agent_id"` + Level string `json:"level"` + Region string `json:"region"` + Mobile string `json:"mobile"` + WechatID string `json:"wechat_id"` +} + +type AgentMembershipProductConfigReq struct { + ProductID int64 `form:"product_id"` +} + +type AgentMembershipProductConfigResp struct { + AgentMembershipUserConfig AgentMembershipUserConfig `json:"agent_membership_user_config"` + ProductConfig ProductConfig `json:"product_config"` + PriceIncreaseMax float64 `json:"price_increase_max"` + PriceIncreaseAmount float64 `json:"price_increase_amount"` + PriceRatio float64 `json:"price_ratio"` +} + +type AgentMembershipUserConfig struct { + ProductID int64 `json:"product_id"` + PriceIncreaseAmount float64 `json:"price_increase_amount"` + PriceRangeFrom float64 `json:"price_range_from"` + PriceRangeTo float64 `json:"price_range_to"` + PriceRatio float64 `json:"price_ratio"` +} + +type AgentProductConfig struct { + ProductID int64 `json:"product_id"` + CostPrice float64 `json:"cost_price"` + PriceRangeMin float64 `json:"price_range_min"` + PriceRangeMax float64 `json:"price_range_max"` + PPricingStandard float64 `json:"p_pricing_standard"` + POverpricingRatio float64 `json:"p_overpricing_ratio"` + APricingStandard float64 `json:"a_pricing_standard"` + APricingEnd float64 `json:"a_pricing_end"` + AOverpricingRatio float64 `json:"a_overpricing_ratio"` +} + +type AgentProductConfigResp struct { + AgentProductConfig []AgentProductConfig +} + +type Commission struct { + ProductName string `json:"product_name"` + Amount float64 `json:"amount"` + CreateTime string `json:"create_time"` +} + +type DirectPushReport struct { + TotalCommission float64 `json:"total_commission"` + TotalReport int `json:"total_report"` + Today TimeRangeReport `json:"today"` // 近24小时数据 + Last7D TimeRangeReport `json:"last7d"` // 近7天数据 + Last30D TimeRangeReport `json:"last30d"` // 近30天数据 +} + type Feature struct { ID int64 `json:"id"` // 功能ID ApiID string `json:"api_id"` // API标识 Name string `json:"name"` // 功能描述 } +type GetAgentRevenueInfoReq struct { +} + +type GetAgentRevenueInfoResp struct { + Balance float64 `json:"balance"` + FrozenBalance float64 `json:"frozen_balance"` + TotalEarnings float64 `json:"total_earnings"` + DirectPush DirectPushReport `json:"direct_push"` // 直推报告数据 + ActiveReward ActiveReward `json:"active_reward"` // 活跃下级奖励数据 +} + +type GetCommissionReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数据量 +} + +type GetCommissionResp struct { + Total int64 `json:"total"` // 总记录数 + List []Commission `json:"list"` // 查询列表 +} + +type GetLinkDataReq struct { + LinkIdentifier string `form:"link_identifier"` +} + +type GetLinkDataResp struct { + Product +} + type GetNotificationsResp struct { Notifications []Notification `json:"notifications"` // 通知列表 Total int64 `json:"total"` // 总记录数 @@ -20,6 +164,26 @@ type GetProductByIDRequest struct { Id int64 `path:"id"` } +type GetRewardsReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数据量 +} + +type GetRewardsResp struct { + Total int64 `json:"total"` // 总记录数 + List []Rewards `json:"list"` // 查询列表 +} + +type GetWithdrawalReq struct { + Page int64 `form:"page"` // 页码 + PageSize int64 `form:"page_size"` // 每页数据量 +} + +type GetWithdrawalResp struct { + Total int64 `json:"total"` // 总记录数 + List []Withdrawal `json:"list"` // 查询列表 +} + type IapCallbackReq struct { OrderID int64 `json:"order_id" validate:"required"` TransactionReceipt string `json:"transaction_receipt" validate:"required"` @@ -77,6 +241,13 @@ type Product struct { Features []Feature `json:"features"` // 关联功能列表 } +type ProductConfig struct { + ProductID int64 `json:"product_id"` + CostPrice float64 `json:"cost_price"` + PriceRangeMin float64 `json:"price_range_min"` + PriceRangeMax float64 `json:"price_range_max"` +} + type ProductResponse struct { Product } @@ -167,12 +338,16 @@ type QueryRetryResp struct { } type QueryServiceReq struct { - Product string `path:"product"` - Data string `json:"data" validate:"required"` + Product string `path:"product"` + Data string `json:"data" validate:"required"` + AgentIdentifier string `json:"agent_identifier,optional"` } type QueryServiceResp struct { - Id string `json:"id"` + Id string `json:"id"` + AccessToken string `json:"accessToken"` + AccessExpire int64 `json:"accessExpire"` + RefreshAfter int64 `json:"refreshAfter"` } type RegisterReq struct { @@ -187,6 +362,25 @@ type RegisterResp struct { RefreshAfter int64 `json:"refreshAfter"` } +type Rewards struct { + Type string `json:"type"` + Amount float64 `json:"amount"` + CreateTime string `json:"create_time"` +} + +type SaveAgentMembershipUserConfigReq struct { + ProductID int64 `json:"product_id"` + PriceIncreaseAmount float64 `json:"price_increase_amount"` + PriceRangeFrom float64 `json:"price_range_from"` + PriceRangeTo float64 `json:"price_range_to"` + PriceRatio float64 `json:"price_ratio"` +} + +type TimeRangeReport struct { + Commission float64 `json:"commission"` // 佣金 + Report int `json:"report"` // 报告量 +} + type User struct { Id int64 `json:"id"` Mobile string `json:"mobile"` @@ -219,7 +413,27 @@ type WXMiniAuthResp struct { RefreshAfter int64 `json:"refreshAfter"` } +type Withdrawal struct { + Status int64 `json:"status"` + Amount float64 `json:"amount"` + WithdrawalNo string `json:"withdrawal_no"` + Remark string `json:"remark"` + PayeeAccount string `json:"payee_account"` + CreateTime string `json:"create_time"` +} + +type WithdrawalReq struct { + Amount float64 `json:"amount"` // 提现金额 + PayeeAccount string `json:"payee_account"` + PayeeName string `json:"payee_name"` +} + +type WithdrawalResp struct { + Status int64 `json:"status"` // 1申请中 2成功 3失败 + FailMsg string `json:"fail_msg"` +} + type SendSmsReq struct { Mobile string `json:"mobile" validate:"required,mobile"` - ActionType string `json:"actionType" validate:"required,oneof=login register query"` + ActionType string `json:"actionType" validate:"required,oneof=login register query agentApply"` } diff --git a/app/user/cmd/api/main.go b/app/user/cmd/api/main.go index ef75f39..c204dff 100644 --- a/app/user/cmd/api/main.go +++ b/app/user/cmd/api/main.go @@ -47,7 +47,7 @@ func main() { // 启动 asynq 消费者 if err := svcContext.AsynqServer.Run(mux); err != nil { - logx.WithContext(ctx).Errorf("异步任务启动失败: %+v", err) + logx.WithContext(ctx).Errorf("异步任务启动失败: %v", err) os.Exit(1) } fmt.Println("异步任务启动!!!") diff --git a/app/user/model/agentActiveStatModel.go b/app/user/model/agentActiveStatModel.go new file mode 100644 index 0000000..86ce2ef --- /dev/null +++ b/app/user/model/agentActiveStatModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentActiveStatModel = (*customAgentActiveStatModel)(nil) + +type ( + // AgentActiveStatModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentActiveStatModel. + AgentActiveStatModel interface { + agentActiveStatModel + } + + customAgentActiveStatModel struct { + *defaultAgentActiveStatModel + } +) + +// NewAgentActiveStatModel returns a model for the database table. +func NewAgentActiveStatModel(conn sqlx.SqlConn, c cache.CacheConf) AgentActiveStatModel { + return &customAgentActiveStatModel{ + defaultAgentActiveStatModel: newAgentActiveStatModel(conn, c), + } +} diff --git a/app/user/model/agentActiveStatModel_gen.go b/app/user/model/agentActiveStatModel_gen.go new file mode 100644 index 0000000..af443da --- /dev/null +++ b/app/user/model/agentActiveStatModel_gen.go @@ -0,0 +1,408 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentActiveStatFieldNames = builder.RawFieldNames(&AgentActiveStat{}) + agentActiveStatRows = strings.Join(agentActiveStatFieldNames, ",") + agentActiveStatRowsExpectAutoSet = strings.Join(stringx.Remove(agentActiveStatFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentActiveStatRowsWithPlaceHolder = strings.Join(stringx.Remove(agentActiveStatFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentActiveStatIdPrefix = "cache:tydata:agentActiveStat:id:" + cacheTydataAgentActiveStatAgentIdStatDatePrefix = "cache:tydata:agentActiveStat:agentId:statDate:" +) + +type ( + agentActiveStatModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentActiveStat) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentActiveStat, error) + FindOneByAgentIdStatDate(ctx context.Context, agentId int64, statDate time.Time) (*AgentActiveStat, error) + Update(ctx context.Context, session sqlx.Session, data *AgentActiveStat) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentActiveStat) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentActiveStat) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentActiveStat, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentActiveStat, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentActiveStat, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentActiveStatModel struct { + sqlc.CachedConn + table string + } + + AgentActiveStat struct { + Id int64 `db:"id"` // 主键ID + AgentId int64 `db:"agent_id"` // 代理ID + StatDate time.Time `db:"stat_date"` // 统计日期 + ActiveNumber int64 `db:"active_number"` // 下级活跃数 + 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"` // 版本号 + } +) + +func newAgentActiveStatModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentActiveStatModel { + return &defaultAgentActiveStatModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_active_stat`", + } +} + +func (m *defaultAgentActiveStatModel) Insert(ctx context.Context, session sqlx.Session, data *AgentActiveStat) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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, agentActiveStatRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.StatDate, data.ActiveNumber, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.StatDate, data.ActiveNumber, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) +} + +func (m *defaultAgentActiveStatModel) FindOne(ctx context.Context, id int64) (*AgentActiveStat, error) { + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, id) + var resp AgentActiveStat + err := m.QueryRowCtx(ctx, &resp, tydataAgentActiveStatIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentActiveStatRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindOneByAgentIdStatDate(ctx context.Context, agentId int64, statDate time.Time) (*AgentActiveStat, error) { + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, agentId, statDate) + var resp AgentActiveStat + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentActiveStatAgentIdStatDateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `agent_id` = ? and `stat_date` = ? and del_state = ? limit 1", agentActiveStatRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, agentId, statDate, 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 *defaultAgentActiveStatModel) Update(ctx context.Context, session sqlx.Session, newData *AgentActiveStat) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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, agentActiveStatRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) +} + +func (m *defaultAgentActiveStatModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentActiveStat) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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, agentActiveStatRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentActiveStatModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentActiveStat) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentActiveStatModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentActiveStatModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentActiveStatModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentActiveStatModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentActiveStatRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentActiveStatModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentActiveStatModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) + return err +} +func (m *defaultAgentActiveStatModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, primary) +} +func (m *defaultAgentActiveStatModel) 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", agentActiveStatRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentActiveStatModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentAuditModel.go b/app/user/model/agentAuditModel.go new file mode 100644 index 0000000..80ddf43 --- /dev/null +++ b/app/user/model/agentAuditModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentAuditModel = (*customAgentAuditModel)(nil) + +type ( + // AgentAuditModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentAuditModel. + AgentAuditModel interface { + agentAuditModel + } + + customAgentAuditModel struct { + *defaultAgentAuditModel + } +) + +// NewAgentAuditModel returns a model for the database table. +func NewAgentAuditModel(conn sqlx.SqlConn, c cache.CacheConf) AgentAuditModel { + return &customAgentAuditModel{ + defaultAgentAuditModel: newAgentAuditModel(conn, c), + } +} diff --git a/app/user/model/agentAuditModel_gen.go b/app/user/model/agentAuditModel_gen.go new file mode 100644 index 0000000..9fd4654 --- /dev/null +++ b/app/user/model/agentAuditModel_gen.go @@ -0,0 +1,412 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentAuditFieldNames = builder.RawFieldNames(&AgentAudit{}) + agentAuditRows = strings.Join(agentAuditFieldNames, ",") + agentAuditRowsExpectAutoSet = strings.Join(stringx.Remove(agentAuditFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentAuditRowsWithPlaceHolder = strings.Join(stringx.Remove(agentAuditFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentAuditIdPrefix = "cache:tydata:agentAudit:id:" + cacheTydataAgentAuditUserIdPrefix = "cache:tydata:agentAudit:userId:" +) + +type ( + agentAuditModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentAudit, error) + FindOneByUserId(ctx context.Context, userId int64) (*AgentAudit, error) + Update(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentAudit) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentAudit) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentAudit, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentAudit, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentAudit, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentAudit, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentAudit, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentAuditModel struct { + sqlc.CachedConn + table string + } + + AgentAudit struct { + Id int64 `db:"id"` + UserId int64 `db:"user_id"` + Region string `db:"region"` + Mobile string `db:"mobile"` + WechatId sql.NullString `db:"wechat_id"` + Status int64 `db:"status"` + AuditReason sql.NullString `db:"audit_reason"` + CreateTime time.Time `db:"create_time"` + AuditTime sql.NullTime `db:"audit_time"` + UpdateTime time.Time `db:"update_time"` // 更新时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + DelState int64 `db:"del_state"` // 删除状态 + Version int64 `db:"version"` // 版本号 + } +) + +func newAgentAuditModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentAuditModel { + return &defaultAgentAuditModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_audit`", + } +} + +func (m *defaultAgentAuditModel) Insert(ctx context.Context, session sqlx.Session, data *AgentAudit) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, data.Id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentAuditRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.UserId, data.Region, data.Mobile, data.WechatId, data.Status, data.AuditReason, data.AuditTime, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) +} + +func (m *defaultAgentAuditModel) FindOne(ctx context.Context, id int64) (*AgentAudit, error) { + tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, id) + var resp AgentAudit + err := m.QueryRowCtx(ctx, &resp, tydataAgentAuditIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentAuditRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) FindOneByUserId(ctx context.Context, userId int64) (*AgentAudit, error) { + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, userId) + var resp AgentAudit + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentAuditUserIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `user_id` = ? and del_state = ? limit 1", agentAuditRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, userId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) Update(ctx context.Context, session sqlx.Session, newData *AgentAudit) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, data.Id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, agentAuditRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) +} + +func (m *defaultAgentAuditModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentAudit) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, data.Id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) + sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, agentAuditRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.UserId, newData.Region, newData.Mobile, newData.WechatId, newData.Status, newData.AuditReason, newData.AuditTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentAuditModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentAudit) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentAuditModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentAuditModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentAuditModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentAuditModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentAudit, error) { + + builder = builder.Columns(agentAuditRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentAudit + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentAudit, error) { + + builder = builder.Columns(agentAuditRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentAudit + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentAudit, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentAuditRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentAudit + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentAuditModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentAudit, error) { + + builder = builder.Columns(agentAuditRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentAudit + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentAudit, error) { + + builder = builder.Columns(agentAuditRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentAudit + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentAuditModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentAuditModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentAuditModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentAuditIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, id) + tydataAgentAuditUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentAuditUserIdPrefix, data.UserId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAgentAuditIdKey, tydataAgentAuditUserIdKey) + return err +} +func (m *defaultAgentAuditModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentAuditIdPrefix, primary) +} +func (m *defaultAgentAuditModel) 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", agentAuditRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentAuditModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentClosureModel.go b/app/user/model/agentClosureModel.go new file mode 100644 index 0000000..dd92f74 --- /dev/null +++ b/app/user/model/agentClosureModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentClosureModel = (*customAgentClosureModel)(nil) + +type ( + // AgentClosureModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentClosureModel. + AgentClosureModel interface { + agentClosureModel + } + + customAgentClosureModel struct { + *defaultAgentClosureModel + } +) + +// NewAgentClosureModel returns a model for the database table. +func NewAgentClosureModel(conn sqlx.SqlConn, c cache.CacheConf) AgentClosureModel { + return &customAgentClosureModel{ + defaultAgentClosureModel: newAgentClosureModel(conn, c), + } +} diff --git a/app/user/model/agentClosureModel_gen.go b/app/user/model/agentClosureModel_gen.go new file mode 100644 index 0000000..3923c6c --- /dev/null +++ b/app/user/model/agentClosureModel_gen.go @@ -0,0 +1,434 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentClosureFieldNames = builder.RawFieldNames(&AgentClosure{}) + agentClosureRows = strings.Join(agentClosureFieldNames, ",") + agentClosureRowsExpectAutoSet = strings.Join(stringx.Remove(agentClosureFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentClosureRowsWithPlaceHolder = strings.Join(stringx.Remove(agentClosureFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentClosureIdPrefix = "cache:tydata:agentClosure:id:" + cacheTydataAgentClosureAncestorIdDescendantIdPrefix = "cache:tydata:agentClosure:ancestorId:descendantId:" + cacheTydataAgentClosureDescendantIdDepthPrefix = "cache:tydata:agentClosure:descendantId:depth:" +) + +type ( + agentClosureModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentClosure) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentClosure, error) + FindOneByAncestorIdDescendantId(ctx context.Context, ancestorId int64, descendantId int64) (*AgentClosure, error) + FindOneByDescendantIdDepth(ctx context.Context, descendantId int64, depth int64) (*AgentClosure, error) + Update(ctx context.Context, session sqlx.Session, data *AgentClosure) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentClosure) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentClosure) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentClosure, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentClosure, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentClosure, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentClosure, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentClosure, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentClosureModel struct { + sqlc.CachedConn + table string + } + + AgentClosure struct { + Id int64 `db:"id"` + AncestorId int64 `db:"ancestor_id"` + DescendantId int64 `db:"descendant_id"` + Depth int64 `db:"depth"` + 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"` // 版本号 + } +) + +func newAgentClosureModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentClosureModel { + return &defaultAgentClosureModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_closure`", + } +} + +func (m *defaultAgentClosureModel) Insert(ctx context.Context, session sqlx.Session, data *AgentClosure) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentClosureAncestorIdDescendantIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureAncestorIdDescendantIdPrefix, data.AncestorId, data.DescendantId) + tydataAgentClosureDescendantIdDepthKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureDescendantIdDepthPrefix, data.DescendantId, data.Depth) + tydataAgentClosureIdKey := fmt.Sprintf("%s%v", cacheTydataAgentClosureIdPrefix, 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, agentClosureRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.AncestorId, data.DescendantId, data.Depth, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.AncestorId, data.DescendantId, data.Depth, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentClosureAncestorIdDescendantIdKey, tydataAgentClosureDescendantIdDepthKey, tydataAgentClosureIdKey) +} + +func (m *defaultAgentClosureModel) FindOne(ctx context.Context, id int64) (*AgentClosure, error) { + tydataAgentClosureIdKey := fmt.Sprintf("%s%v", cacheTydataAgentClosureIdPrefix, id) + var resp AgentClosure + err := m.QueryRowCtx(ctx, &resp, tydataAgentClosureIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentClosureRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentClosureModel) FindOneByAncestorIdDescendantId(ctx context.Context, ancestorId int64, descendantId int64) (*AgentClosure, error) { + tydataAgentClosureAncestorIdDescendantIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureAncestorIdDescendantIdPrefix, ancestorId, descendantId) + var resp AgentClosure + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentClosureAncestorIdDescendantIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `ancestor_id` = ? and `descendant_id` = ? and del_state = ? limit 1", agentClosureRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, ancestorId, descendantId, 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 *defaultAgentClosureModel) FindOneByDescendantIdDepth(ctx context.Context, descendantId int64, depth int64) (*AgentClosure, error) { + tydataAgentClosureDescendantIdDepthKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureDescendantIdDepthPrefix, descendantId, depth) + var resp AgentClosure + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentClosureDescendantIdDepthKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `descendant_id` = ? and `depth` = ? and del_state = ? limit 1", agentClosureRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, descendantId, depth, 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 *defaultAgentClosureModel) Update(ctx context.Context, session sqlx.Session, newData *AgentClosure) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentClosureAncestorIdDescendantIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureAncestorIdDescendantIdPrefix, data.AncestorId, data.DescendantId) + tydataAgentClosureDescendantIdDepthKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureDescendantIdDepthPrefix, data.DescendantId, data.Depth) + tydataAgentClosureIdKey := fmt.Sprintf("%s%v", cacheTydataAgentClosureIdPrefix, 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, agentClosureRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AncestorId, newData.DescendantId, newData.Depth, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.AncestorId, newData.DescendantId, newData.Depth, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentClosureAncestorIdDescendantIdKey, tydataAgentClosureDescendantIdDepthKey, tydataAgentClosureIdKey) +} + +func (m *defaultAgentClosureModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentClosure) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentClosureAncestorIdDescendantIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureAncestorIdDescendantIdPrefix, data.AncestorId, data.DescendantId) + tydataAgentClosureDescendantIdDepthKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureDescendantIdDepthPrefix, data.DescendantId, data.Depth) + tydataAgentClosureIdKey := fmt.Sprintf("%s%v", cacheTydataAgentClosureIdPrefix, 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, agentClosureRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AncestorId, newData.DescendantId, newData.Depth, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.AncestorId, newData.DescendantId, newData.Depth, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentClosureAncestorIdDescendantIdKey, tydataAgentClosureDescendantIdDepthKey, tydataAgentClosureIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentClosureModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentClosure) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentClosureModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentClosureModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentClosureModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentClosureModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentClosure, error) { + + builder = builder.Columns(agentClosureRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentClosure + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentClosureModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentClosure, error) { + + builder = builder.Columns(agentClosureRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentClosure + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentClosureModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentClosure, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentClosureRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentClosure + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentClosureModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentClosure, error) { + + builder = builder.Columns(agentClosureRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentClosure + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentClosureModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentClosure, error) { + + builder = builder.Columns(agentClosureRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentClosure + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentClosureModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentClosureModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentClosureModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentClosureAncestorIdDescendantIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureAncestorIdDescendantIdPrefix, data.AncestorId, data.DescendantId) + tydataAgentClosureDescendantIdDepthKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentClosureDescendantIdDepthPrefix, data.DescendantId, data.Depth) + tydataAgentClosureIdKey := fmt.Sprintf("%s%v", cacheTydataAgentClosureIdPrefix, 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) + }, tydataAgentClosureAncestorIdDescendantIdKey, tydataAgentClosureDescendantIdDepthKey, tydataAgentClosureIdKey) + return err +} +func (m *defaultAgentClosureModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentClosureIdPrefix, primary) +} +func (m *defaultAgentClosureModel) 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", agentClosureRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentClosureModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentCommissionDeductionModel.go b/app/user/model/agentCommissionDeductionModel.go new file mode 100644 index 0000000..3318cf1 --- /dev/null +++ b/app/user/model/agentCommissionDeductionModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentCommissionDeductionModel = (*customAgentCommissionDeductionModel)(nil) + +type ( + // AgentCommissionDeductionModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentCommissionDeductionModel. + AgentCommissionDeductionModel interface { + agentCommissionDeductionModel + } + + customAgentCommissionDeductionModel struct { + *defaultAgentCommissionDeductionModel + } +) + +// NewAgentCommissionDeductionModel returns a model for the database table. +func NewAgentCommissionDeductionModel(conn sqlx.SqlConn, c cache.CacheConf) AgentCommissionDeductionModel { + return &customAgentCommissionDeductionModel{ + defaultAgentCommissionDeductionModel: newAgentCommissionDeductionModel(conn, c), + } +} diff --git a/app/user/model/agentCommissionDeductionModel_gen.go b/app/user/model/agentCommissionDeductionModel_gen.go new file mode 100644 index 0000000..b397110 --- /dev/null +++ b/app/user/model/agentCommissionDeductionModel_gen.go @@ -0,0 +1,372 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentCommissionDeductionFieldNames = builder.RawFieldNames(&AgentCommissionDeduction{}) + agentCommissionDeductionRows = strings.Join(agentCommissionDeductionFieldNames, ",") + agentCommissionDeductionRowsExpectAutoSet = strings.Join(stringx.Remove(agentCommissionDeductionFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentCommissionDeductionRowsWithPlaceHolder = strings.Join(stringx.Remove(agentCommissionDeductionFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentCommissionDeductionIdPrefix = "cache:tydata:agentCommissionDeduction:id:" +) + +type ( + agentCommissionDeductionModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentCommissionDeduction, error) + Update(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentCommissionDeduction, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommissionDeduction, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommissionDeduction, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentCommissionDeduction, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentCommissionDeduction, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentCommissionDeductionModel struct { + sqlc.CachedConn + table string + } + + AgentCommissionDeduction struct { + Id int64 `db:"id"` + AgentId int64 `db:"agent_id"` + DeductedAgentId int64 `db:"deducted_agent_id"` // 被抽佣代理ID + Amount float64 `db:"amount"` + ProductId int64 `db:"product_id"` // 产品ID + Type string `db:"type"` + Status int64 `db:"status"` // 状态 + 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"` // 版本号 + } +) + +func newAgentCommissionDeductionModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentCommissionDeductionModel { + return &defaultAgentCommissionDeductionModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_commission_deduction`", + } +} + +func (m *defaultAgentCommissionDeductionModel) Insert(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentCommissionDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionDeductionIdPrefix, 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, agentCommissionDeductionRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.DeductedAgentId, data.Amount, data.ProductId, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.DeductedAgentId, data.Amount, data.ProductId, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentCommissionDeductionIdKey) +} + +func (m *defaultAgentCommissionDeductionModel) FindOne(ctx context.Context, id int64) (*AgentCommissionDeduction, error) { + tydataAgentCommissionDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionDeductionIdPrefix, id) + var resp AgentCommissionDeduction + err := m.QueryRowCtx(ctx, &resp, tydataAgentCommissionDeductionIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentCommissionDeductionRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentCommissionDeductionModel) Update(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) (sql.Result, error) { + tydataAgentCommissionDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionDeductionIdPrefix, 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, agentCommissionDeductionRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.DeductedAgentId, data.Amount, data.ProductId, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.DeductedAgentId, data.Amount, data.ProductId, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + }, tydataAgentCommissionDeductionIdKey) +} + +func (m *defaultAgentCommissionDeductionModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataAgentCommissionDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionDeductionIdPrefix, 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, agentCommissionDeductionRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.DeductedAgentId, data.Amount, data.ProductId, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.DeductedAgentId, data.Amount, data.ProductId, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + }, tydataAgentCommissionDeductionIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentCommissionDeductionModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentCommissionDeduction) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentCommissionDeductionModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentCommissionDeductionModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentCommissionDeductionModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentCommissionDeductionModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentCommissionDeduction, error) { + + builder = builder.Columns(agentCommissionDeductionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommissionDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionDeductionModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommissionDeduction, error) { + + builder = builder.Columns(agentCommissionDeductionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommissionDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionDeductionModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommissionDeduction, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentCommissionDeductionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentCommissionDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentCommissionDeductionModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentCommissionDeduction, error) { + + builder = builder.Columns(agentCommissionDeductionRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommissionDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionDeductionModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentCommissionDeduction, error) { + + builder = builder.Columns(agentCommissionDeductionRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommissionDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionDeductionModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentCommissionDeductionModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentCommissionDeductionModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataAgentCommissionDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionDeductionIdPrefix, 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) + }, tydataAgentCommissionDeductionIdKey) + return err +} +func (m *defaultAgentCommissionDeductionModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentCommissionDeductionIdPrefix, primary) +} +func (m *defaultAgentCommissionDeductionModel) 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", agentCommissionDeductionRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentCommissionDeductionModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentCommissionModel.go b/app/user/model/agentCommissionModel.go new file mode 100644 index 0000000..1b9e614 --- /dev/null +++ b/app/user/model/agentCommissionModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentCommissionModel = (*customAgentCommissionModel)(nil) + +type ( + // AgentCommissionModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentCommissionModel. + AgentCommissionModel interface { + agentCommissionModel + } + + customAgentCommissionModel struct { + *defaultAgentCommissionModel + } +) + +// NewAgentCommissionModel returns a model for the database table. +func NewAgentCommissionModel(conn sqlx.SqlConn, c cache.CacheConf) AgentCommissionModel { + return &customAgentCommissionModel{ + defaultAgentCommissionModel: newAgentCommissionModel(conn, c), + } +} diff --git a/app/user/model/agentCommissionModel_gen.go b/app/user/model/agentCommissionModel_gen.go new file mode 100644 index 0000000..2353856 --- /dev/null +++ b/app/user/model/agentCommissionModel_gen.go @@ -0,0 +1,371 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentCommissionFieldNames = builder.RawFieldNames(&AgentCommission{}) + agentCommissionRows = strings.Join(agentCommissionFieldNames, ",") + agentCommissionRowsExpectAutoSet = strings.Join(stringx.Remove(agentCommissionFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentCommissionRowsWithPlaceHolder = strings.Join(stringx.Remove(agentCommissionFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentCommissionIdPrefix = "cache:tydata:agentCommission:id:" +) + +type ( + agentCommissionModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentCommission) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*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 + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentCommission) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentCommission, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommission, error) + 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 + } + + defaultAgentCommissionModel struct { + sqlc.CachedConn + table string + } + + AgentCommission struct { + Id int64 `db:"id"` + AgentId int64 `db:"agent_id"` + OrderId int64 `db:"order_id"` + Amount float64 `db:"amount"` + ProductId int64 `db:"product_id"` // 产品ID + Status int64 `db:"status"` + 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"` // 版本号 + } +) + +func newAgentCommissionModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentCommissionModel { + return &defaultAgentCommissionModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_commission`", + } +} + +func (m *defaultAgentCommissionModel) Insert(ctx context.Context, session sqlx.Session, data *AgentCommission) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionIdPrefix, 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) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.Amount, data.ProductId, data.Status, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.Amount, data.ProductId, data.Status, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentCommissionIdKey) +} + +func (m *defaultAgentCommissionModel) FindOne(ctx context.Context, id int64) (*AgentCommission, error) { + tydataAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionIdPrefix, id) + var resp AgentCommission + err := m.QueryRowCtx(ctx, &resp, tydataAgentCommissionIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentCommissionRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentCommissionModel) Update(ctx context.Context, session sqlx.Session, data *AgentCommission) (sql.Result, error) { + tydataAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionIdPrefix, 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, agentCommissionRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.Amount, data.ProductId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.Amount, data.ProductId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + }, tydataAgentCommissionIdKey) +} + +func (m *defaultAgentCommissionModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentCommission) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionIdPrefix, 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, agentCommissionRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.Amount, data.ProductId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.OrderId, data.Amount, data.ProductId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + }, tydataAgentCommissionIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentCommissionModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentCommission) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentCommissionModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentCommissionModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentCommissionModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentCommissionModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentCommission, error) { + + builder = builder.Columns(agentCommissionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommission + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommission, error) { + + builder = builder.Columns(agentCommissionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommission + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentCommission, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentCommissionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentCommission + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentCommissionModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentCommission, error) { + + builder = builder.Columns(agentCommissionRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommission + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentCommission, error) { + + builder = builder.Columns(agentCommissionRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentCommission + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentCommissionModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentCommissionModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentCommissionModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataAgentCommissionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentCommissionIdPrefix, 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) + }, tydataAgentCommissionIdKey) + return err +} +func (m *defaultAgentCommissionModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentCommissionIdPrefix, primary) +} +func (m *defaultAgentCommissionModel) 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", agentCommissionRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentCommissionModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentLinkModel.go b/app/user/model/agentLinkModel.go new file mode 100644 index 0000000..ee3c37c --- /dev/null +++ b/app/user/model/agentLinkModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentLinkModel = (*customAgentLinkModel)(nil) + +type ( + // AgentLinkModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentLinkModel. + AgentLinkModel interface { + agentLinkModel + } + + customAgentLinkModel struct { + *defaultAgentLinkModel + } +) + +// NewAgentLinkModel returns a model for the database table. +func NewAgentLinkModel(conn sqlx.SqlConn, c cache.CacheConf) AgentLinkModel { + return &customAgentLinkModel{ + defaultAgentLinkModel: newAgentLinkModel(conn, c), + } +} diff --git a/app/user/model/agentLinkModel_gen.go b/app/user/model/agentLinkModel_gen.go new file mode 100644 index 0000000..1e70f39 --- /dev/null +++ b/app/user/model/agentLinkModel_gen.go @@ -0,0 +1,410 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentLinkFieldNames = builder.RawFieldNames(&AgentLink{}) + agentLinkRows = strings.Join(agentLinkFieldNames, ",") + agentLinkRowsExpectAutoSet = strings.Join(stringx.Remove(agentLinkFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentLinkRowsWithPlaceHolder = strings.Join(stringx.Remove(agentLinkFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentLinkIdPrefix = "cache:tydata:agentLink:id:" + cacheTydataAgentLinkLinkIdentifierPrefix = "cache:tydata:agentLink:linkIdentifier:" +) + +type ( + agentLinkModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentLink) (sql.Result, error) + FindOne(ctx context.Context, id 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 + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentLink) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentLink, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentLink, error) + 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 + } + + defaultAgentLinkModel struct { + sqlc.CachedConn + table string + } + + AgentLink struct { + Id int64 `db:"id"` + ProductId int64 `db:"product_id"` + Price float64 `db:"price"` + UserId int64 `db:"user_id"` + AgentId int64 `db:"agent_id"` + LinkIdentifier string `db:"link_identifier"` + 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"` + } +) + +func newAgentLinkModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentLinkModel { + return &defaultAgentLinkModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_link`", + } +} + +func (m *defaultAgentLinkModel) Insert(ctx context.Context, session sqlx.Session, data *AgentLink) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkIdPrefix, data.Id) + tydataAgentLinkLinkIdentifierKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkLinkIdentifierPrefix, 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) + if session != nil { + return session.ExecCtx(ctx, query, data.ProductId, data.Price, data.UserId, data.AgentId, data.LinkIdentifier, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.ProductId, data.Price, data.UserId, data.AgentId, data.LinkIdentifier, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentLinkIdKey, tydataAgentLinkLinkIdentifierKey) +} + +func (m *defaultAgentLinkModel) FindOne(ctx context.Context, id int64) (*AgentLink, error) { + tydataAgentLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkIdPrefix, id) + var resp AgentLink + err := m.QueryRowCtx(ctx, &resp, tydataAgentLinkIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentLinkRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentLinkModel) FindOneByLinkIdentifier(ctx context.Context, linkIdentifier string) (*AgentLink, error) { + tydataAgentLinkLinkIdentifierKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkLinkIdentifierPrefix, linkIdentifier) + var resp AgentLink + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentLinkLinkIdentifierKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `link_identifier` = ? and del_state = ? limit 1", agentLinkRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, linkIdentifier, 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 *defaultAgentLinkModel) Update(ctx context.Context, session sqlx.Session, newData *AgentLink) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkIdPrefix, data.Id) + tydataAgentLinkLinkIdentifierKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkLinkIdentifierPrefix, data.LinkIdentifier) + 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, agentLinkRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.ProductId, newData.Price, newData.UserId, newData.AgentId, newData.LinkIdentifier, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.ProductId, newData.Price, newData.UserId, newData.AgentId, newData.LinkIdentifier, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentLinkIdKey, tydataAgentLinkLinkIdentifierKey) +} + +func (m *defaultAgentLinkModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentLink) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkIdPrefix, data.Id) + tydataAgentLinkLinkIdentifierKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkLinkIdentifierPrefix, data.LinkIdentifier) + 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, agentLinkRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.ProductId, newData.Price, newData.UserId, newData.AgentId, newData.LinkIdentifier, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.ProductId, newData.Price, newData.UserId, newData.AgentId, newData.LinkIdentifier, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentLinkIdKey, tydataAgentLinkLinkIdentifierKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentLinkModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentLink) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentLinkModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentLinkModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentLinkModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentLinkModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentLink, error) { + + builder = builder.Columns(agentLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentLinkModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentLink, error) { + + builder = builder.Columns(agentLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentLinkModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentLink, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentLinkRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentLinkModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentLink, error) { + + builder = builder.Columns(agentLinkRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentLinkModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentLink, error) { + + builder = builder.Columns(agentLinkRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentLink + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentLinkModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentLinkModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentLinkModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentLinkIdKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkIdPrefix, id) + tydataAgentLinkLinkIdentifierKey := fmt.Sprintf("%s%v", cacheTydataAgentLinkLinkIdentifierPrefix, data.LinkIdentifier) + _, 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) + }, tydataAgentLinkIdKey, tydataAgentLinkLinkIdentifierKey) + return err +} +func (m *defaultAgentLinkModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentLinkIdPrefix, primary) +} +func (m *defaultAgentLinkModel) 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", agentLinkRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentLinkModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentMembershipConfigModel.go b/app/user/model/agentMembershipConfigModel.go new file mode 100644 index 0000000..f1fb428 --- /dev/null +++ b/app/user/model/agentMembershipConfigModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentMembershipConfigModel = (*customAgentMembershipConfigModel)(nil) + +type ( + // AgentMembershipConfigModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentMembershipConfigModel. + AgentMembershipConfigModel interface { + agentMembershipConfigModel + } + + customAgentMembershipConfigModel struct { + *defaultAgentMembershipConfigModel + } +) + +// NewAgentMembershipConfigModel returns a model for the database table. +func NewAgentMembershipConfigModel(conn sqlx.SqlConn, c cache.CacheConf) AgentMembershipConfigModel { + return &customAgentMembershipConfigModel{ + defaultAgentMembershipConfigModel: newAgentMembershipConfigModel(conn, c), + } +} diff --git a/app/user/model/agentMembershipConfigModel_gen.go b/app/user/model/agentMembershipConfigModel_gen.go new file mode 100644 index 0000000..50ccab5 --- /dev/null +++ b/app/user/model/agentMembershipConfigModel_gen.go @@ -0,0 +1,419 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentMembershipConfigFieldNames = builder.RawFieldNames(&AgentMembershipConfig{}) + agentMembershipConfigRows = strings.Join(agentMembershipConfigFieldNames, ",") + agentMembershipConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentMembershipConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentMembershipConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(agentMembershipConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentMembershipConfigIdPrefix = "cache:tydata:agentMembershipConfig:id:" + cacheTydataAgentMembershipConfigLevelNamePrefix = "cache:tydata:agentMembershipConfig:levelName:" +) + +type ( + agentMembershipConfigModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentMembershipConfig) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentMembershipConfig, error) + FindOneByLevelName(ctx context.Context, levelName string) (*AgentMembershipConfig, error) + Update(ctx context.Context, session sqlx.Session, data *AgentMembershipConfig) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentMembershipConfig) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentMembershipConfig) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentMembershipConfig, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipConfig, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipConfig, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentMembershipConfig, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentMembershipConfig, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentMembershipConfigModel struct { + sqlc.CachedConn + table string + } + + AgentMembershipConfig struct { + Id int64 `db:"id"` + LevelName string `db:"level_name"` // 会员级别名称,如 S级,S+级 + Price sql.NullFloat64 `db:"price"` // 会员年费 + ReportCommission sql.NullFloat64 `db:"report_commission"` // 直推报告收益 + LowerActivityReward sql.NullFloat64 `db:"lower_activity_reward"` // 下级活跃奖励金额 + NewActivityReward sql.NullFloat64 `db:"new_activity_reward"` // 新增活跃奖励金额 + LowerStandardCount sql.NullInt64 `db:"lower_standard_count"` // 活跃下级达标个数 + NewLowerStandardCount sql.NullInt64 `db:"new_lower_standard_count"` // 新增活跃下级达标个数 + LowerWithdrawRewardRatio sql.NullFloat64 `db:"lower_withdraw_reward_ratio"` // 下级提现奖励比例 + LowerConvertVipReward sql.NullFloat64 `db:"lower_convert_vip_reward"` // 下级转化VIP奖励 + LowerConvertSvipReward sql.NullFloat64 `db:"lower_convert_svip_reward"` // 下级转化SVIP奖励 + ExemptionAmount sql.NullFloat64 `db:"exemption_amount"` // 免审核金额 + PriceIncreaseMax sql.NullFloat64 `db:"price_increase_max"` // 提价最高金额 + PriceRatio sql.NullFloat64 `db:"price_ratio"` // 提价区间收取比例 + PriceIncreaseAmount sql.NullFloat64 `db:"price_increase_amount"` // 在原本成本上加价的金额 + 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"` + } +) + +func newAgentMembershipConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentMembershipConfigModel { + return &defaultAgentMembershipConfigModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_membership_config`", + } +} + +func (m *defaultAgentMembershipConfigModel) Insert(ctx context.Context, session sqlx.Session, data *AgentMembershipConfig) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentMembershipConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigIdPrefix, data.Id) + tydataAgentMembershipConfigLevelNameKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigLevelNamePrefix, data.LevelName) + 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, agentMembershipConfigRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.LevelName, data.Price, data.ReportCommission, data.LowerActivityReward, data.NewActivityReward, data.LowerStandardCount, data.NewLowerStandardCount, data.LowerWithdrawRewardRatio, data.LowerConvertVipReward, data.LowerConvertSvipReward, data.ExemptionAmount, data.PriceIncreaseMax, data.PriceRatio, data.PriceIncreaseAmount, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.LevelName, data.Price, data.ReportCommission, data.LowerActivityReward, data.NewActivityReward, data.LowerStandardCount, data.NewLowerStandardCount, data.LowerWithdrawRewardRatio, data.LowerConvertVipReward, data.LowerConvertSvipReward, data.ExemptionAmount, data.PriceIncreaseMax, data.PriceRatio, data.PriceIncreaseAmount, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentMembershipConfigIdKey, tydataAgentMembershipConfigLevelNameKey) +} + +func (m *defaultAgentMembershipConfigModel) FindOne(ctx context.Context, id int64) (*AgentMembershipConfig, error) { + tydataAgentMembershipConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigIdPrefix, id) + var resp AgentMembershipConfig + err := m.QueryRowCtx(ctx, &resp, tydataAgentMembershipConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentMembershipConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindOneByLevelName(ctx context.Context, levelName string) (*AgentMembershipConfig, error) { + tydataAgentMembershipConfigLevelNameKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigLevelNamePrefix, levelName) + var resp AgentMembershipConfig + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentMembershipConfigLevelNameKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `level_name` = ? and del_state = ? limit 1", agentMembershipConfigRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, levelName, 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 *defaultAgentMembershipConfigModel) Update(ctx context.Context, session sqlx.Session, newData *AgentMembershipConfig) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentMembershipConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigIdPrefix, data.Id) + tydataAgentMembershipConfigLevelNameKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigLevelNamePrefix, data.LevelName) + 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, agentMembershipConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.LevelName, newData.Price, newData.ReportCommission, newData.LowerActivityReward, newData.NewActivityReward, newData.LowerStandardCount, newData.NewLowerStandardCount, newData.LowerWithdrawRewardRatio, newData.LowerConvertVipReward, newData.LowerConvertSvipReward, newData.ExemptionAmount, newData.PriceIncreaseMax, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.LevelName, newData.Price, newData.ReportCommission, newData.LowerActivityReward, newData.NewActivityReward, newData.LowerStandardCount, newData.NewLowerStandardCount, newData.LowerWithdrawRewardRatio, newData.LowerConvertVipReward, newData.LowerConvertSvipReward, newData.ExemptionAmount, newData.PriceIncreaseMax, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentMembershipConfigIdKey, tydataAgentMembershipConfigLevelNameKey) +} + +func (m *defaultAgentMembershipConfigModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentMembershipConfig) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentMembershipConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigIdPrefix, data.Id) + tydataAgentMembershipConfigLevelNameKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigLevelNamePrefix, data.LevelName) + 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, agentMembershipConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.LevelName, newData.Price, newData.ReportCommission, newData.LowerActivityReward, newData.NewActivityReward, newData.LowerStandardCount, newData.NewLowerStandardCount, newData.LowerWithdrawRewardRatio, newData.LowerConvertVipReward, newData.LowerConvertSvipReward, newData.ExemptionAmount, newData.PriceIncreaseMax, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.LevelName, newData.Price, newData.ReportCommission, newData.LowerActivityReward, newData.NewActivityReward, newData.LowerStandardCount, newData.NewLowerStandardCount, newData.LowerWithdrawRewardRatio, newData.LowerConvertVipReward, newData.LowerConvertSvipReward, newData.ExemptionAmount, newData.PriceIncreaseMax, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentMembershipConfigIdKey, tydataAgentMembershipConfigLevelNameKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentMembershipConfigModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentMembershipConfig) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipConfigModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentMembershipConfigModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentMembershipConfig, error) { + + builder = builder.Columns(agentMembershipConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipConfig, error) { + + builder = builder.Columns(agentMembershipConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipConfig, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentMembershipConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentMembershipConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentMembershipConfig, error) { + + builder = builder.Columns(agentMembershipConfigRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipConfigModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentMembershipConfig, error) { + + builder = builder.Columns(agentMembershipConfigRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipConfigModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentMembershipConfigModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentMembershipConfigModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentMembershipConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigIdPrefix, id) + tydataAgentMembershipConfigLevelNameKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigLevelNamePrefix, data.LevelName) + _, 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) + }, tydataAgentMembershipConfigIdKey, tydataAgentMembershipConfigLevelNameKey) + return err +} +func (m *defaultAgentMembershipConfigModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentMembershipConfigIdPrefix, primary) +} +func (m *defaultAgentMembershipConfigModel) 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", agentMembershipConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentMembershipConfigModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentMembershipRechargeOrderModel.go b/app/user/model/agentMembershipRechargeOrderModel.go new file mode 100644 index 0000000..fb72755 --- /dev/null +++ b/app/user/model/agentMembershipRechargeOrderModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentMembershipRechargeOrderModel = (*customAgentMembershipRechargeOrderModel)(nil) + +type ( + // AgentMembershipRechargeOrderModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentMembershipRechargeOrderModel. + AgentMembershipRechargeOrderModel interface { + agentMembershipRechargeOrderModel + } + + customAgentMembershipRechargeOrderModel struct { + *defaultAgentMembershipRechargeOrderModel + } +) + +// NewAgentMembershipRechargeOrderModel returns a model for the database table. +func NewAgentMembershipRechargeOrderModel(conn sqlx.SqlConn, c cache.CacheConf) AgentMembershipRechargeOrderModel { + return &customAgentMembershipRechargeOrderModel{ + defaultAgentMembershipRechargeOrderModel: newAgentMembershipRechargeOrderModel(conn, c), + } +} diff --git a/app/user/model/agentMembershipRechargeOrderModel_gen.go b/app/user/model/agentMembershipRechargeOrderModel_gen.go new file mode 100644 index 0000000..669e440 --- /dev/null +++ b/app/user/model/agentMembershipRechargeOrderModel_gen.go @@ -0,0 +1,373 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentMembershipRechargeOrderFieldNames = builder.RawFieldNames(&AgentMembershipRechargeOrder{}) + agentMembershipRechargeOrderRows = strings.Join(agentMembershipRechargeOrderFieldNames, ",") + agentMembershipRechargeOrderRowsExpectAutoSet = strings.Join(stringx.Remove(agentMembershipRechargeOrderFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentMembershipRechargeOrderRowsWithPlaceHolder = strings.Join(stringx.Remove(agentMembershipRechargeOrderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentMembershipRechargeOrderIdPrefix = "cache:tydata:agentMembershipRechargeOrder:id:" +) + +type ( + agentMembershipRechargeOrderModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentMembershipRechargeOrder, error) + Update(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentMembershipRechargeOrder, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipRechargeOrder, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipRechargeOrder, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentMembershipRechargeOrder, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentMembershipRechargeOrder, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentMembershipRechargeOrderModel struct { + sqlc.CachedConn + table string + } + + AgentMembershipRechargeOrder struct { + Id int64 `db:"id"` + UserId int64 `db:"user_id"` // 用户ID + AgentId int64 `db:"agent_id"` // 代理ID + LevelName string `db:"level_name"` // 会员级别,如 VIP,SVIP,normal + Amount float64 `db:"amount"` // 充值金额 + PaymentMethod string `db:"payment_method"` // 支付方式:支付宝,微信,苹果支付,其他 + TransactionId string `db:"transaction_id"` // 交易号 + Status int64 `db:"status"` // 充值状态:1 成功,0 失败 + 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"` // 版本号 + } +) + +func newAgentMembershipRechargeOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentMembershipRechargeOrderModel { + return &defaultAgentMembershipRechargeOrderModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_membership_recharge_order`", + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) Insert(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentMembershipRechargeOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipRechargeOrderIdPrefix, 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, agentMembershipRechargeOrderRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.UserId, data.AgentId, data.LevelName, data.Amount, data.PaymentMethod, data.TransactionId, data.Status, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.UserId, data.AgentId, data.LevelName, data.Amount, data.PaymentMethod, data.TransactionId, data.Status, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentMembershipRechargeOrderIdKey) +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindOne(ctx context.Context, id int64) (*AgentMembershipRechargeOrder, error) { + tydataAgentMembershipRechargeOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipRechargeOrderIdPrefix, id) + var resp AgentMembershipRechargeOrder + err := m.QueryRowCtx(ctx, &resp, tydataAgentMembershipRechargeOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentMembershipRechargeOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) Update(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) (sql.Result, error) { + tydataAgentMembershipRechargeOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipRechargeOrderIdPrefix, 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, agentMembershipRechargeOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.UserId, data.AgentId, data.LevelName, data.Amount, data.PaymentMethod, data.TransactionId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + } + return conn.ExecCtx(ctx, query, data.UserId, data.AgentId, data.LevelName, data.Amount, data.PaymentMethod, data.TransactionId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + }, tydataAgentMembershipRechargeOrderIdKey) +} + +func (m *defaultAgentMembershipRechargeOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataAgentMembershipRechargeOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipRechargeOrderIdPrefix, 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, agentMembershipRechargeOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.UserId, data.AgentId, data.LevelName, data.Amount, data.PaymentMethod, data.TransactionId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.UserId, data.AgentId, data.LevelName, data.Amount, data.PaymentMethod, data.TransactionId, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + }, tydataAgentMembershipRechargeOrderIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentMembershipRechargeOrderModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentMembershipRechargeOrder) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipRechargeOrderModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentMembershipRechargeOrder, error) { + + builder = builder.Columns(agentMembershipRechargeOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipRechargeOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipRechargeOrder, error) { + + builder = builder.Columns(agentMembershipRechargeOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipRechargeOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipRechargeOrder, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentMembershipRechargeOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentMembershipRechargeOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentMembershipRechargeOrder, error) { + + builder = builder.Columns(agentMembershipRechargeOrderRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipRechargeOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentMembershipRechargeOrder, error) { + + builder = builder.Columns(agentMembershipRechargeOrderRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipRechargeOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipRechargeOrderModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentMembershipRechargeOrderModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentMembershipRechargeOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataAgentMembershipRechargeOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipRechargeOrderIdPrefix, 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) + }, tydataAgentMembershipRechargeOrderIdKey) + return err +} +func (m *defaultAgentMembershipRechargeOrderModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentMembershipRechargeOrderIdPrefix, primary) +} +func (m *defaultAgentMembershipRechargeOrderModel) 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", agentMembershipRechargeOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentMembershipRechargeOrderModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentMembershipUserConfigModel.go b/app/user/model/agentMembershipUserConfigModel.go new file mode 100644 index 0000000..b5e5a48 --- /dev/null +++ b/app/user/model/agentMembershipUserConfigModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentMembershipUserConfigModel = (*customAgentMembershipUserConfigModel)(nil) + +type ( + // AgentMembershipUserConfigModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentMembershipUserConfigModel. + AgentMembershipUserConfigModel interface { + agentMembershipUserConfigModel + } + + customAgentMembershipUserConfigModel struct { + *defaultAgentMembershipUserConfigModel + } +) + +// NewAgentMembershipUserConfigModel returns a model for the database table. +func NewAgentMembershipUserConfigModel(conn sqlx.SqlConn, c cache.CacheConf) AgentMembershipUserConfigModel { + return &customAgentMembershipUserConfigModel{ + defaultAgentMembershipUserConfigModel: newAgentMembershipUserConfigModel(conn, c), + } +} diff --git a/app/user/model/agentMembershipUserConfigModel_gen.go b/app/user/model/agentMembershipUserConfigModel_gen.go new file mode 100644 index 0000000..540085c --- /dev/null +++ b/app/user/model/agentMembershipUserConfigModel_gen.go @@ -0,0 +1,412 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentMembershipUserConfigFieldNames = builder.RawFieldNames(&AgentMembershipUserConfig{}) + agentMembershipUserConfigRows = strings.Join(agentMembershipUserConfigFieldNames, ",") + agentMembershipUserConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentMembershipUserConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentMembershipUserConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(agentMembershipUserConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentMembershipUserConfigIdPrefix = "cache:tydata:agentMembershipUserConfig:id:" + cacheTydataAgentMembershipUserConfigAgentIdProductIdPrefix = "cache:tydata:agentMembershipUserConfig:agentId:productId:" +) + +type ( + agentMembershipUserConfigModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentMembershipUserConfig) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentMembershipUserConfig, error) + FindOneByAgentIdProductId(ctx context.Context, agentId int64, productId int64) (*AgentMembershipUserConfig, error) + Update(ctx context.Context, session sqlx.Session, data *AgentMembershipUserConfig) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentMembershipUserConfig) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentMembershipUserConfig) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentMembershipUserConfig, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipUserConfig, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipUserConfig, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentMembershipUserConfig, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentMembershipUserConfig, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentMembershipUserConfigModel struct { + sqlc.CachedConn + table string + } + + AgentMembershipUserConfig struct { + Id int64 `db:"id"` + UserId int64 `db:"user_id"` // 用户ID,标识代理用户 + AgentId int64 `db:"agent_id"` // 代理ID + ProductId int64 `db:"product_id"` // 产品ID + PriceRangeFrom float64 `db:"price_range_from"` // 定价区间最低 + PriceRangeTo float64 `db:"price_range_to"` // 定价区间最高 + PriceRatio float64 `db:"price_ratio"` // 定价区间收取比例 + PriceIncreaseAmount float64 `db:"price_increase_amount"` // 在原本成本上加价的金额 + 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"` // 版本号 + } +) + +func newAgentMembershipUserConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentMembershipUserConfigModel { + return &defaultAgentMembershipUserConfigModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_membership_user_config`", + } +} + +func (m *defaultAgentMembershipUserConfigModel) Insert(ctx context.Context, session sqlx.Session, data *AgentMembershipUserConfig) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentMembershipUserConfigAgentIdProductIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentMembershipUserConfigAgentIdProductIdPrefix, data.AgentId, data.ProductId) + tydataAgentMembershipUserConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipUserConfigIdPrefix, 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, agentMembershipUserConfigRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.UserId, data.AgentId, data.ProductId, data.PriceRangeFrom, data.PriceRangeTo, data.PriceRatio, data.PriceIncreaseAmount, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.UserId, data.AgentId, data.ProductId, data.PriceRangeFrom, data.PriceRangeTo, data.PriceRatio, data.PriceIncreaseAmount, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentMembershipUserConfigAgentIdProductIdKey, tydataAgentMembershipUserConfigIdKey) +} + +func (m *defaultAgentMembershipUserConfigModel) FindOne(ctx context.Context, id int64) (*AgentMembershipUserConfig, error) { + tydataAgentMembershipUserConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipUserConfigIdPrefix, id) + var resp AgentMembershipUserConfig + err := m.QueryRowCtx(ctx, &resp, tydataAgentMembershipUserConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentMembershipUserConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindOneByAgentIdProductId(ctx context.Context, agentId int64, productId int64) (*AgentMembershipUserConfig, error) { + tydataAgentMembershipUserConfigAgentIdProductIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentMembershipUserConfigAgentIdProductIdPrefix, agentId, productId) + var resp AgentMembershipUserConfig + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentMembershipUserConfigAgentIdProductIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `agent_id` = ? and `product_id` = ? and del_state = ? limit 1", agentMembershipUserConfigRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, agentId, productId, 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 *defaultAgentMembershipUserConfigModel) Update(ctx context.Context, session sqlx.Session, newData *AgentMembershipUserConfig) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentMembershipUserConfigAgentIdProductIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentMembershipUserConfigAgentIdProductIdPrefix, data.AgentId, data.ProductId) + tydataAgentMembershipUserConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipUserConfigIdPrefix, 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, agentMembershipUserConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.UserId, newData.AgentId, newData.ProductId, newData.PriceRangeFrom, newData.PriceRangeTo, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.UserId, newData.AgentId, newData.ProductId, newData.PriceRangeFrom, newData.PriceRangeTo, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentMembershipUserConfigAgentIdProductIdKey, tydataAgentMembershipUserConfigIdKey) +} + +func (m *defaultAgentMembershipUserConfigModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentMembershipUserConfig) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentMembershipUserConfigAgentIdProductIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentMembershipUserConfigAgentIdProductIdPrefix, data.AgentId, data.ProductId) + tydataAgentMembershipUserConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipUserConfigIdPrefix, 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, agentMembershipUserConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.UserId, newData.AgentId, newData.ProductId, newData.PriceRangeFrom, newData.PriceRangeTo, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.UserId, newData.AgentId, newData.ProductId, newData.PriceRangeFrom, newData.PriceRangeTo, newData.PriceRatio, newData.PriceIncreaseAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentMembershipUserConfigAgentIdProductIdKey, tydataAgentMembershipUserConfigIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentMembershipUserConfigModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentMembershipUserConfig) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentMembershipUserConfigModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentMembershipUserConfigModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentMembershipUserConfig, error) { + + builder = builder.Columns(agentMembershipUserConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipUserConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipUserConfig, error) { + + builder = builder.Columns(agentMembershipUserConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipUserConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentMembershipUserConfig, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentMembershipUserConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentMembershipUserConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentMembershipUserConfig, error) { + + builder = builder.Columns(agentMembershipUserConfigRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipUserConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentMembershipUserConfig, error) { + + builder = builder.Columns(agentMembershipUserConfigRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentMembershipUserConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentMembershipUserConfigModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentMembershipUserConfigModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentMembershipUserConfigModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentMembershipUserConfigAgentIdProductIdKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentMembershipUserConfigAgentIdProductIdPrefix, data.AgentId, data.ProductId) + tydataAgentMembershipUserConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentMembershipUserConfigIdPrefix, 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) + }, tydataAgentMembershipUserConfigAgentIdProductIdKey, tydataAgentMembershipUserConfigIdKey) + return err +} +func (m *defaultAgentMembershipUserConfigModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentMembershipUserConfigIdPrefix, primary) +} +func (m *defaultAgentMembershipUserConfigModel) 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", agentMembershipUserConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentMembershipUserConfigModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentModel.go b/app/user/model/agentModel.go new file mode 100644 index 0000000..2aef816 --- /dev/null +++ b/app/user/model/agentModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentModel = (*customAgentModel)(nil) + +type ( + // AgentModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentModel. + AgentModel interface { + agentModel + } + + customAgentModel struct { + *defaultAgentModel + } +) + +// NewAgentModel returns a model for the database table. +func NewAgentModel(conn sqlx.SqlConn, c cache.CacheConf) AgentModel { + return &customAgentModel{ + defaultAgentModel: newAgentModel(conn, c), + } +} diff --git a/app/user/model/agentModel_gen.go b/app/user/model/agentModel_gen.go new file mode 100644 index 0000000..01aae09 --- /dev/null +++ b/app/user/model/agentModel_gen.go @@ -0,0 +1,437 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentFieldNames = builder.RawFieldNames(&Agent{}) + agentRows = strings.Join(agentFieldNames, ",") + agentRowsExpectAutoSet = strings.Join(stringx.Remove(agentFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentRowsWithPlaceHolder = strings.Join(stringx.Remove(agentFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentIdPrefix = "cache:tydata:agent:id:" + cacheTydataAgentMobilePrefix = "cache:tydata:agent:mobile:" + cacheTydataAgentUserIdPrefix = "cache:tydata: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) + FindOneByMobile(ctx context.Context, mobile string) (*Agent, error) + FindOneByUserId(ctx context.Context, userId int64) (*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 + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *Agent) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*Agent, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Agent, error) + 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 + } + + defaultAgentModel struct { + sqlc.CachedConn + table string + } + + Agent struct { + Id int64 `db:"id"` + UserId int64 `db:"user_id"` + LevelName string `db:"level_name"` // 代理等级 + Region string `db:"region"` + Mobile string `db:"mobile"` + WechatId sql.NullString `db:"wechat_id"` + MembershipExpiryTime sql.NullTime `db:"membership_expiry_time"` // 会员过期时间 + 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"` // 版本号 + } +) + +func newAgentModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentModel { + return &defaultAgentModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent`", + } +} + +func (m *defaultAgentModel) Insert(ctx context.Context, session sqlx.Session, data *Agent) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentIdPrefix, data.Id) + tydataAgentMobileKey := fmt.Sprintf("%s%v", cacheTydataAgentMobilePrefix, data.Mobile) + tydataAgentUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentUserIdPrefix, 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) + if session != nil { + return session.ExecCtx(ctx, query, data.UserId, data.LevelName, data.Region, data.Mobile, data.WechatId, data.MembershipExpiryTime, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.UserId, data.LevelName, data.Region, data.Mobile, data.WechatId, data.MembershipExpiryTime, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentIdKey, tydataAgentMobileKey, tydataAgentUserIdKey) +} + +func (m *defaultAgentModel) FindOne(ctx context.Context, id int64) (*Agent, error) { + tydataAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentIdPrefix, id) + var resp Agent + err := m.QueryRowCtx(ctx, &resp, tydataAgentIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentModel) FindOneByMobile(ctx context.Context, mobile string) (*Agent, error) { + tydataAgentMobileKey := fmt.Sprintf("%s%v", cacheTydataAgentMobilePrefix, mobile) + var resp Agent + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentMobileKey, 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", agentRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, mobile, 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 int64) (*Agent, error) { + tydataAgentUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentUserIdPrefix, userId) + var resp Agent + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentUserIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `user_id` = ? and del_state = ? limit 1", agentRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, userId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentModel) Update(ctx context.Context, session sqlx.Session, newData *Agent) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentIdPrefix, data.Id) + tydataAgentMobileKey := fmt.Sprintf("%s%v", cacheTydataAgentMobilePrefix, data.Mobile) + tydataAgentUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentUserIdPrefix, 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.LevelName, newData.Region, newData.Mobile, newData.WechatId, newData.MembershipExpiryTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.UserId, newData.LevelName, newData.Region, newData.Mobile, newData.WechatId, newData.MembershipExpiryTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentIdKey, tydataAgentMobileKey, tydataAgentUserIdKey) +} + +func (m *defaultAgentModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Agent) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentIdPrefix, data.Id) + tydataAgentMobileKey := fmt.Sprintf("%s%v", cacheTydataAgentMobilePrefix, data.Mobile) + tydataAgentUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentUserIdPrefix, 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.LevelName, newData.Region, newData.Mobile, newData.WechatId, newData.MembershipExpiryTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.UserId, newData.LevelName, newData.Region, newData.Mobile, newData.WechatId, newData.MembershipExpiryTime, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentIdKey, tydataAgentMobileKey, tydataAgentUserIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *Agent) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*Agent, error) { + + builder = builder.Columns(agentRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*Agent + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Agent, error) { + + builder = builder.Columns(agentRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*Agent + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Agent, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*Agent + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Agent, error) { + + builder = builder.Columns(agentRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*Agent + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Agent, error) { + + builder = builder.Columns(agentRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*Agent + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentIdPrefix, id) + tydataAgentMobileKey := fmt.Sprintf("%s%v", cacheTydataAgentMobilePrefix, data.Mobile) + tydataAgentUserIdKey := fmt.Sprintf("%s%v", cacheTydataAgentUserIdPrefix, data.UserId) + _, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("delete from %s where `id` = ?", m.table) + if session != nil { + return session.ExecCtx(ctx, query, id) + } + return conn.ExecCtx(ctx, query, id) + }, tydataAgentIdKey, tydataAgentMobileKey, tydataAgentUserIdKey) + return err +} +func (m *defaultAgentModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentIdPrefix, primary) +} +func (m *defaultAgentModel) 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", agentRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentOrderModel.go b/app/user/model/agentOrderModel.go new file mode 100644 index 0000000..00ded5e --- /dev/null +++ b/app/user/model/agentOrderModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentOrderModel = (*customAgentOrderModel)(nil) + +type ( + // AgentOrderModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentOrderModel. + AgentOrderModel interface { + agentOrderModel + } + + customAgentOrderModel struct { + *defaultAgentOrderModel + } +) + +// NewAgentOrderModel returns a model for the database table. +func NewAgentOrderModel(conn sqlx.SqlConn, c cache.CacheConf) AgentOrderModel { + return &customAgentOrderModel{ + defaultAgentOrderModel: newAgentOrderModel(conn, c), + } +} diff --git a/app/user/model/agentOrderModel_gen.go b/app/user/model/agentOrderModel_gen.go new file mode 100644 index 0000000..81a56d9 --- /dev/null +++ b/app/user/model/agentOrderModel_gen.go @@ -0,0 +1,407 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentOrderFieldNames = builder.RawFieldNames(&AgentOrder{}) + agentOrderRows = strings.Join(agentOrderFieldNames, ",") + agentOrderRowsExpectAutoSet = strings.Join(stringx.Remove(agentOrderFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentOrderRowsWithPlaceHolder = strings.Join(stringx.Remove(agentOrderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentOrderIdPrefix = "cache:tydata:agentOrder:id:" + cacheTydataAgentOrderOrderIdPrefix = "cache:tydata:agentOrder:orderId:" +) + +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) + 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 + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentOrder) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentOrder, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentOrder, error) + 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 + } + + defaultAgentOrderModel struct { + sqlc.CachedConn + table string + } + + AgentOrder struct { + Id int64 `db:"id"` + OrderId int64 `db:"order_id"` + AgentId int64 `db:"agent_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"` + } +) + +func newAgentOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentOrderModel { + return &defaultAgentOrderModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_order`", + } +} + +func (m *defaultAgentOrderModel) Insert(ctx context.Context, session sqlx.Session, data *AgentOrder) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderIdPrefix, data.Id) + tydataAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderOrderIdPrefix, 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) + if session != nil { + return session.ExecCtx(ctx, query, data.OrderId, data.AgentId, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.OrderId, data.AgentId, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentOrderIdKey, tydataAgentOrderOrderIdKey) +} + +func (m *defaultAgentOrderModel) FindOne(ctx context.Context, id int64) (*AgentOrder, error) { + tydataAgentOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderIdPrefix, id) + var resp AgentOrder + err := m.QueryRowCtx(ctx, &resp, tydataAgentOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentOrderModel) FindOneByOrderId(ctx context.Context, orderId int64) (*AgentOrder, error) { + tydataAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderOrderIdPrefix, orderId) + var resp AgentOrder + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentOrderOrderIdKey, 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", agentOrderRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, orderId, globalkey.DelStateNo); err != nil { + return nil, err + } + return resp.Id, nil + }, m.queryPrimary) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentOrderModel) Update(ctx context.Context, session sqlx.Session, newData *AgentOrder) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderIdPrefix, data.Id) + tydataAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderOrderIdPrefix, 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, agentOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.OrderId, newData.AgentId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.OrderId, newData.AgentId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentOrderIdKey, tydataAgentOrderOrderIdKey) +} + +func (m *defaultAgentOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentOrder) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderIdPrefix, data.Id) + tydataAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderOrderIdPrefix, 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, agentOrderRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.OrderId, newData.AgentId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.OrderId, newData.AgentId, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentOrderIdKey, tydataAgentOrderOrderIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentOrderModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentOrder) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentOrderModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentOrderModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentOrderModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentOrderModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentOrder, error) { + + builder = builder.Columns(agentOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentOrderModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentOrder, error) { + + builder = builder.Columns(agentOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentOrderModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentOrder, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentOrderRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentOrderModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentOrder, error) { + + builder = builder.Columns(agentOrderRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentOrderModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentOrder, error) { + + builder = builder.Columns(agentOrderRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentOrder + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentOrderModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentOrderModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderIdPrefix, id) + tydataAgentOrderOrderIdKey := fmt.Sprintf("%s%v", cacheTydataAgentOrderOrderIdPrefix, 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) + }, tydataAgentOrderIdKey, tydataAgentOrderOrderIdKey) + return err +} +func (m *defaultAgentOrderModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentOrderIdPrefix, primary) +} +func (m *defaultAgentOrderModel) 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", agentOrderRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentOrderModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentPlatformDeductionModel.go b/app/user/model/agentPlatformDeductionModel.go new file mode 100644 index 0000000..4d64e31 --- /dev/null +++ b/app/user/model/agentPlatformDeductionModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentPlatformDeductionModel = (*customAgentPlatformDeductionModel)(nil) + +type ( + // AgentPlatformDeductionModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentPlatformDeductionModel. + AgentPlatformDeductionModel interface { + agentPlatformDeductionModel + } + + customAgentPlatformDeductionModel struct { + *defaultAgentPlatformDeductionModel + } +) + +// NewAgentPlatformDeductionModel returns a model for the database table. +func NewAgentPlatformDeductionModel(conn sqlx.SqlConn, c cache.CacheConf) AgentPlatformDeductionModel { + return &customAgentPlatformDeductionModel{ + defaultAgentPlatformDeductionModel: newAgentPlatformDeductionModel(conn, c), + } +} diff --git a/app/user/model/agentPlatformDeductionModel_gen.go b/app/user/model/agentPlatformDeductionModel_gen.go new file mode 100644 index 0000000..aa1f7d8 --- /dev/null +++ b/app/user/model/agentPlatformDeductionModel_gen.go @@ -0,0 +1,370 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentPlatformDeductionFieldNames = builder.RawFieldNames(&AgentPlatformDeduction{}) + agentPlatformDeductionRows = strings.Join(agentPlatformDeductionFieldNames, ",") + agentPlatformDeductionRowsExpectAutoSet = strings.Join(stringx.Remove(agentPlatformDeductionFieldNames, "`create_time`", "`update_time`"), ",") + agentPlatformDeductionRowsWithPlaceHolder = strings.Join(stringx.Remove(agentPlatformDeductionFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentPlatformDeductionIdPrefix = "cache:tydata:agentPlatformDeduction:id:" +) + +type ( + agentPlatformDeductionModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentPlatformDeduction, error) + Update(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentPlatformDeduction, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentPlatformDeduction, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentPlatformDeduction, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentPlatformDeduction, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentPlatformDeduction, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentPlatformDeductionModel struct { + sqlc.CachedConn + table string + } + + AgentPlatformDeduction struct { + Id int64 `db:"id"` + AgentId int64 `db:"agent_id"` // 被抽佣代理ID + Amount float64 `db:"amount"` + Type string `db:"type"` + Status int64 `db:"status"` // 状态 + 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"` // 版本号 + } +) + +func newAgentPlatformDeductionModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentPlatformDeductionModel { + return &defaultAgentPlatformDeductionModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_platform_deduction`", + } +} + +func (m *defaultAgentPlatformDeductionModel) Insert(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentPlatformDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentPlatformDeductionRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentPlatformDeductionIdKey) +} + +func (m *defaultAgentPlatformDeductionModel) FindOne(ctx context.Context, id int64) (*AgentPlatformDeduction, error) { + tydataAgentPlatformDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, id) + var resp AgentPlatformDeduction + err := m.QueryRowCtx(ctx, &resp, tydataAgentPlatformDeductionIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentPlatformDeductionRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentPlatformDeductionModel) Update(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) (sql.Result, error) { + tydataAgentPlatformDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, agentPlatformDeductionRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id) + }, tydataAgentPlatformDeductionIdKey) +} + +func (m *defaultAgentPlatformDeductionModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataAgentPlatformDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, 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, agentPlatformDeductionRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.Amount, data.Type, data.Status, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + }, tydataAgentPlatformDeductionIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentPlatformDeductionModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentPlatformDeduction) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentPlatformDeductionModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentPlatformDeductionModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentPlatformDeductionModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentPlatformDeductionModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentPlatformDeduction, error) { + + builder = builder.Columns(agentPlatformDeductionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentPlatformDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentPlatformDeductionModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentPlatformDeduction, error) { + + builder = builder.Columns(agentPlatformDeductionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentPlatformDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentPlatformDeductionModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentPlatformDeduction, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentPlatformDeductionRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentPlatformDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentPlatformDeductionModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentPlatformDeduction, error) { + + builder = builder.Columns(agentPlatformDeductionRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentPlatformDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentPlatformDeductionModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentPlatformDeduction, error) { + + builder = builder.Columns(agentPlatformDeductionRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentPlatformDeduction + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentPlatformDeductionModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentPlatformDeductionModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentPlatformDeductionModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataAgentPlatformDeductionIdKey := fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, 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) + }, tydataAgentPlatformDeductionIdKey) + return err +} +func (m *defaultAgentPlatformDeductionModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentPlatformDeductionIdPrefix, primary) +} +func (m *defaultAgentPlatformDeductionModel) 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", agentPlatformDeductionRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentPlatformDeductionModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentProductConfigModel.go b/app/user/model/agentProductConfigModel.go new file mode 100644 index 0000000..de56af8 --- /dev/null +++ b/app/user/model/agentProductConfigModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentProductConfigModel = (*customAgentProductConfigModel)(nil) + +type ( + // AgentProductConfigModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentProductConfigModel. + AgentProductConfigModel interface { + agentProductConfigModel + } + + customAgentProductConfigModel struct { + *defaultAgentProductConfigModel + } +) + +// NewAgentProductConfigModel returns a model for the database table. +func NewAgentProductConfigModel(conn sqlx.SqlConn, c cache.CacheConf) AgentProductConfigModel { + return &customAgentProductConfigModel{ + defaultAgentProductConfigModel: newAgentProductConfigModel(conn, c), + } +} diff --git a/app/user/model/agentProductConfigModel_gen.go b/app/user/model/agentProductConfigModel_gen.go new file mode 100644 index 0000000..2193eec --- /dev/null +++ b/app/user/model/agentProductConfigModel_gen.go @@ -0,0 +1,411 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentProductConfigFieldNames = builder.RawFieldNames(&AgentProductConfig{}) + agentProductConfigRows = strings.Join(agentProductConfigFieldNames, ",") + agentProductConfigRowsExpectAutoSet = strings.Join(stringx.Remove(agentProductConfigFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentProductConfigRowsWithPlaceHolder = strings.Join(stringx.Remove(agentProductConfigFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentProductConfigIdPrefix = "cache:tydata:agentProductConfig:id:" + cacheTydataAgentProductConfigProductIdPrefix = "cache:tydata:agentProductConfig:productId:" +) + +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) + 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 + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentProductConfig) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentProductConfig, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentProductConfig, error) + 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 + } + + defaultAgentProductConfigModel struct { + sqlc.CachedConn + table string + } + + AgentProductConfig struct { + Id int64 `db:"id"` + ProductId int64 `db:"product_id"` // 产品ID + CostPrice float64 `db:"cost_price"` // 成本价 + PriceRangeMin float64 `db:"price_range_min"` // 定价区间最低 + PriceRangeMax float64 `db:"price_range_max"` // 定价区间最高 + PricingStandard float64 `db:"pricing_standard"` // 定价标准 + OverpricingRatio float64 `db:"overpricing_ratio"` // 超定价标准收费比例 + 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"` // 版本号 + } +) + +func newAgentProductConfigModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentProductConfigModel { + return &defaultAgentProductConfigModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_product_config`", + } +} + +func (m *defaultAgentProductConfigModel) Insert(ctx context.Context, session sqlx.Session, data *AgentProductConfig) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigIdPrefix, data.Id) + tydataAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigProductIdPrefix, 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) + if session != nil { + return session.ExecCtx(ctx, query, data.ProductId, data.CostPrice, data.PriceRangeMin, data.PriceRangeMax, data.PricingStandard, data.OverpricingRatio, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.ProductId, data.CostPrice, data.PriceRangeMin, data.PriceRangeMax, data.PricingStandard, data.OverpricingRatio, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentProductConfigIdKey, tydataAgentProductConfigProductIdKey) +} + +func (m *defaultAgentProductConfigModel) FindOne(ctx context.Context, id int64) (*AgentProductConfig, error) { + tydataAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigIdPrefix, id) + var resp AgentProductConfig + err := m.QueryRowCtx(ctx, &resp, tydataAgentProductConfigIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentProductConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentProductConfigModel) FindOneByProductId(ctx context.Context, productId int64) (*AgentProductConfig, error) { + tydataAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigProductIdPrefix, productId) + var resp AgentProductConfig + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentProductConfigProductIdKey, 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 del_state = ? limit 1", agentProductConfigRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, productId, 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 *defaultAgentProductConfigModel) Update(ctx context.Context, session sqlx.Session, newData *AgentProductConfig) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigIdPrefix, data.Id) + tydataAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigProductIdPrefix, data.ProductId) + 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, agentProductConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.ProductId, newData.CostPrice, newData.PriceRangeMin, newData.PriceRangeMax, newData.PricingStandard, newData.OverpricingRatio, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.ProductId, newData.CostPrice, newData.PriceRangeMin, newData.PriceRangeMax, newData.PricingStandard, newData.OverpricingRatio, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentProductConfigIdKey, tydataAgentProductConfigProductIdKey) +} + +func (m *defaultAgentProductConfigModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentProductConfig) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigIdPrefix, data.Id) + tydataAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigProductIdPrefix, data.ProductId) + 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, agentProductConfigRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.ProductId, newData.CostPrice, newData.PriceRangeMin, newData.PriceRangeMax, newData.PricingStandard, newData.OverpricingRatio, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.ProductId, newData.CostPrice, newData.PriceRangeMin, newData.PriceRangeMax, newData.PricingStandard, newData.OverpricingRatio, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentProductConfigIdKey, tydataAgentProductConfigProductIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentProductConfigModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentProductConfig) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentProductConfigModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentProductConfigModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentProductConfigModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentProductConfigModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentProductConfig, error) { + + builder = builder.Columns(agentProductConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentProductConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentProductConfigModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentProductConfig, error) { + + builder = builder.Columns(agentProductConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentProductConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentProductConfigModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentProductConfig, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentProductConfigRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentProductConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentProductConfigModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentProductConfig, error) { + + builder = builder.Columns(agentProductConfigRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentProductConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentProductConfigModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentProductConfig, error) { + + builder = builder.Columns(agentProductConfigRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentProductConfig + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentProductConfigModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentProductConfigModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentProductConfigModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentProductConfigIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigIdPrefix, id) + tydataAgentProductConfigProductIdKey := fmt.Sprintf("%s%v", cacheTydataAgentProductConfigProductIdPrefix, data.ProductId) + _, 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) + }, tydataAgentProductConfigIdKey, tydataAgentProductConfigProductIdKey) + return err +} +func (m *defaultAgentProductConfigModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentProductConfigIdPrefix, primary) +} +func (m *defaultAgentProductConfigModel) 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", agentProductConfigRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentProductConfigModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentRewardsModel.go b/app/user/model/agentRewardsModel.go new file mode 100644 index 0000000..a1e937b --- /dev/null +++ b/app/user/model/agentRewardsModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentRewardsModel = (*customAgentRewardsModel)(nil) + +type ( + // AgentRewardsModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentRewardsModel. + AgentRewardsModel interface { + agentRewardsModel + } + + customAgentRewardsModel struct { + *defaultAgentRewardsModel + } +) + +// NewAgentRewardsModel returns a model for the database table. +func NewAgentRewardsModel(conn sqlx.SqlConn, c cache.CacheConf) AgentRewardsModel { + return &customAgentRewardsModel{ + defaultAgentRewardsModel: newAgentRewardsModel(conn, c), + } +} diff --git a/app/user/model/agentRewardsModel_gen.go b/app/user/model/agentRewardsModel_gen.go new file mode 100644 index 0000000..1502f71 --- /dev/null +++ b/app/user/model/agentRewardsModel_gen.go @@ -0,0 +1,370 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentRewardsFieldNames = builder.RawFieldNames(&AgentRewards{}) + agentRewardsRows = strings.Join(agentRewardsFieldNames, ",") + agentRewardsRowsExpectAutoSet = strings.Join(stringx.Remove(agentRewardsFieldNames, "`create_time`", "`update_time`"), ",") + agentRewardsRowsWithPlaceHolder = strings.Join(stringx.Remove(agentRewardsFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentRewardsIdPrefix = "cache:tydata:agentRewards:id:" +) + +type ( + agentRewardsModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentRewards) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentRewards, error) + Update(ctx context.Context, session sqlx.Session, data *AgentRewards) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentRewards) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentRewards) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentRewards, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRewards, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRewards, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentRewards, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentRewards, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentRewardsModel struct { + sqlc.CachedConn + table string + } + + AgentRewards struct { + Id int64 `db:"id"` + AgentId int64 `db:"agent_id"` + RelationAgentId sql.NullInt64 `db:"relation_agent_id"` // 关联代理ID + Amount float64 `db:"amount"` + Type string `db:"type"` + 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"` // 版本号 + } +) + +func newAgentRewardsModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentRewardsModel { + return &defaultAgentRewardsModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_rewards`", + } +} + +func (m *defaultAgentRewardsModel) Insert(ctx context.Context, session sqlx.Session, data *AgentRewards) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentRewardsIdKey := fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentRewardsRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentRewardsIdKey) +} + +func (m *defaultAgentRewardsModel) FindOne(ctx context.Context, id int64) (*AgentRewards, error) { + tydataAgentRewardsIdKey := fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, id) + var resp AgentRewards + err := m.QueryRowCtx(ctx, &resp, tydataAgentRewardsIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentRewardsRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentRewardsModel) Update(ctx context.Context, session sqlx.Session, data *AgentRewards) (sql.Result, error) { + tydataAgentRewardsIdKey := fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, data.Id) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, agentRewardsRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version, data.Id) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version, data.Id) + }, tydataAgentRewardsIdKey) +} + +func (m *defaultAgentRewardsModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentRewards) error { + + oldVersion := data.Version + data.Version += 1 + + var sqlResult sql.Result + var err error + + tydataAgentRewardsIdKey := fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, 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, agentRewardsRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.RelationAgentId, data.Amount, data.Type, data.DeleteTime, data.DelState, data.Version, data.Id, oldVersion) + }, tydataAgentRewardsIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentRewardsModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentRewards) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentRewardsModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentRewardsModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentRewardsModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentRewardsModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentRewards, error) { + + builder = builder.Columns(agentRewardsRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentRewards + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentRewardsModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRewards, error) { + + builder = builder.Columns(agentRewardsRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentRewards + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentRewardsModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentRewards, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentRewardsRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentRewards + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentRewardsModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentRewards, error) { + + builder = builder.Columns(agentRewardsRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentRewards + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentRewardsModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentRewards, error) { + + builder = builder.Columns(agentRewardsRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentRewards + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentRewardsModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentRewardsModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentRewardsModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + tydataAgentRewardsIdKey := fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, 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) + }, tydataAgentRewardsIdKey) + return err +} +func (m *defaultAgentRewardsModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentRewardsIdPrefix, primary) +} +func (m *defaultAgentRewardsModel) 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", agentRewardsRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentRewardsModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentWalletModel.go b/app/user/model/agentWalletModel.go new file mode 100644 index 0000000..1583c4d --- /dev/null +++ b/app/user/model/agentWalletModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentWalletModel = (*customAgentWalletModel)(nil) + +type ( + // AgentWalletModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentWalletModel. + AgentWalletModel interface { + agentWalletModel + } + + customAgentWalletModel struct { + *defaultAgentWalletModel + } +) + +// NewAgentWalletModel returns a model for the database table. +func NewAgentWalletModel(conn sqlx.SqlConn, c cache.CacheConf) AgentWalletModel { + return &customAgentWalletModel{ + defaultAgentWalletModel: newAgentWalletModel(conn, c), + } +} diff --git a/app/user/model/agentWalletModel_gen.go b/app/user/model/agentWalletModel_gen.go new file mode 100644 index 0000000..8db881b --- /dev/null +++ b/app/user/model/agentWalletModel_gen.go @@ -0,0 +1,410 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentWalletFieldNames = builder.RawFieldNames(&AgentWallet{}) + agentWalletRows = strings.Join(agentWalletFieldNames, ",") + agentWalletRowsExpectAutoSet = strings.Join(stringx.Remove(agentWalletFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentWalletRowsWithPlaceHolder = strings.Join(stringx.Remove(agentWalletFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentWalletIdPrefix = "cache:tydata:agentWallet:id:" + cacheTydataAgentWalletAgentIdPrefix = "cache:tydata:agentWallet:agentId:" +) + +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) + 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 + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentWallet) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentWallet, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWallet, error) + 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 + } + + defaultAgentWalletModel struct { + sqlc.CachedConn + table string + } + + AgentWallet struct { + Id int64 `db:"id"` + AgentId int64 `db:"agent_id"` + Balance float64 `db:"balance"` + FrozenBalance float64 `db:"frozen_balance"` + TotalEarnings float64 `db:"total_earnings"` + WithdrawnAmount float64 `db:"withdrawn_amount"` + 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"` // 版本号 + } +) + +func newAgentWalletModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentWalletModel { + return &defaultAgentWalletModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_wallet`", + } +} + +func (m *defaultAgentWalletModel) Insert(ctx context.Context, session sqlx.Session, data *AgentWallet) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletAgentIdPrefix, data.AgentId) + tydataAgentWalletIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletIdPrefix, 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) + 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 conn.ExecCtx(ctx, query, data.AgentId, data.Balance, data.FrozenBalance, data.TotalEarnings, data.WithdrawnAmount, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentWalletAgentIdKey, tydataAgentWalletIdKey) +} + +func (m *defaultAgentWalletModel) FindOne(ctx context.Context, id int64) (*AgentWallet, error) { + tydataAgentWalletIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletIdPrefix, id) + var resp AgentWallet + err := m.QueryRowCtx(ctx, &resp, tydataAgentWalletIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentWalletRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentWalletModel) FindOneByAgentId(ctx context.Context, agentId int64) (*AgentWallet, error) { + tydataAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletAgentIdPrefix, agentId) + var resp AgentWallet + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentWalletAgentIdKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `agent_id` = ? and del_state = ? limit 1", agentWalletRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, agentId, 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 *defaultAgentWalletModel) Update(ctx context.Context, session sqlx.Session, newData *AgentWallet) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletAgentIdPrefix, data.AgentId) + tydataAgentWalletIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletIdPrefix, 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, agentWalletRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.Balance, newData.FrozenBalance, newData.TotalEarnings, newData.WithdrawnAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.Balance, newData.FrozenBalance, newData.TotalEarnings, newData.WithdrawnAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentWalletAgentIdKey, tydataAgentWalletIdKey) +} + +func (m *defaultAgentWalletModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentWallet) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletAgentIdPrefix, data.AgentId) + tydataAgentWalletIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletIdPrefix, 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, agentWalletRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.Balance, newData.FrozenBalance, newData.TotalEarnings, newData.WithdrawnAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.Balance, newData.FrozenBalance, newData.TotalEarnings, newData.WithdrawnAmount, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentWalletAgentIdKey, tydataAgentWalletIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentWalletModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentWallet) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentWalletModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentWalletModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentWalletModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentWalletModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentWallet, error) { + + builder = builder.Columns(agentWalletRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWallet + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWalletModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWallet, error) { + + builder = builder.Columns(agentWalletRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWallet + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWalletModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWallet, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentWalletRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentWallet + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentWalletModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentWallet, error) { + + builder = builder.Columns(agentWalletRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWallet + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWalletModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentWallet, error) { + + builder = builder.Columns(agentWalletRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWallet + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWalletModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentWalletModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentWalletModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentWalletAgentIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletAgentIdPrefix, data.AgentId) + tydataAgentWalletIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWalletIdPrefix, 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) + }, tydataAgentWalletAgentIdKey, tydataAgentWalletIdKey) + return err +} +func (m *defaultAgentWalletModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentWalletIdPrefix, primary) +} +func (m *defaultAgentWalletModel) 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", agentWalletRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentWalletModel) tableName() string { + return m.table +} diff --git a/app/user/model/agentWithdrawalModel.go b/app/user/model/agentWithdrawalModel.go new file mode 100644 index 0000000..56f5e50 --- /dev/null +++ b/app/user/model/agentWithdrawalModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentWithdrawalModel = (*customAgentWithdrawalModel)(nil) + +type ( + // AgentWithdrawalModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentWithdrawalModel. + AgentWithdrawalModel interface { + agentWithdrawalModel + } + + customAgentWithdrawalModel struct { + *defaultAgentWithdrawalModel + } +) + +// NewAgentWithdrawalModel returns a model for the database table. +func NewAgentWithdrawalModel(conn sqlx.SqlConn, c cache.CacheConf) AgentWithdrawalModel { + return &customAgentWithdrawalModel{ + defaultAgentWithdrawalModel: newAgentWithdrawalModel(conn, c), + } +} diff --git a/app/user/model/agentWithdrawalModel_gen.go b/app/user/model/agentWithdrawalModel_gen.go new file mode 100644 index 0000000..b00a937 --- /dev/null +++ b/app/user/model/agentWithdrawalModel_gen.go @@ -0,0 +1,411 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentWithdrawalFieldNames = builder.RawFieldNames(&AgentWithdrawal{}) + agentWithdrawalRows = strings.Join(agentWithdrawalFieldNames, ",") + agentWithdrawalRowsExpectAutoSet = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`create_time`", "`update_time`"), ",") + agentWithdrawalRowsWithPlaceHolder = strings.Join(stringx.Remove(agentWithdrawalFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentWithdrawalIdPrefix = "cache:tydata:agentWithdrawal:id:" + cacheTydataAgentWithdrawalWithdrawNoPrefix = "cache:tydata:agentWithdrawal:withdrawNo:" +) + +type ( + agentWithdrawalModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*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 + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentWithdrawal, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWithdrawal, error) + 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 + } + + defaultAgentWithdrawalModel struct { + sqlc.CachedConn + table string + } + + AgentWithdrawal struct { + Id int64 `db:"id"` + AgentId int64 `db:"agent_id"` // 代理ID + WithdrawNo string `db:"withdraw_no"` // 提现单号 + Amount float64 `db:"amount"` // 提现金额 + Status int64 `db:"status"` // 状态:1-申请中,2-成功,3-失败 + PayeeAccount string `db:"payeeAccount"` // 收款人账号 + 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"` // 版本号 + } +) + +func newAgentWithdrawalModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentWithdrawalModel { + return &defaultAgentWithdrawalModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_withdrawal`", + } +} + +func (m *defaultAgentWithdrawalModel) Insert(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, data.Id) + tydataAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalWithdrawNoPrefix, data.WithdrawNo) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, agentWithdrawalRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.Amount, data.Status, data.PayeeAccount, data.Remark, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.Id, data.AgentId, data.WithdrawNo, data.Amount, data.Status, data.PayeeAccount, data.Remark, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentWithdrawalIdKey, tydataAgentWithdrawalWithdrawNoKey) +} + +func (m *defaultAgentWithdrawalModel) FindOne(ctx context.Context, id int64) (*AgentWithdrawal, error) { + tydataAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, id) + var resp AgentWithdrawal + err := m.QueryRowCtx(ctx, &resp, tydataAgentWithdrawalIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentWithdrawalRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentWithdrawalModel) FindOneByWithdrawNo(ctx context.Context, withdrawNo string) (*AgentWithdrawal, error) { + tydataAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalWithdrawNoPrefix, withdrawNo) + var resp AgentWithdrawal + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentWithdrawalWithdrawNoKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `withdraw_no` = ? and del_state = ? limit 1", agentWithdrawalRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, withdrawNo, 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 *defaultAgentWithdrawalModel) Update(ctx context.Context, session sqlx.Session, newData *AgentWithdrawal) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, data.Id) + tydataAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalWithdrawNoPrefix, data.WithdrawNo) + return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) { + query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, agentWithdrawalRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.Amount, newData.Status, newData.PayeeAccount, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.Amount, newData.Status, newData.PayeeAccount, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentWithdrawalIdKey, tydataAgentWithdrawalWithdrawNoKey) +} + +func (m *defaultAgentWithdrawalModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentWithdrawal) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, data.Id) + tydataAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalWithdrawNoPrefix, data.WithdrawNo) + 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, agentWithdrawalRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.Amount, newData.Status, newData.PayeeAccount, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.WithdrawNo, newData.Amount, newData.Status, newData.PayeeAccount, newData.Remark, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentWithdrawalIdKey, tydataAgentWithdrawalWithdrawNoKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentWithdrawalModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentWithdrawal) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentWithdrawalModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentWithdrawalModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentWithdrawalModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentWithdrawalModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentWithdrawal, error) { + + builder = builder.Columns(agentWithdrawalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWithdrawal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWithdrawalModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWithdrawal, error) { + + builder = builder.Columns(agentWithdrawalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWithdrawal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWithdrawalModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentWithdrawal, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentWithdrawalRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentWithdrawal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentWithdrawalModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentWithdrawal, error) { + + builder = builder.Columns(agentWithdrawalRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWithdrawal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWithdrawalModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentWithdrawal, error) { + + builder = builder.Columns(agentWithdrawalRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentWithdrawal + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentWithdrawalModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentWithdrawalModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentWithdrawalModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentWithdrawalIdKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, id) + tydataAgentWithdrawalWithdrawNoKey := fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalWithdrawNoPrefix, data.WithdrawNo) + _, 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) + }, tydataAgentWithdrawalIdKey, tydataAgentWithdrawalWithdrawNoKey) + return err +} +func (m *defaultAgentWithdrawalModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentWithdrawalIdPrefix, primary) +} +func (m *defaultAgentWithdrawalModel) 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", agentWithdrawalRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentWithdrawalModel) tableName() string { + return m.table +} diff --git a/app/user/model/featureModel_gen.go b/app/user/model/featureModel_gen.go index 375ef28..9d88dc7 100644 --- a/app/user/model/featureModel_gen.go +++ b/app/user/model/featureModel_gen.go @@ -7,7 +7,6 @@ import ( "database/sql" "fmt" "strings" - model2 "tydata-server/deploy/script/model" "time" @@ -99,7 +98,7 @@ func (m *defaultFeatureModel) FindOne(ctx context.Context, id int64) (*Feature, case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -119,7 +118,7 @@ func (m *defaultFeatureModel) FindOneByApiId(ctx context.Context, apiId string) case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -170,7 +169,7 @@ func (m *defaultFeatureModel) UpdateWithVersion(ctx context.Context, session sql return err } if updateCount == 0 { - return model2.ErrNoRowsUpdate + return ErrNoRowsUpdate } return nil @@ -180,7 +179,7 @@ func (m *defaultFeatureModel) DeleteSoft(ctx context.Context, session sqlx.Sessi data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "FeatureModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "FeatureModel delete err : %v", err) } return nil } diff --git a/app/user/model/globalNotificationsModel_gen.go b/app/user/model/globalNotificationsModel_gen.go index 22f7d40..20b4499 100644 --- a/app/user/model/globalNotificationsModel_gen.go +++ b/app/user/model/globalNotificationsModel_gen.go @@ -7,7 +7,6 @@ import ( "database/sql" "fmt" "strings" - model2 "tydata-server/deploy/script/model" "time" @@ -102,7 +101,7 @@ func (m *defaultGlobalNotificationsModel) FindOne(ctx context.Context, id int64) case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -143,7 +142,7 @@ func (m *defaultGlobalNotificationsModel) UpdateWithVersion(ctx context.Context, return err } if updateCount == 0 { - return model2.ErrNoRowsUpdate + return ErrNoRowsUpdate } return nil @@ -153,7 +152,7 @@ func (m *defaultGlobalNotificationsModel) DeleteSoft(ctx context.Context, sessio data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "GlobalNotificationsModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "GlobalNotificationsModel delete err : %v", err) } return nil } diff --git a/app/user/model/orderModel_gen.go b/app/user/model/orderModel_gen.go index de03632..8aca5bb 100644 --- a/app/user/model/orderModel_gen.go +++ b/app/user/model/orderModel_gen.go @@ -7,7 +7,6 @@ import ( "database/sql" "fmt" "strings" - model2 "tydata-server/deploy/script/model" "time" @@ -108,7 +107,7 @@ func (m *defaultOrderModel) FindOne(ctx context.Context, id int64) (*Order, erro case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -128,7 +127,7 @@ func (m *defaultOrderModel) FindOneByOrderNo(ctx context.Context, orderNo string case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -179,7 +178,7 @@ func (m *defaultOrderModel) UpdateWithVersion(ctx context.Context, session sqlx. return err } if updateCount == 0 { - return model2.ErrNoRowsUpdate + return ErrNoRowsUpdate } return nil @@ -189,7 +188,7 @@ func (m *defaultOrderModel) DeleteSoft(ctx context.Context, session sqlx.Session data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "OrderModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "OrderModel delete err : %v", err) } return nil } diff --git a/app/user/model/productFeatureModel_gen.go b/app/user/model/productFeatureModel_gen.go index 9a2bd1e..c1ac4c2 100644 --- a/app/user/model/productFeatureModel_gen.go +++ b/app/user/model/productFeatureModel_gen.go @@ -182,7 +182,7 @@ func (m *defaultProductFeatureModel) DeleteSoft(ctx context.Context, session sql data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "ProductFeatureModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "ProductFeatureModel delete err : %v", err) } return nil } diff --git a/app/user/model/productModel_gen.go b/app/user/model/productModel_gen.go index 1c6f838..c0d176a 100644 --- a/app/user/model/productModel_gen.go +++ b/app/user/model/productModel_gen.go @@ -7,7 +7,6 @@ import ( "database/sql" "fmt" "strings" - model2 "tydata-server/deploy/script/model" "time" @@ -103,7 +102,7 @@ func (m *defaultProductModel) FindOne(ctx context.Context, id int64) (*Product, case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -123,7 +122,7 @@ func (m *defaultProductModel) FindOneByProductEn(ctx context.Context, productEn case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -174,7 +173,7 @@ func (m *defaultProductModel) UpdateWithVersion(ctx context.Context, session sql return err } if updateCount == 0 { - return model2.ErrNoRowsUpdate + return ErrNoRowsUpdate } return nil @@ -184,7 +183,7 @@ func (m *defaultProductModel) DeleteSoft(ctx context.Context, session sqlx.Sessi data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "ProductModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "ProductModel delete err : %v", err) } return nil } diff --git a/app/user/model/queryModel_gen.go b/app/user/model/queryModel_gen.go index 04caaef..12fb5ab 100644 --- a/app/user/model/queryModel_gen.go +++ b/app/user/model/queryModel_gen.go @@ -7,7 +7,6 @@ import ( "database/sql" "fmt" "strings" - model2 "tydata-server/deploy/script/model" "time" @@ -103,7 +102,7 @@ func (m *defaultQueryModel) FindOne(ctx context.Context, id int64) (*Query, erro case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -123,7 +122,7 @@ func (m *defaultQueryModel) FindOneByOrderId(ctx context.Context, orderId int64) case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -174,7 +173,7 @@ func (m *defaultQueryModel) UpdateWithVersion(ctx context.Context, session sqlx. return err } if updateCount == 0 { - return model2.ErrNoRowsUpdate + return ErrNoRowsUpdate } return nil @@ -184,7 +183,7 @@ func (m *defaultQueryModel) DeleteSoft(ctx context.Context, session sqlx.Session data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "QueryModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "QueryModel delete err : %v", err) } return nil } diff --git a/app/user/model/userAuthModel_gen.go b/app/user/model/userAuthModel_gen.go index dc40e93..012a9a5 100644 --- a/app/user/model/userAuthModel_gen.go +++ b/app/user/model/userAuthModel_gen.go @@ -7,7 +7,6 @@ import ( "database/sql" "fmt" "strings" - model2 "tydata-server/deploy/script/model" "time" @@ -103,7 +102,7 @@ func (m *defaultUserAuthModel) FindOne(ctx context.Context, id int64) (*UserAuth case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -123,7 +122,7 @@ func (m *defaultUserAuthModel) FindOneByAuthTypeAuthKey(ctx context.Context, aut case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -143,7 +142,7 @@ func (m *defaultUserAuthModel) FindOneByUserIdAuthType(ctx context.Context, user case nil: return &resp, nil case sqlc.ErrNotFound: - return nil, model2.ErrNotFound + return nil, ErrNotFound default: return nil, err } @@ -196,7 +195,7 @@ func (m *defaultUserAuthModel) UpdateWithVersion(ctx context.Context, session sq return err } if updateCount == 0 { - return model2.ErrNoRowsUpdate + return ErrNoRowsUpdate } return nil @@ -206,7 +205,7 @@ func (m *defaultUserAuthModel) DeleteSoft(ctx context.Context, session sqlx.Sess data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "UserAuthModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "UserAuthModel delete err : %v", err) } return nil } diff --git a/app/user/model/userModel_gen.go b/app/user/model/userModel_gen.go index 7fc5381..1b4f1bb 100644 --- a/app/user/model/userModel_gen.go +++ b/app/user/model/userModel_gen.go @@ -182,7 +182,7 @@ func (m *defaultUserModel) DeleteSoft(ctx context.Context, session sqlx.Session, data.DelState = globalkey.DelStateYes data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "UserModel delete err : %+v", err) + return errors.Wrapf(errors.New("delete soft failed "), "UserModel delete err : %v", err) } return nil } diff --git a/app/user/model/vars.go b/app/user/model/vars.go index 23cf6f0..97d3b74 100644 --- a/app/user/model/vars.go +++ b/app/user/model/vars.go @@ -13,3 +13,19 @@ var UserAuthTypeAppWechat string = "app_wechat" //微信小程序 var UserAuthTypeH5Mobile string = "h5_mobile" var UserAuthTypeWxMini string = "wx_mini" var UserAuthTypeWxh5 string = "wx_h5" +var UserAuthTypeAgentDirect string = "agent_direct" +var UserAuthTypeAgentPromote string = "agent_promote" + +var AgentDeductionTypeCost string = "cost" +var AgentDeductionTypePricing string = "pricing" + +var AgentRewardsTypeDescendantPromotion string = "descendant_promotion" +var AgentRewardsTypeDescendantUpgradeVip string = "descendant_upgrade_vip" +var AgentRewardsTypeDescendantUpgradeSvip string = "descendant_upgrade_svip" +var AgentRewardsTypeDescendantStayActive string = "descendant_stay_active" +var AgentRewardsTypeDescendantNewActive string = "descendant_new_active" +var AgentRewardsTypeDescendantWithdraw string = "descendant_withdraw" + +var AgentLeveNameNormal string = "normal" +var AgentLeveNameVIP string = "VIP" +var AgentLeveNameSVIP string = "SVIP" diff --git a/common/ctxdata/ctxData.go b/common/ctxdata/ctxData.go index 960705e..7433137 100644 --- a/common/ctxdata/ctxData.go +++ b/common/ctxdata/ctxData.go @@ -18,7 +18,7 @@ func GetUidFromCtx(ctx context.Context) (int64, error) { // 转换为 int64 uid, err := jsonUid.Int64() if err != nil { - return 0, fmt.Errorf("用户 ID 转换失败: %+v", err) + return 0, fmt.Errorf("用户 ID 转换失败: %v", err) } return uid, nil diff --git a/common/interceptor/rpcserver/loggerInterceptor.go b/common/interceptor/rpcserver/loggerInterceptor.go index d387fad..9fc0f39 100644 --- a/common/interceptor/rpcserver/loggerInterceptor.go +++ b/common/interceptor/rpcserver/loggerInterceptor.go @@ -25,12 +25,12 @@ func LoggerInterceptor(ctx context.Context, req interface{}, info *grpc.UnarySer if err != nil { causeErr := errors.Cause(err) // err类型 if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型 - logx.WithContext(ctx).Errorf("【RPC-SRV-ERR】 %+v", err) + logx.WithContext(ctx).Errorf("【RPC-SRV-ERR】 %v", err) //转成grpc err err = status.Error(codes.Code(e.GetErrCode()), e.GetErrMsg()) } else { - logx.WithContext(ctx).Errorf("【RPC-SRV-ERR】 %+v", err) + logx.WithContext(ctx).Errorf("【RPC-SRV-ERR】 %v", err) } } diff --git a/deploy/script/go.mod b/deploy/script/go.mod new file mode 100644 index 0000000..c27eb0c --- /dev/null +++ b/deploy/script/go.mod @@ -0,0 +1,3 @@ +module script + +go 1.23.4 diff --git a/deploy/script/model/agentActiveStatModel.go b/deploy/script/model/agentActiveStatModel.go new file mode 100644 index 0000000..86ce2ef --- /dev/null +++ b/deploy/script/model/agentActiveStatModel.go @@ -0,0 +1,27 @@ +package model + +import ( + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlx" +) + +var _ AgentActiveStatModel = (*customAgentActiveStatModel)(nil) + +type ( + // AgentActiveStatModel is an interface to be customized, add more methods here, + // and implement the added methods in customAgentActiveStatModel. + AgentActiveStatModel interface { + agentActiveStatModel + } + + customAgentActiveStatModel struct { + *defaultAgentActiveStatModel + } +) + +// NewAgentActiveStatModel returns a model for the database table. +func NewAgentActiveStatModel(conn sqlx.SqlConn, c cache.CacheConf) AgentActiveStatModel { + return &customAgentActiveStatModel{ + defaultAgentActiveStatModel: newAgentActiveStatModel(conn, c), + } +} diff --git a/deploy/script/model/agentActiveStatModel_gen.go b/deploy/script/model/agentActiveStatModel_gen.go new file mode 100644 index 0000000..af443da --- /dev/null +++ b/deploy/script/model/agentActiveStatModel_gen.go @@ -0,0 +1,408 @@ +// Code generated by goctl. DO NOT EDIT! + +package model + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "time" + + "github.com/Masterminds/squirrel" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/builder" + "github.com/zeromicro/go-zero/core/stores/cache" + "github.com/zeromicro/go-zero/core/stores/sqlc" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "github.com/zeromicro/go-zero/core/stringx" + "tydata-server/common/globalkey" +) + +var ( + agentActiveStatFieldNames = builder.RawFieldNames(&AgentActiveStat{}) + agentActiveStatRows = strings.Join(agentActiveStatFieldNames, ",") + agentActiveStatRowsExpectAutoSet = strings.Join(stringx.Remove(agentActiveStatFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + agentActiveStatRowsWithPlaceHolder = strings.Join(stringx.Remove(agentActiveStatFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheTydataAgentActiveStatIdPrefix = "cache:tydata:agentActiveStat:id:" + cacheTydataAgentActiveStatAgentIdStatDatePrefix = "cache:tydata:agentActiveStat:agentId:statDate:" +) + +type ( + agentActiveStatModel interface { + Insert(ctx context.Context, session sqlx.Session, data *AgentActiveStat) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*AgentActiveStat, error) + FindOneByAgentIdStatDate(ctx context.Context, agentId int64, statDate time.Time) (*AgentActiveStat, error) + Update(ctx context.Context, session sqlx.Session, data *AgentActiveStat) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *AgentActiveStat) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentActiveStat) error + FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) + FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) + FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*AgentActiveStat, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentActiveStat, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentActiveStat, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultAgentActiveStatModel struct { + sqlc.CachedConn + table string + } + + AgentActiveStat struct { + Id int64 `db:"id"` // 主键ID + AgentId int64 `db:"agent_id"` // 代理ID + StatDate time.Time `db:"stat_date"` // 统计日期 + ActiveNumber int64 `db:"active_number"` // 下级活跃数 + 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"` // 版本号 + } +) + +func newAgentActiveStatModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultAgentActiveStatModel { + return &defaultAgentActiveStatModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`agent_active_stat`", + } +} + +func (m *defaultAgentActiveStatModel) Insert(ctx context.Context, session sqlx.Session, data *AgentActiveStat) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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, agentActiveStatRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.AgentId, data.StatDate, data.ActiveNumber, data.DeleteTime, data.DelState, data.Version) + } + return conn.ExecCtx(ctx, query, data.AgentId, data.StatDate, data.ActiveNumber, data.DeleteTime, data.DelState, data.Version) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) +} + +func (m *defaultAgentActiveStatModel) FindOne(ctx context.Context, id int64) (*AgentActiveStat, error) { + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, id) + var resp AgentActiveStat + err := m.QueryRowCtx(ctx, &resp, tydataAgentActiveStatIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", agentActiveStatRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindOneByAgentIdStatDate(ctx context.Context, agentId int64, statDate time.Time) (*AgentActiveStat, error) { + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, agentId, statDate) + var resp AgentActiveStat + err := m.QueryRowIndexCtx(ctx, &resp, tydataAgentActiveStatAgentIdStatDateKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) { + query := fmt.Sprintf("select %s from %s where `agent_id` = ? and `stat_date` = ? and del_state = ? limit 1", agentActiveStatRows, m.table) + if err := conn.QueryRowCtx(ctx, &resp, query, agentId, statDate, 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 *defaultAgentActiveStatModel) Update(ctx context.Context, session sqlx.Session, newData *AgentActiveStat) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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, agentActiveStatRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) +} + +func (m *defaultAgentActiveStatModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *AgentActiveStat) error { + + oldVersion := newData.Version + newData.Version += 1 + + var sqlResult sql.Result + var err error + + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return err + } + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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, agentActiveStatRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.AgentId, newData.StatDate, newData.ActiveNumber, newData.DeleteTime, newData.DelState, newData.Version, newData.Id, oldVersion) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultAgentActiveStatModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *AgentActiveStat) error { + data.DelState = globalkey.DelStateYes + data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} + if err := m.UpdateWithVersion(ctx, session, data); err != nil { + return errors.Wrapf(errors.New("delete soft failed "), "AgentActiveStatModel delete err : %v", err) + } + return nil +} + +func (m *defaultAgentActiveStatModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") + } + + builder = builder.Columns("IFNULL(SUM(" + field + "),0)") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp float64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentActiveStatModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { + + if len(field) == 0 { + return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") + } + + builder = builder.Columns("COUNT(" + field + ")") + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return 0, err + } + + var resp int64 + err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return 0, err + } +} + +func (m *defaultAgentActiveStatModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*AgentActiveStat, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(agentActiveStatRows) + + if orderBy == "" { + builder = builder.OrderBy("id DESC") + } else { + builder = builder.OrderBy(orderBy) + } + + if page < 1 { + page = 1 + } + offset := (page - 1) * pageSize + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, total, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if preMinId > 0 { + builder = builder.Where(" id < ? ", preMinId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*AgentActiveStat, error) { + + builder = builder.Columns(agentActiveStatRows) + + if preMaxId > 0 { + builder = builder.Where(" id > ? ", preMaxId) + } + + query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() + if err != nil { + return nil, err + } + + var resp []*AgentActiveStat + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultAgentActiveStatModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { + + return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { + return fn(ctx, session) + }) + +} + +func (m *defaultAgentActiveStatModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultAgentActiveStatModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + tydataAgentActiveStatAgentIdStatDateKey := fmt.Sprintf("%s%v:%v", cacheTydataAgentActiveStatAgentIdStatDatePrefix, data.AgentId, data.StatDate) + tydataAgentActiveStatIdKey := fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, 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) + }, tydataAgentActiveStatAgentIdStatDateKey, tydataAgentActiveStatIdKey) + return err +} +func (m *defaultAgentActiveStatModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheTydataAgentActiveStatIdPrefix, primary) +} +func (m *defaultAgentActiveStatModel) 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", agentActiveStatRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultAgentActiveStatModel) tableName() string { + return m.table +} diff --git a/deploy/script/model/productFeatureModel.go b/deploy/script/model/productFeatureModel.go deleted file mode 100644 index 5b77422..0000000 --- a/deploy/script/model/productFeatureModel.go +++ /dev/null @@ -1,27 +0,0 @@ -package model - -import ( - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -var _ ProductFeatureModel = (*customProductFeatureModel)(nil) - -type ( - // ProductFeatureModel is an interface to be customized, add more methods here, - // and implement the added methods in customProductFeatureModel. - ProductFeatureModel interface { - productFeatureModel - } - - customProductFeatureModel struct { - *defaultProductFeatureModel - } -) - -// NewProductFeatureModel returns a model for the database table. -func NewProductFeatureModel(conn sqlx.SqlConn, c cache.CacheConf) ProductFeatureModel { - return &customProductFeatureModel{ - defaultProductFeatureModel: newProductFeatureModel(conn, c), - } -} diff --git a/deploy/script/model/productFeatureModel_gen.go b/deploy/script/model/productFeatureModel_gen.go deleted file mode 100644 index 9a2bd1e..0000000 --- a/deploy/script/model/productFeatureModel_gen.go +++ /dev/null @@ -1,410 +0,0 @@ -// Code generated by goctl. DO NOT EDIT! - -package model - -import ( - "context" - "database/sql" - "fmt" - "strings" - - "time" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/builder" - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlc" - "github.com/zeromicro/go-zero/core/stores/sqlx" - "github.com/zeromicro/go-zero/core/stringx" - "tydata-server/common/globalkey" -) - -var ( - productFeatureFieldNames = builder.RawFieldNames(&ProductFeature{}) - productFeatureRows = strings.Join(productFeatureFieldNames, ",") - productFeatureRowsExpectAutoSet = strings.Join(stringx.Remove(productFeatureFieldNames, "`id`", "`create_time`", "`update_time`"), ",") - productFeatureRowsWithPlaceHolder = strings.Join(stringx.Remove(productFeatureFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - - cacheTydataProductFeatureIdPrefix = "cache:tydata:productFeature:id:" - cacheTydataProductFeatureProductIdFeatureIdPrefix = "cache:tydata:productFeature:productId:featureId:" -) - -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) - 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 - SelectBuilder() squirrel.SelectBuilder - DeleteSoft(ctx context.Context, session sqlx.Session, data *ProductFeature) error - FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) - FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) - FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*ProductFeature, error) - FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*ProductFeature, error) - 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 - } - - defaultProductFeatureModel struct { - sqlc.CachedConn - table string - } - - 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"` - } -) - -func newProductFeatureModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultProductFeatureModel { - return &defaultProductFeatureModel{ - CachedConn: sqlc.NewConn(conn, c), - table: "`product_feature`", - } -} - -func (m *defaultProductFeatureModel) Insert(ctx context.Context, session sqlx.Session, data *ProductFeature) (sql.Result, error) { - data.DelState = globalkey.DelStateNo - tydataProductFeatureIdKey := fmt.Sprintf("%s%v", cacheTydataProductFeatureIdPrefix, data.Id) - tydataProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheTydataProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) - 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) - 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 conn.ExecCtx(ctx, query, data.ProductId, data.FeatureId, data.DeleteTime, data.DelState, data.Version, data.Sort, data.IsImportant, data.Enable) - }, tydataProductFeatureIdKey, tydataProductFeatureProductIdFeatureIdKey) -} - -func (m *defaultProductFeatureModel) FindOne(ctx context.Context, id int64) (*ProductFeature, error) { - tydataProductFeatureIdKey := fmt.Sprintf("%s%v", cacheTydataProductFeatureIdPrefix, id) - var resp ProductFeature - err := m.QueryRowCtx(ctx, &resp, tydataProductFeatureIdKey, 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) - }) - switch err { - case nil: - return &resp, nil - case sqlc.ErrNotFound: - return nil, ErrNotFound - default: - return nil, err - } -} - -func (m *defaultProductFeatureModel) FindOneByProductIdFeatureId(ctx context.Context, productId int64, featureId int64) (*ProductFeature, error) { - tydataProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheTydataProductFeatureProductIdFeatureIdPrefix, productId, featureId) - var resp ProductFeature - err := m.QueryRowIndexCtx(ctx, &resp, tydataProductFeatureProductIdFeatureIdKey, 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 - } - tydataProductFeatureIdKey := fmt.Sprintf("%s%v", cacheTydataProductFeatureIdPrefix, data.Id) - tydataProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheTydataProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) - 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 conn.ExecCtx(ctx, query, newData.ProductId, newData.FeatureId, newData.DeleteTime, newData.DelState, newData.Version, newData.Sort, newData.IsImportant, newData.Enable, newData.Id) - }, tydataProductFeatureIdKey, tydataProductFeatureProductIdFeatureIdKey) -} - -func (m *defaultProductFeatureModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *ProductFeature) error { - - oldVersion := newData.Version - newData.Version += 1 - - var sqlResult sql.Result - var err error - - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return err - } - tydataProductFeatureIdKey := fmt.Sprintf("%s%v", cacheTydataProductFeatureIdPrefix, data.Id) - tydataProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheTydataProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) - 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 conn.ExecCtx(ctx, query, newData.ProductId, newData.FeatureId, newData.DeleteTime, newData.DelState, newData.Version, newData.Sort, newData.IsImportant, newData.Enable, newData.Id, oldVersion) - }, tydataProductFeatureIdKey, tydataProductFeatureProductIdFeatureIdKey) - if err != nil { - return err - } - updateCount, err := sqlResult.RowsAffected() - if err != nil { - return err - } - if updateCount == 0 { - return ErrNoRowsUpdate - } - - return nil -} - -func (m *defaultProductFeatureModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *ProductFeature) error { - data.DelState = globalkey.DelStateYes - data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} - if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "ProductFeatureModel delete err : %+v", err) - } - return nil -} - -func (m *defaultProductFeatureModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { - - if len(field) == 0 { - return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") - } - - builder = builder.Columns("IFNULL(SUM(" + field + "),0)") - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return 0, err - } - - var resp float64 - err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return 0, err - } -} - -func (m *defaultProductFeatureModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { - - if len(field) == 0 { - return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") - } - - builder = builder.Columns("COUNT(" + field + ")") - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return 0, err - } - - var resp int64 - err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return 0, err - } -} - -func (m *defaultProductFeatureModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*ProductFeature, error) { - - builder = builder.Columns(productFeatureRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return nil, err - } - - var resp []*ProductFeature - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultProductFeatureModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*ProductFeature, error) { - - builder = builder.Columns(productFeatureRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - if page < 1 { - page = 1 - } - offset := (page - 1) * pageSize - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*ProductFeature - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultProductFeatureModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*ProductFeature, int64, error) { - - total, err := m.FindCount(ctx, builder, "id") - if err != nil { - return nil, 0, err - } - - builder = builder.Columns(productFeatureRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - if page < 1 { - page = 1 - } - offset := (page - 1) * pageSize - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, total, err - } - - var resp []*ProductFeature - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, total, nil - default: - return nil, total, err - } -} - -func (m *defaultProductFeatureModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*ProductFeature, error) { - - builder = builder.Columns(productFeatureRows) - - if preMinId > 0 { - builder = builder.Where(" id < ? ", preMinId) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*ProductFeature - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultProductFeatureModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*ProductFeature, error) { - - builder = builder.Columns(productFeatureRows) - - if preMaxId > 0 { - builder = builder.Where(" id > ? ", preMaxId) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*ProductFeature - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultProductFeatureModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { - - return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { - return fn(ctx, session) - }) - -} - -func (m *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 - } - - tydataProductFeatureIdKey := fmt.Sprintf("%s%v", cacheTydataProductFeatureIdPrefix, id) - tydataProductFeatureProductIdFeatureIdKey := fmt.Sprintf("%s%v:%v", cacheTydataProductFeatureProductIdFeatureIdPrefix, data.ProductId, data.FeatureId) - _, 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) - }, tydataProductFeatureIdKey, tydataProductFeatureProductIdFeatureIdKey) - return err -} -func (m *defaultProductFeatureModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheTydataProductFeatureIdPrefix, 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) - return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) -} - -func (m *defaultProductFeatureModel) tableName() string { - return m.table -} diff --git a/deploy/script/model/userModel.go b/deploy/script/model/userModel.go deleted file mode 100644 index 8123712..0000000 --- a/deploy/script/model/userModel.go +++ /dev/null @@ -1,27 +0,0 @@ -package model - -import ( - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlx" -) - -var _ UserModel = (*customUserModel)(nil) - -type ( - // UserModel is an interface to be customized, add more methods here, - // and implement the added methods in customUserModel. - UserModel interface { - userModel - } - - customUserModel struct { - *defaultUserModel - } -) - -// NewUserModel returns a model for the database table. -func NewUserModel(conn sqlx.SqlConn, c cache.CacheConf) UserModel { - return &customUserModel{ - defaultUserModel: newUserModel(conn, c), - } -} diff --git a/deploy/script/model/userModel_gen.go b/deploy/script/model/userModel_gen.go deleted file mode 100644 index 7fc5381..0000000 --- a/deploy/script/model/userModel_gen.go +++ /dev/null @@ -1,410 +0,0 @@ -// Code generated by goctl. DO NOT EDIT! - -package model - -import ( - "context" - "database/sql" - "fmt" - "strings" - - "time" - - "github.com/Masterminds/squirrel" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/builder" - "github.com/zeromicro/go-zero/core/stores/cache" - "github.com/zeromicro/go-zero/core/stores/sqlc" - "github.com/zeromicro/go-zero/core/stores/sqlx" - "github.com/zeromicro/go-zero/core/stringx" - "tydata-server/common/globalkey" -) - -var ( - userFieldNames = builder.RawFieldNames(&User{}) - userRows = strings.Join(userFieldNames, ",") - userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), ",") - userRowsWithPlaceHolder = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" - - cacheTydataUserIdPrefix = "cache:tydata:user:id:" - cacheTydataUserMobilePrefix = "cache:tydata: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) - FindOneByMobile(ctx context.Context, mobile string) (*User, error) - Update(ctx context.Context, session sqlx.Session, data *User) (sql.Result, error) - UpdateWithVersion(ctx context.Context, session sqlx.Session, data *User) error - Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error - SelectBuilder() squirrel.SelectBuilder - DeleteSoft(ctx context.Context, session sqlx.Session, data *User) error - FindSum(ctx context.Context, sumBuilder squirrel.SelectBuilder, field string) (float64, error) - FindCount(ctx context.Context, countBuilder squirrel.SelectBuilder, field string) (int64, error) - FindAll(ctx context.Context, rowBuilder squirrel.SelectBuilder, orderBy string) ([]*User, error) - FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*User, error) - 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 - } - - defaultUserModel struct { - sqlc.CachedConn - table string - } - - User struct { - Id int64 `db:"id"` - CreateTime time.Time `db:"create_time"` - UpdateTime time.Time `db:"update_time"` - DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 - DelState int64 `db:"del_state"` - Version int64 `db:"version"` // 版本号 - Mobile string `db:"mobile"` - Password sql.NullString `db:"password"` - Nickname string `db:"nickname"` - Info string `db:"info"` - Inside int64 `db:"inside"` - } -) - -func newUserModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultUserModel { - return &defaultUserModel{ - CachedConn: sqlc.NewConn(conn, c), - table: "`user`", - } -} - -func (m *defaultUserModel) Insert(ctx context.Context, session sqlx.Session, data *User) (sql.Result, error) { - data.DelState = globalkey.DelStateNo - tydataUserIdKey := fmt.Sprintf("%s%v", cacheTydataUserIdPrefix, data.Id) - tydataUserMobileKey := fmt.Sprintf("%s%v", cacheTydataUserMobilePrefix, 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) - 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 conn.ExecCtx(ctx, query, data.DeleteTime, data.DelState, data.Version, data.Mobile, data.Password, data.Nickname, data.Info, data.Inside) - }, tydataUserIdKey, tydataUserMobileKey) -} - -func (m *defaultUserModel) FindOne(ctx context.Context, id int64) (*User, error) { - tydataUserIdKey := fmt.Sprintf("%s%v", cacheTydataUserIdPrefix, id) - var resp User - err := m.QueryRowCtx(ctx, &resp, tydataUserIdKey, 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) - }) - switch err { - case nil: - return &resp, nil - case sqlc.ErrNotFound: - return nil, ErrNotFound - default: - return nil, err - } -} - -func (m *defaultUserModel) FindOneByMobile(ctx context.Context, mobile string) (*User, error) { - tydataUserMobileKey := fmt.Sprintf("%s%v", cacheTydataUserMobilePrefix, mobile) - var resp User - err := m.QueryRowIndexCtx(ctx, &resp, tydataUserMobileKey, 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 - } - 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 *defaultUserModel) Update(ctx context.Context, session sqlx.Session, newData *User) (sql.Result, error) { - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return nil, err - } - tydataUserIdKey := fmt.Sprintf("%s%v", cacheTydataUserIdPrefix, data.Id) - tydataUserMobileKey := fmt.Sprintf("%s%v", cacheTydataUserMobilePrefix, 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) - }, tydataUserIdKey, tydataUserMobileKey) -} - -func (m *defaultUserModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *User) error { - - oldVersion := newData.Version - newData.Version += 1 - - var sqlResult sql.Result - var err error - - data, err := m.FindOne(ctx, newData.Id) - if err != nil { - return err - } - tydataUserIdKey := fmt.Sprintf("%s%v", cacheTydataUserIdPrefix, data.Id) - tydataUserMobileKey := fmt.Sprintf("%s%v", cacheTydataUserMobilePrefix, 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) - }, tydataUserIdKey, tydataUserMobileKey) - if err != nil { - return err - } - updateCount, err := sqlResult.RowsAffected() - if err != nil { - return err - } - if updateCount == 0 { - return ErrNoRowsUpdate - } - - return nil -} - -func (m *defaultUserModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *User) error { - data.DelState = globalkey.DelStateYes - data.DeleteTime = sql.NullTime{Time: time.Now(), Valid: true} - if err := m.UpdateWithVersion(ctx, session, data); err != nil { - return errors.Wrapf(errors.New("delete soft failed "), "UserModel delete err : %+v", err) - } - return nil -} - -func (m *defaultUserModel) FindSum(ctx context.Context, builder squirrel.SelectBuilder, field string) (float64, error) { - - if len(field) == 0 { - return 0, errors.Wrapf(errors.New("FindSum Least One Field"), "FindSum Least One Field") - } - - builder = builder.Columns("IFNULL(SUM(" + field + "),0)") - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return 0, err - } - - var resp float64 - err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return 0, err - } -} - -func (m *defaultUserModel) FindCount(ctx context.Context, builder squirrel.SelectBuilder, field string) (int64, error) { - - if len(field) == 0 { - return 0, errors.Wrapf(errors.New("FindCount Least One Field"), "FindCount Least One Field") - } - - builder = builder.Columns("COUNT(" + field + ")") - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return 0, err - } - - var resp int64 - err = m.QueryRowNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return 0, err - } -} - -func (m *defaultUserModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*User, error) { - - builder = builder.Columns(userRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).ToSql() - if err != nil { - return nil, err - } - - var resp []*User - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultUserModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*User, error) { - - builder = builder.Columns(userRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - if page < 1 { - page = 1 - } - offset := (page - 1) * pageSize - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*User - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultUserModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*User, int64, error) { - - total, err := m.FindCount(ctx, builder, "id") - if err != nil { - return nil, 0, err - } - - builder = builder.Columns(userRows) - - if orderBy == "" { - builder = builder.OrderBy("id DESC") - } else { - builder = builder.OrderBy(orderBy) - } - - if page < 1 { - page = 1 - } - offset := (page - 1) * pageSize - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).Offset(uint64(offset)).Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, total, err - } - - var resp []*User - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, total, nil - default: - return nil, total, err - } -} - -func (m *defaultUserModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*User, error) { - - builder = builder.Columns(userRows) - - if preMinId > 0 { - builder = builder.Where(" id < ? ", preMinId) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id DESC").Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*User - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultUserModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*User, error) { - - builder = builder.Columns(userRows) - - if preMaxId > 0 { - builder = builder.Where(" id > ? ", preMaxId) - } - - query, values, err := builder.Where("del_state = ?", globalkey.DelStateNo).OrderBy("id ASC").Limit(uint64(pageSize)).ToSql() - if err != nil { - return nil, err - } - - var resp []*User - err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) - switch err { - case nil: - return resp, nil - default: - return nil, err - } -} - -func (m *defaultUserModel) Trans(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error { - - return m.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error { - return fn(ctx, session) - }) - -} - -func (m *defaultUserModel) SelectBuilder() squirrel.SelectBuilder { - return squirrel.Select().From(m.table) -} -func (m *defaultUserModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { - data, err := m.FindOne(ctx, id) - if err != nil { - return err - } - - tydataUserIdKey := fmt.Sprintf("%s%v", cacheTydataUserIdPrefix, id) - tydataUserMobileKey := fmt.Sprintf("%s%v", cacheTydataUserMobilePrefix, 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) - }, tydataUserIdKey, tydataUserMobileKey) - return err -} -func (m *defaultUserModel) formatPrimary(primary interface{}) string { - return fmt.Sprintf("%s%v", cacheTydataUserIdPrefix, 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) - return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) -} - -func (m *defaultUserModel) tableName() string { - return m.table -} diff --git a/pkg/lzkit/crypto/crypto_url.go b/pkg/lzkit/crypto/crypto_url.go new file mode 100644 index 0000000..777db50 --- /dev/null +++ b/pkg/lzkit/crypto/crypto_url.go @@ -0,0 +1,67 @@ +package crypto + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" + "errors" + "io" +) + +// AES CBC模式加密,Base64传入传出 +func AesEncryptURL(plainText, key []byte) (string, error) { + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + blockSize := block.BlockSize() + plainText = PKCS7Padding(plainText, blockSize) + + cipherText := make([]byte, blockSize+len(plainText)) + iv := cipherText[:blockSize] // 使用前blockSize字节作为IV + _, err = io.ReadFull(rand.Reader, iv) + if err != nil { + return "", err + } + + mode := cipher.NewCBCEncrypter(block, iv) + mode.CryptBlocks(cipherText[blockSize:], plainText) + + return base64.URLEncoding.EncodeToString(cipherText), nil +} + +// AES CBC模式解密,Base64传入传出 +func AesDecryptURL(cipherTextBase64 string, key []byte) ([]byte, error) { + cipherText, err := base64.URLEncoding.DecodeString(cipherTextBase64) + if err != nil { + return nil, err + } + + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + blockSize := block.BlockSize() + if len(cipherText) < blockSize { + return nil, errors.New("ciphertext too short") + } + + iv := cipherText[:blockSize] + cipherText = cipherText[blockSize:] + + if len(cipherText)%blockSize != 0 { + return nil, errors.New("ciphertext is not a multiple of the block size") + } + + mode := cipher.NewCBCDecrypter(block, iv) + mode.CryptBlocks(cipherText, cipherText) + + plainText, err := PKCS7UnPadding(cipherText) + if err != nil { + return nil, err + } + + return plainText, nil +} diff --git a/pkg/lzkit/lzUtils/sqlutls.go b/pkg/lzkit/lzUtils/sqlutls.go index 8e960e7..66d2ce0 100644 --- a/pkg/lzkit/lzUtils/sqlutls.go +++ b/pkg/lzkit/lzUtils/sqlutls.go @@ -36,3 +36,37 @@ func NullTimeToTime(nt sql.NullTime) time.Time { } return time.Time{} // 返回零值时间 } + +// Int64ToNullInt64 将 int64 转换为 sql.NullInt64 +func Int64ToNullInt64(i int64) sql.NullInt64 { + return sql.NullInt64{ + Int64: i, + Valid: i != 0, // 仅当 i 非零时才设置为有效 + } +} + +// NullInt64ToInt64 将 sql.NullInt64 转换为 int64 +func NullInt64ToInt64(ni sql.NullInt64) int64 { + if ni.Valid { + return ni.Int64 + } + return 0 // 返回零值 int64 +} + +// Float64ToNullFloat64 将 float64 转换为 sql.NullFloat64 +// Valid 字段在 f 非零时设置为有效(注意:NaN 会被视为有效,需结合业务场景使用) +func Float64ToNullFloat64(f float64) sql.NullFloat64 { + return sql.NullFloat64{ + Float64: f, + Valid: f != 0, + } +} + +// NullFloat64ToFloat64 将 sql.NullFloat64 转换为 float64 +// 当 Valid 为 false 时,返回 float64 零值 +func NullFloat64ToFloat64(nf sql.NullFloat64) float64 { + if nf.Valid { + return nf.Float64 + } + return 0.0 +} diff --git a/test/test.go b/test/test.go index 8aded0f..a30bc40 100644 --- a/test/test.go +++ b/test/test.go @@ -68,7 +68,7 @@ func (w *WestDexService) ProcessRequests(data interface{}, requests []types.West mutex := sync.Mutex{} encryptedFields, err := w.EncryptStructFields(data) if err != nil { - return nil, fmt.Errorf("西部请求, 生成请求数据失败: %+v", err) + return nil, fmt.Errorf("西部请求, 生成请求数据失败: %v", err) } ctx, cancel := context.WithCancel(context.Background()) // 创建 context @@ -135,13 +135,13 @@ func (w *WestDexService) ProcessRequests(data interface{}, requests []types.West wg.Wait() // 等待所有 goroutine 完成 if errorCount >= errorLimit { - return nil, fmt.Errorf("请求失败次数超过 %d 次: %+v", errorLimit, errorsCh) + return nil, fmt.Errorf("请求失败次数超过 %d 次: %v", errorLimit, errorsCh) } // 将 responseData 转换为 JSON combinedResponse, err := json.Marshal(responseData) if err != nil { - return nil, fmt.Errorf("响应数据转 JSON 失败: %+v", err) + return nil, fmt.Errorf("响应数据转 JSON 失败: %v", err) } return combinedResponse, nil