cron.go 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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/v3"
  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. //specys := "0 0 */1 * * ?" // 每天凌晨3点同步 唐山朝阳医院
  26. //createLisSyncCronJob.AddFunc(specys, func() {
  27. // SyncTscyLis()
  28. //})
  29. //
  30. //specys1 := "0 10 */2 * * ?" // 每两个小时同步长沙南雅医院
  31. //createLisSyncCronJob.AddFunc(specys1, func() {
  32. // SyncCsnyLis()
  33. //})
  34. //
  35. //spec := "0 50 1 * * ?" // 每天凌晨1点同步 监利大院的
  36. //createLisSyncCronJob.AddFunc(spec, func() {
  37. // SyncHbdyLis()
  38. //})
  39. //
  40. //spec2 := "0 50 2 * * ?" // 每天凌晨2点同步 龙岗二院
  41. //createLisSyncCronJob.AddFunc(spec2, func() {
  42. // SyncLisLgty()
  43. //})
  44. //
  45. //spec3 := "0 50 3 * * ?" // 每天凌晨2点同步 广州暨华血液透析中心
  46. //createLisSyncCronJob.AddFunc(spec3, func() {
  47. // SyncLisGzjhtx()
  48. //})
  49. //
  50. //spec4 := "0 20 3 * * ?" // 每天凌晨同步 石狮盛誉血液透析中心
  51. //createLisSyncCronJob.AddFunc(spec4, func() {
  52. // SyncSYData2()
  53. //})
  54. //
  55. //spec5 := "0 20 4 * * ?" // 每天凌晨同步 石狮盛誉血液透析中心
  56. //createLisSyncCronJob.AddFunc(spec5, func() {
  57. // SyncTscyVipLis()
  58. //})
  59. //spec6 := "0 20 1 * * ?" // 每天凌晨同步 广州康允透析中心LIS对接,本地部署的
  60. //createLisSyncCronJob.AddFunc(spec6, func() {
  61. // SyncGzkyLis()
  62. //})
  63. //spec7 := "0 40 1 * * ?" // 每天凌晨同步 广州康允透析中心LIS对接,本地部署的
  64. //createLisSyncCronJob.AddFunc(spec7, func() {
  65. // SyncLisSzwz()
  66. //})
  67. //spec8 := "0 20 */2 * * ?" // 每个小时同步一次 汕头三优透析中心LIS对接,本地部署的
  68. //createLisSyncCronJob.AddFunc(spec8, func() {
  69. // SyncStsyLis()
  70. //})
  71. //spec9 := "0 57 * * * ?" // 每个小时同步一次 遵化仁爱医院LIS对接,本地部署的
  72. //createLisSyncCronJob.AddFunc(spec9, func() {
  73. // SyncTszhraLis()
  74. //})
  75. //spec10 := "0 20 * * * ?" // 每个小时同步一次 韶关始兴源和盛LIS对接,本地部署的
  76. //createLisSyncCronJob.AddFunc(spec10, func() {
  77. // SyncLisSgyhs()
  78. //})
  79. //spec11 := "0 20 */2 * * ?" // 每个小时同步一次 揭阳景熹LIS对接,本地部署的
  80. //createLisSyncCronJob.AddFunc(spec11, func() {
  81. // SyncLisPljx(10597)
  82. //})
  83. //
  84. //spec12 := "0 40 */2 * * ?" // 每个小时同步一次 普宁景熹LIS对接,本地部署的
  85. //createLisSyncCronJob.AddFunc(spec12, func() {
  86. // SyncLisPljx(10599)
  87. //})
  88. createLisSyncCronJob.Start()
  89. }
  90. func AutoSyncLis() {
  91. utils.TraceLog("检验检查任务开始执行")
  92. org_id := int64(9538)
  93. // 第一步:根据机构id获取对应机构所有病人的his_user_id
  94. patients, patientError := GetHisUserIdByOrgID(org_id)
  95. if patientError != nil {
  96. utils.ErrorLog("获取用户His_user_id信息失败:%v", patientError)
  97. return
  98. }
  99. // patientStr:= make([]interface{},0)
  100. if len(patients) > 0 {
  101. // 第二步:根据病人的his_user_id来查询上次同步时间
  102. for _, patient := range patients {
  103. if len(patient.HisUserId) <= 0 {
  104. continue
  105. }
  106. syncLastInfo, _ := GetSyncTimeByOrgID(org_id, patient.HisUserId)
  107. var sync_time int64
  108. if syncLastInfo.ID > 0 {
  109. sync_time = syncLastInfo.SyncTime
  110. } else {
  111. inspectionLastInfo, _ := GetInspectionLastInfoByOrgID(org_id, patient.HisUserId)
  112. if inspectionLastInfo.ID > 0 {
  113. sync_time = inspectionLastInfo.CreatedTime
  114. } else {
  115. sync_time = 0
  116. }
  117. }
  118. syncTimes := time.Unix(sync_time, 0).Format("2006-01-02 15:04")
  119. utils.InfoLog("syncTimes:%v", syncTimes)
  120. // 第三步:跟进上次同步时间和指定的his_user_id,获取上次同步到现在指定人的检验检查记录
  121. resultList, _ := GetListByHisUserID(patient.HisUserId, syncTimes, patient.SelectType)
  122. var syncInfo models.MiddleSyncInfo
  123. if len(resultList) > 0 {
  124. // 如果有数据,则把同步过来的详情插入一条数据到同步详情表中
  125. syncInfo.OrgId = org_id
  126. syncInfo.HisUserId = patient.HisUserId
  127. syncInfo.SyncTime = time.Now().Unix()
  128. syncInfo.SyncResultType = 1
  129. syncInfo.SyncRsultRemark = "同步成功"
  130. syncInfo.SyncTotalNum = int64(len(resultList))
  131. syncInfo.SyncSuccessNum = 0
  132. SyncInfos, _ := json.Marshal(resultList)
  133. syncInfo.SyncInfo = string(SyncInfos)
  134. syncInfo.CreateTime = time.Now().Unix()
  135. syncInfo.UpdateTime = time.Now().Unix()
  136. err := CreateSyncInfo(&syncInfo)
  137. if err != nil {
  138. utils.ErrorLog("创建同步信息失败:%v", err)
  139. return
  140. }
  141. } else {
  142. // 如果没有数据,则插入一条数据到同步详情表中
  143. syncInfo.OrgId = org_id
  144. syncInfo.HisUserId = patient.HisUserId
  145. syncInfo.SyncTime = time.Now().Unix()
  146. syncInfo.SyncResultType = 1
  147. syncInfo.SyncRsultRemark = "该患者这个时间段没有任何检验检查数据"
  148. syncInfo.CreateTime = time.Now().Unix()
  149. syncInfo.UpdateTime = time.Now().Unix()
  150. err := CreateSyncInfo(&syncInfo)
  151. if err != nil {
  152. utils.ErrorLog("创建同步信息失败:%v", err)
  153. return
  154. }
  155. // utils.InfoLog("同步信息详情:%v",syncInfo)
  156. continue
  157. }
  158. // 第四部:将同步过来的数据插入到中间库对应的表
  159. syncSuccessNum := 0
  160. for _, result := range resultList {
  161. if (result.HisUserId == patient.HisUserId) || (result.PatientName == patient.HisUserId) {
  162. patientId := patient.XtPatientId
  163. if patientId > 0 {
  164. inspection_reference, inspection, _ := Sync(result, org_id, patientId)
  165. if inspection_reference.ID > 0 || inspection.ID > 0 {
  166. syncSuccessNum++
  167. }
  168. }
  169. }
  170. }
  171. syncInfo.SyncSuccessNum = int64(syncSuccessNum)
  172. UpdateSyncInfo(&syncInfo)
  173. // patientStr = append(patientStr,patient.HisUserId)
  174. // utils.InfoLog("patientStr:%v",patientStr)
  175. }
  176. } else {
  177. var syncInfo models.MiddleSyncInfo
  178. // 如果没有数据,则插入一条数据到同步详情表中
  179. syncInfo.OrgId = org_id
  180. syncInfo.SyncTime = time.Now().Unix()
  181. syncInfo.SyncResultType = 0
  182. syncInfo.SyncRsultRemark = "该机构没有对应的his_user_id"
  183. syncInfo.CreateTime = time.Now().Unix()
  184. syncInfo.UpdateTime = time.Now().Unix()
  185. err := CreateSyncInfo(&syncInfo)
  186. if err != nil {
  187. utils.ErrorLog("创建同步信息失败:%v", err)
  188. return
  189. }
  190. utils.InfoLog("同步信息详情:%v", syncInfo)
  191. return
  192. }
  193. SyncToBase()
  194. utils.SuccessLog("检验检查任务完成")
  195. }
  196. func SyncToBase() {
  197. utils.TraceLog("检验检查同步任务开始执行")
  198. org_id := int64(9538)
  199. // 第一步:跟进org_id 去中间库查出需要同步的数据
  200. inspection_references, _ := GetSyncInspectionReferenceByOrgId(org_id)
  201. inspections, _ := GetSyncInspectionByOrgId(org_id)
  202. // 第二步:将数据同步到业务库
  203. if len(inspection_references) > 0 {
  204. for _, inspection_reference := range inspection_references {
  205. SyncInspectionReference(&inspection_reference)
  206. }
  207. }
  208. if len(inspections) > 0 {
  209. for _, inspection := range inspections {
  210. SyncInspection(&inspection)
  211. }
  212. }
  213. utils.SuccessLog("检验检查同步任务完成")
  214. }
  215. // func SyncSZblLis() {
  216. // utils.TraceLog("检验检查同步任务开始执行")
  217. // org_id := int64(10138)
  218. // GetDataInsertDB(org_id)
  219. // }
  220. // func SyncSZblLisResult() {
  221. // utils.TraceLog("获取检验检查结果任务开始执行")
  222. // org_id := int64(10138)
  223. // GetResultDataInsertDB(org_id)
  224. // }