cron.go 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package service
  2. import (
  3. "IC/models"
  4. "IC/utils"
  5. "encoding/json"
  6. _ "fmt"
  7. _ "github.com/jinzhu/gorm"
  8. "github.com/robfig/cron"
  9. _ "strings"
  10. "time"
  11. )
  12. // cron表达式 https://www.cnblogs.com/zuxingyu/p/6023919.html
  13. // var createLisSyncCronJob *cron.Cron
  14. func init() {
  15. }
  16. // 返回一个支持至 秒 级别的 cron
  17. func newWithSeconds() *cron.Cron {
  18. secondParser := cron.NewParser(cron.Second | cron.Minute |
  19. cron.Hour | cron.Dom | cron.Month | cron.DowOptional | cron.Descriptor)
  20. return cron.New(cron.WithParser(secondParser), cron.WithChain())
  21. }
  22. // func BeginAutoSyncLis() {
  23. // utils.InfoLog("开启自动检验检查同步定时任务")
  24. // createLisSyncCronJob := newWithSeconds()
  25. // // specgzjh := "0 */1 * * * ?" // 每1分钟同步 广州暨华HIS医嘱
  26. // // createLisSyncCronJob.AddFunc(specgzjh, func() {
  27. // // // SyncGzjhyz()
  28. // // Synctfyz()
  29. // // })
  30. // specys := "0 0 */1 * * ?" // 每天凌晨3点同步 唐山朝阳医院
  31. // createLisSyncCronJob.AddFunc(specys, func() {
  32. // // SyncStsyLis()
  33. // })
  34. // specys1 := "0 10 */2 * * ?" // 每两个小时同步长沙南雅医院
  35. // createLisSyncCronJob.AddFunc(specys1, func() {
  36. // // SyncCsnyLis()
  37. // })
  38. // spec := "0 50 1 * * ?" // 每天凌晨1点同步 监利大院的
  39. // createLisSyncCronJob.AddFunc(spec, func() {
  40. // // SyncHbdyLis()
  41. // })
  42. // createLisSyncCronJob.Start()
  43. // }
  44. func BeginAutoSyncLis() {
  45. utils.InfoLog("开启自动检验检查同步定时任务")
  46. createLisSyncCronJob := newWithSeconds()
  47. // specgzjh := "0 */1 * * * ?" // 每1分钟同步 广州暨华HIS医嘱
  48. // createLisSyncCronJob.AddFunc(specgzjh, func() {
  49. // // SyncGzjhyz()
  50. // Synctfyz()
  51. // })
  52. // specys := "0 0 */1 * * ?" // 每天凌晨3点同步 唐山朝阳医院
  53. // createLisSyncCronJob.AddFunc(specys, func() {
  54. // SyncTscyLis()
  55. // })
  56. // specys1 := "0 10 */2 * * ?" // 每两个小时同步长沙南雅医院
  57. // createLisSyncCronJob.AddFunc(specys1, func() {
  58. // SyncCsnyLis()
  59. // })
  60. // spec := "0 50 1 * * ?" // 每天凌晨1点同步 监利大院的
  61. // createLisSyncCronJob.AddFunc(spec, func() {
  62. // SyncHbdyLis()
  63. // })
  64. // spec2 := "0 50 2 * * ?" // 每天凌晨2点同步 龙岗二院
  65. // createLisSyncCronJob.AddFunc(spec2, func() {
  66. // SyncLisLgty()
  67. // })
  68. // spec3 := "0 50 3 * * ?" // 每天凌晨2点同步 广州暨华血液透析中心
  69. // createLisSyncCronJob.AddFunc(spec3, func() {
  70. // SyncLisGzjhtx()
  71. // })
  72. specgzjh := "0 0 */2 * * ?" // 每2个小时同步 汕头三优血液透析中心LIS
  73. createLisSyncCronJob.AddFunc(specgzjh, func() {
  74. SyncScpaLis()
  75. })
  76. createLisSyncCronJob.Start()
  77. }
  78. func AutoSyncLis() {
  79. utils.TraceLog("检验检查任务开始执行")
  80. org_id := int64(9538)
  81. // 第一步:根据机构id获取对应机构所有病人的his_user_id
  82. patients, patientError := GetHisUserIdByOrgID(org_id)
  83. if patientError != nil {
  84. utils.ErrorLog("获取用户His_user_id信息失败:%v", patientError)
  85. return
  86. }
  87. // patientStr:= make([]interface{},0)
  88. if len(patients) > 0 {
  89. // 第二步:根据病人的his_user_id来查询上次同步时间
  90. for _, patient := range patients {
  91. if len(patient.HisUserId) <= 0 {
  92. continue
  93. }
  94. syncLastInfo, _ := GetSyncTimeByOrgID(org_id, patient.HisUserId)
  95. var sync_time int64
  96. if syncLastInfo.ID > 0 {
  97. sync_time = syncLastInfo.SyncTime
  98. } else {
  99. inspectionLastInfo, _ := GetInspectionLastInfoByOrgID(org_id, patient.HisUserId)
  100. if inspectionLastInfo.ID > 0 {
  101. sync_time = inspectionLastInfo.CreatedTime
  102. } else {
  103. sync_time = 0
  104. }
  105. }
  106. syncTimes := time.Unix(sync_time, 0).Format("2006-01-02 15:04")
  107. utils.InfoLog("syncTimes:%v", syncTimes)
  108. // 第三步:跟进上次同步时间和指定的his_user_id,获取上次同步到现在指定人的检验检查记录
  109. resultList, _ := GetListByHisUserID(patient.HisUserId, syncTimes, patient.SelectType)
  110. var syncInfo models.MiddleSyncInfo
  111. if len(resultList) > 0 {
  112. // 如果有数据,则把同步过来的详情插入一条数据到同步详情表中
  113. syncInfo.OrgId = org_id
  114. syncInfo.HisUserId = patient.HisUserId
  115. syncInfo.SyncTime = time.Now().Unix()
  116. syncInfo.SyncResultType = 1
  117. syncInfo.SyncRsultRemark = "同步成功"
  118. syncInfo.SyncTotalNum = int64(len(resultList))
  119. syncInfo.SyncSuccessNum = 0
  120. SyncInfos, _ := json.Marshal(resultList)
  121. syncInfo.SyncInfo = string(SyncInfos)
  122. syncInfo.CreateTime = time.Now().Unix()
  123. syncInfo.UpdateTime = time.Now().Unix()
  124. err := CreateSyncInfo(&syncInfo)
  125. if err != nil {
  126. utils.ErrorLog("创建同步信息失败:%v", err)
  127. return
  128. }
  129. } else {
  130. // 如果没有数据,则插入一条数据到同步详情表中
  131. syncInfo.OrgId = org_id
  132. syncInfo.HisUserId = patient.HisUserId
  133. syncInfo.SyncTime = time.Now().Unix()
  134. syncInfo.SyncResultType = 1
  135. syncInfo.SyncRsultRemark = "该患者这个时间段没有任何检验检查数据"
  136. syncInfo.CreateTime = time.Now().Unix()
  137. syncInfo.UpdateTime = time.Now().Unix()
  138. err := CreateSyncInfo(&syncInfo)
  139. if err != nil {
  140. utils.ErrorLog("创建同步信息失败:%v", err)
  141. return
  142. }
  143. // utils.InfoLog("同步信息详情:%v",syncInfo)
  144. continue
  145. }
  146. // 第四部:将同步过来的数据插入到中间库对应的表
  147. syncSuccessNum := 0
  148. for _, result := range resultList {
  149. if (result.HisUserId == patient.HisUserId) || (result.PatientName == patient.HisUserId) {
  150. patientId := patient.XtPatientId
  151. if patientId > 0 {
  152. inspection_reference, inspection, _ := Sync(result, org_id, patientId)
  153. if inspection_reference.ID > 0 || inspection.ID > 0 {
  154. syncSuccessNum++
  155. }
  156. }
  157. }
  158. }
  159. syncInfo.SyncSuccessNum = int64(syncSuccessNum)
  160. UpdateSyncInfo(&syncInfo)
  161. // patientStr = append(patientStr,patient.HisUserId)
  162. // utils.InfoLog("patientStr:%v",patientStr)
  163. }
  164. } else {
  165. var syncInfo models.MiddleSyncInfo
  166. // 如果没有数据,则插入一条数据到同步详情表中
  167. syncInfo.OrgId = org_id
  168. syncInfo.SyncTime = time.Now().Unix()
  169. syncInfo.SyncResultType = 0
  170. syncInfo.SyncRsultRemark = "该机构没有对应的his_user_id"
  171. syncInfo.CreateTime = time.Now().Unix()
  172. syncInfo.UpdateTime = time.Now().Unix()
  173. err := CreateSyncInfo(&syncInfo)
  174. if err != nil {
  175. utils.ErrorLog("创建同步信息失败:%v", err)
  176. return
  177. }
  178. utils.InfoLog("同步信息详情:%v", syncInfo)
  179. return
  180. }
  181. SyncToBase()
  182. utils.SuccessLog("检验检查任务完成")
  183. }
  184. func SyncToBase() {
  185. utils.TraceLog("检验检查同步任务开始执行")
  186. org_id := int64(9538)
  187. // 第一步:跟进org_id 去中间库查出需要同步的数据
  188. inspection_references, _ := GetSyncInspectionReferenceByOrgId(org_id)
  189. inspections, _ := GetSyncInspectionByOrgId(org_id)
  190. // 第二步:将数据同步到业务库
  191. if len(inspection_references) > 0 {
  192. for _, inspection_reference := range inspection_references {
  193. SyncInspectionReference(&inspection_reference)
  194. }
  195. }
  196. if len(inspections) > 0 {
  197. for _, inspection := range inspections {
  198. SyncInspection(&inspection)
  199. }
  200. }
  201. utils.SuccessLog("检验检查同步任务完成")
  202. }
  203. // func SyncSZblLis() {
  204. // utils.TraceLog("检验检查同步任务开始执行")
  205. // org_id := int64(10138)
  206. // GetDataInsertDB(org_id)
  207. // }
  208. // func SyncSZblLisResult() {
  209. // utils.TraceLog("获取检验检查结果任务开始执行")
  210. // org_id := int64(10138)
  211. // GetResultDataInsertDB(org_id)
  212. // }