123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530 |
- package service
- import (
- "fmt"
- "log"
- "app.yhyue.com/moapp/jyPoints/entity"
- "app.yhyue.com/moapp/jyPoints/rpc/integral"
- "time"
- )
- type IntegralService struct{}
- //新增积分流水
- func (service *IntegralService) IntegralAddService(data entity.FlowJSON) (int64, string) {
- orm := entity.Engine.NewSession()
- defer orm.Close()
- err := orm.Begin()
- flow := entity.Flow{}
- flow.UserId = data.UserId
- flow.BusinessTypeId = data.BusinessTypeId
- flow.BusinessType = data.BusinessType
- flow.PointType = data.PointType
- flow.Point = data.Point
- flow.EndDate=data.EndDate
- flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
- flow.AppId = data.AppId
- flow.Sort = entity.AddCode
- var numb = int64(0)
- numb, err = orm.Table("integral_flow").Insert(flow)
- if err != nil && numb == 0 {
- log.Print("新增流水失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "新增流水失败"
- }
- //结存修改
- solde := entity.Solde{}
- solde.AppId = data.AppId
- solde.UserId = data.UserId
- if data.OperationType {
- //永久积分
- //先查看是否有EndDate的积分
- soldelist := []entity.Solde{}
- err = orm.Table("integral_solde").Where("appId=? and userId=? and endDate='' and perManEntPoints != 0 AND timePoints = 0 ", data.AppId, data.UserId).Find(&soldelist)
- if len(soldelist) > 0 {
- soldelist[0].PerManEntPoints += data.Point
- numb, err = orm.Table("integral_solde").ID(soldelist[0].Id).Cols("perManEntPoints").Update(soldelist[0])
- if err != nil || numb == 0 {
- log.Print("修改时效积分失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "修改时效积分失败"
- }
- } else {
- solde.PerManEntPoints = data.Point
- numb, err = orm.Table("integral_solde").Insert(&solde)
- if err != nil || numb == 0 {
- log.Print("新增永久积分失败")
- orm.Rollback()
- return entity.ErrorCode, "新增永久积分失败"
- }
- }
- } else {
- solde.EndDate = data.EndDate
- //先查看是否有EndDate的积分
- soldelist := []entity.Solde{}
- 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)
- if len(soldelist) > 0 {
- soldelist[0].TimePoints += data.Point
- numb, err = orm.Table("integral_solde").ID(soldelist[0].Id).Cols("timePoints").Update(soldelist[0])
- if err != nil || numb == 0 {
- log.Print("修改时效积分失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "修改时效积分失败"
- }
- } else {
- solde.TimePoints = data.Point
- numb, err = orm.Table("integral_solde").Insert(&solde)
- if err != nil && numb == 0 {
- log.Print("新增时效积分失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "新增时效积分失败"
- }
- }
- }
- //余额修改
- balanceList := []*entity.Balance{}
- //查看是否存在本人的余额
- err = orm.Table("integral_balance").Where("appId=? and userId=? ", data.AppId, data.UserId).Find(&balanceList)
- if len(balanceList) == 0 {
- balance := entity.Balance{}
- balance.UserId = data.UserId
- balance.AppId = data.AppId
- balance.CountPoints = data.Point
- numb, err = orm.Table("integral_balance").Insert(&balance)
- if err != nil || numb == 0 {
- log.Print("新增余额失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "新增余额失败"
- }
- } else {
- //修改余额
- balanceList[0].CountPoints = balanceList[0].CountPoints + data.Point
- numb, err = orm.Table("integral_balance").ID(balanceList[0].Id).Cols("countPoints").Update(balanceList[0])
- if err != nil || numb == 0 {
- log.Print("余额新增失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "余额新增失败"
- }
- }
- err = orm.Commit()
- if err != nil {
- log.Print("积分新增失败:", err)
- return entity.ErrorCode, "积分新增失败"
- }
- return entity.SuccessCode, "余额新增成功"
- }
- //消耗积分流水
- func (service *IntegralService) IntegralConsumeService(data entity.FlowJSON) (int64, string) {
- orm := entity.Engine.NewSession()
- defer orm.Close()
- var err = orm.Begin()
- var af = int64(0)
- balance := entity.Balance{}
- //查询积分余额是否充足
- b, err := orm.Table("integral_balance").Select("countPoints,id").
- Where("userId = ? AND appId = ?", data.UserId, data.AppId).
- Get(&balance)
- if !b || err != nil {
- log.Printf("积分余额查询出错,userId:[%s],err:[%v]", data.UserId, err)
- return entity.ErrorCode, "积分余额不足"
- }
- if balance.CountPoints < data.Point {
- return entity.ErrorCode, "积分余额不足"
- }
- //结存消耗
- soldelist := []entity.Solde{}
- err = orm.Table("integral_solde").
- 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")).
- Desc("endDate").
- Desc("timePoints").
- Find(&soldelist)
- if len(soldelist) == 0 {
- return entity.ErrorCode, "没有结存可以消耗"
- }
- var point = data.Point
- for _, solde := range soldelist {
- if point == 0 {
- break
- }
- if solde.TimePoints == 0 {
- //消耗永久积分
- if solde.PerManEntPoints >= point {
- //够消耗
- solde.PerManEntPoints = solde.PerManEntPoints - point
- point = 0
- af, err = orm.Table("integral_solde").
- ID(solde.Id).
- Cols("perManEntPoints").
- Update(solde)
- if err != nil || af == 0 {
- log.Print("消耗永久积分失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "消耗永久积分失败"
- }
- }
- } else {
- //消耗时效积分
- if solde.TimePoints > point {
- solde.TimePoints = solde.TimePoints - point
- //够消耗
- point = 0
- af, err = orm.Table("integral_solde").
- ID(solde.Id).
- Cols("timePoints").
- Update(solde)
- if err != nil || af == 0 {
- log.Print("消耗时效积分失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "消耗时效积分失败"
- }
- break
- }
- //不够消耗
- point = point - solde.TimePoints
- solde.TimePoints = 0
- af, err = orm.Table("integral_solde").
- ID(solde.Id).
- Cols("timePoints").
- Update(solde)
- if err != nil || af == 0 {
- log.Print("消耗时效积分失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "消耗时效积分失败"
- }
- }
- }
- //余额消耗
- balance.CountPoints = balance.CountPoints - data.Point
- af, err = orm.Table("integral_balance").
- ID(balance.Id).
- Cols("countPoints").
- Update(balance)
- if err != nil || af == 0 {
- log.Print("余额扣除失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "余额扣除失败"
- }
- //消耗积分流水记录
- flow := entity.Flow{}
- flow.UserId = data.UserId
- flow.PointType = data.PointType
- flow.BusinessTypeId = data.BusinessTypeId
- flow.BusinessType = data.BusinessType
- flow.Point = data.Point
- flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
- flow.EndDate = data.EndDate
- flow.AppId = data.AppId
- flow.Sort = entity.ReduceCode
- af, err = orm.Table("integral_flow").Insert(&flow)
- if err != nil || af == 0{
- log.Print("积分记录失败")
- orm.Rollback()
- return entity.ErrorCode, "积分记录失败"
- }
- err = orm.Commit()
- if err != nil {
- return entity.ErrorCode, "积分消耗失败"
- }
- return entity.SuccessCode, "积分消耗成功"
- }
- //到期积分查询
- func (service *IntegralService) IntegralExpireCheckService(data entity.ExpireJSON) (int64, int64) {
- orm := entity.Engine
- var solde entity.Solde
- var err error
- af, err := orm.Table("integral_solde").
- Select("SUM( timePoints ) AS timePoints").
- Where("userId = ? AND appId = ? AND date_format(endDate, '%Y-%m' )<= date_format(now(),'%Y-%m') ", data.UserId, data.AppId).
- Get(&solde)
- if !af || err != nil {
- log.Println(err)
- return entity.ErrorCode, 0
- }
- return entity.SuccessCode, solde.TimePoints
- }
- /*//结存新增
- func (service *IntegralService) IntegralSoldeService(model entity.SoldeUpdate) (bool, string) {
- solde := entity.Solde{}
- solde.AppId = model.AppId
- solde.UserId = model.UserId
- solde.EndDate = model.EndDate
- var err error
- var numb = int64(0)
- //新增积分
- if model.PointsType {
- //永久积分
- solde.PerManEntPoints = model.Points
- numb, err = entity.Engine.Table("integral_solde").Insert(&solde)
- if err != nil && numb == 0 {
- log.Print("新增永久积分失败")
- return false, "新增永久积分失败"
- }
- return true, "新增永久积分成功"
- }
- //时效积分
- //先查看是否有EndDate的积分
- soldelist := []entity.Solde{}
- err = entity.Engine.Table("integral_solde").Where("appId=? and userId=? and endDate=? ", model.AppId, model.UserId, model.EndDate).Find(&soldelist)
- if len(soldelist) > 0 {
- soldelist[0].TimePoints += model.Points
- numb, err = entity.Engine.Table("integral_solde").ID(soldelist[0].Id).Cols("timePoints").Update(soldelist[0])
- if err != nil && numb == 0 {
- log.Print("修改时效积分失败")
- return false, "修改时效积分失败"
- }
- return true, "修改时效积分成功"
- } else {
- solde.TimePoints = model.Points
- numb, err = entity.Engine.Table("integral_solde").Insert(&solde)
- if err != nil && numb == 0 {
- log.Print("新增时效积分失败")
- return false, "新增时效积分失败"
- }
- return true, "新增时效积分成功"
- }
- }
- //结存扣除
- func (service *IntegralService) IntegralSoldeReduceService(model entity.SoldeUpdate) (bool, string) {
- var err error
- var numb = int64(0)
- soldelist := []entity.Solde{}
- 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)
- if len(soldelist) > 0 {
- var point = model.Points
- for _, solde := range soldelist {
- if point == 0 {
- return true, "积分消耗成功"
- }
- if solde.TimePoints == 0 {
- //消耗永久积分
- if solde.PerManEntPoints >= point {
- //够消耗
- point = 0
- solde.PerManEntPoints = solde.PerManEntPoints - point
- numb, err = entity.Engine.Table("integral_solde").ID(solde.Id).Cols("perManEntPoints").Update(solde)
- if err != nil && numb == 0 {
- log.Print("消耗永久积分失败")
- return false, "消耗永久积分失败"
- }
- }
- }
- //消耗时效积分
- if solde.TimePoints > point {
- //够消耗
- point = 0
- solde.TimePoints = solde.TimePoints - point
- numb, err = entity.Engine.Table("integral_solde").ID(solde.Id).Cols("timePoints").Update(solde)
- if err != nil && numb == 0 {
- log.Print("消耗时效积分失败")
- return false, "消耗时效积分失败"
- }
- return true, "消耗时效积分成功"
- }
- //不够消耗
- point = point - solde.TimePoints
- solde.TimePoints = 0
- numb, err = entity.Engine.Table("integral_solde").ID(solde.Id).Cols("timePoints").Update(solde)
- if err != nil && numb == 0 {
- log.Print("消耗时效积分失败")
- return false, "消耗时效积分失败"
- }
- }
- }
- return false, "没有积分可以扣除"
- }
- //调整余额
- func (service *IntegralService) IntegralBalanceService(model entity.BalanceUpdate) (bool, string) {
- var err error
- var numb = int64(0)
- fmt.Println(numb)
- balanceList := []*entity.Balance{}
- //查看是否存在本人的余额
- err = entity.Engine.Table("integral_balance").Where("appId=? and userId=? ", model.AppId, model.UserId).Find(&balanceList)
- if model.Change {
- //新增
- if len(balanceList) == 0 {
- balance := entity.Balance{}
- balance.UserId = model.UserId
- balance.AppId = model.AppId
- balance.CountPoints = model.CountPoints
- numb, err = entity.Engine.Table("integral_balance").Insert(&balance)
- if err != nil && numb == 0 {
- log.Print("新增余额失败")
- return false, "新增余额失败"
- }
- }
- //修改余额
- balanceList[0].CountPoints = balanceList[0].CountPoints + model.CountPoints
- }
- //消耗
- if len(balanceList) == 0 {
- log.Println("没有积分可以扣除")
- return false, "没有积分可以扣除"
- }
- if balanceList[0].CountPoints < model.CountPoints {
- log.Println("积分余额不足")
- return false, "积分余额不足"
- }
- balanceList[0].CountPoints = balanceList[0].CountPoints - model.CountPoints
- numb, err = entity.Engine.Table("integral_balance").ID(balanceList[0].Id).Cols("countPoints").Update(balanceList[0])
- if err != nil && numb == 0 {
- log.Print("余额扣除失败")
- return false, "余额扣除失败"
- }
- return true, "余额扣除失败"
- }
- */
- //积分守护
- func (service *IntegralService) IntegralGuardService(endDate string) bool {
- orm := entity.Engine.NewSession()
- defer orm.Close()
- err := orm.Begin()
- soldelist := []entity.Solde{}
- err = orm.Table("integral_solde").
- Where("timePoints != 0 AND endDate < ? ", endDate).
- Desc("endDate").Find(&soldelist)
- if err != nil {
- log.Println("积分结存查询失败")
- }
- for _, solde := range soldelist {
- //查询积分余额是否充足
- balance := entity.Balance{}
- b, err := orm.Table("integral_balance").Select("countPoints,id").
- Where("userId = ? AND appId = ?", solde.UserId, solde.AppId).
- Get(&balance)
- if !b || err != nil {
- log.Printf("积分余额查询出错,userId:[%s],err:[%v]", solde.UserId, err)
- return false
- }
- if balance.CountPoints < solde.TimePoints {
- return false
- }
- //积分余额-时效过期积分=当前总积分余额
- balance.CountPoints = balance.CountPoints - solde.TimePoints
- orm.Table("integral_balance")
- numb, err := orm.Table("integral_balance").
- ID(balance.Id).
- Cols("countPoints").
- Update(balance)
- if err != nil && numb == 0 {
- log.Print("余额扣除失败")
- orm.Rollback()
- return false
- }
- //积分过期流水记录
- flow := entity.Flow{}
- flow.UserId = solde.UserId
- flow.PointType = 2004
- flow.BusinessTypeId = 0
- flow.BusinessType = "0"
- flow.Point = solde.TimePoints
- flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
- flow.EndDate = solde.EndDate
- flow.AppId = solde.AppId
- flow.Sort = entity.ReduceCode
- af, err := orm.Table("integral_flow").Insert(&flow)
- if err != nil && af == 0 {
- log.Print("积分记录失败")
- orm.Rollback()
- return false
- }
- //清空过期积分的时效积分
- soldeUpdate := &entity.Solde{}
- soldeUpdate.TimePoints = 0
- af, err = orm.Table("integral_solde").
- Cols("timePoints").
- ID(solde.Id).
- Update(soldeUpdate)
- if af == 0 && err != nil {
- log.Println("过期时效积分清空失败", solde.Id)
- orm.Rollback()
- return false
- }
- }
- err = orm.Commit()
- if err != nil {
- return false
- }
- return true
- }
- //积分余额查询
- func (service *IntegralService) IntegralBalanceCheckService(userId string, appId int64) (bool, int64,int64) {
- orm := entity.Engine
- //积分总余额
- balance := entity.Balance{}
- b, err := orm.Table("integral_balance").
- Where("userId = ? AND appId = ?", userId, appId).
- Get(&balance)
- if !b || err != nil {
- log.Println("暂无积分余额")
- return false, 0,0
- }
- //积分30天内到期余额
- var solde entity.Solde
- af, err := orm.Table("integral_solde").
- Select("SUM( timePoints ) AS timePoints").
- Where("userId = ? AND appId = ? AND endDate > NOW() AND DATE_SUB( NOW(), INTERVAL - 30 DAY ) > endDate", userId, appId).
- Get(&solde)
- if !af || err != nil {
- log.Println(err)
- return false, 0,0
- }
- return true, balance.CountPoints,solde.TimePoints
- }
- //按月查询积分使用情况
- func (service *IntegralService) IntegralDetailedCheck(data entity.FlowJSON) ([]*integral.Point, int64) {
- orm := entity.Engine.NewSession()
- //查询时间范围内的
- //查询新增消耗的积分和消耗积分 searchType 0全部 1新增 -1消耗
- searchCode :="1=1"
- if data.SearchType==1{
- searchCode=" flow.Sort=1"
- }else if data.SearchType==-1{
- searchCode=" flow.Sort=-1"
- }
- var flowList []*entity.FlowReq
- numb, err := orm.Table("integral_flow").Alias("flow").
- Select("flow.*,pt.name").
- Join("left", "point_type pt", "flow.pointType=pt.code").
- Where("flow.userId = ? AND flow.appId = ? AND DATE_FORMAT(flow.createTime,'%Y-%m') >= ? AND DATE_FORMAT(flow.createTime,'%Y-%m')<= ? ", data.UserId, data.AppId, data.StartDate,data.EndDate).
- And(searchCode).
- Desc("flow.createTime").
- Limit(int(data.PageSize), (int(data.Page-1))*int(data.PageSize)).
- FindAndCount(&flowList)
- var flowReq []*integral.Point
- for _, value := range flowList {
- point := integral.Point{}
- point.EndDate = value.EndDate
- point.Sort = value.Sort
- point.Point = value.Point
- point.CreateTime = value.CreateTime
- point.PointType = value.PointType
- point.BusinessTypeId = value.BusinessTypeId
- point.BusinessType = value.BusinessType
- point.Name = value.Name
- point.UserId = value.UserId
- point.AppId = value.AppId
- flowReq = append(flowReq, &point)
- }
- fmt.Println(flowList)
- if err != nil {
- log.Println(err)
- return nil, int64(0)
- }
- return flowReq, numb
- }
|