diff --git a/app/main/api/etc/main.dev.yaml b/app/main/api/etc/main.dev.yaml index 3bb6e37..eba0c1e 100644 --- a/app/main/api/etc/main.dev.yaml +++ b/app/main/api/etc/main.dev.yaml @@ -29,10 +29,10 @@ YushanConfig: AcctID: "YSSJ843926726" Url: "https://api.yushanshuju.com/credit-gw/service" Alipay: - AppID: "2021004165608254" - PrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPsXuwFJeHAL8CwI0QdD9GP7xQ8eejIoQKg6J3/peu26su68JCtGSRhlDm/7vbLHJcFR6h7at+INoz2juc7SqlmNO7i9wKc3+Ua0487y1G2fCsneRNxTTqbceBZwqjj9/AAN0u5/4nSl0bcqTeMddofdpTGOvwGvIJh6CZgCglnhMZnH4D6H6yiIyZf7Q6k2d/qBpVGK8kluYEtSnf/vEQCHhxRx+/DgTL7V1LjbA3BYoPTELZ15JAj0uIzuxextAtxOm4+Huli0RJFAN3q/to2L1Zs8yYY1gKJyTaPWKsJWBx8zI+gZcC/e45k6CZnGgh1Fn3+Xqkf7eGxJGGHs1fAgMBAAECggEAM2rkApbrvdBDiV2TXK7sMVv/K8vUAmkIbKa7zUpZxqUuNSUBp1LbpcM1UeNyujPGXDLmejUMp55j1igiKr4nA4iTQ0oBm+/GWDqpjV5cijzURUBegIGvtK9Bs4lGok6KVy839l/nbvHKLVcxrZySIv7dz9xcGNfbghN5IVRdiU/kOokNbtwQNC837piG5q4PHL6bzwIUGbrLED/RDmw/IwVMMmZovcQQ2JAuWJBo9CS9LB0Nc3I4MOPNx/0Rl+5URSSfmJAriL5ihlWckocQCUHwhRpSGQ6Q4xAXFYvb8OsApAQG3WU9SciBfs2wg/QfGNFzwQgGFofPcTQg3DTeuQKBgQDUHBTsgoe3WXnGo6qZKw1zA4OtF67IJJoltHo5JtkBRKCNVU3BJ+q+6i/fn0MBwScKQ1mhPjWe3h+qTRT207RRxGaxb6ljATOiU+BxmpHvu6jP+DVYtP5F3M7MCAGqpDAEoXgoAWttxmijqk+5YuLOLe0j/btCmpzuH7zwxSnqlQKBgQCtbTvaS/g+Jeu4Ml6iv7xi5//JCjeTn2wUJpXnNmN0jn+riRwEO81z4GWuOI8WukZHHAnufI6qWk2sLH0gcdLQ/STsMnl2L3NbeUyO8o5w2JSAlnZDYfaFfasGqFkGJrBLqG6bh/Bk1DP3/Bl6iMEwDbmu7Ptoy8ihokng9dEPIwKBgBHdi6WgGO5IiwlAH85m4eseEKkzpXUWICWs3d6SdxS0QxGkbbgnNI6ACyg6sdoj+rXSlmoOY1XOP7yIYYuoqTd542xui0XbhA3YIr9u1XvrwnxB27xtAj3AK2rkAb/ttF2ve/9inznPzGB8p9plidTz6VVuuacSfsVPxwpAkRdBAoGAR7c9Ifd6b1DFGkWSBuEc6RWhG6Si+OPbELYoFRXTqNZoiynGsSV9v2ZTBemTmkVrXGqG3N0bLezr47/9+lW3ZP7ZrubsfWf/3xrZAt/g8V9OgaI2w4SWKfuepsElFzsWeiLroltjmH58Axd3/cjhgpqaZ3DOQjbK/7QZsvJUAlsCgYEAqTQVhKLizM7BvXu1N6Z2K8trfJbiN+f90XhZIRPkIIcom0PnOfXhRtT76MCxz9n+lwf+alOKOfbQFy0pZtWG/eaFSYroQlXL+EfmqlFPXZR6D0NQLeygWAKH8161IQUh2VF3Qkhle6g6ZkyJA3Ev4RmqH2BYGv8hcZTTHsZ3Ic4=" + AppID: "2021006115614672" + PrivateKey: "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDJzOKCuHfM2/VYSroIm2TcO/Eoych6wF1FUtPeAoTva+YgHMrEDXt/OvqfNMylvtZYZya4hocZ9KTDA0FwHmFT9RP0tu0hXzNcKLx2U31iwi6Y29f0EwSYHvLIDjLw0XbxownR7iHvoCaXLtHz2S4tcJNB5sew3asOEAMTAKq1z679R/3WETVRPsNl211vhkxUpcL4Ct97s/lVL/cwRFFEi2LajfCVZLqzrlkaQJucGcFQBdbzDd3gDrGtpmQvtmDWoAasg0/Kt7UJ6FPZKbbb9fc0yZAMSkD00jyVfYwq56TGXAP4P+NGhGGd0gbTGHPPA4Dr9zxSuQNAqiYn/mEPAgMBAAECggEBAIfpeOkHqpAL2LsFYTQozI5TxMFu3Zpm8qqc9VrCIZxK9GvOWHYginuPUnpliitbU2uo1XhUCqvdjBZXm/wSSgTMvAsGJMFkJ+g6+2tKIdmg5NdIwbJ+GIsH1QYOIhr1SIHIB/YexzZni3YpL3hnXmV2O4eYEgg501oeSKPEwDTAHy+rbj45ddmvbI/UQcAtl+TdbIt5JtCkCBe0emDT9xIuHYynfb2nuDm+x39k7RvOhLdm2JfR99nl20yFjTB6j7NoP77KXk6mw75PH/Mv2swyxUueRjUrXJUM1kU+PIUtIDklivdaseumL8nueiS2Eblg8zwE9UyvhiN/yDFcs0kCgYEA+QKrOw4kVnkRzqWp4KctWPtMm9fpuvzvIdnTWvRxRppP9wuoDrS9JXGldUnX9exQNExWay9CQlGzg+kkP28eFgY0Aj5muyrTT7IiMu31oOgeNnYiCTtGx2Li+Yo06h6MyRyrlbdgUQCZ5Geq3pE0N1uOPBSOGlFGxKCS6m/BkZ0CgYEAz3b5o+wCBycRyzvgWY66yzYZxQQDdQt67gt8JkHI3onufkyq7iYytHhYNpI/zTtOGoUTq+tEFBPzquQ+/pVRWmYHlIt4SZGIA29c3BEbTxA8UFXdcu0ZV3/RuKot9fhHIWMeK05lDzG81fvGnMONTilDKooNEGNDDVx4fLNR45sCgYEA8Myz6Zfza+wIXF23uZfxMmtR2iMh08FlPsb2rK5WHIB9c9nB2vbNMriD2LhgL2Em7mwj5eL9oESB5L5AX1eFMKcvBDxz++ueDSOmDrovHjtZfDEhGOxJtebat5X/Naf1XUZsZ4u9iJecOlRF2JVyeVYAZfk6shiG5v6hFDSea8ECgYAWPdkRm9Gz1ppvwWGR+F1KP+iPWJjOSYbKUmzi5RaV1Q++dpW0pl+1PVmnsBIq/HqpGS88tSI9TM5IueOPA48PM/UIFdO1f2anh57a8PKOjV0J98qf8Y9P9CIVvBjlT9LAX5Hybpsi/+AQyMdIMybJBF9xBg/Ue+/KVOmN5OOYlQKBgQCKS73P9EXgEjUfI5YxOvr1zEw/go6hFnt6G2i4lEtGUg9FKvNCz082TL6fYVADyoTL4LR8VuOHTNd4XsRTlQEYwWWUNAQxapLtTqRCQDsQhQh9aMJc9a/FAl9k6Zn9fInAy0BLstJBMRLVvTvLXT2EsAfYZVuTuwi0aEQSxkiFjA==" AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2CqoCp95w/JV3RT/gzF4/8QmVT1HQNaeW7yUp+mA7x9AbjvlTW/+eRn6oGAL/XhZLjvHD0XjKLVKX0MJVS1aUQHEHEbOJN4Eu8II45OavD4iZISa7Kp9V6AM+i4qTyaeV2wNDnGxHQBaLVUGCfMR+56EK2YpORdE1H9uy72SSQseVb3bmpsV9EW/IJNmcVL/ut3uA1JWAoRmzlQ7ekxg7p8AYXzYPEHQr1tl7W+M4zv9wO9GKZCxIqMA8U3RP5npPfRaCfIRGzXzCqFEEUvWuidOB7frsvN4jiPD07qpL2Bi9LM1X/ee2kC/oM8Uhd7ERZhG8MbZfijZKxgrsDKBcwIDAQAB" - AppCertPath: "etc/merchant/appCertPublicKey_2021004165608254.crt" + AppCertPath: "etc/merchant/appCertPublicKey_2021006115614672.crt" AlipayCertPath: "etc/merchant/alipayCertPublicKey_RSA2.crt" AlipayRootCertPath: "etc/merchant/alipayRootCert.crt" IsProduction: true diff --git a/app/main/api/etc/main.yaml b/app/main/api/etc/main.yaml index 8410ef3..7e84ad5 100644 --- a/app/main/api/etc/main.yaml +++ b/app/main/api/etc/main.yaml @@ -22,10 +22,10 @@ VerifyCode: Encrypt: SecretKey: "ff83609b2b24fc73196aac3d3dfb874f" Alipay: - AppID: "2021004165608254" - PrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCPsXuwFJeHAL8CwI0QdD9GP7xQ8eejIoQKg6J3/peu26su68JCtGSRhlDm/7vbLHJcFR6h7at+INoz2juc7SqlmNO7i9wKc3+Ua0487y1G2fCsneRNxTTqbceBZwqjj9/AAN0u5/4nSl0bcqTeMddofdpTGOvwGvIJh6CZgCglnhMZnH4D6H6yiIyZf7Q6k2d/qBpVGK8kluYEtSnf/vEQCHhxRx+/DgTL7V1LjbA3BYoPTELZ15JAj0uIzuxextAtxOm4+Huli0RJFAN3q/to2L1Zs8yYY1gKJyTaPWKsJWBx8zI+gZcC/e45k6CZnGgh1Fn3+Xqkf7eGxJGGHs1fAgMBAAECggEAM2rkApbrvdBDiV2TXK7sMVv/K8vUAmkIbKa7zUpZxqUuNSUBp1LbpcM1UeNyujPGXDLmejUMp55j1igiKr4nA4iTQ0oBm+/GWDqpjV5cijzURUBegIGvtK9Bs4lGok6KVy839l/nbvHKLVcxrZySIv7dz9xcGNfbghN5IVRdiU/kOokNbtwQNC837piG5q4PHL6bzwIUGbrLED/RDmw/IwVMMmZovcQQ2JAuWJBo9CS9LB0Nc3I4MOPNx/0Rl+5URSSfmJAriL5ihlWckocQCUHwhRpSGQ6Q4xAXFYvb8OsApAQG3WU9SciBfs2wg/QfGNFzwQgGFofPcTQg3DTeuQKBgQDUHBTsgoe3WXnGo6qZKw1zA4OtF67IJJoltHo5JtkBRKCNVU3BJ+q+6i/fn0MBwScKQ1mhPjWe3h+qTRT207RRxGaxb6ljATOiU+BxmpHvu6jP+DVYtP5F3M7MCAGqpDAEoXgoAWttxmijqk+5YuLOLe0j/btCmpzuH7zwxSnqlQKBgQCtbTvaS/g+Jeu4Ml6iv7xi5//JCjeTn2wUJpXnNmN0jn+riRwEO81z4GWuOI8WukZHHAnufI6qWk2sLH0gcdLQ/STsMnl2L3NbeUyO8o5w2JSAlnZDYfaFfasGqFkGJrBLqG6bh/Bk1DP3/Bl6iMEwDbmu7Ptoy8ihokng9dEPIwKBgBHdi6WgGO5IiwlAH85m4eseEKkzpXUWICWs3d6SdxS0QxGkbbgnNI6ACyg6sdoj+rXSlmoOY1XOP7yIYYuoqTd542xui0XbhA3YIr9u1XvrwnxB27xtAj3AK2rkAb/ttF2ve/9inznPzGB8p9plidTz6VVuuacSfsVPxwpAkRdBAoGAR7c9Ifd6b1DFGkWSBuEc6RWhG6Si+OPbELYoFRXTqNZoiynGsSV9v2ZTBemTmkVrXGqG3N0bLezr47/9+lW3ZP7ZrubsfWf/3xrZAt/g8V9OgaI2w4SWKfuepsElFzsWeiLroltjmH58Axd3/cjhgpqaZ3DOQjbK/7QZsvJUAlsCgYEAqTQVhKLizM7BvXu1N6Z2K8trfJbiN+f90XhZIRPkIIcom0PnOfXhRtT76MCxz9n+lwf+alOKOfbQFy0pZtWG/eaFSYroQlXL+EfmqlFPXZR6D0NQLeygWAKH8161IQUh2VF3Qkhle6g6ZkyJA3Ev4RmqH2BYGv8hcZTTHsZ3Ic4=" + AppID: "2021006115614672" + PrivateKey: "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDJzOKCuHfM2/VYSroIm2TcO/Eoych6wF1FUtPeAoTva+YgHMrEDXt/OvqfNMylvtZYZya4hocZ9KTDA0FwHmFT9RP0tu0hXzNcKLx2U31iwi6Y29f0EwSYHvLIDjLw0XbxownR7iHvoCaXLtHz2S4tcJNB5sew3asOEAMTAKq1z679R/3WETVRPsNl211vhkxUpcL4Ct97s/lVL/cwRFFEi2LajfCVZLqzrlkaQJucGcFQBdbzDd3gDrGtpmQvtmDWoAasg0/Kt7UJ6FPZKbbb9fc0yZAMSkD00jyVfYwq56TGXAP4P+NGhGGd0gbTGHPPA4Dr9zxSuQNAqiYn/mEPAgMBAAECggEBAIfpeOkHqpAL2LsFYTQozI5TxMFu3Zpm8qqc9VrCIZxK9GvOWHYginuPUnpliitbU2uo1XhUCqvdjBZXm/wSSgTMvAsGJMFkJ+g6+2tKIdmg5NdIwbJ+GIsH1QYOIhr1SIHIB/YexzZni3YpL3hnXmV2O4eYEgg501oeSKPEwDTAHy+rbj45ddmvbI/UQcAtl+TdbIt5JtCkCBe0emDT9xIuHYynfb2nuDm+x39k7RvOhLdm2JfR99nl20yFjTB6j7NoP77KXk6mw75PH/Mv2swyxUueRjUrXJUM1kU+PIUtIDklivdaseumL8nueiS2Eblg8zwE9UyvhiN/yDFcs0kCgYEA+QKrOw4kVnkRzqWp4KctWPtMm9fpuvzvIdnTWvRxRppP9wuoDrS9JXGldUnX9exQNExWay9CQlGzg+kkP28eFgY0Aj5muyrTT7IiMu31oOgeNnYiCTtGx2Li+Yo06h6MyRyrlbdgUQCZ5Geq3pE0N1uOPBSOGlFGxKCS6m/BkZ0CgYEAz3b5o+wCBycRyzvgWY66yzYZxQQDdQt67gt8JkHI3onufkyq7iYytHhYNpI/zTtOGoUTq+tEFBPzquQ+/pVRWmYHlIt4SZGIA29c3BEbTxA8UFXdcu0ZV3/RuKot9fhHIWMeK05lDzG81fvGnMONTilDKooNEGNDDVx4fLNR45sCgYEA8Myz6Zfza+wIXF23uZfxMmtR2iMh08FlPsb2rK5WHIB9c9nB2vbNMriD2LhgL2Em7mwj5eL9oESB5L5AX1eFMKcvBDxz++ueDSOmDrovHjtZfDEhGOxJtebat5X/Naf1XUZsZ4u9iJecOlRF2JVyeVYAZfk6shiG5v6hFDSea8ECgYAWPdkRm9Gz1ppvwWGR+F1KP+iPWJjOSYbKUmzi5RaV1Q++dpW0pl+1PVmnsBIq/HqpGS88tSI9TM5IueOPA48PM/UIFdO1f2anh57a8PKOjV0J98qf8Y9P9CIVvBjlT9LAX5Hybpsi/+AQyMdIMybJBF9xBg/Ue+/KVOmN5OOYlQKBgQCKS73P9EXgEjUfI5YxOvr1zEw/go6hFnt6G2i4lEtGUg9FKvNCz082TL6fYVADyoTL4LR8VuOHTNd4XsRTlQEYwWWUNAQxapLtTqRCQDsQhQh9aMJc9a/FAl9k6Zn9fInAy0BLstJBMRLVvTvLXT2EsAfYZVuTuwi0aEQSxkiFjA==" AlipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2CqoCp95w/JV3RT/gzF4/8QmVT1HQNaeW7yUp+mA7x9AbjvlTW/+eRn6oGAL/XhZLjvHD0XjKLVKX0MJVS1aUQHEHEbOJN4Eu8II45OavD4iZISa7Kp9V6AM+i4qTyaeV2wNDnGxHQBaLVUGCfMR+56EK2YpORdE1H9uy72SSQseVb3bmpsV9EW/IJNmcVL/ut3uA1JWAoRmzlQ7ekxg7p8AYXzYPEHQr1tl7W+M4zv9wO9GKZCxIqMA8U3RP5npPfRaCfIRGzXzCqFEEUvWuidOB7frsvN4jiPD07qpL2Bi9LM1X/ee2kC/oM8Uhd7ERZhG8MbZfijZKxgrsDKBcwIDAQAB" - AppCertPath: "etc/merchant/appCertPublicKey_2021004165608254.crt" + AppCertPath: "etc/merchant/appCertPublicKey_2021006115614672.crt" AlipayCertPath: "etc/merchant/alipayCertPublicKey_RSA2.crt" AlipayRootCertPath: "etc/merchant/alipayRootCert.crt" IsProduction: true diff --git a/app/main/api/etc/merchant/alipayCertPublicKey_RSA2.crt b/app/main/api/etc/merchant/alipayCertPublicKey_RSA2.crt index a1de812..a2d6e52 100644 --- a/app/main/api/etc/merchant/alipayCertPublicKey_RSA2.crt +++ b/app/main/api/etc/merchant/alipayCertPublicKey_RSA2.crt @@ -1,21 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQICQIJEqhy5G63s3j7VrljTANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE +MIIDrzCCApegAwIBAgIQICUSBOVPmqSb4NzESDUfmDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs -YXNzIDIgUjEwHhcNMjQwODI0MTMzMDA3WhcNMjkwODIzMTMzMDA3WjCBmDELMAkGA1UEBhMCQ04x -MzAxBgNVBAoMKua1t+WNl+ecgeWtpuWuh+aAnee9kee7nOenkeaKgOaciemZkOWFrOWPuDEPMA0G -A1UECwwGQWxpcGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZ -kOWFrOWPuC0yMDg4ODQxODczNDU0MDUzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -2CqoCp95w/JV3RT/gzF4/8QmVT1HQNaeW7yUp+mA7x9AbjvlTW/+eRn6oGAL/XhZLjvHD0XjKLVK -X0MJVS1aUQHEHEbOJN4Eu8II45OavD4iZISa7Kp9V6AM+i4qTyaeV2wNDnGxHQBaLVUGCfMR+56E -K2YpORdE1H9uy72SSQseVb3bmpsV9EW/IJNmcVL/ut3uA1JWAoRmzlQ7ekxg7p8AYXzYPEHQr1tl -7W+M4zv9wO9GKZCxIqMA8U3RP5npPfRaCfIRGzXzCqFEEUvWuidOB7frsvN4jiPD07qpL2Bi9LM1 -X/ee2kC/oM8Uhd7ERZhG8MbZfijZKxgrsDKBcwIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJ -KoZIhvcNAQELBQADggEBADsqTEJB7QQc+zFteTgZ608BnTvVlZlPHK+5pLFSG9N1XK3LCv2wj1Tc -FfDo6VXq5YhLmIIp8LlyUWTn5Gwd+/3Rbv50p52CvzsdeqZ9kSJAqFyO4iWmAPUB4f63yLH81q+1 -eyUjc4GkUmZ3EZmB2+vyG2iRHvyG27TYbWrGPWz4AaPECU5jn3rIPDVvR6C9JXjODiiuU5PCVJ9j -pCmGgmllTYAHSvhkOF8zM+qt1Fz0iEtB2ZPMzKexBD4uz8ULkwp+x3QvuLD/ebBbMr2R3BJMCD+3 -2dx0wQJ0OhXuXGOXbuwyAo17LmRKheucoadlT+7Ilr+i5JrAwApBLQSQI6w= +YXNzIDIgUjEwHhcNMjUxMjA0MDg0MzU1WhcNMzAxMjAzMDg0MzU1WjCBjzELMAkGA1UEBhMCQ04x +KjAoBgNVBAoMIea1t+WNl+a1t+Wuh+Wkp+aVsOaNruaciemZkOWFrOWPuDEPMA0GA1UECwwGQWxp +cGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWFrOWPuC0y +MDg4OTQxNTA3NzkwNjA0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiuKilHTo/kPL +cD8ez6HtudB5BrrHz2H+hxbb+5kwPjaE14HCws9fbgtIxxaDWyKKOpUGqo5RGmMFpPaQfci0meBD +G0XyBafGyzDvivrkBCa2gQSzKzuxoFyNkBAubih91gYz6ZyfMDLmfeCR7ItapUtCRtt+xg1O64s+ +cZOSL94o8UnrUBJRW6auhhE8kDibxPpekSOqaWmlt6G8R1xMmf4CxdrErxLajCC3wmSEOyA5yu1M +yU/8Ve8g70zXgGAgQHXxgMblp9BE+dL11VIeyB0HEa68YVwtlUzbhtk+NPy+TI8wNMASjlr9oeoo +X0nm+oqXOBUwPW+txB1yeQ8tKQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZIhvcNAQEL +BQADggEBAHIbaJsjcPXKgpWxSFkr+ScYwQiqry+hh5kqgQLAhGYlcHQurbCP0kvlUWMZhGJR2no/ +b70xe+HZbxf5c4iVv6vss7o3nBGghMFYhpGfOCYDYeGkANEkczpDL5oBpgSbp/nN5zI9RQsYomD6 +Vp5QWvXZEM1/nz0o5nM3MfcF3/xC9/rO0ZqnE0TLJ2khmJmz5OIeqF0WdMXx5Q4/T70fFzpA+q/l +BfiGYtcNNu1N7Db2y495C9nmax+AHoaHQpWXtgwOaq5TlAs6FDl/Nj7o0uTK0NsVgIEKzF4xszrn +tOeb3KiVXE+wwaD5DXhsqO7uYTrVDsOy6HfKZST/LNS/E+M= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE4jCCAsqgAwIBAgIIYsSr5bKAMl8wDQYJKoZIhvcNAQELBQAwejELMAkGA1UEBhMCQ04xFjAU diff --git a/app/main/api/etc/merchant/appCertPublicKey_2021004165608254.crt b/app/main/api/etc/merchant/appCertPublicKey_2021004165608254.crt deleted file mode 100644 index 55f1aaa..0000000 --- a/app/main/api/etc/merchant/appCertPublicKey_2021004165608254.crt +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEpzCCA4+gAwIBAgIQICUEEJni7ld+YaII5tXCjTANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE -BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs -YXNzIDEgUjEwHhcNMjUwNDEwMDQwNTQyWhcNMzAwNDA5MDQwNTQyWjBuMQswCQYDVQQGEwJDTjEz -MDEGA1UECgwq5rW35Y2X55yB5a2m5a6H5oCd572R57uc56eR5oqA5pyJ6ZmQ5YWs5Y+4MQ8wDQYD -VQQLDAZBbGlwYXkxGTAXBgNVBAMMEDIwODg4NDE4NzM0NTQwNTMwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCPsXuwFJeHAL8CwI0QdD9GP7xQ8eejIoQKg6J3/peu26su68JCtGSRhlDm -/7vbLHJcFR6h7at+INoz2juc7SqlmNO7i9wKc3+Ua0487y1G2fCsneRNxTTqbceBZwqjj9/AAN0u -5/4nSl0bcqTeMddofdpTGOvwGvIJh6CZgCglnhMZnH4D6H6yiIyZf7Q6k2d/qBpVGK8kluYEtSnf -/vEQCHhxRx+/DgTL7V1LjbA3BYoPTELZ15JAj0uIzuxextAtxOm4+Huli0RJFAN3q/to2L1Zs8yY -Y1gKJyTaPWKsJWBx8zI+gZcC/e45k6CZnGgh1Fn3+Xqkf7eGxJGGHs1fAgMBAAGjggEqMIIBJjAf -BgNVHSMEGDAWgBRxB+IEYRbk5fJl6zEPyeD0PJrVkTAdBgNVHQ4EFgQUb4Kgf8qXsgDnWyG5deLm -Rw1DhPowQAYDVR0gBDkwNzA1BgdggRwBbgEBMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9jYS5hbGlw -YXkuY29tL2Nwcy5wZGYwDgYDVR0PAQH/BAQDAgbAMDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9j -YS5hbGlwYXkuY29tL2NybDEwMC5jcmwwYAYIKwYBBQUHAQEEVDBSMCgGCCsGAQUFBzAChhxodHRw -Oi8vY2EuYWxpcGF5LmNvbS9jYTYuY2VyMCYGCCsGAQUFBzABhhpodHRwOi8vY2EuYWxpcGF5LmNv -bTo4MzQwLzANBgkqhkiG9w0BAQsFAAOCAQEAYFgnBMeYL/+DjWpimqTtlGnlDsjPUDOjpZopzSa+ -HdL4nxWZBW48K+EzN8x45Ua7b1VKNmHWXe1O3X6W2Cz2H53NslVglzipPnxg9REx3Acr+8spkxWe -oxX9+1xwbSzBnpwG4UayambP0I6L2V9YQxSiLlLr6t2VuDxwCHVLu83rvnrOdlKjyjZop6oufhC9 -29BqfVmR6xuZv/VsCRx+BuRqNtHDoOZuP26kRVaHdnZMPPyTVw++cBt5Xh0Pq6vrYr1Nr9Kkp7wy -8RW951YTarYY5rDQ8RdaEFxPc+QWKQujVFQCvvt3ktTzrVa1mCgW/vX5qI0hXdPGGbq0DH3dxg== ------END CERTIFICATE----- \ No newline at end of file diff --git a/app/main/api/etc/merchant/appCertPublicKey_2021006115614672.crt b/app/main/api/etc/merchant/appCertPublicKey_2021006115614672.crt new file mode 100644 index 0000000..c14bb36 --- /dev/null +++ b/app/main/api/etc/merchant/appCertPublicKey_2021006115614672.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIEnjCCA4agAwIBAgIQICUSBMps1Bik3MiRXKyhFTANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE +BhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs +YXNzIDEgUjEwHhcNMjUxMjA0MDg0MzU0WhcNMzAxMjAzMDg0MzU0WjBlMQswCQYDVQQGEwJDTjEq +MCgGA1UECgwh5rW35Y2X5rW35a6H5aSn5pWw5o2u5pyJ6ZmQ5YWs5Y+4MQ8wDQYDVQQLDAZBbGlw +YXkxGTAXBgNVBAMMEDIwODg5NDE1MDc3OTA2MDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDJzOKCuHfM2/VYSroIm2TcO/Eoych6wF1FUtPeAoTva+YgHMrEDXt/OvqfNMylvtZYZya4 +hocZ9KTDA0FwHmFT9RP0tu0hXzNcKLx2U31iwi6Y29f0EwSYHvLIDjLw0XbxownR7iHvoCaXLtHz +2S4tcJNB5sew3asOEAMTAKq1z679R/3WETVRPsNl211vhkxUpcL4Ct97s/lVL/cwRFFEi2LajfCV +ZLqzrlkaQJucGcFQBdbzDd3gDrGtpmQvtmDWoAasg0/Kt7UJ6FPZKbbb9fc0yZAMSkD00jyVfYwq +56TGXAP4P+NGhGGd0gbTGHPPA4Dr9zxSuQNAqiYn/mEPAgMBAAGjggEqMIIBJjAfBgNVHSMEGDAW +gBRxB+IEYRbk5fJl6zEPyeD0PJrVkTAdBgNVHQ4EFgQUF9wZ+c5xzGlKYGD+ZCJl/JcPwrcwQAYD +VR0gBDkwNzA1BgdggRwBbgEBMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9jYS5hbGlwYXkuY29tL2Nw +cy5wZGYwDgYDVR0PAQH/BAQDAgbAMDAGA1UdHwQpMCcwJaAjoCGGH2h0dHA6Ly9jYS5hbGlwYXku +Y29tL2NybDEwOC5jcmwwYAYIKwYBBQUHAQEEVDBSMCgGCCsGAQUFBzAChhxodHRwOi8vY2EuYWxp +cGF5LmNvbS9jYTYuY2VyMCYGCCsGAQUFBzABhhpodHRwOi8vY2EuYWxpcGF5LmNvbTo4MzQwLzAN +BgkqhkiG9w0BAQsFAAOCAQEAqCJLeBQU8g/L0aI+iqFecr8cB+loPhbwDdVyg+ajmm1+5K3mq8+p +8Vt1GpdgsIobu06F7hzkDnPy72vabPWl7KTetdNHTzHcdy3zXB5U58xObZD1GJaOU/brhY9cvMnz +CEEshx0sH4ay8A15go3cdZy+XheZVJ94Da+eAww1hskJ/A8svV6jHBtx3ZH78AGvpgo9J1QA+7iI +22NT13UDymWgF7AdFkEyi6JNfZC3j/BSSYV/HDWg/W4mE3z8H5iTRSassH6EDNLVkPqFARgUKnzb +2xUubWevKL3VfiVSY1NoRn3b+mSzlRjzXO57GK6BR6MY51gt85sZEdci5+j6PA== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/app/main/api/internal/service/alipayService.go b/app/main/api/internal/service/alipayService.go index 75c1746..722796e 100644 --- a/app/main/api/internal/service/alipayService.go +++ b/app/main/api/internal/service/alipayService.go @@ -3,15 +3,15 @@ package service import ( "context" "crypto/rand" - "ycc-server/app/main/api/internal/config" - "ycc-server/app/main/model" - "ycc-server/pkg/lzkit/lzUtils" "encoding/hex" "fmt" "net/http" "strconv" "sync/atomic" "time" + "ycc-server/app/main/api/internal/config" + "ycc-server/app/main/model" + "ycc-server/pkg/lzkit/lzUtils" "github.com/smartwalle/alipay/v3" ) @@ -28,10 +28,10 @@ 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 { diff --git a/deploy/script/gen_models.ps1 b/deploy/script/gen_models.ps1 index d674bc0..9e540bc 100644 --- a/deploy/script/gen_models.ps1 +++ b/deploy/script/gen_models.ps1 @@ -9,55 +9,50 @@ $tables = @( # ============================================ # 新代理系统表 # ============================================ - # "agent", - # "agent_audit", - # "agent_wallet", - # "agent_relation", - # "agent_link", - # "agent_order", - # "agent_commission", - # "agent_rebate", - # "agent_upgrade", - # "agent_withdrawal", - # "agent_config" - # "agent_product_config" - # "agent_invite_code_usage" - # "agent_freeze_task" - "agent_short_link" - # "agent_real_name" - # "agent_withdrawal_tax" - # "agent_invite_code" - # ============================================ - # 其他业务表 - # ============================================ - # "feature", - # "global_notifications" - # "order", - # "order_refund" - # "product", - # "product_feature", - # "query", - # "query_cleanup_log" - # "query_cleanup_detail" - # "query_cleanup_config" - # "user" - # "user_auth" - # "user_temp" - # "example" - # "admin_user" - # "admin_user_role" - # "admin_api", - # "admin_menu" - # "admin_role", - # "admin_role_api", - # "admin_role_menu", - # "admin_dict_data" - # "admin_dict_type" - # "admin_promotion_link" - # "admin_promotion_link_stats_total" - # "admin_promotion_link_stats_history" - # "admin_promotion_order" - + "admin_api", + "admin_dict_data", + "admin_dict_type", + "admin_menu", + "admin_promotion_link", + "admin_promotion_link_stats_history", + "admin_promotion_link_stats_total", + "admin_promotion_order", + "admin_role", + "admin_role_api", + "admin_role_menu", + "admin_user", + "admin_user_role", + "agent", + "agent_commission", + "agent_config", + "agent_freeze_task", + "agent_invite_code", + "agent_invite_code_usage", + "agent_link", + "agent_order", + "agent_product_config", + "agent_real_name", + "agent_rebate", + "agent_relation", + "agent_short_link", + "agent_upgrade", + "agent_wallet", + "agent_withdrawal", + "agent_withdrawal_tax", + "authorization_document", + "example", + "feature", + "global_notifications", + "order", + "order_refund", + "product", + "product_feature", + "query", + "query_cleanup_config", + "query_cleanup_detail", + "query_cleanup_log", + "user", + "user_auth" ) # 为每个表生成模型 diff --git a/deploy/sql/README_表结构修改说明.md b/deploy/sql/README_表结构修改说明.md new file mode 100644 index 0000000..78bfaed --- /dev/null +++ b/deploy/sql/README_表结构修改说明.md @@ -0,0 +1,320 @@ +# 表结构修改说明 + +本文档说明系统重构需要的所有表结构修改,包括: +1. UUID迁移(将所有bigint类型的ID改为CHAR(36)类型的UUID) +2. 用户系统重构(删除UserTemp表,优化UserAuth表) + +## 一、UUID迁移 + +### 1.1 概述 + +将所有表的主键ID从`bigint`类型改为`CHAR(36)`类型的UUID,同时将所有外键关联字段也改为UUID类型。 + +**注意**:开发环境使用简化版脚本(`uuid_migration_simple.sql`),直接修改表结构,不保留旧数据。 + +### 1.2 涉及的表 + +**核心业务表**: +- `user` - 用户表 +- `agent` - 代理表 +- `product` - 产品表 +- `order` - 订单表 +- `query` - 查询报告表 +- `user_auth` - 用户认证表 + +**代理相关表**: +- `agent_commission` - 代理佣金表 +- `agent_invite_code` - 代理邀请码表 +- `agent_link` - 代理链接表 +- `agent_order` - 代理订单表 +- `agent_wallet` - 代理钱包表 +- `agent_withdrawal` - 代理提现表 +- `agent_withdrawal_tax` - 代理提现税费表 +- `agent_rebate` - 代理返利表 +- `agent_relation` - 代理关系表 +- `agent_upgrade` - 代理升级表 +- `agent_real_name` - 代理实名表 +- `agent_config` - 代理配置表 +- `agent_product_config` - 代理产品配置表 +- `agent_short_link` - 代理短链表 +- `agent_invite_code_usage` - 邀请码使用记录表 +- `agent_freeze_task` - 代理冻结任务表 + +**订单相关表**: +- `order_refund` - 订单退款表 + +**查询相关表**: +- `query_cleanup_log` - 查询清理日志表 +- `query_cleanup_detail` - 查询清理详情表 +- `query_cleanup_config` - 查询清理配置表 + +**产品相关表**: +- `product_feature` - 产品功能表 +- `feature` - 功能表 + +**其他表**: +- `authorization_document` - 授权书表 +- `global_notifications` - 全局通知表 + +**管理后台表**: +- `admin_user` - 管理员用户表 +- `admin_role` - 管理员角色表 +- `admin_menu` - 管理员菜单表 +- `admin_api` - 管理员API表 +- `admin_dict_type` - 字典类型表 +- `admin_dict_data` - 字典数据表 +- `admin_user_role` - 管理员用户角色关联表 +- `admin_role_menu` - 管理员角色菜单关联表 +- `admin_role_api` - 管理员角色API关联表 + +### 1.3 修改内容 + +**主键字段**: +- 所有表的`id`字段:`bigint` → `CHAR(36)` +- 移除`AUTO_INCREMENT`属性 +- 插入时使用`UUID()`函数或应用层生成UUID + +**外键字段**(软关联): +- `user_id`:`bigint` → `CHAR(36)` +- `agent_id`:`bigint` → `CHAR(36)` +- `order_id`:`bigint` → `CHAR(36)` +- `product_id`:`bigint` → `CHAR(36)` +- `invite_code_id`:`bigint` → `CHAR(36)` +- `link_id`:`bigint` → `CHAR(36)` +- `commission_id`:`bigint` → `CHAR(36)` +- `wallet_id`:`bigint` → `CHAR(36)` +- `withdrawal_id`:`bigint` → `CHAR(36)` +- `parent_agent_id`:`bigint` → `CHAR(36)` +- `team_leader_id`:`bigint` → `CHAR(36)` +- `cleanup_log_id`:`bigint` → `CHAR(36)` +- `query_id`:`bigint` → `CHAR(36)` +- `feature_id`:`bigint` → `CHAR(36)` +- `parent_id`(菜单):`bigint` → `CHAR(36)` +- `dict_type_id`:`bigint` → `CHAR(36)` +- `role_id`:`bigint` → `CHAR(36)` +- `menu_id`:`bigint` → `CHAR(36)` +- `api_id`:`bigint` → `CHAR(36)` +- `used_user_id`:`bigint` → `CHAR(36)` +- `used_agent_id`:`bigint` → `CHAR(36)` + +### 1.4 执行脚本 + +**开发环境**:执行文件 `uuid_migration_simple.sql` +- 直接修改表结构,不保留旧数据 +- 适用于开发环境,没有重要数据 + +**生产环境**:执行文件 `uuid_migration.sql` +- 完整的迁移流程,保留旧数据以便回滚 +- 需要分阶段执行,包含数据迁移和验证 + +**开发环境执行步骤**: +1. 直接执行 `uuid_migration_simple.sql` +2. 所有表的主键和外键字段直接改为CHAR(36) +3. 插入新记录时,在应用层生成UUID + +**注意事项**: +- 开发环境脚本直接修改表结构,不保留旧数据 +- 如果表中有数据,需要先清空数据或手动填充UUID +- 代码层面需要同步修改所有ID字段类型(int64 → string) + +## 二、用户系统重构 + +### 2.1 概述 + +删除`UserTemp`表,统一使用`User`表(通过`mobile`字段是否为空区分临时用户和正式用户),优化`UserAuth`表结构。 + +### 2.2 涉及的表 + +**需要修改的表**: +- `user` - 用户表(无需修改结构,只需确保mobile可为空) +- `user_auth` - 用户认证表(添加唯一索引) +- `user_temp` - 临时用户表(**删除**) + +**需要迁移数据的表**: +- `order` - 订单表(更新user_id) +- `query` - 查询报告表(更新user_id) + +### 2.3 修改内容 + +#### 2.3.1 UserAuth表 + +**添加唯一索引**: +```sql +ALTER TABLE `user_auth` +ADD UNIQUE INDEX `uk_auth_type_key` (`auth_type`, `auth_key`); +``` + +**作用**: +- 确保同一个认证方式(auth_type + auth_key)只能绑定一个用户 +- 防止重复绑定 + +#### 2.3.2 UserTemp表 + +**删除原因**: +- 临时用户可以直接创建User表记录(mobile为空) +- 临时用户的认证信息存储在UserAuth表 +- 通过User.mobile是否为空来区分临时用户和正式用户 +- 统一使用User表,逻辑更清晰 + +**删除步骤**: +1. 迁移UserTemp数据到User和UserAuth表 +2. 更新关联的订单和报告的user_id +3. 验证数据完整性 +4. 删除UserTemp表 + +### 2.4 执行脚本 + +**开发环境**:执行文件 `user_system_refactor.sql`(已简化) +- 直接删除UserTemp表 +- 添加UserAuth唯一索引 + +**生产环境**:如需数据迁移,请参考完整版脚本 + +**开发环境执行步骤**: +1. 添加UserAuth唯一索引 +2. 直接删除UserTemp表 + +**注意事项**: +- 开发环境脚本直接删除UserTemp表,不进行数据迁移 +- 删除UserTemp表前,确保代码中已移除所有对UserTemp表的引用 + +## 三、执行顺序 + +### 3.1 推荐执行顺序 + +**开发环境**: +1. **先执行用户系统重构**(`user_system_refactor.sql`) + - 添加UserAuth唯一索引 + - 删除UserTemp表 + +2. **再执行UUID迁移**(`uuid_migration_simple.sql`) + - 直接修改所有表结构 + - 需要同步修改代码 + +**生产环境**: +1. 先执行用户系统重构(完整版,包含数据迁移) +2. 再执行UUID迁移(完整版,包含数据迁移和验证) + +### 3.2 如果先执行UUID迁移 + +如果先执行UUID迁移,需要注意: +- UserTemp表的ID也会改为UUID +- 迁移UserTemp数据时,需要使用UUID映射 +- 用户系统重构脚本需要相应调整 + +## 四、代码修改清单 + +### 4.1 UUID迁移需要的代码修改 + +**Model层**: +- 所有Model的ID字段类型:`int64` → `string` +- 所有外键字段类型:`int64` → `string` +- 移除`AUTO_INCREMENT`相关逻辑 +- 插入时生成UUID(使用`uuid.NewString()`) + +**Service层**: +- 所有使用ID的地方改为UUID +- 查询条件改为UUID +- 关联查询改为UUID + +**API层**: +- 请求参数中的ID改为UUID +- 响应数据中的ID改为UUID + +**数据库操作**: +- 插入操作:使用`uuid.NewString()`生成UUID +- 查询操作:使用UUID字符串查询 +- 更新操作:使用UUID字符串更新 + +### 4.2 用户系统重构需要的代码修改 + +**删除UserTemp相关代码**: +- 删除`UserTempModel` +- 删除所有使用`UserTemp`的代码 +- 删除临时用户创建逻辑中的UserTemp相关代码 + +**修改用户创建逻辑**: +- 临时用户:直接创建User记录(mobile为空) +- 创建UserAuth记录(auth_type + auth_key) + +**修改用户查询逻辑**: +- 通过UserAuth表查询用户 +- 通过User.mobile是否为空判断用户类型 + +**修改账号合并逻辑**: +- 绑定手机号时,检查手机号是否已存在 +- 如果存在,合并账号(迁移数据) +- 如果不存在,更新User.mobile + +## 五、验证清单 + +### 5.1 UUID迁移验证 + +- [ ] 所有表的主键已改为CHAR(36) +- [ ] 所有外键字段已改为CHAR(36) +- [ ] 插入新记录时自动生成UUID +- [ ] 查询操作使用UUID正常 +- [ ] 关联查询使用UUID正常 +- [ ] 索引和约束已更新 +- [ ] 数据完整性验证通过 + +### 5.2 用户系统重构验证 + +- [ ] UserAuth表有唯一索引`uk_auth_type_key` +- [ ] UserTemp表数据已迁移(如果存在) +- [ ] 订单和报告的user_id已更新 +- [ ] UserTemp表已删除(如果存在) +- [ ] 临时用户创建逻辑使用User表 +- [ ] 账号合并逻辑正常工作 +- [ ] 数据完整性验证通过 + +## 六、回滚方案 + +### 6.1 UUID迁移回滚 + +如果UUID迁移出现问题,可以: +1. 保留原ID字段(迁移脚本中已保留) +2. 恢复主键为原ID字段 +3. 删除UUID字段 +4. 恢复代码使用int64类型 + +### 6.2 用户系统重构回滚 + +如果用户系统重构出现问题,可以: +1. 恢复UserTemp表(从备份) +2. 恢复订单和报告的user_id +3. 恢复代码使用UserTemp表 + +## 七、常见问题 + +### 7.1 UUID性能问题 + +**问题**:UUID作为主键可能影响性能 + +**解答**: +- UUID是字符串类型,索引效率略低于bigint +- 但UUID的优势是全局唯一,适合分布式系统 +- 如果性能问题严重,可以考虑使用BINARY(16)存储UUID(需要转换) + +### 7.2 UUID长度问题 + +**问题**:CHAR(36)占用空间较大 + +**解答**: +- UUID标准格式是36字符(包含连字符) +- 如果空间敏感,可以使用BINARY(16)存储(需要转换函数) +- 当前使用CHAR(36)便于调试和查看 + +### 7.3 UserTemp数据迁移问题 + +**问题**:如何确保UserTemp数据正确迁移? + +**解答**: +- 通过auth_type和auth_key匹配UserAuth记录 +- 建立UserTemp.id到User.id的映射关系 +- 迁移后验证数据完整性 +- 保留UserTemp表一段时间,确认无误后再删除 + +## 八、联系信息 + +如有问题,请联系开发团队。 diff --git a/deploy/sql/template.sql b/deploy/sql/template.sql index 1e732f4..70e809d 100644 --- a/deploy/sql/template.sql +++ b/deploy/sql/template.sql @@ -1,20 +1,62 @@ +-- ============================================ +-- 表结构模板(UUID版本) +-- ============================================ +-- 注意:系统已迁移到UUID主键,新表请使用此模板 +-- ============================================ + CREATE TABLE `表名` ( - `id` bigint NOT NULL AUTO_INCREMENT, + `id` CHAR(36) NOT NULL COMMENT 'UUID主键', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `delete_time` datetime DEFAULT NULL COMMENT '删除时间', `del_state` tinyint NOT NULL DEFAULT '0', `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', - - /* 业务字段开始 */ - `字段1` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], + +/* 业务字段开始 */ + +`字段1` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], `字段2` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], - /* 关联字段 - 软关联 */ - `关联表id` bigint [NOT NULL] [DEFAULT '0'] COMMENT '关联到XX表的id', + /* 关联字段 - 软关联(使用UUID) */ + `关联表id` CHAR(36) [NOT NULL] [DEFAULT NULL] COMMENT '关联到XX表的UUID', /* 业务字段结束 */ PRIMARY KEY (`id`), /* 索引定义 */ UNIQUE KEY `索引名称` (`字段名`), KEY `idx_关联字段` (`关联表id`) COMMENT '优化关联查询' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表说明'; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表说明'; + +-- ============================================ +-- UUID生成说明 +-- ============================================ +-- 1. 应用层生成:使用Go的uuid.NewString()生成UUID +-- 示例:id := uuid.NewString() +-- 2. 数据库层生成:使用MySQL的UUID()函数(不推荐,性能较差) +-- 示例:INSERT INTO table (id, ...) VALUES (UUID(), ...) +-- 3. 推荐方式:在应用层生成UUID,然后插入数据库 +-- ============================================ + +-- ============================================ +-- 旧版本模板(bigint主键,已废弃) +-- ============================================ +-- CREATE TABLE `表名` ( +-- `id` bigint NOT NULL AUTO_INCREMENT, +-- `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, +-- `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, +-- `delete_time` datetime DEFAULT NULL COMMENT '删除时间', +-- `del_state` tinyint NOT NULL DEFAULT '0', +-- `version` bigint NOT NULL DEFAULT '0' COMMENT '版本号', +-- +-- /* 业务字段开始 */ +-- `字段1` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], +-- `字段2` 数据类型 [约束条件] [DEFAULT 默认值] [COMMENT '字段说明'], +-- /* 关联字段 - 软关联 */ +-- `关联表id` bigint [NOT NULL] [DEFAULT '0'] COMMENT '关联到XX表的id', +-- /* 业务字段结束 */ +-- +-- PRIMARY KEY (`id`), +-- /* 索引定义 */ +-- UNIQUE KEY `索引名称` (`字段名`), +-- KEY `idx_关联字段` (`关联表id`) COMMENT '优化关联查询' +-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='表说明'; +-- ============================================ \ No newline at end of file diff --git a/deploy/sql/user_system_refactor.sql b/deploy/sql/user_system_refactor.sql new file mode 100644 index 0000000..f32497f --- /dev/null +++ b/deploy/sql/user_system_refactor.sql @@ -0,0 +1,44 @@ +-- ============================================ +-- 用户系统重构SQL脚本(简化版 - 开发环境) +-- 根据《用户系统重构计划书》执行 +-- ============================================ + +-- ============================================ +-- 第一部分:UserAuth表唯一索引 +-- ============================================ + +-- 确保user_auth表的(auth_type, auth_key)唯一性 +-- 如果已存在同名索引,先删除 +ALTER TABLE `user_auth` DROP INDEX IF EXISTS `uk_auth_type_key`; + +-- 添加唯一索引 +ALTER TABLE `user_auth` +ADD UNIQUE INDEX `uk_auth_type_key` (`auth_type`, `auth_key`) COMMENT '确保同一个认证方式只能绑定一个用户'; + +-- ============================================ +-- 第二部分:删除UserTemp表(开发环境直接删除) +-- ============================================ + +-- 注意:开发环境没有数据,直接删除表即可 +-- 如果表不存在,会报错但可以忽略 + +DROP TABLE IF EXISTS `user_temp`; + +-- ============================================ +-- 第三部分:索引优化(可选) +-- ============================================ + +-- 为user_auth表添加user_id和auth_type的联合索引(如果查询频繁) +-- ALTER TABLE `user_auth` +-- ADD INDEX `idx_user_id_auth_type` (`user_id`, `auth_type`) COMMENT '优化按用户查询认证类型'; + +-- 为user表添加mobile的唯一索引(如果不存在) +-- ALTER TABLE `user` +-- ADD UNIQUE INDEX `uk_mobile` (`mobile`) COMMENT '确保手机号唯一性'; + +-- ============================================ +-- 注意事项 +-- ============================================ +-- 1. 此脚本适用于开发环境,直接删除UserTemp表 +-- 2. 如果生产环境有数据,请使用完整版迁移脚本 +-- 3. 执行后,确保代码中已移除所有对UserTemp表的引用 \ No newline at end of file diff --git a/deploy/sql/uuid_migration.sql b/deploy/sql/uuid_migration.sql new file mode 100644 index 0000000..9da7cf2 --- /dev/null +++ b/deploy/sql/uuid_migration.sql @@ -0,0 +1,1831 @@ +-- ============================================ +-- UUID迁移脚本 +-- 将系统中所有bigint类型的ID字段改为CHAR(36)类型的UUID +-- ============================================ + +-- 注意:此脚本需要分阶段执行,建议在测试环境充分测试后再在生产环境执行 +-- 执行前请务必备份数据库! + +-- ============================================ +-- 第一阶段:创建UUID映射表(用于数据迁移) +-- ============================================ + +-- 创建临时映射表,用于存储旧ID和新UUID的对应关系 +CREATE TABLE IF NOT EXISTS `uuid_mapping` ( + `table_name` VARCHAR(64) NOT NULL COMMENT '表名', + `old_id` BIGINT NOT NULL COMMENT '旧ID', + `new_uuid` CHAR(36) NOT NULL COMMENT '新UUID', + PRIMARY KEY (`table_name`, `old_id`), + KEY `idx_new_uuid` (`new_uuid`) +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'UUID映射表'; + +-- ============================================ +-- 第二阶段:为所有表生成UUID映射 +-- ============================================ + +-- 为user表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'user', `id`, UUID() +FROM `user` +WHERE + `del_state` = 0; + +-- 为agent表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent', `id`, UUID() +FROM `agent` +WHERE + `del_state` = 0; + +-- 为product表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'product', `id`, UUID() +FROM `product` +WHERE + `del_state` = 0; + +-- 为order表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'order', `id`, UUID() +FROM `order` +WHERE + `del_state` = 0; + +-- 为query表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'query', `id`, UUID() +FROM `query` +WHERE + `del_state` = 0; + +-- 为user_auth表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'user_auth', `id`, UUID() +FROM `user_auth` +WHERE + `del_state` = 0; + +-- 为agent_commission表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_commission', `id`, UUID() +FROM `agent_commission` +WHERE + `del_state` = 0; + +-- 为agent_invite_code表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_invite_code', `id`, UUID() +FROM `agent_invite_code` +WHERE + `del_state` = 0; + +-- 为agent_link表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_link', `id`, UUID() +FROM `agent_link` +WHERE + `del_state` = 0; + +-- 为agent_order表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_order', `id`, UUID() +FROM `agent_order` +WHERE + `del_state` = 0; + +-- 为agent_wallet表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_wallet', `id`, UUID() +FROM `agent_wallet` +WHERE + `del_state` = 0; + +-- 为agent_withdrawal表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_withdrawal', `id`, UUID() +FROM `agent_withdrawal` +WHERE + `del_state` = 0; + +-- 为agent_withdrawal_tax表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_withdrawal_tax', `id`, UUID() +FROM `agent_withdrawal_tax` +WHERE + `del_state` = 0; + +-- 为agent_rebate表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_rebate', `id`, UUID() +FROM `agent_rebate` +WHERE + `del_state` = 0; + +-- 为agent_relation表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_relation', `id`, UUID() +FROM `agent_relation` +WHERE + `del_state` = 0; + +-- 为agent_upgrade表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_upgrade', `id`, UUID() +FROM `agent_upgrade` +WHERE + `del_state` = 0; + +-- 为agent_real_name表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_real_name', `id`, UUID() +FROM `agent_real_name` +WHERE + `del_state` = 0; + +-- 为agent_config表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_config', `id`, UUID() +FROM `agent_config` +WHERE + `del_state` = 0; + +-- 为agent_product_config表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_product_config', `id`, UUID() +FROM `agent_product_config` +WHERE + `del_state` = 0; + +-- 为agent_short_link表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_short_link', `id`, UUID() +FROM `agent_short_link` +WHERE + `del_state` = 0; + +-- 为agent_invite_code_usage表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_invite_code_usage', `id`, UUID() +FROM `agent_invite_code_usage` +WHERE + `del_state` = 0; + +-- 为agent_freeze_task表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'agent_freeze_task', `id`, UUID() +FROM `agent_freeze_task` +WHERE + `del_state` = 0; + +-- 为order_refund表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'order_refund', `id`, UUID() +FROM `order_refund` +WHERE + `del_state` = 0; + +-- 为query_cleanup_log表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'query_cleanup_log', `id`, UUID() +FROM `query_cleanup_log` +WHERE + `del_state` = 0; + +-- 为query_cleanup_detail表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'query_cleanup_detail', `id`, UUID() +FROM `query_cleanup_detail` +WHERE + `del_state` = 0; + +-- 为query_cleanup_config表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'query_cleanup_config', `id`, UUID() +FROM `query_cleanup_config` +WHERE + `del_state` = 0; + +-- 为product_feature表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'product_feature', `id`, UUID() +FROM `product_feature` +WHERE + `del_state` = 0; + +-- 为feature表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'feature', `id`, UUID() +FROM `feature` +WHERE + `del_state` = 0; + +-- 为authorization_document表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'authorization_document', `id`, UUID() +FROM `authorization_document` +WHERE + `del_state` = 0; + +-- 为global_notifications表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'global_notifications', `id`, UUID() +FROM `global_notifications` +WHERE + `del_state` = 0; + +-- 为admin_user表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_user', `id`, UUID() +FROM `admin_user` +WHERE + `del_state` = 0; + +-- 为admin_role表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_role', `id`, UUID() +FROM `admin_role` +WHERE + `del_state` = 0; + +-- 为admin_menu表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_menu', `id`, UUID() +FROM `admin_menu` +WHERE + `del_state` = 0; + +-- 为admin_api表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_api', `id`, UUID() +FROM `admin_api` +WHERE + `del_state` = 0; + +-- 为admin_dict_type表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_dict_type', `id`, UUID() +FROM `admin_dict_type` +WHERE + `del_state` = 0; + +-- 为admin_dict_data表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_dict_data', `id`, UUID() +FROM `admin_dict_data` +WHERE + `del_state` = 0; + +-- 为admin_user_role表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_user_role', `id`, UUID() +FROM `admin_user_role` +WHERE + `del_state` = 0; + +-- 为admin_role_menu表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_role_menu', `id`, UUID() +FROM `admin_role_menu` +WHERE + `del_state` = 0; + +-- 为admin_role_api表生成UUID映射 +INSERT INTO + `uuid_mapping` ( + `table_name`, + `old_id`, + `new_uuid` + ) +SELECT 'admin_role_api', `id`, UUID() +FROM `admin_role_api` +WHERE + `del_state` = 0; + +-- ============================================ +-- 第三阶段:修改表结构(添加UUID字段,保留原ID字段) +-- ============================================ + +-- 注意:此阶段先添加新字段,不删除旧字段,以便回滚 + +-- user表:添加UUID主键字段 +ALTER TABLE `user` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- agent表:添加UUID主键字段 +ALTER TABLE `agent` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `team_leader_id_uuid` CHAR(36) NULL COMMENT '团队首领UUID' AFTER `team_leader_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_team_leader_id_uuid` (`team_leader_id_uuid`); + +-- product表:添加UUID主键字段 +ALTER TABLE `product` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- order表:添加UUID主键字段和外键字段 +ALTER TABLE `order` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- query表:添加UUID主键字段和外键字段 +ALTER TABLE `query` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- user_auth表:添加UUID主键字段和外键字段 +ALTER TABLE `user_auth` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`); + +-- agent_commission表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_commission` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- agent_invite_code表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_invite_code` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `used_user_id_uuid` CHAR(36) NULL COMMENT '使用用户UUID' AFTER `used_user_id`, +ADD COLUMN `used_agent_id_uuid` CHAR(36) NULL COMMENT '使用代理UUID' AFTER `used_agent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_used_user_id_uuid` (`used_user_id_uuid`), +ADD INDEX `idx_used_agent_id_uuid` (`used_agent_id_uuid`); + +-- agent_link表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_link` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- agent_order表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_order` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- agent_wallet表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_wallet` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`); + +-- agent_withdrawal表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_withdrawal` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `wallet_id_uuid` CHAR(36) NULL COMMENT '钱包UUID' AFTER `wallet_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_wallet_id_uuid` (`wallet_id_uuid`); + +-- agent_withdrawal_tax表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_withdrawal_tax` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `withdrawal_id_uuid` CHAR(36) NULL COMMENT '提现UUID' AFTER `withdrawal_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_withdrawal_id_uuid` (`withdrawal_id_uuid`); + +-- agent_rebate表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_rebate` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- agent_relation表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_relation` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `parent_agent_id_uuid` CHAR(36) NULL COMMENT '上级代理UUID' AFTER `parent_agent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_parent_agent_id_uuid` (`parent_agent_id_uuid`); + +-- agent_upgrade表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_upgrade` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`); + +-- agent_real_name表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_real_name` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`); + +-- agent_config表:添加UUID主键字段 +ALTER TABLE `agent_config` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- agent_product_config表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_product_config` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- agent_short_link表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_short_link` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `invite_code_id_uuid` CHAR(36) NULL COMMENT '邀请码UUID' AFTER `invite_code_id`, +ADD COLUMN `link_id_uuid` CHAR(36) NULL COMMENT '链接UUID' AFTER `link_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_invite_code_id_uuid` (`invite_code_id_uuid`), +ADD INDEX `idx_link_id_uuid` (`link_id_uuid`); + +-- agent_invite_code_usage表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_invite_code_usage` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `invite_code_id_uuid` CHAR(36) NULL COMMENT '邀请码UUID' AFTER `invite_code_id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_invite_code_id_uuid` (`invite_code_id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`); + +-- agent_freeze_task表:添加UUID主键字段和外键字段 +ALTER TABLE `agent_freeze_task` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `agent_id_uuid` CHAR(36) NULL COMMENT '代理UUID' AFTER `agent_id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `commission_id_uuid` CHAR(36) NULL COMMENT '佣金UUID' AFTER `commission_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_agent_id_uuid` (`agent_id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_commission_id_uuid` (`commission_id_uuid`); + +-- order_refund表:添加UUID主键字段和外键字段 +ALTER TABLE `order_refund` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- query_cleanup_log表:添加UUID主键字段 +ALTER TABLE `query_cleanup_log` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- query_cleanup_detail表:添加UUID主键字段和外键字段 +ALTER TABLE `query_cleanup_detail` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `cleanup_log_id_uuid` CHAR(36) NULL COMMENT '清理日志UUID' AFTER `cleanup_log_id`, +ADD COLUMN `query_id_uuid` CHAR(36) NULL COMMENT '查询UUID' AFTER `query_id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_cleanup_log_id_uuid` (`cleanup_log_id_uuid`), +ADD INDEX `idx_query_id_uuid` (`query_id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`); + +-- query_cleanup_config表:添加UUID主键字段 +ALTER TABLE `query_cleanup_config` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- product_feature表:添加UUID主键字段和外键字段 +ALTER TABLE `product_feature` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `product_id_uuid` CHAR(36) NULL COMMENT '产品UUID' AFTER `product_id`, +ADD COLUMN `feature_id_uuid` CHAR(36) NULL COMMENT '功能UUID' AFTER `feature_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_product_id_uuid` (`product_id_uuid`), +ADD INDEX `idx_feature_id_uuid` (`feature_id_uuid`); + +-- feature表:添加UUID主键字段 +ALTER TABLE `feature` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- authorization_document表:添加UUID主键字段和外键字段 +ALTER TABLE `authorization_document` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `order_id_uuid` CHAR(36) NULL COMMENT '订单UUID' AFTER `order_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_order_id_uuid` (`order_id_uuid`); + +-- global_notifications表:添加UUID主键字段 +ALTER TABLE `global_notifications` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- admin_user表:添加UUID主键字段 +ALTER TABLE `admin_user` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- admin_role表:添加UUID主键字段 +ALTER TABLE `admin_role` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- admin_menu表:添加UUID主键字段和外键字段 +ALTER TABLE `admin_menu` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `parent_id_uuid` CHAR(36) NULL COMMENT '父菜单UUID' AFTER `parent_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_parent_id_uuid` (`parent_id_uuid`); + +-- admin_api表:添加UUID主键字段 +ALTER TABLE `admin_api` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- admin_dict_type表:添加UUID主键字段 +ALTER TABLE `admin_dict_type` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD INDEX `idx_id_uuid` (`id_uuid`); + +-- admin_dict_data表:添加UUID主键字段和外键字段 +ALTER TABLE `admin_dict_data` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `dict_type_id_uuid` CHAR(36) NULL COMMENT '字典类型UUID' AFTER `dict_type_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_dict_type_id_uuid` (`dict_type_id_uuid`); + +-- admin_user_role表:添加UUID主键字段和外键字段 +ALTER TABLE `admin_user_role` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `user_id_uuid` CHAR(36) NULL COMMENT '用户UUID' AFTER `user_id`, +ADD COLUMN `role_id_uuid` CHAR(36) NULL COMMENT '角色UUID' AFTER `role_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_user_id_uuid` (`user_id_uuid`), +ADD INDEX `idx_role_id_uuid` (`role_id_uuid`); + +-- admin_role_menu表:添加UUID主键字段和外键字段 +ALTER TABLE `admin_role_menu` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `role_id_uuid` CHAR(36) NULL COMMENT '角色UUID' AFTER `role_id`, +ADD COLUMN `menu_id_uuid` CHAR(36) NULL COMMENT '菜单UUID' AFTER `menu_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_role_id_uuid` (`role_id_uuid`), +ADD INDEX `idx_menu_id_uuid` (`menu_id_uuid`); + +-- admin_role_api表:添加UUID主键字段和外键字段 +ALTER TABLE `admin_role_api` +ADD COLUMN `id_uuid` CHAR(36) NULL COMMENT 'UUID主键' AFTER `id`, +ADD COLUMN `role_id_uuid` CHAR(36) NULL COMMENT '角色UUID' AFTER `role_id`, +ADD COLUMN `api_id_uuid` CHAR(36) NULL COMMENT 'API UUID' AFTER `api_id`, +ADD INDEX `idx_id_uuid` (`id_uuid`), +ADD INDEX `idx_role_id_uuid` (`role_id_uuid`), +ADD INDEX `idx_api_id_uuid` (`api_id_uuid`); + +-- ============================================ +-- 第四阶段:填充UUID字段数据(根据映射表) +-- ============================================ + +-- user表:填充UUID +UPDATE `user` u +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = u.id +SET + u.id_uuid = m.new_uuid +WHERE + u.del_state = 0; + +-- agent表:填充UUID +UPDATE `agent` a +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = a.id +SET + a.id_uuid = m.new_uuid +WHERE + a.del_state = 0; + +UPDATE `agent` a +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = a.user_id +SET + a.user_id_uuid = m.new_uuid +WHERE + a.del_state = 0 + AND a.user_id IS NOT NULL; + +UPDATE `agent` a +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = a.team_leader_id +SET + a.team_leader_id_uuid = m.new_uuid +WHERE + a.del_state = 0 + AND a.team_leader_id IS NOT NULL; + +-- product表:填充UUID +UPDATE `product` p +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = p.id +SET + p.id_uuid = m.new_uuid +WHERE + p.del_state = 0; + +-- order表:填充UUID +UPDATE `order` o +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = o.id +SET + o.id_uuid = m.new_uuid +WHERE + o.del_state = 0; + +UPDATE `order` o +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = o.user_id +SET + o.user_id_uuid = m.new_uuid +WHERE + o.del_state = 0 + AND o.user_id IS NOT NULL; + +UPDATE `order` o +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = o.product_id +SET + o.product_id_uuid = m.new_uuid +WHERE + o.del_state = 0 + AND o.product_id IS NOT NULL; + +-- query表:填充UUID +UPDATE `query` q +INNER JOIN `uuid_mapping` m ON m.table_name = 'query' +AND m.old_id = q.id +SET + q.id_uuid = m.new_uuid +WHERE + q.del_state = 0; + +UPDATE `query` q +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = q.order_id +SET + q.order_id_uuid = m.new_uuid +WHERE + q.del_state = 0 + AND q.order_id IS NOT NULL; + +UPDATE `query` q +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = q.user_id +SET + q.user_id_uuid = m.new_uuid +WHERE + q.del_state = 0 + AND q.user_id IS NOT NULL; + +UPDATE `query` q +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = q.product_id +SET + q.product_id_uuid = m.new_uuid +WHERE + q.del_state = 0 + AND q.product_id IS NOT NULL; + +-- user_auth表:填充UUID +UPDATE `user_auth` ua +INNER JOIN `uuid_mapping` m ON m.table_name = 'user_auth' +AND m.old_id = ua.id +SET + ua.id_uuid = m.new_uuid +WHERE + ua.del_state = 0; + +UPDATE `user_auth` ua +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = ua.user_id +SET + ua.user_id_uuid = m.new_uuid +WHERE + ua.del_state = 0 + AND ua.user_id IS NOT NULL; + +-- agent_commission表:填充UUID +UPDATE `agent_commission` ac +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_commission' +AND m.old_id = ac.id +SET + ac.id_uuid = m.new_uuid +WHERE + ac.del_state = 0; + +UPDATE `agent_commission` ac +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = ac.agent_id +SET + ac.agent_id_uuid = m.new_uuid +WHERE + ac.del_state = 0 + AND ac.agent_id IS NOT NULL; + +UPDATE `agent_commission` ac +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = ac.order_id +SET + ac.order_id_uuid = m.new_uuid +WHERE + ac.del_state = 0 + AND ac.order_id IS NOT NULL; + +UPDATE `agent_commission` ac +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = ac.product_id +SET + ac.product_id_uuid = m.new_uuid +WHERE + ac.del_state = 0 + AND ac.product_id IS NOT NULL; + +-- agent_invite_code表:填充UUID +UPDATE `agent_invite_code` aic +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_invite_code' +AND m.old_id = aic.id +SET + aic.id_uuid = m.new_uuid +WHERE + aic.del_state = 0; + +UPDATE `agent_invite_code` aic +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = aic.agent_id +SET + aic.agent_id_uuid = m.new_uuid +WHERE + aic.del_state = 0 + AND aic.agent_id IS NOT NULL; + +UPDATE `agent_invite_code` aic +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = aic.used_user_id +SET + aic.used_user_id_uuid = m.new_uuid +WHERE + aic.del_state = 0 + AND aic.used_user_id IS NOT NULL; + +UPDATE `agent_invite_code` aic +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = aic.used_agent_id +SET + aic.used_agent_id_uuid = m.new_uuid +WHERE + aic.del_state = 0 + AND aic.used_agent_id IS NOT NULL; + +-- agent_link表:填充UUID +UPDATE `agent_link` al +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_link' +AND m.old_id = al.id +SET + al.id_uuid = m.new_uuid +WHERE + al.del_state = 0; + +UPDATE `agent_link` al +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = al.agent_id +SET + al.agent_id_uuid = m.new_uuid +WHERE + al.del_state = 0 + AND al.agent_id IS NOT NULL; + +UPDATE `agent_link` al +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = al.user_id +SET + al.user_id_uuid = m.new_uuid +WHERE + al.del_state = 0 + AND al.user_id IS NOT NULL; + +UPDATE `agent_link` al +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = al.product_id +SET + al.product_id_uuid = m.new_uuid +WHERE + al.del_state = 0 + AND al.product_id IS NOT NULL; + +-- agent_order表:填充UUID +UPDATE `agent_order` ao +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_order' +AND m.old_id = ao.id +SET + ao.id_uuid = m.new_uuid +WHERE + ao.del_state = 0; + +UPDATE `agent_order` ao +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = ao.agent_id +SET + ao.agent_id_uuid = m.new_uuid +WHERE + ao.del_state = 0 + AND ao.agent_id IS NOT NULL; + +UPDATE `agent_order` ao +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = ao.order_id +SET + ao.order_id_uuid = m.new_uuid +WHERE + ao.del_state = 0 + AND ao.order_id IS NOT NULL; + +UPDATE `agent_order` ao +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = ao.product_id +SET + ao.product_id_uuid = m.new_uuid +WHERE + ao.del_state = 0 + AND ao.product_id IS NOT NULL; + +-- agent_wallet表:填充UUID +UPDATE `agent_wallet` aw +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_wallet' +AND m.old_id = aw.id +SET + aw.id_uuid = m.new_uuid +WHERE + aw.del_state = 0; + +UPDATE `agent_wallet` aw +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = aw.agent_id +SET + aw.agent_id_uuid = m.new_uuid +WHERE + aw.del_state = 0 + AND aw.agent_id IS NOT NULL; + +-- agent_withdrawal表:填充UUID +UPDATE `agent_withdrawal` aw +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_withdrawal' +AND m.old_id = aw.id +SET + aw.id_uuid = m.new_uuid +WHERE + aw.del_state = 0; + +UPDATE `agent_withdrawal` aw +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = aw.agent_id +SET + aw.agent_id_uuid = m.new_uuid +WHERE + aw.del_state = 0 + AND aw.agent_id IS NOT NULL; + +UPDATE `agent_withdrawal` aw +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_wallet' +AND m.old_id = aw.wallet_id +SET + aw.wallet_id_uuid = m.new_uuid +WHERE + aw.del_state = 0 + AND aw.wallet_id IS NOT NULL; + +-- agent_withdrawal_tax表:填充UUID +UPDATE `agent_withdrawal_tax` awt +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_withdrawal_tax' +AND m.old_id = awt.id +SET + awt.id_uuid = m.new_uuid +WHERE + awt.del_state = 0; + +UPDATE `agent_withdrawal_tax` awt +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_withdrawal' +AND m.old_id = awt.withdrawal_id +SET + awt.withdrawal_id_uuid = m.new_uuid +WHERE + awt.del_state = 0 + AND awt.withdrawal_id IS NOT NULL; + +-- agent_rebate表:填充UUID +UPDATE `agent_rebate` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_rebate' +AND m.old_id = ar.id +SET + ar.id_uuid = m.new_uuid +WHERE + ar.del_state = 0; + +UPDATE `agent_rebate` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = ar.agent_id +SET + ar.agent_id_uuid = m.new_uuid +WHERE + ar.del_state = 0 + AND ar.agent_id IS NOT NULL; + +UPDATE `agent_rebate` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = ar.order_id +SET + ar.order_id_uuid = m.new_uuid +WHERE + ar.del_state = 0 + AND ar.order_id IS NOT NULL; + +UPDATE `agent_rebate` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = ar.product_id +SET + ar.product_id_uuid = m.new_uuid +WHERE + ar.del_state = 0 + AND ar.product_id IS NOT NULL; + +-- agent_relation表:填充UUID +UPDATE `agent_relation` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_relation' +AND m.old_id = ar.id +SET + ar.id_uuid = m.new_uuid +WHERE + ar.del_state = 0; + +UPDATE `agent_relation` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = ar.agent_id +SET + ar.agent_id_uuid = m.new_uuid +WHERE + ar.del_state = 0 + AND ar.agent_id IS NOT NULL; + +UPDATE `agent_relation` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = ar.parent_agent_id +SET + ar.parent_agent_id_uuid = m.new_uuid +WHERE + ar.del_state = 0 + AND ar.parent_agent_id IS NOT NULL; + +-- agent_upgrade表:填充UUID +UPDATE `agent_upgrade` au +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_upgrade' +AND m.old_id = au.id +SET + au.id_uuid = m.new_uuid +WHERE + au.del_state = 0; + +UPDATE `agent_upgrade` au +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = au.agent_id +SET + au.agent_id_uuid = m.new_uuid +WHERE + au.del_state = 0 + AND au.agent_id IS NOT NULL; + +-- agent_real_name表:填充UUID +UPDATE `agent_real_name` arn +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_real_name' +AND m.old_id = arn.id +SET + arn.id_uuid = m.new_uuid +WHERE + arn.del_state = 0; + +UPDATE `agent_real_name` arn +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = arn.agent_id +SET + arn.agent_id_uuid = m.new_uuid +WHERE + arn.del_state = 0 + AND arn.agent_id IS NOT NULL; + +-- agent_config表:填充UUID +UPDATE `agent_config` ac +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_config' +AND m.old_id = ac.id +SET + ac.id_uuid = m.new_uuid +WHERE + ac.del_state = 0; + +-- agent_product_config表:填充UUID +UPDATE `agent_product_config` apc +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_product_config' +AND m.old_id = apc.id +SET + apc.id_uuid = m.new_uuid +WHERE + apc.del_state = 0; + +UPDATE `agent_product_config` apc +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = apc.product_id +SET + apc.product_id_uuid = m.new_uuid +WHERE + apc.del_state = 0 + AND apc.product_id IS NOT NULL; + +-- agent_short_link表:填充UUID +UPDATE `agent_short_link` asl +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_short_link' +AND m.old_id = asl.id +SET + asl.id_uuid = m.new_uuid +WHERE + asl.del_state = 0; + +UPDATE `agent_short_link` asl +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_invite_code' +AND m.old_id = asl.invite_code_id +SET + asl.invite_code_id_uuid = m.new_uuid +WHERE + asl.del_state = 0 + AND asl.invite_code_id IS NOT NULL; + +UPDATE `agent_short_link` asl +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_link' +AND m.old_id = asl.link_id +SET + asl.link_id_uuid = m.new_uuid +WHERE + asl.del_state = 0 + AND asl.link_id IS NOT NULL; + +-- agent_invite_code_usage表:填充UUID +UPDATE `agent_invite_code_usage` aicu +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_invite_code_usage' +AND m.old_id = aicu.id +SET + aicu.id_uuid = m.new_uuid +WHERE + aicu.del_state = 0; + +UPDATE `agent_invite_code_usage` aicu +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_invite_code' +AND m.old_id = aicu.invite_code_id +SET + aicu.invite_code_id_uuid = m.new_uuid +WHERE + aicu.del_state = 0 + AND aicu.invite_code_id IS NOT NULL; + +UPDATE `agent_invite_code_usage` aicu +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = aicu.user_id +SET + aicu.user_id_uuid = m.new_uuid +WHERE + aicu.del_state = 0 + AND aicu.user_id IS NOT NULL; + +UPDATE `agent_invite_code_usage` aicu +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = aicu.agent_id +SET + aicu.agent_id_uuid = m.new_uuid +WHERE + aicu.del_state = 0 + AND aicu.agent_id IS NOT NULL; + +-- agent_freeze_task表:填充UUID +UPDATE `agent_freeze_task` aft +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_freeze_task' +AND m.old_id = aft.id +SET + aft.id_uuid = m.new_uuid +WHERE + aft.del_state = 0; + +UPDATE `agent_freeze_task` aft +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent' +AND m.old_id = aft.agent_id +SET + aft.agent_id_uuid = m.new_uuid +WHERE + aft.del_state = 0 + AND aft.agent_id IS NOT NULL; + +UPDATE `agent_freeze_task` aft +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = aft.order_id +SET + aft.order_id_uuid = m.new_uuid +WHERE + aft.del_state = 0 + AND aft.order_id IS NOT NULL; + +UPDATE `agent_freeze_task` aft +INNER JOIN `uuid_mapping` m ON m.table_name = 'agent_commission' +AND m.old_id = aft.commission_id +SET + aft.commission_id_uuid = m.new_uuid +WHERE + aft.del_state = 0 + AND aft.commission_id IS NOT NULL; + +-- order_refund表:填充UUID +UPDATE `order_refund` orf +INNER JOIN `uuid_mapping` m ON m.table_name = 'order_refund' +AND m.old_id = orf.id +SET + orf.id_uuid = m.new_uuid +WHERE + orf.del_state = 0; + +UPDATE `order_refund` orf +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = orf.order_id +SET + orf.order_id_uuid = m.new_uuid +WHERE + orf.del_state = 0 + AND orf.order_id IS NOT NULL; + +UPDATE `order_refund` orf +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = orf.user_id +SET + orf.user_id_uuid = m.new_uuid +WHERE + orf.del_state = 0 + AND orf.user_id IS NOT NULL; + +UPDATE `order_refund` orf +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = orf.product_id +SET + orf.product_id_uuid = m.new_uuid +WHERE + orf.del_state = 0 + AND orf.product_id IS NOT NULL; + +-- query_cleanup_log表:填充UUID +UPDATE `query_cleanup_log` qcl +INNER JOIN `uuid_mapping` m ON m.table_name = 'query_cleanup_log' +AND m.old_id = qcl.id +SET + qcl.id_uuid = m.new_uuid +WHERE + qcl.del_state = 0; + +-- query_cleanup_detail表:填充UUID +UPDATE `query_cleanup_detail` qcd +INNER JOIN `uuid_mapping` m ON m.table_name = 'query_cleanup_detail' +AND m.old_id = qcd.id +SET + qcd.id_uuid = m.new_uuid +WHERE + qcd.del_state = 0; + +UPDATE `query_cleanup_detail` qcd +INNER JOIN `uuid_mapping` m ON m.table_name = 'query_cleanup_log' +AND m.old_id = qcd.cleanup_log_id +SET + qcd.cleanup_log_id_uuid = m.new_uuid +WHERE + qcd.del_state = 0 + AND qcd.cleanup_log_id IS NOT NULL; + +UPDATE `query_cleanup_detail` qcd +INNER JOIN `uuid_mapping` m ON m.table_name = 'query' +AND m.old_id = qcd.query_id +SET + qcd.query_id_uuid = m.new_uuid +WHERE + qcd.del_state = 0 + AND qcd.query_id IS NOT NULL; + +UPDATE `query_cleanup_detail` qcd +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = qcd.order_id +SET + qcd.order_id_uuid = m.new_uuid +WHERE + qcd.del_state = 0 + AND qcd.order_id IS NOT NULL; + +UPDATE `query_cleanup_detail` qcd +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = qcd.user_id +SET + qcd.user_id_uuid = m.new_uuid +WHERE + qcd.del_state = 0 + AND qcd.user_id IS NOT NULL; + +UPDATE `query_cleanup_detail` qcd +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = qcd.product_id +SET + qcd.product_id_uuid = m.new_uuid +WHERE + qcd.del_state = 0 + AND qcd.product_id IS NOT NULL; + +-- query_cleanup_config表:填充UUID +UPDATE `query_cleanup_config` qcc +INNER JOIN `uuid_mapping` m ON m.table_name = 'query_cleanup_config' +AND m.old_id = qcc.id +SET + qcc.id_uuid = m.new_uuid +WHERE + qcc.del_state = 0; + +-- product_feature表:填充UUID +UPDATE `product_feature` pf +INNER JOIN `uuid_mapping` m ON m.table_name = 'product_feature' +AND m.old_id = pf.id +SET + pf.id_uuid = m.new_uuid +WHERE + pf.del_state = 0; + +UPDATE `product_feature` pf +INNER JOIN `uuid_mapping` m ON m.table_name = 'product' +AND m.old_id = pf.product_id +SET + pf.product_id_uuid = m.new_uuid +WHERE + pf.del_state = 0 + AND pf.product_id IS NOT NULL; + +UPDATE `product_feature` pf +INNER JOIN `uuid_mapping` m ON m.table_name = 'feature' +AND m.old_id = pf.feature_id +SET + pf.feature_id_uuid = m.new_uuid +WHERE + pf.del_state = 0 + AND pf.feature_id IS NOT NULL; + +-- feature表:填充UUID +UPDATE `feature` f +INNER JOIN `uuid_mapping` m ON m.table_name = 'feature' +AND m.old_id = f.id +SET + f.id_uuid = m.new_uuid +WHERE + f.del_state = 0; + +-- authorization_document表:填充UUID +UPDATE `authorization_document` ad +INNER JOIN `uuid_mapping` m ON m.table_name = 'authorization_document' +AND m.old_id = ad.id +SET + ad.id_uuid = m.new_uuid +WHERE + ad.del_state = 0; + +UPDATE `authorization_document` ad +INNER JOIN `uuid_mapping` m ON m.table_name = 'user' +AND m.old_id = ad.user_id +SET + ad.user_id_uuid = m.new_uuid +WHERE + ad.del_state = 0 + AND ad.user_id IS NOT NULL; + +UPDATE `authorization_document` ad +INNER JOIN `uuid_mapping` m ON m.table_name = 'order' +AND m.old_id = ad.order_id +SET + ad.order_id_uuid = m.new_uuid +WHERE + ad.del_state = 0 + AND ad.order_id IS NOT NULL; + +-- global_notifications表:填充UUID +UPDATE `global_notifications` gn +INNER JOIN `uuid_mapping` m ON m.table_name = 'global_notifications' +AND m.old_id = gn.id +SET + gn.id_uuid = m.new_uuid +WHERE + gn.del_state = 0; + +-- admin_user表:填充UUID +UPDATE `admin_user` au +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_user' +AND m.old_id = au.id +SET + au.id_uuid = m.new_uuid +WHERE + au.del_state = 0; + +-- admin_role表:填充UUID +UPDATE `admin_role` ar +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_role' +AND m.old_id = ar.id +SET + ar.id_uuid = m.new_uuid +WHERE + ar.del_state = 0; + +-- admin_menu表:填充UUID +UPDATE `admin_menu` am +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_menu' +AND m.old_id = am.id +SET + am.id_uuid = m.new_uuid +WHERE + am.del_state = 0; + +UPDATE `admin_menu` am +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_menu' +AND m.old_id = am.parent_id +SET + am.parent_id_uuid = m.new_uuid +WHERE + am.del_state = 0 + AND am.parent_id IS NOT NULL; + +-- admin_api表:填充UUID +UPDATE `admin_api` aa +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_api' +AND m.old_id = aa.id +SET + aa.id_uuid = m.new_uuid +WHERE + aa.del_state = 0; + +-- admin_dict_type表:填充UUID +UPDATE `admin_dict_type` adt +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_dict_type' +AND m.old_id = adt.id +SET + adt.id_uuid = m.new_uuid +WHERE + adt.del_state = 0; + +-- admin_dict_data表:填充UUID +UPDATE `admin_dict_data` add +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_dict_data' AND m.old_id = add.id +SET add.id_uuid = m.new_uuid +WHERE add.del_state = 0; + +UPDATE `admin_dict_data` add +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_dict_type' AND m.old_id = add.dict_type_id +SET add.dict_type_id_uuid = m.new_uuid +WHERE add.del_state = 0 AND add.dict_type_id IS NOT NULL; + +-- admin_user_role表:填充UUID +UPDATE `admin_user_role` aur +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_user_role' +AND m.old_id = aur.id +SET + aur.id_uuid = m.new_uuid +WHERE + aur.del_state = 0; + +UPDATE `admin_user_role` aur +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_user' +AND m.old_id = aur.user_id +SET + aur.user_id_uuid = m.new_uuid +WHERE + aur.del_state = 0 + AND aur.user_id IS NOT NULL; + +UPDATE `admin_user_role` aur +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_role' +AND m.old_id = aur.role_id +SET + aur.role_id_uuid = m.new_uuid +WHERE + aur.del_state = 0 + AND aur.role_id IS NOT NULL; + +-- admin_role_menu表:填充UUID +UPDATE `admin_role_menu` arm +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_role_menu' +AND m.old_id = arm.id +SET + arm.id_uuid = m.new_uuid +WHERE + arm.del_state = 0; + +UPDATE `admin_role_menu` arm +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_role' +AND m.old_id = arm.role_id +SET + arm.role_id_uuid = m.new_uuid +WHERE + arm.del_state = 0 + AND arm.role_id IS NOT NULL; + +UPDATE `admin_role_menu` arm +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_menu' +AND m.old_id = arm.menu_id +SET + arm.menu_id_uuid = m.new_uuid +WHERE + arm.del_state = 0 + AND arm.menu_id IS NOT NULL; + +-- admin_role_api表:填充UUID +UPDATE `admin_role_api` ara +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_role_api' +AND m.old_id = ara.id +SET + ara.id_uuid = m.new_uuid +WHERE + ara.del_state = 0; + +UPDATE `admin_role_api` ara +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_role' +AND m.old_id = ara.role_id +SET + ara.role_id_uuid = m.new_uuid +WHERE + ara.del_state = 0 + AND ara.role_id IS NOT NULL; + +UPDATE `admin_role_api` ara +INNER JOIN `uuid_mapping` m ON m.table_name = 'admin_api' +AND m.old_id = ara.api_id +SET + ara.api_id_uuid = m.new_uuid +WHERE + ara.del_state = 0 + AND ara.api_id IS NOT NULL; + +-- ============================================ +-- 第五阶段:验证数据完整性 +-- ============================================ + +-- 检查是否有NULL的UUID字段(不应该有) +SELECT 'user' as table_name, COUNT(*) as null_count +FROM `user` +WHERE + `id_uuid` IS NULL + AND `del_state` = 0 +UNION ALL +SELECT 'agent', COUNT(*) +FROM `agent` +WHERE + `id_uuid` IS NULL + AND `del_state` = 0 +UNION ALL +SELECT 'order', COUNT(*) +FROM `order` +WHERE + `id_uuid` IS NULL + AND `del_state` = 0 +UNION ALL +SELECT 'query', COUNT(*) +FROM `query` +WHERE + `id_uuid` IS NULL + AND `del_state` = 0; + +-- ============================================ +-- 第六阶段:切换主键(需要停止服务) +-- ============================================ + +-- 注意:此阶段需要停止服务,因为会修改主键和索引 +-- 建议在维护窗口期执行 + +-- 删除旧主键,将UUID字段设为主键 +-- 注意:需要先删除所有外键约束(如果有的话) + +-- user表:切换主键 +ALTER TABLE `user` +DROP PRIMARY KEY, +MODIFY COLUMN `id` BIGINT NULL COMMENT '旧ID(保留用于回滚)', +MODIFY COLUMN `id_uuid` CHAR(36) NOT NULL COMMENT 'UUID主键', +ADD PRIMARY KEY (`id_uuid`); + +-- agent表:切换主键 +ALTER TABLE `agent` +DROP PRIMARY KEY, +MODIFY COLUMN `id` BIGINT NULL COMMENT '旧ID(保留用于回滚)', +MODIFY COLUMN `id_uuid` CHAR(36) NOT NULL COMMENT 'UUID主键', +ADD PRIMARY KEY (`id_uuid`); + +-- product表:切换主键 +ALTER TABLE `product` +DROP PRIMARY KEY, +MODIFY COLUMN `id` BIGINT NULL COMMENT '旧ID(保留用于回滚)', +MODIFY COLUMN `id_uuid` CHAR(36) NOT NULL COMMENT 'UUID主键', +ADD PRIMARY KEY (`id_uuid`); + +-- order表:切换主键 +ALTER TABLE `order` +DROP PRIMARY KEY, +MODIFY COLUMN `id` BIGINT NULL COMMENT '旧ID(保留用于回滚)', +MODIFY COLUMN `id_uuid` CHAR(36) NOT NULL COMMENT 'UUID主键', +ADD PRIMARY KEY (`id_uuid`); + +-- query表:切换主键 +ALTER TABLE `query` +DROP PRIMARY KEY, +MODIFY COLUMN `id` BIGINT NULL COMMENT '旧ID(保留用于回滚)', +MODIFY COLUMN `id_uuid` CHAR(36) NOT NULL COMMENT 'UUID主键', +ADD PRIMARY KEY (`id_uuid`); + +-- user_auth表:切换主键 +ALTER TABLE `user_auth` +DROP PRIMARY KEY, +MODIFY COLUMN `id` BIGINT NULL COMMENT '旧ID(保留用于回滚)', +MODIFY COLUMN `id_uuid` CHAR(36) NOT NULL COMMENT 'UUID主键', +ADD PRIMARY KEY (`id_uuid`); + +-- 其他表类似处理... +-- (为节省篇幅,这里省略其他表的切换,实际执行时需要为所有表执行类似操作) + +-- ============================================ +-- 第七阶段:重命名字段(将_uuid后缀去掉) +-- ============================================ + +-- user表:重命名字段 +ALTER TABLE `user` +CHANGE COLUMN `id_uuid` `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP COLUMN `id`; +-- 删除旧ID字段(确认无误后执行) + +-- 注意:其他表也需要类似处理,但需要先确保所有代码都已更新为使用UUID + +-- ============================================ +-- 第八阶段:更新唯一索引和约束 +-- ============================================ + +-- user表:更新mobile唯一索引(如果存在) +-- ALTER TABLE `user` ADD UNIQUE INDEX `uk_mobile` (`mobile`); + +-- user_auth表:更新(auth_type, auth_key)唯一索引 +ALTER TABLE `user_auth` +ADD UNIQUE INDEX `uk_auth_type_key` (`auth_type`, `auth_key`); + +-- agent表:更新user_id唯一索引 +ALTER TABLE `agent` ADD UNIQUE INDEX `uk_user_id` (`user_id_uuid`); + +-- ============================================ +-- 第九阶段:清理临时表 +-- ============================================ + +-- 确认所有数据迁移无误后,删除映射表 +-- DROP TABLE IF EXISTS `uuid_mapping`; + +-- ============================================ +-- 注意事项 +-- ============================================ +-- 1. 此脚本需要分阶段执行,每阶段执行后需要验证数据完整性 +-- 2. 第六阶段(切换主键)需要停止服务 +-- 3. 执行前务必备份数据库 +-- 4. 建议先在测试环境完整执行一遍 +-- 5. 代码层面需要同步修改: +-- - 所有Model的ID字段类型从int64改为string +-- - 所有插入操作需要生成UUID(使用uuid.NewString()) +-- - 所有查询操作需要使用UUID +-- 6. 删除旧ID字段前,确保所有代码都已更新完成 \ No newline at end of file diff --git a/deploy/sql/uuid_migration_simple.sql b/deploy/sql/uuid_migration_simple.sql new file mode 100644 index 0000000..70e1b74 --- /dev/null +++ b/deploy/sql/uuid_migration_simple.sql @@ -0,0 +1,446 @@ +-- ============================================ +-- UUID迁移脚本(简化版 - 开发环境) +-- 将系统中所有bigint类型的ID字段改为CHAR(36)类型的UUID +-- 注意:此脚本直接修改表结构,不保留旧数据,适用于开发环境 +-- ============================================ + +-- 注意:user表和product表已经是CHAR(36)类型,跳过修改 + +-- ============================================ +-- 第一部分:修改核心业务表 +-- ============================================ + +-- user表:已经是CHAR(36),跳过 +-- product表:已经是CHAR(36),跳过 + +-- order表:修改主键和外键字段 +ALTER TABLE `order` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- query表:修改主键和外键字段 +ALTER TABLE `query` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- user_auth表:修改主键和外键字段(注意:user_id需要关联到user表的UUID) +ALTER TABLE `user_auth` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD UNIQUE INDEX `uk_auth_type_key` (`auth_type`, `auth_key`) COMMENT '确保同一个认证方式只能绑定一个用户'; + +-- agent表:修改主键和外键字段 +ALTER TABLE `agent` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `team_leader_id` CHAR(36) NULL COMMENT '团队首领UUID', +MODIFY COLUMN `invite_code_id` CHAR(36) NULL COMMENT '邀请码UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD UNIQUE INDEX `uk_user_id` (`user_id`), +ADD INDEX `idx_team_leader_id` (`team_leader_id`), +ADD INDEX `idx_invite_code_id` (`invite_code_id`); + +-- ============================================ +-- 第二部分:修改代理相关表 +-- ============================================ + +-- agent_commission表 +ALTER TABLE `agent_commission` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- agent_invite_code表 +ALTER TABLE `agent_invite_code` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NULL COMMENT '代理UUID', +MODIFY COLUMN `used_user_id` CHAR(36) NULL COMMENT '使用用户UUID', +MODIFY COLUMN `used_agent_id` CHAR(36) NULL COMMENT '使用代理UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_used_user_id` (`used_user_id`), +ADD INDEX `idx_used_agent_id` (`used_agent_id`); + +-- agent_link表 +ALTER TABLE `agent_link` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- agent_order表 +ALTER TABLE `agent_order` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- agent_wallet表 +ALTER TABLE `agent_wallet` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD UNIQUE INDEX `uk_agent_id` (`agent_id`); + +-- agent_withdrawal表 +ALTER TABLE `agent_withdrawal` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `wallet_id` CHAR(36) NOT NULL COMMENT '钱包UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_wallet_id` (`wallet_id`); + +-- agent_withdrawal_tax表 +ALTER TABLE `agent_withdrawal_tax` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `withdrawal_id` CHAR(36) NOT NULL COMMENT '提现UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_withdrawal_id` (`withdrawal_id`); + +-- agent_rebate表 +ALTER TABLE `agent_rebate` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- agent_relation表 +ALTER TABLE `agent_relation` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `parent_agent_id` CHAR(36) NULL COMMENT '上级代理UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_parent_agent_id` (`parent_agent_id`); + +-- agent_upgrade表 +ALTER TABLE `agent_upgrade` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`); + +-- agent_real_name表 +ALTER TABLE `agent_real_name` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`); + +-- agent_config表 +ALTER TABLE `agent_config` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- agent_product_config表 +ALTER TABLE `agent_product_config` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- agent_short_link表 +ALTER TABLE `agent_short_link` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `invite_code_id` CHAR(36) NULL COMMENT '邀请码UUID', +MODIFY COLUMN `link_id` CHAR(36) NULL COMMENT '链接UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_invite_code_id` (`invite_code_id`), +ADD INDEX `idx_link_id` (`link_id`); + +-- agent_invite_code_usage表 +ALTER TABLE `agent_invite_code_usage` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `invite_code_id` CHAR(36) NOT NULL COMMENT '邀请码UUID', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_invite_code_id` (`invite_code_id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_agent_id` (`agent_id`); + +-- agent_freeze_task表 +ALTER TABLE `agent_freeze_task` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `agent_id` CHAR(36) NOT NULL COMMENT '代理UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `commission_id` CHAR(36) NOT NULL COMMENT '佣金UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_agent_id` (`agent_id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_commission_id` (`commission_id`); + +-- ============================================ +-- 第三部分:修改订单相关表 +-- ============================================ + +-- order_refund表 +ALTER TABLE `order_refund` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- ============================================ +-- 第四部分:修改查询相关表 +-- ============================================ + +-- query_cleanup_log表 +ALTER TABLE `query_cleanup_log` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- query_cleanup_detail表 +ALTER TABLE `query_cleanup_detail` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `cleanup_log_id` CHAR(36) NOT NULL COMMENT '清理日志UUID', +MODIFY COLUMN `query_id` CHAR(36) NOT NULL COMMENT '查询UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_cleanup_log_id` (`cleanup_log_id`), +ADD INDEX `idx_query_id` (`query_id`), +ADD INDEX `idx_order_id` (`order_id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_product_id` (`product_id`); + +-- query_cleanup_config表 +ALTER TABLE `query_cleanup_config` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- ============================================ +-- 第五部分:修改产品相关表 +-- ============================================ + +-- product_feature表 +ALTER TABLE `product_feature` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `product_id` CHAR(36) NOT NULL COMMENT '产品UUID', +MODIFY COLUMN `feature_id` CHAR(36) NOT NULL COMMENT '功能UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_product_id` (`product_id`), +ADD INDEX `idx_feature_id` (`feature_id`); + +-- feature表 +ALTER TABLE `feature` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- ============================================ +-- 第六部分:修改其他表 +-- ============================================ + +-- authorization_document表 +ALTER TABLE `authorization_document` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '用户UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_order_id` (`order_id`); + +-- global_notifications表(注意:原表id是int类型) +ALTER TABLE `global_notifications` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- example表 +ALTER TABLE `example` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `feature_id` CHAR(36) NOT NULL COMMENT '功能UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_feature_id` (`feature_id`); + +-- ============================================ +-- 第七部分:修改管理后台表 +-- ============================================ + +-- admin_user表 +ALTER TABLE `admin_user` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- admin_role表 +ALTER TABLE `admin_role` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- admin_menu表(注意:字段名是pid,不是parent_id) +ALTER TABLE `admin_menu` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `pid` CHAR(36) NOT NULL DEFAULT '0' COMMENT '父菜单UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_pid` (`pid`); + +-- admin_api表 +ALTER TABLE `admin_api` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- admin_dict_type表 +ALTER TABLE `admin_dict_type` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- admin_dict_data表(注意:没有dict_type_id字段,使用dict_type字符串) +-- 此表不需要修改外键字段,因为使用的是dict_type字符串而不是ID + +ALTER TABLE `admin_dict_data` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`); + +-- admin_user_role表 +ALTER TABLE `admin_user_role` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT '用户UUID', +MODIFY COLUMN `role_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT '角色UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_user_id` (`user_id`), +ADD INDEX `idx_role_id` (`role_id`); + +-- admin_role_menu表 +ALTER TABLE `admin_role_menu` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `role_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT '角色UUID', +MODIFY COLUMN `menu_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT '菜单UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_role_id` (`role_id`), +ADD INDEX `idx_menu_id` (`menu_id`); + +-- admin_role_api表 +ALTER TABLE `admin_role_api` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `role_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT '角色UUID', +MODIFY COLUMN `api_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT 'API UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_role_id` (`role_id`), +ADD INDEX `idx_api_id` (`api_id`); + +-- ============================================ +-- 第八部分:修改推广相关表(新增) +-- ============================================ + +-- admin_promotion_link表 +ALTER TABLE `admin_promotion_link` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `admin_user_id` CHAR(36) NOT NULL DEFAULT '0' COMMENT '推广者账号UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_admin_user_id` (`admin_user_id`); + +-- admin_promotion_link_stats_history表 +ALTER TABLE `admin_promotion_link_stats_history` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `link_id` CHAR(36) NOT NULL COMMENT '推广链接UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_link_id` (`link_id`); + +-- admin_promotion_link_stats_total表 +ALTER TABLE `admin_promotion_link_stats_total` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `link_id` CHAR(36) NOT NULL COMMENT '推广链接UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `idx_link_id` (`link_id`); + +-- admin_promotion_order表 +ALTER TABLE `admin_promotion_order` +MODIFY COLUMN `id` CHAR(36) NOT NULL COMMENT 'UUID主键', +MODIFY COLUMN `link_id` CHAR(36) NOT NULL COMMENT '推广链接UUID', +MODIFY COLUMN `order_id` CHAR(36) NOT NULL COMMENT '订单UUID', +MODIFY COLUMN `user_id` CHAR(36) NOT NULL COMMENT '下单用户UUID', +MODIFY COLUMN `admin_user_id` CHAR(36) NOT NULL COMMENT '推广者账号UUID', +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD UNIQUE INDEX `uk_order_id` (`order_id`) COMMENT '确保每个订单只有一条推广记录', +ADD INDEX `idx_link_id` (`link_id`), +ADD INDEX `idx_user_id` (`user_id`) COMMENT '优化用户查询', +ADD INDEX `idx_admin_user_id` (`admin_user_id`); + +-- ============================================ +-- 注意事项 +-- ============================================ +-- 1. 此脚本直接修改表结构,不保留旧数据 +-- 2. user表和product表已经是CHAR(36)类型,已跳过 +-- 3. 执行后,所有ID字段都是CHAR(36)类型 +-- 4. 插入新记录时,需要在应用层生成UUID(使用uuid.NewString()) +-- 5. 如果表中有数据,需要先清空数据或手动填充UUID +-- 6. 建议在开发环境先测试,确认无误后再应用到生产环境 +-- 7. admin_menu表使用pid字段而不是parent_id +-- 8. admin_dict_data表使用dict_type字符串字段,不是dict_type_id +-- 9. global_notifications表的id原为int类型,现改为CHAR(36) \ No newline at end of file