|
@ -0,0 +1,91 @@ |
|
|
|
|
|
package vote_record |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
|
"context" |
|
|
|
|
|
"github.com/gogf/gf/v2/errors/gcode" |
|
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror" |
|
|
|
|
|
"github.com/gogf/gf/v2/frame/g" |
|
|
|
|
|
"github.com/gogf/gf/v2/os/gtime" |
|
|
|
|
|
v1 "practice_ArticleVote_Go/api/vote_record/v1" |
|
|
|
|
|
"practice_ArticleVote_Go/internal/dao" |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func (l *VoteRecordLogic) GetVote(ctx context.Context, req *v1.GetVoteReq) (res *v1.GetVoteRes, err error) { |
|
|
|
|
|
articleRow, err := dao.Article.Ctx(ctx). |
|
|
|
|
|
Fields( |
|
|
|
|
|
dao.Article.Columns().ArticleTitle, |
|
|
|
|
|
dao.Article.Columns().ArticleContent, |
|
|
|
|
|
dao.Article.Columns().VoteStatus, |
|
|
|
|
|
dao.User.Columns().Username+" AS username", |
|
|
|
|
|
). |
|
|
|
|
|
LeftJoin(dao.User.Table(), dao.Article.Table()+"."+dao.Article.Columns().UserId+" = "+ |
|
|
|
|
|
dao.User.Table()+"."+dao.User.Columns().Id). |
|
|
|
|
|
Where(dao.Article.Columns().Id, req.ArticleId). |
|
|
|
|
|
One() |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
if articleRow == nil { |
|
|
|
|
|
return nil, gerror.NewCode(gcode.CodeNotFound, "文章不存在") |
|
|
|
|
|
} |
|
|
|
|
|
res = &v1.GetVoteRes{ |
|
|
|
|
|
ArticleTitle: articleRow[dao.Article.Columns().ArticleTitle].String(), |
|
|
|
|
|
ArticleContent: articleRow[dao.Article.Columns().ArticleContent].String(), |
|
|
|
|
|
VoteStatus: articleRow[dao.Article.Columns().VoteStatus].Int(), |
|
|
|
|
|
Username: articleRow[dao.User.Columns().Username].String(), |
|
|
|
|
|
} |
|
|
|
|
|
if articleRow[dao.Article.Columns().VoteStatus].Int() == 1 { |
|
|
|
|
|
votePoll, err := dao.VotePoll.Ctx(ctx). |
|
|
|
|
|
Fields( |
|
|
|
|
|
dao.VotePoll.Table()+".id AS "+dao.VotePoll.Columns().Id, |
|
|
|
|
|
dao.VotePoll.Columns().VoteTitle, |
|
|
|
|
|
dao.VotePoll.Columns().MultiOption, |
|
|
|
|
|
dao.VotePoll.Columns().Status, |
|
|
|
|
|
dao.VotePoll.Columns().DeadlineTime, |
|
|
|
|
|
"( SELECT COUNT(DISTINCT "+dao.VoteRecord.Columns().UserId+") "+ |
|
|
|
|
|
" FROM "+dao.VoteRecord.Table()+ |
|
|
|
|
|
" WHERE "+dao.VoteRecord.Columns().VoteId+" = "+dao.VotePoll.Table()+"."+dao.VotePoll.Columns().Id+ |
|
|
|
|
|
" ) AS totalCount", |
|
|
|
|
|
). |
|
|
|
|
|
Where(dao.VotePoll.Columns().ArticleId, req.ArticleId). |
|
|
|
|
|
One() |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
res.VoteId = votePoll[dao.VotePoll.Columns().Id].Int() |
|
|
|
|
|
res.VoteTitle = votePoll[dao.VotePoll.Columns().VoteTitle].String() |
|
|
|
|
|
res.MultiOption = votePoll[dao.VotePoll.Columns().MultiOption].Int() |
|
|
|
|
|
res.DeadlineTime = votePoll[dao.VotePoll.Columns().DeadlineTime].GTime() |
|
|
|
|
|
res.ParticipationNumber = votePoll["totalCount"].Int() |
|
|
|
|
|
res.VotePollStatus = votePoll[dao.VotePoll.Columns().Status].Int() |
|
|
|
|
|
if res.DeadlineTime.Before(gtime.Now()) && res.VotePollStatus != 0 { |
|
|
|
|
|
res.VotePollStatus = 0 |
|
|
|
|
|
_, err = dao.VotePoll.Ctx(ctx).Data(g.Map{ |
|
|
|
|
|
dao.VotePoll.Columns().Status: 0, |
|
|
|
|
|
}).WherePri(res.VoteId).Update() |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
return nil, err |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
//var optionList []v1.OptionRes
|
|
|
|
|
|
err = dao.VoteOption.Ctx(ctx). |
|
|
|
|
|
Fields( |
|
|
|
|
|
dao.VoteOption.Table()+"."+dao.VoteOption.Columns().Id, |
|
|
|
|
|
dao.VoteOption.Table()+"."+dao.VoteOption.Columns().OptionContent, |
|
|
|
|
|
" IFNULL(vote_count.count, 0) AS count ", |
|
|
|
|
|
). |
|
|
|
|
|
LeftJoin( |
|
|
|
|
|
" ( "+ |
|
|
|
|
|
"SELECT "+dao.VoteRecord.Columns().OptionId+ |
|
|
|
|
|
", COUNT(*) AS count "+ |
|
|
|
|
|
" FROM "+dao.VoteRecord.Table()+ |
|
|
|
|
|
" GROUP BY "+dao.VoteRecord.Columns().OptionId+ |
|
|
|
|
|
" ) AS vote_count", |
|
|
|
|
|
dao.VoteOption.Table()+"."+dao.VoteOption.Columns().Id+" = "+"vote_count."+dao.VoteRecord.Columns().OptionId, |
|
|
|
|
|
). |
|
|
|
|
|
Where(dao.VoteOption.Table()+"."+dao.VoteOption.Columns().VoteId, votePoll[dao.VotePoll.Columns().Id].Int()). |
|
|
|
|
|
OrderAsc(dao.VoteOption.Columns().OptionIndex). |
|
|
|
|
|
Scan(&res.OptionList) |
|
|
|
|
|
} |
|
|
|
|
|
return res, nil |
|
|
|
|
|
} |