survey_result.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. package survey_result
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "surveyService/model"
  7. "surveyService/response"
  8. "surveyService/sdk/survey_disease"
  9. "surveyService/service/survey"
  10. "surveyService/service/survey_mechanism"
  11. "surveyService/service/survey_token"
  12. "surveyService/util"
  13. "surveyService/util/rabbitmq"
  14. "surveyService/validators"
  15. "github.com/golang-module/carbon"
  16. jsoniter "github.com/json-iterator/go"
  17. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk"
  18. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk/mechanism"
  19. )
  20. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  21. type Mechanism struct {
  22. *sdk.AuthMechanism
  23. }
  24. func InitMechanism(authMechanism *sdk.AuthMechanism) *Mechanism {
  25. return &Mechanism{authMechanism}
  26. }
  27. // 获取问卷结果
  28. func (m *Mechanism) Detail(sn string) (*model.SurveyResult, *response.ErrCode) {
  29. var surveyResult *model.SurveyResult
  30. err := model.DB.Where("sn = ?", sn).Preload("SurveyMechanism").First(&surveyResult).Error
  31. if err != nil {
  32. return nil, &response.ErrCode{
  33. Code: response.ERROR,
  34. Msg: "获取问卷结果失败",
  35. }
  36. }
  37. if m.AuthMechanism != nil && m.Mechanism.ID != surveyResult.SurveyMechanism.MechanismId {
  38. return nil, &response.ErrCode{
  39. Code: response.ERROR,
  40. Msg: "没有找到有效的问卷结果数据",
  41. }
  42. }
  43. return surveyResult, nil
  44. }
  45. // // 获取某个问卷最后一份的结果
  46. // func (m *Mechanism) LastResult(surveyMechanismId string) (*model.SurveyResult, *response.ErrCode) {
  47. // }
  48. // 获取问卷结果
  49. func (m *Mechanism) DetailByExtra(extra string) (*model.SurveyResult, *response.ErrCode) {
  50. tx := model.DB.Model(&model.SurveyResult{})
  51. var surveyResult *model.SurveyResult
  52. err := tx.Where("extra = ?", extra).Preload("SurveyMechanism").First(&surveyResult).Error
  53. if err != nil {
  54. return nil, &response.ErrCode{
  55. Code: response.ERROR,
  56. Msg: "获取问卷结果失败",
  57. }
  58. }
  59. if m.AuthMechanism != nil && m.Mechanism.ID != surveyResult.SurveyMechanism.MechanismId {
  60. return nil, &response.ErrCode{
  61. Code: response.ERROR,
  62. Msg: "没有找到有效的问卷结果数据",
  63. }
  64. }
  65. return surveyResult, nil
  66. }
  67. // 获取问卷结果列表
  68. func (m *Mechanism) Paginate(queryData validators.SurveyResultPaginate) ([]*model.SurveyResult, int64, *response.ErrCode) {
  69. var surveyResults []*model.SurveyResult = make([]*model.SurveyResult, 0)
  70. var total int64
  71. query := model.DB.Model(model.SurveyResult{})
  72. if queryData.Method != 0 {
  73. query = query.Where("method = ?", queryData.Method)
  74. }
  75. if queryData.SurveyMechanismId != "" {
  76. surveyMechanismRawId := (&model.SurveyMechanism{}).GetRawId(queryData.SurveyMechanismId)
  77. if surveyMechanismRawId == 0 {
  78. return surveyResults, total, &response.ErrCode{
  79. Code: response.ERROR,
  80. Msg: "无效的问卷编号",
  81. }
  82. }
  83. query = query.Where("survey_mechanism_id = ?", surveyMechanismRawId)
  84. }
  85. if queryData.ArchivesId != "" {
  86. query = query.Where("archives_id = ?", queryData.ArchivesId)
  87. }
  88. if m.AuthMechanism == nil {
  89. if queryData.SurveyId != "" {
  90. surveyRawId := (&model.Survey{}).GetRawId(queryData.SurveyId)
  91. if surveyRawId == 0 {
  92. return surveyResults, total, &response.ErrCode{
  93. Code: response.ERROR,
  94. Msg: "无效的问卷编号",
  95. }
  96. }
  97. query = query.Where("survey_mechanism_id in ?", model.DB.Where("survey_id = ?", surveyRawId).Select("id").Model(&model.SurveyMechanism{}))
  98. }
  99. }
  100. mechanismId := ""
  101. if m.AuthMechanism != nil {
  102. mechanismId = m.Mechanism.ID
  103. }
  104. query.Scopes(model.MechanismQuery(mechanismId)).Count(&total)
  105. if total == 0 {
  106. return surveyResults, total, nil
  107. }
  108. query.Scopes(model.Paginate(queryData.Page, queryData.PageSize)).Scopes(model.MechanismQuery(mechanismId)).Preload("SurveyMechanism").Order("start_time desc").Find(&surveyResults)
  109. return surveyResults, total, nil
  110. }
  111. // 修改答题人
  112. func (m *Mechanism) UpdateArchivesId(sn string, archivesId string) *response.ErrCode {
  113. // 获取问卷结果数据
  114. surveyResult, findErr := m.Detail(sn)
  115. if findErr != nil {
  116. return findErr
  117. }
  118. // Todo 检查档案是否有效
  119. // 只有后台新增的才可以修改
  120. if surveyResult.Method == model.SurveyResultMethodArchives {
  121. return &response.ErrCode{
  122. Code: response.ERROR,
  123. Msg: "当前问卷不允许修改答题人",
  124. }
  125. }
  126. // 保存问卷结果
  127. updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Update("archives_id", archivesId).Error
  128. if updateErr != nil {
  129. return &response.ErrCode{
  130. Code: response.ERROR,
  131. Msg: "保存问卷结果失败",
  132. }
  133. }
  134. return nil
  135. }
  136. // 重新提交到转译系统
  137. func (m *Mechanism) Run(sn string) *response.ErrCode {
  138. // 获取问卷结果
  139. surveyResult, findErr := m.Detail(sn)
  140. if findErr != nil {
  141. return findErr
  142. }
  143. var answers map[string]any
  144. fmt.Println(surveyResult.AnswerRaw)
  145. unmarshalErr := json.UnmarshalFromString(surveyResult.AnswerRaw, &answers)
  146. if unmarshalErr != nil {
  147. return &response.ErrCode{
  148. Code: response.ERROR,
  149. Msg: "无效的答案",
  150. }
  151. }
  152. _, findErr = survey.Find(surveyResult.SurveyMechanism.SurveyId)
  153. if findErr != nil {
  154. return findErr
  155. }
  156. var formatedAnswers map[string]*sdk.SurveyAnswer
  157. jsoniter.UnmarshalFromString(util.JsonEncode(answers), &formatedAnswers)
  158. surveyDiseaseCalcResult := survey_disease.DiseaseScreeningCal(
  159. formatedAnswers,
  160. )
  161. ProcessResult(sn, surveyDiseaseCalcResult)
  162. return nil
  163. }
  164. // 格式化答题结果
  165. func Format(rawSurveyResult *model.SurveyResult, needResult bool) *validators.SurveyResult {
  166. var answerResult map[string]any
  167. var resultRaw string
  168. if needResult {
  169. if rawSurveyResult.AnswerRaw != "" {
  170. json.UnmarshalFromString(rawSurveyResult.AnswerRaw, &answerResult)
  171. }
  172. resultRaw = rawSurveyResult.ResultRaw
  173. }
  174. return &validators.SurveyResult{
  175. ID: rawSurveyResult.SN,
  176. Method: rawSurveyResult.Method,
  177. StartTime: carbon.Time2Carbon(rawSurveyResult.StartTime).Format("Y/m/d H:i:s"),
  178. EndTime: carbon.Time2Carbon(rawSurveyResult.EndTime).Format("Y/m/d H:i:s"),
  179. Status: rawSurveyResult.Status,
  180. ArchivesId: rawSurveyResult.ArchivesId,
  181. AnswerResult: answerResult,
  182. ResultRaw: resultRaw,
  183. CanAnalyze: rawSurveyResult.AnswerRaw != "",
  184. SurveyMechanismId: (&model.SurveyMechanism{}).GetHashId(rawSurveyResult.SurveyMechanismId),
  185. SurveyMechanism: survey_mechanism.ListFormat([]*model.SurveyMechanism{rawSurveyResult.SurveyMechanism})[0],
  186. CreatedAt: carbon.Time2Carbon(rawSurveyResult.CreatedAt).Format("Y/m/d H:i:s"),
  187. UpdatedAt: carbon.Time2Carbon(rawSurveyResult.UpdatedAt).Format("Y/m/d H:i:s"),
  188. }
  189. }
  190. // 接收问卷结果回调
  191. func ReceiveResult(modelSn, extra string, modelType int, data map[string]any) *response.ErrCode {
  192. if modelType != 1 {
  193. return nil
  194. }
  195. // 获取问卷结果数据
  196. surveyResult, findErr := InitMechanism(nil).Detail(extra)
  197. if findErr != nil {
  198. return findErr
  199. }
  200. // 只有在填写中的问卷才能保存
  201. if surveyResult.Status != model.SurveyResultStatusFulled {
  202. fmt.Println("当前问卷状态不支持保存结果")
  203. return &response.ErrCode{
  204. Code: response.ERROR,
  205. Msg: "当前问卷状态不支持保存结果",
  206. }
  207. }
  208. // 保存问卷结果
  209. updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Select([]string{"ResultRaw", "Status"}).Updates(&model.SurveyResult{
  210. ResultRaw: util.JsonEncode(data),
  211. Status: model.SurveyResultStatusDone,
  212. }).Error
  213. if updateErr != nil {
  214. fmt.Println("保存问卷结果失败")
  215. return &response.ErrCode{
  216. Code: response.ERROR,
  217. Msg: "保存问卷结果失败",
  218. }
  219. }
  220. // 开始回调机构配置的回调地址
  221. go CallbackSurveyResultToMechanism(surveyResult.SN)
  222. return nil
  223. }
  224. // 接收问卷结果回调
  225. func ProcessResult(sn string, data *survey_disease.SurveyResult) *response.ErrCode {
  226. // 获取问卷结果数据
  227. surveyResult, findErr := InitMechanism(nil).Detail(sn)
  228. if findErr != nil {
  229. return findErr
  230. }
  231. // 只有在填写中的问卷才能保存
  232. if surveyResult.Status != model.SurveyResultStatusFulled {
  233. fmt.Println("当前问卷状态不支持保存结果")
  234. return &response.ErrCode{
  235. Code: response.ERROR,
  236. Msg: "当前问卷状态不支持保存结果",
  237. }
  238. }
  239. // 保存问卷结果
  240. updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Select([]string{"ResultRaw", "Status"}).Updates(&model.SurveyResult{
  241. ResultRaw: util.JsonEncode(map[string]any{
  242. "result": data,
  243. }),
  244. Status: model.SurveyResultStatusDone,
  245. }).Error
  246. if updateErr != nil {
  247. fmt.Println("保存问卷结果失败")
  248. return &response.ErrCode{
  249. Code: response.ERROR,
  250. Msg: "保存问卷结果失败",
  251. }
  252. }
  253. // 开始回调机构配置的回调地址
  254. go CallbackSurveyResultToMechanism(surveyResult.SN)
  255. return nil
  256. }
  257. // 将PDF报告推送至机构端
  258. func CallbackSurveyResultToMechanism(surveyResultId string) *response.ErrCode {
  259. surveyResult, findSurveyResultErr := InitMechanism(nil).Detail(surveyResultId)
  260. if findSurveyResultErr != nil {
  261. return findSurveyResultErr
  262. }
  263. if surveyResult.Extra == "" {
  264. return &response.ErrCode{
  265. Code: response.ERROR,
  266. Msg: "无自定义参数,不回调",
  267. }
  268. }
  269. var callbackData map[string]any = map[string]any{
  270. "dataType": "Survey",
  271. "errMsg": "",
  272. "extra": surveyResult.Extra,
  273. "surveyId": surveyResult.SurveyMechanism.SN,
  274. "status": surveyResult.Status,
  275. }
  276. // 检查机构是否配置了回调地址
  277. mechanismListResponse, findErr := mechanism.ListMechanism([]string{surveyResult.MechanismId})
  278. if findErr != nil {
  279. return &response.ErrCode{
  280. Code: response.ERROR,
  281. Msg: "获取机构信息失败: " + findErr.Msg,
  282. }
  283. }
  284. if len(mechanismListResponse.Data.List) == 0 {
  285. return &response.ErrCode{
  286. Code: response.ERROR,
  287. Msg: "没有找到机构信息",
  288. }
  289. }
  290. // 开始推送
  291. var mechanismInfo = mechanismListResponse.Data.List[0]
  292. if mechanismInfo.CallbackUrlList == "" {
  293. return &response.ErrCode{
  294. Code: response.ERROR,
  295. Msg: "机构没有配置回调地址",
  296. }
  297. }
  298. // 开始推送
  299. var callbackUrlList []string = strings.Split(mechanismInfo.CallbackUrlList, "\n")
  300. for _, callbackUrl := range callbackUrlList {
  301. if callbackUrl == "" {
  302. continue
  303. }
  304. var webhookMessage rabbitmq.WebhookMessage
  305. webhookMessage.Body = callbackData
  306. webhookMessage.Config.Url = callbackUrl
  307. rabbitmq.Webhook(webhookMessage)
  308. }
  309. return nil
  310. }
  311. // 创建一个可以临时访问结果的链接
  312. func (m *Mechanism) GetSurveyResultVisitLink(extra string) (string, int64, *model.SurveyResult, *response.ErrCode) {
  313. var timeout int64 = 7200
  314. // 检查问卷是否已被完成
  315. surveyResult, findErr := m.DetailByExtra(extra)
  316. if findErr != nil {
  317. return "", timeout, nil, findErr
  318. }
  319. // 检查问卷结果是否存在
  320. token := survey_token.InitMechanism(m.AuthMechanism).GenerateSurveyToken(surveyResult.SurveyMechanism.SN, surveyResult.SN, extra, timeout)
  321. if token == "" {
  322. return "", timeout, surveyResult, &response.ErrCode{
  323. Msg: "生成临时访问链接失败",
  324. Code: response.ERROR,
  325. }
  326. }
  327. 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
  328. }