diff --git a/api/controller/Res.go b/api/controller/Res.go index 69d775a..cd626f7 100644 --- a/api/controller/Res.go +++ b/api/controller/Res.go @@ -156,7 +156,7 @@ func (b *Res) GetResCaseRecordList(c *gin.Context) { // 获取数据 caseUserDao := dao.CaseUserDao{} - caseUsers, total, err := caseUserDao.GetCaseUserRecordList(req, page, pageSize) + caseUsers, total, err := caseUserDao.GetResCaseUserRecordList(req, page, pageSize) if err != nil { responses.FailWithMessage(err.Error(), c) return @@ -306,3 +306,92 @@ func (b *Res) GetResCaseRecordList(c *gin.Context) { result["data"] = g responses.OkWithData(result, c) } + +// GetResCaseBehaviorList 获取病例用户操作行为列表 +func (b *Res) GetResCaseBehaviorList(c *gin.Context) { + resRequest := requests.ResRequest{} + req := resRequest.GetResCaseBehaviorList + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + platformId := c.GetInt64("platformId") // 平台id + if platformId == 0 { + responses.FailWithMessage("非法请求", c) + return + } + + req.PlatformId = platformId + + if req.StartTime != "" { + if req.EndTime == "" { + responses.FailWithMessage("参数错误", c) + return + } + } + + // 获取数据 + caseUserDao := dao.CaseUserDao{} + caseUsers, err := caseUserDao.GetResCaseBehaviorList(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + g := make([]*dto.ResCaseBehaviorDto, len(caseUsers)) + + if len(caseUsers) > 0 { + userBehaviorRecordDao := dao.UserBehaviorRecordDao{} + + for i, v := range caseUsers { + response := &dto.ResCaseBehaviorDto{ + TslUid: v.User.UserIden, + Sid: fmt.Sprintf("%d", v.CaseId), + StartTime: time.Time(v.StartTime).Format("2006-01-02 15:04:05"), + EndTime: time.Time(v.StartTime).Format("2006-01-02 15:04:05"), + UseTime: v.ReadDuration, + IsComplete: 1, + Action: nil, + } + + // 获取用户操作行为记录 + maps := make(map[string]interface{}) + maps["case_id"] = v.CaseId + maps["platform_id"] = v.PlatformId + maps["user_id"] = v.UserId + userBehaviorRecords, _ := userBehaviorRecordDao.GetUserBehaviorRecordList(maps) + + // 评论 + if len(userBehaviorRecords) > 0 { + response.Action = make([]*dto.ActionDto, len(userBehaviorRecords)) + + for i2, record := range userBehaviorRecords { + // 用时 + useTime := time.Time(record.EndTime).Sub(time.Time(record.StartTime)) + + actionDto := &dto.ActionDto{ + Step: record.Step, + In: time.Time(record.StartTime).Format("2006-01-02 15:04:05"), + Out: time.Time(record.EndTime).Format("2006-01-02 15:04:05"), + UseTime: int(useTime.Seconds()), + } + + response.Action[i2] = actionDto + } + } + + // 将转换后的结构体添加到新切片中 + g[i] = response + } + } + + responses.OkWithData(g, c) +} diff --git a/api/dao/CaseUser.go b/api/dao/CaseUser.go index 8c260bf..a397012 100644 --- a/api/dao/CaseUser.go +++ b/api/dao/CaseUser.go @@ -108,8 +108,8 @@ func (r *CaseUserDao) GetCaseUser(maps interface{}) (m *model.CaseUser, err erro return m, nil } -// GetCaseUserRecordList 病例领取记录 -func (r *CaseUserDao) GetCaseUserRecordList(req requests.GetResCaseRecordList, page, pageSize int) (m []*model.CaseUser, total int64, err error) { +// GetResCaseUserRecordList 病例领取记录 +func (r *CaseUserDao) GetResCaseUserRecordList(req requests.GetResCaseRecordList, page, pageSize int) (m []*model.CaseUser, total int64, err error) { var totalRecords int64 // 构建查询条件 @@ -144,3 +144,28 @@ func (r *CaseUserDao) GetCaseUserRecordList(req requests.GetResCaseRecordList, p } return m, totalRecords, nil } + +// GetResCaseBehaviorList 获取病例用户操作行为列表 +func (r *CaseUserDao) GetResCaseBehaviorList(req requests.GetResCaseBehaviorList) (m []*model.CaseUser, err error) { + // 构建查询条件 + query := global.Db.Model(&model.CaseUser{}) + + query = query.Preload("User") + + query = query.Where("case_id = ?", req.CaseId) + query = query.Where("platform_id = ?", req.PlatformId) + + // 时间 + if req.StartTime != "" && req.EndTime != "" { + query = query.Where("created_at BETWEEN ? AND ?", req.StartTime, req.EndTime) + } + + // 排序 + query = query.Order("created_at desc") + + err = query.Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/UserAnswerRecord.go b/api/dao/UserAnswerRecord.go index b5a91d9..9841ebe 100644 --- a/api/dao/UserAnswerRecord.go +++ b/api/dao/UserAnswerRecord.go @@ -11,8 +11,8 @@ type UserAnswerRecordDao struct { } // GetUserAnswerRecordById 获取数据-id -func (r *UserAnswerRecordDao) GetUserAnswerRecordById(CaseUserQuestionId int64) (m *model.UserAnswerRecord, err error) { - err = global.Db.First(&m, CaseUserQuestionId).Error +func (r *UserAnswerRecordDao) GetUserAnswerRecordById(RecordId int64) (m *model.UserAnswerRecord, err error) { + err = global.Db.First(&m, RecordId).Error if err != nil { return nil, err } @@ -20,8 +20,8 @@ func (r *UserAnswerRecordDao) GetUserAnswerRecordById(CaseUserQuestionId int64) } // GetUserAnswerRecordPreloadById 获取数据-加载全部关联-id -func (r *UserAnswerRecordDao) GetUserAnswerRecordPreloadById(CaseUserQuestionId int64) (m *model.UserAnswerRecord, err error) { - err = global.Db.Preload(clause.Associations).First(&m, CaseUserQuestionId).Error +func (r *UserAnswerRecordDao) GetUserAnswerRecordPreloadById(RecordId int64) (m *model.UserAnswerRecord, err error) { + err = global.Db.Preload(clause.Associations).First(&m, RecordId).Error if err != nil { return nil, err } @@ -38,8 +38,8 @@ func (r *UserAnswerRecordDao) DeleteUserAnswerRecord(tx *gorm.DB, maps interface } // DeleteUserAnswerRecordById 删除-id -func (r *UserAnswerRecordDao) DeleteUserAnswerRecordById(tx *gorm.DB, CaseUserQuestionId int64) error { - if err := tx.Delete(&model.UserAnswerRecord{}, CaseUserQuestionId).Error; err != nil { +func (r *UserAnswerRecordDao) DeleteUserAnswerRecordById(tx *gorm.DB, RecordId int64) error { + if err := tx.Delete(&model.UserAnswerRecord{}, RecordId).Error; err != nil { return err } return nil @@ -55,8 +55,8 @@ func (r *UserAnswerRecordDao) EditUserAnswerRecord(tx *gorm.DB, maps interface{} } // EditUserAnswerRecordById 修改-id -func (r *UserAnswerRecordDao) EditUserAnswerRecordById(tx *gorm.DB, CaseUserQuestionId int64, data interface{}) error { - err := tx.Model(&model.UserAnswerRecord{}).Where("case_user_question_id = ?", CaseUserQuestionId).Updates(data).Error +func (r *UserAnswerRecordDao) EditUserAnswerRecordById(tx *gorm.DB, RecordId int64, data interface{}) error { + err := tx.Model(&model.UserAnswerRecord{}).Where("record_id = ?", RecordId).Updates(data).Error if err != nil { return err } diff --git a/api/dao/UserBehaviorRecord.go b/api/dao/UserBehaviorRecord.go new file mode 100644 index 0000000..14d078a --- /dev/null +++ b/api/dao/UserBehaviorRecord.go @@ -0,0 +1,117 @@ +package dao + +import ( + "case-open-api/api/model" + "case-open-api/global" + "gorm.io/gorm" + "gorm.io/gorm/clause" +) + +type UserBehaviorRecordDao struct { +} + +// GetUserBehaviorRecordById 获取数据-id +func (r *UserBehaviorRecordDao) GetUserBehaviorRecordById(RecordId int64) (m *model.UserBehaviorRecord, err error) { + err = global.Db.First(&m, RecordId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetUserBehaviorRecordPreloadById 获取数据-加载全部关联-id +func (r *UserBehaviorRecordDao) GetUserBehaviorRecordPreloadById(RecordId int64) (m *model.UserBehaviorRecord, err error) { + err = global.Db.Preload(clause.Associations).First(&m, RecordId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteUserBehaviorRecord 删除 +func (r *UserBehaviorRecordDao) DeleteUserBehaviorRecord(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.UserBehaviorRecord{}).Error + if err != nil { + return err + } + return nil +} + +// DeleteUserBehaviorRecordById 删除-id +func (r *UserBehaviorRecordDao) DeleteUserBehaviorRecordById(tx *gorm.DB, RecordId int64) error { + if err := tx.Delete(&model.UserBehaviorRecord{}, RecordId).Error; err != nil { + return err + } + return nil +} + +// EditUserBehaviorRecord 修改 +func (r *UserBehaviorRecordDao) EditUserBehaviorRecord(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.UserBehaviorRecord{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditUserBehaviorRecordById 修改-id +func (r *UserBehaviorRecordDao) EditUserBehaviorRecordById(tx *gorm.DB, RecordId int64, data interface{}) error { + err := tx.Model(&model.UserBehaviorRecord{}).Where("record_id = ?", RecordId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetUserBehaviorRecordList 获取列表 +func (r *UserBehaviorRecordDao) GetUserBehaviorRecordList(maps interface{}) (m []*model.UserBehaviorRecord, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetUserBehaviorRecordPreloadList 获取列表 +func (r *UserBehaviorRecordDao) GetUserBehaviorRecordPreloadList(maps interface{}) (m []*model.UserBehaviorRecord, err error) { + err = global.Db.Preload(clause.Associations).Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetUserBehaviorRecordCount 获取数量 +func (r *UserBehaviorRecordDao) GetUserBehaviorRecordCount(maps interface{}) (total int64, err error) { + err = global.Db.Model(&model.UserBehaviorRecord{}).Where(maps).Count(&total).Error + if err != nil { + return 0, err + } + return total, nil +} + +// GetUserBehaviorRecordListRand 获取列表-随机 +func (r *UserBehaviorRecordDao) GetUserBehaviorRecordListRand(maps interface{}, limit int) (m []*model.UserBehaviorRecord, err error) { + err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddUserBehaviorRecord 新增 +func (r *UserBehaviorRecordDao) AddUserBehaviorRecord(tx *gorm.DB, model *model.UserBehaviorRecord) (*model.UserBehaviorRecord, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetUserBehaviorRecord 获取 +func (r *UserBehaviorRecordDao) GetUserBehaviorRecord(maps interface{}) (m *model.UserBehaviorRecord, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dto/Res.go b/api/dto/Res.go index 1629034..077a806 100644 --- a/api/dto/Res.go +++ b/api/dto/Res.go @@ -63,6 +63,25 @@ type ResCaseRecordDto struct { Remark []*RemarkDto `json:"remark"` // 评论 } +// ResCaseBehaviorDto 病例用户操作行为 +type ResCaseBehaviorDto struct { + TslUid string `json:"tsl_uid"` // 天士力系统uid + Sid string `json:"sid"` // 病例id + StartTime string `json:"starttime"` // 开始时间 + EndTime string `json:"endtime"` // 结束时间 + UseTime int `json:"usetime"` // 总用时单位秒 + IsComplete int `json:"is_complete"` // 是否完成了问卷 1是,0 否 + Action []*ActionDto `json:"action"` // 步骤数组 +} + +// ActionDto 病例用户操作行为-步骤数组 +type ActionDto struct { + Step string `json:"step"` //步骤名称 + In string `json:"in"` //进入时间 + Out string `json:"out"` //结束时间 + UseTime int `json:"usetime"` //用时 单位秒 +} + // QuestionAnswerDto 病例领取记录-问题 type QuestionAnswerDto struct { Question string `json:"question"` // 问题标题 diff --git a/api/model/CaseUser.go b/api/model/CaseUser.go index d20126a..13fcf06 100644 --- a/api/model/CaseUser.go +++ b/api/model/CaseUser.go @@ -8,13 +8,15 @@ import ( // CaseUser 统计数据-病例-用户 type CaseUser struct { - CaseUserId int64 `gorm:"column:case_user_id;type:bigint(19);primary_key;comment:主键id" json:"case_user_id"` - CaseId int64 `gorm:"column:case_id;type:bigint(19);comment:所属病例id;NOT NULL" json:"case_id"` - PlatformId int64 `gorm:"column:platform_id;type:bigint(19);comment:用户所属平台id;NOT NULL" json:"platform_id"` - UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id;NOT NULL" json:"user_id"` - ShareUserIden string `gorm:"column:share_user_iden;type:varchar(100);comment:分享人标识" json:"share_user_iden"` - ReadDuration int `gorm:"column:read_duration;type:int(5);default:0;comment:阅读时长(秒)" json:"read_duration"` - TotalScore int `gorm:"column:total_score;type:int(5);default:0;comment:单个病例领取总积分" json:"total_score"` + CaseUserId int64 `gorm:"column:case_user_id;type:bigint(19);primary_key;comment:主键id" json:"case_user_id"` + CaseId int64 `gorm:"column:case_id;type:bigint(19);comment:所属病例id;NOT NULL" json:"case_id"` + PlatformId int64 `gorm:"column:platform_id;type:bigint(19);comment:用户所属平台id;NOT NULL" json:"platform_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id;NOT NULL" json:"user_id"` + ShareUserIden string `gorm:"column:share_user_iden;type:varchar(100);comment:分享人标识" json:"share_user_iden"` + ReadDuration int `gorm:"column:read_duration;type:int(5);default:0;comment:阅读时长(秒)" json:"read_duration"` + TotalScore int `gorm:"column:total_score;type:int(5);default:0;comment:单个病例领取总积分" json:"total_score"` + StartTime LocalTime `gorm:"column:start_time;type:datetime;comment:开始参与时间" json:"start_time"` + EndTime LocalTime `gorm:"column:end_time;type:datetime;comment:结束参与时间" json:"end_time"` Model Platform *Platform `gorm:"foreignKey:PlatformId;references:platform_id" json:"platform"` User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` diff --git a/api/model/UserAnswerRecord.go b/api/model/UserAnswerRecord.go index 78717ad..9b3eb66 100644 --- a/api/model/UserAnswerRecord.go +++ b/api/model/UserAnswerRecord.go @@ -20,7 +20,7 @@ type UserAnswerRecord struct { } func (m *UserAnswerRecord) TableName() string { - return "user_answer_records" + return "user_answer_record" } func (m *UserAnswerRecord) BeforeCreate(tx *gorm.DB) error { diff --git a/api/model/UserBehaviorRecord.go b/api/model/UserBehaviorRecord.go new file mode 100644 index 0000000..03c7f4f --- /dev/null +++ b/api/model/UserBehaviorRecord.go @@ -0,0 +1,37 @@ +package model + +import ( + "case-open-api/global" + "gorm.io/gorm" + "time" +) + +// UserBehaviorRecord 用户操作记录 +type UserBehaviorRecord struct { + RecordId int64 `gorm:"column:record_id;type:bigint(19);primary_key;comment:主键id" json:"record_id"` + CaseId int64 `gorm:"column:case_id;type:bigint(19);comment:病例id;NOT NULL" json:"case_id"` + PlatformId int64 `gorm:"column:platform_id;type:bigint(19);comment:平台id;NOT NULL" json:"platform_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id;NOT NULL" json:"user_id"` + Step string `gorm:"column:step;type:varchar(100);comment:步骤名称" json:"step"` + StartTime LocalTime `gorm:"column:start_time;type:datetime;comment:开始时间" json:"start_time"` + EndTime LocalTime `gorm:"column:end_time;type:datetime;comment:结束时间" json:"end_time"` + Model +} + +func (m *UserBehaviorRecord) TableName() string { + return "user_behavior_record" +} + +func (m *UserBehaviorRecord) BeforeCreate(tx *gorm.DB) error { + if m.RecordId == 0 { + m.RecordId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/requests/Res.go b/api/requests/Res.go index 5a84bbb..1228ade 100644 --- a/api/requests/Res.go +++ b/api/requests/Res.go @@ -1,9 +1,10 @@ package requests type ResRequest struct { - GetResProjectList // 获取项目列表 - GetResCaseList // 获取病例列表 - GetResCaseRecordList // 病例领取记录 + GetResProjectList // 获取项目列表 + GetResCaseList // 获取病例列表 + GetResCaseRecordList // 病例领取记录 + GetResCaseBehaviorList // 获取病例用户操作行为列表 } // GetResProjectList 获取项目列表 @@ -25,3 +26,11 @@ type GetResCaseRecordList struct { StartTime string `json:"starttime" form:"starttime" label:"开始时间"` EndTime string `json:"endtime" form:"endtime" label:"结束时间"` } + +// GetResCaseBehaviorList 获取病例用户操作行为列表 +type GetResCaseBehaviorList struct { + PlatformId int64 `json:"platform_id" form:"platform_id" label:"平台id"` + CaseId string `json:"sid" form:"sid" label:"病例标识" validate:"required"` + StartTime string `json:"starttime" form:"starttime" label:"开始时间" validate:"required"` + EndTime string `json:"endtime" form:"endtime" label:"结束时间" validate:"required"` +} diff --git a/api/router/router.go b/api/router/router.go index b3a15b9..586536a 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -101,6 +101,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 病例领取记录 resCaseGroup.GET("/record", api.Res.GetResCaseRecordList) + + // 获取病例用户操作行为列表 + resCaseGroup.GET("/behavior/list", api.Res.GetResCaseBehaviorList) } }