123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- package dao
- import (
- "database/sql"
- "exam_system/config"
- "exam_system/entity"
- "exam_system/result"
- "exam_system/utils"
- "exam_system/vo"
- "fmt"
- "mime/multipart"
- "strconv"
- "strings"
- "time"
- "github.com/jmoiron/sqlx"
- "github.com/xuri/excelize/v2"
- )
- func AddSubject(s *entity.Subject) *result.Result {
- sqlStr := "insert into subject(question,type,opt_a,opt_b,opt_c,opt_d,answer,analysis,status,qb_id,create_at,update_at) values (?,?,?,?,?,?,?,?,?,?,?,?)"
- res, err := config.DB.Exec(sqlStr, s.Question, s.Type, s.OptA, s.OptB, s.OptC, s.OptD, utils.SubjectSort(s.Answer), s.Analysis, s.Status, s.QbId, time.Now(), time.Now())
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err)
- }
- id, _ := res.LastInsertId()
- return result.SuccessResult(id)
- }
- func SubjectDetail(id string) *result.Result {
- sqlStr := "select * from subject where id=? and delete_at is null"
- var t entity.Subject
- err := config.DB.Get(&t, sqlStr, id)
- if err != nil {
- if err == sql.ErrNoRows {
- return result.DATA_NOT_FOUND
- }
- return result.UNKNOW_ERROR.SetData(err.Error())
- }
- return result.SuccessResult(&t)
- }
- func SubjectList(page, size int, sort string, query map[string]interface{}) *result.Result {
- // 1、获取列表
- parms := make([]interface{}, 0)
- sqlStr := "select * from subject where delete_at is null "
- if query["key"] != nil {
- sqlStr += "and question like ? "
- parms = append(parms, "%"+query["key"].(string))
- }
- if query["qb_id"] != nil {
- sqlStr += "and qb_id = ? "
- parms = append(parms, query["qb_id"])
- }
- if query["status"] != nil {
- sqlStr += "and status=? "
- parms = append(parms, query["status"])
- }
- if query["type"] != nil {
- sqlStr += "and type=? "
- parms = append(parms, query["type"])
- }
- sqlStr += "order by create_at "
- if sort == "desc" {
- sqlStr += "desc "
- } else {
- sqlStr += "asc "
- }
- sqlStr += "limit ?,?"
- parms = append(parms, utils.PostionSize(page, size), size)
- var ts []*entity.Subject
- err := config.DB.Select(&ts, sqlStr, parms...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2、获取元素个数
- sqlStr = "select count(id) from subject where delete_at is null "
- parms = make([]interface{}, 0)
- if query["key"] != nil {
- sqlStr += "and question like ? "
- parms = append(parms, "%"+query["key"].(string))
- }
- if query["qb_id"] != nil {
- sqlStr += "and qb_id = ? "
- parms = append(parms, query["qb_id"])
- }
- if query["status"] != nil {
- sqlStr += "and status=? "
- parms = append(parms, query["status"])
- }
- if query["type"] != nil {
- sqlStr += "and type=? "
- parms = append(parms, query["type"])
- }
- var total int
- err = config.DB.Get(&total, sqlStr, parms...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- return result.SUCCESS.SetData(result.NewPage(page, len(ts), total, ts))
- }
- func UpdateSubject(s *entity.Subject) *result.Result {
- sqlStr := "update subject set question=?,type=?,opt_a=?,opt_b=?,opt_c=?,opt_d=?,answer=?,analysis=?,status=?,qb_id=?,update_at=? where id=? and delete_at is null "
- res, err := config.DB.Exec(sqlStr, s.Question, s.Type, s.OptA, s.OptB, s.OptC, s.OptD, utils.SubjectSort(s.Answer), s.Analysis, s.Status, s.QbId, time.Now(), s.Id)
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err)
- }
- affected, _ := res.RowsAffected()
- return result.SuccessResult(result.NewResultChange(affected))
- }
- func DeleteSubjects(ids []string) *result.Result {
- parm := []interface{}{time.Now()}
- parmStr := ""
- for k, id := range ids {
- parm = append(parm, id)
- if k == (len(ids) - 1) {
- parmStr += "?"
- } else {
- parmStr += "?,"
- }
- }
- sqlStr := fmt.Sprintf("update subject set delete_at=? where id in (%s)", parmStr)
- res, err := config.DB.Exec(sqlStr, parm...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- affected, _ := res.RowsAffected()
- return result.SUCCESS.SetData(result.NewResultChange(affected))
- }
- func AddSubjectBatch(file multipart.File, id string) *result.Result {
- xlsFile, err := excelize.OpenReader(file)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- typeName, err := xlsFile.GetCellValue("Sheet", "A1")
- typeName = strings.TrimSpace(typeName)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 1.设置插入类型
- tp := 0
- switch typeName {
- case "单选题":
- tp = entity.SINGEL_CHOICE
- case "填空题":
- tp = entity.Completion
- case "判断题":
- tp = entity.Judgement
- case "多选题":
- tp = entity.MULTIPLE_CHOICE
- default:
- return result.UNKNOW_ERROR.SetMsg("excel格式错误")
- }
- tx, err := config.DB.Beginx()
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- return utils.Transation(tx, err, func(_ *sqlx.Tx) *result.Result {
- // 1.sql准备
- sqlStr := "insert into subject(question,type,opt_a,opt_b,opt_c,opt_d,answer,analysis,status,qb_id,create_at,update_at) values (?,?,?,?,?,?,?,?,?,?,?,?)"
- var stmt *sql.Stmt
- stmt, err = config.DB.Prepare(sqlStr)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- var count int64
- i := 3
- for {
- question, _ := xlsFile.GetCellValue("Sheet", "A"+strconv.Itoa(i))
- var optA, optB, optC, optD, answer string
- if typeName == "判断题" {
- answer, _ = xlsFile.GetCellValue("Sheet", "B"+strconv.Itoa(i))
- } else {
- optA, _ = xlsFile.GetCellValue("Sheet", "B"+strconv.Itoa(i))
- optB, _ = xlsFile.GetCellValue("Sheet", "C"+strconv.Itoa(i))
- optC, _ = xlsFile.GetCellValue("Sheet", "D"+strconv.Itoa(i))
- optD, _ = xlsFile.GetCellValue("Sheet", "E"+strconv.Itoa(i))
- answer, _ = xlsFile.GetCellValue("Sheet", "F"+strconv.Itoa(i))
- answer = utils.SubjectFormat(answer)
- }
- if question == "" {
- break
- }
- var res sql.Result
- res, err = stmt.Exec(question, tp, optA, optB, optC, optD, answer, "", entity.USE, id, time.Now(), time.Now())
- if err != nil {
- continue
- }
- affected, _ := res.RowsAffected()
- count += affected
- i++
- }
- return result.SuccessResult(result.NewResultChange(count))
- })
- }
- func DownloadSubject(file *excelize.File, id, tp int) *result.Result {
- sqlStr := "select s.*,q.name qb_name from subject s left join question_bank q on s.qb_id = q.id where q.id = ? and s.type =? and s.delete_at is null"
- var subs []*vo.SubjectVo
- err := config.DB.Select(&subs, sqlStr, id, tp)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 题型
- name, err := entity.GetSubjectTypeName(tp)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- if len(subs) == 0 {
- return result.SUCCESS.SetData("没有" + name)
- }
- i := 3
- for _, sub := range subs {
- file.SetCellValue("Sheet", "A"+strconv.Itoa(i), sub.Id)
- file.SetCellValue("Sheet", "B"+strconv.Itoa(i), sub.Question)
- if tp == entity.Judgement {
- file.SetCellValue("Sheet", "C"+strconv.Itoa(i), utils.SubjectParse(sub.Answer))
- } else {
- file.SetCellValue("Sheet", "C"+strconv.Itoa(i), sub.OptA)
- file.SetCellValue("Sheet", "D"+strconv.Itoa(i), sub.OptB)
- file.SetCellValue("Sheet", "E"+strconv.Itoa(i), sub.OptC)
- file.SetCellValue("Sheet", "F"+strconv.Itoa(i), sub.OptD)
- sub.Answer = utils.SubjectParse(sub.Answer)
- file.SetCellValue("Sheet", "G"+strconv.Itoa(i), utils.SubjectParse(sub.Answer))
- }
- i++
- }
- return result.SUCCESS.SetData(subs[0].QbName + "_" + name)
- }
|