member.go 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package survey_result
  2. import (
  3. "fmt"
  4. "surveyService/model"
  5. "surveyService/response"
  6. "surveyService/sdk/survey_disease"
  7. "surveyService/service/survey"
  8. "surveyService/service/survey_mechanism"
  9. "surveyService/util"
  10. "surveyService/validators"
  11. "github.com/golang-module/carbon"
  12. jsoniter "github.com/json-iterator/go"
  13. "gogs.uu.mdfitnesscao.com/hys/sdk"
  14. )
  15. type Member struct {
  16. MechanismId string // 机构ID
  17. Member *sdk.AuthMember
  18. }
  19. func InitMember(member *sdk.AuthMember, mechanismId string) *Member {
  20. return &Member{
  21. MechanismId: mechanismId,
  22. Member: member,
  23. }
  24. }
  25. // 获取问卷结果
  26. func (m *Member) Detail(sn string) (*model.SurveyResult, *response.ErrCode) {
  27. var surveyResult *model.SurveyResult
  28. tx := model.DB.Where("sn = ?", sn)
  29. if m.Member != nil {
  30. tx = tx.Where("archives_id = ?", m.Member.ID)
  31. }
  32. err := tx.Preload("SurveyMechanism").First(&surveyResult).Error
  33. if err != nil {
  34. return nil, &response.ErrCode{
  35. Code: response.ERROR,
  36. Msg: "获取问卷结果失败",
  37. }
  38. }
  39. if m.MechanismId != surveyResult.SurveyMechanism.MechanismId {
  40. return nil, &response.ErrCode{
  41. Code: response.ERROR,
  42. Msg: "没有找到有效的问卷结果数据",
  43. }
  44. }
  45. return surveyResult, nil
  46. }
  47. // 获取最后一份问卷结果
  48. func (m *Member) DetailLastSurvey(surveyMechanismId int64, isPhysicalSurvey bool) (*model.SurveyResult, *response.ErrCode) {
  49. var surveyResult *model.SurveyResult
  50. // 如果是定制体检
  51. if isPhysicalSurvey {
  52. var physicalSurver *model.Survey
  53. // 查出哪份问卷是定制体检
  54. err := model.DB.Model(&model.Survey{}).Where(&model.Survey{
  55. Type: model.SURVEY_TYPE_PHYSICAL,
  56. }).First(&physicalSurver).Error
  57. if err != nil {
  58. return nil, &response.ErrCode{
  59. Code: response.ERROR,
  60. Msg: "定制体检问卷未设置",
  61. }
  62. }
  63. var surveyMechanism *model.SurveyMechanism
  64. // 开始查找机构授权的问卷
  65. err = model.DB.Model(&model.SurveyMechanism{}).Where(&model.SurveyMechanism{
  66. SurveyId: physicalSurver.ID,
  67. MechanismId: m.MechanismId,
  68. }).First(&surveyMechanism).Error
  69. if err != nil {
  70. return nil, &response.ErrCode{
  71. Code: response.ERROR,
  72. Msg: "机构未授权定制体检问卷",
  73. }
  74. }
  75. surveyMechanismId = surveyMechanism.ID
  76. }
  77. tx := model.DB.Where(&model.SurveyResult{
  78. SurveyMechanismId: surveyMechanismId,
  79. })
  80. if m.Member != nil {
  81. tx = tx.Where("archives_id = ?", m.Member.ID)
  82. }
  83. err := tx.Preload("SurveyMechanism").First(&surveyResult).Error
  84. if err != nil {
  85. return nil, &response.ErrCode{
  86. Code: response.ERROR,
  87. Msg: "获取问卷结果失败",
  88. }
  89. }
  90. if m.MechanismId != surveyResult.SurveyMechanism.MechanismId {
  91. return nil, &response.ErrCode{
  92. Code: response.ERROR,
  93. Msg: "没有找到有效的问卷结果数据",
  94. }
  95. }
  96. return surveyResult, nil
  97. }
  98. // 获取问卷结果
  99. func (m *Member) Paginate(page, pageSize int) ([]*model.SurveyResult, int64) {
  100. var surveyResults []*model.SurveyResult
  101. var total int64
  102. tx := model.DB.Model(&model.SurveyResult{})
  103. if m.Member != nil {
  104. tx = tx.Where("archives_id = ?", m.Member.ID)
  105. }
  106. var surveyMechanismTableName = (&model.SurveyMechanism{}).TableName()
  107. var surveyResultTableName = (&model.SurveyResult{}).TableName()
  108. tx = tx.Joins(fmt.Sprintf("left join %s on %s.id = %s.survey_mechanism_id", surveyMechanismTableName, surveyMechanismTableName, surveyResultTableName)).Where(fmt.Sprintf("%s.mechanism_id = ?", surveyMechanismTableName), m.MechanismId)
  109. tx.Count(&total)
  110. tx.Select(fmt.Sprintf("%s.*", surveyResultTableName)).Scopes(model.Paginate(page, pageSize)).Order(fmt.Sprintf("%s.id desc", surveyResultTableName)).Preload("SurveyMechanism").Find(&surveyResults)
  111. return surveyResults, total
  112. }
  113. // 创建问卷结果
  114. // surveyMechanismId 机构问卷编号
  115. func (m *Member) Create(surveyMechanismId string, extra string) (*model.SurveyResult, *response.ErrCode) {
  116. // 检查问卷是否在
  117. surveyMechanism, findErr := survey_mechanism.InitMember(m.Member, m.MechanismId).Detail(surveyMechanismId)
  118. if findErr != nil {
  119. return nil, findErr
  120. }
  121. // 检查是否有未完成的问卷
  122. if extra != "" {
  123. var existsSurveyResult *model.SurveyResult
  124. model.DB.Where("extra = ?", extra).First(&existsSurveyResult)
  125. if existsSurveyResult != nil {
  126. // 检查是否可以继续作答
  127. if existsSurveyResult.Status == model.SurveyResultStatusWait {
  128. return existsSurveyResult, nil
  129. }
  130. }
  131. }
  132. archivesId := ""
  133. if m.Member != nil {
  134. archivesId = m.Member.ID
  135. }
  136. surveyResultModel := model.SurveyResult{
  137. StartTime: carbon.Now().Carbon2Time(),
  138. SurveyMechanismId: surveyMechanism.ID,
  139. Status: model.SurveyResultStatusWait,
  140. Method: model.SurveyResultMethodArchives,
  141. MechanismId: m.MechanismId,
  142. ArchivesId: archivesId,
  143. Extra: extra,
  144. }
  145. err := model.DB.Create(&surveyResultModel).Error
  146. if err != nil {
  147. return nil, &response.ErrCode{
  148. Code: response.ERROR,
  149. Msg: "创建问卷结果失败",
  150. }
  151. }
  152. return &surveyResultModel, nil
  153. }
  154. // 提交答题结果
  155. func (m *Member) Submit(sn string, answers map[string]any) *response.ErrCode {
  156. // 获取问卷结果
  157. surveyResult, findErr := m.Detail(sn)
  158. if findErr != nil {
  159. return findErr
  160. }
  161. // 只有在填写中的问卷才能保存
  162. if surveyResult.Status != model.SurveyResultStatusWait {
  163. return &response.ErrCode{
  164. Code: response.ERROR,
  165. Msg: "问卷结果已经提交,不能再保存",
  166. }
  167. }
  168. if m.Member != nil {
  169. if surveyResult.ArchivesId != m.Member.ID {
  170. return &response.ErrCode{
  171. Code: response.ERROR,
  172. Msg: "答题问卷不存在",
  173. }
  174. }
  175. }
  176. // 只有后台新增的才可以修改
  177. // if surveyResult.Method == model.SurveyResultMethodArchives {
  178. // return &response.ErrCode{
  179. // Code: response.ERROR,
  180. // Msg: "当前问卷不支持修改答题结果",
  181. // }
  182. // }
  183. // 保存问卷结果
  184. updateErr := model.DB.Model(model.SurveyResult{}).Where("id = ?", surveyResult.ID).Select([]string{"AnswerRaw", "Status"}).Updates(&model.SurveyResult{
  185. AnswerRaw: util.JsonEncode(answers),
  186. Status: model.SurveyResultStatusFulled,
  187. EndTime: carbon.Now().Carbon2Time(),
  188. }).Error
  189. if updateErr != nil {
  190. return &response.ErrCode{
  191. Code: response.ERROR,
  192. Msg: "提交问卷失败",
  193. }
  194. }
  195. _, findErr = survey.Find(surveyResult.SurveyMechanism.SurveyId)
  196. if findErr != nil {
  197. return findErr
  198. }
  199. // 提交问卷结果数据
  200. go func() {
  201. // 将answer转成指定格式
  202. var formatedAnswers map[string]*sdk.SurveyAnswer
  203. jsoniter.UnmarshalFromString(util.JsonEncode(answers), &formatedAnswers)
  204. surveyDiseaseCalcResult := survey_disease.DiseaseScreeningCal(
  205. formatedAnswers,
  206. )
  207. ProcessResult(sn, surveyDiseaseCalcResult)
  208. }()
  209. return nil
  210. }
  211. // 创建并提交问卷结果
  212. func (m *Member) CreateAndSubmit(surveyMechanismId string, answers map[string]any, startTime string, extra string) (*model.SurveyResult, *response.ErrCode) {
  213. // 检查问卷是否在
  214. surveyMechanism, findErr := survey_mechanism.InitMember(m.Member, m.MechanismId).Detail(surveyMechanismId)
  215. if findErr != nil {
  216. return nil, findErr
  217. }
  218. archivesId := ""
  219. if m.Member != nil {
  220. archivesId = m.Member.ID
  221. }
  222. // 如果开始时间大于当前时间,报错
  223. startTimeCarbon := carbon.Parse(startTime)
  224. if startTimeCarbon.Gte(carbon.Now()) {
  225. return nil, &response.ErrCode{
  226. Code: response.ERROR,
  227. Msg: "开始时间不能大于当前时间",
  228. }
  229. }
  230. surveyResultModel := &model.SurveyResult{
  231. StartTime: startTimeCarbon.Carbon2Time(),
  232. SurveyMechanismId: surveyMechanism.ID,
  233. Method: model.SurveyResultMethodArchives,
  234. MechanismId: m.MechanismId,
  235. ArchivesId: archivesId,
  236. Extra: extra,
  237. AnswerRaw: util.JsonEncode(answers),
  238. Status: model.SurveyResultStatusFulled,
  239. EndTime: carbon.Now().Carbon2Time(),
  240. }
  241. err := model.DB.Save(&surveyResultModel).Error
  242. if err != nil {
  243. return nil, &response.ErrCode{
  244. Code: response.ERROR,
  245. Msg: "问卷提交失败",
  246. }
  247. }
  248. _, findErr = survey.Find(surveyMechanism.SurveyId)
  249. if findErr != nil {
  250. return nil, findErr
  251. }
  252. go func() {
  253. var formatedAnswers map[string]*sdk.SurveyAnswer
  254. jsoniter.UnmarshalFromString(util.JsonEncode(answers), &formatedAnswers)
  255. surveyDiseaseCalcResult := survey_disease.DiseaseScreeningCal(
  256. formatedAnswers,
  257. )
  258. ProcessResult(surveyResultModel.SN, surveyDiseaseCalcResult)
  259. }()
  260. return surveyResultModel, nil
  261. }
  262. // 格式化答题结果
  263. func (m *Member) Format(rawSurveyResult *model.SurveyResult, needResult bool) *validators.SurveyResult {
  264. var answerResult map[string]any
  265. var resultRaw string
  266. if needResult {
  267. if rawSurveyResult.AnswerRaw != "" {
  268. json.UnmarshalFromString(rawSurveyResult.AnswerRaw, &answerResult)
  269. }
  270. resultRaw = rawSurveyResult.ResultRaw
  271. }
  272. return &validators.SurveyResult{
  273. ID: rawSurveyResult.SN,
  274. Method: rawSurveyResult.Method,
  275. StartTime: carbon.Time2Carbon(rawSurveyResult.StartTime).Format("Y/m/d H:i:s"),
  276. EndTime: carbon.Time2Carbon(rawSurveyResult.EndTime).Format("Y/m/d H:i:s"),
  277. Status: rawSurveyResult.Status,
  278. ArchivesId: rawSurveyResult.ArchivesId,
  279. AnswerResult: answerResult,
  280. ResultRaw: resultRaw,
  281. SurveyMechanismId: (&model.SurveyMechanism{}).GetHashId(rawSurveyResult.SurveyMechanismId),
  282. SurveyMechanism: survey_mechanism.ListFormat([]*model.SurveyMechanism{rawSurveyResult.SurveyMechanism})[0],
  283. CreatedAt: carbon.Time2Carbon(rawSurveyResult.CreatedAt).Format("Y/m/d H:i:s"),
  284. UpdatedAt: carbon.Time2Carbon(rawSurveyResult.UpdatedAt).Format("Y/m/d H:i:s"),
  285. }
  286. }