integralService.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. package service
  2. import (
  3. "fmt"
  4. "log"
  5. "points_service/entity"
  6. "points_service/rpc/integral"
  7. "time"
  8. )
  9. type IntegralService struct{}
  10. //新增积分流水
  11. func (service *IntegralService) IntegralAddService(data entity.FlowJSON) (int64, string) {
  12. orm := entity.Engine
  13. flow := entity.Flow{}
  14. flow.UserId = data.UserId
  15. flow.BusinessTypeId = data.BusinessTypeId
  16. flow.BusinessType = data.BusinessType
  17. flow.PointType = data.PointType
  18. flow.Point = data.Point
  19. flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  20. flow.EndDate = data.EndDate
  21. flow.AppId = data.AppId
  22. flow.Sort = entity.AddCode
  23. var err error
  24. var numb = int64(0)
  25. numb, err = orm.Table("integral_flow").Insert(flow)
  26. if err != nil && numb == 0 {
  27. log.Print("新增流水失败")
  28. return entity.ErrorCode, "新增流水失败"
  29. }
  30. //结存修改
  31. solde := entity.Solde{}
  32. solde.AppId = data.AppId
  33. solde.UserId = data.UserId
  34. solde.EndDate = data.EndDate
  35. if data.OperationType {
  36. //永久积分
  37. //先查看是否有EndDate的积分
  38. soldelist := []entity.Solde{}
  39. err = orm.Table("integral_solde").Where("appId=? and userId=? and endDate=? and (perManEntPoints != 0 AND timePoints = 0) or (perManEntPoints = 0 AND timePoints = 0 ) ", data.AppId, data.UserId, data.EndDate).Find(&soldelist)
  40. if len(soldelist) > 0 {
  41. soldelist[0].PerManEntPoints += data.Point
  42. numb, err = orm.Table("integral_solde").ID(soldelist[0].Id).Cols("perManEntPoints").Update(soldelist[0])
  43. if err != nil && numb == 0 {
  44. log.Print("修改时效积分失败")
  45. return entity.ErrorCode, "修改时效积分失败"
  46. }
  47. } else {
  48. solde.PerManEntPoints = data.Point
  49. numb, err = orm.Table("integral_solde").Insert(&solde)
  50. if err != nil && numb == 0 {
  51. log.Print("新增永久积分失败")
  52. return entity.ErrorCode, "新增永久积分失败"
  53. }
  54. }
  55. } else {
  56. //先查看是否有EndDate的积分
  57. soldelist := []entity.Solde{}
  58. err = orm.Table("integral_solde").Where("appId=? and userId=? and endDate=? and ( perManEntPoints = 0 AND timePoints != 0) or (perManEntPoints = 0 AND timePoints = 0 ) ", data.AppId, data.UserId, data.EndDate).Find(&soldelist)
  59. if len(soldelist) > 0 {
  60. soldelist[0].TimePoints += data.Point
  61. numb, err = orm.Table("integral_solde").ID(soldelist[0].Id).Cols("timePoints").Update(soldelist[0])
  62. if err != nil && numb == 0 {
  63. log.Print("修改时效积分失败")
  64. return entity.ErrorCode, "修改时效积分失败"
  65. }
  66. } else {
  67. solde.TimePoints = data.Point
  68. numb, err = orm.Table("integral_solde").Insert(&solde)
  69. if err != nil && numb == 0 {
  70. log.Print("新增时效积分失败")
  71. return entity.ErrorCode, "新增时效积分失败"
  72. }
  73. }
  74. }
  75. //余额修改
  76. balanceList := []*entity.Balance{}
  77. //查看是否存在本人的余额
  78. err = entity.Engine.Table("integral_balance").Where("appId=? and userId=? ", data.AppId, data.UserId).Find(&balanceList)
  79. if len(balanceList) == 0 {
  80. balance := entity.Balance{}
  81. balance.UserId = data.UserId
  82. balance.AppId = data.AppId
  83. balance.CountPoints = data.Point
  84. numb, err = entity.Engine.Table("integral_balance").Insert(&balance)
  85. if err != nil && numb == 0 {
  86. log.Print("新增余额失败")
  87. return entity.ErrorCode, "新增余额失败"
  88. }
  89. } else {
  90. //修改余额
  91. balanceList[0].CountPoints = balanceList[0].CountPoints + data.Point
  92. numb, err = entity.Engine.Table("integral_balance").ID(balanceList[0].Id).Cols("countPoints").Update(balanceList[0])
  93. if err != nil && numb == 0 {
  94. log.Print("余额新增失败")
  95. return entity.ErrorCode, "余额新增失败"
  96. }
  97. }
  98. return entity.SuccessCode, "余额新增成功"
  99. }
  100. //消耗积分流水
  101. func (service *IntegralService) IntegralConsumeService(data entity.FlowJSON) (int64, string) {
  102. orm := entity.Engine.NewSession()
  103. defer orm.Close()
  104. var err = orm.Begin()
  105. var af = int64(0)
  106. balance := entity.Balance{}
  107. //查询积分余额是否充足
  108. b, err := orm.Table("integral_balance").Select("countPoints,id").
  109. Where("userId = ? AND appId = ?", data.UserId, data.AppId).
  110. Get(&balance)
  111. if !b || err != nil {
  112. log.Printf("积分余额查询出错,userId:[%s],err:[%v]", data.UserId, err)
  113. return entity.ErrorCode, "积分余额不足"
  114. }
  115. if balance.CountPoints < data.Point {
  116. return entity.ErrorCode, "积分余额不足"
  117. }
  118. //结存消耗
  119. soldelist := []entity.Solde{}
  120. err = entity.Engine.Table("integral_solde").
  121. Where("appId=? and userId=? and (endDate = '' OR endDate IS NULL OR endDate >= ?) and (( perManEntPoints != 0 AND timePoints = 0 ) OR ( perManEntPoints = 0 AND timePoints != 0 ))", data.AppId, data.UserId, time.Now().Format("2006-01-02")).
  122. Desc("endDate").
  123. Desc("timePoints").
  124. Find(&soldelist)
  125. if len(soldelist) == 0 {
  126. return entity.ErrorCode, "没有结存可以消耗"
  127. }
  128. var point = data.Point
  129. for _, solde := range soldelist {
  130. if point == 0 {
  131. break
  132. }
  133. if solde.TimePoints == 0 {
  134. //消耗永久积分
  135. if solde.PerManEntPoints >= point {
  136. //够消耗
  137. solde.PerManEntPoints = solde.PerManEntPoints - point
  138. point = 0
  139. af, err = entity.Engine.Table("integral_solde").
  140. ID(solde.Id).
  141. Cols("perManEntPoints").
  142. Update(solde)
  143. if err != nil && af == 0 {
  144. log.Print("消耗永久积分失败")
  145. orm.Rollback()
  146. return entity.ErrorCode, "消耗永久积分失败"
  147. }
  148. }
  149. } else {
  150. //消耗时效积分
  151. if solde.TimePoints > point {
  152. solde.TimePoints = solde.TimePoints - point
  153. //够消耗
  154. point = 0
  155. af, err = entity.Engine.Table("integral_solde").
  156. ID(solde.Id).
  157. Cols("timePoints").
  158. Update(solde)
  159. if err != nil && af == 0 {
  160. log.Print("消耗时效积分失败")
  161. orm.Rollback()
  162. return entity.ErrorCode, "消耗时效积分失败"
  163. }
  164. break
  165. }
  166. //不够消耗
  167. point = point - solde.TimePoints
  168. solde.TimePoints = 0
  169. af, err = entity.Engine.Table("integral_solde").
  170. ID(solde.Id).
  171. Cols("timePoints").
  172. Update(solde)
  173. if err != nil && af == 0 {
  174. log.Print("消耗时效积分失败")
  175. orm.Rollback()
  176. return entity.ErrorCode, "消耗时效积分失败"
  177. }
  178. }
  179. }
  180. //余额消耗
  181. balance.CountPoints = balance.CountPoints - data.Point
  182. af, err = entity.Engine.Table("integral_balance").
  183. ID(balance.Id).
  184. Cols("countPoints").
  185. Update(balance)
  186. if err != nil && af == 0 {
  187. log.Print("余额扣除失败")
  188. orm.Rollback()
  189. return entity.ErrorCode, "余额扣除失败"
  190. }
  191. //消耗积分流水记录
  192. flow := entity.Flow{}
  193. flow.UserId = data.UserId
  194. flow.PointType = data.PointType
  195. flow.BusinessTypeId = data.BusinessTypeId
  196. flow.BusinessType = data.BusinessType
  197. flow.Point = data.Point
  198. flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  199. flow.EndDate = data.EndDate
  200. flow.AppId = data.AppId
  201. flow.Sort = entity.ReduceCode
  202. af, err = orm.Table("integral_flow").Insert(&flow)
  203. if err != nil && af == 0 {
  204. log.Print("积分记录失败")
  205. orm.Rollback()
  206. return entity.ErrorCode, "积分记录失败"
  207. }
  208. err = orm.Commit()
  209. if err != nil {
  210. return entity.ErrorCode, "积分消耗失败"
  211. }
  212. return entity.SuccessCode, "积分消耗成功"
  213. }
  214. //到期积分查询
  215. func (service *IntegralService) IntegralExpireCheckService(data entity.ExpireJSON) (int64, int64) {
  216. orm := entity.Engine
  217. var solde entity.Solde
  218. var err error
  219. af, err := orm.Table("integral_solde").
  220. Select("SUM( timePoints ) AS timePoints").
  221. Where("userId = ? AND appId = ? AND endDate < ? ", data.UserId, data.AppId, data.EndDate).
  222. Get(&solde)
  223. if !af || err != nil {
  224. log.Println(err)
  225. return entity.ErrorCode, 0
  226. }
  227. return entity.SuccessCode, solde.TimePoints
  228. }
  229. /*//结存新增
  230. func (service *IntegralService) IntegralSoldeService(model entity.SoldeUpdate) (bool, string) {
  231. solde := entity.Solde{}
  232. solde.AppId = model.AppId
  233. solde.UserId = model.UserId
  234. solde.EndDate = model.EndDate
  235. var err error
  236. var numb = int64(0)
  237. //新增积分
  238. if model.PointsType {
  239. //永久积分
  240. solde.PerManEntPoints = model.Points
  241. numb, err = entity.Engine.Table("integral_solde").Insert(&solde)
  242. if err != nil && numb == 0 {
  243. log.Print("新增永久积分失败")
  244. return false, "新增永久积分失败"
  245. }
  246. return true, "新增永久积分成功"
  247. }
  248. //时效积分
  249. //先查看是否有EndDate的积分
  250. soldelist := []entity.Solde{}
  251. err = entity.Engine.Table("integral_solde").Where("appId=? and userId=? and endDate=? ", model.AppId, model.UserId, model.EndDate).Find(&soldelist)
  252. if len(soldelist) > 0 {
  253. soldelist[0].TimePoints += model.Points
  254. numb, err = entity.Engine.Table("integral_solde").ID(soldelist[0].Id).Cols("timePoints").Update(soldelist[0])
  255. if err != nil && numb == 0 {
  256. log.Print("修改时效积分失败")
  257. return false, "修改时效积分失败"
  258. }
  259. return true, "修改时效积分成功"
  260. } else {
  261. solde.TimePoints = model.Points
  262. numb, err = entity.Engine.Table("integral_solde").Insert(&solde)
  263. if err != nil && numb == 0 {
  264. log.Print("新增时效积分失败")
  265. return false, "新增时效积分失败"
  266. }
  267. return true, "新增时效积分成功"
  268. }
  269. }
  270. //结存扣除
  271. func (service *IntegralService) IntegralSoldeReduceService(model entity.SoldeUpdate) (bool, string) {
  272. var err error
  273. var numb = int64(0)
  274. soldelist := []entity.Solde{}
  275. err = entity.Engine.Table("integral_solde").Where("appId=? and userId=? and endDate> ? ( perManEntPoints != 0 AND timePoints = 0 ) OR ( perManEntPoints = 0 AND timePoints != 0 )", model.AppId, model.UserId, time.Now().Format("2006/01/02/")).Desc("endDate,timePoints").Find(&soldelist)
  276. if len(soldelist) > 0 {
  277. var point = model.Points
  278. for _, solde := range soldelist {
  279. if point == 0 {
  280. return true, "积分消耗成功"
  281. }
  282. if solde.TimePoints == 0 {
  283. //消耗永久积分
  284. if solde.PerManEntPoints >= point {
  285. //够消耗
  286. point = 0
  287. solde.PerManEntPoints = solde.PerManEntPoints - point
  288. numb, err = entity.Engine.Table("integral_solde").ID(solde.Id).Cols("perManEntPoints").Update(solde)
  289. if err != nil && numb == 0 {
  290. log.Print("消耗永久积分失败")
  291. return false, "消耗永久积分失败"
  292. }
  293. }
  294. }
  295. //消耗时效积分
  296. if solde.TimePoints > point {
  297. //够消耗
  298. point = 0
  299. solde.TimePoints = solde.TimePoints - point
  300. numb, err = entity.Engine.Table("integral_solde").ID(solde.Id).Cols("timePoints").Update(solde)
  301. if err != nil && numb == 0 {
  302. log.Print("消耗时效积分失败")
  303. return false, "消耗时效积分失败"
  304. }
  305. return true, "消耗时效积分成功"
  306. }
  307. //不够消耗
  308. point = point - solde.TimePoints
  309. solde.TimePoints = 0
  310. numb, err = entity.Engine.Table("integral_solde").ID(solde.Id).Cols("timePoints").Update(solde)
  311. if err != nil && numb == 0 {
  312. log.Print("消耗时效积分失败")
  313. return false, "消耗时效积分失败"
  314. }
  315. }
  316. }
  317. return false, "没有积分可以扣除"
  318. }
  319. //调整余额
  320. func (service *IntegralService) IntegralBalanceService(model entity.BalanceUpdate) (bool, string) {
  321. var err error
  322. var numb = int64(0)
  323. fmt.Println(numb)
  324. balanceList := []*entity.Balance{}
  325. //查看是否存在本人的余额
  326. err = entity.Engine.Table("integral_balance").Where("appId=? and userId=? ", model.AppId, model.UserId).Find(&balanceList)
  327. if model.Change {
  328. //新增
  329. if len(balanceList) == 0 {
  330. balance := entity.Balance{}
  331. balance.UserId = model.UserId
  332. balance.AppId = model.AppId
  333. balance.CountPoints = model.CountPoints
  334. numb, err = entity.Engine.Table("integral_balance").Insert(&balance)
  335. if err != nil && numb == 0 {
  336. log.Print("新增余额失败")
  337. return false, "新增余额失败"
  338. }
  339. }
  340. //修改余额
  341. balanceList[0].CountPoints = balanceList[0].CountPoints + model.CountPoints
  342. }
  343. //消耗
  344. if len(balanceList) == 0 {
  345. log.Println("没有积分可以扣除")
  346. return false, "没有积分可以扣除"
  347. }
  348. if balanceList[0].CountPoints < model.CountPoints {
  349. log.Println("积分余额不足")
  350. return false, "积分余额不足"
  351. }
  352. balanceList[0].CountPoints = balanceList[0].CountPoints - model.CountPoints
  353. numb, err = entity.Engine.Table("integral_balance").ID(balanceList[0].Id).Cols("countPoints").Update(balanceList[0])
  354. if err != nil && numb == 0 {
  355. log.Print("余额扣除失败")
  356. return false, "余额扣除失败"
  357. }
  358. return true, "余额扣除失败"
  359. }
  360. */
  361. //积分守护
  362. func (service *IntegralService) IntegralGuardService(endDate string) bool {
  363. orm := entity.Engine.NewSession()
  364. defer orm.Close()
  365. err := orm.Begin()
  366. soldelist := []entity.Solde{}
  367. err = orm.Table("integral_solde").
  368. Where("timePoints != 0 AND endDate < ? ", endDate).
  369. Desc("endDate").Find(&soldelist)
  370. if err != nil {
  371. log.Println("积分结存查询失败")
  372. }
  373. for _, solde := range soldelist {
  374. //查询积分余额是否充足
  375. balance := entity.Balance{}
  376. b, err := orm.Table("integral_balance").Select("countPoints,id").
  377. Where("userId = ? AND appId = ?", solde.UserId, solde.AppId).
  378. Get(&balance)
  379. if !b || err != nil {
  380. log.Printf("积分余额查询出错,userId:[%s],err:[%v]", solde.UserId, err)
  381. return false
  382. }
  383. if balance.CountPoints < solde.TimePoints {
  384. return false
  385. }
  386. //积分余额-时效过期积分=当前总积分余额
  387. balance.CountPoints = balance.CountPoints - solde.TimePoints
  388. orm.Table("integral_balance")
  389. numb, err := orm.Table("integral_balance").
  390. ID(balance.Id).
  391. Cols("countPoints").
  392. Update(balance)
  393. if err != nil && numb == 0 {
  394. log.Print("余额扣除失败")
  395. orm.Rollback()
  396. return false
  397. }
  398. //积分过期流水记录
  399. flow := entity.Flow{}
  400. flow.UserId = solde.UserId
  401. flow.PointType = 2004
  402. flow.BusinessTypeId = 0
  403. flow.BusinessType = "0"
  404. flow.Point = solde.TimePoints
  405. flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
  406. flow.EndDate = solde.EndDate
  407. flow.AppId = solde.AppId
  408. flow.Sort = entity.ReduceCode
  409. af, err := orm.Table("integral_flow").Insert(&flow)
  410. if err != nil && af == 0 {
  411. log.Print("积分记录失败")
  412. orm.Rollback()
  413. return false
  414. }
  415. //清空过期积分的时效积分
  416. soldeUpdate := &entity.Solde{}
  417. soldeUpdate.TimePoints = 0
  418. af, err = orm.Table("integral_solde").
  419. Cols("timePoints").
  420. ID(solde.Id).
  421. Update(soldeUpdate)
  422. if af == 0 && err != nil {
  423. log.Println("过期时效积分清空失败", solde.Id)
  424. orm.Rollback()
  425. return false
  426. }
  427. }
  428. err = orm.Commit()
  429. if err != nil {
  430. return false
  431. }
  432. return true
  433. }
  434. //积分余额查询
  435. func (service *IntegralService) IntegralBalanceCheckService(userId string, appId int64) (bool, int64) {
  436. orm := entity.Engine
  437. balance := entity.Balance{}
  438. b, err := orm.Table("integral_balance").
  439. Where("userId = ? AND appId = ?", userId, appId).
  440. Get(&balance)
  441. if !b || err != nil {
  442. log.Println("积分余额查询失败")
  443. return false, 0
  444. }
  445. return true, balance.CountPoints
  446. }
  447. //按月查询积分使用情况
  448. func (service *IntegralService) IntegralDetailedCheck(data entity.FlowJSON) ([]*integral.Point, int64) {
  449. orm := entity.Engine
  450. var flowList []*entity.FlowReq
  451. numb, err := orm.Table("integral_flow").Alias("flow").
  452. Select("flow.*,pt.name").
  453. Join("left", "point_type pt", "flow.pointType=pt.code").
  454. Where("flow.userId = ? AND flow.appId = ? AND DATE_FORMAT(flow.createTime,'%Y-%m')=? ", data.UserId, data.AppId, data.EndDate).
  455. Desc("flow.createTime").
  456. Limit(int(data.PageSize), (int(data.Page - 1))*int(data.PageSize)).
  457. FindAndCount(&flowList)
  458. var flowReq []*integral.Point
  459. for _, value := range flowList {
  460. point:=integral.Point{}
  461. point.EndDate=value.EndDate
  462. point.Sort=value.Sort
  463. point.Point= value.Point
  464. point.CreateTime=value.CreateTime
  465. point.PointType=value.PointType
  466. point.BusinessTypeId=value.BusinessTypeId
  467. point.BusinessType=value.BusinessType
  468. point.Name=value.Name
  469. flowReq=append(flowReq,&point )
  470. }
  471. fmt.Println(flowList)
  472. if err != nil {
  473. log.Println(err)
  474. return nil, int64(0)
  475. }
  476. return flowReq, numb
  477. }