cron.go 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package service
  2. import (
  3. "IC/models"
  4. "IC/utils"
  5. "encoding/json"
  6. _ "fmt"
  7. oracle "github.com/dzwvip/gorm-oracle"
  8. _ "github.com/jinzhu/gorm"
  9. "github.com/robfig/cron/v3"
  10. "gorm.io/gorm"
  11. _ "strings"
  12. "time"
  13. )
  14. // cron表达式 https://www.cnblogs.com/zuxingyu/p/6023919.html
  15. // var createLisSyncCronJob *cron.Cron
  16. func init() {
  17. }
  18. // 返回一个支持至 秒 级别的 cron
  19. func newWithSeconds() *cron.Cron {
  20. secondParser := cron.NewParser(cron.Second | cron.Minute |
  21. cron.Hour | cron.Dom | cron.Month | cron.DowOptional | cron.Descriptor)
  22. return cron.New(cron.WithParser(secondParser), cron.WithChain())
  23. }
  24. func BeginAutoSyncLis() {
  25. utils.InfoLog("开启自动检验检查同步定时任务")
  26. createLisSyncCronJob := newWithSeconds()
  27. orgDb, err := gorm.Open(oracle.Open("oracle://zjybase:zjybase@10.0.0.248:1521/orcl"), &gorm.Config{})
  28. if err != nil {
  29. utils.InfoLog("创建数据库连接失败:%v", err)
  30. }
  31. //specys := "0 0 */1 * * ?" // 每天凌晨3点同步 唐山朝阳医院
  32. //createLisSyncCronJob.AddFunc(specys, func() {
  33. // SyncTscyLis()
  34. //})
  35. //
  36. //specys1 := "0 10 */2 * * ?" // 每两个小时同步长沙南雅医院
  37. //createLisSyncCronJob.AddFunc(specys1, func() {
  38. //SyncCsnyLis()
  39. //})
  40. //
  41. //spec := "0 50 1 * * ?" // 每天凌晨1点同步 监利大院的
  42. //createLisSyncCronJob.AddFunc(spec, func() {
  43. // SyncHbdyLis()
  44. //})
  45. //
  46. //spec2 := "0 50 2 * * ?" // 每天凌晨2点同步 龙岗二院
  47. //createLisSyncCronJob.AddFunc(spec2, func() {
  48. // SyncLisLgty()
  49. //})
  50. //
  51. //spec3 := "0 50 3 * * ?" // 每天凌晨2点同步 广州暨华血液透析中心
  52. //createLisSyncCronJob.AddFunc(spec3, func() {
  53. // SyncLisGzjhtx()
  54. //})
  55. //
  56. //spec4 := "0 20 3 * * ?" // 每天凌晨同步 石狮盛誉血液透析中心
  57. //createLisSyncCronJob.AddFunc(spec4, func() {
  58. // SyncSYData2()
  59. //})
  60. //
  61. //spec5 := "0 20 4 * * ?" // 每天凌晨同步 唐山朝阳医院VIP血液透析中心
  62. //createLisSyncCronJob.AddFunc(spec5, func() {
  63. // SyncTscyVipLis()
  64. //})
  65. //spec6 := "0 20 1 * * ?" // 每天凌晨同步 广州康允透析中心LIS对接,本地部署的
  66. //createLisSyncCronJob.AddFunc(spec6, func() {
  67. // SyncGzkyLis()
  68. //})
  69. //spec7 := "0 40 1 * * ?" // 每天凌晨同步 广州康允透析中心LIS对接,本地部署的
  70. //createLisSyncCronJob.AddFunc(spec7, func() {
  71. // SyncLisSzwz()
  72. //})
  73. //spec8 := "0 25 */2 * * ?" // 每个小时同步一次 汕头三优透析中心LIS对接,本地部署的
  74. //createLisSyncCronJob.AddFunc(spec8, func() {
  75. // SyncStsyLis()
  76. //})
  77. //spec9 := "0 57 * * * ?" // 每个小时同步一次 遵化仁爱医院LIS对接,本地部署的
  78. //createLisSyncCronJob.AddFunc(spec9, func() {
  79. // SyncTszhraLis()
  80. //})
  81. //spec10 := "0 20 * * * ?" // 每个小时同步一次 韶关始兴源和盛LIS对接,本地部署的
  82. //createLisSyncCronJob.AddFunc(spec10, func() {
  83. // SyncLisSgyhs()
  84. //})
  85. //spec11 := "0 20 */2 * * ?" // 每个小时同步一次 揭阳景熹LIS对接,本地部署的
  86. //createLisSyncCronJob.AddFunc(spec11, func() {
  87. // SyncLisPljx(10597)
  88. //})
  89. //spec12 := "0 40 */2 * * ?" // 每个小时同步一次 普宁景熹LIS对接,本地部署的
  90. //createLisSyncCronJob.AddFunc(spec12, func() {
  91. // SyncLisPljx(10599)
  92. //})
  93. //spec13 := "0 10 * * * ?" // 每个小时同步一次 唐山遵化仁爱医院LIS对接,本地部署的
  94. //createLisSyncCronJob.AddFunc(spec13, func() {
  95. // SyncTszhraLis()
  96. //})
  97. //spec14 := "0 10 2 * * ?" // 每天凌晨步一次 从化意达血液透析中心LIS对接,服务器部署
  98. //createLisSyncCronJob.AddFunc(spec14, func() {
  99. // SyncLisChyd(0)
  100. //})
  101. //spec15 := "0 20 */2 * * ?" // 每个小时同步一次 成都城东康复医院,本地部署的
  102. //createLisSyncCronJob.AddFunc(spec15, func() {
  103. // SyncSccdkfyyLis()
  104. //})
  105. //spec16 := "0 20 */2 * * ?" // 每个小时同步一次 深圳五洲医院,本地部署的
  106. //createLisSyncCronJob.AddFunc(spec16, func() {
  107. // SyncLisSzwz()
  108. //})
  109. //spec17 := "0 20 */2 * * ?" // 每个小时同步一次 湖南嘉禾恒佳医院,本地部署的
  110. //createLisSyncCronJob.AddFunc(spec17, func() {
  111. // SyncJhhjyyLis()
  112. //})
  113. spec18 := "1 * * * * ?" // 每个30秒同步一次 四川乐山友谊医院医嘱对接,本地部署的
  114. createLisSyncCronJob.AddFunc(spec18, func() {
  115. SyncSclsyyyyyz(orgDb)
  116. })
  117. spec19 := "* 35 */4 * * ?" // 每个2个小时同步一次 四川乐山友谊医院LIS对接,本地部署的
  118. createLisSyncCronJob.AddFunc(spec19, func() {
  119. SyncScyyyyLis()
  120. })
  121. createLisSyncCronJob.Start()
  122. }
  123. func AutoSyncLis() {
  124. utils.TraceLog("检验检查任务开始执行")
  125. org_id := int64(9538)
  126. // 第一步:根据机构id获取对应机构所有病人的his_user_id
  127. patients, patientError := GetHisUserIdByOrgID(org_id)
  128. if patientError != nil {
  129. utils.ErrorLog("获取用户His_user_id信息失败:%v", patientError)
  130. return
  131. }
  132. // patientStr:= make([]interface{},0)
  133. if len(patients) > 0 {
  134. // 第二步:根据病人的his_user_id来查询上次同步时间
  135. for _, patient := range patients {
  136. if len(patient.HisUserId) <= 0 {
  137. continue
  138. }
  139. syncLastInfo, _ := GetSyncTimeByOrgID(org_id, patient.HisUserId)
  140. var sync_time int64
  141. if syncLastInfo.ID > 0 {
  142. sync_time = syncLastInfo.SyncTime
  143. } else {
  144. inspectionLastInfo, _ := GetInspectionLastInfoByOrgID(org_id, patient.HisUserId)
  145. if inspectionLastInfo.ID > 0 {
  146. sync_time = inspectionLastInfo.CreatedTime
  147. } else {
  148. sync_time = 0
  149. }
  150. }
  151. syncTimes := time.Unix(sync_time, 0).Format("2006-01-02 15:04")
  152. utils.InfoLog("syncTimes:%v", syncTimes)
  153. // 第三步:跟进上次同步时间和指定的his_user_id,获取上次同步到现在指定人的检验检查记录
  154. resultList, _ := GetListByHisUserID(patient.HisUserId, syncTimes, patient.SelectType)
  155. var syncInfo models.MiddleSyncInfo
  156. if len(resultList) > 0 {
  157. // 如果有数据,则把同步过来的详情插入一条数据到同步详情表中
  158. syncInfo.OrgId = org_id
  159. syncInfo.HisUserId = patient.HisUserId
  160. syncInfo.SyncTime = time.Now().Unix()
  161. syncInfo.SyncResultType = 1
  162. syncInfo.SyncRsultRemark = "同步成功"
  163. syncInfo.SyncTotalNum = int64(len(resultList))
  164. syncInfo.SyncSuccessNum = 0
  165. SyncInfos, _ := json.Marshal(resultList)
  166. syncInfo.SyncInfo = string(SyncInfos)
  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. } else {
  175. // 如果没有数据,则插入一条数据到同步详情表中
  176. syncInfo.OrgId = org_id
  177. syncInfo.HisUserId = patient.HisUserId
  178. syncInfo.SyncTime = time.Now().Unix()
  179. syncInfo.SyncResultType = 1
  180. syncInfo.SyncRsultRemark = "该患者这个时间段没有任何检验检查数据"
  181. syncInfo.CreateTime = time.Now().Unix()
  182. syncInfo.UpdateTime = time.Now().Unix()
  183. err := CreateSyncInfo(&syncInfo)
  184. if err != nil {
  185. utils.ErrorLog("创建同步信息失败:%v", err)
  186. return
  187. }
  188. // utils.InfoLog("同步信息详情:%v",syncInfo)
  189. continue
  190. }
  191. // 第四部:将同步过来的数据插入到中间库对应的表
  192. syncSuccessNum := 0
  193. for _, result := range resultList {
  194. if (result.HisUserId == patient.HisUserId) || (result.PatientName == patient.HisUserId) {
  195. patientId := patient.XtPatientId
  196. if patientId > 0 {
  197. inspection_reference, inspection, _ := Sync(result, org_id, patientId)
  198. if inspection_reference.ID > 0 || inspection.ID > 0 {
  199. syncSuccessNum++
  200. }
  201. }
  202. }
  203. }
  204. syncInfo.SyncSuccessNum = int64(syncSuccessNum)
  205. UpdateSyncInfo(&syncInfo)
  206. // patientStr = append(patientStr,patient.HisUserId)
  207. // utils.InfoLog("patientStr:%v",patientStr)
  208. }
  209. } else {
  210. var syncInfo models.MiddleSyncInfo
  211. // 如果没有数据,则插入一条数据到同步详情表中
  212. syncInfo.OrgId = org_id
  213. syncInfo.SyncTime = time.Now().Unix()
  214. syncInfo.SyncResultType = 0
  215. syncInfo.SyncRsultRemark = "该机构没有对应的his_user_id"
  216. syncInfo.CreateTime = time.Now().Unix()
  217. syncInfo.UpdateTime = time.Now().Unix()
  218. err := CreateSyncInfo(&syncInfo)
  219. if err != nil {
  220. utils.ErrorLog("创建同步信息失败:%v", err)
  221. return
  222. }
  223. utils.InfoLog("同步信息详情:%v", syncInfo)
  224. return
  225. }
  226. SyncToBase()
  227. utils.SuccessLog("检验检查任务完成")
  228. }
  229. func SyncToBase() {
  230. utils.TraceLog("检验检查同步任务开始执行")
  231. org_id := int64(9538)
  232. // 第一步:跟进org_id 去中间库查出需要同步的数据
  233. inspection_references, _ := GetSyncInspectionReferenceByOrgId(org_id)
  234. inspections, _ := GetSyncInspectionByOrgId(org_id)
  235. // 第二步:将数据同步到业务库
  236. if len(inspection_references) > 0 {
  237. for _, inspection_reference := range inspection_references {
  238. SyncInspectionReference(&inspection_reference)
  239. }
  240. }
  241. if len(inspections) > 0 {
  242. for _, inspection := range inspections {
  243. SyncInspection(&inspection)
  244. }
  245. }
  246. utils.SuccessLog("检验检查同步任务完成")
  247. }
  248. // func SyncSZblLis() {
  249. // utils.TraceLog("检验检查同步任务开始执行")
  250. // org_id := int64(10138)
  251. // GetDataInsertDB(org_id)
  252. // }
  253. // func SyncSZblLisResult() {
  254. // utils.TraceLog("获取检验检查结果任务开始执行")
  255. // org_id := int64(10138)
  256. // GetResultDataInsertDB(org_id)
  257. // }