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, "合并成功" }