| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- package controllers
- import (
- // 根据实际项目结构调整导入路径
- "Tech/models"
- "encoding/json"
- "github.com/beego/beego/v2/client/orm"
- beego "github.com/beego/beego/v2/server/web"
- // 新增导入
- )
- type EvaController struct {
- beego.Controller
- }
- // /eva/list 获取课程评价列表
- func (c *EvaController) List() {
- type Request struct {
- CourseID int `json:"courseID"`
- }
- var req Request
- requestBody := c.Ctx.Input.RequestBody
- println("Request Body:", string(requestBody))
- if err := json.Unmarshal(requestBody, &req); err != nil {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "请求参数格式错误: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if req.CourseID == 0 {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "缺少课程ID参数",
- }
- c.ServeJSON()
- return
- }
- o := orm.NewOrm()
- var evaList []*models.CourseEvaList
- // 根据课程ID查询评价列表
- count, err := o.QueryTable(new(models.CourseEvaList)).
- Filter("CourseID", req.CourseID).
- All(&evaList)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价列表失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 获取所有角色信息用于关联角色名称
- var roleInfos []*models.RoleInfo
- _, err = o.QueryTable(new(models.RoleInfo)).All(&roleInfos)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询角色信息失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 创建角色ID到角色名称的映射
- roleMap := make(map[int]string)
- for _, role := range roleInfos {
- roleMap[role.RoleID] = role.RoleName
- }
- // 为每个评价项添加角色名称
- type EvaWithRoleName struct {
- *models.CourseEvaList
- RoleName string `json:"roleName"`
- }
- evaWithRoles := make([]EvaWithRoleName, len(evaList))
- for i, eva := range evaList {
- evaWithRoles[i] = EvaWithRoleName{
- CourseEvaList: eva,
- RoleName: roleMap[eva.EvaTargetRole],
- }
- }
- c.Data["json"] = map[string]interface{}{
- "code": 200,
- "count": count,
- "msg": "成功",
- "data": evaWithRoles,
- }
- c.ServeJSON()
- }
- // /eva/add 添加课程评价
- func (c *EvaController) Add() {
- var eva models.CourseEvaList
- requestBody := c.Ctx.Input.RequestBody
- println("Request Body:", string(requestBody))
- if err := json.Unmarshal(requestBody, &eva); err != nil {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "请求参数格式错误: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if eva.CourseID == 0 {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "缺少课程ID参数",
- }
- c.ServeJSON()
- return
- }
- o := orm.NewOrm()
- // 如果SeqNo为0,则查询该课程下最大的SeqNo并加1
- if eva.SeqNo == 0 {
- var maxSeqNo int
- err := o.Raw("SELECT COALESCE(MAX(序号), 0) FROM CourseEvaList WHERE 课程ID = ?", eva.CourseID).QueryRow(&maxSeqNo)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询序号失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- eva.SeqNo = maxSeqNo + 1
- } else {
- // 如果指定了SeqNo,检查该SeqNo是否已存在
- var count int64
- count, err := o.QueryTable(new(models.CourseEvaList)).
- Filter("CourseID", eva.CourseID).
- Filter("SeqNo", eva.SeqNo).
- Count()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询序号失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 如果SeqNo已存在,则将该SeqNo及之后的所有序号都加1
- if count > 0 {
- // 使用倒序更新,避免主键冲突
- _, err := o.Raw("UPDATE CourseEvaList SET 序号 = 序号 + 1 WHERE 课程ID = ? AND 序号 >= ? ORDER BY 序号 DESC",
- eva.CourseID, eva.SeqNo).Exec()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "调整序号失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- }
- }
- // 设置评价来源为教员自定义
- eva.EvaSource = 1
- _, err := o.Insert(&eva)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "添加评价失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "code": 200,
- "msg": "添加评价成功",
- "seqNo": eva.SeqNo,
- }
- c.ServeJSON()
- }
- // /eva/delete 删除课程评价
- func (c *EvaController) Delete() {
- type Request struct {
- CourseID int `json:"courseID"`
- SeqNo int `json:"seqNo"`
- }
- var req Request
- requestBody := c.Ctx.Input.RequestBody
- println("Request Body:", string(requestBody))
- if err := json.Unmarshal(requestBody, &req); err != nil {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "请求参数格式错误: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if req.CourseID == 0 || req.SeqNo == 0 {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "缺少必要参数",
- }
- c.ServeJSON()
- return
- }
- o := orm.NewOrm()
- // 先查询评价记录,判断是否来自流程图
- eva := models.CourseEvaList{CourseID: req.CourseID, SeqNo: req.SeqNo}
- err := o.Read(&eva, "CourseID", "SeqNo")
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价记录失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 如果评价来自流程图(EvaSource=0),则不允许删除
- if eva.EvaSource == 0 {
- c.Data["json"] = map[string]interface{}{
- "code": 403,
- "msg": "来自流程图的评价不能删除",
- }
- c.ServeJSON()
- return
- }
- // 执行删除操作(仅对教员自定义的评价)
- n, err := o.Delete(&models.CourseEvaList{CourseID: req.CourseID, SeqNo: req.SeqNo})
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "删除评价失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if n == 0 {
- c.Data["json"] = map[string]interface{}{
- "code": 404,
- "msg": "未找到对应的评价记录",
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "code": 200,
- "msg": "删除评价成功",
- }
- c.ServeJSON()
- }
- // /eva/update 更新课程评价
- func (c *EvaController) Update() {
- var eva models.CourseEvaList
- requestBody := c.Ctx.Input.RequestBody
- println("Request Body:", string(requestBody))
- if err := json.Unmarshal(requestBody, &eva); err != nil {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "请求参数格式错误: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if eva.CourseID == 0 || eva.SeqNo == 0 {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "缺少必要参数",
- }
- c.ServeJSON()
- return
- }
- o := orm.NewOrm()
- // 先尝试读取记录,判断是否存在
- existingEva := models.CourseEvaList{CourseID: eva.CourseID, SeqNo: eva.SeqNo}
- err := o.Read(&existingEva, "CourseID", "SeqNo")
- if err != nil {
- if err == orm.ErrNoRows {
- c.Data["json"] = map[string]interface{}{
- "code": 404,
- "msg": "未找到对应的评价记录",
- }
- c.ServeJSON()
- return
- } else {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价记录失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- }
- // 使用原生SQL更新记录
- res, err := o.Raw("UPDATE CourseEvaList SET 评价目标角色=?, 评价名称=?, 评价映射ID=?, 评价类型=?, 评价赋分=?, 评价失分=?, 评价来源=? WHERE 课程ID=? AND 序号=?",
- eva.EvaTargetRole, eva.EvaName, eva.EvaMapID, eva.EvaType, eva.EvaScore, eva.EvaDeduction, eva.EvaSource,
- eva.CourseID, eva.SeqNo).Exec()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "更新评价失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 获取影响的行数
- num, _ := res.RowsAffected()
- if num == 0 {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "更新评价失败: 无记录被更新",
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "code": 200,
- "msg": "更新评价成功",
- "data": eva,
- }
- c.ServeJSON()
- }
- // /eva/setscore 设置评价分数
- func (c *EvaController) SetScore() {
- type Request struct {
- RunLogID int `json:"runLogID"`
- RunOperID int `json:"runOperID"`
- OperScore float64 `json:"operScore"`
- }
- var req Request
- requestBody := c.Ctx.Input.RequestBody
- println("Request Body:", string(requestBody))
- if err := json.Unmarshal(requestBody, &req); err != nil {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "请求参数格式错误: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if req.RunLogID == 0 || req.RunOperID == 0 {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "缺少必要参数",
- }
- c.ServeJSON()
- return
- }
- o := orm.NewOrm()
- // 先检查记录是否存在
- var count int64
- err := o.Raw("SELECT COUNT(*) FROM CourseEvaLog WHERE 运行记录编号 = ? AND 运行操作ID = ?",
- req.RunLogID, req.RunOperID).QueryRow(&count)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价记录失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if count == 0 {
- c.Data["json"] = map[string]interface{}{
- "code": 404,
- "msg": "未找到对应的评价记录",
- }
- c.ServeJSON()
- return
- }
- // 使用原生SQL更新操作得分字段
- res, err := o.Raw("UPDATE CourseEvaLog SET 操作得分 = ? WHERE 运行记录编号 = ? AND 运行操作ID = ?",
- req.OperScore, req.RunLogID, req.RunOperID).Exec()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "更新操作得分失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 获取影响的行数
- num, _ := res.RowsAffected()
- if num == 0 {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "更新操作得分失败: 无记录被更新",
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "code": 200,
- "msg": "设置操作得分成功",
- }
- c.ServeJSON()
- }
- // /eva/record/list 获取课程评价记录列表
- func (c *EvaController) EvaRecordList() {
- type Request struct {
- RunLogID int `json:"runLogID"`
- }
- var req Request
- requestBody := c.Ctx.Input.RequestBody
- println("Request Body:", string(requestBody))
- if err := json.Unmarshal(requestBody, &req); err != nil {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "请求参数格式错误: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- if req.RunLogID == 0 {
- c.Ctx.Output.SetStatus(400)
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "缺少运行记录编号参数",
- }
- c.ServeJSON()
- return
- }
- o := orm.NewOrm()
- var evaLogList []*models.CourseEvaLog
- // 根据运行记录编号查询评价记录列表
- count, err := o.QueryTable(new(models.CourseEvaLog)).
- Filter("RunLogID", req.RunLogID).
- All(&evaLogList)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价记录列表失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- c.Data["json"] = map[string]interface{}{
- "code": 200,
- "count": count,
- "msg": "成功",
- "data": evaLogList,
- }
- c.ServeJSON()
- }
|