From e2eea97c120639acc284e0393f6c268832e26d15 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 14 Apr 2025 17:22:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E8=B4=A8=E7=95=99=E8=A8=80=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E7=94=A8=E6=88=B7=E5=8F=82=E4=B8=8E=E6=83=85=E5=86=B5?= =?UTF-8?q?-=E5=8F=AA=E4=B8=8A=E6=8A=A5=E4=BC=98=E8=B4=A8=E7=95=99?= =?UTF-8?q?=E8=A8=80-=E4=BD=B3=E5=8A=A8=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/CaseComment.go | 10 ++ api/dao/CaseUser.go | 9 ++ api/dao/RecordScore.go | 9 ++ api/service/User.go | 82 +++++++++++ extend/superKangaroo/ReportCaseRecord.go | 172 +++++++++++++++++++++++ 5 files changed, 282 insertions(+) create mode 100644 extend/superKangaroo/ReportCaseRecord.go diff --git a/api/controller/CaseComment.go b/api/controller/CaseComment.go index a38e0fa..3ca16e8 100644 --- a/api/controller/CaseComment.go +++ b/api/controller/CaseComment.go @@ -278,6 +278,16 @@ func (b *CaseComment) AddCaseCommentHighQuality(c *gin.Context) { return } + // 上报用户参与情况-只上报优质留言-佳动力 + if caseComment.PlatformId == 2 { + err = userService.ReportCaseRecord(tx, result.ProjectId, caseComment.CaseId, user) + if err != nil { + tx.Rollback() + responses.FailWithMessage(err.Error(), c) + return + } + } + caseCommentData := make(map[string]interface{}) caseCommentData["is_high_quality"] = req.IsHighQuality caseCommentData["is_grant_high_quality"] = 1 diff --git a/api/dao/CaseUser.go b/api/dao/CaseUser.go index 25f9d7a..ad7a2a0 100644 --- a/api/dao/CaseUser.go +++ b/api/dao/CaseUser.go @@ -110,6 +110,15 @@ func (r *CaseUserDao) GetCaseUser(maps interface{}) (m *model.CaseUser, err erro return m, nil } +// GetCaseUserPreload 获取 +func (r *CaseUserDao) GetCaseUserPreload(maps interface{}) (m *model.CaseUser, err error) { + err = global.Db.Preload(clause.Associations).Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // GetCaseUserUseTx 获取 func (r *CaseUserDao) GetCaseUserUseTx(tx *gorm.DB, maps interface{}) (m *model.CaseUser, err error) { err = tx.Where(maps).First(&m).Error diff --git a/api/dao/RecordScore.go b/api/dao/RecordScore.go index b406874..5d71b8a 100644 --- a/api/dao/RecordScore.go +++ b/api/dao/RecordScore.go @@ -115,3 +115,12 @@ func (r *RecordScoreDao) GetRecordScoreUseTx(tx *gorm.DB, maps interface{}) (m * } return m, nil } + +// GetRecordScoreListUseTx 获取 +func (r *RecordScoreDao) GetRecordScoreListUseTx(tx *gorm.DB, maps interface{}) (m []*model.RecordScore, err error) { + err = tx.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/service/User.go b/api/service/User.go index 884d949..35154e8 100644 --- a/api/service/User.go +++ b/api/service/User.go @@ -261,3 +261,85 @@ func (r *UserService) ReportUserScore(tx *gorm.DB, projectId, caseId, platformId return nil } + +// ReportCaseRecord 上报用户参与情况-只上报优质留言 +func (r *UserService) ReportCaseRecord(tx *gorm.DB, projectId, caseId int64, user *model.User) (err error) { + caseUserDao := dao.CaseUserDao{} + maps := make(map[string]interface{}) + maps["project_id"] = projectId + maps["case_id"] = caseId + maps["user_id"] = user.UserId + caseUser, err := caseUserDao.GetCaseUser(maps) + if err != nil { + return err + } + + recordScoreDao := dao.RecordScoreDao{} + caseCommentDao := dao.CaseCommentDao{} + + // 获取积分发放记录 + maps = make(map[string]interface{}) + maps["project_id"] = projectId + maps["case_id"] = caseId + maps["platform_id"] = caseUser.PlatformId + maps["user_id"] = user.UserId + recordScores, _ := recordScoreDao.GetRecordScoreListUseTx(tx, maps) + + // 获取用户评论 + maps = make(map[string]interface{}) + maps["case_id"] = caseId + maps["platform_id"] = caseUser.PlatformId + maps["user_id"] = user.UserId + maps["status"] = 1 + caseComments, _ := caseCommentDao.GetCaseCommentList(maps) + + // 组装请求数据 + requestData := superKangaroo.ReportCaseRecordRequest{ + CaseUserId: fmt.Sprintf("%d", caseUser.CaseUserId), + Sid: fmt.Sprintf("%d", caseUser.CaseId), + TslUid: user.UserIden, + Credit1: 0, + Credit2: 0, + Credit3: 0, + Credit4: 0, + HasRemark: 0, + Remark: nil, + } + + // 积分 + for _, v3 := range recordScores { + if v3.Type == 1 { + requestData.Credit1 = v3.Score + } + + if v3.Type == 2 { + requestData.Credit2 = v3.Score + } + + if v3.Type == 3 { + requestData.Credit4 = v3.Score + } + } + + // 评论 + if len(caseComments) > 0 { + requestData.Remark = make([]*superKangaroo.RemarkRequest, len(caseComments)) + + requestData.HasRemark = 1 + for i2, comment := range caseComments { + remarkDto := &superKangaroo.RemarkRequest{ + Remark: comment.Content, + CreateTime: time.Time(comment.CreatedAt).Format("2006-01-02 15:04:05"), + } + + requestData.Remark[i2] = remarkDto + } + } + + _, err = superKangaroo.ReportCaseRecord(requestData) + if err != nil { + return err + } + + return nil +} diff --git a/extend/superKangaroo/ReportCaseRecord.go b/extend/superKangaroo/ReportCaseRecord.go new file mode 100644 index 0000000..c1842d6 --- /dev/null +++ b/extend/superKangaroo/ReportCaseRecord.go @@ -0,0 +1,172 @@ +package superKangaroo + +import ( + "bytes" + "case-admin-api/config" + "case-admin-api/utils" + "encoding/json" + "errors" + "fmt" + "io" + "mime/multipart" + "net/http" + "net/url" + "strconv" + "time" +) + +type ReportCaseRecordRequest struct { + CaseUserId string `json:"id"` // 主键id + Sid string `json:"sid"` // 病例id + TslUid string `json:"tsl_uid"` // 天士力系统uid + Credit1 int `json:"credit1"` // 阅读完成积分 + Credit2 int `json:"credit2"` // 调研奖励(阅读质量) 阅读时长 + Credit3 int `json:"credit3"` // 调研奖励(留言)—评论奖励 + Credit4 int `json:"credit4"` // 调研奖励(社区贡献) 优质提问或者优质解答 + HasRemark int `json:"has_remark"` // 是否有评论 1是,0否 + Remark []*RemarkRequest `json:"remark"` // 评论 +} + +// RemarkRequest 病例领取记录-评论 +type RemarkRequest struct { + Remark string `json:"remark"` // 评论 + CreateTime string `json:"createtime"` // 时间 +} + +// ReportCaseRecordResponse 返回数据 +type ReportCaseRecordResponse struct { + Code interface{} `json:"code"` // 接口调用状态。200:正常;其它值:调用出错 + Msg string `json:"msg"` // 结果说明。如果接口调用出错,那么返回错误描述。成功则返回 ok + Data string `json:"data"` // 接口返回结果,各个接口自定义,数据结构参考具体文档说明 +} + +// ReportCaseRecord 上报用户病例领取记录-只上报优质留言 +func ReportCaseRecord(requestData ReportCaseRecordRequest) (g *ReportCaseRecordResponse, err error) { + remarkJsonStr, err := StructToJSONString(requestData.Remark) + if err != nil { + return g, err + } + + // 创建 form-data 的请求体 + var bodyBuffer bytes.Buffer + writer := multipart.NewWriter(&bodyBuffer) + + // 写入字段数据 + err = writer.WriteField("id", requestData.CaseUserId) + if err != nil { + return g, err + } + err = writer.WriteField("sid", requestData.Sid) + if err != nil { + return g, err + } + err = writer.WriteField("tsl_uid", requestData.TslUid) + if err != nil { + return g, err + } + err = writer.WriteField("credit1", fmt.Sprintf("%d", requestData.Credit1)) + if err != nil { + return g, err + } + err = writer.WriteField("credit2", fmt.Sprintf("%d", requestData.Credit2)) + if err != nil { + return g, err + } + err = writer.WriteField("credit3", fmt.Sprintf("%d", requestData.Credit3)) + if err != nil { + return g, err + } + err = writer.WriteField("credit4", fmt.Sprintf("%d", requestData.Credit4)) + if err != nil { + return g, err + } + err = writer.WriteField("has_remark", fmt.Sprintf("%d", requestData.HasRemark)) + if err != nil { + return g, err + } + err = writer.WriteField("remark", remarkJsonStr) + if err != nil { + return g, err + } + + // 关闭 writer(写入结束标记) + err = writer.Close() + if err != nil { + return g, err + } + + // 随机6位数 + nonce := generateRandom6Digit() + + // 当前毫秒时间戳 + curTime := strconv.FormatInt(time.Now().UnixNano()/1e6, 10) + + // 获取请求签名 + sign, err := GenSignature("", strconv.Itoa(nonce), curTime) + if err != nil { + return g, err + } + + // 设置请求 URL + u, err := url.Parse(config.C.SuperKangaroo.ApiUrl + "newindex/sorceUpdate") + if err != nil { + return g, err + } + + query := u.Query() + query.Set("secret", config.C.SuperKangaroo.SecretKey) + query.Set("nonce", strconv.Itoa(nonce)) + query.Set("curTime", curTime) + query.Set("checkSum", sign) + u.RawQuery = query.Encode() + + utils.LogJsonInfo("请求超级袋鼠数据参数", requestData) + + // 创建 POST 请求 + req, err := http.NewRequest("POST", u.String(), &bodyBuffer) + if err != nil { + return g, err + } + + // 设置请求头 + req.Header.Set("Content-Type", writer.FormDataContentType()) + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return g, err + } + + defer func(Body io.ReadCloser) { + _ = Body.Close() + }(resp.Body) + + body, err := io.ReadAll(resp.Body) + if err != nil { + return g, err + } + + // 检查响应状态码 + if resp.StatusCode != 200 { + return g, errors.New("失败") + } + + err = json.Unmarshal(body, &g) + if err != nil { + // json解析失败 + return g, err + } + + utils.LogJsonInfo("获取超级袋鼠数据返回", g) + + if g.Code != 1 && g.Code != "1" && g.Code != float64(1) { + if g.Msg != "" { + return g, errors.New(g.Msg) + } else { + return g, errors.New("失败") + } + } + + return g, nil +}