| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512 |
- 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()
- // 先查询评价记录,判断是否来自流程图
- var eva models.CourseEvaList
- err := o.Raw("SELECT * FROM CourseEvaList WHERE 课程ID = ? AND 序号 = ?", req.CourseID, req.SeqNo).QueryRow(&eva)
- 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
- }
- // 执行删除操作(仅对教员自定义的评价)
- result, err := o.Raw("DELETE FROM CourseEvaList WHERE 课程ID = ? AND 序号 = ?", req.CourseID, req.SeqNo).Exec()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "删除评价失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- n, _ := result.RowsAffected()
- 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
- }
- }
- // 如果请求中没有提供相应字段,则使用现有记录中的值
- if eva.EvaTargetRole == 0 {
- eva.EvaTargetRole = existingEva.EvaTargetRole
- }
- if eva.EvaName == "" {
- eva.EvaName = existingEva.EvaName
- }
- if eva.EvaMapID == 0 {
- eva.EvaMapID = existingEva.EvaMapID
- }
- // 评价来源始终使用现有记录中的值(保留原始来源)
- eva.EvaSource = existingEva.EvaSource
- // 使用原生SQL更新记录
- _, 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.DisqualificationItem,
- eva.CourseID, eva.SeqNo).Exec()
- 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": "更新评价成功",
- "data": eva,
- }
- c.ServeJSON()
- }
- // /eva/orderupdate 评价排序更新
- func (c *EvaController) Orderupdate() {
- type Request struct {
- CourseID int `json:"courseID"`
- SeqNo int `json:"seqNo"`
- SetOrder int `json:"setorder"`
- }
- 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 || req.SetOrder == 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: req.CourseID, SeqNo: req.SeqNo}
- err := o.Read(&existingEva, "CourseID", "SeqNo")
- if err != nil {
- if err == orm.ErrNoRows {
- c.Data["json"] = map[string]interface{}{
- "code": 404,
- "msg": "未找到对应的评价记录",
- }
- } else {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价记录失败: " + err.Error(),
- }
- }
- c.ServeJSON()
- return
- }
- // 获取该课程的所有评价记录,按序号排序
- var evaList []models.CourseEvaList
- _, err = o.QueryTable(new(models.CourseEvaList)).
- Filter("CourseID", req.CourseID).
- OrderBy("SeqNo").
- All(&evaList)
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "查询评价列表失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 检查边界条件
- if req.SetOrder == 1 && req.SeqNo <= 1 {
- // 上移但已经在最顶部
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "无法执行上移操作,已到达顶部",
- }
- c.ServeJSON()
- return
- }
- if req.SetOrder == 2 && req.SeqNo >= len(evaList) {
- // 下移但已经在最底部
- c.Data["json"] = map[string]interface{}{
- "code": 400,
- "msg": "无法执行下移操作,已到达底部",
- }
- c.ServeJSON()
- return
- }
- // 确定要交换的两个序号
- var targetSeqNo int
- if req.SetOrder == 1 {
- // 上移:与前一个序号交换
- targetSeqNo = req.SeqNo - 1
- } else {
- // 下移:与后一个序号交换
- targetSeqNo = req.SeqNo + 1
- }
- // 使用三步更新避免主键冲突
- // 第一步:将目标序号临时设为0
- _, err = o.Raw("UPDATE CourseEvaList SET 序号 = 0 WHERE 课程ID = ? AND 序号 = ?",
- req.CourseID, targetSeqNo).Exec()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "更新序号失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 第二步:将当前序号更新为目标序号
- _, err = o.Raw("UPDATE CourseEvaList SET 序号 = ? WHERE 课程ID = ? AND 序号 = ?",
- targetSeqNo, req.CourseID, req.SeqNo).Exec()
- if err != nil {
- c.Data["json"] = map[string]interface{}{
- "code": 500,
- "msg": "更新序号失败: " + err.Error(),
- }
- c.ServeJSON()
- return
- }
- // 第三步:将临时序号0更新为当前序号
- _, err = o.Raw("UPDATE CourseEvaList SET 序号 = ? WHERE 课程ID = ? AND 序号 = 0",
- req.SeqNo, req.CourseID).Exec()
- 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": "顺序调整成功",
- }
- c.ServeJSON()
- }
|