appointment.vue 43KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747
  1. <template>
  2. <div class="main-contain">
  3. <el-dialog
  4. title="提示"
  5. :visible.sync="exportLogVisible"
  6. width="40%"
  7. >
  8. <div v-for="(item,index) in logs" :key="index">
  9. <span> {{ item.export_time | parseTime('{y}-{m}-{d} {h}:{i}:{s}')}}</span>
  10. <br/>
  11. <br/>
  12. <span>{{getContent(item)}}</span>
  13. <span style="color:blue" @click="generateTxt(item)">点击</span>
  14. <span>查看详情</span>
  15. <br/>
  16. <br/>
  17. </div>
  18. <span slot="footer" class="dialog-footer">
  19. <el-button @click="exportLogVisible = false">取 消</el-button>
  20. <el-button type="primary" @click="exportLogVisible = false">确 定</el-button>
  21. </span>
  22. </el-dialog>
  23. <el-dialog
  24. title="提示"
  25. :visible.sync="dialogVisible"
  26. width="40%"
  27. >
  28. <span>您提交的文档不是系统标准导入模板,请检查您的文档或重新下载文档</span>
  29. <span slot="footer" class="dialog-footer">
  30. <el-button @click="dialogVisible = false">取 消</el-button>
  31. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  32. </span>
  33. </el-dialog>
  34. <el-dialog
  35. title="提示"
  36. :visible.sync="isExistRepeatVisible"
  37. width="40%"
  38. >
  39. <span>检查到文档中同一天同个人存在多个排班,请检查并修改您的文档,重新导入</span>
  40. <span slot="footer" class="dialog-footer">
  41. <el-button @click="isExistRepeatVisible = false">取 消</el-button>
  42. <el-button type="primary" @click="isExistRepeatVisible = false">确 定</el-button>
  43. </span>
  44. </el-dialog>
  45. <div class="position">
  46. <bread-crumb :crumbs="crumbs"></bread-crumb>
  47. <el-col :span="15" style="text-align: right;">
  48. <div>
  49. <schedule-upload-excel style="float:left;margin-right: -500px" :on-success='handleSuccess'
  50. :before-upload="beforeUpload"></schedule-upload-excel>
  51. <el-button v-if="isShow()" type="primary" size="small" @click="export_file()"
  52. :loading="downloadLoading"
  53. >
  54. 导出模版
  55. </el-button>
  56. <el-button
  57. @click="generateLog()"
  58. class="filter-item"
  59. type="primary"
  60. size="small"
  61. >下载错误日志
  62. </el-button>
  63. <el-button type="primary" size="small" icon="el-icon-printer" @click="printScheduleAction">打印</el-button>
  64. <el-button type="primary" size="small" icon="el-icon-setting" @click="setScheduleTemplateAction">排班模板
  65. </el-button>
  66. </div>
  67. </el-col>
  68. </div>
  69. <div class="app-container">
  70. <!-- <el-row>
  71. <el-col :span="24"> -->
  72. <el-tabs v-model="activeName" :tab-position="tabPosition" ref="elTabs">
  73. <el-tab-pane name="lastWeek">
  74. <span slot="label"><i class="el-icon-date"></i> 上周 ({{theWeek.lastWeek}})</span>
  75. </el-tab-pane>
  76. <el-tab-pane name="thisWeek">
  77. <span slot="label"><i class="el-icon-date"></i> 本周 ({{theWeek.thisWeek}})</span>
  78. </el-tab-pane>
  79. <el-tab-pane name="nextWeek">
  80. <span slot="label"><i class="el-icon-date"></i> 下一周 ({{theWeek.nextWeek}})</span>
  81. </el-tab-pane>
  82. <el-tab-pane name="nextTwoWeek">
  83. <span slot="label"><i class="el-icon-date"></i> 下两周 ({{theWeek.nextTwoWeek}})</span>
  84. </el-tab-pane>
  85. </el-tabs>
  86. <!-- </el-col>
  87. </el-row> -->
  88. <table-data :week-time="activeName" :partitions-prop="partitions" :schedule-zone-row-prop="scheduleZoneRow"
  89. :schedule-zone-prop="scheduleZone" title=""></table-data>
  90. </div>
  91. </div>
  92. </template>
  93. <script>
  94. import { parseTime } from '@/utils'
  95. import tableData from './components/tableData'
  96. import { exportSchedule, getWeekPanels,initDate } from '@/api/schedule'
  97. import BreadCrumb from '@/xt_pages/components/bread-crumb'
  98. import UploadExcel from '@/xt_pages/components/UploadExcel'
  99. import ScheduleUploadExcel from './components/scheduleUploadExcel/index'
  100. import { generateLog } from '@/api/config'
  101. export default {
  102. name: 'appointment',
  103. data() {
  104. return {
  105. crumbs: [
  106. { path: false, name: '排班管理' },
  107. { path: '/workforce/appointment', name: '排班管理' }
  108. ],
  109. activeName: 'thisWeek',
  110. tabPosition: 'top',
  111. partitions: {},
  112. scheduleZone: [],
  113. days:[],
  114. logs:[],
  115. scheduleZoneRow: [],
  116. downloadLoading: false,
  117. msgTipVisible: false,
  118. dialogVisible: false,
  119. isExistRepeatVisible: false,
  120. exportLogVisible:false,
  121. theWeek: {
  122. lastWeek: 0,
  123. thisWeek: 0,
  124. nextWeek: 0,
  125. nextTwoWeek: 0
  126. }
  127. }
  128. },
  129. components: {
  130. ScheduleUploadExcel,
  131. tableData,
  132. BreadCrumb,
  133. UploadExcel
  134. },
  135. methods: {
  136. generateTxt:function(log) {
  137. var content = ''
  138. var errlog = log.err_logs
  139. for (let i = 0; i< errlog.length; i++){
  140. if (content.length == 0) {
  141. content = errlog[i].err_msg
  142. }else{
  143. content = content +"\n"+errlog[i].err_msg
  144. }
  145. }
  146. var url = new Blob(['\ufeff' + content], { type: 'text/txt,charset=UTF-8' })
  147. if (typeof url === 'object' && url instanceof Blob) {
  148. url = URL.createObjectURL(url) // 创建blob地址
  149. }
  150. const aLink = document.createElement('a')
  151. aLink.href = url
  152. aLink.download = this.timestampToTime(log.export_time)+'错误日志'
  153. aLink.click()
  154. },
  155. timestampToTime(timestamp) {
  156. var date = new Date(timestamp * 1000)//时间戳为10位需*1000,时间戳为13位的话不需乘1000
  157. var Y = date.getFullYear() + '年'
  158. var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '月'
  159. var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + '日 '
  160. var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + '时'
  161. var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + '分'
  162. var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds())+'秒'
  163. return Y + M + D + h + m + s
  164. },
  165. getContent(log) {
  166. return '您导入的文档共' + log.total_num + '条患者数据' + ',' + '已成功导入' + log.success_num + '条,导入失败' + log.fail_num + '条,'
  167. },
  168. generateLog() {
  169. let params = {
  170. 'log_type': 2
  171. }
  172. generateLog(params).then(
  173. response => {
  174. if (response.data.state === 1) {
  175. this.logs = response.data.data.logs
  176. this.exportLogVisible = true
  177. } else {
  178. this.$message.error(response.data.msg)
  179. }
  180. }
  181. )
  182. },
  183. getWeekPanels() {
  184. getWeekPanels(1).then(response => {
  185. if (response.data.state == 0) {
  186. return false
  187. }
  188. var partitions = response.data.data.partitions
  189. this.theWeek.thisWeek = response.data.data.theWeek
  190. this.theWeek.lastWeek = this.theWeek.thisWeek - 1
  191. this.theWeek.nextWeek = this.theWeek.thisWeek + 1
  192. this.theWeek.nextTwoWeek = this.theWeek.thisWeek + 2
  193. // 在控制变量改变的时候进行 强制渲染更新
  194. let childrenRefs = this.$refs.elTabs.$children
  195. this.$nextTick(() => {
  196. childrenRefs.forEach(child => child.$forceUpdate())
  197. })
  198. var that = this
  199. if (partitions.length > 0) {
  200. partitions.forEach(function(partition) {
  201. if (partition.jihaos.length == 0) {
  202. return false
  203. }
  204. that.scheduleZoneRow.push(partition.jihaos.length)
  205. that.partitions[partition.id] = partition
  206. partition.jihaos.forEach(function(jihao) {
  207. var thisPa = {
  208. area: partition.name,
  209. zone_id: partition.id,
  210. zone_type: partition.type,
  211. cut: jihao.number,
  212. jihao_id: jihao.id,
  213. Mon_M: {
  214. schedule_id: 0,
  215. mode_id: 0,
  216. mode_name: '',
  217. patient_id: 0,
  218. patient: ''
  219. },
  220. Mon_A: {
  221. schedule_id: 0,
  222. mode_id: 0,
  223. mode_name: '',
  224. patient_id: 0,
  225. patient: ''
  226. },
  227. Mon_N: {
  228. schedule_id: 0,
  229. mode_id: 0,
  230. mode_name: '',
  231. patient_id: 0,
  232. patient: ''
  233. },
  234. Tue_M: {
  235. schedule_id: 0,
  236. mode_id: 0,
  237. mode_name: '',
  238. patient_id: 0,
  239. patient: ''
  240. },
  241. Tue_A: {
  242. schedule_id: 0,
  243. mode_id: 0,
  244. mode_name: '',
  245. patient_id: 0,
  246. patient: ''
  247. },
  248. Tue_N: {
  249. schedule_id: 0,
  250. mode_id: 0,
  251. mode_name: '',
  252. patient_id: 0,
  253. patient: ''
  254. },
  255. Wed_M: {
  256. schedule_id: 0,
  257. mode_id: 0,
  258. mode_name: '',
  259. patient_id: 0,
  260. patient: ''
  261. },
  262. Wed_A: {
  263. schedule_id: 0,
  264. mode_id: 0,
  265. mode_name: '',
  266. patient_id: 0,
  267. patient: ''
  268. },
  269. Wed_N: {
  270. schedule_id: 0,
  271. mode_id: 0,
  272. mode_name: '',
  273. patient_id: 0,
  274. patient: ''
  275. },
  276. Thurs_M: {
  277. schedule_id: 0,
  278. mode_id: 0,
  279. mode_name: '',
  280. patient_id: 0,
  281. patient: ''
  282. },
  283. Thurs_A: {
  284. schedule_id: 0,
  285. mode_id: 0,
  286. mode_name: '',
  287. patient_id: 0,
  288. patient: ''
  289. },
  290. Thurs_N: {
  291. schedule_id: 0,
  292. mode_id: 0,
  293. mode_name: '',
  294. patient_id: 0,
  295. patient: ''
  296. },
  297. Fri_M: {
  298. schedule_id: 0,
  299. mode_id: 0,
  300. mode_name: '',
  301. patient_id: 0,
  302. patient: ''
  303. },
  304. Fri_A: {
  305. schedule_id: 0,
  306. mode_id: 0,
  307. mode_name: '',
  308. patient_id: 0,
  309. patient: ''
  310. },
  311. Fri_N: {
  312. schedule_id: 0,
  313. mode_id: 0,
  314. mode_name: '',
  315. patient_id: 0,
  316. patient: ''
  317. },
  318. Sat_M: {
  319. schedule_id: 0,
  320. mode_id: 0,
  321. mode_name: '',
  322. patient_id: 0,
  323. patient: ''
  324. },
  325. Sat_A: {
  326. schedule_id: 0,
  327. mode_id: 0,
  328. mode_name: '',
  329. patient_id: 0,
  330. patient: ''
  331. },
  332. Sat_N: {
  333. schedule_id: 0,
  334. mode_id: 0,
  335. mode_name: '',
  336. patient_id: 0,
  337. patient: ''
  338. },
  339. Sun_A: {
  340. schedule_id: 0,
  341. mode_id: 0,
  342. mode_name: '',
  343. patient_id: 0,
  344. patient: ''
  345. },
  346. Sun_N: {
  347. schedule_id: 0,
  348. mode_id: 0,
  349. mode_name: '',
  350. patient_id: 0,
  351. patient: ''
  352. },
  353. Sun_M: {
  354. schedule_id: 0,
  355. mode_id: 0,
  356. mode_name: '',
  357. patient_id: 0,
  358. patient: ''
  359. },
  360. total: 0
  361. }
  362. that.scheduleZone.push(thisPa)
  363. })
  364. })
  365. }
  366. })
  367. },
  368. setScheduleTemplateAction: function() {
  369. this.$router.push({ path: '/workforce/template' })
  370. }, export_file: function() {
  371. this.downloadLoading = true
  372. import('@/vendor/Export2Excel').then(excel => {
  373. const filterVal = [
  374. '区号',
  375. '机号'
  376. ]
  377. const multiHeader = [['区号', '机号', '周一', '', '', '周二', '', '', '周三', '', '', '周四', '', '', '周五', '', '', '周六', '', '', '周日', '', '', '周一', '', '', '周二', '', '', '周三', '', '', '周四', '', '', '周五', '', '', '周六', '', '', '周日', '', '', '周一', '', '', '周二', '', '', '周三', '', '', '周四', '', '', '周五', '', '', '周六', '', '', '周日', '', '']]
  378. const header = ['', '', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上', '上午', '下午', '晚上']
  379. // const merges = ['A1:A2', 'B1:B2']
  380. const merges = ['A1:A2', 'B1:B2', 'C1:E1', 'F1:H1', 'I1:K1', 'L1:N1', 'O1:Q1', 'R1:T1', 'U1:W1', 'X1:Z1', 'AA1:AC1', 'AD1:AF1', 'AG1:AI1', 'AJ1:AL1', 'AM1:AO1', 'AP1:AR1', 'AS1:AU1', 'AV1:AX1', 'AY1:BA1', 'BB1:BD1', 'BE1:BG1', 'BH1:BJ1', 'BK1:BM1']
  381. var list = []
  382. let i = 0
  383. for (let key in this.partitions) {
  384. var tempValue
  385. var jihaos = this.partitions[key].jihaos
  386. if (i == 0) {
  387. let m = 'A3' + ':' + 'A' + (2 + jihaos.length)
  388. tempValue = (2 + jihaos.length)
  389. merges.push(m)
  390. } else {
  391. let m = 'A' + (tempValue + 1) + ':' + 'A' + ((tempValue + 1) + jihaos.length - 1)
  392. tempValue = ((tempValue + 1) + jihaos.length - 1)
  393. merges.push(m)
  394. }
  395. for (let b = 0; b < jihaos.length; b++) {
  396. let obj = {}
  397. obj['区号'] = this.partitions[key].name
  398. obj['机号'] = jihaos[b].number
  399. list.push(obj)
  400. }
  401. i++
  402. }
  403. console.log(list)
  404. const data = this.formatJson(filterVal, list)
  405. const filename = "排班模版"
  406. excel.export_json_to_excel({
  407. multiHeader,
  408. header,
  409. merges,
  410. data,
  411. filename,
  412. })
  413. this.downloadLoading = false
  414. })
  415. }, formatJson(filterVal, jsonData) {
  416. return jsonData.map(v =>
  417. filterVal.map(j => {
  418. console.log(v)
  419. console.log(j)
  420. console.log(v[j])
  421. if (j === 'timestamp') {
  422. return parseTime(v[j])
  423. } else {
  424. return v[j]
  425. }
  426. })
  427. )
  428. },
  429. printScheduleAction: function() {
  430. var date = new Date().getTime()
  431. if (this.activeName == 'lastWeek') {
  432. date = date - 7 * 24 * 60 * 60 * 1000
  433. } else if (this.activeName == 'nextWeek') {
  434. date = date + 7 * 24 * 60 * 60 * 1000
  435. } else if (this.activeName == 'nextTwoWeek') {
  436. date = date + 14 * 24 * 60 * 60 * 1000
  437. }
  438. this.$router.push({
  439. path: '/workforce/schedule/print',
  440. query: { date: date }
  441. })
  442. }, isShow() {
  443. let isShow = false
  444. if (Object.keys(this.partitions).length != 0) {
  445. isShow = true
  446. let i = 0
  447. for (let key in this.partitions) {
  448. if (i == 0) {
  449. if (this.partitions[key].jihaos.length > 0) {
  450. isShow = true
  451. }
  452. }
  453. i++
  454. }
  455. }
  456. return isShow
  457. }, handleSuccess({ results, header }) {
  458. if(results.length > 0) {
  459. let headers = []
  460. for (let key in results[0]) {
  461. headers.push(key)
  462. }
  463. var isHas_1 = headers.includes('区号')
  464. console.log(isHas_1)
  465. var isHas_2 = headers.includes('机号')
  466. console.log(isHas_2)
  467. var isHas_3 = headers.includes('周一')
  468. console.log(isHas_3)
  469. var isHas_4 = headers.includes('')
  470. console.log(isHas_4)
  471. var isHas_5 = headers.includes('_1')
  472. console.log(isHas_5)
  473. var isHas_6 = headers.includes('周二')
  474. console.log(isHas_6)
  475. var isHas_7 = headers.includes('_2')
  476. console.log(isHas_7)
  477. var isHas_8 = headers.includes('_3')
  478. console.log(isHas_8)
  479. var isHas_9 = headers.includes('周三')
  480. console.log(isHas_9)
  481. var isHas_10 = headers.includes('_4')
  482. console.log(isHas_1)
  483. var isHas_11 = headers.includes('_5')
  484. console.log(isHas_1)
  485. var isHas_12 = headers.includes('周四')
  486. console.log(isHas_1)
  487. var isHas_13 = headers.includes('_6')
  488. console.log(isHas_1)
  489. var isHas_14 = headers.includes('_7')
  490. console.log(isHas_1)
  491. var isHas_15 = headers.includes('周五')
  492. console.log(isHas_1)
  493. var isHas_16 = headers.includes('_8')
  494. console.log(isHas_1)
  495. var isHas_17 = headers.includes('_9')
  496. console.log(isHas_1)
  497. var isHas_18 = headers.includes('周六')
  498. console.log(isHas_1)
  499. var isHas_19 = headers.includes('_10')
  500. console.log(isHas_1)
  501. var isHas_20 = headers.includes('_11')
  502. console.log(isHas_1)
  503. var isHas_21 = headers.includes('周日')
  504. console.log(isHas_1)
  505. var isHas_22 = headers.includes('_12')
  506. console.log(isHas_1)
  507. var isHas_23 = headers.includes('_13')
  508. console.log(isHas_1)
  509. var isHas_24 = headers.includes('周一_1')
  510. var isHas_25 = headers.includes('_14')
  511. var isHas_26 = headers.includes('_15')
  512. var isHas_27 = headers.includes('周二_1')
  513. var isHas_28 = headers.includes('_16')
  514. var isHas_29 = headers.includes('_17')
  515. var isHas_30 = headers.includes('周三_1')
  516. var isHas_31 = headers.includes('_18')
  517. var isHas_32 = headers.includes('_19')
  518. var isHas_33 = headers.includes('周四_1')
  519. var isHas_34 = headers.includes('_20')
  520. var isHas_35 = headers.includes('_21')
  521. var isHas_36 = headers.includes('周五_1')
  522. var isHas_37 = headers.includes('_22')
  523. var isHas_38 = headers.includes('_23')
  524. var isHas_39 = headers.includes('周六_1')
  525. var isHas_40 = headers.includes('_24')
  526. var isHas_41 = headers.includes('_25')
  527. var isHas_42 = headers.includes('周日_1')
  528. var isHas_43 = headers.includes('_26')
  529. var isHas_44 = headers.includes('_27')
  530. var isHas_45 = headers.includes('周一_2')
  531. var isHas_46 = headers.includes('_28')
  532. var isHas_47 = headers.includes('_29')
  533. var isHas_48 = headers.includes('周二_2')
  534. var isHas_49 = headers.includes('_30')
  535. var isHas_50 = headers.includes('_31')
  536. var isHas_51 = headers.includes('周三_2')
  537. var isHas_52 = headers.includes('_32')
  538. var isHas_53 = headers.includes('_33')
  539. var isHas_54 = headers.includes('周四_2')
  540. var isHas_55 = headers.includes('_34')
  541. var isHas_56 = headers.includes('_35')
  542. var isHas_57 = headers.includes('周五_2')
  543. var isHas_58 = headers.includes('_36')
  544. var isHas_59 = headers.includes('_37')
  545. var isHas_60 = headers.includes('周六_2')
  546. var isHas_61 = headers.includes('_38')
  547. var isHas_62 = headers.includes('_39')
  548. var isHas_63 = headers.includes('周日_2')
  549. var isHas_64 = headers.includes('_40')
  550. var isHas_65 = headers.includes('_41')
  551. if (!(isHas_1 && isHas_2 && isHas_3 && isHas_4 && isHas_5 &&
  552. isHas_6 && isHas_7 && isHas_8 && isHas_9 && isHas_10 &&
  553. isHas_11 && isHas_12 && isHas_13 && isHas_14 && isHas_15 &&
  554. isHas_16 && isHas_17 && isHas_18 && isHas_19 && isHas_20 &&
  555. isHas_21 && isHas_22 && isHas_23 && isHas_24 && isHas_25 &&
  556. isHas_26 && isHas_27 && isHas_28 && isHas_29 && isHas_30 &&
  557. isHas_31 && isHas_32 && isHas_33 && isHas_34 && isHas_35 &&
  558. isHas_36 && isHas_37 && isHas_38 && isHas_39 && isHas_40 &&
  559. isHas_41 && isHas_42 && isHas_43 && isHas_44 && isHas_45 &&
  560. isHas_46 && isHas_47 && isHas_48 && isHas_49 && isHas_50 &&
  561. isHas_51 && isHas_52 && isHas_53 && isHas_54 && isHas_55 &&
  562. isHas_56 && isHas_57 && isHas_58 && isHas_59 && isHas_60 &&
  563. isHas_61 && isHas_62 && isHas_63 && isHas_64 && isHas_65)) {
  564. this.dialogVisible = true
  565. return
  566. }
  567. }else{
  568. this.dialogVisible = true
  569. return
  570. }
  571. let is_system_zone = true
  572. let is_device_number = true
  573. let zones = []
  574. let deviceNumber = []
  575. for (let i = 0; i < results.length; i++) {
  576. if (results[i + 1] && results[i + 1]['区号'] != undefined) {
  577. zones.push(results[i + 1]['区号'])
  578. }
  579. if (results[i + 1] && results[i + 1]['机号'] != undefined) {
  580. deviceNumber.push(results[i + 1]['机号'])
  581. }
  582. }
  583. const obj = {}
  584. zones = zones.reduce((cur, next) => {
  585. obj[next] ? '' : obj[next] = true && cur.push(next)
  586. return cur
  587. }, []) // 设置cur默认类型为数组,并且初始值为空的数组
  588. const obj2 = {}
  589. deviceNumber = deviceNumber.reduce((cur, next) => {
  590. obj2[next] ? '' : obj2[next] = true && cur.push(next)
  591. return cur
  592. }, []) // 设置cur默认类型为数组,并且初始值为空的数组
  593. var total_zones = []
  594. var total_device_number = []
  595. for (let key in this.partitions) {
  596. total_zones.push(this.partitions[key].name)
  597. }
  598. for (let key in this.partitions) {
  599. var jihaos = this.partitions[key].jihaos
  600. for (let i = 0; i < jihaos.length; i++) {
  601. total_device_number.push(jihaos[i].number)
  602. }
  603. }
  604. for (let i = 0; i < zones.length; i++) {
  605. if (!total_zones.includes(zones[i])) {
  606. is_system_zone = false
  607. }
  608. }
  609. for (let i = 0; i < deviceNumber.length; i++) {
  610. if (!total_device_number.includes(deviceNumber[i])) {
  611. is_device_number = false
  612. }
  613. }
  614. //
  615. let tempObj = null
  616. if (results.length > 0) {
  617. tempObj = results[0]
  618. }
  619. let datas = []
  620. for (let i = 0; i < results.length; i++) {
  621. for (let key in results[i + 1]) {
  622. let tempObjTwo = { partition_name: '', device_number_name: '' }
  623. if (key != '区号' && key != '机号') {
  624. let obj = {}
  625. obj['name'] = results[i + 1][key].trim()
  626. if (tempObj[key] == '上午') {
  627. obj['schedule_type'] = 1
  628. } else if (tempObj[key] == '下午') {
  629. obj['schedule_type'] = 2
  630. } else if (tempObj[key] == '晚上') {
  631. obj['schedule_type'] = 3
  632. } else {
  633. obj['schedule_type'] = 0
  634. }
  635. obj['schedule_week'] = this.getWeekByResultsStr(key)
  636. obj['schedule_date'] = this.getDateByResultsStr(key)
  637. obj['row'] = this.getRow(key)
  638. tempObjTwo = obj
  639. }
  640. tempObjTwo['partition_name'] = results[i + 1]['区号']
  641. tempObjTwo['device_number_name'] = results[i + 1]['机号']
  642. tempObjTwo['index'] = i + 3
  643. if (tempObjTwo['schedule_week'] != undefined && tempObjTwo['name'] != undefined && tempObjTwo['schedule_type'] != undefined && tempObjTwo['schedule_date'] != undefined) {
  644. var current_date = new Date()
  645. var m_year = current_date.getFullYear()
  646. var m_month = current_date.getMonth() + 1
  647. m_month = m_month < 10 ? '0' + m_month.toString() : m_month.toString()
  648. var m_date = current_date.getDate() < 10 ? '0' + current_date.getDate().toString() : current_date.getDate().toString()
  649. var current_date_two = new Date(m_year + '-' + m_month + '-' + m_date)
  650. if(new Date(tempObjTwo['schedule_date']).getTime() >= new Date(current_date_two).getTime()) {
  651. datas.push(tempObjTwo)
  652. }
  653. }
  654. }
  655. }
  656. let date_arr = []
  657. //校验文档是否规范
  658. for (let i = 0; i < datas.length; i++) {
  659. if (datas[i].schedule_date !== '0') {
  660. date_arr.push(datas[i].schedule_date)
  661. }
  662. if (datas[i].device_number_name == undefined) {
  663. is_device_number = false
  664. }
  665. if (datas[i].partition_name == undefined) {
  666. is_system_zone = false
  667. }
  668. if (datas[i].schedule_date === '0') {
  669. is_system_zone = false
  670. }
  671. if (datas[i].schedule_week === '0') {
  672. is_system_zone = false
  673. }
  674. if (datas[i].schedule_type === 0) {
  675. is_system_zone = false
  676. }
  677. }
  678. //校验文档中同一天同个人是否存在多个排班
  679. let is_exist_repeat = false
  680. const obj3 = {}
  681. date_arr = date_arr.reduce((cur, next) => {
  682. obj3[next] ? '' : obj3[next] = true && cur.push(next)
  683. return cur
  684. }, []) // 设置cur默认类型为数组,并且初始值为空的数组
  685. let tempObjArr = []
  686. for (let i = 0; i < date_arr.length; i++) {
  687. let obj = {}
  688. let key = date_arr[i]
  689. let value = []
  690. for (let b = 0; b < datas.length; b++) {
  691. if (key == datas[b].schedule_date) {
  692. value.push(datas[b].name)
  693. }
  694. }
  695. obj[key] = value
  696. tempObjArr.push(obj)
  697. }
  698. for (let i = 0; i < tempObjArr.length; i++) {
  699. for (let key in tempObjArr[i]) {
  700. let arr = tempObjArr[i][key]
  701. const obj = {}
  702. arr = arr.reduce((cur, next) => {
  703. obj[next] ? '' : obj[next] = true && cur.push(next)
  704. return cur
  705. }, []) // 设置cur默认类型为数组,并且初始值为空的数组
  706. if (tempObjArr[i][key].length > arr.length) { //比对原数组和去重后的原数组总数,不同的话则存在重复元素
  707. is_exist_repeat = true
  708. }
  709. }
  710. }
  711. if (header.length > 65 || !is_system_zone || !is_device_number) {
  712. this.dialogVisible = true
  713. return
  714. } else {
  715. if (is_exist_repeat) {
  716. this.isExistRepeatVisible = true
  717. return
  718. } else {
  719. let params = {
  720. schedule: datas
  721. }
  722. //今天的时间
  723. var day2 = new Date()
  724. day2.setTime(day2.getTime())
  725. var month = day2.getMonth() + 1 < 10 ? '0' + (day2.getMonth() + 1).toString() : (day2.getMonth() + 1).toString()
  726. var day = day2.getDate() < 10 ? '0' + (day2.getDate()).toString() : (day2.getMonth() + 1).toString()
  727. var date = day2.getFullYear() + '-' + month + '-' + day
  728. exportSchedule(params,date).then(response => {
  729. if (response.data.state == 0) {
  730. return false
  731. }
  732. this.getWeekPanels()
  733. })
  734. }
  735. }
  736. },
  737. getInitDate(){
  738. initDate().then(response => {
  739. if (response.data.state == 0) {
  740. return false
  741. }
  742. this.days = response.data.data.days
  743. })
  744. },
  745. getWeekByResultsStr(key) {
  746. switch (key) {
  747. case '周一':
  748. return '1'
  749. break
  750. case '周一_1':
  751. return '1'
  752. break
  753. case '周一_2':
  754. return '1'
  755. break
  756. case '':
  757. return '1'
  758. break
  759. case '_1':
  760. return '1'
  761. break
  762. case '_14':
  763. return '1'
  764. break
  765. case '_15':
  766. return '1'
  767. break
  768. case '_28':
  769. return '1'
  770. break
  771. case '_29':
  772. return '1'
  773. break
  774. case '周二' :
  775. return '2'
  776. break
  777. case '周二_1':
  778. return '2'
  779. break
  780. case '周二_2' :
  781. return '2'
  782. break
  783. case '_2':
  784. return '2'
  785. break
  786. case '_3':
  787. return '2'
  788. break
  789. case '_16' :
  790. return '2'
  791. break
  792. case '_17' :
  793. return '2'
  794. break
  795. case '_30':
  796. return '2'
  797. break
  798. case '_31':
  799. return '2'
  800. break
  801. case '周三':
  802. return '3'
  803. break
  804. case '周三_1':
  805. return '3'
  806. break
  807. case '周三_2':
  808. return '3'
  809. break
  810. case '_4' :
  811. return '3'
  812. break
  813. case '_5' :
  814. return '3'
  815. break
  816. case '_18' :
  817. return '3'
  818. break
  819. case '_19' :
  820. return '3'
  821. break
  822. case '_32' :
  823. return '3'
  824. break
  825. case '_33' :
  826. return '3'
  827. break
  828. case '周四':
  829. return '4'
  830. break
  831. case '周四_1' :
  832. return '4'
  833. break
  834. case'周四_2' :
  835. return '4'
  836. break
  837. case '_6' :
  838. return '4'
  839. break
  840. case '_7':
  841. return '4'
  842. break
  843. case '_20':
  844. return '4'
  845. break
  846. case '_21':
  847. return '4'
  848. break
  849. case '_34':
  850. return '4'
  851. break
  852. case '_35':
  853. return '4'
  854. break
  855. case '周五' :
  856. return '5'
  857. break
  858. case '周五_1':
  859. return '5'
  860. break
  861. case '周五_2' :
  862. return '5'
  863. break
  864. case '_8':
  865. return '5'
  866. break
  867. case '_9' :
  868. return '5'
  869. break
  870. case '_22' :
  871. return '5'
  872. break
  873. case '_23':
  874. return '5'
  875. break
  876. case '_36':
  877. return '5'
  878. break
  879. case '_37':
  880. return '5'
  881. break
  882. case '周六':
  883. return '6'
  884. break
  885. case '周六_1':
  886. return '6'
  887. break
  888. case '周六_2' :
  889. return '6'
  890. break
  891. case '_10' :
  892. return '6'
  893. break
  894. case '_11':
  895. return '6'
  896. break
  897. case '_24' :
  898. return '6'
  899. break
  900. case '_25' :
  901. return '6'
  902. break
  903. case '_38' :
  904. return '6'
  905. break
  906. case '_39':
  907. return '6'
  908. break
  909. case '周日':
  910. return '7'
  911. break
  912. case '周日_1' :
  913. return '7'
  914. break
  915. case '周日_2' :
  916. return '7'
  917. break
  918. case '_12' :
  919. return '7'
  920. break
  921. case '_13' :
  922. return '7'
  923. break
  924. case '_26':
  925. return '7'
  926. break
  927. case '_27':
  928. return '7'
  929. break
  930. case '_40' :
  931. return '7'
  932. break
  933. case '_41':
  934. return '7'
  935. break
  936. default:
  937. return '0'
  938. break
  939. }
  940. }, getRow(key) {
  941. switch (key) {
  942. case '周一' : //本周一
  943. return 'C'
  944. break
  945. case '': //本周一
  946. return 'D'
  947. break
  948. case '_1': //本周一
  949. return 'E'
  950. break
  951. case '周一_1': //下周一
  952. return 'X'
  953. break
  954. case '_14': //下周一
  955. return 'Y'
  956. break
  957. case '_15': //下周一
  958. return 'Z'
  959. break
  960. case '周一_2' : //下下周一
  961. return 'AS'
  962. break
  963. case '_28': //下下周一
  964. return 'AT'
  965. break
  966. case '_29': //下下周一
  967. return 'AU'
  968. break
  969. case '周二' : //本周二
  970. return 'F'
  971. break
  972. case '_2': //本周二
  973. return 'G'
  974. break
  975. case '_3': //本周二
  976. return 'H'
  977. break
  978. case '周二_1'://下周二
  979. return 'AA'
  980. break
  981. case '_16' ://下周二
  982. return 'AB'
  983. break
  984. case '_17'://下周二
  985. return 'AC'
  986. break
  987. case '周二_2' ://下下周二
  988. return 'AV'
  989. break
  990. case '_30' ://下下周二
  991. return 'AW'
  992. break
  993. case '_31'://下下周二
  994. return 'AX'
  995. break
  996. case '周三' : //本周三
  997. return 'I'
  998. break
  999. case '_4': //本周三
  1000. return 'J'
  1001. break
  1002. case '_5': //本周三
  1003. return 'K'
  1004. break
  1005. case '周三_1': //下周三
  1006. return 'AD'
  1007. break
  1008. case '_18' : //下周三
  1009. return 'AE'
  1010. break
  1011. case '_19': //下周三
  1012. return 'AF'
  1013. break
  1014. case '周三_2' : //下下周三
  1015. return 'AY'
  1016. break
  1017. case '_32' : //下下周三
  1018. return 'AZ'
  1019. break
  1020. case '_33': //下下周三
  1021. return 'BA'
  1022. break
  1023. case '周四':
  1024. return 'L'
  1025. break
  1026. case '_6' :
  1027. return 'M'
  1028. break
  1029. case '_7':
  1030. return 'N'
  1031. break
  1032. case '周四_1':
  1033. return 'AG'
  1034. break
  1035. case '_20' :
  1036. return 'AH'
  1037. break
  1038. case '_21':
  1039. return 'AI'
  1040. break
  1041. case '周四_2' :
  1042. return 'BB'
  1043. break
  1044. case '_34':
  1045. return 'BC'
  1046. break
  1047. case '_35':
  1048. return 'BD'
  1049. break
  1050. case '周五':
  1051. return 'O'
  1052. break
  1053. case '_8':
  1054. return 'P'
  1055. break
  1056. case '_9':
  1057. return 'Q'
  1058. break
  1059. case '周五_1' :
  1060. return 'AJ'
  1061. break
  1062. case '_22' :
  1063. return 'AK'
  1064. break
  1065. case '_23':
  1066. return 'AL'
  1067. break
  1068. case '周五_2' :
  1069. return 'BE'
  1070. break
  1071. case '_36':
  1072. return 'BF'
  1073. break
  1074. case '_37':
  1075. return 'BG'
  1076. break
  1077. case '周六' :
  1078. return 'R'
  1079. break
  1080. case '_10' :
  1081. return 'S'
  1082. break
  1083. case '_11':
  1084. return 'T'
  1085. break
  1086. case '周六_1' :
  1087. return 'AM'
  1088. break
  1089. case '_24' :
  1090. return 'AN'
  1091. break
  1092. case '_25':
  1093. return 'AO'
  1094. break
  1095. case '周六_2' :
  1096. return 'BH'
  1097. break
  1098. case '_38' :
  1099. return 'BI'
  1100. break
  1101. case '_39':
  1102. return 'BJ'
  1103. break
  1104. case '周日' :
  1105. return 'U'
  1106. break
  1107. case '_12' :
  1108. return 'V'
  1109. break
  1110. case '_13':
  1111. return 'W'
  1112. break
  1113. case '周日_1' :
  1114. return 'AP'
  1115. break
  1116. case '_26' :
  1117. return 'AQ'
  1118. break
  1119. case '_27':
  1120. return 'AR'
  1121. break
  1122. case '周日_2':
  1123. return 'BK'
  1124. break
  1125. case '_40':
  1126. return 'BL'
  1127. break
  1128. case '_41':
  1129. return 'BM'
  1130. break
  1131. }
  1132. }, getDateByResultsStr(key) {
  1133. switch (key) {
  1134. case '周一' : //本周一
  1135. return this.days[0]
  1136. break
  1137. case '': //本周一
  1138. return this.days[0]
  1139. break
  1140. case '_1': //本周一
  1141. return this.days[0]
  1142. break
  1143. case '周一_1': //下周一
  1144. return this.days[7]
  1145. break
  1146. case '_14': //下周一
  1147. return this.days[7]
  1148. break
  1149. case '_15': //下周一
  1150. return this.days[7]
  1151. break
  1152. case '周一_2' : //下下周一
  1153. return this.days[14]
  1154. break
  1155. case '_28': //下下周一
  1156. return this.days[14]
  1157. break
  1158. case '_29': //下下周一
  1159. return this.days[14]
  1160. break
  1161. case '周二' : //本周二
  1162. return this.days[1]
  1163. break
  1164. case '_2': //本周二
  1165. return this.days[1]
  1166. break
  1167. case '_3': //本周二
  1168. return this.days[1]
  1169. break
  1170. case '周二_1'://下周二
  1171. return this.days[8]
  1172. break
  1173. case '_16' ://下周二
  1174. return this.days[8]
  1175. break
  1176. case '_17'://下周二
  1177. return this.days[8]
  1178. break
  1179. case '周二_2' ://下下周二
  1180. return this.days[15]
  1181. break
  1182. case '_30' ://下下周二
  1183. return this.days[15]
  1184. break
  1185. case '_31'://下下周二
  1186. return this.days[15]
  1187. break
  1188. case '周三' : //本周三
  1189. return this.days[2]
  1190. break
  1191. case '_4': //本周三
  1192. return this.days[2]
  1193. break
  1194. case '_5': //本周三
  1195. return this.days[2]
  1196. break
  1197. case '周三_1': //下周三
  1198. return this.days[9]
  1199. break
  1200. case '_18' : //下周三
  1201. return this.days[9]
  1202. break
  1203. case '_19': //下周三
  1204. return this.days[9]
  1205. break
  1206. case '周三_2' : //下下周三
  1207. return this.days[16]
  1208. break
  1209. case '_32' : //下下周三
  1210. return this.days[16]
  1211. break
  1212. case '_33': //下下周三
  1213. return this.days[16]
  1214. break
  1215. case '周四':
  1216. return this.days[3]
  1217. break
  1218. case '_6' :
  1219. return this.days[4]
  1220. break
  1221. case '_7':
  1222. return this.days[4]
  1223. break
  1224. case '周四_1':
  1225. return this.days[10]
  1226. break
  1227. case '_20' :
  1228. return this.days[10]
  1229. break
  1230. case '_21':
  1231. return this.days[10]
  1232. break
  1233. case '周四_2' :
  1234. return this.days[17]
  1235. break
  1236. case '_34':
  1237. return this.days[17]
  1238. break
  1239. case '_35':
  1240. return this.days[17]
  1241. break
  1242. case '周五':
  1243. return this.days[4]
  1244. break
  1245. case '_8':
  1246. return this.days[4]
  1247. break
  1248. case '_9':
  1249. return this.days[4]
  1250. break
  1251. case '周五_1' :
  1252. return this.days[11]
  1253. break
  1254. case '_22' :
  1255. return this.days[11]
  1256. break
  1257. case '_23':
  1258. return this.days[11]
  1259. break
  1260. case '周五_2' :
  1261. return this.days[18]
  1262. break
  1263. case '_36':
  1264. return this.days[18]
  1265. break
  1266. case '_37':
  1267. return this.days[18]
  1268. break
  1269. case '周六' :
  1270. return this.days[5]
  1271. break
  1272. case '_10' :
  1273. return this.days[5]
  1274. break
  1275. case '_11':
  1276. return this.days[5]
  1277. break
  1278. case '周六_1' :
  1279. return this.days[12]
  1280. break
  1281. case '_24' :
  1282. return this.days[12]
  1283. break
  1284. case '_25':
  1285. return this.days[12]
  1286. break
  1287. case '周六_2' :
  1288. return this.days[19]
  1289. break
  1290. case '_38' :
  1291. return this.days[19]
  1292. break
  1293. case '_39':
  1294. return this.days[19]
  1295. break
  1296. case '周日' :
  1297. return this.days[6]
  1298. break
  1299. case '_12' :
  1300. return this.days[6]
  1301. break
  1302. case '_13':
  1303. return this.days[6]
  1304. break
  1305. case '周日_1' :
  1306. return this.days[13]
  1307. break
  1308. case '_26' :
  1309. return this.days[13]
  1310. break
  1311. case '_27':
  1312. return this.days[13]
  1313. break
  1314. case '周日_2':
  1315. return this.days[20]
  1316. break
  1317. case '_40':
  1318. return this.days[20]
  1319. break
  1320. case '_41':
  1321. return this.days[20]
  1322. break
  1323. default:
  1324. return '0'
  1325. break
  1326. }
  1327. }
  1328. },
  1329. created() {
  1330. this.getWeekPanels()
  1331. this.getInitDate()
  1332. }
  1333. }
  1334. </script>
  1335. <style rel="stylesheet/css" lang="scss">
  1336. .schedule-table-cell-disable {
  1337. background-color: #F5F5F5 !important;
  1338. }
  1339. </style>