123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- package dao
- import (
- "database/sql"
- "exam_system/config"
- "exam_system/entity"
- "exam_system/result"
- "exam_system/utils"
- "exam_system/vo"
- "strings"
- "time"
- "github.com/jmoiron/sqlx"
- )
- func ExamInfoList(page, size int, sort string, query map[string]interface{}, uid int) *result.Result {
- // 1、获取list
- sqlStr := `select er.id, e.name,e.status, e.start_at, e.end_at, e.duration, e.publish_at,e.tp_id,er.status state,tp.score,tp.pass_score
- from exam_record er left join user u on er.user_id = u.id
- left join exam e on e.id = er.exam_id
- left join test_paper tp on e.tp_id = tp.id
- left join exam_class ec on e.id = ec.exam_id
- left join class c on ec.class_id = c.id
- where er.status =0 and u.id = ? `
- params := []interface{}{uid}
- if query["name"] != nil {
- sqlStr += "and e.name like ? "
- params = append(params, "%"+query["name"].(string)+"%")
- }
- // 0 进行中 1已结束
- if query["status"] != nil {
- if query["status"].(float64) == 0 {
- sqlStr += "and e.end_at < ? "
- } else {
- sqlStr += "and e.end_at > ? "
- }
- params = append(params, time.Now())
- }
- sqlStr += "group by er.id "
- if sort == "asc" {
- sqlStr += "order by e.create_at asc "
- } else {
- sqlStr += "order by e.create_at desc "
- }
- sqlStr += "limit ?,?"
- params = append(params, utils.PostionSize(page, size), size)
- var evo []*vo.ExamVo1
- err := config.DB.Select(&evo, sqlStr, params...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2、总数
- sqlStr = `select count(er.id)
- from exam_record er left join user u on er.user_id = u.id
- left join exam e on e.id = er.exam_id
- left join test_paper tp on e.tp_id = tp.id
- left join exam_class ec on e.id = ec.exam_id
- left join class c on ec.class_id = c.id
- where er.status =0 and u.id = ? `
- params = []interface{}{uid}
- if query["name"] != nil {
- sqlStr += "and e.name like ? "
- params = append(params, "%"+query["name"].(string)+"%")
- }
- // 0 进行中 1已结束
- if query["status"] != nil {
- if query["status"].(float64) == 0 {
- sqlStr += "and e.end_at < ? "
- } else {
- sqlStr += "and e.end_at > ? "
- }
- params = append(params, time.Now())
- }
- var total int
- err = config.DB.Get(&total, sqlStr, params...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- return result.SUCCESS.SetData(result.NewPage(page, len(evo), total, evo))
- }
- func ExamInfoList1(page, size int, sort string, query map[string]interface{}, uid int) *result.Result {
- // 1、获取list
- sqlStr := `select e.*,tp.score,tp.pass_score
- from exam e
- left join test_paper tp on e.tp_id = tp.id
- left join exam_class ec on e.id = ec.exam_id
- left join class c on ec.class_id = c.id
- left join user u on u.class_id = c.id
- where u.id = ? `
- params := []interface{}{uid}
- if query["name"] != nil {
- sqlStr += "and e.name like ? "
- params = append(params, "%"+query["name"].(string)+"%")
- }
- // 0 进行中 1已结束
- if query["status"] != nil {
- if query["status"].(float64) == 0 {
- sqlStr += "and e.end_at < ? "
- } else {
- sqlStr += "and e.end_at > ? "
- }
- params = append(params, time.Now())
- }
- sqlStr += "group by e.id "
- if sort == "asc" {
- sqlStr += "order by e.create_at asc "
- } else {
- sqlStr += "order by e.create_at desc "
- }
- sqlStr += "limit ?,?"
- params = append(params, utils.PostionSize(page, size), size)
- var evo []*vo.ExamVo1
- err := config.DB.Select(&evo, sqlStr, params...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2、总数
- sqlStr = `select count(e.id)
- from exam e
- left join test_paper tp on e.tp_id = tp.id
- left join exam_class ec on e.id = ec.exam_id
- left join class c on ec.class_id = c.id
- left join user u on u.class_id = c.id
- where u.id = ? `
- params = []interface{}{uid}
- if query["name"] != nil {
- sqlStr += "and e.name like ? "
- params = append(params, "%"+query["name"].(string)+"%")
- }
- // 0 进行中 1已结束
- if query["status"] != nil {
- if query["status"].(float64) == 0 {
- sqlStr += "and e.end_at < ? "
- } else {
- sqlStr += "and e.end_at > ? "
- }
- params = append(params, time.Now())
- }
- var total int
- err = config.DB.Get(&total, sqlStr, params...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- return result.SUCCESS.SetData(result.NewPage(page, len(evo), total, evo))
- }
- func AddExam(e *entity.Exam) *result.Result {
- tx, err := config.DB.Beginx()
- return utils.Transation(tx, err, func(tx *sqlx.Tx) *result.Result {
- // 1、获取考生人数
- classIds := strings.Split(e.ClassIds, ",")
- var users []*entity.User
- sqlStr := "select id from user where class_id in (?)"
- var query string
- var args []interface{}
- query, args, err = sqlx.In(sqlStr, classIds)
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err)
- }
- query = tx.Rebind(query)
- err = tx.Select(&users, query, args...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2、插入
- sqlStr = "insert into exam(name,create_at,update_at,start_at,end_at,publish_at,duration,status,tp_id,user_count) values (?,?,?,?,?,?,?,?,?,?)"
- var res sql.Result
- res, err = tx.Exec(sqlStr, e.Name, time.Now(), time.Now(), e.StartAt, e.EndAt, e.PublishAt, e.Duration, e.Status, e.TpId, len(users))
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- examId, _ := res.LastInsertId()
- e.Id = int(examId)
- // 3、插入考试班级表
- sqlStr = "insert into exam_class(exam_id,class_id,create_at,update_at) values (?,?,?,?)"
- var stmt *sql.Stmt
- stmt, err = tx.Prepare(sqlStr)
- for _, classId := range classIds {
- _, err = stmt.Exec(examId, classId, time.Now(), time.Now())
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- }
- // 4、插入考试记录表
- sqlStr = "insert into exam_record(create_at, update_at, user_id, exam_id,status) values (?,?,?,?,?)"
- stmt, err = tx.Prepare(sqlStr)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- for _, user := range users {
- _, err = stmt.Exec(time.Now(), time.Now(), user.ID, examId, entity.NOT_TESTED)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- }
- return result.SuccessResult(examId)
- })
- }
- func ExamDetail(id string) *result.Result {
- // 1.查询考试
- sqlStr := "select e.*,t.name tp_name,t.score from exam e left join test_paper t on e.tp_id=t.id where e.id=? and e.delete_at is null"
- var e vo.ExamVo
- err := config.DB.Get(&e, sqlStr, id)
- if err != nil {
- if err == sql.ErrNoRows {
- return result.DATA_NOT_FOUND
- }
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2.查询班级
- var classes []*entity.Class
- sqlStr = `SELECT
- c.*
- FROM
- exam e
- LEFT JOIN exam_class ec ON e.id = ec.exam_id
- LEFT JOIN class c ON c.id = ec.class_id
- WHERE
- e.id = ? and c.delete_at is null
- GROUP BY
- c.id
- `
- err = config.DB.Select(&classes, sqlStr, id)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- e.Classes = classes
- return result.SuccessResult(e)
- }
- func ExamList(page, size int, sort string, query map[string]interface{}) *result.Result {
- sqlStr := "select e.*,t.name tp_name,t.score from exam e left join test_paper t on e.tp_id=t.id where e.delete_at is null "
- params := make([]interface{}, 0)
- if query["name"] != nil {
- params = append(params, "%"+query["name"].(string)+"%")
- sqlStr += "and e.name like ? "
- }
- if query["start_at"] != nil {
- params = append(params, query["start_at"])
- sqlStr += "and e.start_at >= ? "
- }
- if query["end_at"] != nil {
- params = append(params, query["end_at"])
- sqlStr += "and e.end_at <= ? "
- }
- sqlStr += "group by e.id order by e.create_at "
- if sort == "asc" {
- sqlStr += "asc "
- } else {
- sqlStr += "desc "
- }
- sqlStr += "limit ?,?"
- params = append(params, utils.PostionSize(page, size), size)
- var evs []*vo.ExamVo
- err := config.DB.Select(&evs, sqlStr, params...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2.查询班级
- for _, ev := range evs {
- var classes []*entity.Class
- sqlStr = `SELECT
- c.*
- FROM
- exam e
- LEFT JOIN exam_class ec ON e.id = ec.exam_id
- LEFT JOIN class c ON c.id = ec.class_id
- WHERE
- e.id = ? and c.delete_at is null and c.id is not null
- GROUP BY
- c.id
- `
- err = config.DB.Select(&classes, sqlStr, ev.Id)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- ev.Classes = classes
- }
- // 总数
- sqlStr = "select count(e.id) from exam e left join test_paper t on e.tp_id=t.id where e.delete_at is null "
- params = make([]interface{}, 0)
- if query["name"] != nil {
- params = append(params, "%"+query["name"].(string)+"%")
- sqlStr += "and e.name like ? "
- }
- if query["start_at"] != nil {
- params = append(params, query["start_at"])
- sqlStr += "and e.start_at = ? "
- }
- if query["end_at"] != nil {
- params = append(params, query["end_at"])
- sqlStr += "and e.end_at = ? "
- }
- var total int
- err = config.DB.Get(&total, sqlStr, params...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- return result.SUCCESS.SetData(result.NewPage(page, len(evs), total, evs))
- }
- func UpdateExam(e *entity.Exam) *result.Result {
- tx, err := config.DB.Beginx()
- return utils.Transation(tx, err, func(tx *sqlx.Tx) *result.Result {
- // 1、获取考生人数
- classIds := strings.Split(e.ClassIds, ",")
- var users []*entity.User
- sqlStr := "select id,class_id from user where class_id in (?)"
- var query string
- var args []interface{}
- query, args, err = sqlx.In(sqlStr, classIds)
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err.Error())
- }
- query = config.DB.Rebind(query)
- err = config.DB.Select(&users, query, args...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- // 2、更新
- sqlStr = "update exam set name=?,update_at=?,start_at=?,end_at=?,publish_at=?,duration=?,status=?,tp_id=?,user_count=? where id=? and delete_at is null "
- var res sql.Result
- res, err = config.DB.Exec(sqlStr, e.Name, time.Now(), e.StartAt, e.EndAt, e.PublishAt, e.Duration, e.Status, e.TpId, len(users), e.Id)
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err)
- }
- affected, _ := res.RowsAffected()
- // 3、删除不是该班级学生的考试记录(班级 用户)
- sqlStr = `DELETE er FROM exam_record er,exam_class ec WHERE er.exam_id = ec.exam_id and ec.class_id not in (?) and er.exam_id=?`
- query, args, err = sqlx.In(sqlStr, classIds, e.Id)
- _, err = tx.Exec(query, args...)
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err)
- }
- // 4、插入考试班级表
- // 4.1、 先删除所有关联
- sqlStr = "delete from exam_class where exam_id = ?"
- _, err = tx.Exec(sqlStr, e.Id)
- if err != nil {
- return result.UNKNOW_ERROR.SetData(err)
- }
- // 4.2、 重新建立关联
- sqlStr = "insert into exam_class(exam_id,class_id,create_at,update_at) values (?,?,?,?)"
- var stmt *sql.Stmt
- stmt, err = tx.Prepare(sqlStr)
- classMap := map[string]byte{}
- for _, classId := range classIds {
- classMap[classId] = 0
- _, err = stmt.Exec(e.Id, classId, time.Now(), time.Now())
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- }
- // 4、插入考试记录表,如果user的classid存在则(不管,或者插入),不存在删除
- sqlStr = "insert into exam_record(create_at, update_at, user_id, exam_id,status) values (?,?,?,?,?) "
- stmt, err = tx.Prepare(sqlStr)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- for _, user := range users {
- sqlStr = "select id from exam_record er where user_id = ? limit 1"
- var userId int64
- err = tx.Get(&userId, sqlStr, user.ID)
- if err != nil && err != sql.ErrNoRows {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- if userId == 0 {
- _, err = stmt.Exec(time.Now(), time.Now(), user.ID, e.Id, entity.NOT_TESTED)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- }
- }
- return result.SuccessResult(result.NewResultChange(affected))
- })
- }
- func DeleteExams(ids []string) *result.Result {
- sqlStr := "update exam set delete_at=? where id in (?)"
- query, param, err := sqlx.In(sqlStr, time.Now(), ids)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- res, err := config.DB.Exec(query, param...)
- if err != nil {
- return result.UNKNOW_ERROR.SetMsg(err.Error())
- }
- affected, _ := res.RowsAffected()
- return result.SUCCESS.SetData(result.NewResultChange(affected))
- }
|