575 lines
14 KiB
Go
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)
|
|
}
|