integralService.go 15 KB

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