575 lines
14 KiB
Go

package controller
import (
"case-admin-api/api/dao"
"case-admin-api/api/model"
"case-admin-api/api/requests"
"case-admin-api/api/responses"
"case-admin-api/global"
"case-admin-api/utils"
"fmt"
"github.com/gin-gonic/gin"
"strconv"
)
type CaseItem struct{}
// AddCaseItem 新增
func (b *CaseItem) AddCaseItem(c *gin.Context) {
caseItemRequest := requests.CaseItemRequest{}
req := caseItemRequest.AddCaseItem
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 参数验证
for _, item := range req.CaseItemQuestion {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if item.QuestionType != 3 {
if item.QuestionAnswer == "" {
responses.FailWithMessage("缺少答案", c)
return
}
}
if item.QuestionType != 3 {
if len(item.CaseItemQuestionOption) > 0 {
for _, question := range item.CaseItemQuestionOption {
if err := global.Validate.Struct(question); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
}
}
}
// 参数验证
for _, item := range req.CaseItemModel {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
// 检测项目
// 将 id 转换为 int64 类型
projectId, err := strconv.ParseInt(req.ProjectId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
projectDao := dao.ProjectDao{}
_, err = projectDao.GetProjectById(projectId)
if err != nil {
responses.FailWithMessage("项目数据异常", c)
return
}
caseId, err := strconv.ParseInt(req.CaseId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
caseDao := dao.CaseDao{}
result, err := caseDao.GetCaseById(caseId)
if err != nil {
responses.FailWithMessage("病例数据异常", c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
caseItemDao := dao.CaseItemDao{}
caseItemQuestionDao := dao.CaseItemQuestionDao{}
caseItemModelDao := dao.CaseItemModelDao{}
caseItemQuestionOptionDao := dao.CaseItemQuestionOptionDao{}
// 新增病例明细
caseItem := &model.CaseItem{
CaseId: result.CaseId,
Page: req.Page,
}
caseItem, err = caseItemDao.AddCaseItem(tx, caseItem)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
// 新增病例题目
if len(req.CaseItemQuestion) > 0 {
for _, question := range req.CaseItemQuestion {
caseItemQuestion := &model.CaseItemQuestion{
CaseId: result.CaseId,
CaseItemId: caseItem.CaseItemId,
QuestionName: question.QuestionName,
QuestionType: question.QuestionType,
QuestionAnswer: question.QuestionAnswer,
IsRightNext: question.IsRightNext,
ErrorTips: question.ErrorTips,
}
caseItemQuestion, err = caseItemQuestionDao.AddCaseItemQuestion(tx, caseItemQuestion)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
if question.QuestionType == 1 || question.QuestionType == 2 || question.QuestionType == 4 {
if len(question.CaseItemQuestionOption) <= 0 {
tx.Rollback()
responses.FailWithMessage("缺少题目选项", c)
return
}
for _, option := range question.CaseItemQuestionOption {
caseItemQuestionOption := &model.CaseItemQuestionOption{
QuestionId: caseItemQuestion.QuestionId,
OptionValue: option.OptionValue,
}
caseItemQuestionOption, err = caseItemQuestionOptionDao.AddCaseItemQuestionOption(tx, caseItemQuestionOption)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
}
}
}
// 新增病例模块
if len(req.CaseItemModel) > 0 {
for _, v := range req.CaseItemModel {
caseItemModel := &model.CaseItemModel{
CaseItemId: caseItem.CaseItemId,
ModelName: v.ModelName,
Content: v.Content,
}
caseItemModel, err = caseItemModelDao.AddCaseItemModel(tx, caseItemModel)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
}
tx.Commit()
responses.Ok(c)
}
// PutCaseItem 修改
func (b *CaseItem) PutCaseItem(c *gin.Context) {
caseItemRequest := requests.CaseItemRequest{}
req := caseItemRequest.PutCaseItem
if err := c.ShouldBindJSON(&req); err != nil {
responses.FailWithMessage(err.Error(), c)
return
}
// 参数验证1
if err := global.Validate.Struct(req); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
// 参数验证
for _, item := range req.CaseItemQuestion {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
if item.QuestionType != 3 {
if item.QuestionAnswer == "" {
responses.FailWithMessage("缺少答案", c)
return
}
}
if len(item.CaseItemQuestionOption) > 0 {
for _, question := range item.CaseItemQuestionOption {
if item.QuestionType != 3 {
if err := global.Validate.Struct(question); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
}
}
}
// 参数验证
for _, item := range req.CaseItemModel {
if err := global.Validate.Struct(item); err != nil {
responses.FailWithMessage(utils.Translate(err), c)
return
}
}
id := c.Param("case_item_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
caseItemId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
caseItemDao := dao.CaseItemDao{}
caseItem, err := caseItemDao.GetCaseItemById(caseItemId)
if err != nil {
responses.FailWithMessage("数据异常", c)
return
}
// 检测项目
// 将 id 转换为 int64 类型
projectId, err := strconv.ParseInt(req.ProjectId, 10, 64)
if err != nil {
responses.Fail(c)
return
}
projectDao := dao.ProjectDao{}
_, err = projectDao.GetProjectById(projectId)
if err != nil {
responses.FailWithMessage("项目数据异常", c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
caseItemQuestionOptionDao := dao.CaseItemQuestionOptionDao{}
caseItemQuestionDao := dao.CaseItemQuestionDao{}
caseItemModelDao := dao.CaseItemModelDao{}
// 获取问题
maps := make(map[string]interface{})
maps["case_item_id"] = caseItemId
caseItemQuestions, err := caseItemQuestionDao.GetCaseItemQuestionList(maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 检测问题情况
var deleteCaseItemQuestions []*model.CaseItemQuestion
var addCaseItemQuestions []*requests.CaseItemQuestion
for _, itemQuestion := range req.CaseItemQuestion {
if itemQuestion.QuestionId == "" {
addCaseItemQuestions = append(addCaseItemQuestions, itemQuestion)
}
}
for _, question := range caseItemQuestions {
isExist := false
for _, itemQuestion := range req.CaseItemQuestion {
if itemQuestion.QuestionId == "" {
continue
}
if itemQuestion.QuestionId == fmt.Sprintf("%d", question.QuestionId) {
isExist = true
break
}
}
// 如果没有找到匹配项,则需要删除
if !isExist {
deleteCaseItemQuestions = append(deleteCaseItemQuestions, question)
}
}
statCaseQuestionDao := dao.StatCaseQuestionDao{}
caseUserAnswerDao := dao.CaseUserAnswerDao{}
if len(deleteCaseItemQuestions) > 0 {
for _, question := range deleteCaseItemQuestions {
if question.QuestionType == 1 || question.QuestionType == 2 || question.QuestionType == 4 {
// 删除对应答题记录
maps = make(map[string]interface{})
maps["question_id"] = question.QuestionId
err := statCaseQuestionDao.DeleteStatCaseQuestion(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 删除问题选项
maps = make(map[string]interface{})
maps["question_id"] = question.QuestionId
err = caseItemQuestionOptionDao.DeleteCaseItemQuestionOption(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
// 删除用户答题记录
maps = make(map[string]interface{})
maps["question_id"] = question.QuestionId
err := caseUserAnswerDao.DeleteCaseUserAnswer(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 删除问题
err = caseItemQuestionDao.DeleteCaseItemQuestionById(tx, question.QuestionId)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
}
// 新增病例题目
if len(addCaseItemQuestions) > 0 {
for _, question := range req.CaseItemQuestion {
caseItemQuestion := &model.CaseItemQuestion{
CaseId: caseItem.CaseId,
CaseItemId: caseItem.CaseItemId,
QuestionName: question.QuestionName,
QuestionType: question.QuestionType,
QuestionAnswer: question.QuestionAnswer,
IsRightNext: question.IsRightNext,
ErrorTips: question.ErrorTips,
}
caseItemQuestion, err = caseItemQuestionDao.AddCaseItemQuestion(tx, caseItemQuestion)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
if question.QuestionType == 1 || question.QuestionType == 2 || question.QuestionType == 4 {
if len(question.CaseItemQuestionOption) <= 0 {
tx.Rollback()
responses.FailWithMessage("缺少题目选项", c)
return
}
for _, option := range question.CaseItemQuestionOption {
caseItemQuestionOption := &model.CaseItemQuestionOption{
QuestionId: caseItemQuestion.QuestionId,
OptionValue: option.OptionValue,
}
caseItemQuestionOption, err = caseItemQuestionOptionDao.AddCaseItemQuestionOption(tx, caseItemQuestionOption)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
}
}
}
// 获取模块
maps = make(map[string]interface{})
maps["case_item_id"] = caseItemId
caseItemModels, err := caseItemModelDao.GetCaseItemModelList(maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
if len(caseItemModels) > 0 {
// 删除该页全部模块
maps = make(map[string]interface{})
maps["case_item_id"] = caseItemId
err = caseItemModelDao.DeleteCaseItemModel(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
// 新增模块
if len(req.CaseItemModel) > 0 {
for _, v := range req.CaseItemModel {
caseItemModel := &model.CaseItemModel{
CaseItemId: caseItem.CaseItemId,
ModelName: v.ModelName,
Content: v.Content,
}
caseItemModel, err = caseItemModelDao.AddCaseItemModel(tx, caseItemModel)
if err != nil {
tx.Rollback()
responses.FailWithMessage(err.Error(), c)
return
}
}
}
tx.Commit()
responses.Ok(c)
}
// DeleteCaseItem 删除
func (b *CaseItem) DeleteCaseItem(c *gin.Context) {
id := c.Param("case_item_id")
if id == "" {
responses.FailWithMessage("缺少参数", c)
return
}
// 将 id 转换为 int64 类型
caseItemId, err := strconv.ParseInt(id, 10, 64)
if err != nil {
responses.Fail(c)
return
}
caseItemDao := dao.CaseItemDao{}
_, err = caseItemDao.GetCaseItemById(caseItemId)
if err != nil {
responses.FailWithMessage("数据异常", c)
return
}
// 开始事务
tx := global.Db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
caseItemQuestionOptionDao := dao.CaseItemQuestionOptionDao{}
caseItemQuestionDao := dao.CaseItemQuestionDao{}
caseItemModelDao := dao.CaseItemModelDao{}
// 获取问题
maps := make(map[string]interface{})
maps["case_item_id"] = caseItemId
caseItemQuestions, err := caseItemQuestionDao.GetCaseItemQuestionList(maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
statCaseQuestionDao := dao.StatCaseQuestionDao{}
caseUserAnswerDao := dao.CaseUserAnswerDao{}
for _, question := range caseItemQuestions {
if question.QuestionType == 1 || question.QuestionType == 2 || question.QuestionType == 4 {
// 删除对应答题记录
maps = make(map[string]interface{})
maps["question_id"] = question.QuestionId
err := statCaseQuestionDao.DeleteStatCaseQuestion(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
maps = make(map[string]interface{})
maps["question_id"] = question.QuestionId
err = caseItemQuestionOptionDao.DeleteCaseItemQuestionOption(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
// 删除问题
err = caseItemQuestionDao.DeleteCaseItemQuestionById(tx, question.QuestionId)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
// 删除用户答题记录
maps = make(map[string]interface{})
maps["question_id"] = question.QuestionId
err := caseUserAnswerDao.DeleteCaseUserAnswer(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
// 获取模块
maps = make(map[string]interface{})
maps["case_item_id"] = caseItemId
caseItemModels, err := caseItemModelDao.GetCaseItemModelList(maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
if len(caseItemModels) > 0 {
// 删除该页全部模块
maps = make(map[string]interface{})
maps["case_item_id"] = caseItemId
err = caseItemModelDao.DeleteCaseItemModel(tx, maps)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
}
// 删除病例明细
err = caseItemDao.DeleteCaseItemById(tx, caseItemId)
if err != nil {
tx.Rollback()
responses.FailWithMessage("操作失败", c)
return
}
tx.Commit()
responses.Ok(c)
}