activity_points.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054
  1. package services
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "hongze/hongze_cygx/models"
  7. "hongze/hongze_cygx/models/company"
  8. "hongze/hongze_cygx/utils"
  9. "strconv"
  10. "time"
  11. )
  12. //func init() {
  13. // GetActivityPointsAll()
  14. //}
  15. // GetActivityPointsByUserAllMap 获取所有针对用户扣点的活动
  16. func GetActivityPointsByUserAllMap() (mapResp map[int]bool) {
  17. var err error
  18. defer func() {
  19. if err != nil {
  20. fmt.Println(err)
  21. go utils.SendAlarmMsg("GetActivityPointsByUserAllMap,Err:"+err.Error(), 2)
  22. }
  23. }()
  24. var condition string
  25. var pars []interface{}
  26. //获取所有研选类型的活动
  27. condition = ` AND chart_permission_id = ` + strconv.Itoa(utils.CHART_PERMISSION_ID_YANXUAN)
  28. listActivity, e := models.GetActivityListByCondition(condition, pars)
  29. if e != nil {
  30. err = errors.New("GetActivityListByCondition, Err: " + e.Error())
  31. return
  32. }
  33. var activityIds []int
  34. condition = ""
  35. pars = make([]interface{}, 0)
  36. for _, v := range listActivity {
  37. activityIds = append(activityIds, v.ActivityId)
  38. }
  39. condition += ` AND points_object IN (1,3) `
  40. condition += ` AND activity_id IN (` + utils.GetOrmInReplace(len(activityIds)) + `) `
  41. pars = append(pars, activityIds)
  42. list, e := models.GetCygxActivityPointsSetList(condition, pars, 0, 0)
  43. if e != nil {
  44. err = errors.New("GetCygxActivityPointsSetList, Err: " + e.Error())
  45. return
  46. }
  47. mapResp = make(map[int]bool, 0)
  48. for _, v := range list {
  49. mapResp[v.ActivityId] = true
  50. }
  51. return
  52. }
  53. // GetActivityPointsAll 获取所有带有扣点的活动
  54. func GetActivityPointsAll() (mapResp map[int]bool, err error) {
  55. defer func() {
  56. if err != nil {
  57. fmt.Println(err)
  58. go utils.SendAlarmMsg("获取所有带有扣点的活动失败"+err.Error(), 2)
  59. }
  60. }()
  61. var condition string
  62. var pars []interface{}
  63. mapResp = make(map[int]bool, 0)
  64. list, e := models.GetCygxActivityPointsSetList(condition, pars, 0, 0)
  65. if e != nil && e.Error() != utils.ErrNoRow() {
  66. err = errors.New("GetCygxActivityPointsSetList,Err: " + e.Error())
  67. return
  68. }
  69. for _, v := range list {
  70. mapResp[v.ActivityId] = true
  71. }
  72. return
  73. }
  74. // 用户报名添加到处理研选扣点
  75. func YanXuanActivityPointsBillSignupAdd(activityId, uid int) (err error) {
  76. defer func() {
  77. if err != nil {
  78. fmt.Println(err)
  79. msg := fmt.Sprint("activityId:", activityId, "userId:", uid)
  80. go utils.SendAlarmMsg("用户报名添加到处理研选扣点,写入Redis队列消息失败:"+err.Error()+msg, 2)
  81. }
  82. }()
  83. //SourceType int `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
  84. log := &models.YanXuanActivityPointsRedis{UserId: uid, ActivityId: activityId, SourceType: 1, RegisterPlatform: utils.REGISTER_PLATFORM, Source: 1, CreateTime: time.Now()}
  85. if utils.Re == nil {
  86. err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
  87. if err != nil {
  88. fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
  89. }
  90. }
  91. return
  92. }
  93. // 用户取消报名添加到处理研选扣点
  94. func YanXuanActivityPointsBillSignupCancel(activityId, uid int) (err error) {
  95. defer func() {
  96. if err != nil {
  97. fmt.Println(err)
  98. msg := fmt.Sprint("activityId:", activityId, "userId:", uid)
  99. go utils.SendAlarmMsg("用户取消报名添加到处理研选扣点,写入Redis队列消息失败:"+err.Error()+msg, 2)
  100. }
  101. }()
  102. //SourceType int `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
  103. log := &models.YanXuanActivityPointsRedis{UserId: uid, ActivityId: activityId, SourceType: 2, RegisterPlatform: utils.REGISTER_PLATFORM, Source: 1, CreateTime: time.Now()}
  104. if utils.Re == nil {
  105. err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
  106. if err != nil {
  107. fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
  108. }
  109. }
  110. return
  111. }
  112. // 5 活动到会研选扣点处理
  113. func YanXuanActivityPointsBillSubmitMeeting(activityId, adminId int) (err error) {
  114. defer func() {
  115. if err != nil {
  116. fmt.Println(err)
  117. msg := fmt.Sprint("activityId:", activityId)
  118. go utils.SendAlarmMsg("活动到会研选扣点处理,写入Redis队列消息失败:"+err.Error()+msg, 2)
  119. }
  120. }()
  121. //SourceType int `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。6:研选审批通过的时候研选扣点更新、 7:正式专试用定时任务更新研选扣点"`
  122. log := &models.YanXuanActivityPointsRedis{ActivityId: activityId, SourceType: 5, AdminId: adminId, Source: 2, CreateTime: time.Now()}
  123. if utils.Re == nil {
  124. err := utils.Rc.LPush(utils.CYGX_YANXUAN_POINTS_KEY, log)
  125. if err != nil {
  126. fmt.Println("YanXuanActivityPointsRedis LPush Err:" + err.Error())
  127. }
  128. }
  129. return
  130. }
  131. // YanXuanActivityPointsBillReduce 处理研选活动扣点
  132. func YanXuanActivityPointsBillReduce() (err error) {
  133. for {
  134. //SourceType int `description:"1:报名、 2:取消报名、3:活动编辑、4:活动发布,取消发布、5:活动到会。"`
  135. utils.Rc.Brpop(utils.CYGX_YANXUAN_POINTS_KEY, func(b []byte) {
  136. var log models.YanXuanActivityPointsRedis
  137. if err := json.Unmarshal(b, &log); err != nil {
  138. fmt.Println("json unmarshal wrong!")
  139. go utils.SendAlarmMsg("处理研选活动扣点处理Redis队列消息失败:"+err.Error()+string(b), 2)
  140. }
  141. switch log.SourceType {
  142. case 1:
  143. go YanXuanActivityPointsBillSignupAddReduce(log)
  144. fmt.Println("1:报名")
  145. break
  146. case 2:
  147. go YanXuanActivityPointsBillSignupCancelReduce(log)
  148. fmt.Println(" 2:取消报名")
  149. break
  150. case 3:
  151. go YanXuanActivityPointsBillActivityEditReduce(log)
  152. fmt.Println("3:活动编辑")
  153. break
  154. case 4:
  155. go YanXuanActivityPointsBillActivityPublishAndCancelReduce(log)
  156. fmt.Println("4:活动发布、取消发布")
  157. break
  158. case 5:
  159. go YanXuanActivityPointsBillSubmitMeetingReduce(log)
  160. fmt.Println("5:活动到会研选扣点处理。")
  161. case 6:
  162. go YanXuanCompanyApprovalReduce(log)
  163. fmt.Println("6:研选审批通过的时候研选扣点更新。")
  164. break
  165. case 7:
  166. go YanXuanCompanyCompanyTryOutReduce(log)
  167. fmt.Println("7:正式专试用定时任务更新研选扣点。")
  168. break
  169. default:
  170. fmt.Println(string(b))
  171. go utils.SendAlarmMsg("处理研选活动扣点处理Redis队列消息失败:"+string(b), 2)
  172. }
  173. })
  174. }
  175. }
  176. // 1:用户报名
  177. func YanXuanActivityPointsBillSignupAddReduce(log models.YanXuanActivityPointsRedis) (err error) {
  178. defer func() {
  179. if err != nil {
  180. fmt.Println(err)
  181. go utils.SendAlarmMsg("用户报名活动扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
  182. }
  183. }()
  184. //加2000毫秒的延迟
  185. time.Sleep(2 * time.Second)
  186. activityId := log.ActivityId
  187. userId := log.UserId
  188. //获取活动是否扣点以及扣点规则明细
  189. activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
  190. if e != nil && e.Error() != utils.ErrNoRow() {
  191. err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
  192. return
  193. }
  194. if activityPointsSetDetail == nil {
  195. return
  196. }
  197. if activityPointsSetDetail.UserPointsNum == 0 || activityPointsSetDetail.PointsType != 1 {
  198. return // 如果不是报名即扣点的这种形式,那么就不做任何处理
  199. }
  200. activityInfo, e := models.GetAddActivityInfoById(activityId)
  201. if e != nil {
  202. err = errors.New("GetAddActivityInfoById" + e.Error())
  203. return
  204. }
  205. user, e := models.GetWxUserItemByUserId(userId)
  206. if e != nil {
  207. err = errors.New("GetWxUserItemByUserId" + e.Error())
  208. return
  209. }
  210. // 获取用户所在公司剩余的点
  211. companyPointsNum, e := models.GetCompanyPoints(user.CompanyId)
  212. if e != nil && e.Error() != utils.ErrNoRow() {
  213. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  214. return
  215. }
  216. //获取需要添加的流水信息
  217. var items []*models.CygxActivityPointsBill
  218. item := new(models.CygxActivityPointsBill)
  219. item.UserId = user.UserId
  220. item.ActivityId = activityId
  221. item.CreateTime = time.Now()
  222. item.Mobile = user.Mobile
  223. item.Email = user.Email
  224. item.CompanyId = user.CompanyId
  225. item.CompanyName = user.CompanyName
  226. item.RealName = user.RealName
  227. item.BillDetailed = -activityPointsSetDetail.UserPointsNum
  228. item.RegisterPlatform = log.RegisterPlatform
  229. item.AdminId = log.AdminId
  230. item.Source = log.Source
  231. item.ChartPermissionId = activityInfo.ChartPermissionId
  232. item.DoType = 1
  233. item.Content = activityInfo.ActivityName + "--报名"
  234. item.Points = companyPointsNum - activityPointsSetDetail.UserPointsNum
  235. items = append(items, item)
  236. //更新对应机构的剩余点数
  237. var itemCompanys []*models.CygxActivityPointsCompany
  238. itemCompany := new(models.CygxActivityPointsCompany)
  239. itemCompany.CompanyId = user.CompanyId
  240. itemCompany.Points = item.Points
  241. itemCompany.ModifyTime = time.Now()
  242. itemCompanys = append(itemCompanys, itemCompany)
  243. err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  244. return
  245. }
  246. // 2:用户取消报名
  247. func YanXuanActivityPointsBillSignupCancelReduce(log models.YanXuanActivityPointsRedis) (err error) {
  248. defer func() {
  249. if err != nil {
  250. fmt.Println(err)
  251. go utils.SendAlarmMsg("用户取消报名扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
  252. }
  253. }()
  254. activityId := log.ActivityId
  255. userId := log.UserId
  256. //获取活动是否扣点以及扣点规则明细
  257. activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
  258. if e != nil && e.Error() != utils.ErrNoRow() {
  259. err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
  260. return
  261. }
  262. if activityPointsSetDetail == nil {
  263. return
  264. }
  265. if activityPointsSetDetail.UserPointsNum == 0 || activityPointsSetDetail.PointsType != 1 {
  266. return // 如果不是报名即扣点的这种形式,那么就不做任何处理
  267. }
  268. activityInfo, e := models.GetAddActivityInfoById(activityId)
  269. if e != nil {
  270. err = errors.New("GetAddActivityInfoById" + e.Error())
  271. return
  272. }
  273. user, e := models.GetWxUserItemByUserId(userId)
  274. if e != nil {
  275. err = errors.New("GetWxUserItemByUserId" + e.Error())
  276. return
  277. }
  278. // 获取用户所在公司剩余的点
  279. companyPointsNum, e := models.GetCompanyPoints(user.CompanyId)
  280. if e != nil && e.Error() != utils.ErrNoRow() {
  281. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  282. return
  283. }
  284. //查询最新的一条针对这个用户的扣点记录
  285. var condition string
  286. var pars []interface{}
  287. condition += ` AND activity_id = ? AND user_id = ? AND bill_detailed < 0 ORDER BY id DESC LIMIT 1 `
  288. pars = append(pars, activityId, userId)
  289. activityPointsBillDetail, e := models.GetCygxActivityPointsBillDetailByCondition(condition, pars)
  290. if e != nil {
  291. err = errors.New("activityPointsBillDetail" + e.Error())
  292. return
  293. }
  294. //获取需要添加的流水信息
  295. var items []*models.CygxActivityPointsBill
  296. item := new(models.CygxActivityPointsBill)
  297. item.UserId = user.UserId
  298. item.ActivityId = activityId
  299. item.CreateTime = time.Now()
  300. item.Mobile = user.Mobile
  301. item.Email = user.Email
  302. item.CompanyId = user.CompanyId
  303. item.CompanyName = user.CompanyName
  304. item.RealName = user.RealName
  305. item.BillDetailed = -activityPointsBillDetail.BillDetailed
  306. item.RegisterPlatform = log.RegisterPlatform
  307. item.AdminId = log.AdminId
  308. item.Source = log.Source
  309. item.ChartPermissionId = activityInfo.ChartPermissionId
  310. item.DoType = 2
  311. item.Content = activityInfo.ActivityName + "--取消报名"
  312. item.Points = companyPointsNum - activityPointsBillDetail.BillDetailed
  313. items = append(items, item)
  314. //更新对应机构的剩余点数
  315. var itemCompanys []*models.CygxActivityPointsCompany
  316. itemCompany := new(models.CygxActivityPointsCompany)
  317. itemCompany.CompanyId = user.CompanyId
  318. itemCompany.Points = item.Points
  319. itemCompany.ModifyTime = time.Now()
  320. itemCompanys = append(itemCompanys, itemCompany)
  321. err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  322. return
  323. }
  324. // 3:活动编辑
  325. func YanXuanActivityPointsBillActivityEditReduce(log models.YanXuanActivityPointsRedis) (err error) {
  326. defer func() {
  327. if err != nil {
  328. fmt.Println(err)
  329. go utils.SendAlarmMsg("用户报名活动扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
  330. }
  331. }()
  332. activityId := log.ActivityId
  333. //获取活动是否扣点以及扣点规则明细
  334. activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
  335. if e != nil && e.Error() != utils.ErrNoRow() {
  336. err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
  337. return
  338. }
  339. if activityPointsSetDetail == nil {
  340. return
  341. }
  342. if activityPointsSetDetail.CompanyPointsNum == 0 {
  343. return // 如果不是办会人,即扣点的这种形式,那么就不做任何处理
  344. }
  345. comapnyId := activityPointsSetDetail.CompanyId
  346. activityInfo, e := models.GetAddActivityInfoByActivityId(activityId)
  347. if e != nil {
  348. err = errors.New("GetAddActivityInfoByActivityId" + e.Error())
  349. return
  350. }
  351. if activityInfo.PublishStatus == 0 {
  352. return // 未发布的活动不做处理
  353. }
  354. comapny, e := models.GetCompanyById(comapnyId)
  355. if e != nil {
  356. err = errors.New("GetCompanyById" + e.Error())
  357. return
  358. }
  359. // 获取用户所在公司剩余的点
  360. companyPointsNum, e := models.GetCompanyPoints(comapny.CompanyId)
  361. if e != nil && e.Error() != utils.ErrNoRow() {
  362. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  363. return
  364. }
  365. //查询最新的一条针对这个公司的扣点记录
  366. var condition string
  367. var pars []interface{}
  368. condition += ` AND activity_id = ? AND company_id = ? AND mobile = '' AND bill_detailed < 0 ORDER BY id DESC LIMIT 1 `
  369. pars = append(pars, activityId, comapnyId)
  370. activityPointsBillDetail, e := models.GetCygxActivityPointsBillDetailByCondition(condition, pars)
  371. if e != nil && e.Error() != utils.ErrNoRow() {
  372. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  373. return
  374. }
  375. var items []*models.CygxActivityPointsBill
  376. item := new(models.CygxActivityPointsBill)
  377. var itemCompanys []*models.CygxActivityPointsCompany
  378. itemCompany := new(models.CygxActivityPointsCompany)
  379. if activityPointsBillDetail == nil { //如果是空的就添加
  380. //获取需要添加的流水信息
  381. //item.UserId = user.UserId
  382. item.ActivityId = activityId
  383. item.CreateTime = time.Now()
  384. //item.Mobile = user.Mobile
  385. //item.Email = user.Email
  386. item.CompanyId = comapny.CompanyId
  387. item.CompanyName = comapny.CompanyName
  388. //item.RealName = user.RealName
  389. item.BillDetailed = -activityPointsSetDetail.CompanyPointsNum
  390. item.RegisterPlatform = log.RegisterPlatform
  391. item.AdminId = log.AdminId
  392. item.Source = log.Source
  393. item.ChartPermissionId = activityInfo.ChartPermissionId
  394. item.DoType = 1
  395. item.Content = activityInfo.ActivityName + "--办会"
  396. item.Points = companyPointsNum - activityPointsSetDetail.CompanyPointsNum
  397. items = append(items, item)
  398. //更新对应机构的剩余点数
  399. itemCompany.CompanyId = comapny.CompanyId
  400. itemCompany.Points = item.Points
  401. itemCompany.ModifyTime = time.Now()
  402. itemCompanys = append(itemCompanys, itemCompany)
  403. e = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  404. if e != nil && e.Error() != utils.ErrNoRow() {
  405. err = errors.New("AddCygxActivityPointsBillMulti, Err: " + e.Error())
  406. return
  407. }
  408. } else {
  409. //如果存在就进行对比修改
  410. if activityPointsSetDetail.CompanyPointsNum != -activityPointsBillDetail.BillDetailed {
  411. item.Id = activityPointsBillDetail.Id
  412. item.BillDetailed = -activityPointsSetDetail.CompanyPointsNum
  413. item.Points = companyPointsNum - activityPointsBillDetail.BillDetailed - activityPointsSetDetail.CompanyPointsNum
  414. items = append(items, item)
  415. //更新对应机构的剩余点数
  416. itemCompany.CompanyId = comapny.CompanyId
  417. itemCompany.Points = item.Points
  418. itemCompany.ModifyTime = time.Now()
  419. itemCompanys = append(itemCompanys, itemCompany)
  420. e = models.UpdateCygxActivityPointsBillMulti(items, itemCompanys)
  421. if e != nil && e.Error() != utils.ErrNoRow() {
  422. err = errors.New("UpdateCygxActivityPointsBillMulti, Err: " + e.Error())
  423. return
  424. }
  425. }
  426. }
  427. return
  428. }
  429. // 4:活动发布取消发布
  430. func YanXuanActivityPointsBillActivityPublishAndCancelReduce(log models.YanXuanActivityPointsRedis) (err error) {
  431. defer func() {
  432. if err != nil {
  433. fmt.Println(err)
  434. go utils.SendAlarmMsg("活动发布扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "userId", log.UserId), 2)
  435. }
  436. }()
  437. activityId := log.ActivityId
  438. publishStatus := log.PublishStatus
  439. //comapnyId := log.ComapnyId
  440. //获取活动是否扣点以及扣点规则明细
  441. activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
  442. if e != nil && e.Error() != utils.ErrNoRow() {
  443. err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
  444. return
  445. }
  446. if activityPointsSetDetail == nil {
  447. return
  448. }
  449. if activityPointsSetDetail.CompanyPointsNum == 0 && activityPointsSetDetail.PointsType == 2 {
  450. //if activityPointsSetDetail.CompanyPointsNum == 0 {
  451. return // 如果不是办会人扣点,且对用户是到会扣点的这种形式,那么就不做任何处理
  452. }
  453. activityInfo, e := models.GetAddActivityInfoByActivityId(activityId)
  454. if e != nil {
  455. err = errors.New("GetAddActivityInfoByActivityId" + e.Error())
  456. return
  457. }
  458. comapnyId := activityPointsSetDetail.CompanyId
  459. var items []*models.CygxActivityPointsBill
  460. var itemCompanys []*models.CygxActivityPointsCompany
  461. mapCompanyPoints := make(map[int]float64) //一组公司的剩余点数
  462. if publishStatus == 1 {
  463. fmt.Println("//活动发布")
  464. if comapnyId > 0 {
  465. comapny, e := models.GetCompanyById(comapnyId)
  466. if e != nil {
  467. err = errors.New("GetCompanyById" + e.Error())
  468. return
  469. }
  470. // 获取用户所在公司剩余的点
  471. companyPointsNum, e := models.GetCompanyPoints(comapny.CompanyId)
  472. if e != nil && e.Error() != utils.ErrNoRow() {
  473. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  474. return
  475. }
  476. item := new(models.CygxActivityPointsBill)
  477. item.ActivityId = activityId
  478. item.CreateTime = time.Now()
  479. //item.Mobile = user.Mobile
  480. //item.Email = user.Email
  481. item.CompanyId = comapny.CompanyId
  482. item.CompanyName = comapny.CompanyName
  483. //item.RealName = user.RealName
  484. item.BillDetailed = -activityPointsSetDetail.CompanyPointsNum
  485. item.RegisterPlatform = log.RegisterPlatform
  486. item.AdminId = log.AdminId
  487. item.Source = log.Source
  488. item.ChartPermissionId = activityInfo.ChartPermissionId
  489. item.DoType = 1
  490. item.Content = activityInfo.ActivityName + "--办会"
  491. item.Points = companyPointsNum - activityPointsSetDetail.CompanyPointsNum
  492. items = append(items, item)
  493. //更新对应机构的剩余点数
  494. itemCompany := new(models.CygxActivityPointsCompany)
  495. itemCompany.CompanyId = comapny.CompanyId
  496. itemCompany.Points = item.Points
  497. itemCompany.ModifyTime = time.Now()
  498. itemCompanys = append(itemCompanys, itemCompany)
  499. mapCompanyPoints[comapnyId] = item.Points
  500. }
  501. if activityPointsSetDetail.UserPointsNum > 0 && activityPointsSetDetail.PointsType == 1 {
  502. //如果扣点形式选的是报名即扣点,那么就对已经报名的用户所在机构进行扣点
  503. var condition string
  504. var pars []interface{}
  505. condition = ` AND do_fail_type = 0 AND activity_id = ?`
  506. pars = append(pars, activityId)
  507. listSignup, e := models.GetActivitySignupList(condition, pars)
  508. if e != nil && e.Error() != utils.ErrNoRow() {
  509. err = errors.New("GetActivitySignupList, Err: " + e.Error())
  510. return
  511. }
  512. var companyIds []int
  513. if len(listSignup) > 0 {
  514. for _, v := range listSignup {
  515. companyIds = append(companyIds, v.CompanyId)
  516. }
  517. pars = make([]interface{}, 0)
  518. condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
  519. pars = append(pars, companyIds)
  520. //获取这些公司剩余的点数
  521. conpanyList, e := models.GetCygxActivityPointsCompanyList(condition, pars)
  522. if e != nil && e.Error() != utils.ErrNoRow() {
  523. err = errors.New("GetCygxActivityPointsCompanyList, Err: " + e.Error())
  524. return
  525. }
  526. for _, v := range conpanyList {
  527. if mapCompanyPoints[v.CompanyId] == 0 {
  528. mapCompanyPoints[v.CompanyId] = v.Points
  529. }
  530. }
  531. for _, user := range listSignup {
  532. item := new(models.CygxActivityPointsBill)
  533. item.ActivityId = activityId
  534. item.CreateTime = time.Now()
  535. item.Mobile = user.Mobile
  536. item.UserId = user.UserId
  537. item.Email = user.Email
  538. item.CompanyId = user.CompanyId
  539. item.CompanyName = user.CompanyName
  540. item.RealName = user.RealName
  541. item.BillDetailed = -activityPointsSetDetail.UserPointsNum
  542. item.RegisterPlatform = log.RegisterPlatform
  543. item.AdminId = log.AdminId
  544. item.Source = log.Source
  545. item.ChartPermissionId = activityInfo.ChartPermissionId
  546. item.DoType = 1
  547. item.Content = activityInfo.ActivityName + "--发布活动"
  548. mapCompanyPoints[user.CompanyId] -= activityPointsSetDetail.UserPointsNum //通过map处理机构剩余点数
  549. item.Points = mapCompanyPoints[user.CompanyId]
  550. items = append(items, item)
  551. //更新对应机构的剩余点数
  552. itemCompany := new(models.CygxActivityPointsCompany)
  553. itemCompany.CompanyId = user.CompanyId
  554. itemCompany.Points = item.Points
  555. itemCompany.ModifyTime = time.Now()
  556. itemCompanys = append(itemCompanys, itemCompany)
  557. mapCompanyPoints[user.CompanyId] = item.Points
  558. }
  559. }
  560. }
  561. } else {
  562. fmt.Println("//活动取消发布")
  563. //活动取消发布
  564. if comapnyId > 0 {
  565. comapny, e := models.GetCompanyById(comapnyId)
  566. if e != nil {
  567. err = errors.New("GetCompanyById" + e.Error())
  568. return
  569. }
  570. // 获取用户所在公司剩余的点
  571. companyPointsNum, e := models.GetCompanyPoints(comapny.CompanyId)
  572. if e != nil && e.Error() != utils.ErrNoRow() {
  573. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  574. return
  575. }
  576. item := new(models.CygxActivityPointsBill)
  577. item.ActivityId = activityId
  578. item.CreateTime = time.Now()
  579. //item.Mobile = user.Mobile
  580. //item.Email = user.Email
  581. item.CompanyId = comapny.CompanyId
  582. item.CompanyName = comapny.CompanyName
  583. //item.RealName = user.RealName
  584. item.BillDetailed = activityPointsSetDetail.CompanyPointsNum
  585. item.RegisterPlatform = log.RegisterPlatform
  586. item.AdminId = log.AdminId
  587. item.Source = log.Source
  588. item.ChartPermissionId = activityInfo.ChartPermissionId
  589. item.DoType = 2
  590. item.Content = activityInfo.ActivityName + "--取消办会"
  591. item.Points = companyPointsNum + activityPointsSetDetail.CompanyPointsNum
  592. items = append(items, item)
  593. //更新对应机构的剩余点数
  594. itemCompany := new(models.CygxActivityPointsCompany)
  595. itemCompany.CompanyId = comapny.CompanyId
  596. itemCompany.Points = item.Points
  597. itemCompany.ModifyTime = time.Now()
  598. itemCompanys = append(itemCompanys, itemCompany)
  599. mapCompanyPoints[comapnyId] = item.Points
  600. }
  601. if activityPointsSetDetail.UserPointsNum > 0 && activityPointsSetDetail.PointsType == 1 {
  602. //如果扣点形式选的是报名即扣点,那么就对已经报名的用户所在机构进行返点
  603. var condition string
  604. var pars []interface{}
  605. condition = ` AND do_fail_type = 0 AND activity_id = ?`
  606. pars = append(pars, activityId)
  607. listSignup, e := models.GetActivitySignupList(condition, pars)
  608. if e != nil && e.Error() != utils.ErrNoRow() {
  609. err = errors.New("GetActivitySignupList, Err: " + e.Error())
  610. return
  611. }
  612. var companyIds []int
  613. if len(listSignup) > 0 {
  614. for _, v := range listSignup {
  615. companyIds = append(companyIds, v.CompanyId)
  616. }
  617. pars = make([]interface{}, 0)
  618. condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
  619. pars = append(pars, companyIds)
  620. //获取这些公司剩余的点数
  621. conpanyList, e := models.GetCygxActivityPointsCompanyList(condition, pars)
  622. if e != nil && e.Error() != utils.ErrNoRow() {
  623. err = errors.New("GetCygxActivityPointsCompanyList, Err: " + e.Error())
  624. return
  625. }
  626. for _, v := range conpanyList {
  627. if mapCompanyPoints[v.CompanyId] == 0 {
  628. mapCompanyPoints[v.CompanyId] = v.Points
  629. }
  630. }
  631. pars = make([]interface{}, 0)
  632. condition = ` AND activity_id = ? `
  633. pars = append(pars, activityId)
  634. //获取扣点的流水记录
  635. activityPointsBillList, e := models.GetCygxActivityPointsBillList(condition, pars)
  636. if e != nil && e.Error() != utils.ErrNoRow() {
  637. err = errors.New("GetCygxActivityPointsBillList" + e.Error())
  638. return
  639. }
  640. mapUserBill := make(map[int]bool)
  641. for _, v := range activityPointsBillList {
  642. mapUserBill[v.UserId] = true
  643. }
  644. for _, user := range listSignup {
  645. if !mapUserBill[user.UserId] {
  646. continue // 如果用户的扣点记录不存在,那么就不进行返点处理
  647. }
  648. item := new(models.CygxActivityPointsBill)
  649. item.ActivityId = activityId
  650. item.CreateTime = time.Now()
  651. item.Mobile = user.Mobile
  652. item.UserId = user.UserId
  653. item.Email = user.Email
  654. item.CompanyId = user.CompanyId
  655. item.CompanyName = user.CompanyName
  656. item.RealName = user.RealName
  657. item.BillDetailed = activityPointsSetDetail.UserPointsNum
  658. item.RegisterPlatform = log.RegisterPlatform
  659. item.AdminId = log.AdminId
  660. item.Source = log.Source
  661. item.ChartPermissionId = activityInfo.ChartPermissionId
  662. item.DoType = 2
  663. item.Content = activityInfo.ActivityName + "--取消活动"
  664. mapCompanyPoints[user.CompanyId] += activityPointsSetDetail.UserPointsNum //通过map处理机构剩余点数
  665. item.Points = mapCompanyPoints[user.CompanyId]
  666. items = append(items, item)
  667. //更新对应机构的剩余点数
  668. itemCompany := new(models.CygxActivityPointsCompany)
  669. itemCompany.CompanyId = user.CompanyId
  670. itemCompany.Points = item.Points
  671. itemCompany.ModifyTime = time.Now()
  672. itemCompanys = append(itemCompanys, itemCompany)
  673. mapCompanyPoints[user.CompanyId] = item.Points
  674. }
  675. }
  676. }
  677. }
  678. e = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  679. if e != nil && e.Error() != utils.ErrNoRow() {
  680. err = errors.New("AddCygxActivityPointsBillMulti, Err: " + e.Error())
  681. return
  682. }
  683. return
  684. }
  685. //func init() {
  686. // log := models.YanXuanActivityPointsRedis{ActivityId: 2385, SourceType: 5, RegisterPlatform: utils.REGISTER_PLATFORM, Source: 4, CreateTime: time.Now()}
  687. // YanXuanActivityPointsBillSubmitMeetingReduce(log)
  688. //}
  689. // 5:活动到会研选扣点处理
  690. func YanXuanActivityPointsBillSubmitMeetingReduce(log models.YanXuanActivityPointsRedis) (err error) {
  691. //func YanXuanActivityPointsBillSubmitMeetingReduce(activityId int) (err error) {
  692. defer func() {
  693. if err != nil {
  694. fmt.Println(err)
  695. go utils.SendAlarmMsg("活动到会研选扣点,处理Redis队列消息失败:"+err.Error()+fmt.Sprint("ActivityId", log.ActivityId, "adminId", log.AdminId), 2)
  696. }
  697. }()
  698. activityId := log.ActivityId
  699. //获取活动是否扣点以及扣点规则明细
  700. activityPointsSetDetail, e := models.GetCygxActivityPointsSetDetail(activityId)
  701. if e != nil && e.Error() != utils.ErrNoRow() {
  702. err = errors.New("GetCygxActivityPointsSetDetail" + e.Error())
  703. return
  704. }
  705. if activityPointsSetDetail == nil {
  706. return
  707. }
  708. if activityPointsSetDetail.PointsType != 2 {
  709. return // 如果不是到会即扣点,的这种形式,那么就不做任何处理
  710. }
  711. activityInfo, e := models.GetAddActivityInfoByActivityId(activityId)
  712. if e != nil {
  713. err = errors.New("GetAddActivityInfoByActivityId" + e.Error())
  714. return
  715. }
  716. var companyIds []int
  717. mapCompanyPoints := make(map[int]float64) //一组公司的剩余点数
  718. var condition string
  719. var pars []interface{}
  720. condition += ` AND activity_id = ? AND is_meeting = 1 `
  721. pars = append(pars, activityId)
  722. //获取提交到会的人员信息
  723. signUpDetailList, e := models.GetSignupDetailList(condition, pars)
  724. if e != nil && e.Error() != utils.ErrNoRow() {
  725. err = errors.New("GetSignupDetailList" + e.Error())
  726. return
  727. }
  728. if len(signUpDetailList) == 0 {
  729. return
  730. }
  731. for _, v := range signUpDetailList {
  732. companyIds = append(companyIds, v.CompanyId)
  733. }
  734. //return
  735. pars = make([]interface{}, 0)
  736. condition = ` AND company_id IN (` + utils.GetOrmInReplace(len(companyIds)) + `)`
  737. pars = append(pars, companyIds)
  738. //获取这些公司剩余的点数
  739. conpanyList, e := models.GetCygxActivityPointsCompanyList(condition, pars)
  740. if e != nil && e.Error() != utils.ErrNoRow() {
  741. err = errors.New("GetCygxActivityPointsCompanyList, Err: " + e.Error())
  742. return
  743. }
  744. pars = make([]interface{}, 0)
  745. condition = ` AND activity_id = ? AND mobile != '' `
  746. pars = append(pars, activityId)
  747. //获取扣点的流水记录
  748. activityPointsBillList, e := models.GetCygxActivityPointsBillList(condition, pars)
  749. if e != nil && e.Error() != utils.ErrNoRow() {
  750. err = errors.New("GetCygxActivityPointsBillList" + e.Error())
  751. return
  752. }
  753. mapActivityPointsBill := make(map[string]*models.CygxActivityPointsBill)
  754. for _, v := range activityPointsBillList {
  755. mapActivityPointsBill[v.Mobile] = v
  756. }
  757. //return
  758. for _, v := range conpanyList {
  759. if v.CompanyId != 0 {
  760. mapCompanyPoints[v.CompanyId] = v.Points
  761. }
  762. }
  763. //return
  764. var items []*models.CygxActivityPointsBill
  765. var itemCompanys []*models.CygxActivityPointsCompany
  766. for _, user := range signUpDetailList {
  767. item := new(models.CygxActivityPointsBill)
  768. item.ActivityId = activityId
  769. item.CreateTime = time.Now()
  770. item.UserId = user.UserId
  771. item.Mobile = user.Mobile
  772. item.Email = user.Email
  773. item.CompanyId = user.CompanyId
  774. item.CompanyName = user.CompanyName
  775. item.RealName = user.RealName
  776. item.RegisterPlatform = log.RegisterPlatform
  777. item.AdminId = log.AdminId
  778. item.Source = log.Source
  779. item.ChartPermissionId = activityInfo.ChartPermissionId
  780. //如果没有扣点记录就对他们进行扣点处理
  781. if mapActivityPointsBill[user.Mobile] == nil {
  782. item.BillDetailed = -activityPointsSetDetail.UserPointsNum
  783. item.DoType = 1
  784. item.Content = activityInfo.ActivityName + "--活动到会"
  785. item.Points = mapCompanyPoints[user.CompanyId] - activityPointsSetDetail.UserPointsNum
  786. items = append(items, item)
  787. //更新对应机构的剩余点数
  788. itemCompany := new(models.CygxActivityPointsCompany)
  789. itemCompany.CompanyId = user.CompanyId
  790. itemCompany.Points = item.Points
  791. itemCompany.ModifyTime = time.Now()
  792. itemCompanys = append(itemCompanys, itemCompany)
  793. mapCompanyPoints[user.CompanyId] = item.Points
  794. } else {
  795. //第二次提交改成未到会的,对其进行返点处理
  796. if mapActivityPointsBill[user.Mobile].BillDetailed < 0 {
  797. item.BillDetailed = activityPointsSetDetail.UserPointsNum
  798. item.DoType = 2
  799. item.Content = activityInfo.ActivityName + "--活动取消到会"
  800. item.Points = mapCompanyPoints[user.CompanyId] + activityPointsSetDetail.UserPointsNum
  801. items = append(items, item)
  802. //更新对应机构的剩余点数
  803. itemCompany := new(models.CygxActivityPointsCompany)
  804. itemCompany.CompanyId = user.CompanyId
  805. itemCompany.Points = item.Points
  806. itemCompany.ModifyTime = time.Now()
  807. itemCompanys = append(itemCompanys, itemCompany)
  808. mapCompanyPoints[user.CompanyId] = item.Points
  809. }
  810. }
  811. }
  812. e = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  813. if e != nil && e.Error() != utils.ErrNoRow() {
  814. err = errors.New("AddCygxActivityPointsBillMulti, Err: " + e.Error())
  815. return
  816. }
  817. return
  818. }
  819. // 6:研选审批通过的时候研选扣点更新
  820. func YanXuanCompanyApprovalReduce(log models.YanXuanActivityPointsRedis) (err error) {
  821. time.Sleep(5 * time.Second) // 延迟5秒处理
  822. defer func() {
  823. if err != nil {
  824. fmt.Println(err)
  825. go utils.SendAlarmMsg("研选审批通过的时候研选扣点更新,处理Redis队列消息失败:"+err.Error()+fmt.Sprint(log), 2)
  826. }
  827. }()
  828. comapnyId := log.ComapnyId
  829. companyContractId := log.CompanyContractId
  830. comapnyDetail, e := models.GetCompanyById(comapnyId)
  831. if e != nil {
  832. err = errors.New("GetCompanyById" + e.Error())
  833. return
  834. }
  835. total, e := models.GetCygxActivityPointsCompanyCountByCompanyId(comapnyId)
  836. if e != nil {
  837. err = errors.New("GetCygxActivityPointsCompanyCountByCompanyId, Err: " + e.Error())
  838. return
  839. }
  840. //查询研选的权限状态
  841. var condition string
  842. var pars []interface{}
  843. condition += " AND company_id = ? AND company_contract_id =? AND chart_permission_id = ? ORDER BY id DESC LIMIT 1 "
  844. pars = append(pars, comapnyId, companyContractId, utils.YAN_XUAN_KOU_DIAN_BAO_ID)
  845. companyPointDetail, e := company.GetCompanyContractPermissionDetail(condition, pars)
  846. if e != nil && e.Error() != utils.ErrNoRow() {
  847. err = errors.New("GetCompanyContractPermissionDetail, Err: " + e.Error())
  848. return
  849. }
  850. if companyPointDetail == nil {
  851. return // 如果不存在就不做研选扣点处理
  852. }
  853. //获取最近的一条审批合同信息
  854. //newCompanyApprovalDetail, e := company.GetCompanyApprovalById(comapnyId)
  855. //if e != nil && e.Error() != utils.ErrNoRow() {
  856. // err = errors.New("GetCompanyApprovalById, Err: " + e.Error())
  857. // return
  858. //}
  859. //if newCompanyApprovalDetail == nil {
  860. // return
  861. //}
  862. //companyContractId := newCompanyApprovalDetail.CompanyContractId
  863. //totalYxPerminssion, e := company.GetCompanyContractPermissionCheck(companyContractId, utils.CHART_PERMISSION_ID_YANXUAN)
  864. //if e != nil {
  865. // err = errors.New("GetCompanyContractPermissionCheck, Err: " + e.Error())
  866. // return
  867. //}
  868. //// 如果最新的审批合同里没有研选的权限,那么就不做处理
  869. //if totalYxPerminssion == 0 {
  870. // return
  871. //}
  872. var billDetailed float64
  873. var content string
  874. //ExpensiveYx int `description:"权益研选: 0->3w; 1->5w;2->10W"` 3W3次、5W 15次,20w:40次 ,
  875. //if companyReportPermissionDetail.ExpensiveYx == 1 {
  876. // billDetailed = 15
  877. // content = "买方研选(5W)转正"
  878. //} else if companyReportPermissionDetail.ExpensiveYx == 2 {
  879. // billDetailed = 40
  880. // content = "买方研选(10w)转正"
  881. //} else {
  882. // billDetailed = 3
  883. // content = "买方研选(3W)转正"
  884. //}
  885. billDetailed = companyPointDetail.Points
  886. content = "签约研选扣点包"
  887. //获取需要添加的流水信息
  888. var items []*models.CygxActivityPointsBill
  889. item := new(models.CygxActivityPointsBill)
  890. //item.UserId = user.UserId
  891. //item.ActivityId = activityId
  892. item.CreateTime = time.Now()
  893. //item.Mobile = user.Mobile
  894. //item.Email = user.Email
  895. item.CompanyId = comapnyDetail.CompanyId
  896. item.CompanyName = comapnyDetail.CompanyName
  897. //item.RealName = user.RealName
  898. item.BillDetailed = billDetailed
  899. item.RegisterPlatform = log.RegisterPlatform
  900. item.AdminId = log.AdminId
  901. item.Source = log.Source
  902. //item.ChartPermissionId = activityInfo.ChartPermissionId
  903. item.DoType = 2
  904. item.Content = content
  905. item.Points = billDetailed
  906. items = append(items, item)
  907. //更新对应机构的剩余点数
  908. var itemCompanys []*models.CygxActivityPointsCompany
  909. itemCompany := new(models.CygxActivityPointsCompany)
  910. itemCompany.CompanyId = comapnyDetail.CompanyId
  911. itemCompany.CompanyName = comapnyDetail.CompanyName
  912. itemCompany.Points = item.Points
  913. itemCompany.CreateTime = time.Now()
  914. itemCompany.ModifyTime = time.Now()
  915. itemCompanys = append(itemCompanys, itemCompany)
  916. //判断是否存在记录,如果有就一个新增一个修改,如果没有就同时新增
  917. if total == 0 {
  918. err = models.AddCygxActivityPointsBillAndCompanyMulti(items, itemCompanys)
  919. } else {
  920. err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  921. }
  922. return
  923. }
  924. // 7:正式专试用定时任务更新研选扣点
  925. func YanXuanCompanyCompanyTryOutReduce(log models.YanXuanActivityPointsRedis) (err error) {
  926. defer func() {
  927. if err != nil {
  928. fmt.Println(err)
  929. go utils.SendAlarmMsg("正式专试用定时任务更新研选扣点更新,处理Redis队列消息失败:"+err.Error()+fmt.Sprint(log), 2)
  930. }
  931. }()
  932. comapnyId := log.ComapnyId
  933. comapny, e := models.GetCompanyById(comapnyId)
  934. if e != nil {
  935. err = errors.New("GetCompanyById" + e.Error())
  936. return
  937. }
  938. // 获取用户所在公司剩余的点
  939. companyPointsNum, e := models.GetCompanyPoints(comapnyId)
  940. if e != nil && e.Error() != utils.ErrNoRow() {
  941. err = errors.New("GetCompanyPoints, Err: " + e.Error())
  942. return
  943. }
  944. if companyPointsNum <= 0 {
  945. return
  946. }
  947. //获取需要添加的流水信息
  948. var items []*models.CygxActivityPointsBill
  949. item := new(models.CygxActivityPointsBill)
  950. //item.UserId = user.UserId
  951. //item.ActivityId = activityId
  952. item.CreateTime = time.Now()
  953. //item.Mobile = user.Mobile
  954. //item.Email = user.Email
  955. item.CompanyId = comapny.CompanyId
  956. item.CompanyName = comapny.CompanyName
  957. //item.RealName = user.RealName
  958. item.BillDetailed = -companyPointsNum
  959. item.RegisterPlatform = log.RegisterPlatform
  960. item.AdminId = log.AdminId
  961. item.Source = log.Source
  962. //item.ChartPermissionId = activityInfo.ChartPermissionId
  963. item.DoType = 2
  964. item.Content = "研选扣点包到期清零"
  965. item.Points = 0
  966. items = append(items, item)
  967. //更新对应机构的剩余点数
  968. var itemCompanys []*models.CygxActivityPointsCompany
  969. itemCompany := new(models.CygxActivityPointsCompany)
  970. itemCompany.CompanyId = comapny.CompanyId
  971. itemCompany.Points = 0
  972. itemCompany.CreateTime = time.Now()
  973. itemCompany.ModifyTime = time.Now()
  974. itemCompanys = append(itemCompanys, itemCompany)
  975. err = models.AddCygxActivityPointsBillMulti(items, itemCompanys)
  976. return
  977. }