users.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_crm/models"
  5. "eta/eta_mini_crm/models/request"
  6. "eta/eta_mini_crm/models/response"
  7. "eta/eta_mini_crm/utils"
  8. "fmt"
  9. "github.com/rdlucklib/rdluck_tools/paging"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. // UsersController 用户
  15. type UsersController struct {
  16. BaseAuthController
  17. }
  18. // Add
  19. // @Title 新增用户
  20. // @Description 新增用户
  21. // @Param request body request.UsersAddReq true "type json string"
  22. // @Success 200 Ret=200 操作成功
  23. // @router /add [post]
  24. func (this *UsersController) Add() {
  25. br := new(models.BaseResponse).Init()
  26. defer func() {
  27. if br.ErrMsg == "" {
  28. br.IsSendEmail = false
  29. }
  30. this.Data["json"] = br
  31. this.ServeJSON()
  32. }()
  33. sysUser := this.SysUser
  34. if sysUser == nil {
  35. br.Msg = "请登录"
  36. br.ErrMsg = "请登录,SysUser Is Empty"
  37. br.Ret = 408
  38. return
  39. }
  40. var req request.UsersAddReq
  41. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  42. br.Msg = "参数解析异常"
  43. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  44. return
  45. }
  46. req.RealName = strings.TrimSpace(req.RealName)
  47. if req.RealName == "" {
  48. br.Msg = "请输入用户姓名"
  49. return
  50. }
  51. req.AreaCode = strings.TrimSpace(req.AreaCode)
  52. if req.AreaCode == "" {
  53. br.Msg = "请选择手机号区号"
  54. return
  55. }
  56. req.Mobile = strings.TrimSpace(req.Mobile)
  57. if req.Mobile == "" {
  58. br.Msg = "请输入手机号"
  59. return
  60. }
  61. if req.AreaCode == utils.AreaCodeMainland && !utils.ValidateMobileFormatat(req.Mobile) {
  62. br.Msg = "手机号格式有误"
  63. return
  64. }
  65. // 销售如果是空的那么创建人即为销售
  66. var (
  67. sellerId int
  68. sellerName, companyName string
  69. )
  70. if req.SellerId > 0 {
  71. sellerId = req.SellerId
  72. }
  73. if req.CompanyId > 0 {
  74. companyOb := new(models.Company)
  75. companyItem, e := companyOb.GetItemById(req.CompanyId)
  76. if e != nil {
  77. if e.Error() == utils.ErrNoRow() {
  78. br.Msg = "所选机构不存在,请刷新页面"
  79. return
  80. }
  81. br.Msg = "操作失败"
  82. br.ErrMsg = fmt.Sprintf("获取机构失败, %v", e)
  83. return
  84. }
  85. companyName = companyItem.CompanyName
  86. // 未传销售ID那么取机构销售
  87. if sellerId <= 0 {
  88. sellerId = companyItem.SellerId
  89. }
  90. }
  91. if sellerId > 0 {
  92. sellerItem, e := models.GetSysUserById(req.SellerId)
  93. if e != nil {
  94. if e.Error() == utils.ErrNoRow() {
  95. br.Msg = "所选营业部不存在,请刷新页面"
  96. return
  97. }
  98. br.Msg = "操作失败"
  99. br.ErrMsg = fmt.Sprintf("获取营业部销售失败, %v", e)
  100. return
  101. }
  102. sellerName = sellerItem.SysRealName
  103. }
  104. // 校验手机号是否存在
  105. usersOb := new(models.Users)
  106. {
  107. cond := fmt.Sprintf(` AND %s = ?`, usersOb.Cols().Mobile)
  108. pars := make([]interface{}, 0)
  109. pars = append(pars, req.Mobile)
  110. exist, e := usersOb.GetItemByCondition(cond, pars, "")
  111. if e != nil && e.Error() != utils.ErrNoRow() {
  112. br.Msg = "操作失败"
  113. br.ErrMsg = fmt.Sprintf("获取重复手机号失败, %v", e)
  114. return
  115. }
  116. if exist != nil && exist.UserId > 0 {
  117. br.Msg = "手机号已存在"
  118. return
  119. }
  120. }
  121. usersOb.RealName = req.RealName
  122. usersOb.Mobile = req.Mobile
  123. usersOb.AreaCode = req.AreaCode
  124. usersOb.SellerId = sellerId
  125. usersOb.SellerName = sellerName
  126. usersOb.SysUserId = sysUser.SysUserId
  127. usersOb.SysUserRealName = sysUser.SysRealName
  128. usersOb.CompanyId = req.CompanyId
  129. usersOb.CompanyName = companyName
  130. usersOb.Status = models.UserStatusFormal
  131. usersOb.AuthStatus = models.AuthStatusOpen
  132. usersOb.CreateTime = time.Now().Local()
  133. usersOb.ModifyTime = time.Now().Local()
  134. if e := usersOb.Create(); e != nil {
  135. br.Msg = "操作失败"
  136. br.ErrMsg = fmt.Sprintf("新增用户失败, %v", e)
  137. return
  138. }
  139. // 操作记录
  140. go func() {
  141. recordOb := new(models.CompanyUserOperateRecord)
  142. recordOb.UserId = usersOb.UserId
  143. recordOb.Remark = fmt.Sprintf("%s新增用户", sysUser.SysRealName)
  144. recordOb.SysUserId = sysUser.SysUserId
  145. recordOb.SysUserRealName = sysUser.SysRealName
  146. recordOb.CreateTime = time.Now().Local()
  147. if e := recordOb.Create(); e != nil {
  148. utils.FileLog.Info(fmt.Sprintf("新增操作记录失败, UserId: %d, ErrMsg: %v", usersOb.UserId, e))
  149. }
  150. }()
  151. br.Ret = 200
  152. br.Msg = "操作成功"
  153. br.Success = true
  154. }
  155. // Edit
  156. // @Title 编辑用户
  157. // @Description 编辑用户
  158. // @Param request body request.UsersEditReq true "type json string"
  159. // @Success 200 Ret=200 操作成功
  160. // @router /edit [post]
  161. func (this *UsersController) Edit() {
  162. br := new(models.BaseResponse).Init()
  163. defer func() {
  164. if br.ErrMsg == "" {
  165. br.IsSendEmail = false
  166. }
  167. this.Data["json"] = br
  168. this.ServeJSON()
  169. }()
  170. sysUser := this.SysUser
  171. if sysUser == nil {
  172. br.Msg = "请登录"
  173. br.ErrMsg = "请登录,SysUser Is Empty"
  174. br.Ret = 408
  175. return
  176. }
  177. var req request.UsersEditReq
  178. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  179. br.Msg = "参数解析异常"
  180. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  181. return
  182. }
  183. if req.UserId <= 0 {
  184. br.Msg = "参数有误"
  185. br.ErrMsg = fmt.Sprintf("参数有误, UserId: %d", req.UserId)
  186. return
  187. }
  188. req.RealName = strings.TrimSpace(req.RealName)
  189. if req.RealName == "" {
  190. br.Msg = "请输入用户姓名"
  191. return
  192. }
  193. req.AreaCode = strings.TrimSpace(req.AreaCode)
  194. if req.AreaCode == "" {
  195. br.Msg = "请选择手机号区号"
  196. return
  197. }
  198. req.Mobile = strings.TrimSpace(req.Mobile)
  199. if req.Mobile == "" {
  200. br.Msg = "请输入手机号"
  201. return
  202. }
  203. if req.AreaCode == utils.AreaCodeMainland && !utils.ValidateMobileFormatat(req.Mobile) {
  204. br.Msg = "手机号格式有误"
  205. return
  206. }
  207. // 销售如果是空的那么创建人即为销售
  208. var sellerName, companyName string
  209. if req.SellerId <= 0 {
  210. req.SellerId = sysUser.SysUserId
  211. sellerName = sysUser.SysRealName
  212. }
  213. if req.SellerId > 0 {
  214. sellerItem, e := models.GetSysUserById(req.SellerId)
  215. if e != nil {
  216. if e.Error() == utils.ErrNoRow() {
  217. br.Msg = "所选营业部不存在,请刷新页面"
  218. return
  219. }
  220. br.Msg = "操作失败"
  221. br.ErrMsg = fmt.Sprintf("获取营业部销售失败, %v", e)
  222. return
  223. }
  224. sellerName = sellerItem.SysRealName
  225. }
  226. if req.CompanyId > 0 {
  227. companyOb := new(models.Company)
  228. companyItem, e := companyOb.GetItemById(req.CompanyId)
  229. if e != nil {
  230. if e.Error() == utils.ErrNoRow() {
  231. br.Msg = "所选机构不存在,请刷新页面"
  232. return
  233. }
  234. br.Msg = "操作失败"
  235. br.ErrMsg = fmt.Sprintf("获取机构失败, %v", e)
  236. return
  237. }
  238. companyName = companyItem.CompanyName
  239. }
  240. usersOb := new(models.Users)
  241. userItem, e := usersOb.GetItemById(req.UserId)
  242. if e != nil {
  243. if e.Error() == utils.ErrNoRow() {
  244. br.Msg = "用户不存在,请刷新页面"
  245. return
  246. }
  247. br.Msg = "获取失败"
  248. br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
  249. return
  250. }
  251. // 校验手机号是否存在
  252. {
  253. cond := fmt.Sprintf(` AND %s = ? AND %s <> ?`, usersOb.Cols().Mobile, usersOb.Cols().PrimaryId)
  254. pars := make([]interface{}, 0)
  255. pars = append(pars, req.Mobile, req.UserId)
  256. exist, e := usersOb.GetItemByCondition(cond, pars, "")
  257. if e != nil && e.Error() != utils.ErrNoRow() {
  258. br.Msg = "操作失败"
  259. br.ErrMsg = fmt.Sprintf("获取重复手机号失败, %v", e)
  260. return
  261. }
  262. if exist != nil && exist.UserId > 0 {
  263. br.Msg = "手机号已存在"
  264. return
  265. }
  266. }
  267. updateCols := []string{usersOb.Cols().RealName, usersOb.Cols().Mobile, usersOb.Cols().AreaCode}
  268. userItem.RealName = req.RealName
  269. userItem.Mobile = req.Mobile
  270. userItem.AreaCode = req.AreaCode
  271. if req.SellerId > 0 {
  272. userItem.SellerId = req.SellerId
  273. userItem.SellerName = sellerName
  274. updateCols = append(updateCols, usersOb.Cols().SellerId, usersOb.Cols().SellerName)
  275. }
  276. if req.CompanyId > 0 {
  277. userItem.CompanyId = req.CompanyId
  278. userItem.CompanyName = companyName
  279. updateCols = append(updateCols, usersOb.Cols().CompanyId, usersOb.Cols().CompanyName)
  280. }
  281. userItem.ModifyTime = time.Now().Local()
  282. if e := userItem.Update(updateCols); e != nil {
  283. br.Msg = "操作失败"
  284. br.ErrMsg = fmt.Sprintf("编辑用户失败, %v", e)
  285. return
  286. }
  287. // 操作记录
  288. go func() {
  289. recordOb := new(models.CompanyUserOperateRecord)
  290. recordOb.UserId = userItem.UserId
  291. recordOb.Remark = fmt.Sprintf("%s编辑用户", sysUser.SysRealName)
  292. recordOb.SysUserId = sysUser.SysUserId
  293. recordOb.SysUserRealName = sysUser.SysRealName
  294. recordOb.CreateTime = time.Now().Local()
  295. if e := recordOb.Create(); e != nil {
  296. utils.FileLog.Info(fmt.Sprintf("新增操作记录失败, UserId: %d, ErrMsg: %v", userItem.UserId, e))
  297. }
  298. }()
  299. br.Ret = 200
  300. br.Msg = "操作成功"
  301. br.Success = true
  302. }
  303. // CheckAdd
  304. // @Title 新增用户校验
  305. // @Description 新增用户校验
  306. // @Param request body request.UsersAddReq true "type json string"
  307. // @Success 200 Ret=200 操作成功
  308. // @router /add/check [post]
  309. func (this *UsersController) CheckAdd() {
  310. br := new(models.BaseResponse).Init()
  311. defer func() {
  312. if br.ErrMsg == "" {
  313. br.IsSendEmail = false
  314. }
  315. this.Data["json"] = br
  316. this.ServeJSON()
  317. }()
  318. sysUser := this.SysUser
  319. if sysUser == nil {
  320. br.Msg = "请登录"
  321. br.ErrMsg = "请登录,SysUser Is Empty"
  322. br.Ret = 408
  323. return
  324. }
  325. var req request.UsersAddReq
  326. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  327. br.Msg = "参数解析异常"
  328. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  329. return
  330. }
  331. req.AreaCode = strings.TrimSpace(req.AreaCode)
  332. if req.AreaCode == "" {
  333. br.Msg = "请选择手机号区号"
  334. return
  335. }
  336. req.Mobile = strings.TrimSpace(req.Mobile)
  337. if req.Mobile == "" {
  338. br.Msg = "请输入手机号"
  339. return
  340. }
  341. if req.AreaCode == utils.AreaCodeMainland && !utils.ValidateMobileFormatat(req.Mobile) {
  342. br.Msg = "手机号格式有误"
  343. return
  344. }
  345. // 校验手机号是否存在,区分不同情况
  346. usersOb := new(models.Users)
  347. cond := fmt.Sprintf(` AND %s = ?`, usersOb.Cols().Mobile)
  348. pars := make([]interface{}, 0)
  349. pars = append(pars, req.Mobile)
  350. exist, e := usersOb.GetItemByCondition(cond, pars, "")
  351. if e != nil && e.Error() != utils.ErrNoRow() {
  352. br.Msg = "操作失败"
  353. br.ErrMsg = fmt.Sprintf("获取重复手机号失败, %v", e)
  354. return
  355. }
  356. resp := new(response.UsersAddCheckResp)
  357. resp.Tips = "校验通过"
  358. if exist != nil {
  359. // 试用客户
  360. if exist.Status == models.UserStatusTrial {
  361. resp.CheckResult = 1
  362. resp.Tips = "该客户已存在试用用户列表,是否确认将该用户移至当前客户下?"
  363. }
  364. // 个人投资者
  365. if exist.Status == models.UserStatusFormal && exist.CompanyId == 0 {
  366. resp.CheckResult = 2
  367. resp.Tips = "该用户已存在个人投资列表"
  368. }
  369. // 机构联系人
  370. if exist.Status == models.UserStatusFormal && exist.CompanyId > 0 {
  371. companyOb := new(models.Company)
  372. company, e := companyOb.GetItemById(exist.CompanyId)
  373. if e != nil {
  374. br.Msg = "操作失败"
  375. br.ErrMsg = fmt.Sprintf("获取联系人机构失败, %v", e)
  376. return
  377. }
  378. resp.CheckResult = 3
  379. resp.Tips = fmt.Sprintf("该用户已存在【%s】客户下", company.CompanyName)
  380. }
  381. }
  382. br.Data = resp
  383. br.Ret = 200
  384. br.Msg = "操作成功"
  385. br.Success = true
  386. }
  387. // Move
  388. // @Title 移动用户
  389. // @Description 移动用户
  390. // @Param request body request.UsersMoveReq true "type json string"
  391. // @Success 200 Ret=200 操作成功
  392. // @router /move [post]
  393. func (this *UsersController) Move() {
  394. br := new(models.BaseResponse).Init()
  395. defer func() {
  396. if br.ErrMsg == "" {
  397. br.IsSendEmail = false
  398. }
  399. this.Data["json"] = br
  400. this.ServeJSON()
  401. }()
  402. sysUser := this.SysUser
  403. if sysUser == nil {
  404. br.Msg = "请登录"
  405. br.ErrMsg = "请登录,SysUser Is Empty"
  406. br.Ret = 408
  407. return
  408. }
  409. var req request.UsersMoveReq
  410. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  411. br.Msg = "参数解析异常"
  412. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  413. return
  414. }
  415. if req.UserId <= 0 {
  416. br.Msg = "请选择用户"
  417. return
  418. }
  419. if req.CompanyId <= 0 {
  420. br.Msg = "请选择机构"
  421. return
  422. }
  423. usersOb := new(models.Users)
  424. userItem, e := usersOb.GetItemById(req.UserId)
  425. if e != nil {
  426. if e.Error() == utils.ErrNoRow() {
  427. br.Msg = "用户不存在,请刷新页面"
  428. return
  429. }
  430. br.Msg = "操作失败"
  431. br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
  432. return
  433. }
  434. companyOb := new(models.Company)
  435. companyItem, e := companyOb.GetItemById(req.CompanyId)
  436. if e != nil {
  437. if e.Error() == utils.ErrNoRow() {
  438. br.Msg = "机构不存在,请刷新页面"
  439. return
  440. }
  441. br.Msg = "操作失败"
  442. br.ErrMsg = fmt.Sprintf("获取机构失败, %v", e)
  443. return
  444. }
  445. userItem.CompanyId = req.CompanyId
  446. userItem.CompanyName = companyItem.CompanyName
  447. userItem.AuthStatus = companyItem.AuthStatus
  448. userItem.ModifyTime = time.Now().Local()
  449. updateCols := []string{usersOb.Cols().CompanyId, usersOb.Cols().CompanyName, usersOb.Cols().AuthStatus, usersOb.Cols().ModifyTime}
  450. if e = userItem.Update(updateCols); e != nil {
  451. br.Msg = "操作失败"
  452. br.ErrMsg = fmt.Sprintf("移动用户失败, %v", e)
  453. return
  454. }
  455. // 操作记录
  456. go func() {
  457. recordOb := new(models.CompanyUserOperateRecord)
  458. recordOb.UserId = userItem.UserId
  459. recordOb.Remark = fmt.Sprintf("%s移动用户至【%s】", sysUser.SysRealName, companyItem.CompanyName)
  460. recordOb.SysUserId = sysUser.SysUserId
  461. recordOb.SysUserRealName = sysUser.SysRealName
  462. recordOb.CreateTime = time.Now().Local()
  463. if e := recordOb.Create(); e != nil {
  464. utils.FileLog.Info(fmt.Sprintf("新增操作记录失败, UserId: %d, MoveCompanyId: %d, ErrMsg: %v", userItem.UserId, companyItem.CompanyId, e))
  465. }
  466. }()
  467. br.Ret = 200
  468. br.Msg = "操作成功"
  469. br.Success = true
  470. }
  471. // Remove
  472. // @Title 删除用户
  473. // @Description 删除用户
  474. // @Param request body request.UsersRemoveReq true "type json string"
  475. // @Success 200 Ret=200 操作成功
  476. // @router /remove [post]
  477. func (this *UsersController) Remove() {
  478. br := new(models.BaseResponse).Init()
  479. defer func() {
  480. if br.ErrMsg == "" {
  481. br.IsSendEmail = false
  482. }
  483. this.Data["json"] = br
  484. this.ServeJSON()
  485. }()
  486. sysUser := this.SysUser
  487. if sysUser == nil {
  488. br.Msg = "请登录"
  489. br.ErrMsg = "请登录,SysUser Is Empty"
  490. br.Ret = 408
  491. return
  492. }
  493. var req request.UsersRemoveReq
  494. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  495. br.Msg = "参数解析异常"
  496. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  497. return
  498. }
  499. if req.UserId <= 0 {
  500. br.Msg = "参数有误"
  501. br.ErrMsg = fmt.Sprintf("用户ID参数有误, UserId: %d", req.UserId)
  502. return
  503. }
  504. userOb := new(models.Users)
  505. usersItem, e := userOb.GetItemById(req.UserId)
  506. if e != nil {
  507. if e.Error() == utils.ErrNoRow() {
  508. br.Ret = 200
  509. br.Msg = "操作成功"
  510. br.Success = true
  511. return
  512. }
  513. br.Msg = "操作失败"
  514. br.ErrMsg = fmt.Sprintf("获取机构失败, %v", e)
  515. return
  516. }
  517. // 操作权限校验
  518. if sysUser.SysRoleId != utils.AdminRoleId {
  519. if sysUser.SysUserId != usersItem.SysUserId && sysUser.SysUserId != usersItem.SellerId {
  520. br.Msg = "无权操作"
  521. return
  522. }
  523. }
  524. // 删除用户并移除微信用户关联
  525. if e = userOb.RemoveUsersAndUserRecord(req.UserId); e != nil {
  526. br.Msg = "操作失败"
  527. br.ErrMsg = fmt.Sprintf("删除用户并移除微信用户关联失败, %v", e)
  528. return
  529. }
  530. // 操作记录
  531. go func() {
  532. recordOb := new(models.CompanyUserOperateRecord)
  533. recordOb.UserId = usersItem.UserId
  534. recordOb.Remark = fmt.Sprintf("%s删除用户", sysUser.SysRealName)
  535. recordOb.SysUserId = sysUser.SysUserId
  536. recordOb.SysUserRealName = sysUser.SysRealName
  537. recordOb.CreateTime = time.Now().Local()
  538. if e := recordOb.Create(); e != nil {
  539. utils.FileLog.Info(fmt.Sprintf("新增操作记录失败, UserId: %d, ErrMsg: %v", usersItem.UserId, e))
  540. }
  541. }()
  542. br.Ret = 200
  543. br.Msg = "操作成功"
  544. br.Success = true
  545. }
  546. // TransFormal
  547. // @Title 转正式
  548. // @Description 转正式
  549. // @Param request body request.UsersTransFormalReq true "type json string"
  550. // @Success 200 Ret=200 操作成功
  551. // @router /trans_formal [post]
  552. func (this *UsersController) TransFormal() {
  553. br := new(models.BaseResponse).Init()
  554. defer func() {
  555. if br.ErrMsg == "" {
  556. br.IsSendEmail = false
  557. }
  558. this.Data["json"] = br
  559. this.ServeJSON()
  560. }()
  561. sysUser := this.SysUser
  562. if sysUser == nil {
  563. br.Msg = "请登录"
  564. br.ErrMsg = "请登录,SysUser Is Empty"
  565. br.Ret = 408
  566. return
  567. }
  568. var req request.UsersTransFormalReq
  569. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  570. br.Msg = "参数解析异常"
  571. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  572. return
  573. }
  574. if req.UserId <= 0 {
  575. br.Msg = "参数有误"
  576. br.ErrMsg = fmt.Sprintf("用户ID有误, UserId: %d", req.UserId)
  577. return
  578. }
  579. req.RealName = strings.TrimSpace(req.RealName)
  580. if req.RealName == "" {
  581. br.Msg = "请输入用户姓名"
  582. return
  583. }
  584. // 用户校验
  585. usersOb := new(models.Users)
  586. userItem, e := usersOb.GetItemById(req.UserId)
  587. if e != nil {
  588. if e.Error() == utils.ErrNoRow() {
  589. br.Msg = "用户不存在,请刷新页面"
  590. return
  591. }
  592. br.Msg = "操作失败"
  593. br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
  594. return
  595. }
  596. if userItem.Status != models.UserStatusTrial {
  597. br.Msg = "该用户不是试用客户"
  598. return
  599. }
  600. // 用户类型
  601. var (
  602. companyId int
  603. companyName string
  604. authStatus int
  605. sellerId int
  606. sellerName string
  607. )
  608. switch req.UserType {
  609. case models.UserTypePerson:
  610. if req.SellerId <= 0 {
  611. br.Msg = "请选择营业部"
  612. return
  613. }
  614. authStatus = models.AuthStatusOpen
  615. seller, e := models.GetSysUserById(req.SellerId)
  616. if e != nil {
  617. if e.Error() == utils.ErrNoRow() {
  618. br.Msg = "销售不存在,请刷新页面后重试"
  619. return
  620. }
  621. br.Msg = "操作失败"
  622. br.ErrMsg = fmt.Sprintf("获取销售失败, %v", e)
  623. return
  624. }
  625. sellerId = req.SellerId
  626. sellerName = seller.SysRealName
  627. case models.UserTypeCompany:
  628. if req.CompanyId <= 0 {
  629. br.Msg = "请选择所属机构"
  630. return
  631. }
  632. companyOb := new(models.Company)
  633. companyItem, e := companyOb.GetItemById(req.CompanyId)
  634. if e != nil {
  635. if e.Error() == utils.ErrNoRow() {
  636. br.Msg = "所选机构不存在,请刷新页面"
  637. return
  638. }
  639. br.Msg = "操作失败"
  640. br.ErrMsg = fmt.Sprintf("获取机构失败, %v", e)
  641. return
  642. }
  643. companyId = companyItem.CompanyId
  644. companyName = companyItem.CompanyName
  645. authStatus = companyItem.AuthStatus
  646. sellerId = companyItem.SellerId
  647. sellerName = companyItem.SellerName
  648. default:
  649. br.Msg = "客户类型有误"
  650. br.ErrMsg = fmt.Sprintf("客户类型有误, UserType: %d", req.UserType)
  651. return
  652. }
  653. // 转正式
  654. userItem.RealName = req.RealName
  655. userItem.SellerId = sellerId
  656. userItem.SellerName = sellerName
  657. userItem.CompanyId = companyId
  658. userItem.CompanyName = companyName
  659. userItem.SysUserId = sysUser.SysUserId
  660. userItem.SysUserRealName = sysUser.SysRealName
  661. userItem.Status = models.UserStatusFormal
  662. userItem.AuthStatus = authStatus
  663. userItem.ModifyTime = time.Now().Local()
  664. updateCols := []string{
  665. usersOb.Cols().RealName, usersOb.Cols().SellerId, usersOb.Cols().SellerName, usersOb.Cols().CompanyId, usersOb.Cols().CompanyName,
  666. usersOb.Cols().SysUserId, usersOb.Cols().SysUserRealName, usersOb.Cols().Status, usersOb.Cols().AuthStatus, usersOb.Cols().ModifyTime,
  667. }
  668. if e := userItem.Update(updateCols); e != nil {
  669. br.Msg = "操作失败"
  670. br.ErrMsg = fmt.Sprintf("用户转正式失败, %v", e)
  671. return
  672. }
  673. // 操作记录
  674. go func() {
  675. recordOb := new(models.CompanyUserOperateRecord)
  676. recordOb.UserId = userItem.UserId
  677. recordOb.Remark = fmt.Sprintf("%s转正式", sysUser.SysRealName)
  678. recordOb.SysUserId = sysUser.SysUserId
  679. recordOb.SysUserRealName = sysUser.SysRealName
  680. recordOb.CreateTime = time.Now().Local()
  681. if e := recordOb.Create(); e != nil {
  682. utils.FileLog.Info(fmt.Sprintf("新增操作记录失败, UserId: %d, ErrMsg: %v", userItem.UserId, e))
  683. }
  684. }()
  685. br.Ret = 200
  686. br.Msg = "操作成功"
  687. br.Success = true
  688. }
  689. // Detail
  690. // @Title 用户详情
  691. // @Description 用户详情
  692. // @Param UserId query int true "用户ID"
  693. // @Success 200 {object} models.UsersItem
  694. // @router /detail [get]
  695. func (this *UsersController) Detail() {
  696. br := new(models.BaseResponse).Init()
  697. defer func() {
  698. if br.ErrMsg == "" {
  699. br.IsSendEmail = false
  700. }
  701. this.Data["json"] = br
  702. this.ServeJSON()
  703. }()
  704. sysUser := this.SysUser
  705. if sysUser == nil {
  706. br.Msg = "请登录"
  707. br.ErrMsg = "请登录,SysUser Is Empty"
  708. br.Ret = 408
  709. return
  710. }
  711. userId, _ := this.GetInt("UserId")
  712. if userId <= 0 {
  713. br.Msg = "参数有误"
  714. br.ErrMsg = fmt.Sprintf("参数有误, %d", userId)
  715. return
  716. }
  717. usersOb := new(models.Users)
  718. userItem, e := usersOb.GetItemById(userId)
  719. if e != nil {
  720. if e.Error() == utils.ErrNoRow() {
  721. br.Msg = "用户不存在,请刷新页面"
  722. return
  723. }
  724. br.Msg = "获取失败"
  725. br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
  726. return
  727. }
  728. resp := userItem.Format2Item()
  729. br.Data = resp
  730. br.Ret = 200
  731. br.Msg = "获取成功"
  732. br.Success = true
  733. }
  734. // PageList
  735. // @Title 用户列表-分页
  736. // @Description 用户列表-分页
  737. // @Param request body request.UsersListForm true "type json string"
  738. // @Success 200 {object} response.UsersPageListResp
  739. // @router /page_list [get]
  740. func (this *UsersController) PageList() {
  741. br := new(models.BaseResponse).Init()
  742. defer func() {
  743. if br.ErrMsg == "" {
  744. br.IsSendEmail = false
  745. }
  746. this.Data["json"] = br
  747. this.ServeJSON()
  748. }()
  749. sysUser := this.SysUser
  750. if sysUser == nil {
  751. br.Msg = "请登录"
  752. br.ErrMsg = "请登录,SysUser Is Empty"
  753. br.Ret = 408
  754. return
  755. }
  756. params := new(request.UsersListForm)
  757. if e := this.ParseForm(params); e != nil {
  758. br.Msg = "参数解析异常"
  759. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  760. return
  761. }
  762. resp := new(response.UsersPageListResp)
  763. usersOb := new(models.Users)
  764. // 仅超管/创建人/对应销售可见
  765. cond := ``
  766. pars := make([]interface{}, 0)
  767. if params.UserStatus != models.UserStatusTrial && params.CompanyId <= 0 && sysUser.SysRoleId != utils.AdminRoleId {
  768. cond += fmt.Sprintf(` AND (%s = ? OR %s = ?)`, usersOb.Cols().SysUserId, usersOb.Cols().SellerId)
  769. pars = append(pars, sysUser.SysUserId, sysUser.SysUserId)
  770. }
  771. // 筛选项
  772. {
  773. // 机构,默认为个人
  774. cond += fmt.Sprintf(` AND %s = ?`, usersOb.Cols().CompanyId)
  775. pars = append(pars, params.CompanyId)
  776. // 用户类型
  777. if params.UserStatus > 0 {
  778. if params.UserStatus != models.UserStatusTrial && params.UserStatus != models.UserStatusFormal {
  779. br.Msg = "用户类型有误"
  780. br.ErrMsg = fmt.Sprintf("参数用户类型有误, UserStatus: %d", params.UserStatus)
  781. return
  782. }
  783. cond += fmt.Sprintf(` AND %s = ?`, usersOb.Cols().Status)
  784. pars = append(pars, params.UserStatus)
  785. }
  786. // 关键词(联系人名称/联系人手机号)
  787. keywords := strings.TrimSpace(params.Keywords)
  788. if keywords != "" {
  789. kw := fmt.Sprint("%", keywords, "%")
  790. cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ?)`, usersOb.Cols().RealName, usersOb.Cols().Mobile)
  791. pars = append(pars, kw, kw)
  792. }
  793. // 营业部
  794. params.SellerIds = strings.TrimSpace(params.SellerIds)
  795. if params.SellerIds != "" {
  796. var sellerIds []int
  797. idArr := strings.Split(params.SellerIds, ",")
  798. for _, v := range idArr {
  799. id, _ := strconv.Atoi(v)
  800. if id > 0 {
  801. sellerIds = append(sellerIds, id)
  802. }
  803. }
  804. if len(sellerIds) == 0 {
  805. page := paging.GetPaging(params.CurrentIndex, params.PageSize, 0)
  806. resp.Paging = page
  807. resp.List = make([]*models.UsersItem, 0)
  808. br.Data = resp
  809. br.Ret = 200
  810. br.Msg = "获取成功"
  811. br.Success = true
  812. return
  813. }
  814. cond += fmt.Sprintf(` AND %s IN (%s)`, usersOb.Cols().SellerId, utils.GetOrmInReplace(len(sellerIds)))
  815. pars = append(pars, sellerIds)
  816. }
  817. // 创建时间区间
  818. params.StartTime = strings.TrimSpace(params.StartTime)
  819. params.EndTime = strings.TrimSpace(params.EndTime)
  820. if params.StartTime != "" && params.EndTime != "" {
  821. _, e := time.ParseInLocation(utils.FormatDate, params.StartTime, time.Local)
  822. if e != nil {
  823. br.Msg = "开始时间格式有误"
  824. return
  825. }
  826. _, e = time.ParseInLocation(utils.FormatDate, params.EndTime, time.Local)
  827. if e != nil {
  828. br.Msg = "结束时间格式有误"
  829. return
  830. }
  831. cond += fmt.Sprintf(` AND (%s BETWEEN ? AND ?)`, usersOb.Cols().CreateTime)
  832. pars = append(pars, fmt.Sprintf("%s 00:00:00", params.StartTime), fmt.Sprintf("%s 23:59:59", params.EndTime))
  833. }
  834. }
  835. // 分页
  836. var startSize int
  837. if params.PageSize <= 0 {
  838. params.PageSize = utils.PageSize20
  839. }
  840. if params.CurrentIndex <= 0 {
  841. params.CurrentIndex = 1
  842. }
  843. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  844. // 排序
  845. orderRule := fmt.Sprintf(`%s DESC`, usersOb.Cols().CreateTime)
  846. if params.SortField > 0 && params.SortRule > 0 {
  847. fieldMap := map[int]string{
  848. 1: usersOb.Cols().CreateTime, 2: usersOb.Cols().RegisterTime, 3: usersOb.Cols().LastReadTime, 4: usersOb.Cols().ReadTimes,
  849. }
  850. ruleMap := map[int]string{1: "ASC", 2: "DESC"}
  851. if fieldMap[params.SortField] != "" && ruleMap[params.SortRule] != "" {
  852. orderRule = fmt.Sprintf("%s %s", fieldMap[params.SortField], ruleMap[params.SortRule])
  853. }
  854. }
  855. total, e := usersOb.GetCountByCondition(cond, pars)
  856. if e != nil {
  857. br.Msg = "获取失败"
  858. br.ErrMsg = fmt.Sprintf("获取用户总数失败, %v", e)
  859. return
  860. }
  861. list, e := usersOb.GetPageItemsByCondition(cond, pars, []string{}, orderRule, startSize, params.PageSize)
  862. if e != nil {
  863. br.Msg = "获取失败"
  864. br.ErrMsg = fmt.Sprintf("获取用户分页列表失败, %v", e)
  865. return
  866. }
  867. respList := make([]*models.UsersItem, 0)
  868. for _, v := range list {
  869. respList = append(respList, v.Format2Item())
  870. }
  871. page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  872. resp.Paging = page
  873. resp.List = respList
  874. br.Data = resp
  875. br.Ret = 200
  876. br.Msg = "获取成功"
  877. br.Success = true
  878. }
  879. // Search
  880. // @Title 用户列表-搜索
  881. // @Description 用户列表-搜索
  882. // @Param request body request.UsersListForm true "type json string"
  883. // @Success 200 {object} response.UsersPageListResp
  884. // @router /search [get]
  885. func (this *UsersController) Search() {
  886. br := new(models.BaseResponse).Init()
  887. defer func() {
  888. if br.ErrMsg == "" {
  889. br.IsSendEmail = false
  890. }
  891. this.Data["json"] = br
  892. this.ServeJSON()
  893. }()
  894. sysUser := this.SysUser
  895. if sysUser == nil {
  896. br.Msg = "请登录"
  897. br.ErrMsg = "请登录,SysUser Is Empty"
  898. br.Ret = 408
  899. return
  900. }
  901. params := new(request.UsersListForm)
  902. if e := this.ParseForm(params); e != nil {
  903. br.Msg = "参数解析异常"
  904. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  905. return
  906. }
  907. // 用户检索,所有人可见
  908. resp := new(response.UsersPageListResp)
  909. usersOb := new(models.Users)
  910. cond := ``
  911. pars := make([]interface{}, 0)
  912. // 关键词(机构名称/联系人名称/联系人手机号)
  913. keywords := strings.TrimSpace(params.Keywords)
  914. if keywords != "" {
  915. kw := fmt.Sprint("%", keywords, "%")
  916. cond += fmt.Sprintf(` AND (%s LIKE ? OR %s LIKE ? OR %s LIKE ?)`, usersOb.Cols().CompanyName, usersOb.Cols().RealName, usersOb.Cols().Mobile)
  917. pars = append(pars, kw, kw, kw)
  918. }
  919. // 分页
  920. var startSize int
  921. if params.PageSize <= 0 {
  922. params.PageSize = utils.PageSize20
  923. }
  924. if params.CurrentIndex <= 0 {
  925. params.CurrentIndex = 1
  926. }
  927. startSize = utils.StartIndex(params.CurrentIndex, params.PageSize)
  928. total, e := usersOb.GetCountByCondition(cond, pars)
  929. if e != nil {
  930. br.Msg = "获取失败"
  931. br.ErrMsg = fmt.Sprintf("获取用户总数失败, %v", e)
  932. return
  933. }
  934. list, e := usersOb.GetPageItemsByCondition(cond, pars, []string{}, "", startSize, params.PageSize)
  935. if e != nil {
  936. br.Msg = "获取失败"
  937. br.ErrMsg = fmt.Sprintf("获取用户分页列表失败, %v", e)
  938. return
  939. }
  940. respList := make([]*models.UsersItem, 0)
  941. for _, v := range list {
  942. respList = append(respList, v.Format2Item())
  943. }
  944. page := paging.GetPaging(params.CurrentIndex, params.PageSize, total)
  945. resp.Paging = page
  946. resp.List = respList
  947. br.Data = resp
  948. br.Ret = 200
  949. br.Msg = "获取成功"
  950. br.Success = true
  951. }
  952. // OperateRecords
  953. // @Title 用户-操作记录
  954. // @Description 用户列表-操作记录
  955. // @Param UserId query int true "用户ID"
  956. // @Success 200 {object} models.CompanyUserOperateRecordItem
  957. // @router /operate_records [get]
  958. func (this *UsersController) OperateRecords() {
  959. br := new(models.BaseResponse).Init()
  960. defer func() {
  961. if br.ErrMsg == "" {
  962. br.IsSendEmail = false
  963. }
  964. this.Data["json"] = br
  965. this.ServeJSON()
  966. }()
  967. sysUser := this.SysUser
  968. if sysUser == nil {
  969. br.Msg = "请登录"
  970. br.ErrMsg = "请登录,SysUser Is Empty"
  971. br.Ret = 408
  972. return
  973. }
  974. userId, _ := this.GetInt("UserId")
  975. if userId <= 0 {
  976. br.Msg = "参数有误"
  977. br.ErrMsg = fmt.Sprintf("参数有误, %d", userId)
  978. return
  979. }
  980. resp := make([]*models.CompanyUserOperateRecordItem, 0)
  981. recordOb := new(models.CompanyUserOperateRecord)
  982. cond := fmt.Sprintf(` AND %s = ?`, recordOb.Cols().UserId)
  983. pars := make([]interface{}, 0)
  984. pars = append(pars, userId)
  985. list, e := recordOb.GetItemsByCondition(cond, pars, []string{}, "")
  986. if e != nil {
  987. br.Msg = "获取失败"
  988. br.ErrMsg = fmt.Sprintf("获取操作记录列表失败, %v", e)
  989. return
  990. }
  991. for _, v := range list {
  992. resp = append(resp, v.Format2Item())
  993. }
  994. br.Data = resp
  995. br.Ret = 200
  996. br.Msg = "获取成功"
  997. br.Success = true
  998. }
  999. // TransAuth
  1000. // @Title 切换阅读权限
  1001. // @Description 切换阅读权限
  1002. // @Param request body request.UsersTransAuthReq true "type json string"
  1003. // @Success 200 Ret=200 操作成功
  1004. // @router /trans_auth [post]
  1005. func (this *UsersController) TransAuth() {
  1006. br := new(models.BaseResponse).Init()
  1007. defer func() {
  1008. if br.ErrMsg == "" {
  1009. br.IsSendEmail = false
  1010. }
  1011. this.Data["json"] = br
  1012. this.ServeJSON()
  1013. }()
  1014. sysUser := this.SysUser
  1015. if sysUser == nil {
  1016. br.Msg = "请登录"
  1017. br.ErrMsg = "请登录,SysUser Is Empty"
  1018. br.Ret = 408
  1019. return
  1020. }
  1021. var req request.UsersTransAuthReq
  1022. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  1023. br.Msg = "参数解析异常"
  1024. br.ErrMsg = fmt.Sprintf("参数解析异常, %v", e)
  1025. return
  1026. }
  1027. if req.UserId <= 0 {
  1028. br.Msg = "参数有误"
  1029. br.ErrMsg = fmt.Sprintf("参数有误, UserId: %d", req.UserId)
  1030. return
  1031. }
  1032. usersOb := new(models.Users)
  1033. usersItem, e := usersOb.GetItemById(req.UserId)
  1034. if e != nil {
  1035. if e.Error() == utils.ErrNoRow() {
  1036. br.Ret = 200
  1037. br.Msg = "操作成功"
  1038. br.Success = true
  1039. return
  1040. }
  1041. br.Msg = "操作失败"
  1042. br.ErrMsg = fmt.Sprintf("获取用户失败, %v", e)
  1043. return
  1044. }
  1045. // 操作权限校验
  1046. if sysUser.SysRoleId != utils.AdminRoleId {
  1047. if sysUser.SysUserId != usersItem.SysUserId && sysUser.SysUserId != usersItem.SellerId {
  1048. br.Msg = "无权操作"
  1049. return
  1050. }
  1051. }
  1052. transMapping := map[int]int{models.AuthStatusClose: models.AuthStatusOpen, models.AuthStatusOpen: models.AuthStatusClose}
  1053. optRemarkMapping := map[int]string{models.AuthStatusClose: "关闭", models.AuthStatusOpen: "开启"}
  1054. usersItem.AuthStatus = transMapping[usersItem.AuthStatus]
  1055. usersItem.ModifyTime = time.Now().Local()
  1056. updateCols := []string{usersOb.Cols().AuthStatus, usersOb.Cols().ModifyTime}
  1057. if e = usersItem.Update(updateCols); e != nil {
  1058. br.Msg = "操作失败"
  1059. br.ErrMsg = fmt.Sprintf("切换用户阅读权限失败, %v", e)
  1060. return
  1061. }
  1062. // 操作记录
  1063. go func() {
  1064. recordOb := new(models.CompanyUserOperateRecord)
  1065. recordOb.UserId = usersItem.UserId
  1066. recordOb.Remark = fmt.Sprintf("%s%s用户权限", sysUser.SysRealName, optRemarkMapping[usersItem.AuthStatus])
  1067. recordOb.SysUserId = sysUser.SysUserId
  1068. recordOb.SysUserRealName = sysUser.SysRealName
  1069. recordOb.CreateTime = time.Now().Local()
  1070. if e := recordOb.Create(); e != nil {
  1071. utils.FileLog.Info(fmt.Sprintf("新增操作记录失败, UserId: %d, ErrMsg: %v", usersItem.UserId, e))
  1072. }
  1073. }()
  1074. br.Ret = 200
  1075. br.Msg = "操作成功"
  1076. br.Success = true
  1077. }