123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- package survey_result
- import (
- "fmt"
- "os"
- "strings"
- "surveyService/model"
- "surveyService/response"
- "surveyService/sdk/survey_disease"
- "surveyService/service/survey"
- "surveyService/service/survey_mechanism"
- "surveyService/service/survey_token"
- "surveyService/util"
- "surveyService/util/rabbitmq"
- "surveyService/validators"
- "github.com/golang-module/carbon"
- jsoniter "github.com/json-iterator/go"
- "gogs.uu.mdfitnesscao.com/hys/sdk"
- "gogs.uu.mdfitnesscao.com/hys/sdk/mechanism"
- )
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- type Mechanism struct {
- *sdk.AuthMechanism
- }
- func InitMechanism(authMechanism *sdk.AuthMechanism) *Mechanism {
- return &Mechanism{authMechanism}
- }
- // 获取问卷结果
- func (m *Mechanism) Detail(sn string) (*model.SurveyResult, *response.ErrCode) {
- var surveyResult *model.SurveyResult
- err := model.DB.Where("sn = ?", sn).Preload("SurveyMechanism").First(&surveyResult).Error
- if err != nil {
- return nil, &response.ErrCode{
- Code: response.ERROR,
- Msg: "获取问卷结果失败",
- }
- }
- if m.AuthMechanism != nil && m.Mechanism.ID != surveyResult.SurveyMechanism.MechanismId {
- return nil, &response.ErrCode{
- Code: response.ERROR,
- Msg: "没有找到有效的问卷结果数据",
- }
- }
- return surveyResult, nil
- }
- // // 获取某个问卷最后一份的结果
- // func (m *Mechanism) LastResult(surveyMechanismId string) (*model.SurveyResult, *response.ErrCode) {
- // }
- // 获取问卷结果
- func (m *Mechanism) DetailByExtra(extra string) (*model.SurveyResult, *response.ErrCode) {
- tx := model.DB.Model(&model.SurveyResult{})
- var surveyResult *model.SurveyResult
- err := tx.Where("extra = ?", extra).Preload("SurveyMechanism").First(&surveyResult).Error
- if err != nil {
- return nil, &response.ErrCode{
- Code: response.ERROR,
- Msg: "获取问卷结果失败",
- }
- }
- if m.AuthMechanism != nil && m.Mechanism.ID != surveyResult.SurveyMechanism.MechanismId {
- return nil, &response.ErrCode{
- Code: response.ERROR,
- Msg: "没有找到有效的问卷结果数据",
- }
- }
- return surveyResult, nil
- }
- // 获取问卷结果列表
- func (m *Mechanism) Paginate(queryData validators.SurveyResultPaginate) ([]*model.SurveyResult, int64, *response.ErrCode) {
- var surveyResults []*model.SurveyResult = make([]*model.SurveyResult, 0)
- var total int64
- query := model.DB.Model(model.SurveyResult{})
- if queryData.Method != 0 {
- query = query.Where("method = ?", queryData.Method)
- }
- if queryData.SurveyMechanismId != "" {
- surveyMechanismRawId := (&model.SurveyMechanism{}).GetRawId(queryData.SurveyMechanismId)
- if surveyMechanismRawId == 0 {
- return surveyResults, total, &response.ErrCode{
- Code: response.ERROR,
- Msg: "无效的问卷编号",
- }
- }
- query = query.Where("survey_mechanism_id = ?", surveyMechanismRawId)
- }
- if queryData.ArchivesId != "" {
- query = query.Where("archives_id = ?", queryData.ArchivesId)
- }
- if m.AuthMechanism == nil {
- if queryData.SurveyId != "" {
- surveyRawId := (&model.Survey{}).GetRawId(queryData.SurveyId)
- if surveyRawId == 0 {
- return surveyResults, total, &response.ErrCode{
- Code: response.ERROR,
- Msg: "无效的问卷编号",
- }
- }
- query = query.Where("survey_mechanism_id in ?", model.DB.Where("survey_id = ?", surveyRawId).Select("id").Model(&model.SurveyMechanism{}))
- }
- }
- mechanismId := ""
- if m.AuthMechanism != nil {
- mechanismId = m.Mechanism.ID
- }
- query.Scopes(model.MechanismQuery(mechanismId)).Count(&total)
- if total == 0 {
- return surveyResults, total, nil
- }
- query.Scopes(model.Paginate(queryData.Page, queryData.PageSize)).Scopes(model.MechanismQuery(mechanismId)).Preload("SurveyMechanism").Order("start_time desc").Find(&surveyResults)
- return surveyResults, total, nil
- }
- // 修改答题人
- func (m *Mechanism) UpdateArchivesId(sn string, archivesId string) *response.ErrCode {
- // 获取问卷结果数据
- surveyResult, findErr := m.Detail(sn)
- if findErr != nil {
- return findErr
- }
- // Todo 检查档案是否有效
- // 只有后台新增的才可以修改
- if surveyResult.Method == model.SurveyResultMethodArchives {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "当前问卷不允许修改答题人",
- }
- }
- // 保存问卷结果
- updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Update("archives_id", archivesId).Error
- if updateErr != nil {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "保存问卷结果失败",
- }
- }
- return nil
- }
- // 重新提交到转译系统
- func (m *Mechanism) Run(sn string) *response.ErrCode {
- // 获取问卷结果
- surveyResult, findErr := m.Detail(sn)
- if findErr != nil {
- return findErr
- }
- var answers map[string]any
- fmt.Println(surveyResult.AnswerRaw)
- unmarshalErr := json.UnmarshalFromString(surveyResult.AnswerRaw, &answers)
- if unmarshalErr != nil {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "无效的答案",
- }
- }
- _, findErr = survey.Find(surveyResult.SurveyMechanism.SurveyId)
- if findErr != nil {
- return findErr
- }
- var formatedAnswers map[string]*sdk.SurveyAnswer
- jsoniter.UnmarshalFromString(util.JsonEncode(answers), &formatedAnswers)
- surveyDiseaseCalcResult := survey_disease.DiseaseScreeningCal(
- formatedAnswers,
- )
- ProcessResult(sn, surveyDiseaseCalcResult)
- return nil
- }
- // 格式化答题结果
- func Format(rawSurveyResult *model.SurveyResult, needResult bool) *validators.SurveyResult {
- var answerResult map[string]any
- var resultRaw string
- if needResult {
- if rawSurveyResult.AnswerRaw != "" {
- json.UnmarshalFromString(rawSurveyResult.AnswerRaw, &answerResult)
- }
- resultRaw = rawSurveyResult.ResultRaw
- }
- return &validators.SurveyResult{
- ID: rawSurveyResult.SN,
- Method: rawSurveyResult.Method,
- StartTime: carbon.Time2Carbon(rawSurveyResult.StartTime).Format("Y/m/d H:i:s"),
- EndTime: carbon.Time2Carbon(rawSurveyResult.EndTime).Format("Y/m/d H:i:s"),
- Status: rawSurveyResult.Status,
- ArchivesId: rawSurveyResult.ArchivesId,
- AnswerResult: answerResult,
- ResultRaw: resultRaw,
- CanAnalyze: rawSurveyResult.AnswerRaw != "",
- SurveyMechanismId: (&model.SurveyMechanism{}).GetHashId(rawSurveyResult.SurveyMechanismId),
- SurveyMechanism: survey_mechanism.ListFormat([]*model.SurveyMechanism{rawSurveyResult.SurveyMechanism})[0],
- CreatedAt: carbon.Time2Carbon(rawSurveyResult.CreatedAt).Format("Y/m/d H:i:s"),
- UpdatedAt: carbon.Time2Carbon(rawSurveyResult.UpdatedAt).Format("Y/m/d H:i:s"),
- }
- }
- // 接收问卷结果回调
- func ReceiveResult(modelSn, extra string, modelType int, data map[string]any) *response.ErrCode {
- if modelType != 1 {
- return nil
- }
- // 获取问卷结果数据
- surveyResult, findErr := InitMechanism(nil).Detail(extra)
- if findErr != nil {
- return findErr
- }
- // 只有在填写中的问卷才能保存
- if surveyResult.Status != model.SurveyResultStatusFulled {
- fmt.Println("当前问卷状态不支持保存结果")
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "当前问卷状态不支持保存结果",
- }
- }
- // 保存问卷结果
- updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Select([]string{"ResultRaw", "Status"}).Updates(&model.SurveyResult{
- ResultRaw: util.JsonEncode(data),
- Status: model.SurveyResultStatusDone,
- }).Error
- if updateErr != nil {
- fmt.Println("保存问卷结果失败")
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "保存问卷结果失败",
- }
- }
- // 开始回调机构配置的回调地址
- go CallbackSurveyResultToMechanism(surveyResult.SN)
- return nil
- }
- // 接收问卷结果回调
- func ProcessResult(sn string, data *survey_disease.SurveyResult) *response.ErrCode {
- // 获取问卷结果数据
- surveyResult, findErr := InitMechanism(nil).Detail(sn)
- if findErr != nil {
- return findErr
- }
- // 只有在填写中的问卷才能保存
- if surveyResult.Status != model.SurveyResultStatusFulled {
- fmt.Println("当前问卷状态不支持保存结果")
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "当前问卷状态不支持保存结果",
- }
- }
- // 保存问卷结果
- updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Select([]string{"ResultRaw", "Status"}).Updates(&model.SurveyResult{
- ResultRaw: util.JsonEncode(map[string]any{
- "result": data,
- }),
- Status: model.SurveyResultStatusDone,
- }).Error
- if updateErr != nil {
- fmt.Println("保存问卷结果失败")
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "保存问卷结果失败",
- }
- }
- // 开始回调机构配置的回调地址
- go CallbackSurveyResultToMechanism(surveyResult.SN)
- return nil
- }
- // 将PDF报告推送至机构端
- func CallbackSurveyResultToMechanism(surveyResultId string) *response.ErrCode {
- surveyResult, findSurveyResultErr := InitMechanism(nil).Detail(surveyResultId)
- if findSurveyResultErr != nil {
- return findSurveyResultErr
- }
- if surveyResult.Extra == "" {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "无自定义参数,不回调",
- }
- }
- var callbackData map[string]any = map[string]any{
- "dataType": "Survey",
- "errMsg": "",
- "extra": surveyResult.Extra,
- "surveyId": surveyResult.SurveyMechanism.SN,
- "status": surveyResult.Status,
- }
- // 检查机构是否配置了回调地址
- mechanismListResponse, findErr := mechanism.ListMechanism([]string{surveyResult.MechanismId})
- if findErr != nil {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "获取机构信息失败: " + findErr.Msg,
- }
- }
- if len(mechanismListResponse.Data.List) == 0 {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "没有找到机构信息",
- }
- }
- // 开始推送
- var mechanismInfo = mechanismListResponse.Data.List[0]
- if mechanismInfo.CallbackUrlList == "" {
- return &response.ErrCode{
- Code: response.ERROR,
- Msg: "机构没有配置回调地址",
- }
- }
- // 开始推送
- var callbackUrlList []string = strings.Split(mechanismInfo.CallbackUrlList, "\n")
- for _, callbackUrl := range callbackUrlList {
- if callbackUrl == "" {
- continue
- }
- var webhookMessage rabbitmq.WebhookMessage
- webhookMessage.Body = callbackData
- webhookMessage.Config.Url = callbackUrl
- rabbitmq.Webhook(webhookMessage)
- }
- return nil
- }
- // 创建一个可以临时访问结果的链接
- func (m *Mechanism) GetSurveyResultVisitLink(extra string) (string, int64, *model.SurveyResult, *response.ErrCode) {
- var timeout int64 = 7200
- // 检查问卷是否已被完成
- surveyResult, findErr := m.DetailByExtra(extra)
- if findErr != nil {
- return "", timeout, nil, findErr
- }
- // 检查问卷结果是否存在
- token := survey_token.InitMechanism(m.AuthMechanism).GenerateSurveyToken(surveyResult.SurveyMechanism.SN, surveyResult.SN, extra, timeout)
- if token == "" {
- return "", timeout, surveyResult, &response.ErrCode{
- Msg: "生成临时访问链接失败",
- Code: response.ERROR,
- }
- }
- return fmt.Sprintf("%s/#/%s/survey/result?id=%s&surveyMechanismId=%s&token=%s", os.Getenv("H5_DOMAIN"), m.Mechanism.ID, surveyResult.SN, surveyResult.SurveyMechanism.SN, token), timeout, surveyResult, nil
- }
|