diff --git a/.air.toml b/.air.toml new file mode 100644 index 0000000..083a149 --- /dev/null +++ b/.air.toml @@ -0,0 +1,54 @@ +# Air配置文件 +root = "." +tmp_dir = "tmp" + +[build] +# 入口文件 +cmd = "go build -o ./tmp/main.exe ./app/user/cmd/api/main.go" +# 二进制文件 +bin = "$env:ENV = 'development' && ./tmp/main.exe" +# 运行时的参数 +full_bin = "./tmp/main.exe -- $env:ENV='development'" + +# 监听以下扩展名的文件变化./ +include_ext = ["go", "tpl", "tmpl", "html", "yaml", "yml"] +# 忽略的目录 +exclude_dir = ["assets", "tmp", "vendor", "testdata", ".git", ".idea", "data"] +# 构建延迟 +delay = 1000 +# 停止延迟 +kill_delay = "2s" +# 日志文件 +log = "build-errors.log" +# 出错时停止 +stop_on_error = true +# 发送中断信号 +send_interrupt = true + + + +[color] +main = "magenta" +watcher = "cyan" +build = "yellow" +runner = "green" + +[log] +# 启用时间戳 +time = true +# 启用详细日志 +main_only = false +silent = false + +[misc] +# 清理屏幕 +clean_on_exit = false + +[proxy] +app_port = 0 +enabled = false +proxy_port = 0 + +[screen] +clear_on_rebuild = false +keep_scroll = true \ No newline at end of file diff --git a/app/order/cmd/api/desc/order.api b/app/order/cmd/api/desc/order.api deleted file mode 100644 index ea237ce..0000000 --- a/app/order/cmd/api/desc/order.api +++ /dev/null @@ -1,24 +0,0 @@ -syntax = "v1" - -info ( - title: "支付服务" - desc: "支付服务" - author: "Liangzai" - email: "2440983361@qq.com" - version: "v1" -) - -@server ( - prefix: api/v1 - group: pay -) -service main { - // 微信支付回调 - @handler WechatPayCallback - post /pay/wechat/callback - - // 支付宝支付回调 - @handler AlipayCallback - post /pay/alipay/callback -} - diff --git a/app/order/cmd/rpc/pb/order.proto b/app/order/cmd/rpc/pb/order.proto deleted file mode 100644 index a76b7e7..0000000 --- a/app/order/cmd/rpc/pb/order.proto +++ /dev/null @@ -1,5 +0,0 @@ -syntax = "proto3"; - -option go_package = "./pb"; - -package pb; \ No newline at end of file diff --git a/app/query/cmd/rpc/pb/query.proto b/app/query/cmd/rpc/pb/query.proto deleted file mode 100644 index 5c62a92..0000000 --- a/app/query/cmd/rpc/pb/query.proto +++ /dev/null @@ -1,17 +0,0 @@ -syntax = "proto3"; - -option go_package = "./pb"; - -package pb; - -message StreamReq { - string name = 1; -} - -message StreamResp { - string greet = 1; -} - -service StreamGreeter { - rpc greet(StreamReq) returns (StreamResp); -} \ 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 65a483d..c6b61b9 100644 --- a/app/user/cmd/api/etc/main.dev.yaml +++ b/app/user/cmd/api/etc/main.dev.yaml @@ -3,56 +3,56 @@ Host: 0.0.0.0 Port: 8888 DataSource: "qnc:5vg67b3UNHu8@tcp(127.0.0.1:20001)/qnc?charset=utf8mb4&parseTime=True&loc=Local" CacheRedis: - - Host: "127.0.0.1:20002" - Pass: "3m3WsgyCKWqz" # Redis 密码,如果未设置则留空 - Type: "node" # 单节点模式 + - Host: "127.0.0.1:20002" + Pass: "3m3WsgyCKWqz" # Redis 密码,如果未设置则留空 + Type: "node" # 单节点模式 JwtAuth: - AccessSecret: "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA" - AccessExpire: 2592000 - RefreshAfter: 1296000 + AccessSecret: "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA" + AccessExpire: 2592000 + RefreshAfter: 1296000 VerifyCode: - AccessKeyID: "LTAI5tKGB3TVJbMHSoZN3yr9" - AccessKeySecret: "OCQ30GWp4yENMjmfOAaagksE18bp65" - EndpointURL: "dysmsapi.aliyuncs.com" - SignName: "全能查" - TemplateCode: "SMS_473780047" - ValidTime: 300 + AccessKeyID: "LTAI5tKGB3TVJbMHSoZN3yr9" + AccessKeySecret: "OCQ30GWp4yENMjmfOAaagksE18bp65" + EndpointURL: "dysmsapi.aliyuncs.com" + SignName: "全能查" + TemplateCode: "SMS_473780047" + ValidTime: 300 Encrypt: - SecretKey: "ff83609b2b24fc73196aac3d3dfb874f" + SecretKey: "ff83609b2b24fc73196aac3d3dfb874f" WestConfig: - Url: "http://proxy.tianyuanapi.com/api/invoke" - Key: "121a1e41fc1690dd6b90afbcacd80cf4" - SecretId: "449159" - SecretSecondId: "296804" + Url: "http://proxy.tianyuanapi.com/api/invoke" + Key: "121a1e41fc1690dd6b90afbcacd80cf4" + SecretId: "449159" + SecretSecondId: "296804" YushanConfig: - ApiKey: "4c566c4a4b543164535455685655316c" - AcctID: "YSSJ843926726" - Url: "http://proxy.tianyuanapi.com/credit-gw/service" + ApiKey: "4c566c4a4b543164535455685655316c" + AcctID: "YSSJ843926726" + Url: "http://proxy.tianyuanapi.com/credit-gw/service" Alipay: - AppID: "2021004165608254" - PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCvo8TmTNnVguKwMYrX0z01PfUlSS+AqwwCH1+/P39q6No+09yO1bjhy4LowtDfwKX8F+IZLl5Cx06f1M8KzPvjQliBAfMJ1FuTEOOXPmtE1YLAYIUMLbltR6Crnp16T28eF41Uo0PUo2ple/oSjWhYgsTJjyBMXY04f6HM2uZlHOhG2aOUz2CDNbvkEhNddazuPMgo8Xl7vwENGDFTPa85HmSSoDppFowLdYfAw2Jl1ilKNg4sOPc6d507nXdgpMlUguwZxol6OQ2hBS6v9OjII5cJ1tyR/klJRapnIPmFaPvhDozYwjU6Z3jMvcbrByl0qNpLrbEFS4pn9hfRo4YrAgMBAAECggEAZAi0Ri6TCqXnEk7FMzMec0p8auYJ5hCFYFgaIkS5/1vroUjtH3TePcu5HXSHnkiMwM2hepIMIaB+SU3dNduVwtOwsJk5oOmP1m0SErv8QFISjBrs7AjGyVS4T8ahDl5bfRoQ5pmuMld4a6B2x0Y+ndqs1ddsn9HQctNOhexOuFsSjX1N3PZxFzfRTmGzxf7kwZGlXMN7G1r3Rp4koylYHVpqjXIK34Anc8SVljxFVkFOk62QvBdYcCucepymHNl0pYwPDCCylPH8OpIXOErmPldTflmoLRc+ywu9rw4I8UvkoPgTe+16he+jdi/N7cwbMTfixq+/Aeadjv2AgMuwkQKBgQDgLS3dRFAc6FMSJIA0FKgv5D/R3NZgWilbOAF11PtnE4AX4i0yZryGtLq+3NWCWYQF8iI60lIy3rEf9zWncwfadhWTEDUBjjrqqU46N2ddTzHsDw09I56TT2vrEwCdmJ2vh1hxPfgE3fSDnKbP4Wkl77JCTH7v0rA1jb65Plt8TwKBgQDIkrXqe/pVHDdxswoPL6em32TnKiaJ/R/UDDio20mgGG7FWEJAY5yYtu0y9Ug7W8PjJE7/cJ2/dwDSvHZm8R0iq8d6XkzN03Z+uvzGnMdUraXJZHSPZ5L/2ofysXjt/OtpA1Sox5++1+obiq6CZ6IYORLSxSf+it1JUbKXsNcVZQKBgQCTPzm7984DXtqJtS38h4D9jBgbWcn6Gd7GSuAyrIXBa76ccXSsgWzdskJjcZxQdUnRufyf1Fwni7yeOXullFoZNazwHxoh/nFWh4SZmqCrWoR5AF36xbW4HtfM3XtvCLqye90s7L5HPB8Kf8/WBcJSJ8JX5/UMw7/4PTWEaaAf4wKBgQCEXu7YVgIccYbV7wdQhm7q3rxFI7hTkU6UL4ylRDQPCJDyhREUValf0DozS1XkdueM3MWWJ8i0N+G/MsohnjdQTnZT+DBQFqM5eEai/Y1AAWpMw5N5oS2O1barIR1iU2053QzeZwCyfuTuUFRjk+mSevhFSgDfKN5qKRTor7kDUQKBgB3fC6jO8XCwimPvpsiGnuddNAq/w8iqSjSwuSvbI0Q7Lq6rvAIw2AmkC5t4kW4JcZLUgDvAs4GFoPDYhoL73vc1e2c35VTNck6IxZSQzzQ9pfXFiLtTe6eqggN4EOPGHKLd92CMAgoeySsp3NydpGSx2N/NUqp8BkoFLQ/k2W9o" - AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2CqoCp95w/JV3RT/gzF4/8QmVT1HQNaeW7yUp+mA7x9AbjvlTW/+eRn6oGAL/XhZLjvHD0XjKLVKX0MJVS1aUQHEHEbOJN4Eu8II45OavD4iZISa7Kp9V6AM+i4qTyaeV2wNDnGxHQBaLVUGCfMR+56EK2YpORdE1H9uy72SSQseVb3bmpsV9EW/IJNmcVL/ut3uA1JWAoRmzlQ7ekxg7p8AYXzYPEHQr1tl7W+M4zv9wO9GKZCxIqMA8U3RP5npPfRaCfIRGzXzCqFEEUvWuidOB7frsvN4jiPD07qpL2Bi9LM1X/ee2kC/oM8Uhd7ERZhG8MbZfijZKxgrsDKBcwIDAQAB" - IsProduction: true - NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback" - ReturnURL: "http://localhost:5678/inquire" + AppID: "2021004165608254" + PrivateKey: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCvo8TmTNnVguKwMYrX0z01PfUlSS+AqwwCH1+/P39q6No+09yO1bjhy4LowtDfwKX8F+IZLl5Cx06f1M8KzPvjQliBAfMJ1FuTEOOXPmtE1YLAYIUMLbltR6Crnp16T28eF41Uo0PUo2ple/oSjWhYgsTJjyBMXY04f6HM2uZlHOhG2aOUz2CDNbvkEhNddazuPMgo8Xl7vwENGDFTPa85HmSSoDppFowLdYfAw2Jl1ilKNg4sOPc6d507nXdgpMlUguwZxol6OQ2hBS6v9OjII5cJ1tyR/klJRapnIPmFaPvhDozYwjU6Z3jMvcbrByl0qNpLrbEFS4pn9hfRo4YrAgMBAAECggEAZAi0Ri6TCqXnEk7FMzMec0p8auYJ5hCFYFgaIkS5/1vroUjtH3TePcu5HXSHnkiMwM2hepIMIaB+SU3dNduVwtOwsJk5oOmP1m0SErv8QFISjBrs7AjGyVS4T8ahDl5bfRoQ5pmuMld4a6B2x0Y+ndqs1ddsn9HQctNOhexOuFsSjX1N3PZxFzfRTmGzxf7kwZGlXMN7G1r3Rp4koylYHVpqjXIK34Anc8SVljxFVkFOk62QvBdYcCucepymHNl0pYwPDCCylPH8OpIXOErmPldTflmoLRc+ywu9rw4I8UvkoPgTe+16he+jdi/N7cwbMTfixq+/Aeadjv2AgMuwkQKBgQDgLS3dRFAc6FMSJIA0FKgv5D/R3NZgWilbOAF11PtnE4AX4i0yZryGtLq+3NWCWYQF8iI60lIy3rEf9zWncwfadhWTEDUBjjrqqU46N2ddTzHsDw09I56TT2vrEwCdmJ2vh1hxPfgE3fSDnKbP4Wkl77JCTH7v0rA1jb65Plt8TwKBgQDIkrXqe/pVHDdxswoPL6em32TnKiaJ/R/UDDio20mgGG7FWEJAY5yYtu0y9Ug7W8PjJE7/cJ2/dwDSvHZm8R0iq8d6XkzN03Z+uvzGnMdUraXJZHSPZ5L/2ofysXjt/OtpA1Sox5++1+obiq6CZ6IYORLSxSf+it1JUbKXsNcVZQKBgQCTPzm7984DXtqJtS38h4D9jBgbWcn6Gd7GSuAyrIXBa76ccXSsgWzdskJjcZxQdUnRufyf1Fwni7yeOXullFoZNazwHxoh/nFWh4SZmqCrWoR5AF36xbW4HtfM3XtvCLqye90s7L5HPB8Kf8/WBcJSJ8JX5/UMw7/4PTWEaaAf4wKBgQCEXu7YVgIccYbV7wdQhm7q3rxFI7hTkU6UL4ylRDQPCJDyhREUValf0DozS1XkdueM3MWWJ8i0N+G/MsohnjdQTnZT+DBQFqM5eEai/Y1AAWpMw5N5oS2O1barIR1iU2053QzeZwCyfuTuUFRjk+mSevhFSgDfKN5qKRTor7kDUQKBgB3fC6jO8XCwimPvpsiGnuddNAq/w8iqSjSwuSvbI0Q7Lq6rvAIw2AmkC5t4kW4JcZLUgDvAs4GFoPDYhoL73vc1e2c35VTNck6IxZSQzzQ9pfXFiLtTe6eqggN4EOPGHKLd92CMAgoeySsp3NydpGSx2N/NUqp8BkoFLQ/k2W9o" + AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2CqoCp95w/JV3RT/gzF4/8QmVT1HQNaeW7yUp+mA7x9AbjvlTW/+eRn6oGAL/XhZLjvHD0XjKLVKX0MJVS1aUQHEHEbOJN4Eu8II45OavD4iZISa7Kp9V6AM+i4qTyaeV2wNDnGxHQBaLVUGCfMR+56EK2YpORdE1H9uy72SSQseVb3bmpsV9EW/IJNmcVL/ut3uA1JWAoRmzlQ7ekxg7p8AYXzYPEHQr1tl7W+M4zv9wO9GKZCxIqMA8U3RP5npPfRaCfIRGzXzCqFEEUvWuidOB7frsvN4jiPD07qpL2Bi9LM1X/ee2kC/oM8Uhd7ERZhG8MbZfijZKxgrsDKBcwIDAQAB" + IsProduction: true + NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/alipay/callback" + ReturnURL: "http://localhost:5678/inquire" Wxpay: - AppID: "wxba8424db4771cc18" - AppSecret: "89646203d7f76eb7aef0d926b9efffaa" - MchID: "1682635136" - MchCertificateSerialNumber: "5369B8AEEBDCF7AF274510252E6A8C0659C30F61" - MchApiv3Key: "e3ea4cf0765f1e71b01bb387dfcdbc9f" - MchPrivateKeyPath: "etc/merchant/apiclient_key.pem" - NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/wechat/callback" - RefundNotifyUrl: "https://6m4685017o.goho.co/api/v1/wechat/refund_callback" + AppID: "wxba8424db4771cc18" + AppSecret: "89646203d7f76eb7aef0d926b9efffaa" + MchID: "1682635136" + MchCertificateSerialNumber: "5369B8AEEBDCF7AF274510252E6A8C0659C30F61" + MchApiv3Key: "e3ea4cf0765f1e71b01bb387dfcdbc9f" + MchPrivateKeyPath: "app/user/cmd/api/etc/merchant/apiclient_key.pem" + NotifyUrl: "https://6m4685017o.goho.co/api/v1/pay/wechat/callback" + RefundNotifyUrl: "https://6m4685017o.goho.co/api/v1/wechat/refund_callback" Applepay: - ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt" - SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt" - Sandbox: false - BundleID: "com.allinone.check" - IssuerID: "bf828d85-5269-4914-9660-c066e09cd6ef" - KeyID: "LAY65829DQ" - LoadPrivateKeyPath: "etc/merchant/AuthKey_LAY65829DQ.p8" + ProductionVerifyURL: "https://api.storekit.itunes.apple.com/inApps/v1/transactions/receipt" + SandboxVerifyURL: "https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/receipt" + Sandbox: false + BundleID: "com.allinone.check" + IssuerID: "bf828d85-5269-4914-9660-c066e09cd6ef" + KeyID: "LAY65829DQ" + LoadPrivateKeyPath: "app/user/cmd/api/etc/merchant/AuthKey_LAY65829DQ.p8" Ali: - Code: "d55b58829efb41c8aa8e86769cba4844" + Code: "d55b58829efb41c8aa8e86769cba4844" SystemConfig: - ThreeVerify: false \ No newline at end of file + ThreeVerify: false diff --git a/app/user/cmd/api/internal/logic/query/queryexamplelogic.go b/app/user/cmd/api/internal/logic/query/queryexamplelogic.go index 86be81e..f3f0516 100644 --- a/app/user/cmd/api/internal/logic/query/queryexamplelogic.go +++ b/app/user/cmd/api/internal/logic/query/queryexamplelogic.go @@ -3,12 +3,13 @@ package query import ( "context" "encoding/hex" - "github.com/jinzhu/copier" - "github.com/pkg/errors" "qnc-server/app/user/cmd/api/internal/svc" "qnc-server/app/user/cmd/api/internal/types" "qnc-server/common/xerr" + "github.com/jinzhu/copier" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/logx" ) @@ -27,60 +28,17 @@ func NewQueryExampleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Quer } func (l *QueryExampleLogic) QueryExample(req *types.QueryExampleReq) (resp *types.QueryExampleResp, err error) { - var exampleID int64 - switch req.Feature { - case "toc_PhoneThreeElements": - exampleID = 83 - case "toc_BankCardBlacklist": - exampleID = 106 - case "toc_IDCardTwoElements": - exampleID = 85 - case "toc_PhoneTwoElements": - exampleID = 86 - case "toc_NetworkDuration": - exampleID = 117 - case "toc_PhoneSecondaryCard": - exampleID = 124 - case "toc_PhoneNumberRisk": - exampleID = 126 - case "toc_BankCardFourElements": - exampleID = 131 - //case "toc_BankCardThreeElements": - // exampleID = 9 - //case "toc_NaturalLifeStatus": - // exampleID = 10 - //case "toc_EducationVerification": - // exampleID = 11 - case "toc_PersonVehicleVerification": - exampleID = 110 - case "toc_VehiclesUnderName": - exampleID = 108 - case "toc_DualMarriage": - exampleID = 103 - case "toc_PersonalBadRecord": - exampleID = 73 - case "toc_ShareholderBusinessRelation": - exampleID = 74 - case "toc_PersonalLawsuit": - exampleID = 75 - case "toc_EnterpriseLawsuit": - exampleID = 81 - case "toc_Marriage": - exampleID = 367 - case "toc_PersonalConsumptionRestriction": - exampleID = 2089 - case "toc_PersonalDiscredit": - exampleID = 2088 - default: - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "示例报告, 获取示例报告失败: %v", err) + product, err := l.svcCtx.ProductModel.FindOneByProductEn(l.ctx, req.Feature) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "示例报告, 获取商品信息失败: %v", err) } - queryModel, err := l.svcCtx.QueryModel.FindOne(l.ctx, exampleID) + exampleModel, err := l.svcCtx.ExampleModel.FindOneByProductId(l.ctx, product.Id) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "示例报告, 获取示例报告失败: %v", err) } var query types.Query - query.CreateTime = queryModel.CreateTime.Format("2006-01-02 15:04:05") - query.UpdateTime = queryModel.UpdateTime.Format("2006-01-02 15:04:05") + query.CreateTime = exampleModel.CreateTime.Format("2006-01-02 15:04:05") + query.UpdateTime = exampleModel.UpdateTime.Format("2006-01-02 15:04:05") // 解密查询数据 secretKey := l.svcCtx.Config.Encrypt.SecretKey @@ -88,23 +46,19 @@ func (l *QueryExampleLogic) QueryExample(req *types.QueryExampleReq) (resp *type if decodeErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取AES解密解药失败, %+v", err) } - processParamsErr := ProcessQueryParams(queryModel.QueryParams, &query.QueryParams, key) + processParamsErr := ProcessQueryParams(exampleModel.QueryParams, &query.QueryParams, key) if processParamsErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 报告参数处理失败: %v", processParamsErr) } - processErr := ProcessQueryData(queryModel.QueryData, &query.QueryData, key) + processErr := ProcessQueryData(exampleModel.QueryData, &query.QueryData, key) if processErr != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 报告结果处理失败: %v", processErr) } // 复制报告数据 - err = copier.Copy(&query, queryModel) + err = copier.Copy(&query, exampleModel) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 报告结构体复制失败, %+v", err) } - product, err := l.svcCtx.ProductModel.FindOne(l.ctx, queryModel.ProductId) - if err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "示例报告, 获取商品信息失败, %+v", err) - } query.ProductName = product.ProductName return &types.QueryExampleResp{ Query: query, diff --git a/app/user/cmd/api/internal/logic/query/queryservicelogic.go b/app/user/cmd/api/internal/logic/query/queryservicelogic.go index db16a89..70075c6 100644 --- a/app/user/cmd/api/internal/logic/query/queryservicelogic.go +++ b/app/user/cmd/api/internal/logic/query/queryservicelogic.go @@ -5,8 +5,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "github.com/pkg/errors" - "github.com/zeromicro/go-zero/core/stores/redis" "qnc-server/app/user/cmd/api/internal/service" "qnc-server/common/ctxdata" "qnc-server/common/xerr" @@ -14,6 +12,9 @@ import ( "qnc-server/pkg/lzkit/validator" "time" + "github.com/pkg/errors" + "github.com/zeromicro/go-zero/core/stores/redis" + "qnc-server/app/user/cmd/api/internal/svc" "qnc-server/app/user/cmd/api/internal/types" @@ -65,13 +66,24 @@ var productProcessors = map[string]func(*QueryServiceLogic, *types.QueryServiceR "toc_PersonalDiscredit": (*QueryServiceLogic).ProcessTocPersonalDiscreditLogic, // 车辆部分 - "toc_BankCardBlacklist": (*QueryServiceLogic).ProcessTocBankCardBlacklistLogic, - "toc_VehiclesUnderName": (*QueryServiceLogic).ProcessTocVehiclesUnderNameLogic, - "toc_vehicleInsuranceSummary": (*QueryServiceLogic).ProcessTocVehicleInsuranceSummaryLogic, - "toc_vehicleMaintenanceRecord": (*QueryServiceLogic).ProcessTocVehicleMaintenanceRecordLogic, - "toc_vehicleValuation": (*QueryServiceLogic).ProcessTocVehicleValuationLogic, - "toc_chassisNumberCheck": (*QueryServiceLogic).ProcessTocChassisNumberCheckLogic, - "toc_vehicleTransferCount": (*QueryServiceLogic).ProcessTocVehicleTransferCountLogic, + "toc_BankCardBlacklist": (*QueryServiceLogic).ProcessTocBankCardBlacklistLogic, + "toc_VehiclesUnderName": (*QueryServiceLogic).ProcessTocVehiclesUnderNameLogic, + "toc_vehicleInsuranceSummary": (*QueryServiceLogic).ProcessTocVehicleInsuranceSummaryLogic, + "toc_vehicleMaintenanceRecord": (*QueryServiceLogic).ProcessTocVehicleMaintenanceRecordLogic, + "toc_vehicleValuation": (*QueryServiceLogic).ProcessTocVehicleValuationLogic, + "toc_chassisNumberCheck": (*QueryServiceLogic).ProcessTocChassisNumberCheckLogic, + "toc_vehicleTransferCount": (*QueryServiceLogic).ProcessTocVehicleTransferCountLogic, + "toc_ExitRestriction": (*QueryServiceLogic).ProcessTocExitRestrictionLogic, + "toc_MonthlyMobileConsumptionLevel": (*QueryServiceLogic).ProcessTocMonthlyMobileConsumptionLevelLogic, + "toc_EducationVerification": (*QueryServiceLogic).ProcessTocEducationVerificationLogic, + "toc_FraudGamblingCheck": (*QueryServiceLogic).ProcessTocFraudGamblingCheckLogic, + "toc_MobileNumberValidation": (*QueryServiceLogic).ProcessTocMobileNumberValidationLogic, + "toc_BankCardLocation": (*QueryServiceLogic).ProcessTocBankCardLocationLogic, + "toc_BankCardNameElementVerification": (*QueryServiceLogic).ProcessTocBankCardNameElementVerificationLogic, + "toc_BankCardIDElementVerification": (*QueryServiceLogic).ProcessTocBankCardIDElementVerificationLogic, + "toc_BankCardThreeElementsVerification": (*QueryServiceLogic).ProcessTocBankCardThreeElementsVerificationLogic, + "toc_MobileRiskAssessment": (*QueryServiceLogic).ProcessTocMobileRiskAssessmentLogic, + "toc_MobileDrugFraudRiskCheck": (*QueryServiceLogic).ProcessTocMobileDrugFraudRiskCheckLogic, } func (l *QueryServiceLogic) PreprocessLogic(req *types.QueryServiceReq, product string) (*types.QueryServiceResp, error) { @@ -1316,6 +1328,428 @@ func (l *QueryServiceLogic) ProcessTocPersonalDiscreditLogic(req *types.QuerySer return &types.QueryServiceResp{Id: cacheNo}, nil } + +// ProcessTocExitRestrictionLogic 出境限制查询 +func (l *QueryServiceLogic) ProcessTocExitRestrictionLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocExitRestriction + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "name": data.Name, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_ExitRestriction", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocMonthlyMobileConsumptionLevelLogic 手机月消费档次查询 +func (l *QueryServiceLogic) ProcessTocMonthlyMobileConsumptionLevelLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocMonthlyMobileConsumptionLevel + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "mobile": data.Mobile, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_MonthlyMobileConsumptionLevel", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocEducationVerificationLogic 学历信息验证 +func (l *QueryServiceLogic) ProcessTocEducationVerificationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocEducationVerification + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "name": data.Name, + "id_card": data.IDCard, + "certificate_number": data.CertificateNumber, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_EducationVerification", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocMobileNumberValidationLogic 手机号空号检测 +func (l *QueryServiceLogic) ProcessTocMobileNumberValidationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocMobileNumberValidation + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "mobile": data.Mobile, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_MobileNumberValidation", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocBankCardLocationLogic 银行卡归属地查询 +func (l *QueryServiceLogic) ProcessTocBankCardLocationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocBankCardLocation + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "bank_card": data.BankCard, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_BankCardLocation", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocBankCardNameElementVerificationLogic 银行卡姓名二要素验证 +func (l *QueryServiceLogic) ProcessTocBankCardNameElementVerificationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocBankCardNameElementVerification + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "name": data.Name, + "bank_card": data.BankCard, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_BankCardNameElementVerification", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocBankCardIDElementVerificationLogic 银行卡号码二要素验证 +func (l *QueryServiceLogic) ProcessTocBankCardIDElementVerificationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocBankCardIDElementVerification + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "id_card": data.IDCard, + "bank_card": data.BankCard, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_BankCardIDElementVerification", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocBankCardThreeElementsVerificationLogic 银行卡三要素综合验证 +func (l *QueryServiceLogic) ProcessTocBankCardThreeElementsVerificationLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocBankCardThreeElementsVerification + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "name": data.Name, + "id_card": data.IDCard, + "bank_card": data.BankCard, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_BankCardThreeElementsVerification", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocMobileRiskAssessmentLogic 手机号码风险评估 +func (l *QueryServiceLogic) ProcessTocMobileRiskAssessmentLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocMobileRiskAssessment + if unmarshalErr := json.Unmarshal(decryptData, &data); unmarshalErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 解密后的数据格式不正确: %+v", unmarshalErr) + } + + if validatorErr := validator.Validate(data); validatorErr != nil { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, validatorErr.Error()), "查询服务, 参数不正确: %+v", validatorErr) + } + + params := map[string]interface{}{ + "mobile": data.Mobile, + } + cacheNo, cacheDataErr := l.CacheData(params, "toc_MobileRiskAssessment", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocMobileDrugFraudRiskCheckLogic 手机号贩毒反诈风险查询 +func (l *QueryServiceLogic) ProcessTocMobileDrugFraudRiskCheckLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocMobileDrugFraudRiskCheck + 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) + } + + // 确定keyword和type + var keyword string + var dataType int + + // 根据传入的字段确定keyword和type + if data.Mobile != "" { + keyword = data.Mobile + dataType = 1 + } else if data.BankCard != "" { + keyword = data.BankCard + dataType = 2 + } else if data.IDCard != "" { + keyword = data.IDCard + dataType = 3 + } else { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, "缺少必要参数"), + "查询服务, 参数不正确: 缺少手机号/银行卡/身份证号") + } + + // 构建参数 + params := map[string]interface{}{ + "keyword": keyword, + "type": dataType, + } + + cacheNo, cacheDataErr := l.CacheData(params, "toc_MobileDrugFraudRiskCheck", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} + +// ProcessTocFraudGamblingCheckLogic 反诈反赌风险核验 +func (l *QueryServiceLogic) ProcessTocFraudGamblingCheckLogic(req *types.QueryServiceReq) (*types.QueryServiceResp, error) { + userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx) + if getUidErr != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "查询服务, 获取用户信息失败, %+v", getUidErr) + } + + // AES解密 + decryptData, DecryptDataErr := l.DecryptData(req.Data) + if DecryptDataErr != nil { + return nil, DecryptDataErr + } + + // 校验参数 + var data types.TocFraudGamblingCheck + 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) + } + // 确定keyword和type + var keyword string + var dataType int + + // 根据传入的字段确定keyword和type + if data.Mobile != "" { + keyword = data.Mobile + dataType = 1 + } else if data.BankCard != "" { + keyword = data.BankCard + dataType = 2 + } else if data.IDCard != "" { + keyword = data.IDCard + dataType = 3 + } else { + return nil, errors.Wrapf(xerr.NewErrCodeMsg(xerr.PARAM_VERIFICATION_ERROR, "缺少必要参数"), + "查询服务, 参数不正确: 缺少手机号/银行卡/身份证号") + } + + // 构建参数 + params := map[string]interface{}{ + "keyword": keyword, + "type": dataType, + } + + cacheNo, cacheDataErr := l.CacheData(params, "toc_FraudGamblingCheck", userID) + if cacheDataErr != nil { + return nil, cacheDataErr + } + + return &types.QueryServiceResp{Id: cacheNo}, nil +} func (l *QueryServiceLogic) DecryptData(data string) ([]byte, error) { secretKey := l.svcCtx.Config.Encrypt.SecretKey key, decodeErr := hex.DecodeString(secretKey) diff --git a/app/user/cmd/api/internal/logic/query/querysingletestlogic.go b/app/user/cmd/api/internal/logic/query/querysingletestlogic.go index 00d72b7..75688d3 100644 --- a/app/user/cmd/api/internal/logic/query/querysingletestlogic.go +++ b/app/user/cmd/api/internal/logic/query/querysingletestlogic.go @@ -3,9 +3,10 @@ package query import ( "context" "encoding/json" - "github.com/pkg/errors" "qnc-server/common/xerr" + "github.com/pkg/errors" + "qnc-server/app/user/cmd/api/internal/svc" "qnc-server/app/user/cmd/api/internal/types" @@ -27,10 +28,11 @@ func NewQuerySingleTestLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Q } func (l *QuerySingleTestLogic) QuerySingleTest(req *types.QuerySingleTestReq) (resp *types.QuerySingleTestResp, err error) { - //featrueModel, err := l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, req.Api) - //if err != nil { - // return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 获取接口失败 : %d", err) - //} + _, err = l.svcCtx.FeatureModel.FindOneByApiId(l.ctx, req.Api) + if err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 获取接口失败 : %d", err) + } + marshalParams, err := json.Marshal(req.Params) if err != nil { return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "单查测试, 序列化参数失败 : %d", err) diff --git a/app/user/cmd/api/internal/service/apirequestService.go b/app/user/cmd/api/internal/service/apirequestService.go index 96b5ff4..57b791d 100644 --- a/app/user/cmd/api/internal/service/apirequestService.go +++ b/app/user/cmd/api/internal/service/apirequestService.go @@ -5,10 +5,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/Masterminds/squirrel" - "github.com/bytedance/sonic" - "github.com/tidwall/gjson" - "github.com/zeromicro/go-zero/core/logx" "io" "net/http" "net/url" @@ -20,6 +16,11 @@ import ( "sync" "sync/atomic" "time" + + "github.com/Masterminds/squirrel" + "github.com/bytedance/sonic" + "github.com/tidwall/gjson" + "github.com/zeromicro/go-zero/core/logx" ) type ApiRequestService struct { @@ -201,6 +202,17 @@ var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, err "G36SC01": (*ApiRequestService).ProcessG36SC01Request, "G22SC01": (*ApiRequestService).ProcessG22SC01Request, "Q03SC01": (*ApiRequestService).ProcessQ03SC01Request, + "COM187": (*ApiRequestService).ProcessCOM187Request, + "MOB035": (*ApiRequestService).ProcessMOB035Request, + "PCB915": (*ApiRequestService).ProcessPCB915Request, + "RIS031": (*ApiRequestService).ProcessRIS031Request, + "PCB601": (*ApiRequestService).ProcessPCB601Request, + "PCB148": (*ApiRequestService).ProcessPCB148Request, + "FIN011": (*ApiRequestService).ProcessFIN011Request, + "FIN020": (*ApiRequestService).ProcessFIN020Request, + "FIN018": (*ApiRequestService).ProcessFIN018Request, + "MOB032": (*ApiRequestService).ProcessMOB032Request, + "FIN032": (*ApiRequestService).ProcessFIN032Request, } // PreprocessRequestApi 调用指定的请求处理函数 @@ -1204,3 +1216,212 @@ func (a *ApiRequestService) ProcessQ03SC01Request(params []byte) ([]byte, error) } return marshal, nil } + +// 出境限制查询 +func (a *ApiRequestService) ProcessCOM187Request(params []byte) ([]byte, error) { + name := gjson.GetBytes(params, "name") + if !name.Exists() { + return nil, errors.New("api请求, COM187, 获取相关参数失败") + } + + request := map[string]interface{}{ + "keyword": name.String(), + } + resp, err := a.yushanService.request("COM187", request) + if err != nil { + return nil, fmt.Errorf("出境限制查询失败: %+v", err) + } + return resp, nil +} + +// 手机月消费档次查询 +func (a *ApiRequestService) ProcessMOB035Request(params []byte) ([]byte, error) { + mobile := gjson.GetBytes(params, "mobile") + if !mobile.Exists() { + return nil, errors.New("api请求, MOB035, 获取相关参数失败") + } + + request := map[string]interface{}{ + "mobile": mobile.String(), + } + resp, err := a.yushanService.request("MOB035", request) + if err != nil { + return nil, fmt.Errorf("手机月消费档次查询失败: %+v", err) + } + return resp, nil +} + +// 学历信息验证 +func (a *ApiRequestService) ProcessPCB915Request(params []byte) ([]byte, error) { + name := gjson.GetBytes(params, "name") + idCard := gjson.GetBytes(params, "id_card") + certificateNumber := gjson.GetBytes(params, "certificate_number") + + if !name.Exists() || !idCard.Exists() || !certificateNumber.Exists() { + return nil, errors.New("api请求, PCB915, 获取相关参数失败") + } + + request := map[string]interface{}{ + "name": name.String(), + "cardNo": idCard.String(), + "certificateNo": certificateNumber.String(), + } + resp, err := a.yushanService.request("PCB915", request) + if err != nil { + return nil, fmt.Errorf("学历信息验证失败: %+v", err) + } + return resp, nil +} + +// 反诈反赌风险核验 +func (a *ApiRequestService) ProcessRIS031Request(params []byte) ([]byte, error) { + keyword := gjson.GetBytes(params, "keyword") + typeName := gjson.GetBytes(params, "type") + + if !keyword.Exists() || !typeName.Exists() { + return nil, errors.New("api请求, RIS031, 获取相关参数失败") + } + + request := map[string]interface{}{ + "keyWord": keyword.String(), + "type": typeName.Int(), + } + resp, err := a.yushanService.request("RIS031", request) + if err != nil { + return nil, fmt.Errorf("反诈反赌风险核验失败: %+v", err) + } + return resp, nil +} + +// 手机号空号检测 +func (a *ApiRequestService) ProcessPCB601Request(params []byte) ([]byte, error) { + mobile := gjson.GetBytes(params, "mobile") + if !mobile.Exists() { + return nil, errors.New("api请求, PCB601, 获取相关参数失败") + } + + request := map[string]interface{}{ + "mobile": mobile.String(), + } + resp, err := a.yushanService.request("PCB601", request) + if err != nil { + return nil, fmt.Errorf("手机号空号检测失败: %+v", err) + } + return resp, nil +} + +// 银行卡归属地查询 +func (a *ApiRequestService) ProcessPCB148Request(params []byte) ([]byte, error) { + bankCard := gjson.GetBytes(params, "bank_card") + if !bankCard.Exists() { + return nil, errors.New("api请求, PCB148, 获取相关参数失败") + } + + request := map[string]interface{}{ + "cardId": bankCard.String(), + } + resp, err := a.yushanService.request("PCB148", request) + if err != nil { + return nil, fmt.Errorf("银行卡归属地查询失败: %+v", err) + } + return resp, nil +} + +// 银行卡姓名二要素验证 +func (a *ApiRequestService) ProcessFIN011Request(params []byte) ([]byte, error) { + name := gjson.GetBytes(params, "name") + bankCard := gjson.GetBytes(params, "bank_card") + + if !name.Exists() || !bankCard.Exists() { + return nil, errors.New("api请求, FIN011, 获取相关参数失败") + } + + request := map[string]interface{}{ + "name": name.String(), + "cardId": bankCard.String(), + } + resp, err := a.yushanService.request("FIN011", request) + if err != nil { + return nil, fmt.Errorf("银行卡姓名二要素验证失败: %+v", err) + } + return resp, nil +} + +// 银行卡号码二要素验证 +func (a *ApiRequestService) ProcessFIN020Request(params []byte) ([]byte, error) { + idCard := gjson.GetBytes(params, "id_card") + bankCard := gjson.GetBytes(params, "bank_card") + + if !idCard.Exists() || !bankCard.Exists() { + return nil, errors.New("api请求, FIN020, 获取相关参数失败") + } + + request := map[string]interface{}{ + "cardNo": idCard.String(), + "cardId": bankCard.String(), + } + resp, err := a.yushanService.request("FIN020", request) + if err != nil { + return nil, fmt.Errorf("银行卡号码二要素验证失败: %+v", err) + } + return resp, nil +} + +// 银行卡三要素综合验证 +func (a *ApiRequestService) ProcessFIN018Request(params []byte) ([]byte, error) { + name := gjson.GetBytes(params, "name") + idCard := gjson.GetBytes(params, "id_card") + bankCard := gjson.GetBytes(params, "bank_card") + + if !name.Exists() || !idCard.Exists() || !bankCard.Exists() { + return nil, errors.New("api请求, FIN018, 获取相关参数失败") + } + + request := map[string]interface{}{ + "name": name.String(), + "cardNo": idCard.String(), + "cardId": bankCard.String(), + } + resp, err := a.yushanService.request("FIN018", request) + if err != nil { + return nil, fmt.Errorf("银行卡三要素综合验证失败: %+v", err) + } + return resp, nil +} + +// 手机号码风险评估 +func (a *ApiRequestService) ProcessMOB032Request(params []byte) ([]byte, error) { + mobile := gjson.GetBytes(params, "mobile") + if !mobile.Exists() { + return nil, errors.New("api请求, MOB032, 获取相关参数失败") + } + + request := map[string]interface{}{ + "mobile": mobile.String(), + } + resp, err := a.yushanService.request("MOB032", request) + if err != nil { + return nil, fmt.Errorf("手机号码风险评估失败: %+v", err) + } + return resp, nil +} + +// 手机号贩毒反诈风险查询 +func (a *ApiRequestService) ProcessFIN032Request(params []byte) ([]byte, error) { + keyword := gjson.GetBytes(params, "keyword") + typeName := gjson.GetBytes(params, "type") + + if !keyword.Exists() || !typeName.Exists() { + return nil, errors.New("api请求, FIN032, 获取相关参数失败") + } + + request := map[string]interface{}{ + "keyWord": keyword.String(), + "type": typeName.Int(), + } + resp, err := a.yushanService.request("FIN032", request) + if err != nil { + return nil, fmt.Errorf("手机号贩毒反诈风险查询失败: %+v", err) + } + return resp, nil +} diff --git a/app/user/cmd/api/internal/svc/servicecontext.go b/app/user/cmd/api/internal/svc/servicecontext.go index 8a5a08c..46dd3dc 100644 --- a/app/user/cmd/api/internal/svc/servicecontext.go +++ b/app/user/cmd/api/internal/svc/servicecontext.go @@ -1,15 +1,16 @@ package svc import ( + "qnc-server/app/user/cmd/api/internal/config" + "qnc-server/app/user/cmd/api/internal/middleware" + "qnc-server/app/user/cmd/api/internal/service" + "qnc-server/app/user/model" + "github.com/hibiken/asynq" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/redis" "github.com/zeromicro/go-zero/core/stores/sqlx" "github.com/zeromicro/go-zero/rest" - "qnc-server/app/user/cmd/api/internal/config" - "qnc-server/app/user/cmd/api/internal/middleware" - "qnc-server/app/user/cmd/api/internal/service" - "qnc-server/app/user/model" ) type ServiceContext struct { @@ -30,6 +31,7 @@ type ServiceContext struct { AgentCommissionModel model.AgentCommissionModel AgentWalletModel model.AgentWalletModel GlobalNotificationsModel model.GlobalNotificationsModel + ExampleModel model.ExampleModel AlipayService *service.AliPayService WechatPayService *service.WechatPayService ApplePayService *service.ApplePayService @@ -82,6 +84,7 @@ func NewServiceContext(c config.Config) *ServiceContext { ProductRenderModel: model.NewProductRenderModel(db, c.CacheRedis), OrderModel: model.NewOrderModel(db, c.CacheRedis), QueryModel: model.NewQueryModel(db, c.CacheRedis), + ExampleModel: model.NewExampleModel(db, c.CacheRedis), GlobalNotificationsModel: model.NewGlobalNotificationsModel(db, c.CacheRedis), AgentModel: model.NewAgentModel(db, c.CacheRedis), AgentAuditModel: model.NewAgentAuditModel(db, c.CacheRedis), diff --git a/app/user/cmd/api/internal/types/query.go b/app/user/cmd/api/internal/types/query.go index 5b4df06..c2da4ae 100644 --- a/app/user/cmd/api/internal/types/query.go +++ b/app/user/cmd/api/internal/types/query.go @@ -112,3 +112,68 @@ type TocPhoneSecondaryCard struct { Mobile string `json:"mobile" validate:"required,mobile"` StartDate string `json:"start_date" validate:"required"` } + +// 出境限制查询 +type TocExitRestriction struct { + Name string `json:"name" validate:"required,name"` +} + +// 手机月消费档次查询 +type TocMonthlyMobileConsumptionLevel struct { + Mobile string `json:"mobile" validate:"required,mobile"` +} + +// 学历信息验证 +type TocEducationVerification struct { + Name string `json:"name" validate:"required,name"` + IDCard string `json:"id_card" validate:"required,idCard"` + CertificateNumber string `json:"certificate_number" validate:"required"` +} + +// 反诈反赌风险核验 +type TocFraudGamblingCheck struct { + Mobile string `json:"mobile,omitempty" validate:"omitempty,mobile"` + BankCard string `json:"bank_card,omitempty" validate:"omitempty,bankCard"` + IDCard string `json:"id_card,omitempty" validate:"omitempty,idCard"` +} + +// 手机号反赌反诈风险查询 +type TocMobileDrugFraudRiskCheck struct { + Mobile string `json:"mobile,omitempty" validate:"omitempty,mobile"` + BankCard string `json:"bank_card,omitempty" validate:"omitempty,bankCard"` + IDCard string `json:"id_card,omitempty" validate:"omitempty,idCard"` +} + +// 手机号空号检测 +type TocMobileNumberValidation struct { + Mobile string `json:"mobile" validate:"required,mobile"` +} + +// 银行卡归属地查询 +type TocBankCardLocation struct { + BankCard string `json:"bank_card" validate:"required"` +} + +// 银行卡姓名二要素验证 +type TocBankCardNameElementVerification struct { + Name string `json:"name" validate:"required,name"` + BankCard string `json:"bank_card" validate:"required"` +} + +// 银行卡号码二要素验证 +type TocBankCardIDElementVerification struct { + IDCard string `json:"id_card" validate:"required,idCard"` + BankCard string `json:"bank_card" validate:"required"` +} + +// 银行卡三要素综合验证 +type TocBankCardThreeElementsVerification struct { + Name string `json:"name" validate:"required,name"` + IDCard string `json:"id_card" validate:"required,idCard"` + BankCard string `json:"bank_card" validate:"required"` +} + +// 手机号码风险评估 +type TocMobileRiskAssessment struct { + Mobile string `json:"mobile" validate:"required,mobile"` +} diff --git a/app/user/cmd/api/main.go b/app/user/cmd/api/main.go index 93b3307..6d37348 100644 --- a/app/user/cmd/api/main.go +++ b/app/user/cmd/api/main.go @@ -4,13 +4,14 @@ import ( "context" "flag" "fmt" - "github.com/zeromicro/go-zero/core/logx" "os" "qnc-server/app/user/cmd/api/internal/config" "qnc-server/app/user/cmd/api/internal/handler" "qnc-server/app/user/cmd/api/internal/queue" "qnc-server/app/user/cmd/api/internal/svc" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/conf" "github.com/zeromicro/go-zero/rest" ) @@ -25,7 +26,7 @@ func main() { // 根据 ENV 加载不同的配置文件 var defaultConfigFile string if env == "development" { - defaultConfigFile = "etc/main.dev.yaml" // 开发环境配置 + defaultConfigFile = "app/user/cmd/api/etc/main.dev.yaml" } else { defaultConfigFile = "etc/main.yaml" // 生产环境配置 } diff --git a/app/user/model/exampleModel.go b/app/user/model/exampleModel.go new file mode 100644 index 0000000..d041ea0 --- /dev/null +++ b/app/user/model/exampleModel.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 _ ExampleModel = (*customExampleModel)(nil) + +type ( + // ExampleModel is an interface to be customized, add more methods here, + // and implement the added methods in customExampleModel. + ExampleModel interface { + exampleModel + } + + customExampleModel struct { + *defaultExampleModel + } +) + +// NewExampleModel returns a model for the database table. +func NewExampleModel(conn sqlx.SqlConn, c cache.CacheConf) ExampleModel { + return &customExampleModel{ + defaultExampleModel: newExampleModel(conn, c), + } +} diff --git a/app/user/model/exampleModel_gen.go b/app/user/model/exampleModel_gen.go new file mode 100644 index 0000000..935642c --- /dev/null +++ b/app/user/model/exampleModel_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" + "qnc-server/common/globalkey" +) + +var ( + exampleFieldNames = builder.RawFieldNames(&Example{}) + exampleRows = strings.Join(exampleFieldNames, ",") + exampleRowsExpectAutoSet = strings.Join(stringx.Remove(exampleFieldNames, "`id`", "`create_time`", "`update_time`"), ",") + exampleRowsWithPlaceHolder = strings.Join(stringx.Remove(exampleFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?" + + cacheQncExampleIdPrefix = "cache:qnc:example:id:" + cacheQncExampleProductIdPrefix = "cache:qnc:example:productId:" +) + +type ( + exampleModel interface { + Insert(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) + FindOne(ctx context.Context, id int64) (*Example, error) + FindOneByProductId(ctx context.Context, productId int64) (*Example, error) + Update(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) + UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Example) error + Trans(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error + SelectBuilder() squirrel.SelectBuilder + DeleteSoft(ctx context.Context, session sqlx.Session, data *Example) 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) ([]*Example, error) + FindPageListByPage(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, error) + FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, int64, error) + FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Example, error) + FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Example, error) + Delete(ctx context.Context, session sqlx.Session, id int64) error + } + + defaultExampleModel struct { + sqlc.CachedConn + table string + } + + Example struct { + Id int64 `db:"id"` // 主键ID + ProductId int64 `db:"product_id"` // 产品ID(直接关联到产品) + QueryParams string `db:"query_params"` // 查询params数据 + QueryData sql.NullString `db:"query_data"` // 查询结果数据 + DelState int64 `db:"del_state"` // 删除状态 + Version int64 `db:"version"` // 版本号 + CreateTime time.Time `db:"create_time"` // 创建时间 + UpdateTime time.Time `db:"update_time"` // 更新时间 + DeleteTime sql.NullTime `db:"delete_time"` // 删除时间 + } +) + +func newExampleModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultExampleModel { + return &defaultExampleModel{ + CachedConn: sqlc.NewConn(conn, c), + table: "`example`", + } +} + +func (m *defaultExampleModel) Insert(ctx context.Context, session sqlx.Session, data *Example) (sql.Result, error) { + data.DelState = globalkey.DelStateNo + qncExampleIdKey := fmt.Sprintf("%s%v", cacheQncExampleIdPrefix, data.Id) + qncExampleProductIdKey := fmt.Sprintf("%s%v", cacheQncExampleProductIdPrefix, 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, exampleRowsExpectAutoSet) + if session != nil { + return session.ExecCtx(ctx, query, data.ProductId, data.QueryParams, data.QueryData, data.DelState, data.Version, data.DeleteTime) + } + return conn.ExecCtx(ctx, query, data.ProductId, data.QueryParams, data.QueryData, data.DelState, data.Version, data.DeleteTime) + }, qncExampleIdKey, qncExampleProductIdKey) +} + +func (m *defaultExampleModel) FindOne(ctx context.Context, id int64) (*Example, error) { + qncExampleIdKey := fmt.Sprintf("%s%v", cacheQncExampleIdPrefix, id) + var resp Example + err := m.QueryRowCtx(ctx, &resp, qncExampleIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", exampleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo) + }) + switch err { + case nil: + return &resp, nil + case sqlc.ErrNotFound: + return nil, ErrNotFound + default: + return nil, err + } +} + +func (m *defaultExampleModel) FindOneByProductId(ctx context.Context, productId int64) (*Example, error) { + qncExampleProductIdKey := fmt.Sprintf("%s%v", cacheQncExampleProductIdPrefix, productId) + var resp Example + err := m.QueryRowIndexCtx(ctx, &resp, qncExampleProductIdKey, 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", exampleRows, 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 *defaultExampleModel) Update(ctx context.Context, session sqlx.Session, newData *Example) (sql.Result, error) { + data, err := m.FindOne(ctx, newData.Id) + if err != nil { + return nil, err + } + qncExampleIdKey := fmt.Sprintf("%s%v", cacheQncExampleIdPrefix, data.Id) + qncExampleProductIdKey := fmt.Sprintf("%s%v", cacheQncExampleProductIdPrefix, 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, exampleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.ProductId, newData.QueryParams, newData.QueryData, newData.DelState, newData.Version, newData.DeleteTime, newData.Id) + } + return conn.ExecCtx(ctx, query, newData.ProductId, newData.QueryParams, newData.QueryData, newData.DelState, newData.Version, newData.DeleteTime, newData.Id) + }, qncExampleIdKey, qncExampleProductIdKey) +} + +func (m *defaultExampleModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Example) 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 + } + qncExampleIdKey := fmt.Sprintf("%s%v", cacheQncExampleIdPrefix, data.Id) + qncExampleProductIdKey := fmt.Sprintf("%s%v", cacheQncExampleProductIdPrefix, 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, exampleRowsWithPlaceHolder) + if session != nil { + return session.ExecCtx(ctx, query, newData.ProductId, newData.QueryParams, newData.QueryData, newData.DelState, newData.Version, newData.DeleteTime, newData.Id, oldVersion) + } + return conn.ExecCtx(ctx, query, newData.ProductId, newData.QueryParams, newData.QueryData, newData.DelState, newData.Version, newData.DeleteTime, newData.Id, oldVersion) + }, qncExampleIdKey, qncExampleProductIdKey) + if err != nil { + return err + } + updateCount, err := sqlResult.RowsAffected() + if err != nil { + return err + } + if updateCount == 0 { + return ErrNoRowsUpdate + } + + return nil +} + +func (m *defaultExampleModel) DeleteSoft(ctx context.Context, session sqlx.Session, data *Example) 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 "), "ExampleModel delete err : %+v", err) + } + return nil +} + +func (m *defaultExampleModel) 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 *defaultExampleModel) 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 *defaultExampleModel) FindAll(ctx context.Context, builder squirrel.SelectBuilder, orderBy string) ([]*Example, error) { + + builder = builder.Columns(exampleRows) + + 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 []*Example + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultExampleModel) FindPageListByPage(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, error) { + + builder = builder.Columns(exampleRows) + + 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 []*Example + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultExampleModel) FindPageListByPageWithTotal(ctx context.Context, builder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Example, int64, error) { + + total, err := m.FindCount(ctx, builder, "id") + if err != nil { + return nil, 0, err + } + + builder = builder.Columns(exampleRows) + + 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 []*Example + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, total, nil + default: + return nil, total, err + } +} + +func (m *defaultExampleModel) FindPageListByIdDESC(ctx context.Context, builder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Example, error) { + + builder = builder.Columns(exampleRows) + + 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 []*Example + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultExampleModel) FindPageListByIdASC(ctx context.Context, builder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Example, error) { + + builder = builder.Columns(exampleRows) + + 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 []*Example + err = m.QueryRowsNoCacheCtx(ctx, &resp, query, values...) + switch err { + case nil: + return resp, nil + default: + return nil, err + } +} + +func (m *defaultExampleModel) 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 *defaultExampleModel) SelectBuilder() squirrel.SelectBuilder { + return squirrel.Select().From(m.table) +} +func (m *defaultExampleModel) Delete(ctx context.Context, session sqlx.Session, id int64) error { + data, err := m.FindOne(ctx, id) + if err != nil { + return err + } + + qncExampleIdKey := fmt.Sprintf("%s%v", cacheQncExampleIdPrefix, id) + qncExampleProductIdKey := fmt.Sprintf("%s%v", cacheQncExampleProductIdPrefix, 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) + }, qncExampleIdKey, qncExampleProductIdKey) + return err +} +func (m *defaultExampleModel) formatPrimary(primary interface{}) string { + return fmt.Sprintf("%s%v", cacheQncExampleIdPrefix, primary) +} +func (m *defaultExampleModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error { + query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", exampleRows, m.table) + return conn.QueryRowCtx(ctx, v, query, primary, globalkey.DelStateNo) +} + +func (m *defaultExampleModel) tableName() string { + return m.table +} diff --git a/tmp/build-errors.log b/tmp/build-errors.log new file mode 100644 index 0000000..6ccc48a --- /dev/null +++ b/tmp/build-errors.log @@ -0,0 +1 @@ +exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file diff --git a/tmp/main.exe b/tmp/main.exe new file mode 100644 index 0000000..4857176 Binary files /dev/null and b/tmp/main.exe differ