index.ts 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. import request from '@/config/axios'
  2. import dayjs from 'dayjs'
  3. // ================== 时间字段序列化:发给后端统一用毫秒时间戳(13位) ==================
  4. // 医嘱/执行相关时间字段(orderTime/stopTime/executeTime/planTime/execTime)前端表单与
  5. // 打印层仍使用 "YYYY-MM-DD HH:mm:ss" 字符串,仅在调用接口发送时转成毫秒时间戳;
  6. // planDate(按日期筛选执行记录)维持 YYYY-MM-DD 字符串不变。
  7. const toTs = (val?: string | number): number | undefined => {
  8. if (val === undefined || val === null || val === '') return undefined
  9. if (typeof val === 'number') return val
  10. const t = dayjs(val).valueOf()
  11. return Number.isNaN(t) ? undefined : t
  12. }
  13. // ================== 时间字段反序列化:响应方向时间戳 → 字符串 ==================
  14. // 后端响应可能把上述时间字段返回为 Long 时间戳(13位毫秒 或 10位秒),
  15. // 在 GET 接口 .then 里统一转回 "YYYY-MM-DD HH:mm:ss",上层一律按字符串使用。
  16. // - 数字:13位→毫秒;10位→秒(兼容)
  17. // - 字符串:原样返回(兼容后端混合返回)
  18. // - 空:返回 ''
  19. export const fromTs = (val?: any): string => {
  20. if (val === undefined || val === null || val === '') return ''
  21. if (typeof val === 'number') {
  22. const d = val >= 1e12 ? dayjs(val) : dayjs.unix(val)
  23. return d.isValid() ? d.format('YYYY-MM-DD HH:mm:ss') : ''
  24. }
  25. return String(val)
  26. }
  27. // 长期医嘱单:条目 orderTime / stopTime → 毫秒时间戳
  28. const serializeLongOrder = (data: LongDoctorOrderForm) => ({
  29. ...data,
  30. entries: (data.entries || []).map((e) => ({
  31. ...e,
  32. orderTime: toTs(e.orderTime),
  33. stopTime: toTs(e.stopTime)
  34. }))
  35. })
  36. // 临时医嘱单:条目 orderTime / executeTime → 毫秒时间戳
  37. const serializeShortOrder = (data: ShortDoctorOrderForm) => ({
  38. ...data,
  39. entries: (data.entries || []).map((e) => ({
  40. ...e,
  41. orderTime: toTs(e.orderTime),
  42. executeTime: toTs(e.executeTime)
  43. }))
  44. })
  45. // 护士执行记录:planTime / execTime → 毫秒时间戳
  46. const serializeExecution = (data: DoctorOrderExecution) => ({
  47. ...data,
  48. planTime: toTs(data.planTime),
  49. execTime: toTs(data.execTime)
  50. })
  51. // 获取转院变更列表
  52. export const getChangeCourtyardList = (query) => {
  53. return request.get({
  54. url: 'bpm/process-instance/transfer-change-page',
  55. params: query
  56. })
  57. }
  58. // 获取列表
  59. export const getBedChangePage = (query) => {
  60. return request.get({
  61. url: 'bpm/process-instance/bed-change-page',
  62. params: query
  63. })
  64. }
  65. // 获取详情
  66. export const getBedChangeRecordById = (id, status,isDetail) => {
  67. return request.get({
  68. url: `elderly/bedChangeRecord/detail?id=${id}&status=${status}&isDetail=${isDetail}`
  69. })
  70. }
  71. // 获取详情
  72. export const getBedChangeRecordElderlyById = (id) => {
  73. return request.get({
  74. url: `/elderly/bedChangeRecord/getElderlyById?elderId=${id}`,
  75. })
  76. }
  77. // 新增
  78. export const bedChangeCreate = (data) => {
  79. return request.post({
  80. url: `bpm/elderly/bedChangeCreate`,
  81. data
  82. })
  83. }
  84. // 对调
  85. export const bedChangeRecord = (data) => {
  86. return request.post({
  87. url: `/elderly/bedChangeRecord/swap`,
  88. data
  89. })
  90. }
  91. //
  92. // 检测是否可以包房
  93. export const checkPrivateRoom = (id,elderId=undefined) => {
  94. return request.get({
  95. url: `elderly/bedChangeRecord/checkPrivateRoom?bedId=${id}&elderId=${elderId}`
  96. })
  97. }
  98. // ============================================================
  99. // 长期医嘱单(LongDoctorOrder)相关接口
  100. // ============================================================
  101. // 单条长期医嘱条目(对应一条长期医嘱 + 停止信息)
  102. export interface LongDoctorOrderEntry {
  103. id?: number
  104. longDoctorOrderId?: number
  105. orderTime?: string
  106. orderContent?: string
  107. // 给药三要素(结构化选择项)
  108. frequency?: string // 给药频次,存缩写,如 qd
  109. medTime?: string // 给药时间,存缩写,如 ac
  110. route?: string // 给药途径,存缩写,如 po
  111. doctorSign?: string
  112. nurseSign?: string
  113. stopTime?: string
  114. stopDoctorSign?: string
  115. stopNurseSign?: string
  116. remark?: string
  117. status?: number
  118. statusText?: string
  119. }
  120. // 长期医嘱单 VO:按长者分组的单据,含多条 entry
  121. export interface LongDoctorOrderVO {
  122. id?: number
  123. elderId?: number
  124. elderName?: string
  125. gender?: number | string
  126. genderName?: string
  127. bedName?: string
  128. nurseLevelName?: string
  129. tenantId?: number | string
  130. // 汇总字段(列表用,后端可冗余返回)
  131. entryCount?: number
  132. latestOrderTime?: string
  133. entries?: LongDoctorOrderEntry[]
  134. createTime?: string
  135. }
  136. export interface LongDoctorOrderForm {
  137. id?: number
  138. elderId: number
  139. entries: LongDoctorOrderEntry[]
  140. }
  141. // 长期医嘱单分页(list 时间字段自动反序列化,包括 entries[].orderTime/stopTime)
  142. export const getLongDoctorOrderPage = (query: Recordable) => {
  143. return request.get({
  144. url: 'elderly/longDoctorOrder/page',
  145. params: query
  146. }).then((data: any) => {
  147. if (data?.list) {
  148. data.list = data.list.map((row: any) => ({
  149. ...row,
  150. latestOrderTime: fromTs(row.latestOrderTime),
  151. createTime: fromTs(row.createTime),
  152. entries: (row.entries || []).map((e: any) => ({
  153. ...e,
  154. orderTime: fromTs(e.orderTime),
  155. stopTime: fromTs(e.stopTime)
  156. }))
  157. }))
  158. }
  159. return data
  160. })
  161. }
  162. // 长期医嘱单详情(entries[].orderTime/stopTime 自动反序列化)
  163. export const getLongDoctorOrder = (id: number) => {
  164. return request.get({
  165. url: `elderly/longDoctorOrder/get?id=${id}`
  166. }).then((data: any) => {
  167. if (data?.entries) {
  168. data.entries = data.entries.map((e: any) => ({
  169. ...e,
  170. orderTime: fromTs(e.orderTime),
  171. stopTime: fromTs(e.stopTime)
  172. }))
  173. }
  174. data.latestOrderTime = fromTs(data.latestOrderTime)
  175. data.createTime = fromTs(data.createTime)
  176. return data
  177. })
  178. }
  179. // 新增长期医嘱单(orderTime/stopTime 自动转毫秒时间戳发送)
  180. export const createLongDoctorOrder = (data: LongDoctorOrderForm) => {
  181. return request.post({
  182. url: 'elderly/longDoctorOrder/create',
  183. data: serializeLongOrder(data)
  184. })
  185. }
  186. // 更新长期医嘱单(orderTime/stopTime 自动转毫秒时间戳发送)
  187. export const updateLongDoctorOrder = (data: LongDoctorOrderForm) => {
  188. return request.put({
  189. url: 'elderly/longDoctorOrder/update',
  190. data: serializeLongOrder(data)
  191. })
  192. }
  193. // 删除长期医嘱单
  194. export const deleteLongDoctorOrder = (id: number) => {
  195. return request.delete({
  196. url: `elderly/longDoctorOrder/delete?id=${id}`
  197. })
  198. }
  199. // 单条长期医嘱条目状态切换(停止 / 启用)
  200. // status: 0=未开始 1=在用 2=已停止
  201. export const updateLongDoctorOrderEntryStatus = (entryId: number, status: number) => {
  202. return request.put({
  203. url: `elderly/longDoctorOrder/entry/updateStatus?id=${entryId}&status=${status}`
  204. })
  205. }
  206. // 长期医嘱单状态字典(0 未开始 / 1 在用 / 2 已停止)
  207. export const LONG_ORDER_STATUS = {
  208. NOT_STARTED: 0,
  209. IN_USE: 1,
  210. STOPPED: 2
  211. }
  212. export const LONG_ORDER_STATUS_OPTIONS = [
  213. { label: '未开始', value: 0 },
  214. { label: '在用', value: 1 },
  215. { label: '已停止', value: 2 }
  216. ]
  217. export const getLongDoctorOrderStatusText = (status: number | string | undefined): string => {
  218. const item = LONG_ORDER_STATUS_OPTIONS.find((o) => o.value === Number(status))
  219. return item ? item.label : '未知'
  220. }
  221. // ==================医嘱给药三要素字典(长期/临时医嘱共用)====================
  222. export interface MedOption {
  223. value: string
  224. label: string // 下拉框主显:缩写 + 中文
  225. cn: string // 中文含义
  226. tip: string // 临床常见使用场景(hover tips)
  227. }
  228. // 给药频次
  229. export const MED_FREQUENCY_OPTIONS: MedOption[] = [
  230. { value: 'qd', label: 'qd 每日1次', cn: '每日1次', tip: '常规慢病长期口服用药' },
  231. { value: 'bid', label: 'bid 每日2次', cn: '每日2次', tip: '多数普通口服药早晚分服' },
  232. { value: 'tid', label: 'tid 每日3次', cn: '每日3次', tip: '需随三餐规律服用的药物' },
  233. { value: 'qid', label: 'qid 每日4次', cn: '每日4次', tip: '严格间隔6小时的抗感染治疗' },
  234. { value: 'qn', label: 'qn 每晚1次', cn: '每晚1次', tip: '助眠、长效降压、降脂类药物' },
  235. { value: 'qod', label: 'qod 隔日1次', cn: '隔日1次', tip: '特殊半衰期较长的药物' },
  236. { value: 'qw', label: 'qw 每周1次', cn: '每周1次', tip: '长效特殊制剂、慢病维持给药' },
  237. { value: 'biw', label: 'biw 每周2次', cn: '每周2次', tip: '康复理疗、部分专科治疗' },
  238. { value: 'tiw', label: 'tiw 每周3次', cn: '每周3次', tip: '透析、肌肉注射类治疗' },
  239. { value: 'q2w', label: 'q2w 每2周1次', cn: '每2周1次', tip: '化疗、靶向、生物制剂给药' },
  240. { value: 'q3w', label: 'q3w 每3周1次', cn: '每3周1次', tip: '化疗、靶向、生物制剂给药' },
  241. { value: 'q4w', label: 'q4w 每4周1次', cn: '每4周1次', tip: '化疗、靶向、生物制剂给药' },
  242. { value: 'q8h', label: 'q8h 每8小时1次', cn: '每8小时1次', tip: '重症、抗感染精准间隔给药' },
  243. { value: 'q6h', label: 'q6h 每6小时1次', cn: '每6小时1次', tip: '重症、抗感染精准间隔给药' },
  244. { value: 'q4h', label: 'q4h 每4小时1次', cn: '每4小时1次', tip: '重症、抗感染精准间隔给药' }
  245. ]
  246. // 给药时间
  247. export const MED_TIME_OPTIONS: MedOption[] = [
  248. { value: 'ac', label: 'ac 餐前', cn: '餐前服用', tip: '促胃动力、降糖、胃黏膜保护剂' },
  249. { value: 'pc', label: 'pc 餐后', cn: '餐后服用', tip: '对胃肠道有刺激的普通药物' },
  250. { value: 'hs', label: 'hs 睡前', cn: '睡前服用', tip: '助眠、长效降压、抗过敏药' },
  251. { value: 'st', label: 'st 立即', cn: '立即执行', tip: '急诊急救、紧急处置类医嘱' },
  252. { value: 'prn', label: 'prn 必要时', cn: '必要时使用', tip: '止痛、止吐、退热等对症药物' },
  253. { value: 'sos', label: 'sos 紧急1次', cn: '紧急需要时1次', tip: '限24小时内仅用1次的应急药' },
  254. { value: 'am', label: 'am 上午', cn: '上午', tip: '标注日间常规给药时间' },
  255. { value: 'pm', label: 'pm 下午', cn: '下午', tip: '标注午后常规给药时间' }
  256. ]
  257. // 给药途径
  258. export const MED_ROUTE_OPTIONS: MedOption[] = [
  259. { value: 'po', label: 'po 口服', cn: '口服', tip: '绝大多数常规口服药物' },
  260. { value: 'iv', label: 'iv 静脉推注', cn: '静脉推注', tip: '小容量药剂快速静脉给药' },
  261. { value: 'ivgtt', label: 'ivgtt/iv drip 静脉滴注', cn: '静脉滴注/输液', tip: '大容量补液、抗感染输液' },
  262. { value: 'im', label: 'im 肌内注射', cn: '肌内注射', tip: '常规疫苗、止痛针、部分抗生素' },
  263. { value: 'sc', label: 'sc 皮下注射', cn: '皮下注射', tip: '胰岛素、低分子肝素等药物' },
  264. { value: 'ih', label: 'ih 皮下注射', cn: '皮下注射', tip: '胰岛素、低分子肝素等药物' },
  265. { value: 'igtt', label: 'igtt 胃肠滴注', cn: '胃肠滴注', tip: '鼻饲、肠内营养输注' },
  266. { value: 'inh', label: 'inh 吸入给药', cn: '吸入给药', tip: '哮喘、慢阻肺的雾化治疗' },
  267. { value: 'ext', label: 'ext 外用', cn: '外用', tip: '皮肤药膏、黏膜局部用药' },
  268. // ↓↓↓ 9-08 新增给药途径项(与现有项 value 不重复)
  269. { value: 'id', label: 'id 皮内注射', cn: '皮内注射', tip: '皮试、疫苗过敏试验等' },
  270. { value: 'sl', label: 'sl 舌下含服', cn: '舌下含服', tip: '硝酸甘油、速效救心丸等急救药' },
  271. { value: 'top', label: 'top 皮肤外用/经皮给药', cn: '皮肤外用/经皮给药', tip: '软膏、贴片、涂抹类外用药' },
  272. { value: 'pr', label: 'pr 直肠给药', cn: '直肠给药', tip: '栓剂、灌肠、退热等' },
  273. { value: 'buccal', label: 'buccal 颊部给药', cn: '颊部给药', tip: '口腔黏膜贴片、含化药片' },
  274. { value: 'ia', label: 'ia 动脉内注射', cn: '动脉内注射', tip: '介入治疗、动脉化疗等' },
  275. { value: 'ip', label: 'ip 腹腔注射', cn: '腹腔注射', tip: '腹膜透析、腹腔化疗等' }
  276. ]
  277. // ==================临时医嘱单====================
  278. // 单条临时医嘱条目(对应打印页一行)
  279. export interface ShortDoctorOrderEntry {
  280. id?: number
  281. orderTime?: string
  282. orderContent?: string
  283. // 给药三要素(结构化选择项)
  284. frequency?: string // 给药频次,存缩写,如 qd
  285. medTime?: string // 给药时间,存缩写,如 ac
  286. route?: string // 给药途径,存缩写,如 po
  287. doctorSign?: string
  288. executeTime?: string
  289. nurseSign?: string
  290. remark?: string
  291. }
  292. // 临时医嘱单 VO(按长者分组的单据,含多条 entry)
  293. export interface ShortDoctorOrderVO {
  294. id?: number
  295. elderId?: number
  296. elderName?: string
  297. gender?: number | string
  298. genderName?: string
  299. bedName?: string
  300. nurseLevelName?: string
  301. tenantId?: number | string
  302. // 汇总字段(后端可冗余返回,便于列表展示)
  303. entryCount?: number
  304. latestOrderTime?: string
  305. latestExecuteTime?: string
  306. entries?: ShortDoctorOrderEntry[]
  307. createTime?: string
  308. }
  309. export interface ShortDoctorOrderForm {
  310. id?: number
  311. elderId: number
  312. entries: ShortDoctorOrderEntry[]
  313. }
  314. // 临时医嘱单分页(list 时间字段自动反序列化,包括 entries[].orderTime/executeTime)
  315. export const getShortDoctorOrderPage = (query: Recordable) => {
  316. return request.get({
  317. url: 'elderly/shortDoctorOrder/page',
  318. params: query
  319. }).then((data: any) => {
  320. if (data?.list) {
  321. data.list = data.list.map((row: any) => ({
  322. ...row,
  323. latestOrderTime: fromTs(row.latestOrderTime),
  324. latestExecuteTime: fromTs(row.latestExecuteTime),
  325. createTime: fromTs(row.createTime),
  326. entries: (row.entries || []).map((e: any) => ({
  327. ...e,
  328. orderTime: fromTs(e.orderTime),
  329. executeTime: fromTs(e.executeTime)
  330. }))
  331. }))
  332. }
  333. return data
  334. })
  335. }
  336. // 临时医嘱单详情(entries[].orderTime/executeTime 自动反序列化)
  337. export const getShortDoctorOrder = (id: number) => {
  338. return request.get({
  339. url: `elderly/shortDoctorOrder/get?id=${id}`
  340. }).then((data: any) => {
  341. if (data?.entries) {
  342. data.entries = data.entries.map((e: any) => ({
  343. ...e,
  344. orderTime: fromTs(e.orderTime),
  345. executeTime: fromTs(e.executeTime)
  346. }))
  347. }
  348. data.latestOrderTime = fromTs(data.latestOrderTime)
  349. data.latestExecuteTime = fromTs(data.latestExecuteTime)
  350. data.createTime = fromTs(data.createTime)
  351. return data
  352. })
  353. }
  354. // 新增临时医嘱单(orderTime/executeTime 自动转毫秒时间戳发送)
  355. export const createShortDoctorOrder = (data: ShortDoctorOrderForm) => {
  356. return request.post({
  357. url: 'elderly/shortDoctorOrder/create',
  358. data: serializeShortOrder(data)
  359. })
  360. }
  361. // 更新临时医嘱单(orderTime/executeTime 自动转毫秒时间戳发送)
  362. export const updateShortDoctorOrder = (data: ShortDoctorOrderForm) => {
  363. return request.put({
  364. url: 'elderly/shortDoctorOrder/update',
  365. data: serializeShortOrder(data)
  366. })
  367. }
  368. // 删除临时医嘱单
  369. export const deleteShortDoctorOrder = (id: number) => {
  370. return request.delete({
  371. url: `elderly/shortDoctorOrder/delete?id=${id}`
  372. })
  373. }
  374. // ==================医嘱执行记录(护士执行单)====================
  375. // 一条"护士执行"记录:前端按医嘱展开生成执行行后,护士点击执行即写入一条
  376. export interface DoctorOrderExecution {
  377. id?: number
  378. orderType?: number // 1=长期医嘱 2=临时医嘱
  379. orderEntryId?: number // 关联原医嘱条目 id(长期/临时各自的 entry id)
  380. elderId?: number
  381. elderName?: string
  382. elderAge?: number | string // 年龄(执行医嘱 makeRow / 长者执行记录弹窗都用到)
  383. bedName?: string
  384. orderContent?: string
  385. frequency?: string // 给药频次缩写
  386. medTime?: string // 给药时间缩写
  387. route?: string // 给药途径缩写
  388. planTime?: string // 计划执行时间 YYYY-MM-DD HH:mm
  389. execTime?: string // 实际执行时间
  390. execNurseSign?: string // 执行护士签名
  391. status?: number // 0=待执行 1=已执行 2=已跳过
  392. remark?: string
  393. tenantId?: number | string
  394. createTime?: string
  395. }
  396. export const EXEC_STATUS = {
  397. PENDING: 0,
  398. DONE: 1,
  399. SKIPPED: 2
  400. }
  401. export const EXEC_STATUS_OPTIONS = [
  402. { label: '待执行', value: 0 },
  403. { label: '已执行', value: 1 },
  404. { label: '已跳过', value: 2 }
  405. ]
  406. // 分页查询某日护士执行记录(list 时间字段自动反序列化,planDate 仍按 YYYY-MM-DD 字符串传参)
  407. export const getDoctorOrderExecutionPage = (query: Recordable) => {
  408. return request.get({
  409. url: 'elderly/doctorOrderExecution/page',
  410. params: query
  411. }).then((data: any) => {
  412. if (data?.list) {
  413. data.list = data.list.map((row: any) => ({
  414. ...row,
  415. planTime: fromTs(row.planTime),
  416. execTime: fromTs(row.execTime),
  417. createTime: fromTs(row.createTime)
  418. }))
  419. }
  420. return data
  421. })
  422. }
  423. // 护士执行(新增/更新一条执行记录,planTime/execTime 自动转毫秒时间戳发送)
  424. export const executeDoctorOrder = (data: DoctorOrderExecution) => {
  425. return request.post({
  426. url: 'elderly/doctorOrderExecution/execute',
  427. data: serializeExecution(data)
  428. })
  429. }
  430. // 跳过/取消某次执行
  431. export const skipDoctorOrderExecution = (id: number) => {
  432. return request.put({
  433. url: `elderly/doctorOrderExecution/skip?id=${id}`
  434. })
  435. }
  436. // 选项值 → 中文含义(空值返回空串)
  437. export const getMedCn = (options: MedOption[], val?: string): string => {
  438. if (!val) return ''
  439. const item = options.find((o) => o.value === val)
  440. return item ? item.cn : val
  441. }
  442. /**
  443. * 根据频次(frequency)与给药时间(medTime),在指定日期展开"计划执行时点"列表(返回 HH:mm 数组)。
  444. * 说明:
  445. * - 日频次(qd/bid/tid/qid/qn/q8h/q6h/q4h) 按医学常规给出多个时点的 HH:mm;
  446. * - 周频次/间隔频次(qod/qw/biw/tiw/q2w/q3w/q4w) 无法对应到一天内的多个时点,统一给 1 个 09:00 代表点;
  447. * - medTime 仅对"单时点"频次(如 qd/qn/qod/qw 等)做微调(hs→21:00、am→09:00、pc→08:00 等);
  448. * - 该映射为前端启发式,真实排班以后端执行计划为准。
  449. */
  450. export const buildExecutionPlanTimes = (frequency?: string, medTime?: string): string[] => {
  451. const single = (base: string): string[] => [base]
  452. const byMedTime = (def: string): string => {
  453. switch (medTime) {
  454. case 'hs':
  455. return '21:00'
  456. case 'am':
  457. return '09:00'
  458. case 'pm':
  459. return '15:00'
  460. case 'ac':
  461. return '07:30'
  462. case 'pc':
  463. return '08:00'
  464. default:
  465. return def
  466. }
  467. }
  468. switch (frequency) {
  469. case 'qd':
  470. return single(byMedTime('09:00'))
  471. case 'bid':
  472. return medTime === 'hs' ? ['09:00', '21:00'] : ['09:00', '15:00']
  473. case 'tid':
  474. return ['08:00', '12:00', '18:00']
  475. case 'qid':
  476. return ['06:00', '12:00', '18:00', '22:00']
  477. case 'qn':
  478. return single('21:00')
  479. case 'qod':
  480. return single(byMedTime('09:00'))
  481. case 'qw':
  482. return single(byMedTime('09:00'))
  483. case 'biw':
  484. return single('09:00')
  485. case 'tiw':
  486. return single('09:00')
  487. case 'q2w':
  488. return single('09:00')
  489. case 'q3w':
  490. return single('09:00')
  491. case 'q4w':
  492. return single('09:00')
  493. case 'q8h':
  494. return ['08:00', '16:00', '00:00']
  495. case 'q6h':
  496. return ['06:00', '12:00', '18:00', '00:00']
  497. case 'q4h':
  498. return ['04:00', '08:00', '12:00', '16:00', '20:00', '00:00']
  499. default:
  500. return single('09:00')
  501. }
  502. }