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 }