i2bill_user_model.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package model
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "git.i2edu.net/i2/i2-bill-erp/transform"
  7. "git.i2edu.net/i2/i2-bill-erp/transformclient"
  8. "github.com/xormplus/xorm"
  9. "strings"
  10. "time"
  11. "git.i2edu.net/i2/go-zero/core/stores/cache"
  12. "git.i2edu.net/i2/go-zero/core/stores/sqlc"
  13. "git.i2edu.net/i2/go-zero/core/stores/sqlx"
  14. "git.i2edu.net/i2/go-zero/core/stringx"
  15. "git.i2edu.net/i2/go-zero/tools/goctl/model/sql/builderx"
  16. )
  17. var (
  18. UserFieldNames = builderx.RawFieldNames(&User{})
  19. UserRows = strings.Join(UserFieldNames, ",")
  20. UserRowsExpectAutoSet = strings.Join(stringx.Remove(UserFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
  21. UserRowsWithPlaceHolder = strings.Join(stringx.Remove(UserFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
  22. cacheUserIdPrefix = "cache:user:id:"
  23. cacheUserUsernamePrefix = "cache:user:username:"
  24. cacheUserWeiXinOpenIdPrefix = "cache:user:weixin_openid:"
  25. )
  26. type (
  27. Cache interface {
  28. SetCache(key string, v interface{}) error
  29. GetCache(key string, v interface{}) error
  30. SetWithExpire(key string, v interface{}, expire time.Duration) error
  31. }
  32. UserModel interface {
  33. Insert(data User) (sql.Result, error)
  34. FindOne(id int64) (*User, error)
  35. FindOneByUsername(username string) (*User, error)
  36. FindOneByWeiXinOpenId(openid string) (*User, error)
  37. Update(data User) error
  38. Delete(id int64) error
  39. CacheStorage() Cache
  40. }
  41. defaultUserModel struct {
  42. sqlc.CachedConn
  43. table string
  44. }
  45. User struct {
  46. Mobile string `db:"mobile"`
  47. Avatar string `db:"avatar"`
  48. WeixinOpenid string `db:"weixin_openid"`
  49. Password string `db:"password"`
  50. Birthday int64 `db:"birthday"`
  51. RegisterTime int64 `db:"register_time"`
  52. LastLoginTime int64 `db:"last_login_time"`
  53. Nickname string `db:"nickname"`
  54. Id int64 `db:"id"`
  55. ErpId string `db:"erp_id"`
  56. Username string `db:"username"`
  57. Gender int64 `db:"gender"`
  58. UserLevelId int64 `db:"user_level_id"`
  59. RegisterIp string `db:"register_ip"`
  60. LastLoginIp string `db:"last_login_ip"`
  61. }
  62. )
  63. func NewUserModel(conn sqlx.SqlConn, c cache.CacheConf) UserModel {
  64. return &defaultUserModel{
  65. CachedConn: sqlc.NewConn(conn, c),
  66. table: "`i2bill_user`",
  67. }
  68. }
  69. type UserXorm struct {
  70. Mobile string `json:"mobile"`
  71. Avatar string `json:"avatar"`
  72. WeixinOpenid string `json:"weixin_openid"`
  73. Password string `json:"password"`
  74. Birthday int64 `json:"birthday"`
  75. RegisterTime int64 `json:"register_time"`
  76. LastLoginTime int64 `json:"last_login_time"`
  77. Nickname string `json:"nickname"`
  78. Id int64 `json:"id"`
  79. ErpId string `json:"erp_id"`
  80. Username string `json:"username"`
  81. Gender int64 `json:"gender"`
  82. UserLevelId int64 `json:"user_level_id"`
  83. RegisterIp string `json:"register_ip"`
  84. LastLoginIp string `json:"last_login_ip"`
  85. }
  86. func (t *UserXorm) TableName() string {
  87. return "i2bill_user"
  88. }
  89. func (m *defaultUserModel) Insert(data User) (sql.Result, error) {
  90. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  91. ret, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  92. query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, UserRowsExpectAutoSet)
  93. return conn.Exec(query, data.Mobile, data.Avatar, data.WeixinOpenid, data.Password, data.Birthday, data.RegisterTime, data.LastLoginTime, data.Nickname, data.Username, data.Gender, data.UserLevelId, data.RegisterIp, data.LastLoginIp)
  94. }, userUsernameKey)
  95. return ret, err
  96. }
  97. func (m *defaultUserModel) FindOne(id int64) (*User, error) {
  98. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
  99. var resp User
  100. err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  101. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", UserRows, m.table)
  102. return conn.QueryRow(v, query, id)
  103. })
  104. switch err {
  105. case nil:
  106. return &resp, nil
  107. case sqlc.ErrNotFound:
  108. return nil, ErrNotFound
  109. default:
  110. return nil, err
  111. }
  112. }
  113. func (m *defaultUserModel) FindOneByWeiXinOpenId(id string) (*User, error) {
  114. userIdKey := fmt.Sprintf("%s%v", cacheUserWeiXinOpenIdPrefix, id)
  115. var resp User
  116. err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  117. query := fmt.Sprintf("select %s from %s where `weixin_openid` = ? limit 1", UserRows, m.table)
  118. return conn.QueryRow(v, query, id)
  119. })
  120. switch err {
  121. case nil:
  122. return &resp, nil
  123. case sqlc.ErrNotFound:
  124. return nil, ErrNotFound
  125. default:
  126. return nil, err
  127. }
  128. }
  129. func (m *defaultUserModel) FindOneByUsername(username string) (*User, error) {
  130. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, username)
  131. var resp User
  132. err := m.QueryRowIndex(&resp, userUsernameKey, m.formatPrimary, func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
  133. query := fmt.Sprintf("select %s from %s where `username` = ? limit 1", UserRows, m.table)
  134. if err := conn.QueryRow(&resp, query, username); err != nil {
  135. return nil, err
  136. }
  137. return resp.Id, nil
  138. }, m.queryPrimary)
  139. switch err {
  140. case nil:
  141. return &resp, nil
  142. case sqlc.ErrNotFound:
  143. return nil, ErrNotFound
  144. default:
  145. return nil, err
  146. }
  147. }
  148. func (m *defaultUserModel) Update(data User) error {
  149. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, data.Id)
  150. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  151. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  152. query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, UserRowsWithPlaceHolder)
  153. return conn.Exec(query, data.Mobile, data.Avatar, data.WeixinOpenid, data.Password, data.Birthday, data.RegisterTime, data.LastLoginTime, data.Nickname, data.Username, data.Gender, data.UserLevelId, data.RegisterIp, data.LastLoginIp, data.Id)
  154. }, userIdKey, userUsernameKey)
  155. return err
  156. }
  157. func (m *defaultUserModel) Delete(id int64) error {
  158. data, err := m.FindOne(id)
  159. if err != nil {
  160. return err
  161. }
  162. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
  163. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  164. _, err = m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  165. query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
  166. return conn.Exec(query, id)
  167. }, userUsernameKey, userIdKey)
  168. return err
  169. }
  170. func (m *defaultUserModel) formatPrimary(primary interface{}) string {
  171. return fmt.Sprintf("%s%v", cacheUserIdPrefix, primary)
  172. }
  173. func (m *defaultUserModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
  174. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", UserRows, m.table)
  175. return conn.QueryRow(v, query, primary)
  176. }
  177. func (m *defaultUserModel) SetCache(key string, v interface{}) error {
  178. return m.CachedConn.SetCache(key, v)
  179. }
  180. func (m *defaultUserModel) GetCache(key string, v interface{}) error {
  181. err := m.CachedConn.GetCache(key, v)
  182. if err == sql.ErrNoRows {
  183. err = ErrRdsNotFound
  184. }
  185. return err
  186. }
  187. func (m *defaultUserModel) SetWithExpire(key string, v interface{}, expire time.Duration) error {
  188. return m.CachedConn.SetWithExpire(key, v, expire)
  189. }
  190. func (m *defaultUserModel) CacheStorage() Cache {
  191. return m
  192. }
  193. //获取用户信息
  194. func GetI2bilUserInfo(userId int64, engine *xorm.Engine) (*UserXorm, error) {
  195. user := new(UserXorm)
  196. _, err := engine.SQL("select * from i2bill_user where id = ?", userId).Get(user)
  197. if err != nil {
  198. return nil, err
  199. }
  200. return user, nil
  201. }
  202. func GetAcquirePerm(userId int64, rpcClient transformclient.Transform, engine *xorm.Engine) (string, error) {
  203. partUser, err := GetPartTimeXormByUserId(userId, engine)
  204. if err != nil {
  205. return "", err
  206. }
  207. if partUser.Id != 0 && partUser.MkId != "" {
  208. return GetErpUser("", partUser.MkId, rpcClient)
  209. }
  210. user, err := GetI2bilUserInfo(userId, engine)
  211. if err != nil {
  212. return "", err
  213. }
  214. return GetErpUser(user.Mobile, "", rpcClient)
  215. }
  216. func GetErpUser(mobile string, erpUserId string, rpcClient transformclient.Transform) (string, error) {
  217. ctx := context.Background()
  218. in := new(transform.GetErpRoleReq)
  219. in.Mobile = mobile
  220. in.UserId = erpUserId
  221. erpRoles, err := rpcClient.GetErpRole(ctx, in)
  222. if err != nil {
  223. return "", err
  224. }
  225. if erpRoles.UserId != "" {
  226. roles := strings.Split(erpRoles.Role, ",")
  227. for _, r := range roles {
  228. if r == "LAMK" || r == "LAMKM" || r == "student/readingStudent" {
  229. return erpRoles.UserId, nil
  230. }
  231. }
  232. }
  233. return "", nil
  234. }
  235. //获取校区权限
  236. func GetUserSchoolPerm(erpUserId string, rpcClient transformclient.Transform, engine *xorm.Engine) ([]*transform.OrganSchool, error) {
  237. ctx := context.Background()
  238. in := erpUserId
  239. result, err := rpcClient.GetErpOrganSchPerByUserId(ctx, &transform.GetErpOrganSchPerByUserIdReq{UserId: in})
  240. if err != nil {
  241. return nil, err
  242. }
  243. return result.School, nil
  244. }