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 }