auto_create_week_schedules_service.go 45KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056
  1. package service
  2. import (
  3. "fmt"
  4. "time"
  5. "XT_New/models"
  6. "XT_New/utils"
  7. "github.com/jinzhu/gorm"
  8. "github.com/robfig/cron"
  9. )
  10. // cron表达式 https://www.cnblogs.com/zuxingyu/p/6023919.html
  11. var createWeekSchedulesCronJob *cron.Cron
  12. func init() {
  13. utils.InfoLog("开启自动排班定时任务")
  14. createWeekSchedulesCronJob = cron.New()
  15. spec := "0 0 0 ? * MON" // 每周一凌晨0点生成排班
  16. //spec := "0 */1 * * * ?"
  17. createWeekSchedulesCronJob.AddFunc(spec, func() {
  18. //AutoCreateWeekSchedules()
  19. NewAutoCreateWeekSchedules()
  20. })
  21. }
  22. func BeginAutoCreateWeekSchedulesJob() {
  23. createWeekSchedulesCronJob.Start()
  24. }
  25. func NewAutoCreateWeekSchedules() {
  26. utils.TraceLog("自动排班任务开始执行")
  27. var modes []*models.PatientScheduleTemplateMode
  28. getModesErr := readDb.Model(&models.PatientScheduleTemplateMode{}).Where("mode <> 0 AND status = 1 ").Find(&modes).Error
  29. if getModesErr != nil {
  30. utils.ErrorLog("自动排班-获取启用模板模式列表失败:%v", getModesErr)
  31. CreateDBErrorRecord(0, "自动排班-获取启用模板模式列表失败:%v", getModesErr)
  32. return
  33. }
  34. for _, mode := range modes {
  35. templates, getTemplatesErr := GetOrgPatientScheduleTemplateIDs(mode.OrgID)
  36. if getTemplatesErr != nil {
  37. utils.ErrorLog("自动排班-org_id: %v :获取模板 ID 失败:%v", mode.OrgID, getTemplatesErr)
  38. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取模板 ID 失败:%v", mode.OrgID, getTemplatesErr)
  39. continue
  40. } else if len(templates) == 0 {
  41. utils.WarningLog("自动排班-org_id: %v :没有模板", mode.OrgID)
  42. continue
  43. }
  44. now := time.Now()
  45. nextSecWeek := now.AddDate(0, 0, 14)
  46. //nextThridWeek := now.AddDate(0, 0, 21)
  47. //nextFourWeek := now.AddDate(0, 0, 28)
  48. curWeek := now.AddDate(0, 0, 0)
  49. nextWeek := now.AddDate(0, 0, 7)
  50. tx := writeDb.Begin()
  51. thisTime := time.Now()
  52. _, theWeek := thisTime.ISOWeek()
  53. fmt.Println(theWeek)
  54. //mode.Week == 0 为了兼容开发新功能前的老数据
  55. //新功能加了,预约排班生成的,int64(theWeek) >= mode.Week 当判断当前周数是否小大于或者等于模版预约第几周生成的周数
  56. if mode.Week == 0 || int64(theWeek) >= mode.Week {
  57. if mode.Week > 0 { //新机构或者重新设置模版的机构需要帮他们根据选择的模版模式,来生成本周,下周,下下周数据
  58. if mode.Mode == 1 {
  59. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  60. if getItemsErr != nil {
  61. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  62. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  63. continue
  64. }
  65. insertErr, count := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, curWeek, items, nil)
  66. if insertErr != "" {
  67. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr)
  68. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr)
  69. tx.Rollback()
  70. continue
  71. } else {
  72. //更新周次
  73. templates[0].Week = count
  74. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  75. }
  76. items2, getItemsErr2 := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  77. if getItemsErr2 != nil {
  78. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr2)
  79. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr2)
  80. continue
  81. }
  82. insertErr2, count2 := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextWeek, items2, nil)
  83. if insertErr2 != "" {
  84. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr2)
  85. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr2)
  86. tx.Rollback()
  87. continue
  88. } else {
  89. //更新周次
  90. templates[0].Week = count2
  91. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  92. }
  93. items3, getItemsErr3 := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  94. if getItemsErr3 != nil {
  95. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr3)
  96. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr3)
  97. continue
  98. }
  99. insertErr3, count3 := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items3, nil)
  100. if insertErr != "" {
  101. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr3)
  102. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr3)
  103. tx.Rollback()
  104. continue
  105. } else {
  106. //更新周次
  107. templates[0].Week = count3
  108. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  109. }
  110. mode.Week = 0
  111. mode.ExecuteTimes += 3
  112. mode.ModifyTime = now.Unix()
  113. updateModeErr := tx.Save(mode).Error
  114. if updateModeErr != nil {
  115. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  116. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  117. tx.Rollback()
  118. continue
  119. }
  120. tx.Commit()
  121. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  122. time.Sleep(time.Second * 30)
  123. } else if mode.Mode == 2 {
  124. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  125. if getItemsErr != nil {
  126. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  127. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  128. continue
  129. }
  130. insertErr, count := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, curWeek, items, nil)
  131. if insertErr != "" {
  132. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr)
  133. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr)
  134. tx.Rollback()
  135. continue
  136. } else {
  137. //更新周次
  138. templates[0].Week = count
  139. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  140. }
  141. items2, getItemsErr2 := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  142. if getItemsErr2 != nil {
  143. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr2)
  144. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr2)
  145. continue
  146. }
  147. insertErr2, count2 := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextWeek, items2, nil)
  148. if insertErr2 != "" {
  149. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr2)
  150. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr2)
  151. tx.Rollback()
  152. continue
  153. } else {
  154. //更新周次
  155. templates[1].Week = count2
  156. UpdateTemplateItemWeek(templates[1].OrgID, templates[1].ID, int8(templates[1].Week))
  157. }
  158. items3, getItemsErr3 := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  159. if getItemsErr3 != nil {
  160. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr3)
  161. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr3)
  162. continue
  163. }
  164. insertErr3, count3 := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items3, nil)
  165. if insertErr != "" {
  166. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr3)
  167. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr3)
  168. tx.Rollback()
  169. continue
  170. } else {
  171. //更新周次
  172. templates[0].Week = count3
  173. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  174. }
  175. mode.Week = 0
  176. mode.ExecuteTimes += 3
  177. mode.ModifyTime = now.Unix()
  178. updateModeErr := tx.Save(mode).Error
  179. if updateModeErr != nil {
  180. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  181. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  182. tx.Rollback()
  183. continue
  184. }
  185. tx.Commit()
  186. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  187. time.Sleep(time.Second * 30)
  188. } else if mode.Mode == 3 || mode.Mode == 4 {
  189. fmt.Println("---------")
  190. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  191. if getItemsErr != nil {
  192. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  193. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  194. continue
  195. }
  196. insertErr, count := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, curWeek, items, nil)
  197. if insertErr != "" {
  198. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr)
  199. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr)
  200. tx.Rollback()
  201. continue
  202. } else {
  203. //更新周次
  204. templates[0].Week = count
  205. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  206. }
  207. items12, getItemsErr12 := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  208. fmt.Println("------22222")
  209. if getItemsErr12 != nil {
  210. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr12)
  211. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr12)
  212. continue
  213. }
  214. insertErr12, count12 := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextWeek, items12, nil)
  215. if insertErr12 != "" {
  216. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr12)
  217. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr12)
  218. tx.Rollback()
  219. continue
  220. } else {
  221. //更新周次
  222. templates[1].Week = count12
  223. UpdateTemplateItemWeek(templates[1].OrgID, templates[1].ID, int8(templates[1].Week))
  224. }
  225. items3, getItemsErr3 := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[2].ID)
  226. if getItemsErr3 != nil {
  227. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr3)
  228. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr3)
  229. continue
  230. }
  231. insertErr3, count3 := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items3, nil)
  232. if insertErr != "" {
  233. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr3)
  234. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入本周排班失败:%v", mode.OrgID, insertErr3)
  235. tx.Rollback()
  236. continue
  237. } else {
  238. //更新周次
  239. templates[2].Week = count3
  240. UpdateTemplateItemWeek(templates[2].OrgID, templates[2].ID, int8(templates[2].Week))
  241. }
  242. mode.Week = 0
  243. mode.ExecuteTimes += 3
  244. mode.ModifyTime = now.Unix()
  245. updateModeErr := tx.Save(mode).Error
  246. if updateModeErr != nil {
  247. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  248. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  249. tx.Rollback()
  250. continue
  251. }
  252. tx.Commit()
  253. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  254. time.Sleep(time.Second * 30)
  255. }
  256. } else {
  257. if mode.Mode == 1 { // 用第一周模板生成下第二周的排班
  258. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  259. if getItemsErr != nil {
  260. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  261. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  262. continue
  263. }
  264. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  265. if insertErr != "" {
  266. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  267. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  268. tx.Rollback()
  269. continue
  270. } else {
  271. //thisTime := time.Now()
  272. //_, theWeek := thisTime.ISOWeek()
  273. //更新周次
  274. templates[0].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  275. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  276. }
  277. mode.Week = 0
  278. mode.ExecuteTimes += 1
  279. mode.ModifyTime = now.Unix()
  280. updateModeErr := tx.Save(mode).Error
  281. if updateModeErr != nil {
  282. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  283. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  284. tx.Rollback()
  285. continue
  286. }
  287. tx.Commit()
  288. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  289. time.Sleep(time.Second * 30)
  290. } else if mode.Mode == 2 { // mode.ExecuteTimes % 2 的结果,如果为0,用第一周模板生成下第二周的排班,否则用第二周的模板生成排班
  291. if mode.ExecuteTimes%2 == 0 {
  292. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  293. if getItemsErr != nil {
  294. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  295. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  296. continue
  297. }
  298. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  299. if insertErr != "" {
  300. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  301. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  302. tx.Rollback()
  303. continue
  304. } else {
  305. templates[0].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  306. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  307. }
  308. mode.Week = 0
  309. mode.ExecuteTimes += 1
  310. mode.ModifyTime = now.Unix()
  311. updateModeErr := tx.Save(mode).Error
  312. if updateModeErr != nil {
  313. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  314. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  315. tx.Rollback()
  316. continue
  317. }
  318. tx.Commit()
  319. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  320. time.Sleep(time.Second * 30)
  321. } else {
  322. if len(templates) < 2 {
  323. utils.WarningLog("自动排班-org_id: %v :没有第二周的模板")
  324. continue
  325. }
  326. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  327. if getItemsErr != nil {
  328. utils.ErrorLog("自动排班-org_id: %v :获取第二周模板Item失败:%v", mode.OrgID, getItemsErr)
  329. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第二周模板Item失败:%v", mode.OrgID, getItemsErr)
  330. continue
  331. }
  332. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  333. if insertErr != "" {
  334. utils.ErrorLog("自动排班-org_id: %v :使用第二周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  335. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第二周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  336. tx.Rollback()
  337. continue
  338. } else {
  339. //thisTime := time.Now()
  340. //_, week := thisTime.ISOWeek()
  341. //更新周次
  342. templates[1].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  343. //templates[1].Week = week + 2
  344. UpdateTemplateItemWeek(templates[1].OrgID, templates[1].ID, int8(templates[1].Week))
  345. }
  346. mode.Week = 0
  347. mode.ExecuteTimes += 1
  348. mode.ModifyTime = now.Unix()
  349. updateModeErr := tx.Save(mode).Error
  350. if updateModeErr != nil {
  351. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  352. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  353. tx.Rollback()
  354. continue
  355. }
  356. tx.Commit()
  357. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  358. time.Sleep(time.Second * 30)
  359. }
  360. } else if mode.Mode == 3 { // mode.ExecuteTimes % 2 的结果,如果为0,用第一周模板生成下第二周的排班,否则用第二周的模板生成排班
  361. if mode.ExecuteTimes%3 == 0 {
  362. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  363. if getItemsErr != nil {
  364. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  365. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  366. continue
  367. }
  368. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  369. if insertErr != "" {
  370. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第三周排班失败:%v", mode.OrgID, insertErr)
  371. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第三周排班失败:%v", mode.OrgID, insertErr)
  372. tx.Rollback()
  373. continue
  374. } else {
  375. templates[0].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  376. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  377. }
  378. mode.Week = 0
  379. mode.ExecuteTimes += 1
  380. mode.ModifyTime = now.Unix()
  381. updateModeErr := tx.Save(mode).Error
  382. if updateModeErr != nil {
  383. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  384. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  385. tx.Rollback()
  386. continue
  387. }
  388. tx.Commit()
  389. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  390. time.Sleep(time.Second * 30)
  391. } else if mode.ExecuteTimes%3 == 1 {
  392. if len(templates) < 2 {
  393. utils.WarningLog("自动排班-org_id: %v :没有第二周的模板")
  394. continue
  395. }
  396. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  397. if getItemsErr != nil {
  398. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  399. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  400. continue
  401. }
  402. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  403. if insertErr != "" {
  404. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  405. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  406. tx.Rollback()
  407. continue
  408. } else {
  409. templates[1].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  410. UpdateTemplateItemWeek(templates[1].OrgID, templates[1].ID, int8(templates[1].Week))
  411. }
  412. mode.Week = 0
  413. mode.ExecuteTimes += 1
  414. mode.ModifyTime = now.Unix()
  415. updateModeErr := tx.Save(mode).Error
  416. if updateModeErr != nil {
  417. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  418. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  419. tx.Rollback()
  420. continue
  421. }
  422. tx.Commit()
  423. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  424. time.Sleep(time.Second * 30)
  425. } else {
  426. if len(templates) < 3 {
  427. utils.WarningLog("自动排班-org_id: %v :没有第三周的模板")
  428. continue
  429. }
  430. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[2].ID)
  431. if getItemsErr != nil {
  432. utils.ErrorLog("自动排班-org_id: %v :获取第三周模板Item失败:%v", mode.OrgID, getItemsErr)
  433. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第三周模板Item失败:%v", mode.OrgID, getItemsErr)
  434. continue
  435. }
  436. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  437. if insertErr != "" {
  438. utils.ErrorLog("自动排班-org_id: %v :使用第三周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  439. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第三周模板插入下第三周排班失败:%v", mode.OrgID, insertErr)
  440. tx.Rollback()
  441. continue
  442. } else {
  443. templates[2].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  444. UpdateTemplateItemWeek(templates[2].OrgID, templates[2].ID, int8(templates[2].Week))
  445. }
  446. mode.Week = 0
  447. mode.ExecuteTimes += 1
  448. mode.ModifyTime = now.Unix()
  449. updateModeErr := tx.Save(mode).Error
  450. if updateModeErr != nil {
  451. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  452. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  453. tx.Rollback()
  454. continue
  455. }
  456. tx.Commit()
  457. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  458. time.Sleep(time.Second * 30)
  459. }
  460. } else if mode.Mode == 4 { // mode.ExecuteTimes % 2 的结果,如果为0,用第一周模板生成下第二周的排班,否则用第二周的模板生成排班
  461. if mode.ExecuteTimes%4 == 0 {
  462. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  463. if getItemsErr != nil {
  464. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  465. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  466. continue
  467. }
  468. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  469. if insertErr != "" {
  470. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  471. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  472. tx.Rollback()
  473. continue
  474. } else {
  475. templates[0].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  476. UpdateTemplateItemWeek(templates[0].OrgID, templates[0].ID, int8(templates[0].Week))
  477. }
  478. mode.Week = 0
  479. mode.ExecuteTimes += 1
  480. mode.ModifyTime = now.Unix()
  481. updateModeErr := tx.Save(mode).Error
  482. if updateModeErr != nil {
  483. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  484. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  485. tx.Rollback()
  486. continue
  487. }
  488. tx.Commit()
  489. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  490. time.Sleep(time.Second * 30)
  491. } else if mode.ExecuteTimes%4 == 1 {
  492. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  493. if getItemsErr != nil {
  494. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  495. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  496. continue
  497. }
  498. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  499. if insertErr != "" {
  500. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  501. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  502. tx.Rollback()
  503. continue
  504. } else {
  505. templates[1].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  506. UpdateTemplateItemWeek(templates[1].OrgID, templates[1].ID, int8(templates[1].Week))
  507. }
  508. mode.Week = 0
  509. mode.ExecuteTimes += 1
  510. mode.ModifyTime = now.Unix()
  511. updateModeErr := tx.Save(mode).Error
  512. if updateModeErr != nil {
  513. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  514. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  515. tx.Rollback()
  516. continue
  517. }
  518. tx.Commit()
  519. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  520. time.Sleep(time.Second * 30)
  521. } else if mode.ExecuteTimes%4 == 2 {
  522. if len(templates) < 2 {
  523. utils.WarningLog("自动排班-org_id: %v :没有第二周的模板")
  524. continue
  525. }
  526. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[2].ID)
  527. if getItemsErr != nil {
  528. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  529. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  530. continue
  531. }
  532. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  533. if insertErr != "" {
  534. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  535. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  536. tx.Rollback()
  537. continue
  538. } else {
  539. templates[2].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  540. UpdateTemplateItemWeek(templates[2].OrgID, templates[2].ID, int8(templates[2].Week))
  541. }
  542. mode.Week = 0
  543. mode.ExecuteTimes += 1
  544. mode.ModifyTime = now.Unix()
  545. updateModeErr := tx.Save(mode).Error
  546. if updateModeErr != nil {
  547. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  548. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  549. tx.Rollback()
  550. continue
  551. }
  552. tx.Commit()
  553. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  554. time.Sleep(time.Second * 30)
  555. } else if mode.ExecuteTimes%4 == 3 {
  556. if len(templates) < 3 {
  557. utils.WarningLog("自动排班-org_id: %v :没有第三周的模板")
  558. continue
  559. }
  560. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[3].ID)
  561. if getItemsErr != nil {
  562. utils.ErrorLog("自动排班-org_id: %v :获取第三周模板Item失败:%v", mode.OrgID, getItemsErr)
  563. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第三周模板Item失败:%v", mode.OrgID, getItemsErr)
  564. continue
  565. }
  566. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  567. if insertErr != "" {
  568. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第四周排班失败:%v", mode.OrgID, insertErr)
  569. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第三周排班失败:%v", mode.OrgID, insertErr)
  570. tx.Rollback()
  571. continue
  572. } else {
  573. templates[3].Week = GetWeeks(nextSecWeek.Format("2006-01-02 15:04:05"))
  574. UpdateTemplateItemWeek(templates[3].OrgID, templates[3].ID, int8(templates[3].Week))
  575. }
  576. mode.Week = 0
  577. mode.ExecuteTimes += 1
  578. mode.ModifyTime = now.Unix()
  579. updateModeErr := tx.Save(mode).Error
  580. if updateModeErr != nil {
  581. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  582. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  583. tx.Rollback()
  584. continue
  585. }
  586. tx.Commit()
  587. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  588. time.Sleep(time.Second * 30)
  589. }
  590. }
  591. }
  592. utils.SuccessLog("自动排班任务完成")
  593. }
  594. }
  595. }
  596. func AutoCreateWeekSchedules() {
  597. utils.TraceLog("自动排班任务开始执行")
  598. var modes []*models.PatientScheduleTemplateMode
  599. getModesErr := readDb.Model(&models.PatientScheduleTemplateMode{}).Where("mode <> 0 AND status = 1").Find(&modes).Error
  600. if getModesErr != nil {
  601. utils.ErrorLog("自动排班-获取启用模板模式列表失败:%v", getModesErr)
  602. CreateDBErrorRecord(0, "自动排班-获取启用模板模式列表失败:%v", getModesErr)
  603. return
  604. }
  605. for _, mode := range modes {
  606. templates, getTemplatesErr := GetOrgPatientScheduleTemplateIDs(mode.OrgID)
  607. if getTemplatesErr != nil {
  608. utils.ErrorLog("自动排班-org_id: %v :获取模板 ID 失败:%v", mode.OrgID, getTemplatesErr)
  609. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取模板 ID 失败:%v", mode.OrgID, getTemplatesErr)
  610. continue
  611. } else if len(templates) == 0 {
  612. utils.WarningLog("自动排班-org_id: %v :没有模板", mode.OrgID)
  613. continue
  614. }
  615. now := time.Now()
  616. nextSecWeek := now.AddDate(0, 0, 14)
  617. tx := writeDb.Begin()
  618. if mode.Mode == 1 { // 用第一周模板生成下第二周的排班
  619. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  620. if getItemsErr != nil {
  621. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  622. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  623. continue
  624. }
  625. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  626. if insertErr != "" {
  627. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  628. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  629. tx.Rollback()
  630. continue
  631. }
  632. } else if mode.Mode == 2 { // mode.ExecuteTimes % 2 的结果,如果为0,用第一周模板生成下第二周的排班,否则用第二周的模板生成排班
  633. if mode.ExecuteTimes%2 == 0 {
  634. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  635. if getItemsErr != nil {
  636. utils.ErrorLog("自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  637. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第一周模板Item失败:%v", mode.OrgID, getItemsErr)
  638. continue
  639. }
  640. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  641. if insertErr != "" {
  642. utils.ErrorLog("自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  643. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  644. tx.Rollback()
  645. continue
  646. }
  647. } else {
  648. if len(templates) < 2 {
  649. utils.WarningLog("自动排班-org_id: %v :没有第二周的模板")
  650. continue
  651. }
  652. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  653. if getItemsErr != nil {
  654. utils.ErrorLog("自动排班-org_id: %v :获取第二周模板Item失败:%v", mode.OrgID, getItemsErr)
  655. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :获取第二周模板Item失败:%v", mode.OrgID, getItemsErr)
  656. continue
  657. }
  658. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, nextSecWeek, items, nil)
  659. if insertErr != "" {
  660. utils.ErrorLog("自动排班-org_id: %v :使用第二周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  661. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id: %v :使用第二周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  662. tx.Rollback()
  663. continue
  664. } else {
  665. }
  666. }
  667. }
  668. mode.ExecuteTimes += 1
  669. mode.ModifyTime = now.Unix()
  670. updateModeErr := tx.Save(mode).Error
  671. if updateModeErr != nil {
  672. utils.ErrorLog("自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  673. CreateDBErrorRecord(mode.OrgID, "自动排班-org_id:%v :更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  674. tx.Rollback()
  675. continue
  676. }
  677. tx.Commit()
  678. utils.SuccessLog("自动排班-插入排班成功:org_id: %v", mode.OrgID)
  679. time.Sleep(time.Second * 30)
  680. }
  681. utils.SuccessLog("自动排班任务完成")
  682. }
  683. func _refreshWeekSchedulesWithTemplateItems(tx *gorm.DB, orgID int64, week time.Time, templateItems []*models.PatientScheduleTemplateItem, deviceNumberMap map[int64]*DeviceNumberViewModel) (string, int) {
  684. if deviceNumberMap == nil {
  685. deviceNumbers, getDeviceNumbersErr := GetAllValidDeviceNumbers(orgID)
  686. //fmt.Println("getDeviceNumbersErr3232322332323232323323223232323",getDeviceNumbersErr)
  687. if getDeviceNumbersErr != nil {
  688. return getDeviceNumbersErr.Error(), 0
  689. }
  690. deviceNumberMap = make(map[int64]*DeviceNumberViewModel, 0)
  691. for _, deviceNumber := range deviceNumbers {
  692. deviceNumberMap[deviceNumber.ID] = deviceNumber
  693. }
  694. }
  695. now := time.Now()
  696. monday, sunday := utils.GetMondayAndSundayOfWeekDate(&week)
  697. disableErr := tx.Model(&models.Schedule{}).Where("user_org_id = ? AND status = 1 AND schedule_date >= ? AND schedule_date <= ?", orgID, monday.Unix(), sunday.Unix()).Updates(map[string]interface{}{"status": 0, "updated_time": now.Unix()}).Error
  698. //fmt.Println("disableErr323232332323232233222332232332",disableErr)
  699. if disableErr != nil {
  700. return disableErr.Error(), 0
  701. }
  702. var week_count int
  703. // 批量插入排班
  704. if len(templateItems) > 0 {
  705. timeLayout := "2006-01-02"
  706. loc, _ := time.LoadLocation("Local")
  707. tmp, _ := time.ParseInLocation(timeLayout, time.Unix(monday.Unix(), 0).Format("2006-01-02"), loc)
  708. _, weeks := tmp.ISOWeek()
  709. week_count = weeks
  710. //valueStrs := make([]string, 0, len(templateItems))
  711. //values := make([]interface{}, 0, len(templateItems)*11)
  712. var errs string
  713. for _, item := range templateItems {
  714. deviceNumber := deviceNumberMap[item.DeviceNumberID]
  715. if deviceNumber == nil {
  716. continue
  717. }
  718. so, _ := GetDialysisSolutionTwo(item.OrgID, item.PatientID, item.TreatMode)
  719. filedRecordOne, _ := FindFiledBy(item.OrgID, "透析器")
  720. filedRecordTwo, _ := FindFiledBy(item.OrgID, "灌流器")
  721. filedRecordThree, _ := FindFiledBy(item.OrgID, "透析器/灌流器")
  722. var DialysisMachineName string
  723. if filedRecordOne.IsShow == 1 {
  724. DialysisMachineName = so.DialysisDialyszers
  725. }
  726. if filedRecordThree.IsShow == 1 {
  727. if len(DialysisMachineName) > 0 {
  728. DialysisMachineName = DialysisMachineName + "," + so.DialyzerPerfusionApparatus
  729. } else {
  730. DialysisMachineName = so.DialyzerPerfusionApparatus
  731. }
  732. }
  733. if filedRecordTwo.IsShow == 1 {
  734. if len(DialysisMachineName) > 0 {
  735. DialysisMachineName = DialysisMachineName + "," + so.DialysisIrrigation
  736. } else {
  737. DialysisMachineName = so.DialysisIrrigation
  738. }
  739. }
  740. var sch models.Schedule
  741. sch.UserOrgId = orgID
  742. sch.PartitionId = deviceNumber.ZoneID
  743. sch.BedId = item.DeviceNumberID
  744. sch.PatientId = item.PatientID
  745. sch.ScheduleDate = monday.AddDate(0, 0, int(item.Weekday-1)).Unix()
  746. sch.ScheduleWeek = int64(item.Weekday)
  747. sch.ScheduleType = int64(item.TimeType)
  748. sch.ModeId = int64(item.TreatMode)
  749. sch.Status = 1
  750. sch.CreatedTime = now.Unix()
  751. sch.UpdatedTime = now.Unix()
  752. sch.IsExport = 0
  753. sch.DialysisMachineName = DialysisMachineName
  754. //为了防止数据重复,先查询有无记录
  755. //var othSch []*models.Schedule
  756. //readDb.Model(&models.Schedule{}).Where("status = 1 AND schedule_date = ? AND user_org_id = ? AND patient_id = ?", sch.ScheduleDate, sch.UserOrgId, sch.PatientId).Find(&othSch)
  757. //for _, items := range othSch {
  758. // items.Status = 0
  759. // writeDb.Save(&items)
  760. //}
  761. err := writeDb.Create(&sch).Error
  762. if err != nil {
  763. errs = errs + err.Error()
  764. }
  765. //valueStrs = append(valueStrs, "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
  766. //values = append(values, orgID)
  767. //values = append(values, deviceNumber.ZoneID)
  768. //values = append(values, item.DeviceNumberID)
  769. //values = append(values, item.PatientID)
  770. //values = append(values, monday.AddDate(0, 0, int(item.Weekday-1)).Unix())
  771. //values = append(values, item.Weekday)
  772. //values = append(values, item.TimeType)
  773. //values = append(values, item.TreatMode)
  774. //values = append(values, 1)
  775. //values = append(values, now.Unix())
  776. //values = append(values, now.Unix())
  777. //values = append(values, 0)
  778. //values = append(values, DialysisMachineName)
  779. }
  780. //sql := fmt.Sprintf("INSERT INTO xt_schedule (user_org_id, partition_id, bed_id, patient_id, schedule_date, schedule_week, schedule_type, mode_id, status, created_time, updated_time,is_export,dialysis_machine_name) VALUES %v;", strings.Join(valueStrs, ", "))
  781. //if insertErr := tx.Exec(sql, values...).Error; insertErr != nil {
  782. // fmt.Println("insertErr232332233223332232323222222www", insertErr)
  783. //}
  784. if len(errs) != 0 {
  785. return errs, 0
  786. }
  787. }
  788. return "", week_count
  789. }
  790. func FakeAutoCreateNextTwoWeekSchedules(orgID int64) {
  791. mode, getModeErr := GetOrgPatientScheduleTemplateMode(orgID)
  792. if getModeErr != nil {
  793. utils.ErrorLog("%v", getModeErr)
  794. return
  795. }
  796. templates, getTemplatesErr := GetOrgPatientScheduleTemplateIDs(mode.OrgID)
  797. if getTemplatesErr != nil {
  798. utils.ErrorLog("获取模板 ID 失败:%v", getTemplatesErr)
  799. return
  800. } else if len(templates) == 0 {
  801. utils.WarningLog("没有模板")
  802. return
  803. }
  804. deviceNumbers, getDeviceNumbersErr := GetAllValidDeviceNumbers(orgID)
  805. if getDeviceNumbersErr != nil {
  806. utils.ErrorLog("获取床位列表失败:%v", getDeviceNumbersErr)
  807. return
  808. }
  809. deviceNumberMap := make(map[int64]*DeviceNumberViewModel, 0)
  810. for _, deviceNumber := range deviceNumbers {
  811. deviceNumberMap[deviceNumber.ID] = deviceNumber
  812. }
  813. now := time.Now()
  814. tx := writeDb.Begin()
  815. if mode.Mode == 1 { // 用第一周模板生成下两周的排班
  816. items, getItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  817. if getItemsErr != nil {
  818. utils.ErrorLog("获取第一周模板Item失败:%v", getItemsErr)
  819. return
  820. }
  821. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, now.AddDate(0, 0, 7), items, deviceNumberMap)
  822. if insertErr != "" {
  823. utils.ErrorLog("使用第一周模板插入下第一周排班失败:%v", insertErr)
  824. tx.Rollback()
  825. return
  826. }
  827. insertErr, _ = _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, now.AddDate(0, 0, 14), items, deviceNumberMap)
  828. if insertErr != "" {
  829. utils.ErrorLog("使用第一周模板插入下第二周排班失败:%v", insertErr)
  830. tx.Rollback()
  831. return
  832. }
  833. } else if mode.Mode == 2 {
  834. firstItems, getFirstItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[0].ID)
  835. if getFirstItemsErr != nil {
  836. utils.ErrorLog("获取第一周模板Item失败:%v", getFirstItemsErr)
  837. return
  838. }
  839. secItems, getSecItemsErr := GetOrgPatientScheduleTemplateItemsWithoutPatientByTemplateID(mode.OrgID, templates[1].ID)
  840. if getSecItemsErr != nil {
  841. utils.ErrorLog("获取第一周模板Item失败:%v", getSecItemsErr)
  842. return
  843. }
  844. if mode.ExecuteTimes%2 == 0 {
  845. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, now.AddDate(0, 0, 7), firstItems, deviceNumberMap)
  846. if insertErr != "" {
  847. utils.ErrorLog("使用第一周模板插入下第一周排班失败:%v", insertErr)
  848. tx.Rollback()
  849. return
  850. }
  851. insertErr, _ = _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, now.AddDate(0, 0, 14), secItems, deviceNumberMap)
  852. if insertErr != "" {
  853. utils.ErrorLog("使用第二周模板插入下第二周排班失败:%v", insertErr)
  854. tx.Rollback()
  855. return
  856. }
  857. } else { // mode.ExecuteTimes%2 == 1
  858. insertErr, _ := _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, now.AddDate(0, 0, 7), secItems, deviceNumberMap)
  859. if insertErr != "" {
  860. utils.ErrorLog("使用第二周模板插入下第一周排班失败:%v", mode.OrgID, insertErr)
  861. tx.Rollback()
  862. return
  863. }
  864. insertErr, _ = _refreshWeekSchedulesWithTemplateItems(tx, mode.OrgID, now.AddDate(0, 0, 14), firstItems, deviceNumberMap)
  865. if insertErr != "" {
  866. utils.ErrorLog("使用第一周模板插入下第二周排班失败:%v", mode.OrgID, insertErr)
  867. tx.Rollback()
  868. return
  869. }
  870. }
  871. }
  872. mode.ExecuteTimes += 2
  873. mode.ModifyTime = now.Unix()
  874. updateModeErr := tx.Save(mode).Error
  875. if updateModeErr != nil {
  876. utils.ErrorLog("更新启用模板模式的执行次数失败:%v", mode.OrgID, updateModeErr)
  877. tx.Rollback()
  878. return
  879. }
  880. tx.Commit()
  881. utils.SuccessLog("模拟自动更新下两周排班成功")
  882. }
  883. func GetWeeks(oneTimeStr string) int {
  884. fmt.Println(oneTimeStr)
  885. //某个时间
  886. //oneTimeStr := "2018-01-08 00:00:00"
  887. //oneTimeStr := "2021-04-05 00:00:00"
  888. //时间转换成time.Time格式
  889. t, err := time.ParseInLocation("2006-01-02 15:04:05", oneTimeStr, time.Local)
  890. if err != nil {
  891. fmt.Println(err)
  892. }
  893. //获取这个时间的基于这一年有多少天了
  894. yearDay := t.YearDay()
  895. //获取上一年的最后一天
  896. yesterdayYearEndDay := t.AddDate(0, 0, -yearDay)
  897. //获取上一年最后一天是星期几
  898. dayInWeek := int(yesterdayYearEndDay.Weekday())
  899. //第一周的总天数,默认是7天
  900. firstWeekDays := 7
  901. //如果上一年最后一天不是星期天,则第一周总天数是7-dayInWeek
  902. if dayInWeek != 0 {
  903. firstWeekDays = 7 - dayInWeek
  904. }
  905. week := 0
  906. //如果这一年的总天数小于第一周总天数,则是第一周,否则按照这一年多少天减去第一周的天数除以7+1 但是要考虑这一天减去第一周天数除以7会取整型,
  907. //所以需要处理两个数取余之后是否大于0,如果大于0 则多加一天,这样自然周就算出来了。
  908. if yearDay <= firstWeekDays {
  909. week = 1
  910. } else {
  911. plusDay := 0
  912. if (yearDay-firstWeekDays)%7 > 0 {
  913. plusDay = 1
  914. }
  915. week = (yearDay-firstWeekDays)/7 + 1 + plusDay
  916. }
  917. fmt.Println(week)
  918. return week - 1
  919. }