teamCourseList.vue 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421
  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' : null"
  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. ? null
  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. console.log(this.searchForm);
  1029. this.$refs.searchForm.save(this.searchForm);
  1030. this.getList();
  1031. },
  1032. common(row) {
  1033. this.searchForm = {
  1034. ...initSearch,
  1035. timer: [],
  1036. courseIdSearch: row.newCourseId,
  1037. };
  1038. this.search();
  1039. },
  1040. getSearchForm() {
  1041. let searchForm = this.searchForm;
  1042. if (!searchForm.timer || searchForm.timer.length <= 0) {
  1043. searchForm.timer = [];
  1044. // this.$message.error("请选择时间段");
  1045. // return;
  1046. }
  1047. if (!searchForm.creatTimer || searchForm.creatTimer.length <= 0) {
  1048. searchForm.creatTimer = [];
  1049. }
  1050. let count = 0;
  1051. for (let item in searchForm) {
  1052. if (searchForm[item] && !Array.isArray(searchForm[item])) {
  1053. count++;
  1054. } else if (
  1055. Array.isArray(searchForm[item]) &&
  1056. searchForm[item].length > 0
  1057. ) {
  1058. count++;
  1059. }
  1060. }
  1061. // 课程时间段异常,不需要时间搜索,则课表列表搜索可以不要条件搜索
  1062. // if (count <= 0) {
  1063. // this.$message.error("请至少选择一个搜索条件");
  1064. // return false;
  1065. // }
  1066. const { creatTimer, timer, ...rest } = searchForm;
  1067. return {
  1068. ...rest,
  1069. page: this.rules.page,
  1070. rows: this.rules.limit,
  1071. searchType: this.$route.query.searchType,
  1072. ...getTimes(creatTimer, ["createStartDate", "createEndDate"]),
  1073. ...getTimes(timer, ["startTime", "endTime"]),
  1074. };
  1075. },
  1076. openLocation(school) {
  1077. this.locationVisible = true;
  1078. },
  1079. onCourseExport() {
  1080. // 课表导出
  1081. if (!this.getSearchForm()) {
  1082. return;
  1083. }
  1084. let url = "/api-web/export/superFindCourseSchedules";
  1085. const options = {
  1086. method: "get",
  1087. headers: {
  1088. Authorization: getToken(),
  1089. },
  1090. params: this.getSearchForm(),
  1091. url,
  1092. responseType: "blob",
  1093. };
  1094. this.$confirm("您确定导出报表", "提示", {
  1095. confirmButtonText: "确定",
  1096. cancelButtonText: "取消",
  1097. type: "warning",
  1098. })
  1099. .then(() => {
  1100. load.startLoading();
  1101. axios(options)
  1102. .then((res) => {
  1103. let blob = new Blob([res.data], {
  1104. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  1105. type: "application/vnd.ms-excel;charset=utf-8",
  1106. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  1107. });
  1108. let text = new Response(blob).text();
  1109. text.then((res) => {
  1110. // 判断是否报错
  1111. if (res.indexOf("code") != -1) {
  1112. let json = JSON.parse(res);
  1113. this.$message.error(json.msg);
  1114. } else {
  1115. let objectUrl = URL.createObjectURL(blob);
  1116. let link = document.createElement("a");
  1117. let fname = "课表列表" + new Date().getTime() + ".xls"; //下载文件的名字
  1118. link.href = objectUrl;
  1119. link.setAttribute("download", fname);
  1120. document.body.appendChild(link);
  1121. link.click();
  1122. }
  1123. });
  1124. load.endLoading();
  1125. })
  1126. .catch((error) => {
  1127. this.$message.error("导出数据失败,请联系管理员");
  1128. load.endLoading();
  1129. });
  1130. })
  1131. .catch(() => {});
  1132. },
  1133. getList() {
  1134. if (!this.getSearchForm()) {
  1135. return;
  1136. }
  1137. superFindCourseSchedules(this.getSearchForm()).then((res) => {
  1138. if (res.code == 200) {
  1139. this.tableList = res.data.rows;
  1140. this.rules.total = res.data.total;
  1141. let idList = this.deleteList.map((course) => {
  1142. return course.id;
  1143. });
  1144. this.isDetele = true;
  1145. this.$nextTick(() => {
  1146. this.tableList.forEach((course) => {
  1147. if (idList.indexOf(course.id) != -1) {
  1148. this.$refs.tableList.toggleRowSelection(course, true);
  1149. }
  1150. });
  1151. this.isDetele = false;
  1152. });
  1153. // let arr = this.$helpers.lodash.differenceWith( this.tableList, this.deleteList,'id')
  1154. }
  1155. });
  1156. },
  1157. lookDetail(row) {
  1158. // this.maskForm = row;
  1159. // 发请求 获取详情 row.id
  1160. this.maskForm = row;
  1161. this.activeName = "first";
  1162. this.classVisible = true;
  1163. getTeacherPersonalAttendanceDetail({ courseScheduleId: row.id }).then(
  1164. (res) => {
  1165. if (res.code == 200) {
  1166. this.maskForm = { ...this.maskForm, ...res.data };
  1167. this.maskForm.id = row.id;
  1168. this.activeName = "first";
  1169. this.classVisible = true;
  1170. this.isMainGo = this.$refs.filterSearch?.show;
  1171. console.log(this.isMainGo);
  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. console.log(row);
  1193. this.id = row.id;
  1194. this.show = true;
  1195. },
  1196. closeReset() {
  1197. this.show = false;
  1198. },
  1199. clearAttend(row) {
  1200. this.$confirm("是否清除考勤记录?", "提示", {
  1201. confirmButtonText: "确定",
  1202. cancelButtonText: "取消",
  1203. type: "warning",
  1204. })
  1205. .then(() => {
  1206. cleanAttendance({ courseScheduleIds: row.id }).then((res) => {
  1207. if (res.code == 200) {
  1208. this.$message.success("清除成功");
  1209. this.getList();
  1210. } else {
  1211. this.$message.error(res.msg);
  1212. }
  1213. });
  1214. })
  1215. .catch(() => {});
  1216. },
  1217. cancleMore() {
  1218. // this.$refs.searchForm2.resetFields()
  1219. this.showMove = false;
  1220. },
  1221. okMore() {
  1222. this.getList();
  1223. this.showMove = false;
  1224. },
  1225. // addCompound(row) {
  1226. // this.compoundList.push(row);
  1227. // this.compoundList = [...new Set(this.compoundList)];
  1228. // },
  1229. // isAddCom(row) {
  1230. // let flag = false;
  1231. // this.compoundList.forEach((com) => {
  1232. // if (com.id == row.id) {
  1233. // flag = true;
  1234. // }
  1235. // });
  1236. // return flag;
  1237. // },
  1238. cancleCompound(row) {
  1239. let indexNum = null;
  1240. this.deleteList.forEach((com, index) => {
  1241. if (com.id == row.id) {
  1242. indexNum = index;
  1243. }
  1244. });
  1245. if (indexNum + "") {
  1246. this.deleteList.splice(indexNum, 1);
  1247. }
  1248. this.tableList.forEach((course, index) => {
  1249. if (course.id == row.id) {
  1250. this.$refs.tableList.toggleRowSelection(course, false);
  1251. }
  1252. });
  1253. if (this.deleteList.length <= 0) {
  1254. this.clearCom();
  1255. }
  1256. },
  1257. clearCom() {
  1258. // this.deleteList = [];
  1259. this.$set(this, "deleteList", []);
  1260. this.$refs.tableList.clearSelection();
  1261. this.$refs.addCompound.isLook = false;
  1262. },
  1263. resetCompound(row) {
  1264. this.$confirm("您确定取消合并该课程?", "提示", {
  1265. confirmButtonText: "确定",
  1266. cancelButtonText: "取消",
  1267. type: "warning",
  1268. })
  1269. .then(() => {
  1270. cancelCourseMerge({ mainCourseId: row.id }).then((res) => {
  1271. if (res.code == 200) {
  1272. this.$message.success("提交成功");
  1273. this.getList();
  1274. }
  1275. });
  1276. })
  1277. .catch(() => {});
  1278. },
  1279. handleSelectionChange(arr) {
  1280. // this.deleteList = arr;
  1281. if (arr.length > 0) {
  1282. // 有可能加 有可能减
  1283. this.deleteList = this.deleteList.concat(arr);
  1284. // 去重
  1285. this.deleteList = this.$helpers.lodash.uniqBy(this.deleteList, "id");
  1286. }
  1287. // else if(){}
  1288. else {
  1289. if (this.isDetele) return;
  1290. // 有2种 1是新页
  1291. // 2是点击反选
  1292. let idList = this.deleteList.map((course) => {
  1293. return course.id;
  1294. });
  1295. this.$nextTick(() => {
  1296. let tableIdList = [];
  1297. this.tableList.forEach((course) => {
  1298. tableIdList.push(course.id);
  1299. if (idList.indexOf(course.id) != -1) {
  1300. this.$refs.tableList.toggleRowSelection(course, false);
  1301. // 删除这个元素
  1302. }
  1303. });
  1304. this.deleteList = this.$helpers.lodash.remove(
  1305. this.deleteList,
  1306. function (item) {
  1307. return tableIdList.indexOf(item.id) == -1;
  1308. }
  1309. );
  1310. if (this.deleteList.length <= 0) {
  1311. this.clearCom();
  1312. }
  1313. });
  1314. }
  1315. },
  1316. gotoCourse(row) {
  1317. if (row.groupType == "MUSIC") {
  1318. this.$router.push({
  1319. path: "/teamList",
  1320. query: { search: row.musicGroupId },
  1321. });
  1322. } else if (row.groupType == "VIP") {
  1323. this.$router.push({
  1324. path: "/vipManager/vipList",
  1325. query: { search: row.musicGroupId },
  1326. });
  1327. } else if (row.groupType == "PRACTICE") {
  1328. this.$router.push({
  1329. path: "/accompanyManager/accompany",
  1330. query: { search: row.musicGroupId },
  1331. });
  1332. }
  1333. },
  1334. onTableSelect(rows, row) {
  1335. let idList = this.deleteList.map((course) => {
  1336. return course.id;
  1337. });
  1338. if (idList.indexOf(row.id) != -1) {
  1339. this.deleteList.splice(idList.indexOf(row.id), 1);
  1340. if (this.deleteList.length <= 0) {
  1341. this.clearCom();
  1342. }
  1343. }
  1344. },
  1345. },
  1346. filters: {
  1347. isCall(val) {
  1348. if (val == 0) {
  1349. return "未点名";
  1350. } else if (val == 1) {
  1351. return "已点名";
  1352. }
  1353. },
  1354. },
  1355. watch: {
  1356. classVisible(val) {
  1357. if (!val) {
  1358. this.activeName = null;
  1359. }
  1360. },
  1361. },
  1362. };
  1363. </script>
  1364. <style lang="scss" scoped>
  1365. .visible {
  1366. visibility: hidden;
  1367. }
  1368. .cl-container {
  1369. .topFrom {
  1370. margin: 20px 30px 0;
  1371. .classlist {
  1372. display: flex;
  1373. flex-direction: row;
  1374. justify-content: flex-start;
  1375. align-items: center;
  1376. ul {
  1377. li {
  1378. list-style: none;
  1379. }
  1380. }
  1381. }
  1382. }
  1383. .searchForm {
  1384. margin: 0 30px;
  1385. }
  1386. }
  1387. .btnWraps {
  1388. display: flex;
  1389. flex-direction: row;
  1390. justify-content: flex-start;
  1391. div {
  1392. margin-right: 20px;
  1393. }
  1394. }
  1395. .inputStyle {
  1396. width: 180px;
  1397. }
  1398. .red {
  1399. color: red;
  1400. }
  1401. .exportBtn {
  1402. background: #13817a;
  1403. }
  1404. .newBand {
  1405. margin-top: 30px;
  1406. }
  1407. </style>