manage.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package survey_import
  2. import (
  3. "context"
  4. "fmt"
  5. "surveyService/cache"
  6. "surveyService/model"
  7. "surveyService/response"
  8. "surveyService/service/questionnaire_subject"
  9. "surveyService/service/questionnaire_template"
  10. "surveyService/util"
  11. "surveyService/util/rabbitmq"
  12. "surveyService/validators"
  13. "github.com/guonaihong/gout"
  14. jsoniter "github.com/json-iterator/go"
  15. "gorm.io/gorm"
  16. )
  17. const (
  18. ListQuestionnaireSubjectCacheKey = "algor:questionnaireSubject:list"
  19. HashListQuestionnaireSubjectCacheKey = "algor:questionnaireSubject:hashList"
  20. ListQuestionnaireTemplateCacheKey = "algor:questionnaireTemplate:list"
  21. HashListQuestionnaireTemplateCacheKey = "algor:questionnaireTemplate:hashList"
  22. )
  23. type SyncData struct {
  24. Version string `json:"version" form:"version" binding:"required"`
  25. VersionNumber int64 `json:"versionNumber" form:"versionNumber" binding:"required"`
  26. FileUrl string `json:"fileUrl" form:"fileUrl" binding:"required"`
  27. ID int64 `json:"id" form:"id" binding:"required"`
  28. CallbackUrl string `json:"callbackUrl" form:"callbackUrl" binding:"required"`
  29. }
  30. type SyncSurveyResult struct {
  31. Result *SyncSurveyData `json:"result"`
  32. }
  33. type SyncSurveyData struct {
  34. Subjects []*model.QuestionnaireSubject `json:"subjects"`
  35. Surveys []*model.QuestionnaireSurvey `json:"surveys"`
  36. Templates []*model.QuestionnaireTemplate `json:"templates"`
  37. }
  38. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  39. func StartSync(syncData SyncData) {
  40. fmt.Println("收到的数据", syncData)
  41. // 1. 调用同步接口
  42. err := Sync(syncData)
  43. if err != nil {
  44. var webhookMessage rabbitmq.WebhookMessage
  45. webhookMessage.Body = map[string]any{
  46. "status": false,
  47. "id": syncData.ID,
  48. "errMsg": err.Msg,
  49. }
  50. webhookMessage.Config.Url = syncData.CallbackUrl
  51. fmt.Println("开始推送数据", util.JsonEncode(webhookMessage))
  52. pushErr := rabbitmq.Webhook(webhookMessage)
  53. if pushErr != nil {
  54. // 更新失败
  55. fmt.Println("数据推送失败", pushErr)
  56. // Callback(dataSync.ID, false, "数据推送失败")
  57. return
  58. }
  59. return
  60. }
  61. var webhookMessage rabbitmq.WebhookMessage
  62. webhookMessage.Body = map[string]any{
  63. "status": true,
  64. "id": syncData.ID,
  65. "errMsg": "",
  66. }
  67. webhookMessage.Config.Url = syncData.CallbackUrl
  68. fmt.Println("开始推送数据", util.JsonEncode(webhookMessage))
  69. pushErr := rabbitmq.Webhook(webhookMessage)
  70. if pushErr != nil {
  71. // 更新失败
  72. fmt.Println("数据推送失败", pushErr)
  73. // Callback(dataSync.ID, false, "数据推送失败")
  74. return
  75. }
  76. }
  77. func Sync(syncData SyncData) *response.ErrCode {
  78. // 下载文件
  79. var body string
  80. err := gout.GET(syncData.FileUrl).BindBody(&body).Do()
  81. if err != nil {
  82. return &response.ErrCode{
  83. Code: response.ERROR,
  84. Msg: "文件下载失败",
  85. }
  86. }
  87. var result *SyncSurveyResult
  88. json.UnmarshalFromString(body, &result)
  89. if result == nil {
  90. return &response.ErrCode{
  91. Code: response.ERROR,
  92. Msg: "文件解析失败",
  93. }
  94. }
  95. var subjects []*model.QuestionnaireSubject = result.Result.Subjects
  96. var templates []*model.QuestionnaireTemplate = result.Result.Templates
  97. var templateSubjects []*model.QuestionnaireTemplateSubject = make([]*model.QuestionnaireTemplateSubject, 0)
  98. for _, template := range templates {
  99. for _, templateSubject := range template.SubjectRelations {
  100. templateSubjects = append(templateSubjects, &model.QuestionnaireTemplateSubject{
  101. TemplateID: templateSubject.TemplateID,
  102. SubjectID: templateSubject.SubjectID,
  103. Sort: templateSubject.Sort,
  104. })
  105. }
  106. template.SubjectRelations = make([]*model.QuestionnaireTemplateSubject, 0)
  107. }
  108. var surveys []*model.QuestionnaireSurvey = result.Result.Surveys
  109. var surveySubjects []*model.QuestionnaireSurveyQuestionnaireSubject = make([]*model.QuestionnaireSurveyQuestionnaireSubject, 0)
  110. for _, survey := range surveys {
  111. for _, surveySubject := range survey.Subjects {
  112. surveySubjects = append(surveySubjects, &model.QuestionnaireSurveyQuestionnaireSubject{
  113. SurveyID: surveySubject.SurveyID,
  114. SubjectID: surveySubject.SubjectID,
  115. Sort: surveySubject.Sort,
  116. IsRequired: surveySubject.IsRequired,
  117. })
  118. }
  119. survey.Subjects = make([]*model.QuestionnaireSurveyQuestionnaireSubject, 0)
  120. }
  121. // 开启事务
  122. updateErr := model.DB.Transaction(func(tx *gorm.DB) error {
  123. // 删除subjects
  124. model.DB.Model(&model.QuestionnaireSubject{}).Unscoped().Where("id > 0").Delete(&model.QuestionnaireSubject{})
  125. // 删除templates
  126. model.DB.Model(&model.QuestionnaireTemplate{}).Unscoped().Where("id > 0").Delete(&model.QuestionnaireTemplate{})
  127. // 删除templateSubjects
  128. model.DB.Model(&model.QuestionnaireTemplateSubject{}).Unscoped().Where("id > 0").Delete(&model.QuestionnaireTemplateSubject{})
  129. // 删除surveys
  130. model.DB.Model(&model.QuestionnaireSurvey{}).Unscoped().Where("id > 0").Delete(&model.QuestionnaireSurvey{})
  131. // 删除surveySubjects
  132. model.DB.Model(&model.QuestionnaireSurveyQuestionnaireSubject{}).Unscoped().Where("id > 0").Delete(&model.QuestionnaireSurveyQuestionnaireSubject{})
  133. // 开始创建
  134. if err := model.DB.Model(&model.QuestionnaireSubject{}).CreateInBatches(subjects, len(subjects)).Error; err != nil {
  135. return fmt.Errorf("创建subjects失败: %w", err)
  136. }
  137. if err := model.DB.Model(&model.QuestionnaireTemplate{}).CreateInBatches(templates, len(templates)).Error; err != nil {
  138. return fmt.Errorf("创建templates失败: %w", err)
  139. }
  140. if err := model.DB.Model(&model.QuestionnaireTemplateSubject{}).CreateInBatches(templateSubjects, len(templateSubjects)).Error; err != nil {
  141. return fmt.Errorf("创建templateSubjects失败: %w", err)
  142. }
  143. if err := model.DB.Model(&model.QuestionnaireSurvey{}).CreateInBatches(surveys, len(surveys)).Error; err != nil {
  144. return fmt.Errorf("创建surveys失败: %w", err)
  145. }
  146. if err := model.DB.Model(&model.QuestionnaireSurveyQuestionnaireSubject{}).CreateInBatches(surveySubjects, len(surveySubjects)).Error; err != nil {
  147. return fmt.Errorf("创建surveySubjects失败: %w", err)
  148. }
  149. return nil
  150. })
  151. if updateErr != nil {
  152. return &response.ErrCode{
  153. Code: response.ERROR,
  154. Msg: updateErr.Error(),
  155. }
  156. }
  157. go CacheList()
  158. return nil
  159. }
  160. func CacheList() {
  161. var subjectList = questionnaire_subject.List("")
  162. var formatedSubjectList []*validators.QuestionnaireSubject
  163. for _, subject := range subjectList {
  164. formatedSubjectList = append(formatedSubjectList, questionnaire_subject.Format(subject))
  165. }
  166. CacheQuestionnaireSubject(formatedSubjectList)
  167. var templateList = questionnaire_template.List("")
  168. var formatedTemplateList []*validators.QuestionnaireTemplate
  169. for _, template := range templateList {
  170. formatedTemplateList = append(formatedTemplateList, questionnaire_template.Format(template))
  171. }
  172. CacheQuestionnaireTemplate(formatedTemplateList)
  173. }
  174. // 获取问题库列表
  175. func CacheQuestionnaireSubject(list []*validators.QuestionnaireSubject) *response.ErrCode {
  176. // 删除键
  177. cache.Instance().Delete(ListQuestionnaireSubjectCacheKey)
  178. cache.Instance().Delete(HashListQuestionnaireSubjectCacheKey)
  179. // 存缓存
  180. listJson, marshalErr := json.Marshal(list)
  181. if marshalErr != nil {
  182. return response.Err
  183. }
  184. cache.Instance().PutStrForever(ListQuestionnaireSubjectCacheKey, string(listJson))
  185. // 以ID为键,值为整体来存
  186. var hashKeys = make([]any, 0)
  187. for _, item := range list {
  188. hashKeys = append(hashKeys, item.SN)
  189. hashKeys = append(hashKeys, util.JsonEncode(item))
  190. }
  191. _, rdsErr := cache.GetClient().HMSet(context.Background(), cache.Instance().KeyWithPrefix(HashListQuestionnaireSubjectCacheKey), hashKeys...).Result()
  192. if rdsErr != nil {
  193. fmt.Println("同步失败")
  194. } else {
  195. fmt.Println("同步成功")
  196. }
  197. return nil
  198. }
  199. // 获取问题模板列表
  200. func CacheQuestionnaireTemplate(list []*validators.QuestionnaireTemplate) *response.ErrCode {
  201. // 删除键
  202. cache.Instance().Delete(ListQuestionnaireTemplateCacheKey)
  203. cache.Instance().Delete(HashListQuestionnaireTemplateCacheKey)
  204. // 存缓存
  205. listJson, marshalErr := json.Marshal(list)
  206. if marshalErr != nil {
  207. return response.Err
  208. }
  209. cache.Instance().PutStrForever(ListQuestionnaireTemplateCacheKey, string(listJson))
  210. // 以ID为键,值为整体来存
  211. var hashKeys = make([]any, 0)
  212. for _, item := range list {
  213. hashKeys = append(hashKeys, item.SN)
  214. hashKeys = append(hashKeys, util.JsonEncode(item))
  215. }
  216. _, rdsErr := cache.GetClient().HMSet(context.Background(), cache.Instance().KeyWithPrefix(HashListQuestionnaireTemplateCacheKey), hashKeys...).Result()
  217. if rdsErr != nil {
  218. fmt.Println("同步失败")
  219. } else {
  220. fmt.Println("同步成功")
  221. }
  222. return nil
  223. }