yjp 1 سال پیش
والد
کامیت
cddfeb9e73

+ 18 - 3
go.mod

@@ -5,6 +5,7 @@ go 1.22.3
 require (
 	git.sxidc.com/go-tools/utils v1.5.10
 	git.sxidc.com/service-supports/fserr v0.3.5
+	git.sxidc.com/service-supports/fslog v0.5.9
 	git.sxidc.com/service-supports/websocket v1.3.1
 	github.com/gin-gonic/gin v1.10.0
 	github.com/iancoleman/strcase v0.3.0
@@ -12,10 +13,14 @@ require (
 	go.uber.org/zap v1.27.0
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gopkg.in/yaml.v3 v3.0.1
+	gorm.io/driver/postgres v1.5.7
+	gorm.io/gorm v1.25.10
 )
 
 require (
-	git.sxidc.com/service-supports/fslog v0.5.9 // indirect
+	github.com/Masterminds/goutils v1.1.1 // indirect
+	github.com/Masterminds/semver/v3 v3.2.0 // indirect
+	github.com/Masterminds/sprig/v3 v3.2.3 // indirect
 	github.com/bytedance/sonic v1.11.6 // indirect
 	github.com/bytedance/sonic/loader v0.1.1 // indirect
 	github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect
@@ -27,12 +32,21 @@ require (
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.20.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
+	github.com/google/uuid v1.1.1 // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
+	github.com/huandu/xstrings v1.3.3 // indirect
+	github.com/imdario/mergo v0.3.11 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+	github.com/jackc/pgx/v5 v5.4.3 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect
-	github.com/kr/pretty v0.3.0 // indirect
 	github.com/leodido/go-urn v1.4.0 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/mitchellh/copystructure v1.0.0 // indirect
+	github.com/mitchellh/reflectwalk v1.0.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/olahol/melody v1.2.1 // indirect
@@ -40,7 +54,9 @@ require (
 	github.com/puzpuzpuz/xsync v1.5.2 // indirect
 	github.com/rogpeppe/go-internal v1.12.0 // indirect
 	github.com/satori/go.uuid v1.2.0 // indirect
+	github.com/shopspring/decimal v1.2.0 // indirect
 	github.com/smartystreets/goconvey v1.8.1 // indirect
+	github.com/spf13/cast v1.3.1 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.12 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
@@ -50,5 +66,4 @@ require (
 	golang.org/x/sys v0.20.0 // indirect
 	golang.org/x/text v0.15.0 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
-	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )

+ 67 - 8
go.sum

@@ -6,6 +6,12 @@ git.sxidc.com/service-supports/fslog v0.5.9 h1:q2XIK2o/fk/qmByy4x5kKLC+k7kolT5Lr
 git.sxidc.com/service-supports/fslog v0.5.9/go.mod h1:/m03ATmmOle75qtEgvEw8a1+Dcg6iHp08M1bGFXJTBU=
 git.sxidc.com/service-supports/websocket v1.3.1 h1:1mRfUwvpg0QA2JVKVMK8YJ/B33HFpDhY9srqroIuNGc=
 git.sxidc.com/service-supports/websocket v1.3.1/go.mod h1:YqEZXkN8ZFzUp01tDlekgIJJ0Yz+67d6eTXyA0ZIkgM=
+github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
+github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
+github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g=
+github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
+github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
+github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
 github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
 github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
 github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
@@ -16,7 +22,6 @@ github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/
 github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
 github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
 github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
-github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -39,12 +44,28 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
 github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
 github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=
+github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
 github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
+github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=
+github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY=
+github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
@@ -53,18 +74,18 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
 github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
 github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
 github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
 github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
 github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
+github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
+github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
+github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -78,20 +99,25 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/puzpuzpuz/xsync v1.5.2 h1:yRAP4wqSOZG+/4pxJ08fPTwrfL0IzE/LKQ/cw509qGY=
 github.com/puzpuzpuz/xsync v1.5.2/go.mod h1:K98BYhX3k1dQ2M63t1YNVDanbwUPmBCAhNmVrrxfiGg=
-github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY=
 github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=
 github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=
 github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60=
+github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@@ -105,6 +131,7 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E
 github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
 github.com/vrecan/death v3.0.1+incompatible h1:hYRRqrdyoUAbymk2KJ8tNHmZFKcVeThRUySCqwC5Itg=
 github.com/vrecan/death v3.0.1+incompatible/go.mod h1:ektTae4lwvcXJ7pytrLb2N0w7mwhzmu+f5vRHYzy33E=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -114,27 +141,59 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
 golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
 golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
 golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
 golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
 golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
 golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
 google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM=
+gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA=
+gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
+gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

+ 40 - 39
infrastructure/database/database.go

@@ -1,6 +1,7 @@
 package database
 
 import (
+	"git.sxidc.com/go-framework/baize/infrastructure/database/sql"
 	"git.sxidc.com/go-framework/baize/tag/sql/sql_mapping"
 	"git.sxidc.com/go-tools/utils/reflectutils"
 	"git.sxidc.com/go-tools/utils/strutils"
@@ -11,8 +12,8 @@ import (
 )
 
 type Executor interface {
-	ExecuteRawSql(sql string, executeParams map[string]any) ([]Result, error)
-	ExecuteSql(name string, executeParams map[string]any) ([]Result, error)
+	ExecuteRawSql(sql string, executeParams map[string]any) ([]sql.Result, error)
+	ExecuteSql(name string, executeParams map[string]any) ([]sql.Result, error)
 }
 
 const (
@@ -43,7 +44,7 @@ func InsertEntity(executor Executor, tableName string, e any) error {
 		return err
 	}
 
-	executeParamsMap, err := InsertExecuteParams{
+	executeParamsMap, err := sql.InsertExecuteParams{
 		TableName: tableName,
 		TableRow:  formInsertTableRow(fields),
 	}.Map()
@@ -51,7 +52,7 @@ func InsertEntity(executor Executor, tableName string, e any) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(InsertTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.InsertTpl, executeParamsMap)
 	if err != nil {
 		if strings.Contains(err.Error(), "SQLSTATE 23505") {
 			return ErrDBRecordHasExist
@@ -72,7 +73,7 @@ func InsertEntityBatch(executor Executor, tableName string, es []any) error {
 		return fserr.New("没有传递表名")
 	}
 
-	tableRowBatch := make([]TableRow, 0)
+	tableRowBatch := make([]sql.TableRow, 0)
 
 	for _, e := range es {
 		if e == nil {
@@ -92,7 +93,7 @@ func InsertEntityBatch(executor Executor, tableName string, es []any) error {
 		tableRowBatch = append(tableRowBatch, *formInsertTableRow(fields))
 	}
 
-	executeParamsMap, err := InsertBatchExecuteParams{
+	executeParamsMap, err := sql.InsertBatchExecuteParams{
 		TableName:     tableName,
 		TableRowBatch: tableRowBatch,
 	}.Map()
@@ -100,7 +101,7 @@ func InsertEntityBatch(executor Executor, tableName string, es []any) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(InsertTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.InsertTpl, executeParamsMap)
 	if err != nil {
 		if strings.Contains(err.Error(), "SQLSTATE 23505") {
 			return ErrDBRecordHasExist
@@ -112,9 +113,9 @@ func InsertEntityBatch(executor Executor, tableName string, es []any) error {
 	return nil
 }
 
-func formInsertTableRow(fields []sql_mapping.Field) *TableRow {
+func formInsertTableRow(fields []sql_mapping.Field) *sql.TableRow {
 	now := time.Now().Local()
-	tableRow := NewTableRow()
+	tableRow := sql.NewTableRow()
 
 	for _, field := range fields {
 		fieldValue := reflect.ValueOf(field.Value)
@@ -152,7 +153,7 @@ func DeleteEntity(executor Executor, tableName string, e any) error {
 		return err
 	}
 
-	conditions := NewConditions()
+	conditions := sql.NewConditions()
 	for _, field := range fields {
 		// 不是键,字段跳过
 		if !field.IsKey {
@@ -162,7 +163,7 @@ func DeleteEntity(executor Executor, tableName string, e any) error {
 		conditions.Equal(field.ColumnName, field.Value)
 	}
 
-	executeParamsMap, err := DeleteExecuteParams{
+	executeParamsMap, err := sql.DeleteExecuteParams{
 		TableName:  tableName,
 		Conditions: conditions,
 	}.Map()
@@ -170,7 +171,7 @@ func DeleteEntity(executor Executor, tableName string, e any) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(DeleteTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.DeleteTpl, executeParamsMap)
 	if err != nil {
 		return err
 	}
@@ -202,8 +203,8 @@ func UpdateEntity(executor Executor, tableName string, e any) error {
 	}
 
 	now := time.Now().Local()
-	tableRow := NewTableRow()
-	conditions := NewConditions()
+	tableRow := sql.NewTableRow()
+	conditions := sql.NewConditions()
 
 	for _, field := range fields {
 		// 不是键字段
@@ -227,7 +228,7 @@ func UpdateEntity(executor Executor, tableName string, e any) error {
 		}
 	}
 
-	executeParamsMap, err := UpdateExecuteParams{
+	executeParamsMap, err := sql.UpdateExecuteParams{
 		TableName:  tableName,
 		TableRow:   tableRow,
 		Conditions: conditions,
@@ -236,7 +237,7 @@ func UpdateEntity(executor Executor, tableName string, e any) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(UpdateTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.UpdateTpl, executeParamsMap)
 	if err != nil {
 		return err
 	}
@@ -244,7 +245,7 @@ func UpdateEntity(executor Executor, tableName string, e any) error {
 	return nil
 }
 
-func Insert(executor Executor, executeParams *InsertExecuteParams) error {
+func Insert(executor Executor, executeParams *sql.InsertExecuteParams) error {
 	if executor == nil {
 		return fserr.New("没有传递执行器")
 	}
@@ -258,7 +259,7 @@ func Insert(executor Executor, executeParams *InsertExecuteParams) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(InsertTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.InsertTpl, executeParamsMap)
 	if err != nil {
 		return err
 	}
@@ -266,7 +267,7 @@ func Insert(executor Executor, executeParams *InsertExecuteParams) error {
 	return nil
 }
 
-func InsertBatch(executor Executor, executeParams *InsertBatchExecuteParams) error {
+func InsertBatch(executor Executor, executeParams *sql.InsertBatchExecuteParams) error {
 	if executor == nil {
 		return fserr.New("没有传递执行器")
 	}
@@ -280,7 +281,7 @@ func InsertBatch(executor Executor, executeParams *InsertBatchExecuteParams) err
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(InsertTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.InsertTpl, executeParamsMap)
 	if err != nil {
 		return err
 	}
@@ -288,7 +289,7 @@ func InsertBatch(executor Executor, executeParams *InsertBatchExecuteParams) err
 	return nil
 }
 
-func Delete(executor Executor, executeParams *DeleteExecuteParams) error {
+func Delete(executor Executor, executeParams *sql.DeleteExecuteParams) error {
 	if executor == nil {
 		return fserr.New("没有传递执行器")
 	}
@@ -302,7 +303,7 @@ func Delete(executor Executor, executeParams *DeleteExecuteParams) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(DeleteTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.DeleteTpl, executeParamsMap)
 	if err != nil {
 		return err
 	}
@@ -310,7 +311,7 @@ func Delete(executor Executor, executeParams *DeleteExecuteParams) error {
 	return nil
 }
 
-func Update(executor Executor, executeParams *UpdateExecuteParams) error {
+func Update(executor Executor, executeParams *sql.UpdateExecuteParams) error {
 	if executor == nil {
 		return fserr.New("没有传递执行器")
 	}
@@ -324,7 +325,7 @@ func Update(executor Executor, executeParams *UpdateExecuteParams) error {
 		return err
 	}
 
-	_, err = executor.ExecuteRawSql(UpdateTpl, executeParamsMap)
+	_, err = executor.ExecuteRawSql(sql.UpdateTpl, executeParamsMap)
 	if err != nil {
 		return err
 	}
@@ -332,7 +333,7 @@ func Update(executor Executor, executeParams *UpdateExecuteParams) error {
 	return nil
 }
 
-func Query(executor Executor, executeParams *QueryExecuteParams) ([]Result, int64, error) {
+func Query(executor Executor, executeParams *sql.QueryExecuteParams) ([]sql.Result, int64, error) {
 	if executor == nil {
 		return nil, 0, fserr.New("没有传递执行器")
 	}
@@ -346,7 +347,7 @@ func Query(executor Executor, executeParams *QueryExecuteParams) ([]Result, int6
 		return nil, 0, err
 	}
 
-	countExecuteParamsMap, err := CountExecuteParams{
+	countExecuteParamsMap, err := sql.CountExecuteParams{
 		TableName:  executeParams.TableName,
 		Conditions: executeParams.Conditions,
 	}.Map()
@@ -354,17 +355,17 @@ func Query(executor Executor, executeParams *QueryExecuteParams) ([]Result, int6
 		return nil, 0, err
 	}
 
-	tableRows, err := executor.ExecuteRawSql(QueryTpl, queryExecuteParamsMap)
+	tableRows, err := executor.ExecuteRawSql(sql.QueryTpl, queryExecuteParamsMap)
 	if err != nil {
 		return nil, 0, err
 	}
 
-	countTableRow, err := executor.ExecuteRawSql(CountTpl, countExecuteParamsMap)
+	countTableRow, err := executor.ExecuteRawSql(sql.CountTpl, countExecuteParamsMap)
 	if err != nil {
 		return nil, 0, err
 	}
 
-	results := make([]Result, len(tableRows))
+	results := make([]sql.Result, len(tableRows))
 	for i, row := range tableRows {
 		results[i] = row
 	}
@@ -372,7 +373,7 @@ func Query(executor Executor, executeParams *QueryExecuteParams) ([]Result, int6
 	return results, int64(countTableRow[0]["count"].(float64)), nil
 }
 
-func QueryOne(executor Executor, executeParams *QueryOneExecuteParams) (Result, error) {
+func QueryOne(executor Executor, executeParams *sql.QueryOneExecuteParams) (sql.Result, error) {
 	if executor == nil {
 		return nil, fserr.New("没有传递执行器")
 	}
@@ -386,7 +387,7 @@ func QueryOne(executor Executor, executeParams *QueryOneExecuteParams) (Result,
 		return nil, err
 	}
 
-	tableRows, err := executor.ExecuteRawSql(QueryTpl, executeParamsMap)
+	tableRows, err := executor.ExecuteRawSql(sql.QueryTpl, executeParamsMap)
 	if err != nil {
 		return nil, err
 	}
@@ -398,7 +399,7 @@ func QueryOne(executor Executor, executeParams *QueryOneExecuteParams) (Result,
 	return tableRows[0], nil
 }
 
-func Count(executor Executor, executeParams *CountExecuteParams) (int64, error) {
+func Count(executor Executor, executeParams *sql.CountExecuteParams) (int64, error) {
 	if executor == nil {
 		return 0, fserr.New("没有传递执行器")
 	}
@@ -412,7 +413,7 @@ func Count(executor Executor, executeParams *CountExecuteParams) (int64, error)
 		return 0, err
 	}
 
-	tableRows, err := executor.ExecuteRawSql(CountTpl, executeParamsMap)
+	tableRows, err := executor.ExecuteRawSql(sql.CountTpl, executeParamsMap)
 	if err != nil {
 		return 0, err
 	}
@@ -420,7 +421,7 @@ func Count(executor Executor, executeParams *CountExecuteParams) (int64, error)
 	return int64(tableRows[0]["count"].(float64)), nil
 }
 
-func CheckExist(executor Executor, executeParams *CheckExistExecuteParams) (bool, error) {
+func CheckExist(executor Executor, executeParams *sql.CheckExistExecuteParams) (bool, error) {
 	if executor == nil {
 		return false, fserr.New("没有传递执行器")
 	}
@@ -434,7 +435,7 @@ func CheckExist(executor Executor, executeParams *CheckExistExecuteParams) (bool
 		return false, err
 	}
 
-	tableRows, err := executor.ExecuteRawSql(CountTpl, executeParamsMap)
+	tableRows, err := executor.ExecuteRawSql(sql.CountTpl, executeParamsMap)
 	if err != nil {
 		return false, err
 	}
@@ -442,7 +443,7 @@ func CheckExist(executor Executor, executeParams *CheckExistExecuteParams) (bool
 	return int64(tableRows[0]["count"].(float64)) > 0, nil
 }
 
-func CheckHasOnlyOne(executor Executor, executeParams *CheckHasOnlyOneExecuteParams) (bool, error) {
+func CheckHasOnlyOne(executor Executor, executeParams *sql.CheckHasOnlyOneExecuteParams) (bool, error) {
 	if executor == nil {
 		return false, fserr.New("没有传递执行器")
 	}
@@ -456,7 +457,7 @@ func CheckHasOnlyOne(executor Executor, executeParams *CheckHasOnlyOneExecutePar
 		return false, err
 	}
 
-	tableRows, err := executor.ExecuteRawSql(CountTpl, executeParamsMap)
+	tableRows, err := executor.ExecuteRawSql(sql.CountTpl, executeParamsMap)
 	if err != nil {
 		return false, err
 	}
@@ -464,7 +465,7 @@ func CheckHasOnlyOne(executor Executor, executeParams *CheckHasOnlyOneExecutePar
 	return int64(tableRows[0]["count"].(float64)) == 1, nil
 }
 
-func ExecuteRawSql(executor Executor, sql string, executeParams map[string]any) ([]Result, error) {
+func ExecuteRawSql(executor Executor, sql string, executeParams map[string]any) ([]sql.Result, error) {
 	if executor == nil {
 		return nil, fserr.New("没有传递执行器")
 	}
@@ -481,7 +482,7 @@ func ExecuteRawSql(executor Executor, sql string, executeParams map[string]any)
 	return tableRows, nil
 }
 
-func ExecuteSql(executor Executor, name string, executeParams map[string]any) ([]Result, error) {
+func ExecuteSql(executor Executor, name string, executeParams map[string]any) ([]sql.Result, error) {
 	if executor == nil {
 		return nil, fserr.New("没有传递执行器")
 	}

+ 0 - 3
infrastructure/database/db_operations/db_operations.go

@@ -1,3 +0,0 @@
-package db_operations
-
-type DBOperations struct{}

+ 11 - 0
infrastructure/database/operations/config.go

@@ -0,0 +1,11 @@
+package operations
+
+type OperationsConfig struct {
+	UserName           string
+	Password           string
+	Address            string
+	Port               string
+	Database           string
+	MaxConnections     int
+	MaxIdleConnections int
+}

+ 48 - 0
infrastructure/database/operations/db.go

@@ -0,0 +1,48 @@
+package operations
+
+import (
+	"errors"
+	"fmt"
+	"gorm.io/driver/postgres"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+)
+
+const (
+	databaseTypePostgres = "postgres"
+)
+
+func newGormDB(dbConfig *OperationsConfig) (*gorm.DB, error) {
+	if dbConfig == nil {
+		return nil, errors.New("没有传递数据库配置")
+	}
+
+	gormDB, err := newPostgresGormDB(dbConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	return gormDB, nil
+}
+
+func newPostgresGormDB(dbConfig *OperationsConfig) (*gorm.DB, error) {
+	dsn := "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable TimeZone=Asia/Shanghai"
+	connStr := fmt.Sprintf(dsn, dbConfig.Address, dbConfig.Port, dbConfig.UserName, dbConfig.Password, dbConfig.Database)
+	return gorm.Open(postgres.Open(connStr), &gorm.Config{
+		Logger:      logger.Default.LogMode(logger.Info),
+		PrepareStmt: true,
+	})
+}
+
+func destroyGormDB(gormDB *gorm.DB) error {
+	if gormDB == nil {
+		return nil
+	}
+
+	db, err := gormDB.DB()
+	if err != nil {
+		return err
+	}
+
+	return db.Close()
+}

+ 154 - 0
infrastructure/database/operations/operations.go

@@ -0,0 +1,154 @@
+package operations
+
+import (
+	dbSql "database/sql"
+	"encoding/json"
+	"git.sxidc.com/go-framework/baize/infrastructure/database/sql"
+	"git.sxidc.com/go-tools/utils/template"
+	"git.sxidc.com/service-supports/fslog"
+	"gorm.io/gorm"
+	"time"
+)
+
+type Operations struct {
+	db           *gorm.DB
+	stopPingChan chan any
+}
+
+func NewOperations(dbConfig *OperationsConfig) (*Operations, error) {
+	gormDB, err := newGormDB(dbConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	sqlDB, err := gormDB.DB()
+	if err != nil {
+		return nil, err
+	}
+
+	if dbConfig.MaxConnections == 0 {
+		dbConfig.MaxConnections = 50
+	}
+
+	if dbConfig.MaxIdleConnections == 0 {
+		dbConfig.MaxIdleConnections = 10
+	}
+
+	sqlDB.SetMaxOpenConns(dbConfig.MaxConnections)
+	sqlDB.SetMaxIdleConns(dbConfig.MaxIdleConnections)
+
+	op := &Operations{
+		db:           gormDB,
+		stopPingChan: make(chan any),
+	}
+
+	op.startBeatHeart(sqlDB)
+
+	return op, nil
+}
+
+func DestroyOperation(op *Operations) error {
+	if op == nil {
+		return nil
+	}
+
+	if op.db == nil {
+		return nil
+	}
+
+	op.stopBeatHeart()
+
+	return destroyGormDB(op.db)
+}
+
+func (op *Operations) startBeatHeart(sqlDB *dbSql.DB) {
+	go func() {
+		pingTicker := time.NewTicker(time.Minute * 1)
+		defer pingTicker.Stop()
+
+		for {
+			select {
+			case <-op.stopPingChan:
+				return
+			case <-pingTicker.C:
+				err := sqlDB.Ping()
+				if err != nil {
+					fslog.Error(err)
+				}
+			}
+		}
+	}()
+}
+
+func (op *Operations) stopBeatHeart() {
+	if op.stopPingChan != nil {
+		close(op.stopPingChan)
+		op.stopPingChan = nil
+	}
+}
+
+func (op *Operations) BeginTransaction() *TransactionOperations {
+	tx := op.db.Begin()
+	return &TransactionOperations{
+		Operations{
+			db: tx,
+		},
+	}
+}
+
+func (op *Operations) AutoMigrate(tables ...Table) error {
+	tx := op.db.Begin()
+
+	for _, table := range tables {
+		dbModel, err := table.ToDBModel()
+		if err != nil {
+			tx.Rollback()
+			return err
+		}
+
+		err = tx.Table(table.TableName).AutoMigrate(dbModel)
+		if err != nil {
+			tx.Rollback()
+			return err
+		}
+	}
+
+	tx.Commit()
+
+	return nil
+}
+
+func (op *Operations) ExecuteRawSql(sql string, executeParams map[string]any) ([]sql.Result, error) {
+	parsedSql, err := template.ParseTemplateStringToString(sql, executeParams)
+	if err != nil {
+		return nil, err
+	}
+
+	tableRows := make([]map[string]any, 0)
+	err = op.db.Raw(parsedSql).Scan(&tableRows).Error
+	if err != nil {
+		return nil, err
+	}
+
+	// 简化一下类型体系,与DataService保持一致
+	jsonTableRows, err := json.Marshal(tableRows)
+	if err != nil {
+		return nil, err
+	}
+
+	err = json.Unmarshal(jsonTableRows, &tableRows)
+	if err != nil {
+		return nil, err
+	}
+
+	results := make([]sql.Result, len(tableRows))
+	for i, row := range tableRows {
+		results[i] = row
+	}
+
+	return results, nil
+}
+
+func (op *Operations) ExecuteSql(sql string, _ map[string]any) ([]sql.Result, error) {
+	return make([]sql.Result, 0), nil
+}

+ 67 - 0
infrastructure/database/operations/table.go

@@ -0,0 +1,67 @@
+package operations
+
+import (
+	"git.sxidc.com/go-tools/utils/template"
+	"github.com/iancoleman/strcase"
+	"reflect"
+)
+
+const (
+	tagTpl = `gorm:"column:{{ .Name }};type:{{ .Type }};comment:{{ .Comment }};
+{{- if .PrimaryKey -}}primaryKey;{{- end -}}
+{{- if .Size -}}size:{{ .Size }};{{- end -}}
+{{- if .Unique -}}unique;{{- end -}}
+{{- if .NotNull -}}not null;{{- end -}}
+{{- if .Index -}}index;{{- end -}}
+{{- if .UniqueIndex -}}uniqueIndex:{{ .UniqueIndex }};{{- end -}}
+{{- if .Default -}}default:{{ .Default }};{{- end -}}
+"`
+)
+
+type Table struct {
+	TableName string
+	Columns   []TableColumn
+}
+
+func (spec *Table) ToDBModel() (any, error) {
+	dbModelFields := make([]reflect.StructField, 0)
+	for _, column := range spec.Columns {
+		dbModelField, err := column.ToDBModelField()
+		if err != nil {
+			return nil, err
+		}
+
+		dbModelFields = append(dbModelFields, *dbModelField)
+	}
+
+	structType := reflect.StructOf(dbModelFields)
+	structVar := reflect.New(structType).Elem().Addr().Interface()
+
+	return structVar, nil
+}
+
+type TableColumn struct {
+	Name        string
+	Type        string
+	Comment     string
+	PrimaryKey  bool
+	Size        int
+	Unique      bool
+	NotNull     bool
+	Index       bool
+	UniqueIndex string
+	Default     any
+}
+
+func (column *TableColumn) ToDBModelField() (*reflect.StructField, error) {
+	tag, err := template.ParseTemplateStringToString(tagTpl, column)
+	if err != nil {
+		return nil, err
+	}
+
+	return &reflect.StructField{
+		Name: strcase.ToCamel(column.Name),
+		Type: reflect.TypeOf(""),
+		Tag:  reflect.StructTag(tag),
+	}, nil
+}

+ 21 - 0
infrastructure/database/operations/transaction.go

@@ -0,0 +1,21 @@
+package operations
+
+type TransactionOperations struct {
+	Operations
+}
+
+func (op *TransactionOperations) RollbackTransaction() {
+	defer func() {
+		op.processDB = op.initDB
+	}()
+
+	op.processDB.Rollback()
+}
+
+func (op *TransactionOperations) CommitTransaction() {
+	defer func() {
+		op.processDB = op.initDB
+	}()
+
+	op.processDB.Commit()
+}

+ 1 - 1
infrastructure/database/condition.go → infrastructure/database/sql/condition.go

@@ -1,4 +1,4 @@
-package database
+package sql
 
 type Conditions struct {
 	Conditions []string

+ 1 - 1
infrastructure/database/result.go → infrastructure/database/sql/result.go

@@ -1,4 +1,4 @@
-package database
+package sql
 
 import (
 	"fmt"

+ 1 - 1
infrastructure/database/sql_template.go → infrastructure/database/sql/sql_template.go

@@ -1,4 +1,4 @@
-package database
+package sql
 
 import (
 	"git.sxidc.com/service-supports/fserr"

+ 1 - 1
infrastructure/database/table_row.go → infrastructure/database/sql/table_row.go

@@ -1,4 +1,4 @@
-package database
+package sql
 
 type TableRow struct {
 	columnValues []columnValue

+ 1 - 1
infrastructure/database/value.go → infrastructure/database/sql/value.go

@@ -1,4 +1,4 @@
-package database
+package sql
 
 import (
 	"git.sxidc.com/go-tools/utils/reflectutils"

+ 3 - 3
infrastructure/infrastructure.go

@@ -2,15 +2,15 @@ package infrastructure
 
 import (
 	"git.sxidc.com/go-framework/baize/infrastructure/database/data_service"
-	"git.sxidc.com/go-framework/baize/infrastructure/database/db_operations"
+	"git.sxidc.com/go-framework/baize/infrastructure/database/operations"
 )
 
 type Infrastructure struct {
-	dbOperations *db_operations.DBOperations
+	dbOperations *operations.Operations
 	dataService  *data_service.DataService
 }
 
-func (i Infrastructure) GetDBOperations() *db_operations.DBOperations {
+func (i Infrastructure) GetDBOperations() *operations.Operations {
 	return i.dbOperations
 }