helper.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. package graph
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/golang-module/carbon"
  6. "github.com/samber/lo"
  7. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk"
  8. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk/response"
  9. "gogs.uu.mdfitnesscao.com/cuiguohai/sdk/utils"
  10. )
  11. // 获取节点列表,并转成问题模板的格式返回
  12. func ListNodeToQuestionTemplate(ids []string, needCheckItemId bool) ([]*sdk.QuestionnaireTemplate, *response.ErrCode) {
  13. response, err := ListNode(ids, []string{})
  14. if err != nil {
  15. return nil, err
  16. }
  17. list := response.Data.List
  18. var questionTemplates []*sdk.QuestionnaireTemplate = make([]*sdk.QuestionnaireTemplate, 0)
  19. for _, item := range list {
  20. questionTemplates = append(questionTemplates, FormatNodeToSurveyQuestionTemplate(item, needCheckItemId))
  21. }
  22. return questionTemplates, nil
  23. }
  24. func GetNodeRelationShipsToStruct(id, name string) ([]*sdk.QuestionnaireSubjectSelectValue, []*sdk.QuestionnaireSubjectSelectValue) {
  25. response, err := GetNodeRelationShip(id, name, "")
  26. if err != nil {
  27. return nil, nil
  28. }
  29. relationShips := response.Data
  30. // 单位列表
  31. var unitValues []*sdk.QuestionnaireSubjectSelectValue = make([]*sdk.QuestionnaireSubjectSelectValue, 0)
  32. // 范围列表
  33. var rangeValues []*sdk.QuestionnaireSubjectSelectValue = make([]*sdk.QuestionnaireSubjectSelectValue, 0)
  34. for _, relation := range relationShips {
  35. unitValues = append(unitValues, &sdk.QuestionnaireSubjectSelectValue{
  36. Value: relation["mProperties"].(map[string]any)["name"].(string),
  37. Label: relation["mProperties"].(map[string]any)["name"].(string),
  38. })
  39. // 判断properties是否有“参考范围”这个属性
  40. if _, ok := relation["properties"].(map[string]any)["参考范围"]; ok {
  41. rangeValues = append(rangeValues, &sdk.QuestionnaireSubjectSelectValue{
  42. Value: relation["properties"].(map[string]any)["参考范围"].(string),
  43. Label: relation["properties"].(map[string]any)["参考范围"].(string),
  44. })
  45. }
  46. }
  47. return unitValues, rangeValues
  48. }
  49. func FormatNodeToSurveyQuestionTemplate(graphNode *sdk.GraphNode, needCheckItemId bool) *sdk.QuestionnaireTemplate {
  50. unitValues, rangeValues := GetNodeRelationShipsToStruct(graphNode.ID, "默认单位与范围")
  51. questionaireTemplate := &sdk.QuestionnaireTemplate{
  52. SN: graphNode.ID,
  53. Title: graphNode.Properties.Name,
  54. SubjectTotal: 4,
  55. SubjectIds: []string{
  56. fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorValueFlag),
  57. fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorRangeFlag),
  58. fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorUnitFlag),
  59. fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorTimeFlag),
  60. },
  61. Subjects: []*sdk.QuestionnaireSubject{
  62. {
  63. SN: fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorValueFlag),
  64. Type: sdk.QuestionSubjectTypeInput,
  65. Title: "检查结果",
  66. SelectValues: make([]*sdk.QuestionnaireSubjectSelectValue, 0),
  67. Validator: utils.JsonEncode(map[string]any{
  68. "type": sdk.QuestionSubjectTypeInputFlag,
  69. "edit": true,
  70. "attr": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorValueFlag),
  71. "sn": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorValueFlag),
  72. "remark": "",
  73. "combination": "",
  74. "isRepeat": false,
  75. "config": map[string]any{
  76. "desc": "",
  77. "rule": "",
  78. "type": "",
  79. "regexRule": "",
  80. "regexRuleName": "",
  81. },
  82. "choices": []any{},
  83. "children": []any{},
  84. }),
  85. },
  86. {
  87. SN: fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorRangeFlag),
  88. Type: sdk.QuestionSubjectTypeInput,
  89. Title: "参考范围",
  90. SelectValues: rangeValues,
  91. Validator: utils.JsonEncode(map[string]any{
  92. "type": sdk.QuestionSubjectTypeInputFlag,
  93. "edit": true,
  94. "attr": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorRangeFlag),
  95. "sn": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorRangeFlag),
  96. "remark": "",
  97. "combination": "",
  98. "isRepeat": false,
  99. "config": map[string]any{
  100. "desc": "",
  101. "rule": "",
  102. "type": "",
  103. "regexRule": "",
  104. "regexRuleName": "",
  105. },
  106. "choices": []any{},
  107. "children": []any{},
  108. }),
  109. },
  110. {
  111. SN: fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorUnitFlag),
  112. Type: sdk.QuestionSubjectTypeInput,
  113. Title: "单位",
  114. SelectValues: unitValues,
  115. Validator: utils.JsonEncode(map[string]any{
  116. "type": sdk.QuestionSubjectTypeInputFlag,
  117. "edit": true,
  118. "attr": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorUnitFlag),
  119. "sn": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorUnitFlag),
  120. "remark": "",
  121. "combination": "",
  122. "isRepeat": false,
  123. "config": map[string]any{
  124. "desc": "",
  125. "rule": "",
  126. "type": "",
  127. "regexRule": "",
  128. "regexRuleName": "",
  129. },
  130. "choices": []any{},
  131. "children": []any{},
  132. }),
  133. },
  134. {
  135. SN: fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorTimeFlag),
  136. Type: sdk.QuestionSubjectTypeDate,
  137. Title: "检查时间",
  138. SelectValues: make([]*sdk.QuestionnaireSubjectSelectValue, 0),
  139. Validator: utils.JsonEncode(map[string]any{
  140. "type": sdk.QuestionSubjectTypeDateFlag,
  141. "edit": true,
  142. "attr": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorTimeFlag),
  143. "sn": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorTimeFlag),
  144. "remark": "",
  145. "combination": "",
  146. "isRepeat": false,
  147. "config": map[string]any{
  148. "desc": "",
  149. "rule": "",
  150. "type": "",
  151. "regexRule": "",
  152. "regexRuleName": "",
  153. },
  154. "choices": []any{},
  155. "children": []any{},
  156. }),
  157. },
  158. },
  159. }
  160. if needCheckItemId {
  161. questionaireTemplate.SubjectTotal++
  162. questionaireTemplate.SubjectIds = append(questionaireTemplate.SubjectIds, fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorCheckItemIdFlag))
  163. questionaireTemplate.Subjects = append(questionaireTemplate.Subjects, &sdk.QuestionnaireSubject{
  164. SN: fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorCheckItemIdFlag),
  165. Type: sdk.QuestionSubjectTypeInput,
  166. Title: "检查项目",
  167. SelectValues: make([]*sdk.QuestionnaireSubjectSelectValue, 0),
  168. Validator: utils.JsonEncode(map[string]any{
  169. "type": sdk.QuestionSubjectTypeInputFlag,
  170. "edit": true,
  171. "attr": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorCheckItemIdFlag),
  172. "sn": fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, graphNode.ID, sdk.IndicatorCheckItemIdFlag),
  173. "remark": "",
  174. "combination": "",
  175. "isRepeat": false,
  176. "isHidden": true,
  177. "config": map[string]any{
  178. "desc": "",
  179. "rule": "",
  180. "type": "",
  181. "regexRule": "",
  182. "regexRuleName": "",
  183. },
  184. "choices": []any{},
  185. "children": []any{},
  186. }),
  187. })
  188. }
  189. return questionaireTemplate
  190. }
  191. // 提供问题答案列表,过滤出指标的问题答案(返回不是指标的问题,返回指标数据)
  192. func FilterArchivesValues(archivesValuesList []*sdk.ArchivesValues) ([]*sdk.ArchivesValues, []*sdk.Indicator) {
  193. var indicators []*sdk.Indicator = make([]*sdk.Indicator, 0)
  194. var surveyAnswers []*sdk.ArchivesValues = make([]*sdk.ArchivesValues, 0)
  195. var indicatorAnswers []*sdk.ArchivesValues = make([]*sdk.ArchivesValues, 0)
  196. var nodeIds []string = make([]string, 0)
  197. for _, archivesValues := range archivesValuesList {
  198. var answer *sdk.SurveyAnswer
  199. if archivesValues.ReturnAnswer == nil {
  200. answer = archivesValues.Answer
  201. } else {
  202. answer = archivesValues.ReturnAnswer
  203. }
  204. if answer == nil {
  205. continue
  206. }
  207. // 判断是否包含前缀
  208. if !strings.Contains(answer.QuestionNo, sdk.IndicatorQuestionSubjectPrefix) {
  209. surveyAnswers = append(surveyAnswers, archivesValues)
  210. continue
  211. } else {
  212. // 将所有属于指标的问题答案过滤出来
  213. indicatorAnswers = append(indicatorAnswers, archivesValues)
  214. // 将指标的问题答案的编号过滤出来
  215. indicatorStrings := strings.Split(answer.QuestionNo, ":")
  216. if len(indicatorStrings) == 5 {
  217. nodeIds = append(nodeIds, strings.Join(indicatorStrings[1:4], ":"))
  218. }
  219. }
  220. }
  221. nodeIds = lo.Uniq(nodeIds)
  222. // 获取节点列表
  223. nodeResponse, err := ListNode(nodeIds, []string{})
  224. var nodeList []*sdk.GraphNode = make([]*sdk.GraphNode, 0)
  225. if err == nil {
  226. nodeList = nodeResponse.Data.List
  227. }
  228. // 遍历所有的指标问题答案,将其转换成指标数据
  229. for _, nodeId := range nodeIds {
  230. var value string // 指标值
  231. var rangeStr string // 指标范围
  232. var unit string // 指标单位
  233. var time string // 指标检查时间
  234. var name string // 指标名称
  235. var itemName string // 指标名称
  236. var itemId string // 指标ID
  237. // 找到对应的节点
  238. node, finded := lo.Find(nodeList, func(graphNode *sdk.GraphNode) bool {
  239. return graphNode.ID == nodeId
  240. })
  241. if finded {
  242. name = node.Properties.Name
  243. }
  244. // 查询ItemId
  245. // 检查值
  246. checkItemValues, finded := lo.Find(indicatorAnswers, func(archivesValues *sdk.ArchivesValues) bool {
  247. var answer *sdk.SurveyAnswer
  248. if archivesValues.ReturnAnswer == nil {
  249. answer = archivesValues.Answer
  250. } else {
  251. answer = archivesValues.ReturnAnswer
  252. }
  253. if answer == nil {
  254. return false
  255. }
  256. return answer.QuestionNo == fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, nodeId, sdk.IndicatorCheckItemIdFlag)
  257. })
  258. if finded {
  259. var answer *sdk.SurveyAnswer
  260. if checkItemValues.ReturnAnswer == nil {
  261. answer = checkItemValues.Answer
  262. } else {
  263. answer = checkItemValues.ReturnAnswer
  264. }
  265. if answer != nil && len(answer.InputAnswers.Value) > 0 {
  266. itemId = answer.InputAnswers.Value[0]
  267. // 查询名称
  268. response, err := ListNode([]string{itemId}, []string{})
  269. if err == nil {
  270. itemName = response.Data.List[0].Properties.Name
  271. }
  272. }
  273. } else {
  274. // 获取节点列表
  275. nodeRelationResponse, err := GetNodeRelationd(nodeId, "可检测", "")
  276. if err == nil {
  277. if len(nodeRelationResponse.Data) > 0 {
  278. itemName = nodeRelationResponse.Data[0]["properties"].(map[string]any)["name"].(string)
  279. itemId = nodeRelationResponse.Data[0]["id"].(string)
  280. }
  281. }
  282. }
  283. // 检查值
  284. valueValues, finded := lo.Find(indicatorAnswers, func(archivesValues *sdk.ArchivesValues) bool {
  285. var answer *sdk.SurveyAnswer
  286. if archivesValues.ReturnAnswer == nil {
  287. answer = archivesValues.Answer
  288. } else {
  289. answer = archivesValues.ReturnAnswer
  290. }
  291. if answer == nil {
  292. return false
  293. }
  294. return answer.QuestionNo == fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, nodeId, sdk.IndicatorValueFlag)
  295. })
  296. if finded {
  297. var answer *sdk.SurveyAnswer
  298. if valueValues.ReturnAnswer == nil {
  299. answer = valueValues.Answer
  300. } else {
  301. answer = valueValues.ReturnAnswer
  302. }
  303. if answer != nil && len(answer.InputAnswers.Value) > 0 {
  304. value = answer.InputAnswers.Value[0]
  305. }
  306. }
  307. // 检查范围
  308. rangeValues, finded := lo.Find(indicatorAnswers, func(archivesValues *sdk.ArchivesValues) bool {
  309. var answer *sdk.SurveyAnswer
  310. if archivesValues.ReturnAnswer == nil {
  311. answer = archivesValues.Answer
  312. } else {
  313. answer = archivesValues.ReturnAnswer
  314. }
  315. if answer == nil {
  316. return false
  317. }
  318. return answer.QuestionNo == fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, nodeId, sdk.IndicatorRangeFlag)
  319. })
  320. if finded {
  321. var answer *sdk.SurveyAnswer
  322. if rangeValues.ReturnAnswer == nil {
  323. answer = rangeValues.Answer
  324. } else {
  325. answer = rangeValues.ReturnAnswer
  326. }
  327. if answer != nil && len(answer.InputAnswers.Value) > 0 {
  328. rangeStr = answer.InputAnswers.Value[0]
  329. }
  330. }
  331. // 检查单位
  332. unitValues, finded := lo.Find(indicatorAnswers, func(archivesValues *sdk.ArchivesValues) bool {
  333. var answer *sdk.SurveyAnswer
  334. if archivesValues.ReturnAnswer == nil {
  335. answer = archivesValues.Answer
  336. } else {
  337. answer = archivesValues.ReturnAnswer
  338. }
  339. if answer == nil {
  340. return false
  341. }
  342. return answer.QuestionNo == fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, nodeId, sdk.IndicatorUnitFlag)
  343. })
  344. if finded {
  345. var answer *sdk.SurveyAnswer
  346. if unitValues.ReturnAnswer == nil {
  347. answer = unitValues.Answer
  348. } else {
  349. answer = unitValues.ReturnAnswer
  350. }
  351. if answer != nil && len(answer.InputAnswers.Value) > 0 {
  352. unit = answer.InputAnswers.Value[0]
  353. }
  354. }
  355. // 检查时间
  356. timeValues, finded := lo.Find(indicatorAnswers, func(archivesValues *sdk.ArchivesValues) bool {
  357. var answer *sdk.SurveyAnswer
  358. if archivesValues.ReturnAnswer == nil {
  359. answer = archivesValues.Answer
  360. } else {
  361. answer = archivesValues.ReturnAnswer
  362. }
  363. if answer == nil {
  364. return false
  365. }
  366. return answer.QuestionNo == fmt.Sprintf("%s:%s:%s", sdk.IndicatorQuestionSubjectPrefix, nodeId, sdk.IndicatorTimeFlag)
  367. })
  368. if finded {
  369. var answer *sdk.SurveyAnswer
  370. if timeValues.ReturnAnswer == nil {
  371. answer = timeValues.Answer
  372. } else {
  373. answer = timeValues.ReturnAnswer
  374. }
  375. if answer != nil {
  376. time = answer.Answer.Value
  377. }
  378. }
  379. // 检查是否有任意一个参数有值
  380. if value != "" || rangeStr != "" || unit != "" || time != "" {
  381. date := 0
  382. if time != "" {
  383. date = int(carbon.Parse(time).Carbon2Time().Unix())
  384. }
  385. // 开始拼装指标数据
  386. indicators = append(indicators, &sdk.Indicator{
  387. ID: nodeId,
  388. Name: name,
  389. Value: value,
  390. Unit: unit,
  391. ItemName: itemName,
  392. ItemID: itemId,
  393. Reference: rangeStr,
  394. Date: date,
  395. })
  396. }
  397. }
  398. return surveyAnswers, indicators
  399. }