123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- package service
- import (
- "context"
- "encoding/csv"
- "io"
- "mime/multipart"
- "strconv"
- "strings"
- "time"
- "go-common/app/admin/main/answer/model"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- // QuestionList .
- func (s *Service) QuestionList(c context.Context, arg *model.ArgQue) (res *model.QuestionPage, err error) {
- res = &model.QuestionPage{}
- if res.Total, err = s.dao.QuestionCount(c, arg); err != nil {
- return
- }
- res.Items = []*model.QuestionDB{}
- if res.Total > 0 {
- if res.Items, err = s.dao.QuestionList(c, arg); err != nil {
- return
- }
- }
- return
- }
- // UpdateStatus update question state
- func (s *Service) UpdateStatus(c context.Context, qid int64, state int8, operator string) (err error) {
- var (
- r int64
- q *model.Question
- )
- if q, err = s.dao.QueByID(c, qid); err != nil {
- log.Error("dao QueByID(%d) error(%v)", qid, err)
- return
- }
- if q == nil || q.State == state {
- return
- }
- if r, err = s.dao.UpdateStatus(c, state, qid, operator); err != nil || r != 1 {
- return
- }
- return
- }
- // BatchUpdateState bacth update question state.
- func (s *Service) BatchUpdateState(c context.Context, qids []int64, state int8, operator string) (err error) {
- for _, id := range qids {
- s.UpdateStatus(c, id, state, operator)
- }
- return
- }
- // Types question type
- func (s *Service) Types(c context.Context) (res []*model.TypeInfo, err error) {
- return s.dao.Types(c)
- }
- // ReadCsv read csv file
- func (s *Service) ReadCsv(f multipart.File, h *multipart.FileHeader) (rs [][]string, err error) {
- r := csv.NewReader(f)
- for {
- record, err := r.Read()
- if err == io.EOF {
- break
- }
- if err != nil {
- log.Error("upload question ReadCsv error(%v)", err)
- break
- }
- if len(record) == model.ArgsCount {
- rs = append(rs, record)
- }
- }
- return
- }
- // UploadQsts upload questions
- func (s *Service) UploadQsts(c context.Context, f multipart.File, h *multipart.FileHeader, operator string) (msg string, err error) {
- defer f.Close()
- if h != nil && !strings.HasSuffix(h.Filename, ".csv") {
- msg = "not csv file."
- return
- }
- sz, ok := f.(model.Sizer)
- if !ok {
- msg = "get file size faild."
- return
- }
- size := sz.Size()
- if size > model.FileMaxSize {
- msg = "file size more than 2M."
- return
- }
- rs, err := s.ReadCsv(f, h)
- log.Info("file %s, len(%d)", h.Filename, len(rs))
- if len(rs) == 0 || len(rs) > model.MaxCount {
- msg = "file size count is 0 or more than " + strconv.FormatInt(model.MaxCount, 10)
- return
- }
- for _, r := range rs {
- typeID, err := strconv.ParseInt(r[0], 10, 8)
- if err != nil {
- log.Error("strconv.ParseInt(%+v) err(%v)", r[0], err)
- }
- if err == nil {
- q := &model.QuestionDB{
- TypeID: int8(typeID),
- Question: r[1],
- Ans1: r[2],
- Ans2: r[3],
- Ans3: r[4],
- Ans4: r[5],
- Operator: operator,
- }
- if err = s.QuestionAdd(c, q); err != nil {
- log.Error("s.QuestionAdd(%+v) error(%v)", q, err)
- }
- }
- }
- return
- }
- // QuestionAdd add register question
- func (s *Service) QuestionAdd(c context.Context, q *model.QuestionDB) (err error) {
- if len(q.Question) < model.MinQuestion || len(q.Question) > model.MaxQuestion {
- err = ecode.QuestionStrNotAllow
- return
- }
- if len(q.Ans1) < model.MinAns || len(q.Ans1) > model.MaxAns ||
- len(q.Ans2) < model.MinAns || len(q.Ans2) > model.MaxAns ||
- len(q.Ans3) < model.MinAns || len(q.Ans3) > model.MaxAns ||
- len(q.Ans4) < model.MinAns || len(q.Ans4) > model.MaxAns {
- err = ecode.QuestionAnsNotAllow
- return
- }
- if q.Tips != "" && (len(q.Tips) < model.MinTips || len(q.Tips) > model.MaxTips) {
- err = ecode.QuestionTipsNotAllow
- return
- }
- if q.TypeID <= 0 {
- err = ecode.QuestionTypeNotAllow
- return
- }
- // only sourport text question
- q.MediaType = model.TextMediaType
- q.State = model.PassCheck
- q.Ctime = time.Now()
- if _, err = s.dao.QuestionAdd(c, q); err != nil {
- return
- }
- qid := q.ID
- s.eventChan.Save(func() {
- s.CreateBFSImg(context.Background(), []int64{qid})
- })
- return
- }
- func (s *Service) loadtypes(c context.Context) (t map[int64]*model.TypeInfo, err error) {
- var tys []*model.TypeInfo
- tys, err = s.dao.Types(c)
- if err != nil {
- log.Error("s.dao.Types error(%v)", err)
- return
- }
- t = make(map[int64]*model.TypeInfo)
- for _, v := range tys {
- if v.Parentid == 0 && t[v.ID] == nil {
- t[v.ID] = &model.TypeInfo{ID: v.ID, Name: v.Name, Subs: []*model.SubType{}}
- } else if t[v.Parentid] != nil {
- t[v.Parentid].Subs = append(t[v.Parentid].Subs, &model.SubType{ID: v.ID, Name: v.Name, LabelName: v.LabelName})
- }
- }
- return
- }
- // QuestionEdit .
- func (s *Service) QuestionEdit(c context.Context, arg *model.QuestionDB) (aff int64, err error) {
- if aff, err = s.dao.QuestionEdit(c, arg); err != nil {
- return
- }
- s.eventChan.Save(func() {
- s.CreateBFSImg(context.Background(), []int64{arg.ID})
- })
- return
- }
- // LoadTypes .
- func (s *Service) LoadTypes(c context.Context) (err error) {
- var allType = []*model.TypeInfo{
- {ID: 1, Parentid: 0, Name: "游戏"},
- {ID: 2, Parentid: 0, Name: "影视"},
- {ID: 3, Parentid: 0, Name: "科技"},
- {ID: 4, Parentid: 0, Name: "动画"},
- {ID: 5, Parentid: 0, Name: "艺术"},
- {ID: 6, Parentid: 0, Name: "流行前线"},
- {ID: 7, Parentid: 0, Name: "鬼畜"},
- {ID: 8, Parentid: 1, Name: "动作射击", LabelName: "游戏"},
- {ID: 9, Parentid: 1, Name: "冒险格斗", LabelName: "游戏"},
- {ID: 12, Parentid: 1, Name: "策略模拟 ", LabelName: "游戏"},
- {ID: 13, Parentid: 1, Name: "角色扮演 ", LabelName: "游戏"},
- {ID: 14, Parentid: 1, Name: "音乐体育 ", LabelName: "游戏"},
- {ID: 15, Parentid: 2, Name: "纪录片 ", LabelName: "影视"},
- {ID: 16, Parentid: 2, Name: "电影 ", LabelName: "影视"},
- {ID: 17, Parentid: 2, Name: "电视剧 ", LabelName: "影视"},
- {ID: 18, Parentid: 3, Name: "军事 ", LabelName: "科技"},
- {ID: 19, Parentid: 3, Name: "地理 ", LabelName: "科技"},
- {ID: 20, Parentid: 3, Name: "历史 ", LabelName: "科技"},
- {ID: 21, Parentid: 3, Name: "文学 ", LabelName: "科技"},
- {ID: 22, Parentid: 3, Name: "数学 ", LabelName: "科技"},
- {ID: 23, Parentid: 3, Name: "物理 ", LabelName: "科技"},
- {ID: 24, Parentid: 3, Name: "化学 ", LabelName: "科技"},
- {ID: 25, Parentid: 3, Name: "生物 ", LabelName: "科技"},
- {ID: 26, Parentid: 3, Name: "数码科技 ", LabelName: "科技"},
- {ID: 27, Parentid: 4, Name: "动画声优 ", LabelName: "动画"},
- {ID: 28, Parentid: 4, Name: "动漫内容 ", LabelName: "动画"},
- {ID: 29, Parentid: 5, Name: "ACG音乐 ", LabelName: "艺术"},
- {ID: 30, Parentid: 5, Name: "三次元音乐 ", LabelName: "艺术"},
- {ID: 31, Parentid: 5, Name: "绘画 ", LabelName: "艺术"},
- {ID: 32, Parentid: 6, Name: "娱乐 ", LabelName: "流行前线"},
- {ID: 33, Parentid: 6, Name: "时尚 ", LabelName: "流行前线"},
- {ID: 34, Parentid: 6, Name: "运动 ", LabelName: "流行前线"},
- {ID: 35, Parentid: 7, Name: "鬼畜 ", LabelName: "鬼畜"},
- {ID: 36, Parentid: 0, Name: "基础题", LabelName: "基础题"},
- }
- for _, v := range allType {
- if _, err := s.dao.TypeSave(context.Background(), v); err != nil {
- log.Error("s.dao.TypeSave(%+v) err(%v)", v, err)
- }
- }
- return
- }
- // LoadImg .
- func (s *Service) LoadImg(c context.Context) (err error) {
- qss, err := s.dao.AllQS(c)
- if err != nil {
- log.Error("s.dao.AllQS() err(%v)", err)
- }
- for _, qs := range qss {
- lastID := qs.ID
- if err = s.eventChan.Save(func() {
- s.CreateBFSImg(context.Background(), []int64{lastID})
- }); err != nil {
- log.Error("s.CreateBFSImg(%d) err(%v)", lastID, err)
- }
- }
- return
- }
- // QueHistory .
- func (s *Service) QueHistory(c context.Context, arg *model.ArgHistory) (res *model.HistoryPage, err error) {
- res = &model.HistoryPage{}
- if res.Total, err = s.dao.HistoryCount(c, arg); err != nil {
- return
- }
- res.Items = []*model.AnswerHistoryDB{}
- if res.Total > 0 {
- if res.Items, err = s.dao.QueHistory(c, arg); err != nil {
- return
- }
- }
- return
- }
- // History .
- func (s *Service) History(c context.Context, arg *model.ArgHistory) (res *model.HistoryPage, err error) {
- if arg.Pn <= 0 || arg.Ps <= 0 {
- arg.Pn, arg.Ps = 1, 1000
- }
- res = &model.HistoryPage{}
- if res.Items, err = s.dao.HistoryES(c, arg); err != nil {
- return
- }
- res.Total = int64(len(res.Items))
- return
- }
|