ActivityService.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. package service
  2. import (
  3. "app.yhyue.com/moapp/jyMarketing/entity"
  4. "app.yhyue.com/moapp/jyMarketing/rpc/activity"
  5. "app.yhyue.com/moapp/jyMarketing/util"
  6. "fmt"
  7. _ "github.com/garyburd/redigo/redis"
  8. "log"
  9. "time"
  10. )
  11. type ActivityService struct{}
  12. //奖券获取
  13. func (service *ActivityService) LotteryReceive(data *activity.LotteryOperation, code string) (int64, string) {
  14. orm := entity.Engine.NewSession()
  15. defer orm.Close()
  16. err := orm.Begin()
  17. bool := true
  18. if len(data.LotteryIdArr) == 0 {
  19. return entity.ErrorCode, "没有卷可以领取"
  20. }
  21. for _, lotteryId := range data.LotteryIdArr {
  22. if fool, _ := util.Exists(code, "lottery_"+fmt.Sprint(lotteryId)); !fool {
  23. orm.Rollback()
  24. return entity.ErrorCode, "奖卷领取失败"
  25. }
  26. log.Println(fmt.Sprint(lotteryId) + "Id奖券领取")
  27. //每种劵处理
  28. //1、先查询奖券信息
  29. prizeData := entity.PrizeJson{}
  30. bool, err = orm.Table("lottery").
  31. Alias("l").Select("l.name,l.full,l.reduce, l.prizeId,p.beginDate,p.endDate,p.isLimitNumber,p.limitNumber,p.validityDates,p.validityTimeType").
  32. Join("left", "prize p", "l.prizeId=p.id").
  33. Where("l.id=?", lotteryId).Get(&prizeData)
  34. if err != nil {
  35. log.Panicln("查询奖品信息:", err)
  36. orm.Rollback()
  37. return entity.ErrorCode, "奖品信息查询失败"
  38. }
  39. if !bool {
  40. log.Panicln("查询奖品信息:", err)
  41. orm.Rollback()
  42. return entity.ErrorCode, "奖品信息查询失败"
  43. }
  44. //2、查看活动是否开始
  45. activity := entity.Activity{}
  46. bool, err = orm.Table("activity").Where("prizeId=? and state=1", prizeData.PrizeId).Get(&activity)
  47. if !bool {
  48. log.Panicln("查询奖品信息:", err)
  49. orm.Rollback()
  50. return entity.ErrorCode, "奖品信息查询失败"
  51. }
  52. if !activityTime(activity.BeginDate) {
  53. log.Panicln("活动没有开始不可领劵", activity)
  54. orm.Rollback()
  55. return entity.ErrorCode, "活动没有开始不可领劵"
  56. }
  57. //3、先判断奖券是否可以重复领取,在判断之前是否领取过
  58. if prizeData.IsLimitNumber == 1 {
  59. //查询之前是否领取过
  60. userLotteryList := []entity.UserPrize{}
  61. err = orm.Table("user_prize").
  62. Where("userId=? and appId=? and lotteryId=?", data.UserId, data.AppId, lotteryId).Find(&userLotteryList)
  63. if err != nil {
  64. log.Panicln("查询奖品信息:", err)
  65. orm.Rollback()
  66. return entity.ErrorCode, "查询领取次数失败"
  67. }
  68. if len(userLotteryList) >= prizeData.LimitNumber {
  69. orm.Rollback()
  70. return entity.ErrorCode, "你领取奖券数量已达上限"
  71. }
  72. }
  73. //5、领取奖券
  74. userLettry := entity.UserPrize{}
  75. userLettry.AppId = data.AppId
  76. userLettry.UserId = data.UserId
  77. userLettry.PrizeType = 0
  78. userLettry.CreateTime =time.Now().Local()
  79. userLettry.LotteryId = lotteryId
  80. userLettry.PrizeId = prizeData.PrizeId
  81. userLettry.ValidityDates = prizeData.ValidityDates
  82. userLettry.Name = prizeData.Name
  83. userLettry.Full = int64(prizeData.Full)
  84. userLettry.Reduce = int64(prizeData.Reduce)
  85. userLettry.UserName = data.UserName
  86. //0、有起止时间1、当天起几天可用2、次日起几天可用
  87. switch prizeData.ValidityTimeType {
  88. case 0:
  89. userLettry.EndDate = prizeData.EndDate
  90. userLettry.BeginDate = prizeData.BeginDate
  91. case 1:
  92. nowStr := time.Now().Format("2006-01-02")
  93. userLettry.BeginDate = nowStr
  94. userLettry.EndDate = service.ObtainAppointTimeString(nowStr, prizeData.ValidityDates)
  95. case 2:
  96. nowStr := time.Now().Format("2006-01-02")
  97. nextDayStr := service.ObtainAppointTimeString(nowStr, 1)
  98. userLettry.BeginDate = nextDayStr
  99. userLettry.EndDate = service.ObtainAppointTimeString(nextDayStr, prizeData.ValidityDates)
  100. }
  101. numb, err := orm.Table("user_prize").Insert(&userLettry)
  102. if err != nil || numb == int64(0) {
  103. log.Panicln("领取奖券失败:", err)
  104. orm.Rollback()
  105. return entity.ErrorCode, "领取奖券失败"
  106. }
  107. //6、修改奖券余额数量
  108. lottery := entity.Lottery{}
  109. lottery.Id = lotteryId
  110. _, err = orm.Exec("UPDATE lottery SET `stockNumber` = stockNumber-1, `receiveNumber` = receiveNumber+1 WHERE `id` = ?", lotteryId)
  111. if err != nil {
  112. log.Panicln("修改奖券库存失败:", err)
  113. orm.Rollback()
  114. return entity.ErrorCode, "修改奖券库存失败"
  115. }
  116. //7、修改redis余额
  117. if util.GetInt(code, "lottery_"+fmt.Sprint(lotteryId)) <= 0 {
  118. log.Panicln("奖券余额不足:", err)
  119. orm.Rollback()
  120. return entity.ErrorCode, "奖券余额不足"
  121. }
  122. if !util.DecrbyLimit(code, "lottery_"+fmt.Sprint(lotteryId), 1, 0) {
  123. log.Panicln("修改redis奖券库存失败:", err)
  124. orm.Rollback()
  125. return entity.ErrorCode, "修改redis奖券库存失败"
  126. }
  127. }
  128. orm.Commit()
  129. return entity.SuccessCode, "奖券领取成功"
  130. }
  131. //奖券使用
  132. func (service *ActivityService) ActivityUse(data *activity.LotteryOperation) (int64, string) {
  133. orm := entity.Engine.NewSession()
  134. defer orm.Close()
  135. err := orm.Begin()
  136. //nowStr := time.Now().Format("2006-01-02")
  137. for _, lotteryId := range data.LotteryIdArr {
  138. //1、先查看是否有这张奖券
  139. var userLottery entity.UserPrize
  140. bool := true
  141. bool, err = orm.Table("user_prize").
  142. Where("userId=? and appId=? and id=? ", data.UserId, data.AppId, lotteryId).Get(&userLottery)
  143. if err != nil {
  144. log.Println("查询奖券库存失败:", err)
  145. orm.Rollback()
  146. return entity.ErrorCode, "查询奖券库存失败"
  147. }
  148. if !bool {
  149. log.Println(data.UserId, "用户没有ID为", lotteryId, "的奖券")
  150. orm.Rollback()
  151. return entity.ErrorCode, "该用户没有此此奖券"
  152. }
  153. //2、奖券是否过期
  154. if activityTime(userLottery.EndDate) {
  155. log.Println(data.UserId, "此卷已过期不可使用", userLottery)
  156. orm.Rollback()
  157. return entity.ErrorCode, "此卷已过期不可使用"
  158. }
  159. //3、奖券状态改为已使用
  160. userLottery.UseDate = time.Now().Local()
  161. userLottery.PrizeType = 1
  162. userLottery.OrderCode = data.OrderCode
  163. numb, err := orm.Table("user_prize").ID(userLottery.Id).Cols("prizeType", "useDate","orderCode").Update(userLottery)
  164. if err != nil || numb == 0 {
  165. log.Println("修改用户奖券失败:", err)
  166. orm.Rollback()
  167. return entity.ErrorCode, "修改用户奖券失败"
  168. }
  169. //4、修改卷的使用量
  170. lottery := entity.Lottery{}
  171. lottery.Id = lotteryId
  172. _, err = orm.Exec("UPDATE lottery SET `useNumber` = useNumber+1 WHERE `id` = ?", lotteryId)
  173. if err != nil || numb == 0 {
  174. log.Println("修改奖券使用数量失败:", err)
  175. orm.Rollback()
  176. return entity.ErrorCode, "修改奖券使用数量失败"
  177. }
  178. }
  179. orm.Commit()
  180. return entity.SuccessCode, "使用奖券成功"
  181. }
  182. //活动下的奖券
  183. func (service *ActivityService) ActivityLottery(in *activity.Request) (int64, string, []entity.LotteryJson) {
  184. orm := entity.Engine.NewSession()
  185. defer orm.Close()
  186. err := orm.Begin()
  187. //1、先查找活动下的奖品Id
  188. lotteryJsonList := []entity.LotteryJson{}
  189. err = orm.Table("activity").Alias("a").
  190. Select(" p.limitNumber,UseProductList,( select count(up.id) FROM user_prize up where up.lotteryId = l.id AND up.userId ='"+in.UserId+"' ) AS count,p.isLimitNumber,p.validityTimeType,p.validityDates,p.instructions,p.remark,l.id as lotteryId ,l.name ").
  191. Join("left", "prize p", " a.prizeId = p.Id").
  192. Join("left", "lottery l", " l.prizeId = p.id ").
  193. Where("a.id = ? and a.appId=? ", in.ActivityId, in.AppId).Find(&lotteryJsonList)
  194. if err != nil {
  195. log.Println("用户下的奖券查询失败:", err)
  196. orm.Rollback()
  197. return entity.ErrorCode, "用户下的奖券查询失败", lotteryJsonList
  198. }
  199. orm.Commit()
  200. return entity.SuccessCode, "活动下的奖券", lotteryJsonList
  201. }
  202. //用户下的奖券(不包含待使用的 )
  203. func (service *ActivityService) UserLottery(data *activity.Request) (int64, string, []entity.UserPrizeJson, int64) {
  204. orm := entity.Engine.NewSession()
  205. defer orm.Close()
  206. err := orm.Begin()
  207. userLettryList := []entity.UserPrizeJson{}
  208. nowStr := time.Now().Format("2006-01-02")
  209. count := int64(0)
  210. switch data.Model {
  211. case 0:
  212. //查看可以使用的奖券(没有过期的)
  213. condition:=""
  214. if data.Model!=0{
  215. condition="( up.prizeType=0 or up.id="+data.Model+") "
  216. }else{
  217. }
  218. count, err = orm.Table("user_prize").Alias("up").Select("up.*,a.useProductList").
  219. Join("left", "activity a ", "a.prizeId=up.prizeId").
  220. Where("up.userId=? and up.appId=? and up.endDate>=?", data.UserId, data.AppId, nowStr).
  221. And("up.prizeType=0 ").
  222. Limit(int(data.PageSize), (int(data.Page - 1))*int(data.PageSize)).
  223. Desc("up.createTime").
  224. FindAndCount(&userLettryList)
  225. case 1:
  226. //查看名下所有奖券
  227. count, err = orm.Table("user_prize").Alias("up").Select("up.*,a.useProductList").
  228. Join("left", "activity a ", "a.prizeId=up.prizeId").
  229. Where("up.userId=? and up.appId=?", data.UserId, data.AppId).Desc("up.createTime").
  230. Limit(int(data.PageSize), (int(data.Page - 1))*int(data.PageSize)).
  231. FindAndCount(&userLettryList)
  232. case 2:
  233. //过期的奖券
  234. count, err = orm.Table("user_prize").Alias("up").Select("up.*,a.useProductList").
  235. Join("left", "activity a ", "a.prizeId=up.prizeId").
  236. Where("up.userId=? and up.appId=? ", data.UserId, data.AppId, ).
  237. And("up.prizeType=2").
  238. Desc("up.createTime").Limit(int(data.PageSize), (int(data.Page - 1))*int(data.PageSize)).
  239. FindAndCount(&userLettryList)
  240. case 3:
  241. //已用的奖券
  242. count, err = orm.Table("user_prize").Alias("up").Select("up.*,a.useProductList").
  243. Join("left", "activity a ", "a.prizeId=up.prizeId").
  244. Where("up.userId=? and up.appId=? and (up.prizeType=1 or up.prizeType=3)", data.UserId, data.AppId, ).
  245. Desc("up.createTime").
  246. Limit(int(data.PageSize), (int(data.Page - 1))*int(data.PageSize)).FindAndCount(&userLettryList)
  247. }
  248. if err != nil {
  249. log.Println("用户下的奖券查询失败:", err)
  250. orm.Rollback()
  251. return entity.ErrorCode, "用户下的奖券查询失败", userLettryList, count
  252. }
  253. orm.Commit()
  254. return entity.SuccessCode, "用户下的奖券查询成功", userLettryList, count
  255. }
  256. //计算几天之后的时间
  257. func (service *ActivityService) ObtainAppointTimeString(now string, beApartDay int) string {
  258. local, _ := time.LoadLocation("Local")
  259. t, _ := time.ParseInLocation("2006-01-02", now, local)
  260. stopTime := t.AddDate(0, 0, beApartDay)
  261. stopTimeStr := stopTime.Format("2006-01-02")
  262. return stopTimeStr
  263. }
  264. //查询过期的奖券改为已过期
  265. func (service *ActivityService) UpdateLottery(endDate string) (int64, string) {
  266. orm := entity.Engine.NewSession()
  267. defer orm.Close()
  268. err := orm.Begin()
  269. //1、先查找过期的奖券
  270. userPrizeList := []entity.UserPrize{}
  271. err = orm.Table("user_prize").
  272. Where("endDate<? and (prizeType=0 or prizeType=3) ", endDate).Find(&userPrizeList)
  273. if err != nil {
  274. log.Println("查询过期奖券失败:", err)
  275. orm.Rollback()
  276. return entity.ErrorCode, "查询过期奖券失败"
  277. }
  278. for _, value := range userPrizeList {
  279. value.PrizeType = 2
  280. numb, err := orm.Table("user_prize").ID(value.Id).Cols("prizeType").Update(value)
  281. if err != nil || numb == 0 {
  282. log.Println("修改奖券使用数量失败:", err)
  283. orm.Rollback()
  284. return entity.ErrorCode, "修改奖券使用数量失败"
  285. }
  286. }
  287. orm.Commit()
  288. return entity.SuccessCode, "过期奖券处理成功"
  289. }
  290. //活动创建及修改时间需大于当前时间
  291. func activityTime(beginDate interface{}) bool {
  292. timeData := time.Now().Format("2006-01-02")
  293. if timeData >= fmt.Sprint(beginDate) {
  294. return true
  295. }
  296. return false
  297. }
  298. //待使用与未使用状态之间变化
  299. func (service *ActivityService) LotteryStateChange(data *activity.UpdateStateReq) (int64, string) {
  300. orm := entity.Engine.NewSession()
  301. defer orm.Close()
  302. err := orm.Begin()
  303. //先查询奖券状态
  304. var userLottery entity.UserPrize
  305. bool := true
  306. bool, err = orm.Table("user_prize").
  307. Where("userId=? and appId=? and id=? ", data.UserId, data.AppId,data.UserLotteryId).
  308. Asc("createTime").Get(&userLottery)
  309. if err != nil {
  310. log.Println("查询奖券库存失败:", err)
  311. orm.Rollback()
  312. return entity.ErrorCode, "查询奖券库存失败"
  313. }
  314. if !bool {
  315. log.Println(data.UserId, "用户没有ID为", data.UserLotteryId, "的奖券")
  316. orm.Rollback()
  317. return entity.ErrorCode, "该用户没有此此奖券"
  318. }
  319. //未使用改为待使用
  320. if data.Model {
  321. if (userLottery.PrizeType == 0) {
  322. //奖券状态改为待使用
  323. userLottery.PrizeType = 3
  324. userLottery.OrderCode = data.OrderCode
  325. numb, err := orm.Table("user_prize").ID(userLottery.Id).Cols("prizeType", "OrderCode").Update(userLottery)
  326. if err != nil || numb == 0 {
  327. log.Println("修改用户奖券失败:", err)
  328. orm.Rollback()
  329. return entity.ErrorCode, "修改用户奖券失败"
  330. }
  331. orm.Commit()
  332. return entity.SuccessCode, "修改用户奖券成功"
  333. }else if userLottery.PrizeType==3{
  334. return entity.SuccessCode, "修改用户奖券成功"
  335. }
  336. return entity.ErrorCode, "该奖券状态不可修改"
  337. } else {
  338. if (userLottery.PrizeType == 3) {
  339. //奖券状态改为待使用
  340. userLottery.PrizeType = 0
  341. userLottery.OrderCode =""
  342. numb, err := orm.Table("user_prize").ID(userLottery.Id).Cols("prizeType","orderCode").Update(userLottery)
  343. if err != nil || numb == 0 {
  344. log.Println("修改用户奖券失败:", err)
  345. orm.Rollback()
  346. return entity.ErrorCode, "修改用户奖券失败"
  347. }
  348. orm.Commit()
  349. return entity.SuccessCode, "修改用户奖券成功"
  350. }else if(userLottery.PrizeType==2){
  351. orm.Commit()
  352. return entity.SuccessCode, "修改用户奖券成功"
  353. }
  354. return entity.ErrorCode, "该奖券状态不可修改"
  355. }
  356. //待使用改为未使用
  357. }