123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516 |
- package service
- import (
- "app.yhyue.com/moapp/jyPoints/entity"
- "app.yhyue.com/moapp/jyPoints/rpc/integral"
- "fmt"
- "log"
- "math/rand"
- "time"
- )
- type IntegralService struct{}
- // 新增积分流水
- func (service *IntegralService) IntegralAddService(data entity.FlowJSON) (int64, string, string) {
- serialNumber := "0000"
- orm := entity.Engine.NewSession()
- defer orm.Close()
- err := orm.Begin()
- flow := entity.Flow{}
- flow.UserId = data.UserId
- flow.SourceId = data.SourceId
- //flow.SourceType = data.SourceType
- flow.PointType = data.PointType
- flow.SourceType = fmt.Sprint(data.PointType)
- flow.Point = data.Point
- if data.EndDate != "" {
- data.EndDate = data.EndDate[0:10]
- }
- flow.EndDate = data.EndDate
- flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
- flow.AppId = data.AppId
- flow.Sort = entity.AddCode
- flow.Abstract = data.Abstract
- var numb = int64(0)
- if data.OperationType {
- flow.OperationType = 1
- }
- //流水号
- serialNumber = time.Now().Format("20060102150405000") + fmt.Sprint(rand.Intn(100))
- flow.SerialNumber = serialNumber
- numb, err = orm.Table("integral_flow").Insert(flow)
- if err != nil && numb == 0 {
- log.Print("新增流水失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "新增流水失败", serialNumber
- }
- //结存修改
- 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, "修改时效积分失败", serialNumber
- }
- } 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, "新增永久积分失败", serialNumber
- }
- }
- } else {
- flow.OperationType = 0
- 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, "修改时效积分失败", serialNumber
- }
- } 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, "新增时效积分失败", serialNumber
- }
- }
- }
- err = orm.Commit()
- if err != nil {
- log.Print("积分新增失败:", err)
- return entity.ErrorCode, "积分新增失败", serialNumber
- }
- return entity.SuccessCode, "余额新增成功", serialNumber
- }
- // 积分消耗
- func (service *IntegralService) IntegralConsumeService(data entity.FlowJSON) (int64, string, string) {
- serialNumber := "0000"
- serialNumber = time.Now().Format("20060102150405000") + fmt.Sprint(rand.Intn(100))
- orm := entity.Engine.NewSession()
- defer orm.Close()
- var err = orm.Begin()
- var af = int64(0)
- balance := entity.Balance{}
- //查询积分余额是否充足
- b, err := orm.Table("integral_solde").Select("sum(perManEntPoints)+sum(timePoints) as CountPoints ,userId").
- 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")).
- GroupBy("userId").Get(&balance)
- if err != nil {
- log.Printf("积分余额查询出错,userId:[%s],err:[%v]", data.UserId, err)
- return entity.ErrorCode, "积分余额查询出错", serialNumber
- }
- if !b {
- log.Printf("没有查询到[%s]的积分记录,err:[%v]", data.UserId, err)
- return entity.ErrorCode, "没有查询到积分记录", serialNumber
- }
- if balance.CountPoints < data.Point {
- return entity.ErrorCode, "积分余额不足", serialNumber
- }
- //结存消耗
- 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")).
- Asc("perManEntPoints").
- Asc("endDate").
- Find(&soldelist)
- if len(soldelist) == 0 {
- return entity.ErrorCode, "没有结存可以消耗", serialNumber
- }
- 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, "消耗永久积分失败", serialNumber
- }
- }
- } 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, "消耗时效积分失败", serialNumber
- }
- 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, "消耗时效积分失败", serialNumber
- }
- }
- }
- if err != nil {
- log.Print("余额扣除失败:", err)
- orm.Rollback()
- return entity.ErrorCode, "余额扣除失败", serialNumber
- }
- //消耗积分流水记录
- flow := entity.Flow{}
- flow.UserId = data.UserId
- flow.SourceType = fmt.Sprint(data.PointType)
- flow.PointType = data.PointType
- flow.SourceId = data.SourceId
- flow.Abstract = data.Abstract
- //flow.SourceType = data.SourceType
- 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
- flow.SerialNumber = serialNumber
- af, err = orm.Table("integral_flow").Insert(&flow)
- if err != nil || af == 0 {
- log.Print("积分记录失败")
- orm.Rollback()
- return entity.ErrorCode, "积分记录失败", serialNumber
- }
- err = orm.Commit()
- if err != nil {
- return entity.ErrorCode, "积分消耗失败", serialNumber
- }
- return entity.SuccessCode, "积分消耗成功", serialNumber
- }
- // 到期积分查询
- 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) 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_solde").Select("sum(perManEntPoints)+sum(timePoints) as CountPoints ,userId").
- Where("appId=? and userId=? and (endDate = '' OR endDate IS NULL OR endDate >= ?) and (( perManEntPoints != 0 AND timePoints = 0 ) OR ( perManEntPoints = 0 AND timePoints != 0 ))", solde.AppId, solde.UserId, time.Now().Format("2006-01-02")).
- Get(&balance)
- if !b || err != nil {
- log.Printf("积分余额查询出错,userId:[%s],err:[%v]", solde.UserId, err)
- return false
- }
- if balance.CountPoints < solde.TimePoints {
- return false
- }
- //积分过期流水记录
- flow := entity.Flow{}
- flow.UserId = solde.UserId
- flow.PointType = 2004
- flow.SourceId = ""
- flow.SourceType = "2004"
- 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, appId string) (bool, int64, int64, int64, int64) {
- orm := entity.Engine
- //积分总余额
- balance := entity.Balance{}
- _, err := orm.Table("integral_solde").Select("sum(perManEntPoints)+sum(timePoints) as CountPoints ,userId,sum(perManEntPoints) as perManEntPoints").
- Where("appId=? and userId=? and (endDate = '' OR endDate IS NULL OR endDate >= ?) and (( perManEntPoints != 0 AND timePoints = 0 ) OR ( perManEntPoints = 0 AND timePoints != 0 ))", appId, userId, time.Now().Format("2006-01-02")).
- GroupBy("userId").Get(&balance)
- if err != nil {
- log.Println("积分查询出错")
- return false, 0, 0, 0, 0
- }
- //使用所有积分查询
- //积分总余额
- userBalance := entity.Balance{}
- _, err = orm.Table("integral_flow").Select("sum(point)CountPoints").
- Where("appId=? and userId=? and sort=-1 and pointType!=2004 ", appId, userId).
- GroupBy("userId").Get(&userBalance)
- if err != nil {
- log.Println("积分查询出错")
- return false, 0, 0, 0, 0
- }
- //积分30天内到期余额
- var solde entity.Solde
- _, err = orm.Table("integral_solde").
- Select("SUM( timePoints ) AS timePoints").
- Where("userId = ? AND appId = ? AND endDate > DATE_SUB( NOW(), INTERVAL +1 DAY ) AND DATE_SUB( NOW(), INTERVAL -31 DAY ) > endDate", userId, appId).
- Get(&solde)
- if err != nil {
- log.Println(err)
- return false, 0, 0, 0, 0
- }
- return true, balance.CountPoints, solde.TimePoints, balance.PerManEntPoints, userBalance.CountPoints
- }
- // 按月查询积分使用情况
- 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 = ?", data.UserId, data.AppId).
- And(searchCode).
- Desc("flow.createTime").
- Asc("flow.id").
- 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
- createTimeStr := value.CreateTime.Format("2006-01-02")
- point.CreateTime = createTimeStr
- point.PointType = value.PointType
- point.SourceId = value.SourceId
- point.SourceType = value.SourceType
- point.Name = value.Name
- point.Abstract = value.Abstract
- point.SerialNumber = value.SerialNumber
- flowReq = append(flowReq, &point)
- }
- fmt.Println(flowList)
- if err != nil {
- log.Println(err)
- return nil, int64(0)
- }
- return flowReq, numb
- }
- // 账号合并
- func (service *IntegralService) UserMerge(mergeUser, mergedUser, appId string) (bool, string) {
- orm := entity.Engine.NewSession()
- defer orm.Close()
- err := orm.Begin()
- //先查询一下被合并账号有效的结存信息
- nowStr := time.Now().Format("2006-01-02")
- soldeList := []entity.Solde{}
- err = orm.Table("integral_solde").
- Where("userId = ? AND appId = ? and (endDate>=? or endDate ='') ", mergedUser, appId, nowStr).
- Find(&soldeList)
- if err != nil {
- orm.Rollback()
- log.Println("查询被合并者结存信息出错", err)
- return false, "查询被合并者结存信息出错"
- }
- timeBalanceNumb := int64(0)
- perManEntBalanceNumb := int64(0)
- for _, value := range soldeList {
- if value.PerManEntPoints == 0 {
- //此数据可能是时效积分数据
- if value.TimePoints == 0 {
- continue
- }
- solde := entity.Solde{}
- _, err = orm.Table("integral_solde").
- Where("userId = ? AND appId = ? and endDate=?", mergeUser, appId, value.EndDate).
- Get(&solde)
- if err != nil {
- orm.Rollback()
- log.Println("查询合并者结存信息出错,err")
- return false, "查询合并者结存信息出错"
- }
- if solde.Id == 0 {
- numb := int64(0)
- //新增一条记录
- solde := entity.Solde{}
- solde.AppId = value.AppId
- solde.UserId = mergeUser
- solde.PerManEntPoints = 0
- solde.TimePoints = value.TimePoints
- solde.EndDate = value.EndDate
- numb, err = orm.Table("integral_solde").Insert(&solde)
- if err != nil && numb == 0 {
- log.Print("新增时效积分失败:", err)
- orm.Rollback()
- return false, "新增时效积分失败"
- }
- }
- orm.Exec("UPDATE integral_solde SET timePoints = timePoints+? WHERE id= ?", value.TimePoints, solde.Id)
- timeBalanceNumb += value.TimePoints
- }
- //此数据是永久积分数据
- solde := entity.Solde{}
- _, err = orm.Table("integral_solde").
- Where("userId = ? AND appId = ? and endDate =''", mergeUser, appId).
- Get(&solde)
- if err != nil {
- orm.Rollback()
- log.Println("查询合并者永久结存信息出错", err)
- return false, "查询合并者永久结存信息出错"
- }
- if solde.Id == 0 {
- //没有永久数据
- numb := int64(0)
- //新增一条记录
- solde := entity.Solde{}
- solde.AppId = value.AppId
- solde.UserId = mergeUser
- solde.PerManEntPoints = value.PerManEntPoints
- solde.TimePoints = 0
- solde.EndDate = value.EndDate
- numb, err = orm.Table("integral_solde").Insert(&solde)
- if err != nil && numb == 0 {
- log.Print("新增时效积分失败:", err)
- orm.Rollback()
- return false, "新增时效积分失败"
- }
- }
- orm.Exec("UPDATE integral_solde SET perManEntPoints = perManEntPoints+? WHERE id= ?", value.PerManEntPoints, solde.Id)
- perManEntBalanceNumb += value.PerManEntPoints
- }
- numb := int64(0)
- if timeBalanceNumb > 0 {
- flow := entity.Flow{}
- flow.UserId = mergeUser
- flow.SourceType = "账号合并"
- flow.PointType = 1006
- flow.SourceId = ""
- flow.Abstract = ""
- flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
- flow.EndDate = ""
- flow.AppId = appId
- flow.Sort = entity.AddCode
- flow.SerialNumber = time.Now().Format("20060102150405000") + fmt.Sprint(rand.Intn(100))
- flow.Point = timeBalanceNumb
- flow.OperationType = 0
- numb, err = orm.Table("integral_flow").Insert(&flow)
- if err != nil && numb == 0 {
- log.Print("新增时效流水失败:", err)
- orm.Rollback()
- return false, "新增时效流水失败"
- }
- }
- if perManEntBalanceNumb > 0 {
- flow := entity.Flow{}
- flow.UserId = mergeUser
- flow.SourceType = "账号合并"
- flow.PointType = 1006
- flow.SourceId = ""
- flow.Abstract = ""
- flow.CreateTime = time.Now().Format("2006-01-02 15:04:05")
- flow.EndDate = ""
- flow.AppId = appId
- flow.Sort = entity.AddCode
- flow.SerialNumber = time.Now().Format("20060102150405000") + fmt.Sprint(rand.Intn(100))
- flow.Point = perManEntBalanceNumb
- flow.OperationType = 1
- numb, err = orm.Table("integral_flow").Insert(&flow)
- if err != nil && numb == 0 {
- log.Print("新增永久流水失败:", err)
- orm.Rollback()
- return false, "新增永久流水失败"
- }
- }
- orm.Commit()
- return true, "合并成功"
- }
|