user.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/beego/beego/v2/client/orm"
  7. "hongze/hz_crm_api/models"
  8. "hongze/hz_crm_api/models/company"
  9. "hongze/hz_crm_api/models/company_user"
  10. "hongze/hz_crm_api/models/cygx"
  11. "hongze/hz_crm_api/models/system"
  12. "hongze/hz_crm_api/models/yb"
  13. "hongze/hz_crm_api/services/alarm_msg"
  14. "hongze/hz_crm_api/utils"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. // 移动潜在客户名下的联系人
  20. func MovePotentialUser(userId, companyId int, realName, mobile, email, remark string, companyProductList []*company.CompanyProduct, wxUser *models.WxUser, updateWxCol []string) (err error) {
  21. wxUser.CompanyId = companyId
  22. wxUser.Remark = remark
  23. wxUser.LastUpdatedTime = time.Now()
  24. updateWxCol = append(updateWxCol, "CompanyId", "Remark", "LastUpdatedTime")
  25. err = wxUser.Update(updateWxCol)
  26. if err != nil {
  27. return
  28. }
  29. //删除原有的销售关系
  30. _ = models.DeleteUserSellerRelationByUserId(userId)
  31. //添加新的联系人与销售员的关系
  32. if companyProductList != nil && len(companyProductList) > 0 {
  33. for _, companyProduct := range companyProductList {
  34. _, tmpErr := models.AddUserSellerRelation(int64(userId), companyProduct.CompanyId, companyProduct.SellerId, companyProduct.ProductId, companyProduct.SellerName, mobile, email)
  35. if tmpErr != nil {
  36. utils.FileLog.Info("添加销售与联系人的关系失败,错误原因:,其他信息:user_id:%s;seller_id:%s;product_id:%s", tmpErr.Error(), userId, companyProduct.SellerId, companyProduct.ProductId)
  37. }
  38. }
  39. }
  40. // 若联系人有图表权限则清除
  41. _ = company_user.ClearUserChartPermission(userId)
  42. return
  43. }
  44. // 移动销售名下的联系人
  45. func MoveUser(userId, companyId, sellerId int, wxUser *models.WxUser, adminId int) (err error) {
  46. productId := 1
  47. var toSellerInfo *system.Admin
  48. //有选择销售的情况下(正常来说就是不是移动到潜在客户中去的情况下)
  49. if sellerId > 0 {
  50. //获取新的销售信息
  51. tmpSellerInfo, queryErr := system.GetSysAdminById(sellerId)
  52. if queryErr != nil {
  53. err = errors.New("获取即将移动的销售信息失败,Err:" + queryErr.Error())
  54. return
  55. }
  56. companyProduct, tmpErr := company.GetCompanyProductByCompanyIdAndSellerId(companyId, sellerId)
  57. if tmpErr != nil {
  58. err = errors.New("获取即将移动的销售与客户信息失败,err:" + tmpErr.Error())
  59. return
  60. }
  61. productId = companyProduct.ProductId
  62. //productId = GetProductId(tmpSellerInfo.RoleTypeCode)
  63. //if productId == 0 {
  64. // err = errors.New("销售信息异常")
  65. // return
  66. //}
  67. toSellerInfo = tmpSellerInfo
  68. }
  69. //将联系人挪移到 对应的 企业客户 下面
  70. err = models.MoveUser(userId, companyId)
  71. if err != nil {
  72. return
  73. }
  74. //删除联系人与原有的销售关系
  75. _ = models.DeleteUserSellerRelationByUserId(userId)
  76. //不是挪到潜在客户的话,那么就不需要重新 添加新的联系人与销售员的关系(正常来说就是不是移动到潜在客户中去的情况下)
  77. if toSellerInfo != nil {
  78. //添加新的联系人与销售员的关系
  79. _, tmpErr := models.AddUserSellerRelation(int64(userId), companyId, sellerId, productId, toSellerInfo.AdminName, wxUser.Mobile, wxUser.Email)
  80. if tmpErr != nil {
  81. utils.FileLog.Info("添加销售与联系人的关系失败,错误原因:,其他信息:user_id:%s;seller_id:%s;product_id:%s", tmpErr.Error(), userId, sellerId, productId)
  82. }
  83. }
  84. // 若联系人有图表权限则清除
  85. _ = company_user.ClearUserChartPermission(userId)
  86. // 若联系人发起过ficc申请则标记为已处理,已移动
  87. _ = DealFiccApply(userId, adminId)
  88. return
  89. }
  90. // 删除微信用户
  91. func DeleteWxUser(userId int) (err error) {
  92. //删除用户与第三方(微信用户)的关系
  93. err = models.DelUserRecordByUserId(userId)
  94. if err != nil {
  95. return
  96. }
  97. //删除用户
  98. err = company.DeleteCompanyUser(userId)
  99. // 若联系人有图表权限则清除
  100. _ = company_user.ClearUserChartPermission(userId)
  101. return
  102. }
  103. // 删除微信用户
  104. func DeleteCompanyWxUserByProductId(companyId, productId int) (list []*models.UserSellerRelation, userRecordList []*models.UserRecord, wxUserList []*models.WxUser, chartClassifyPermission []*company_user.ChartClassifyPermission, err error) {
  105. //productId = 1
  106. //获取当前产品 的 所有联系人
  107. list, err = models.GetCompanyUserSellerRelationByProductId(companyId, productId)
  108. //只删除自己的联系人(如果该联系人是共享,那么也不删除)
  109. //fmt.Println(list)
  110. //获取不是当前产品的所有联系人
  111. notList, err := models.GetNotCompanyUserSellerRelationByProductId(companyId, productId)
  112. //fmt.Println(notList)
  113. //不是当前产品的所有联系人map,真正删除的时候,用来做判断是否存在该联系人
  114. wxUserMap := make(map[int]int)
  115. for _, wxUser := range notList {
  116. wxUserMap[wxUser.UserId] = 1
  117. }
  118. //fmt.Println(wxUserMap)
  119. userIdSlice := make([]string, 0)
  120. for _, wxUser := range list {
  121. //_, ok := wxUserMap[wxUser.UserId]
  122. //fmt.Println(wxUser.UserId, "===:", ok)
  123. if _, ok := wxUserMap[wxUser.UserId]; ok == false {
  124. userIdSlice = append(userIdSlice, strconv.Itoa(wxUser.UserId))
  125. }
  126. }
  127. //fmt.Println(userIdSlice)
  128. //删除用户与销售员的关系
  129. err = models.DelCompanyUserSellerRelationByProductId(companyId, productId)
  130. if err != nil {
  131. return
  132. }
  133. if len(userIdSlice) > 0 {
  134. userIdStr := strings.Join(userIdSlice, ",")
  135. //根据用户id字符串获取用户与第三方(微信用户)的关系列表
  136. userRecordList, err = models.GetUserRecordListByUserIds(userIdStr)
  137. if err != nil {
  138. return
  139. }
  140. //删除用户与第三方(微信用户)的关系
  141. err = models.DelUserRecordByUserIds(userIdStr)
  142. if err != nil {
  143. return
  144. }
  145. //删除用户
  146. wxUserList, err = models.GetWxUserListByUserIds(userIdStr)
  147. if err != nil {
  148. return
  149. }
  150. //删除用户
  151. err = models.DeleteWxUserByUserIds(userIdStr)
  152. // 清除客户联系人图表权限设置
  153. chartClassifyPermission, err = company_user.GetCompanyChartPermissionByCompanyId(companyId)
  154. if err != nil {
  155. return
  156. }
  157. _ = company_user.ClearCompanyChartPermission(companyId)
  158. }
  159. return
  160. }
  161. // 根绝客户id获取客户下面的联系人数量
  162. func GetUserCountByCompanyId(companyId, productId int) (total int, err error) {
  163. var condition string
  164. var pars []interface{}
  165. if productId > 0 {
  166. condition += ` AND a.company_id = ? AND b.company_id = ? AND b.product_id = ? `
  167. pars = append(pars, companyId, companyId, productId)
  168. tmpTotal, tmpErr := company.GetCompanyUserListCountV2(condition, pars, companyId)
  169. total = tmpTotal
  170. err = tmpErr
  171. } else {
  172. tmpTotal, tmpErr := company.GetCompanyUserCount(companyId)
  173. total = tmpTotal
  174. err = tmpErr
  175. }
  176. return
  177. }
  178. // DealPotentialUser 标记潜在用户
  179. func DealPotentialUser(userId, sysUserId int) (err error) {
  180. o := orm.NewOrm()
  181. to, err := o.Begin()
  182. if err != nil {
  183. return
  184. }
  185. defer func() {
  186. if err != nil {
  187. _ = to.Rollback()
  188. } else {
  189. _ = to.Commit()
  190. }
  191. }()
  192. // 1.标记用户表
  193. wxUser, err := models.GetWxUserByUserId(userId)
  194. if err != nil {
  195. if err.Error() == utils.ErrNoRow() {
  196. err = errors.New(fmt.Sprint("用户不存在", err))
  197. return
  198. }
  199. return
  200. }
  201. if wxUser.IsDeal != 0 {
  202. err = errors.New(fmt.Sprint("用户标记状态有误", err))
  203. return
  204. }
  205. nowTime := time.Now()
  206. wxUser.IsDeal = 1
  207. wxUser.LastUpdatedTime = nowTime
  208. userUpdateCols := make([]string, 0)
  209. userUpdateCols = append(userUpdateCols, "IsDeal", "LastUpdatedTime")
  210. err = wxUser.Update(userUpdateCols)
  211. // 2.标记申请记录表中所有该用户的申请
  212. err = yb.DealUserApplyRecords(userId, sysUserId, nowTime)
  213. return
  214. }
  215. // MovePotentialUserByApplyRecord 通过FICC申请单移动客户
  216. func MovePotentialUserByApplyRecord(adminId, userId, companyId, applyRecordId int, realName, mobile, email, remark string, companyProductList []*company.CompanyProduct, wxUser *models.WxUser, updateWxCol []string) (err error) {
  217. o := orm.NewOrm()
  218. to, err := o.Begin()
  219. if err != nil {
  220. return
  221. }
  222. defer func() {
  223. if err != nil {
  224. _ = to.Rollback()
  225. } else {
  226. _ = to.Commit()
  227. }
  228. }()
  229. // 移动潜在客户
  230. err = MovePotentialUser(userId, companyId, realName, mobile, email, remark, companyProductList, wxUser, updateWxCol)
  231. if err != nil {
  232. return
  233. }
  234. // 标记FICC申请单为已移动
  235. if applyRecordId > 0 {
  236. applyRecord, tErr := yb.GetApplyRecordById(applyRecordId)
  237. if tErr != nil {
  238. if tErr.Error() == utils.ErrNoRow() {
  239. err = errors.New(fmt.Sprint("申请记录不存在:", err))
  240. }
  241. err = tErr
  242. return
  243. }
  244. updateCols := make([]string, 0)
  245. applyRecord.IsMove = 1
  246. updateCols = append(updateCols, "IsMove")
  247. if applyRecord.OpStatus == 0 {
  248. applyRecord.OpStatus = 1
  249. applyRecord.DealTime = time.Now()
  250. applyRecord.SysUserId = adminId
  251. updateCols = append(updateCols, "OpStatus", "DealTime", "SysUserId")
  252. }
  253. err = applyRecord.Update(updateCols)
  254. if err != nil {
  255. err = errors.New(fmt.Sprint("标记申请单失败", err))
  256. return
  257. }
  258. }
  259. return
  260. }
  261. // SwitchHzUserEnabledByMobile 根据手机号启用/禁用弘则研究下的联系人
  262. func SwitchHzUserEnabledByMobile(opEnabled int, mobile string) (err error) {
  263. if mobile == "" {
  264. return
  265. }
  266. userInfo, err := models.GetWxUserByMobile(mobile)
  267. if err != nil && err.Error() != utils.ErrNoRow() {
  268. return
  269. }
  270. // 存在相应联系人
  271. if userInfo != nil {
  272. // 禁用-联系人为弘则研究下的则设置为潜在用户
  273. updateCols := make([]string, 0)
  274. if opEnabled == 0 && userInfo.CompanyId == 16 {
  275. userInfo.CompanyId = 1
  276. userInfo.LastUpdatedTime = time.Now()
  277. updateCols = append(updateCols, "CompanyId", "LastUpdatedTime")
  278. _ = userInfo.Update(updateCols)
  279. }
  280. // 启用-联系人为潜在用户则设置为弘则研究下
  281. if opEnabled == 1 && userInfo.CompanyId == 1 {
  282. userInfo.CompanyId = 16
  283. userInfo.LastUpdatedTime = time.Now()
  284. updateCols = append(updateCols, "CompanyId", "LastUpdatedTime")
  285. _ = userInfo.Update(updateCols)
  286. }
  287. }
  288. return nil
  289. }
  290. // DeleteHzUserByMobile 根据手机号删除弘则研究下的联系人
  291. func DeleteHzUserByMobile(mobile string) (err error) {
  292. if mobile == "" {
  293. return
  294. }
  295. companyId := 16
  296. userInfo, err := models.GetWxUserByCompanyIdAndMobile(companyId, mobile)
  297. if err != nil && err.Error() != utils.ErrNoRow() {
  298. return
  299. }
  300. if userInfo != nil {
  301. userId := int(userInfo.UserId)
  302. if err = models.DeleteWxUserAndRecordByUserId(userId); err != nil {
  303. return
  304. }
  305. // 删除所有的标识,并真正删除数据
  306. _ = models.DeleteUserSellerRelationByProductId(userId, 1)
  307. _ = models.DeleteUserSellerRelationByProductId(userId, 2)
  308. // 更新客户最近阅读次数以及最近阅读时间
  309. go ModifyCompanyProductLastViewData([]int{userInfo.CompanyId})
  310. }
  311. return nil
  312. }
  313. // ForbiddenSysUserByMobile 根据手机号禁用联系人关联的系统管理员
  314. func ForbiddenSysUserByMobile(mobile string) (err error) {
  315. if mobile == "" {
  316. return
  317. }
  318. adminInfo, _ := system.GetSysUserByMobile(mobile)
  319. if adminInfo == nil {
  320. return
  321. }
  322. // 禁用管理员
  323. if err = system.DisableAdmin(adminInfo.AdminId); err != nil {
  324. return
  325. }
  326. return
  327. }
  328. // DealFiccApply 用户一旦被移动将未被标记处理的用户都标记成已处理
  329. func DealFiccApply(userId, sysUserId int) (err error) {
  330. //更新申请为标记处理
  331. nowTime := time.Now()
  332. err = yb.DealUnDealFiccApplyByIds(userId, sysUserId, nowTime)
  333. return
  334. }
  335. // AddHzCompanyUser 新增弘则联系人
  336. func AddHzCompanyUser(mobile, realName string, adminId int, adminName string) {
  337. var err error
  338. defer func() {
  339. if err != nil {
  340. go alarm_msg.SendAlarmMsg("自动添加弘则联系人失败, Err: "+err.Error(), 3)
  341. }
  342. }()
  343. mobile = utils.TrimStr(mobile)
  344. realName = utils.TrimStr(realName)
  345. if mobile == "" || realName == "" {
  346. return
  347. }
  348. // 设置3分钟缓存, 不允许重复添加, 添加完成删除对应的缓存
  349. cacheKey := "wx_user:mobile:" + mobile
  350. isHas := utils.Rc.IsExist(cacheKey)
  351. if isHas == true {
  352. return
  353. }
  354. utils.Rc.SetNX(cacheKey, 1, time.Second*300)
  355. defer func() {
  356. _ = utils.Rc.Delete(cacheKey)
  357. }()
  358. // 此处简化操作, 但凡能查出手机号对应的联系人, 不管是否为弘则研究均直接返回, 手动加联系人
  359. userItem, e := company.GetUserCountByMobile(mobile)
  360. if e != nil && e.Error() != utils.ErrNoRow() {
  361. err = errors.New("获取手机号对应联系人失败, Err: " + e.Error())
  362. return
  363. }
  364. if userItem != nil {
  365. return
  366. }
  367. // 新增用户
  368. companyId := utils.HZ_COMPANY_ID
  369. newUser := &models.WxUser{
  370. RealName: realName,
  371. Sex: 1, // 默认1-男
  372. CountryCode: utils.DEFAULT_COUNTRY_CODE,
  373. Mobile: mobile,
  374. OutboundCountryCode: utils.DEFAULT_COUNTRY_CODE,
  375. IsMaker: 0,
  376. CompanyId: companyId,
  377. CreatedTime: time.Now().Local(),
  378. RegisterPlatform: utils.WX_USER_REGISTER_PLATFORM_ADMIN,
  379. }
  380. userId, e := models.AddWxUser(newUser)
  381. if e != nil {
  382. err = errors.New("新增弘则联系人失败, Err: " + e.Error())
  383. return
  384. }
  385. newUser.UserId = userId
  386. // 弘则联系人两种产品都有
  387. productList := make([]*company.CompanyProduct, 0)
  388. ficcProduct, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, 1)
  389. if e != nil && e.Error() != utils.ErrNoRow() {
  390. err = errors.New("获取弘则FICC产品失败, Err: " + e.Error())
  391. return
  392. }
  393. if ficcProduct != nil {
  394. productList = append(productList, ficcProduct)
  395. }
  396. equityProduct, e := company.GetCompanyProductByCompanyIdAndProductId(companyId, 2)
  397. if e != nil && e.Error() != utils.ErrNoRow() {
  398. err = errors.New("获取弘则权益产品失败, Err: " + e.Error())
  399. return
  400. }
  401. if equityProduct != nil {
  402. productList = append(productList, equityProduct)
  403. }
  404. // 将联系人与销售员绑定
  405. for _, p := range productList {
  406. if _, e = models.AddUserSellerRelation(userId, p.CompanyId, p.SellerId, p.ProductId, p.SellerName, mobile, ""); e != nil {
  407. err = errors.New(fmt.Sprintf("新增弘则联系人与销售关系失败, ProductId: %d, Err: %s", p.ProductId, e.Error()))
  408. return
  409. }
  410. }
  411. // 记录新增用户日志
  412. userJson, _ := json.Marshal(newUser)
  413. go AddWxUserOpLog(company.WxUserOpLog{
  414. LogType: "add",
  415. UserId: int(newUser.UserId),
  416. CompanyId: newUser.CompanyId,
  417. Mobile: newUser.Mobile,
  418. Email: newUser.Email,
  419. OriginalUserInfo: "",
  420. UserInfo: string(userJson),
  421. OriginalUserSellerInfo: "",
  422. UserSellerInfo: "",
  423. OpUserId: adminId,
  424. OpUserName: adminName,
  425. CreateTime: time.Now(),
  426. })
  427. return
  428. }
  429. // GetRaiUserStatus 新增弘则联系人
  430. func GetRaiUserStatus(userIds []int) (mapUserStatus map[int]string) {
  431. var err error
  432. mapUserStatus = make(map[int]string, 0)
  433. defer func() {
  434. if err != nil {
  435. go alarm_msg.SendAlarmMsg("自动添加弘则联系人失败, Err: "+err.Error(), 3)
  436. }
  437. }()
  438. lenArr := len(userIds)
  439. if lenArr == 0 {
  440. return
  441. }
  442. for _, v := range userIds {
  443. mapUserStatus[v] = "关闭"
  444. }
  445. listUserProduct, e := company.GetUserProductByUserIds(userIds)
  446. if e != nil {
  447. err = errors.New("GetUserProductByUserIds" + e.Error())
  448. return
  449. }
  450. for _, v := range listUserProduct {
  451. mapUserStatus[v.UserId] = v.Status
  452. }
  453. var condition string
  454. var pars []interface{}
  455. condition += " AND status = '试用' AND user_id IN(" + utils.GetOrmInReplace(lenArr) + ") "
  456. pars = append(pars, userIds)
  457. list, e := cygx.GetCygxUserYanxuanPermissionList(condition, pars, 0, lenArr)
  458. if e != nil {
  459. err = errors.New("GetCygxUserYanxuanPermissionList, Err: " + e.Error())
  460. return
  461. }
  462. for _, v := range list {
  463. if mapUserStatus[v.UserId] == "关闭" {
  464. mapUserStatus[v.UserId] = "试用"
  465. }
  466. }
  467. return
  468. }