cron.go 7.1KB

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