integralService.go 14 KB

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