detail.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <template>
  2. <div id="detail">
  3. <detail-frame :title="mainTitle" returns="/plan/index">
  4. <el-row :gutter="10" type="flex">
  5. <el-col :span="12">
  6. <el-card header="全年计划信息">
  7. <el-form :model="info" label-width="60px" size="small" @submit.native.prevent>
  8. <el-form-item label="年份">
  9. {{ info.year }}
  10. </el-form-item>
  11. <el-form-item label="标题" prop="title">
  12. {{ info.title }}
  13. </el-form-item>
  14. <el-form-item label="备注" prop="remark">
  15. <el-input v-model="info.remark" type="textarea" :autosize="{ minRows: 3, maxRows: 5 }"></el-input>
  16. </el-form-item>
  17. <el-collapse v-model="collapse" accordion>
  18. <el-collapse-item title="上报可行时间列表" name="1">
  19. <data-table :fields="fields" :data="selected" :opera="opera" @delete="toDelete" :height="heights"></data-table>
  20. </el-collapse-item>
  21. </el-collapse>
  22. <el-form-item>
  23. <el-row type="flex" align="middle" justify="space-around" style="margin-top:20px">
  24. <el-col :span="6">
  25. <el-button type="primary" @click="savePlan">上报选择时间</el-button>
  26. </el-col>
  27. </el-row>
  28. </el-form-item>
  29. </el-form>
  30. </el-card>
  31. </el-col>
  32. <el-col :span="16" :style="`width:${widths}px`">
  33. <el-card ref="card">
  34. <calendar :useDraft="false" @eventClick="eventClick" :events="events"></calendar>
  35. </el-card>
  36. </el-col>
  37. </el-row>
  38. </detail-frame>
  39. </div>
  40. </template>
  41. <script>
  42. import detailFrame from '@frame/layout/admin/detail-frame';
  43. import calendar from '@frame/components/calendar';
  44. import dataTable from '@frame/components/data-table';
  45. import _ from 'lodash';
  46. import { mapActions, mapState, createNamespacedHelpers } from 'vuex';
  47. export default {
  48. metaInfo: { title: '计划详情' },
  49. name: 'detail',
  50. props: {},
  51. components: { detailFrame, calendar, dataTable },
  52. data: () => ({
  53. info: {
  54. year: '',
  55. termnum: {
  56. batchnum: [],
  57. },
  58. },
  59. form: {},
  60. events: [],
  61. collapse: '1',
  62. fields: [
  63. { label: '期数', prop: 'term' },
  64. { label: '班级类型', prop: 'type', format: item => (item === '0' ? '正常班级' : '特殊班级') },
  65. ],
  66. opera: [
  67. {
  68. label: '删除',
  69. icon: 'el-icon-delete',
  70. method: 'delete',
  71. confirm: true,
  72. },
  73. ],
  74. heights: 250,
  75. selected: [],
  76. axiosData: {
  77. termnum: [
  78. {
  79. term: '1',
  80. batchnum: [
  81. {
  82. start: '2020-01-01',
  83. end: '2020-01-09',
  84. type: '0',
  85. number: '56',
  86. color: '#0BEB95',
  87. batch: '1',
  88. class: '1',
  89. title: '第1期第1批次',
  90. id: 'p1580869239498',
  91. },
  92. {
  93. start: '2020-01-01',
  94. end: '2020-01-09',
  95. type: '1',
  96. number: '56',
  97. color: '#409EFF',
  98. name: '第一期特殊1班',
  99. title: '第一期特殊1班',
  100. id: 'p1580869422722',
  101. },
  102. ],
  103. classnum: 2,
  104. },
  105. {
  106. term: '2',
  107. batchnum: [
  108. {
  109. start: '2020-01-01',
  110. end: '2020-01-09',
  111. type: '0',
  112. number: '56',
  113. color: '#0BEB95',
  114. batch: '1',
  115. class: '1',
  116. title: '第2期第1批次',
  117. id: 'p1580869239490',
  118. },
  119. {
  120. start: '2020-01-01',
  121. end: '2020-01-09',
  122. type: '1',
  123. number: '56',
  124. color: '#409EFF',
  125. name: '第二期特殊1班',
  126. title: '第二期特殊1班',
  127. id: 'p1580869422723',
  128. },
  129. {
  130. start: '2020-01-01',
  131. end: '2020-01-09',
  132. type: '1',
  133. number: '56',
  134. color: '#409EFF',
  135. name: '第二期特殊2班',
  136. title: '第二期特殊2班',
  137. id: 'p1580869422726',
  138. },
  139. ],
  140. classnum: 3,
  141. },
  142. {
  143. term: '3',
  144. batchnum: [
  145. {
  146. start: '2020-01-01',
  147. end: '2020-01-09',
  148. type: '0',
  149. number: '56',
  150. color: '#ff4444',
  151. batch: '1',
  152. class: '1',
  153. title: '第3期第1批次',
  154. id: 'p1580869239499',
  155. },
  156. ],
  157. classnum: 1,
  158. },
  159. ],
  160. title: 'test',
  161. year: 2020,
  162. },
  163. }),
  164. created() {
  165. if (this.isNew) this.$set(this.info, `year`, new Date().getFullYear());
  166. },
  167. mounted() {},
  168. methods: {
  169. // ...mapClass(['fetch', 'create', 'update']),
  170. //查询计划
  171. async search() {
  172. // const res = await this.fetch(this.id);
  173. // if (this.$checkRes(res)) this.$set(this, `info`, res.data);
  174. // this.loading = false;
  175. let events = [];
  176. events = _.flatten(
  177. this.axiosData.termnum.map(item => {
  178. item.batchnum.map(i => {
  179. i.term = item.term;
  180. return i;
  181. });
  182. return item.batchnum;
  183. })
  184. );
  185. let { termnum, year, title } = this.axiosData;
  186. this.$set(this, `events`, events);
  187. this.$set(this, `info`, { title, year });
  188. },
  189. //日历事件点击事件
  190. eventClick({ event }) {
  191. let arr = this.events.filter(fil => fil.id == event.id);
  192. let object = {};
  193. if (arr.length > 0) object = arr[0];
  194. else {
  195. console.warn(`无对应id事件`);
  196. return;
  197. }
  198. let { term, type, name, termid, number } = object;
  199. //查重,先查期数一致,再查类型
  200. //期数没有,则加入;期数有,则看类型,如果是普通班级,则不加入;如果是特殊班级,则查该期是否有特殊班级的id,没有就加入
  201. let data = object;
  202. let re = () => {
  203. this.$notify({
  204. title: '重复添加该期',
  205. });
  206. };
  207. let push = data => {
  208. this.selected.push(data);
  209. this.$notify({
  210. title: '已添加',
  211. });
  212. };
  213. if (_.findIndex(this.selected, i => i.term === term) >= 0) {
  214. //重复加入
  215. if (type === '0') re();
  216. else {
  217. // TODO此处需要根据实际有没有id可以区分开每期特殊班和特殊班,目前用name来区分
  218. let res = _.findIndex(this.selected, i => {
  219. if (i.name) return i.name === name;
  220. else return false;
  221. });
  222. //特殊班重复加入
  223. if (res > 0) re();
  224. else push(data); //加入
  225. }
  226. } else push(data);
  227. },
  228. //列表删除事件
  229. toDelete({ data, index }) {
  230. this.selected.splice(index, 1);
  231. },
  232. //保存计划事件
  233. savePlan() {
  234. // 获取已选择的时间
  235. let arr = JSON.parse(JSON.stringify(this.selected));
  236. //TODO整理数据
  237. let data = { ...this.info };
  238. arr = arr.map(i => {
  239. return { termnum: i.termnum, termid: i.id, number: '未计算,使用实际数据计算' };
  240. });
  241. data.term = arr;
  242. //最后加入schoolId
  243. //TODO 连接接口
  244. },
  245. setHeight() {
  246. let heights = this.$refs.card.$el.clientHeight * 0.63;
  247. this.$set(this, `heights`, heights);
  248. },
  249. },
  250. watch: {
  251. isNew: {
  252. immediate: true,
  253. handler(val) {
  254. if (val) this.loading = false;
  255. else this.search();
  256. },
  257. },
  258. },
  259. computed: {
  260. widths() {
  261. let width = (document.body.clientWidth - 200) * 0.5;
  262. return width > 400 ? width : 400;
  263. },
  264. id() {
  265. return this.$route.query.id;
  266. },
  267. isNew() {
  268. return this.$route.query.id ? true : false; //false : true;
  269. },
  270. mainTitle() {
  271. let meta = this.$route.meta;
  272. let main = meta.title || '';
  273. let sub = meta.sub || '';
  274. return `${main}${sub}`;
  275. },
  276. keyWord() {
  277. let meta = this.$route.meta;
  278. let main = meta.title || '';
  279. return main;
  280. },
  281. },
  282. };
  283. </script>
  284. <style lang="less" scoped>
  285. /deep/.el-divider--horizontal {
  286. margin: 5px 0;
  287. }
  288. </style>