user.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package models
  2. import (
  3. "context"
  4. "eta/eta_mini_crm/utils"
  5. "fmt"
  6. "strings"
  7. "time"
  8. "github.com/beego/beego/v2/client/orm"
  9. )
  10. type User struct {
  11. UserId int `orm:"pk" description:"用户id"`
  12. RealName string `description:"姓名"`
  13. Phone string `description:"手机号"`
  14. AreaCode string `description:"区号"`
  15. Email string `description:"邮箱"`
  16. SellerId int `description:"销售id(SysUserId)"`
  17. Company string `description:"所属公司"`
  18. ValidStartTime time.Time `description:"有效期开始时间"`
  19. ValidEndTime time.Time `description:"有效期结束时间"`
  20. Status int `description:"用户类型: 0表示禁用,1表示潜在客户,2表示正式客户"`
  21. CreateTime time.Time `description:"系统中首次新增用户的时间"`
  22. ModifyTime time.Time `description:"系统中用户信息变更的时间"`
  23. RegisterTime time.Time `description:"用户首次登录小程序的时间"`
  24. IsSubscribed bool `description:"是否关注公众号: 0表示没有关注,1表示关注"`
  25. IsRegistered bool `description:"是否注册: 0表示没有注册,1表示注册"`
  26. }
  27. type UserView struct {
  28. UserId int `orm:"pk" description:"用户id"`
  29. RealName string `description:"姓名"`
  30. Phone string `description:"手机号"`
  31. AreaCode string `description:"区号"`
  32. Email string `description:"邮箱"`
  33. SellerId int `description:"销售id(SysUserId)"`
  34. SellerName string `description:"销售姓名"`
  35. Company string `description:"所属公司"`
  36. ValidStartTime string `description:"有效期开始时间"`
  37. ValidEndTime string `description:"有效期结束时间"`
  38. RestDate int `description:"剩余天数"`
  39. Status int `description:"用户类型: 0表示禁用,1表示潜在客户,2表示正式客户"`
  40. ReadCnt int `description:"用户阅读量"`
  41. CreateTime string `description:"系统中首次新增用户的时间"`
  42. ModifyTime string `description:"系统中用户信息变更的时间"`
  43. LastUpdateTime string `description:"最近一次阅读时间"`
  44. RegisterTime string `description:"用户首次登录小程序的时间"`
  45. IsSubscribed bool `description:"是否关注公众号: 0表示没有关注,1表示关注"`
  46. IsRegistered bool `description:"是否注册: 0表示没有注册,1表示注册"`
  47. }
  48. func (u *User) Save() (err error) {
  49. o := orm.NewOrm()
  50. _, err = o.InsertOrUpdate(u)
  51. return
  52. }
  53. func (u *User) Update(cols []string) (err error) {
  54. o := orm.NewOrm()
  55. _, err = o.Update(u, cols...)
  56. return
  57. }
  58. func UpdateUserStatus(condition string, pars []interface{}) (err error) {
  59. o := orm.NewOrm()
  60. sql := ` UPDATE user SET status=0 WHERE 1=1 `
  61. if condition != "" {
  62. sql += condition
  63. }
  64. _, err = o.Raw(sql, pars).Exec()
  65. return
  66. }
  67. func GetUserIdListByCondition(condition string, pars []interface{}) (items []int, err error) {
  68. o := orm.NewOrm()
  69. sql := ` SELECT user_id FROM user WHERE 1=1 `
  70. if condition != "" {
  71. sql += condition
  72. }
  73. _, err = o.Raw(sql, pars).QueryRows(&items)
  74. return
  75. }
  76. func SaveUser(user *User, chartPermissionIds []int) (err error) {
  77. o := orm.NewOrm()
  78. err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
  79. insertId, er := txOrm.InsertOrUpdate(user)
  80. if er != nil {
  81. return er
  82. }
  83. if user.UserId != 0 {
  84. insertId = int64(user.UserId)
  85. } else {
  86. user.UserId = int(insertId)
  87. }
  88. // 先删除再增加
  89. sql := `DELETE FROM user_chart_permission_mapping WHERE user_id=?`
  90. _, er = txOrm.Raw(sql, insertId).Exec()
  91. if er != nil {
  92. return er
  93. }
  94. for _, id := range chartPermissionIds {
  95. userChartPermissionMapping := new(UserChartPermissionMapping)
  96. userChartPermissionMapping.UserId = int(insertId)
  97. userChartPermissionMapping.ChartPermissionId = id
  98. _, er = txOrm.Insert(userChartPermissionMapping)
  99. if er != nil {
  100. return er
  101. }
  102. }
  103. return nil
  104. })
  105. return
  106. }
  107. func GetUserByPhone(phone, areaCode string) (item *User, err error) {
  108. o := orm.NewOrm()
  109. sql := `SELECT * FROM user WHERE phone=? AND area_code=?`
  110. err = o.Raw(sql, phone, areaCode).QueryRow(&item)
  111. return
  112. }
  113. func GetUserByEmail(email string) (item *User, err error) {
  114. o := orm.NewOrm()
  115. sql := `SELECT * FROM user WHERE email=? `
  116. err = o.Raw(sql, email).QueryRow(&item)
  117. return
  118. }
  119. func GetUserById(userId int) (item *User, err error) {
  120. o := orm.NewOrm()
  121. sql := `SELECT * FROM user WHERE user_id=? `
  122. err = o.Raw(sql, userId).QueryRow(&item)
  123. return
  124. }
  125. func GetUserViewById(userId int) (item *UserView, err error) {
  126. o := orm.NewOrm()
  127. sql := `SELECT * FROM user WHERE user_id=? `
  128. err = o.Raw(sql, userId).QueryRow(&item)
  129. return
  130. }
  131. func GetUserList(condition string, pars []interface{}, startSize, pageSize int) (items []*UserView, err error) {
  132. sql := `SELECT u.*, su.sys_real_name AS seller_name FROM user AS u
  133. LEFT JOIN sys_user AS su
  134. ON u.seller_id = su.sys_user_id
  135. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) `
  136. if condition != "" {
  137. sql += condition
  138. }
  139. sql += ` ORDER BY modify_time DESC LIMIT ?,? `
  140. o := orm.NewOrm()
  141. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  142. return
  143. }
  144. func GetUserListByConditonSort(condition, sortConditon string, pars []interface{}, startSize, pageSize int) (items []*UserView, err error) {
  145. sql := `SELECT u.*, su.sys_real_name AS seller_name
  146. FROM user AS u
  147. LEFT JOIN sys_user AS su
  148. ON u.seller_id = su.sys_user_id
  149. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) `
  150. if condition != "" {
  151. sql += condition
  152. }
  153. if sortConditon != "" {
  154. sql += sortConditon
  155. }
  156. sql += ` LIMIT ?,? `
  157. o := orm.NewOrm()
  158. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  159. return
  160. }
  161. func GetPotentialUserCountByConditon(condition string, pars []interface{}) (count int, err error) {
  162. sql := `SELECT COUNT(DISTINCT u.user_id) AS count
  163. FROM user AS u
  164. LEFT JOIN user_read_record AS ur
  165. ON u.user_id = ur.user_id
  166. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) AND u.status=1`
  167. if condition != "" {
  168. sql += condition
  169. }
  170. o := orm.NewOrm()
  171. err = o.Raw(sql, pars).QueryRow(&count)
  172. return
  173. }
  174. func GetPotentialUserCountByConditonV2(condition string, pars []interface{}) (count int, err error) {
  175. sql := `SELECT COUNT(u.user_id) AS count
  176. FROM user AS u
  177. LEFT JOIN (
  178. SELECT user_id, MAX(create_time) AS create_time
  179. FROM user_read_record
  180. GROUP BY user_id
  181. ) AS ur
  182. ON u.user_id = ur.user_id
  183. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) AND u.status=1`
  184. if condition != "" {
  185. sql += condition
  186. }
  187. o := orm.NewOrm()
  188. err = o.Raw(sql, pars).QueryRow(&count)
  189. return
  190. }
  191. func GetPotentialUserIdsByConditonV2(condition string, pars []interface{}, sortConditon string, startSize, pageSize int) (items []*UserView, err error) {
  192. sql := `SELECT DISTINCT u.*, ur.read_cnt, ur.create_time AS last_update_time
  193. FROM user AS u
  194. LEFT JOIN (
  195. SELECT user_id, MAX(create_time) AS create_time, COUNT(user_id) AS read_cnt
  196. FROM user_read_record
  197. GROUP BY user_id
  198. ) AS ur
  199. ON u.user_id = ur.user_id
  200. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) AND u.status=1`
  201. if condition != "" {
  202. sql += condition
  203. }
  204. if sortConditon != "" {
  205. sql += sortConditon
  206. }
  207. sql += ` LIMIT ?,? `
  208. o := orm.NewOrm()
  209. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  210. return
  211. }
  212. func GetPotentialUserIdsByConditon(condition string, pars []interface{}) (userIds []string, err error) {
  213. sql := `SELECT DISTINCT u.user_id AS user_id
  214. FROM user AS u
  215. LEFT JOIN user_read_record AS ur
  216. ON u.user_id = ur.user_id
  217. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) AND u.status=1`
  218. if condition != "" {
  219. sql += condition
  220. }
  221. o := orm.NewOrm()
  222. _, err = o.Raw(sql, pars).QueryRows(&userIds)
  223. return
  224. }
  225. func GetPotentialUserListByConditonSort(userIds []string, sortConditon string, startSize, pageSize int) (items []*UserView, err error) {
  226. sql := `SELECT u.*, COUNT(ur.user_id) AS read_cnt, Max(ur.create_time) AS last_update_time
  227. FROM user AS u
  228. LEFT JOIN user_read_record AS ur
  229. ON u.user_id = ur.user_id
  230. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) AND u.status=1`
  231. if len(userIds) > 0 {
  232. sql += fmt.Sprintf(" AND u.user_id IN (%s)", strings.Join(userIds, ","))
  233. }
  234. sql += ` GROUP BY u.user_id`
  235. if sortConditon != "" {
  236. sql += sortConditon
  237. }
  238. sql += ` LIMIT ?,? `
  239. o := orm.NewOrm()
  240. _, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
  241. return
  242. }
  243. func GetUserReadList(condition, sortCondition string, pars []interface{}, startSize, pageSize int) (items []*UserView, err error) {
  244. sql := `SELECT u.*, su.sys_real_name AS seller_name, COUNT(ur.user_id) AS read_cnt, Max(ur.create_time) AS last_update_time
  245. FROM user AS u
  246. LEFT JOIN sys_user AS su
  247. ON u.seller_id = su.sys_user_id
  248. LEFT JOIN user_read_record AS ur
  249. ON u.user_id = ur.user_id
  250. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) `
  251. if condition != "" {
  252. sql += condition
  253. }
  254. sql += ` GROUP BY u.user_id `
  255. if sortCondition != "" {
  256. sql += sortCondition
  257. } else {
  258. sql += ` ORDER BY read_cnt DESC `
  259. }
  260. sql += ` LIMIT ?,? `
  261. o := orm.NewOrm()
  262. _, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
  263. return
  264. }
  265. func GetUserReadCount(condition string, pars []interface{}) (count int, err error) {
  266. sql := `SELECT COUNT(*) AS count
  267. FROM user AS u
  268. WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) `
  269. if condition != "" {
  270. sql += condition
  271. }
  272. o := orm.NewOrm()
  273. err = o.Raw(sql, pars...).QueryRow(&count)
  274. return
  275. }
  276. func GetUserCount(condition string, pars []interface{}) (count int, err error) {
  277. sql := `SELECT COUNT(*) AS count FROM user AS u WHERE 1=1 AND (u.phone IS NOT NULL OR u.email IS NOT NULL) `
  278. if condition != "" {
  279. sql += condition
  280. }
  281. o := orm.NewOrm()
  282. err = o.Raw(sql, pars...).QueryRow(&count)
  283. return
  284. }
  285. func DeleteUserById(userId int) (err error) {
  286. o := orm.NewOrm()
  287. err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
  288. sql := `DELETE FROM user WHERE user_id=?`
  289. _, e := txOrm.Raw(sql, userId).Exec()
  290. if e != nil {
  291. return e
  292. }
  293. sql = `DELETE FROM user_chart_permission_mapping WHERE user_id=?`
  294. _, e = txOrm.Raw(sql, userId).Exec()
  295. if e != nil {
  296. return e
  297. }
  298. return nil
  299. })
  300. return
  301. }
  302. func GetGlobalUserByCondition(userIds []int, sortCondition string, startSize, pageSize int) (items []*UserView, err error) {
  303. if len(userIds) == 0 {
  304. return
  305. }
  306. o := orm.NewOrm()
  307. sql := `SELECT u.*, COUNT(ur.user_id) AS read_cnt, MAX(ur.create_time) AS last_update_time
  308. FROM user AS u
  309. LEFT JOIN user_read_record AS ur
  310. ON u.user_id = ur.user_id AND ur.user_id IN (` + utils.GetOrmReplaceHolder(len(userIds)) + `)
  311. GROUP BY u.user_id ` + sortCondition + ` LIMIT ?,? `
  312. _, err = o.Raw(sql, userIds, startSize, pageSize).QueryRows(&items)
  313. return
  314. }