teamCourseList.vue 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 课表列表
  6. <filter-search
  7. ref="filterSearch"
  8. @reload="reloadSearch"
  9. @setTimeForSearch="setTimeForSearch"
  10. :keys="['searchType']"
  11. :moreKeys="['start', 'end', 'organId']"
  12. />
  13. </h2>
  14. <div class="m-core">
  15. <!-- 搜索类型 -->
  16. <save-form
  17. :inline="true"
  18. class="searchForm"
  19. @submit="search"
  20. @reset="reset"
  21. ref="searchForm"
  22. :model.sync="searchForm"
  23. >
  24. <el-form-item>
  25. <el-input
  26. type="number"
  27. v-model.trim="searchForm.courseIdSearch"
  28. clearable
  29. placeholder="课程编号"
  30. />
  31. </el-form-item>
  32. <!-- <el-form-item>
  33. <el-input
  34. v-model.trim="searchForm.search"
  35. clearable
  36. placeholder="课程组编号/课程名称"
  37. />
  38. </el-form-item>
  39. <el-form-item>
  40. <el-select
  41. v-model.trim="searchForm.schoolId"
  42. clearable
  43. filterable
  44. placeholder="请选择教学点"
  45. >
  46. <el-option
  47. v-for="(item, index) in selects.schools"
  48. :key="index"
  49. :value="item.id"
  50. :label="item.name"
  51. ></el-option>
  52. </el-select>
  53. </el-form-item> -->
  54. <el-form-item>
  55. <remote-search
  56. :commit="'setTeachers'"
  57. v-model="searchForm.teacherIdList"
  58. />
  59. </el-form-item>
  60. <!-- <el-form-item>
  61. <el-select
  62. class="multiple"
  63. v-model.trim="searchForm.organIdList"
  64. filterable
  65. clearable
  66. placeholder="请选择分部"
  67. >
  68. <el-option
  69. v-for="(item, index) in selects.branchs"
  70. :key="index"
  71. :label="item.name"
  72. :value="item.id"
  73. ></el-option>
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item>
  77. <el-select
  78. v-model.trim="searchForm.groupType"
  79. clearable
  80. filterable
  81. placeholder="课程组类型"
  82. >
  83. <el-option
  84. v-for="item in courseListType"
  85. :key="item.value"
  86. :value="item.value"
  87. :label="item.label"
  88. ></el-option>
  89. </el-select>
  90. </el-form-item> -->
  91. <el-form-item>
  92. <el-select
  93. v-model.trim="searchForm.courseType"
  94. clearable
  95. filterable
  96. placeholder="课程类型"
  97. >
  98. <el-option
  99. v-for="(item, index) in courseType"
  100. :key="index"
  101. :value="item.value"
  102. :label="item.label"
  103. ></el-option>
  104. </el-select>
  105. </el-form-item>
  106. <!-- <el-form-item>
  107. <el-select
  108. v-model.trim="searchForm.teachMode"
  109. clearable
  110. filterable
  111. placeholder="教学模式"
  112. >
  113. <el-option label="线上课" value="ONLINE"></el-option>
  114. <el-option label="线下课" value="OFFLINE"></el-option>
  115. </el-select>
  116. </el-form-item> -->
  117. <el-form-item>
  118. <el-select
  119. v-model.trim="searchForm.courseStatus"
  120. clearable
  121. filterable
  122. placeholder="课程状态"
  123. >
  124. <el-option label="未开始" value="NOT_START"></el-option>
  125. <el-option label="进行中" value="UNDERWAY"></el-option>
  126. <el-option label="已结束" value="OVER"></el-option>
  127. </el-select>
  128. </el-form-item>
  129. <!-- <el-form-item>
  130. <el-select
  131. v-model.trim="searchForm.mergeCourseType"
  132. clearable
  133. filterable
  134. placeholder="合并课程类型"
  135. >
  136. <el-option
  137. v-for="(item, index) in mergeCourseTypeOptions"
  138. :key="index"
  139. :value="item.value"
  140. :label="item.label"
  141. ></el-option>
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item>
  145. <el-select
  146. v-model.trim="searchForm.teachType"
  147. clearable
  148. filterable
  149. placeholder="老师类型"
  150. >
  151. <el-option
  152. v-for="item in workTypeOptions"
  153. :key="item.label"
  154. :label="item.label"
  155. :value="item.value"
  156. ></el-option>
  157. </el-select>
  158. </el-form-item>
  159. <el-form-item>
  160. <el-select
  161. v-model.trim="searchForm.isCallNames"
  162. clearable
  163. filterable
  164. placeholder="是否点名"
  165. >
  166. <el-option label="是" value="1"></el-option>
  167. <el-option label="否" value="0"></el-option>
  168. </el-select>
  169. </el-form-item> -->
  170. <el-form-item>
  171. <el-date-picker
  172. v-model.trim="searchForm.timer"
  173. type="daterange"
  174. value-format="yyyy-MM-dd"
  175. range-separator="至"
  176. start-placeholder="上课开始日期"
  177. end-placeholder="上课结束日期"
  178. :picker-options="{
  179. firstDayOfWeek: 1,
  180. }"
  181. ></el-date-picker>
  182. </el-form-item>
  183. <!-- <el-form-item>
  184. <el-date-picker
  185. v-model.trim="searchForm.creatTimer"
  186. type="daterange"
  187. value-format="yyyy-MM-dd"
  188. range-separator="至"
  189. start-placeholder="创建开始日期"
  190. end-placeholder="创建结束日期"
  191. :picker-options="{
  192. firstDayOfWeek: 1,
  193. }"
  194. ></el-date-picker>
  195. </el-form-item> -->
  196. <el-form-item>
  197. <el-button
  198. :type="isSearch ? 'primary' : 'info'"
  199. icon="el-icon-circle-plus-outline"
  200. @click="showMove = true"
  201. >更多选项</el-button
  202. >
  203. </el-form-item>
  204. <el-form-item>
  205. <el-button native-type="submit" type="primary">搜索</el-button>
  206. <el-button native-type="reset" type="danger">重置</el-button>
  207. <el-button
  208. v-permission="'export/superFindCourseSchedules'"
  209. @click="onCourseExport"
  210. type="primary"
  211. >导出课表</el-button
  212. >
  213. </el-form-item>
  214. </save-form>
  215. <!-- 列表 -->
  216. <div class="tableWrap">
  217. <el-table
  218. :data="tableList"
  219. ref="tableList"
  220. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  221. @selection-change="handleSelectionChange"
  222. @select="onTableSelect"
  223. row-key="id"
  224. >
  225. >
  226. <el-table-column type="selection" width="55"></el-table-column>
  227. <el-table-column
  228. align="center"
  229. prop="organName"
  230. label="分部名称"
  231. ></el-table-column>
  232. <el-table-column
  233. align="center"
  234. width="170px"
  235. prop="musicGroupId"
  236. label="乐团/课程组编号"
  237. >
  238. <template slot-scope="scope">
  239. <el-button type="text" @click="gotoCourse(scope.row)">
  240. <copy-text>{{ scope.row.musicGroupId }}</copy-text>
  241. </el-button>
  242. </template>
  243. </el-table-column>
  244. <el-table-column
  245. align="center"
  246. prop="id"
  247. width="100px"
  248. label="课程编号"
  249. >
  250. <template slot-scope="scope">
  251. <copy-text>{{ scope.row.id }}</copy-text>
  252. </template>
  253. </el-table-column>
  254. <el-table-column align="center" width="200px" label="上课时间">
  255. <template slot-scope="scope"
  256. >{{
  257. scope.row.startClassTime
  258. ? scope.row.startClassTime.substr(0, 16)
  259. : ""
  260. }}-{{
  261. scope.row.endClassTime
  262. ? scope.row.endClassTime.substr(11, 5)
  263. : ""
  264. }}</template
  265. >
  266. </el-table-column>
  267. <el-table-column
  268. align="center"
  269. prop="subjectName"
  270. label="声部"
  271. ></el-table-column>
  272. <el-table-column prop="name" width="150px" label="课程名称">
  273. <template slot-scope="scope">
  274. <copy-text>{{ scope.row.name }}</copy-text>
  275. </template>
  276. </el-table-column>
  277. <el-table-column align="center" width="150px" label="课程类型">
  278. <template slot-scope="scope">
  279. <div>{{ scope.row.type | coursesType }}</div>
  280. </template>
  281. </el-table-column>
  282. <el-table-column align="center" label="教学模式">
  283. <template slot-scope="scope">
  284. <div>{{ scope.row.teachMode | teachMode }}</div>
  285. </template>
  286. </el-table-column>
  287. <el-table-column
  288. align="center"
  289. prop="teacherName"
  290. width="110"
  291. label="主教老师"
  292. ></el-table-column>
  293. <el-table-column align="center" prop="schoolName" label="教学点">
  294. <template slot-scope="scope">
  295. <div>
  296. {{ scope.row.schoolName ? scope.row.schoolName : "网络教室" }}
  297. </div>
  298. </template>
  299. </el-table-column>
  300. <el-table-column
  301. align="center"
  302. prop="courseScheduleStatus"
  303. label="课程状态"
  304. >
  305. <template slot-scope="scope">
  306. <div>{{ scope.row.status | coursesStatus }}</div>
  307. </template>
  308. </el-table-column>
  309. <el-table-column align="center" label="考勤申诉">
  310. <template slot-scope="scope">
  311. <div>{{ scope.row.isComplaints == 1 ? "是" : "否" }}</div>
  312. </template>
  313. </el-table-column>
  314. <el-table-column align="center" prop="isLock" label="是否冻结">
  315. <template slot-scope="scope">{{
  316. scope.row.isLock ? "是" : "否"
  317. }}</template>
  318. </el-table-column>
  319. <el-table-column
  320. align="center"
  321. prop="newCourseId"
  322. label="合并类型"
  323. width="130px"
  324. >
  325. <template slot-scope="scope">
  326. <div>
  327. <span
  328. v-if="
  329. scope.row.newCourseId > 0 &&
  330. scope.row.newCourseId == scope.row.id
  331. "
  332. >合并课
  333. </span>
  334. <el-button
  335. type="text"
  336. @click="common(scope.row)"
  337. v-if="
  338. scope.row.newCourseId > 0 &&
  339. scope.row.newCourseId != scope.row.id
  340. "
  341. >
  342. 被合并课
  343. </el-button>
  344. </div>
  345. </template>
  346. </el-table-column>
  347. <el-table-column
  348. align="center"
  349. prop="isCallNames"
  350. label="是否点名"
  351. fixed="right"
  352. >
  353. <template slot-scope="scope">{{
  354. scope.row.isCallNames ? "是" : "否"
  355. }}</template>
  356. </el-table-column>
  357. <el-table-column
  358. align="center"
  359. label="详情"
  360. fixed="right"
  361. width="220px"
  362. >
  363. <template slot-scope="scope">
  364. <div>
  365. <!-- <el-button
  366. type="text"
  367. @click="removeCourse(scope.row)"
  368. v-permission="
  369. 'courseSchedule/batchDelete?page=teamCourseList'
  370. "
  371. >删除</el-button
  372. > -->
  373. <auth auths="/teamCourseListDetail">
  374. <!-- v-if="permission('teamCourseList/details')" -->
  375. <el-button type="text" @click="lookDetail(scope.row)"
  376. >详情</el-button
  377. >
  378. </auth>
  379. <el-button
  380. type="text"
  381. v-if="
  382. permission('courseSchedule/classStartDateAdjust?hight') &&
  383. (!scope.row.isLock || scope.row.newCourseId > 0)
  384. "
  385. @click="resetClass(scope.row)"
  386. >调整</el-button
  387. >
  388. <!-- <el-button
  389. type="text"
  390. @click="addCompound(scope.row)"
  391. v-if="
  392. scope.row.groupType == 'MUSIC' &&
  393. scope.row.type != 'MUSIC_NETWORK' &&
  394. scope.row.type != 'HIGH_ONLINE' &&
  395. scope.row.status == 'NOT_START' &&
  396. !isAddCom(scope.row) &&
  397. permission('courseSchedule/courseMerge') &&
  398. scope.row.newCourseId <= 0 &&
  399. !scope.row.beMerged &&
  400. !scope.row.isLock // 李焕辜临轩要求冻结课程不能合并
  401. "
  402. >添加合课</el-button
  403. >
  404. <el-button
  405. type="text"
  406. v-if="
  407. isAddCom(scope.row) &&
  408. permission('courseSchedule/courseMerge')
  409. "
  410. @click="cancleCompound(scope.row)"
  411. >取消合课</el-button
  412. > -->
  413. <el-button
  414. type="text"
  415. v-if="
  416. scope.row.newCourseId == scope.row.id &&
  417. permission('courseSchedule/mergeCourseSplit') &&
  418. scope.row.status != 'OVER'
  419. "
  420. @click="resetCompound(scope.row)"
  421. >取消合并</el-button
  422. >
  423. <el-button
  424. type="text"
  425. v-if="
  426. scope.row.status == 'OVER' &&
  427. !scope.row.isSettlement &&
  428. permission('courseSchedule/cleanAttendance')
  429. "
  430. @click="clearAttend(scope.row)"
  431. >清除考勤</el-button
  432. >
  433. </div>
  434. </template>
  435. </el-table-column>
  436. </el-table>
  437. <pagination
  438. :total.sync="rules.total"
  439. :page.sync="rules.page"
  440. :limit.sync="rules.limit"
  441. :page-sizes="rules.page_size"
  442. @pagination="getList"
  443. sync
  444. />
  445. </div>
  446. </div>
  447. <el-dialog title="课表详情" :visible.sync="classVisible" width="1000px">
  448. <el-form :model="maskForm" :inline="true">
  449. <el-form-item label="老师姓名">
  450. <!-- <el-input v-model.trim="maskForm.teacherName"
  451. disabled></el-input>-->
  452. <div class="inputStyle">{{ maskForm.teacherName }}</div>
  453. </el-form-item>
  454. <el-form-item label="课程模式">
  455. <!-- <el-input :value="maskForm.teachMode | teachMode"
  456. disabled></el-input>-->
  457. <div class="inputStyle">{{ maskForm.teachMode | teachMode }}</div>
  458. <!-- <span>{{maskForm.teachMode }}</span> -->
  459. </el-form-item>
  460. <el-form-item label="课程类型">
  461. <!-- <el-input :value="maskForm.type |classType"
  462. disabled></el-input>-->
  463. <div class="inputStyle">{{ maskForm.type | coursesType }}</div>
  464. </el-form-item>
  465. <!-- courseScheduleStatus -->
  466. <el-form-item label="课程状态">
  467. <!-- <el-input :value="maskForm.type |classType"
  468. disabled></el-input>-->
  469. <div class="inputStyle">{{ maskForm.status | coursesStatus }}</div>
  470. </el-form-item>
  471. <!-- <el-form-item label="签到时间">
  472. <div class="inputStyle">{{maskForm.signInTime | dateForMinFormat}}</div>
  473. </el-form-item>
  474. <el-form-item label="签退时间">
  475. <div class="inputStyle">{{maskForm.signOutTime | dateForMinFormat}}</div>
  476. </el-form-item> -->
  477. <el-form-item label="是否点名">
  478. <!-- <el-input :value="maskForm.isCallNames | isCall"
  479. disabled></el-input>-->
  480. <div class="inputStyle">{{ maskForm.isCallNames | isCall }}</div>
  481. </el-form-item>
  482. <!-- <el-form-item label="签到状态">
  483. <div class="inputStyle"
  484. :class="maskForm.isSignIn==1?'':'red'">{{ maskForm.isSignIn | attendanceType}}</div>
  485. </el-form-item>
  486. <el-form-item label="签退状态">
  487. <div class="inputStyle"
  488. :class="maskForm.isSignIn==1?'':'red'">{{ maskForm.isSignOut | attendanceOutType}}</div>
  489. </el-form-item> -->
  490. <el-form-item label="上课时间">
  491. {{
  492. maskForm.startClassTime
  493. ? maskForm.startClassTime.substr(0, 16)
  494. : ""
  495. }}-{{
  496. maskForm.endClassTime ? maskForm.endClassTime.substr(11, 5) : ""
  497. }}
  498. </el-form-item>
  499. <el-form-item label="上课时长">
  500. <div
  501. class="inputStyle"
  502. :class="maskForm.attendClassTime <= 120 ? '' : 'red'"
  503. >
  504. {{
  505. maskForm.attendClassTime >= 0 ? maskForm.attendClassTime : 0
  506. }}分钟
  507. <el-tooltip placement="top" popper-class="mTooltip">
  508. <div slot="content">学员和老师同时在教室里的时长。</div>
  509. <!-- <img :src="imageIcon" class="micon el-tooltip" style="width:8px height:8px" alt /> -->
  510. <i
  511. class="el-icon-question micon el-tooltip"
  512. style="font-size: 18px; color: #f56c6c"
  513. v-permission="'export/teacherSalary'"
  514. ></i>
  515. </el-tooltip>
  516. </div>
  517. </el-form-item>
  518. <el-form-item label="学员考勤" v-if="maskForm.status != 'NOT_START'">
  519. <div
  520. class="inputStyle"
  521. :class="maskForm.errorAttendanceNum != 0 ? 'red' : 'green'"
  522. >
  523. {{ maskForm.errorAttendanceNum != 0 ? "异常" : "正常" }}
  524. </div>
  525. </el-form-item>
  526. <el-form-item label="老师考勤" v-if="maskForm.status != 'NOT_START'">
  527. <div
  528. class="inputStyle"
  529. :class="
  530. maskForm.signInStatusEnum == 1 && maskForm.signOutStatusEnum == 1
  531. ? 'green'
  532. : 'red'
  533. "
  534. >
  535. {{
  536. maskForm.signInStatusEnum == 1 && maskForm.signOutStatusEnum == 1
  537. ? "正常"
  538. : "异常"
  539. }}
  540. </div>
  541. </el-form-item>
  542. <el-form-item v-if="maskForm.school" label="教学点">
  543. {{ maskForm.school.name }}
  544. <el-tooltip content="查看教学点" :open-delay="0.5">
  545. <i
  546. @click="openLocation(maskForm.school)"
  547. class="el-icon-map-location"
  548. style="cursor: pointer"
  549. ></i>
  550. </el-tooltip>
  551. </el-form-item>
  552. </el-form>
  553. <!-- v-if="maskForm.status != 'NOT_START'" -->
  554. <el-tabs v-model.trim="activeName" type="card" @tab-click="handleClick">
  555. <el-tab-pane
  556. label="学员列表"
  557. name="first"
  558. v-if="permission('/teamCourseListDetailStudnetList')"
  559. >
  560. <div v-if="activeName == 'first'">
  561. <!-- studentRollCall -->
  562. <studentRollCall
  563. :courseScheduleId="maskForm.id"
  564. :isMainGo="isMainGo"
  565. ></studentRollCall>
  566. </div>
  567. </el-tab-pane>
  568. <!-- <el-tab-pane label="GPS定位"
  569. v-if="maskForm.teachMode == 'OFFLINE'"
  570. name="second">
  571. <div v-if="activeName == 'second'">
  572. <gpsLoction :courseScheduleId="maskForm.id"></gpsLoction>
  573. </div>
  574. </el-tab-pane> -->
  575. <el-tab-pane
  576. label="老师列表"
  577. name="second"
  578. v-if="permission('/teamCourseListDetailTeacherList')"
  579. >
  580. <div v-if="activeName == 'second'">
  581. <teacherList
  582. :courseScheduleId="maskForm.id"
  583. :teachMode="maskForm.teachMode"
  584. :courseStatus="maskForm.status"
  585. @syncTeacherAttend="syncTeacherAttend"
  586. ></teacherList>
  587. </div>
  588. </el-tab-pane>
  589. <!-- v-if="maskForm.teachMode != 'OFFLINE'" -->
  590. <el-tab-pane
  591. label="作业"
  592. name="third"
  593. v-if="permission('/teamCourseListDetailWorkList')"
  594. >
  595. <div v-if="activeName == 'third'">
  596. <studentWork :courseScheduleId="maskForm.id"></studentWork>
  597. </div>
  598. </el-tab-pane>
  599. <!-- v-if="maskForm.type == 'VIP' || maskForm.type == 'PRACTICE'" -->
  600. <el-tab-pane
  601. label="评论"
  602. name="four"
  603. v-if="permission('/teamCourseListDetailCommentList')"
  604. >
  605. <div v-if="activeName == 'four'">
  606. <courseEvaluate :courseScheduleId="maskForm.id"></courseEvaluate>
  607. </div>
  608. </el-tab-pane>
  609. <el-tab-pane
  610. label="调整记录"
  611. v-if="permission('/teamCourseListDetailAdjust')"
  612. name="five"
  613. >
  614. <div v-if="activeName == 'five'">
  615. <infoMsg :courseScheduleId="maskForm.id"></infoMsg>
  616. </div>
  617. </el-tab-pane>
  618. <!-- infoMsg -->
  619. </el-tabs>
  620. </el-dialog>
  621. <el-dialog :visible.sync="show" width="400px" title="课程调整">
  622. <resetClass
  623. :show="show"
  624. v-if="show"
  625. @closeReset="closeReset"
  626. @getList="getList"
  627. :id="id"
  628. />
  629. </el-dialog>
  630. <el-dialog title="查看教学点" :visible.sync="locationVisible">
  631. <school-location
  632. v-if="maskForm.school"
  633. :longitudeLatitude="maskForm.school.longitudeLatitude"
  634. :address="maskForm.school.address"
  635. />
  636. </el-dialog>
  637. <el-dialog
  638. title="更多选项"
  639. :visible.sync="showMove"
  640. v-if="showMove"
  641. width="700px"
  642. >
  643. <el-form
  644. :inline="true"
  645. class="searchForm"
  646. @submit="search"
  647. @reset="reset"
  648. ref="searchForm2"
  649. :model.sync="searchForm"
  650. label-width="120px"
  651. >
  652. <el-form-item label="课程组编号/名称" prop="search">
  653. <el-input
  654. style="width: 180px"
  655. v-model.trim="searchForm.search"
  656. clearable
  657. placeholder="课程组编号/课程名称"
  658. />
  659. </el-form-item>
  660. <el-form-item label="教学点" prop="schoolId">
  661. <el-select
  662. style="width: 180px"
  663. v-model.trim="searchForm.schoolId"
  664. clearable
  665. filterable
  666. placeholder="请选择教学点"
  667. >
  668. <el-option
  669. v-for="(item, index) in selects.schools"
  670. :key="index"
  671. :value="item.id"
  672. :label="item.name"
  673. ></el-option>
  674. </el-select>
  675. </el-form-item>
  676. <el-form-item label="分部" prop="organIdList">
  677. <el-select
  678. style="width: 180px"
  679. class="multiple"
  680. v-model.trim="searchForm.organIdList"
  681. filterable
  682. clearable
  683. placeholder="请选择分部"
  684. >
  685. <el-option
  686. v-for="(item, index) in selects.branchs"
  687. :key="index"
  688. :label="item.name"
  689. :value="item.id"
  690. ></el-option>
  691. </el-select>
  692. </el-form-item>
  693. <el-form-item label="课程组类型" prop="groupType">
  694. <el-select
  695. style="width: 180px"
  696. v-model.trim="searchForm.groupType"
  697. clearable
  698. filterable
  699. placeholder="课程组类型"
  700. >
  701. <el-option
  702. v-for="item in courseListType"
  703. :key="item.value"
  704. :value="item.value"
  705. :label="item.label"
  706. ></el-option>
  707. </el-select>
  708. </el-form-item>
  709. <el-form-item label="教学模式" prop="teachMode">
  710. <el-select
  711. style="width: 180px"
  712. v-model.trim="searchForm.teachMode"
  713. clearable
  714. filterable
  715. placeholder="教学模式"
  716. >
  717. <el-option label="线上课" value="ONLINE"></el-option>
  718. <el-option label="线下课" value="OFFLINE"></el-option>
  719. </el-select>
  720. </el-form-item>
  721. <!-- <el-form-item label="课程状态" prop="courseStatus">
  722. <el-select
  723. style="width:180px"
  724. v-model.trim="searchForm.courseStatus"
  725. clearable
  726. filterable
  727. placeholder="课程状态"
  728. >
  729. <el-option label="未开始" value="NOT_START"></el-option>
  730. <el-option label="进行中" value="UNDERWAY"></el-option>
  731. <el-option label="已结束" value="OVER"></el-option>
  732. </el-select>
  733. </el-form-item> -->
  734. <el-form-item label="合并课类型" prop="mergeCourseType">
  735. <el-select
  736. style="width: 180px"
  737. v-model.trim="searchForm.mergeCourseType"
  738. clearable
  739. filterable
  740. placeholder="合并课程类型"
  741. >
  742. <el-option
  743. v-for="(item, index) in mergeCourseTypeOptions"
  744. :key="index"
  745. :value="item.value"
  746. :label="item.label"
  747. ></el-option>
  748. </el-select>
  749. </el-form-item>
  750. <el-form-item label="老师类型" prop="teachType">
  751. <el-select
  752. style="width: 180px"
  753. v-model.trim="searchForm.teachType"
  754. clearable
  755. filterable
  756. placeholder="老师类型"
  757. >
  758. <el-option
  759. v-for="item in workTypeOptions"
  760. :key="item.label"
  761. :label="item.label"
  762. :value="item.value"
  763. ></el-option>
  764. </el-select>
  765. </el-form-item>
  766. <el-form-item label="是否点名" prop="isCallNames">
  767. <el-select
  768. style="width: 180px"
  769. v-model.trim="searchForm.isCallNames"
  770. clearable
  771. filterable
  772. placeholder="是否点名"
  773. >
  774. <el-option label="是" value="1"></el-option>
  775. <el-option label="否" value="0"></el-option>
  776. </el-select>
  777. </el-form-item>
  778. <el-form-item label="创建日期" prop="creatTimer">
  779. <el-date-picker
  780. v-model.trim="searchForm.creatTimer"
  781. type="daterange"
  782. value-format="yyyy-MM-dd"
  783. range-separator="-"
  784. start-placeholder="创建开始日期"
  785. end-placeholder="创建结束日期"
  786. :picker-options="{
  787. firstDayOfWeek: 1,
  788. }"
  789. ></el-date-picker>
  790. </el-form-item>
  791. </el-form>
  792. <span slot="footer" class="dialog-footer">
  793. <el-button @click="cancleMore">取 消</el-button>
  794. <el-button type="primary" @click="okMore">确 定</el-button>
  795. </span>
  796. </el-dialog>
  797. <!-- showMove -->
  798. <addCompound
  799. ref="addCompound"
  800. :compoundList="deleteList"
  801. v-if="permission('courseSchedule/courseMerge')"
  802. v-show="deleteList.length > 0"
  803. @clearCom="clearCom"
  804. @getList="getList"
  805. @removeCourse="removeCourse"
  806. @cancleCompound="cancleCompound"
  807. />
  808. </div>
  809. </template>
  810. <script>
  811. import pagination from "@/components/Pagination/index";
  812. import {
  813. superFindCourseSchedules,
  814. cleanAttendance,
  815. cancelCourseMerge,
  816. } from "@/api/buildTeam";
  817. import { bathDelete } from "@/api/vipSeting";
  818. import { workType, mergeCourseType } from "@/constant";
  819. import { objectToOptions, getTimes } from "@/utils";
  820. import { getTeacherPersonalAttendanceDetail } from "@/api/teacherManager";
  821. import { getSchool } from "@/api/systemManage";
  822. import { courseType, courseListType } from "@/utils/searchArray";
  823. import studentRollCall from "./componentCourse/studentRollCall";
  824. import gpsLoction from "./componentCourse/gpsLocation";
  825. import studentWork from "./componentCourse/studentWork";
  826. import courseEvaluate from "./componentCourse/courseEvaluate";
  827. import { permission } from "@/utils/directivePage";
  828. import axios from "axios";
  829. import { getToken } from "@/utils/auth";
  830. import load from "@/utils/loading";
  831. import SchoolLocation from "./components/modals/school-location";
  832. import resetClass from "./componentCourse/resetClass";
  833. import teacherList from "./componentCourse/teacherList";
  834. import addCompound from "./componentCourse/addCompound";
  835. import infoMsg from "./componentCourse/infoMsg";
  836. let nowTime = new Date();
  837. nowTime =
  838. nowTime.getFullYear() +
  839. "-" +
  840. (nowTime.getMonth() + 1) +
  841. "-" +
  842. nowTime.getDate();
  843. const initSearch = {
  844. teachMode: null, // 教学模式
  845. organIdList: null,
  846. courseStatus: null,
  847. courseType: null,
  848. timer: [nowTime, nowTime], // 时间
  849. class: null,
  850. teachType: null,
  851. mergeCourseType: null,
  852. isCallNames: null, // 是否点名
  853. search: null, // 乐团名称 编号 vip课名称
  854. teacherIdList: null, // 老师编号
  855. schoolId: null, // 教学点编号
  856. creatTimer: [],
  857. courseIdSearch: null,
  858. };
  859. export default {
  860. data() {
  861. return {
  862. classVisible: false,
  863. timerVisible: false,
  864. courseVisible: false,
  865. locationVisible: false,
  866. courseType: courseType,
  867. mergeCourseType,
  868. courseListType: courseListType,
  869. searchForm: { ...initSearch },
  870. tableList: [],
  871. searchLsit: [],
  872. organList: [],
  873. rules: {
  874. // 分页规则
  875. limit: 10, // 限制显示条数
  876. page: 1, // 当前页
  877. total: 0, // 总条数
  878. page_size: [10, 20, 40, 50], // 选择限制显示条数
  879. },
  880. teacherList: [],
  881. schoolList: [],
  882. maskForm: {},
  883. activeName: "first",
  884. id: null,
  885. show: false,
  886. compoundList: [],
  887. deleteList: [],
  888. isMainGo: false,
  889. isDetele: false,
  890. showMove: false,
  891. };
  892. },
  893. components: {
  894. pagination,
  895. studentRollCall,
  896. gpsLoction,
  897. studentWork,
  898. courseEvaluate,
  899. resetClass,
  900. teacherList,
  901. addCompound,
  902. infoMsg,
  903. SchoolLocation,
  904. },
  905. created() {
  906. this.searchForm.timer = [nowTime, nowTime];
  907. },
  908. computed: {
  909. workTypeOptions() {
  910. return objectToOptions(workType);
  911. },
  912. mergeCourseTypeOptions() {
  913. return objectToOptions(mergeCourseType);
  914. },
  915. isSearch() {
  916. return (
  917. this.searchForm.search ||
  918. this.searchForm.schoolId ||
  919. this.searchForm.organIdList ||
  920. this.searchForm.groupType ||
  921. this.searchForm.teachMode ||
  922. this.searchForm.mergeCourseType||
  923. this.searchForm.teachType||
  924. this.searchForm.isCallNames||
  925. this.searchForm.creatTimer?.length>0
  926. );
  927. },
  928. },
  929. mounted() {
  930. const { query } = this.$route;
  931. if (query.start || query.end) {
  932. this.searchForm.timer = [query.start, query.end];
  933. } else {
  934. let flag = false;
  935. for (let item in this.searchForm) {
  936. if (typeof this.searchForm[item] == "object") {
  937. // 对象或者数组
  938. if (this.searchForm[item]?.length > 0) {
  939. flag = true;
  940. }
  941. } else {
  942. if (this.searchForm[item]) {
  943. flag = true;
  944. }
  945. }
  946. }
  947. if (!flag) {
  948. this.searchForm.timer = [nowTime, nowTime];
  949. }
  950. }
  951. // 课程时间段异常,不需要时间搜索
  952. if (query.searchType == "COURSE_TIME_ERROR") {
  953. this.searchForm.timer = [];
  954. }
  955. if (query.organId) {
  956. this.searchForm.organIdList = Number(query.organId);
  957. }
  958. this.$store.dispatch("setBranchs");
  959. this.$store.dispatch("setTeachers");
  960. this.$store.dispatch("setSchools");
  961. this.init();
  962. },
  963. methods: {
  964. init() {
  965. this.getList();
  966. },
  967. setTimeForSearch() {
  968. const { query } = this.$route;
  969. if (query.start || query.end) {
  970. this.searchForm.timer = [query.start, query.end];
  971. } else {
  972. this.searchForm.timer = [];
  973. }
  974. },
  975. permission(str, parent) {
  976. return permission(str, parent);
  977. },
  978. reloadSearch(notSetTime) {
  979. if (!notSetTime) {
  980. this.searchForm.timer = [nowTime, nowTime];
  981. }
  982. this.rules.page = 1;
  983. this.getList();
  984. },
  985. async removeCourse(row) {
  986. if (this.deleteList.length < 1 && !row) {
  987. this.$message.error("请自少选择一节课");
  988. return;
  989. }
  990. let flag = false;
  991. let arr = this.deleteList.map((course) => {
  992. if (course.isSettlement || course.status == "UNDERWAY") {
  993. flag = true;
  994. }
  995. return course.id;
  996. });
  997. if (flag) {
  998. this.$message.error("已结算或进行中的课程无法删除");
  999. return;
  1000. }
  1001. let courseScheduleIds = arr.join(",") || row.id;
  1002. this.$confirm("是否确认删除此数据?", "提示", {
  1003. type: "warning",
  1004. })
  1005. .then(() => {
  1006. bathDelete({ courseScheduleIds: courseScheduleIds })
  1007. .then((res) => {
  1008. if (res.code == 200) {
  1009. this.$message.success("删除成功");
  1010. this.getList();
  1011. this.clearCom();
  1012. }
  1013. })
  1014. .catch((e) => {
  1015. this.$refs.addCompound.isLook = true;
  1016. });
  1017. })
  1018. .catch((e) => {
  1019. this.$refs.addCompound.isLook = true;
  1020. });
  1021. },
  1022. reset() {
  1023. this.searchForm = { ...initSearch };
  1024. this.search();
  1025. },
  1026. search() {
  1027. this.rules.page = 1;
  1028. this.$refs.searchForm.save(this.searchForm);
  1029. this.getList();
  1030. },
  1031. common(row) {
  1032. this.searchForm = {
  1033. ...initSearch,
  1034. timer: [],
  1035. courseIdSearch: row.newCourseId,
  1036. };
  1037. this.search();
  1038. },
  1039. getSearchForm() {
  1040. let searchForm = this.searchForm;
  1041. if (!searchForm.timer || searchForm.timer.length <= 0) {
  1042. searchForm.timer = [];
  1043. // this.$message.error("请选择时间段");
  1044. // return;
  1045. }
  1046. if (!searchForm.creatTimer || searchForm.creatTimer.length <= 0) {
  1047. searchForm.creatTimer = [];
  1048. }
  1049. let count = 0;
  1050. for (let item in searchForm) {
  1051. if (searchForm[item] && !Array.isArray(searchForm[item])) {
  1052. count++;
  1053. } else if (
  1054. Array.isArray(searchForm[item]) &&
  1055. searchForm[item].length > 0
  1056. ) {
  1057. count++;
  1058. }
  1059. }
  1060. // 课程时间段异常,不需要时间搜索,则课表列表搜索可以不要条件搜索
  1061. // if (count <= 0) {
  1062. // this.$message.error("请至少选择一个搜索条件");
  1063. // return false;
  1064. // }
  1065. const { creatTimer, timer, ...rest } = searchForm;
  1066. return {
  1067. ...rest,
  1068. page: this.rules.page,
  1069. rows: this.rules.limit,
  1070. searchType: this.$route.query.searchType,
  1071. ...getTimes(creatTimer, ["createStartDate", "createEndDate"]),
  1072. ...getTimes(timer, ["startTime", "endTime"]),
  1073. };
  1074. },
  1075. openLocation(school) {
  1076. this.locationVisible = true;
  1077. },
  1078. onCourseExport() {
  1079. // 课表导出
  1080. if (!this.getSearchForm()) {
  1081. return;
  1082. }
  1083. let url = "/api-web/export/superFindCourseSchedules";
  1084. const options = {
  1085. method: "get",
  1086. headers: {
  1087. Authorization: getToken(),
  1088. },
  1089. params: this.getSearchForm(),
  1090. url,
  1091. // responseType: "blob",
  1092. };
  1093. this.$confirm("您确定导出报表", "提示", {
  1094. confirmButtonText: "确定",
  1095. cancelButtonText: "取消",
  1096. type: "warning",
  1097. })
  1098. .then((data) => {
  1099. load.startLoading();
  1100. axios(options)
  1101. .then((res) => {
  1102. console.log(res)
  1103. this.$message.success(res.data.data)
  1104. // let blob = new Blob([res.data], {
  1105. // // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  1106. // type: "application/vnd.ms-excel;charset=utf-8",
  1107. // //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  1108. // });
  1109. // let text = new Response(blob).text();
  1110. // text.then((res) => {
  1111. // // 判断是否报错
  1112. // if (res.indexOf("code") != -1) {
  1113. // let json = JSON.parse(res);
  1114. // this.$message.error(json.msg);
  1115. // } else {
  1116. // let objectUrl = URL.createObjectURL(blob);
  1117. // let link = document.createElement("a");
  1118. // let fname = "课表列表" + new Date().getTime() + ".xls"; //下载文件的名字
  1119. // link.href = objectUrl;
  1120. // link.setAttribute("download", fname);
  1121. // document.body.appendChild(link);
  1122. // link.click();
  1123. // }
  1124. // });
  1125. load.endLoading();
  1126. })
  1127. .catch((error) => {
  1128. this.$message.error("导出数据失败,请联系管理员");
  1129. load.endLoading();
  1130. });
  1131. })
  1132. .catch(() => {});
  1133. },
  1134. getList() {
  1135. if (!this.getSearchForm()) {
  1136. return;
  1137. }
  1138. superFindCourseSchedules(this.getSearchForm()).then((res) => {
  1139. if (res.code == 200) {
  1140. this.tableList = res.data.rows;
  1141. this.rules.total = res.data.total;
  1142. let idList = this.deleteList.map((course) => {
  1143. return course.id;
  1144. });
  1145. this.isDetele = true;
  1146. this.$nextTick(() => {
  1147. this.tableList.forEach((course) => {
  1148. if (idList.indexOf(course.id) != -1) {
  1149. this.$refs.tableList.toggleRowSelection(course, true);
  1150. }
  1151. });
  1152. this.isDetele = false;
  1153. });
  1154. // let arr = this.$helpers.lodash.differenceWith( this.tableList, this.deleteList,'id')
  1155. }
  1156. });
  1157. },
  1158. lookDetail(row) {
  1159. // this.maskForm = row;
  1160. // 发请求 获取详情 row.id
  1161. this.maskForm = row;
  1162. this.activeName = "first";
  1163. this.classVisible = true;
  1164. getTeacherPersonalAttendanceDetail({ courseScheduleId: row.id }).then(
  1165. (res) => {
  1166. if (res.code == 200) {
  1167. this.maskForm = { ...this.maskForm, ...res.data };
  1168. this.maskForm.id = row.id;
  1169. this.activeName = "first";
  1170. this.classVisible = true;
  1171. this.isMainGo = this.$refs.filterSearch?.show;
  1172. }
  1173. }
  1174. );
  1175. },
  1176. syncTeacherAttend() {
  1177. if (this.maskForm.id) {
  1178. getTeacherPersonalAttendanceDetail({
  1179. courseScheduleId: this.maskForm.id,
  1180. }).then((res) => {
  1181. if (res.code == 200) {
  1182. this.maskForm = { ...this.maskForm, ...res.data };
  1183. this.isMainGo = this.$refs.filterSearch?.show;
  1184. }
  1185. });
  1186. }
  1187. },
  1188. handleClick(tab, event) {
  1189. // console.log(tab, event);
  1190. },
  1191. resetClass(row) {
  1192. this.id = row.id;
  1193. this.show = true;
  1194. },
  1195. closeReset() {
  1196. this.show = false;
  1197. },
  1198. clearAttend(row) {
  1199. this.$confirm("是否清除考勤记录?", "提示", {
  1200. confirmButtonText: "确定",
  1201. cancelButtonText: "取消",
  1202. type: "warning",
  1203. })
  1204. .then(() => {
  1205. cleanAttendance({ courseScheduleIds: row.id }).then((res) => {
  1206. if (res.code == 200) {
  1207. this.$message.success("清除成功");
  1208. this.getList();
  1209. } else {
  1210. this.$message.error(res.msg);
  1211. }
  1212. });
  1213. })
  1214. .catch(() => {});
  1215. },
  1216. cancleMore() {
  1217. // this.$refs.searchForm2.resetFields()
  1218. this.showMove = false;
  1219. },
  1220. okMore() {
  1221. this.getList();
  1222. this.showMove = false;
  1223. },
  1224. // addCompound(row) {
  1225. // this.compoundList.push(row);
  1226. // this.compoundList = [...new Set(this.compoundList)];
  1227. // },
  1228. // isAddCom(row) {
  1229. // let flag = false;
  1230. // this.compoundList.forEach((com) => {
  1231. // if (com.id == row.id) {
  1232. // flag = true;
  1233. // }
  1234. // });
  1235. // return flag;
  1236. // },
  1237. cancleCompound(row) {
  1238. let indexNum = null;
  1239. this.deleteList.forEach((com, index) => {
  1240. if (com.id == row.id) {
  1241. indexNum = index;
  1242. }
  1243. });
  1244. if (indexNum + "") {
  1245. this.deleteList.splice(indexNum, 1);
  1246. }
  1247. this.tableList.forEach((course, index) => {
  1248. if (course.id == row.id) {
  1249. this.$refs.tableList.toggleRowSelection(course, false);
  1250. }
  1251. });
  1252. if (this.deleteList.length <= 0) {
  1253. this.clearCom();
  1254. }
  1255. },
  1256. clearCom() {
  1257. // this.deleteList = [];
  1258. this.$set(this, "deleteList", []);
  1259. this.$refs.tableList.clearSelection();
  1260. this.$refs.addCompound.isLook = false;
  1261. },
  1262. resetCompound(row) {
  1263. this.$confirm("您确定取消合并该课程?", "提示", {
  1264. confirmButtonText: "确定",
  1265. cancelButtonText: "取消",
  1266. type: "warning",
  1267. })
  1268. .then(() => {
  1269. cancelCourseMerge({ mainCourseId: row.id }).then((res) => {
  1270. if (res.code == 200) {
  1271. this.$message.success("提交成功");
  1272. this.getList();
  1273. }
  1274. });
  1275. })
  1276. .catch(() => {});
  1277. },
  1278. handleSelectionChange(arr) {
  1279. // this.deleteList = arr;
  1280. if (arr.length > 0) {
  1281. // 有可能加 有可能减
  1282. this.deleteList = this.deleteList.concat(arr);
  1283. // 去重
  1284. this.deleteList = this.$helpers.lodash.uniqBy(this.deleteList, "id");
  1285. }
  1286. // else if(){}
  1287. else {
  1288. if (this.isDetele) return;
  1289. // 有2种 1是新页
  1290. // 2是点击反选
  1291. let idList = this.deleteList.map((course) => {
  1292. return course.id;
  1293. });
  1294. this.$nextTick(() => {
  1295. let tableIdList = [];
  1296. this.tableList.forEach((course) => {
  1297. tableIdList.push(course.id);
  1298. if (idList.indexOf(course.id) != -1) {
  1299. this.$refs.tableList.toggleRowSelection(course, false);
  1300. // 删除这个元素
  1301. }
  1302. });
  1303. this.deleteList = this.$helpers.lodash.remove(
  1304. this.deleteList,
  1305. function (item) {
  1306. return tableIdList.indexOf(item.id) == -1;
  1307. }
  1308. );
  1309. if (this.deleteList.length <= 0) {
  1310. this.clearCom();
  1311. }
  1312. });
  1313. }
  1314. },
  1315. gotoCourse(row) {
  1316. if (row.groupType == "MUSIC") {
  1317. this.$router.push({
  1318. path: "/teamList",
  1319. query: { search: row.musicGroupId },
  1320. });
  1321. } else if (row.groupType == "VIP") {
  1322. this.$router.push({
  1323. path: "/vipManager/vipList",
  1324. query: { search: row.musicGroupId },
  1325. });
  1326. } else if (row.groupType == "PRACTICE") {
  1327. this.$router.push({
  1328. path: "/accompanyManager/accompany",
  1329. query: { search: row.musicGroupId },
  1330. });
  1331. }
  1332. },
  1333. onTableSelect(rows, row) {
  1334. let idList = this.deleteList.map((course) => {
  1335. return course.id;
  1336. });
  1337. if (idList.indexOf(row.id) != -1) {
  1338. this.deleteList.splice(idList.indexOf(row.id), 1);
  1339. if (this.deleteList.length <= 0) {
  1340. this.clearCom();
  1341. }
  1342. }
  1343. },
  1344. },
  1345. filters: {
  1346. isCall(val) {
  1347. if (val == 0) {
  1348. return "未点名";
  1349. } else if (val == 1) {
  1350. return "已点名";
  1351. }
  1352. },
  1353. },
  1354. watch: {
  1355. classVisible(val) {
  1356. if (!val) {
  1357. this.activeName = null;
  1358. }
  1359. },
  1360. },
  1361. };
  1362. </script>
  1363. <style lang="scss" scoped>
  1364. .visible {
  1365. visibility: hidden;
  1366. }
  1367. .cl-container {
  1368. .topFrom {
  1369. margin: 20px 30px 0;
  1370. .classlist {
  1371. display: flex;
  1372. flex-direction: row;
  1373. justify-content: flex-start;
  1374. align-items: center;
  1375. ul {
  1376. li {
  1377. list-style: none;
  1378. }
  1379. }
  1380. }
  1381. }
  1382. .searchForm {
  1383. margin: 0 30px;
  1384. }
  1385. }
  1386. .btnWraps {
  1387. display: flex;
  1388. flex-direction: row;
  1389. justify-content: flex-start;
  1390. div {
  1391. margin-right: 20px;
  1392. }
  1393. }
  1394. .inputStyle {
  1395. width: 180px;
  1396. }
  1397. .red {
  1398. color: red;
  1399. }
  1400. .green {
  1401. color: #14928A;
  1402. }
  1403. .exportBtn {
  1404. background: #13817a;
  1405. }
  1406. .newBand {
  1407. margin-top: 30px;
  1408. }
  1409. </style>