time-table.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <div id="index" style="padding-left:0rem">
  3. <el-row type="flex" align="middle" justify="end" class="btn_bar">
  4. <el-col :span="4" class="printingBtn">
  5. <el-button type="primary" size="mini" @click="toPrint()">打印课程表</el-button>
  6. </el-col>
  7. </el-row>
  8. <el-row class="rowLesson" type="flex" justify="center" ref="print">
  9. <el-col :span="21" class="timeTable">
  10. <el-col :span="24" class="top">
  11. <el-col :span="24" class="title"> 2020年第({{ data.term }})期高校大学生就业能力拓展训练课程表({{ getClassName(data.name) }}) </el-col>
  12. <el-col :span="24" class="date"> ({{ th[0] }}—{{ th[th.length - 1] }}) </el-col>
  13. </el-col>
  14. <el-col :span="24" class="info">
  15. <table border="1" class="table">
  16. <tr>
  17. <th colspan="2" class="th">
  18. <p style="text-align:right;padding:0 10px;color:#000;">星期</p>
  19. <p style="text-align:center;padding:0 10px;color:#000;">课程</p>
  20. <p style="text-align:left;padding:0 10px;color:#000;">时间</p>
  21. </th>
  22. <th class="ths" v-for="(date, index) in th" :key="index">
  23. <p>{{ date | getWeekDay }}</p>
  24. <p>({{ date | getDay }})</p>
  25. </th>
  26. <th class="ths beizhu">备注</th>
  27. </tr>
  28. <!-- 第一行需要合并2行单元格显示上午 -->
  29. <!-- 第三行需要合并3行单元格显示下午 -->
  30. <!-- rowspan="5" 班主任,礼仪课教师等其他信息 -->
  31. <tr v-for="(time, ti) in tr" :key="ti">
  32. <td rowspan="2" v-if="ti == 0">上午</td>
  33. <td :rowspan="length" v-if="ti == 2">下午</td>
  34. <td>{{ getTime(ti) }}</td>
  35. <td v-for="(date, di) in th" :key="di" v-html="getLesson(date, getTime(ti))"></td>
  36. <td rowspan="6" v-if="ti == 0">
  37. <div class="classInfo">
  38. <p>上课地点</p>
  39. <p>{{ data.jslocation || '' }}</p>
  40. </div>
  41. <div class="classInfo">
  42. <p>开班地点</p>
  43. <p>{{ data.kbyslocation || '' }}</p>
  44. </div>
  45. <div class="classInfo">
  46. <p>用餐地点</p>
  47. <p>{{ data.yclocation || '' }}</p>
  48. </div>
  49. <div class="classInfo">
  50. <p>扩展训练地点</p>
  51. <p>{{ data.kzjhlocation || '' }}</p>
  52. </div>
  53. <div class="classInfo">
  54. <p>班主任</p>
  55. <p>{{ data.headteacher || '' }}</p>
  56. </div>
  57. <div class="classInfo">
  58. <p>礼仪课</p>
  59. <p>{{ data.lyteacher || '暂无' }}</p>
  60. </div>
  61. <div class="classInfo">
  62. <p>督导值班</p>
  63. <p>{{ data.reteacher || '' }}</p>
  64. </div>
  65. </td>
  66. </tr>
  67. <tr>
  68. <td colspan="2">教师签字</td>
  69. <td v-for="(date, di) in th" :key="di"></td>
  70. </tr>
  71. </table>
  72. </el-col>
  73. </el-col>
  74. </el-row>
  75. </div>
  76. </template>
  77. <script>
  78. import _ from 'lodash';
  79. const moment = require('moment');
  80. moment.locale('zh-cn');
  81. import { mapState, createNamespacedHelpers } from 'vuex';
  82. export default {
  83. name: 'index',
  84. props: {
  85. th: { type: Array, default: () => [] },
  86. tr: { type: Array, default: () => [] },
  87. lessons: { type: Array, default: () => [] },
  88. data: null,
  89. },
  90. components: {},
  91. data: () => ({
  92. length: 0,
  93. }),
  94. async created() {
  95. console.log('in function:');
  96. },
  97. computed: {
  98. timeList() {
  99. const today = moment().format('YYYY-MM-DD');
  100. let mid = _.orderBy(
  101. _.uniqBy(
  102. this.lessons.map(i => {
  103. let m = i.time;
  104. m = m.split('-');
  105. const obj = { time: i.time, start: moment(`${today} ${m[0]}`).format('YYYY-MM-DD HH:mm') };
  106. return obj;
  107. }),
  108. 'start'
  109. ),
  110. ['start'],
  111. ['asc']
  112. ).map(i => i.time);
  113. return mid;
  114. },
  115. ...mapState(['user']),
  116. },
  117. methods: {
  118. getLesson(date, time) {
  119. this.$set(this, `length`, this.tr.length - 2);
  120. let r = this.lessons.find(f => f.date == date && f.time == time);
  121. if (!r) return '--';
  122. else {
  123. let { subname, teaname = '', reason, time } = r;
  124. if (time == this.timeList[0]) {
  125. let text = `${subname || ''}<br/><span style="color:red">${teaname || ''}</span>`;
  126. if (this.user.type == '0') text += `<br/><span>${reason || ''}</span>`;
  127. return text;
  128. } else {
  129. let text = `${subname || ''}<br/><span style="color:red">${teaname || ''}</span>`;
  130. // if (reason && teaname !== '') text = `${text}<br/><span style="color:red">${reason}</span>`;
  131. return text;
  132. }
  133. }
  134. },
  135. toPrint() {
  136. this.$print(this.$refs.print);
  137. },
  138. getClassName(data) {
  139. if (data) {
  140. if (_.isString(data) && data.includes('班')) return data;
  141. else return `${data}班`;
  142. }
  143. },
  144. getTime(index) {
  145. return this.timeList[index];
  146. },
  147. },
  148. filters: {
  149. getWeekDay(date) {
  150. return moment(date).format('dddd');
  151. },
  152. getDay(date) {
  153. return moment(date).format('MM月DD日');
  154. },
  155. },
  156. };
  157. </script>
  158. <style lang="less" scoped>
  159. @import '~@frame/style/timeTable.less';
  160. .classInfo {
  161. margin: 10px 0;
  162. p:first-child {
  163. padding: 5px 0;
  164. }
  165. p:last-child {
  166. color: #ff0000;
  167. font-size: 12px;
  168. }
  169. }
  170. </style>