accompanys.vue 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. <template>
  2. <div class="m-container">
  3. <div class="titlewrap">
  4. <h2>
  5. <el-page-header @back="goBack"
  6. :content="name"></el-page-header>
  7. </h2>
  8. <p style="margin-bottom:10px; margin-left:30px;">课程有效期:{{ timers }}</p>
  9. </div>
  10. <!-- v-permission="'vipGroupManage/updateVipBaseInfo'" -->
  11. <div class="wrap">
  12. <div class="newBand"
  13. @click="resetTeachers"
  14. v-if="courseType&&courseType!='TRIAL'"
  15. v-permission="'courseSchedule/practiceGroupTeacherAdjust'">课程组调整</div>
  16. <!-- // accompanys/addCourse -->
  17. <div v-permission="{ child:'courseSchedule/batchAddCourses',parent:'/accompanys'}"
  18. class="newBand"
  19. @click="addCourse">网管课加课</div>
  20. <div class="newBand"
  21. v-if="courseType&&courseType!='TRIAL'"
  22. v-permission="'courseSchedule/batchUpdateCourseSchedule'"
  23. @click="adjustment">批量调整</div>
  24. <div class="newBand"
  25. v-permission="'courseSchedule/updateCoursesExpireDate'"
  26. @click="expireVisible = true">有效期调整</div>
  27. </div>
  28. <div class="tableWrap">
  29. <el-table :data="tableList"
  30. :header-cell-style="{background:'#EDEEF0',color:'#444'}"
  31. @selection-change="handleSelectionChange">
  32. <el-table-column type="selection"
  33. :selectable="isDisabled"
  34. width="55"></el-table-column>
  35. <el-table-column label="课程编号"
  36. align="center"
  37. prop="id"></el-table-column>
  38. <el-table-column label="课程名称"
  39. align="center"
  40. prop="name"></el-table-column>
  41. <el-table-column label="主教老师"
  42. align="center"
  43. prop="teacherName"></el-table-column>
  44. <!-- <el-table-column label="主教老师" align="center" >
  45. <template slot-scope="scope">
  46. <div v-show="scope.row.teacher">
  47. {{scope.row.teacher.realName}}
  48. </div>
  49. </template>
  50. </el-table-column>-->
  51. <!-- <el-table-column label="班级id"
  52. align="center"
  53. prop="classGroupId">
  54. </el-table-column>-->
  55. <el-table-column label="上课日期"
  56. align="center"
  57. prop="classDate">
  58. <template slot-scope="scope">
  59. <div>{{ scope.row.classDate | formatTimer}} {{ scope.row.startClassTimeStr | timerForMinFormat}}~{{ scope.row.endClassTimeStr | timerForMinFormat}}</div>
  60. </template>
  61. </el-table-column>
  62. <!-- <el-table-column label="开始时间"
  63. align="center"
  64. prop="startClassTimeStr">
  65. <template slot-scope="scope">
  66. <div>{{ scope.row.startClassTimeStr | timerForMinFormat}}</div>
  67. </template>
  68. </el-table-column>
  69. <el-table-column label="结束时间"
  70. align="center"
  71. prop="endClassTimeStr">
  72. <template slot-scope="scope">
  73. <div>{{ scope.row.endClassTimeStr | timerForMinFormat}}</div>
  74. </template>
  75. </el-table-column> -->
  76. <el-table-column label="是否点名"
  77. align="center"
  78. prop="status">
  79. <template slot-scope="scope">{{ scope.row.isCallNames ? '是' : '否' }}</template>
  80. </el-table-column>
  81. <el-table-column label="课程状态"
  82. align="center"
  83. prop="status">
  84. <template slot-scope="scope">
  85. <div>{{ scope.row.status | coursesStatus }}</div>
  86. </template>
  87. </el-table-column>
  88. <el-table-column label="结算状态"
  89. align="center">
  90. <template slot-scope="scope">
  91. <div>{{scope.row.isSettlement?'已结算':'未结算'}}</div>
  92. </template>
  93. </el-table-column>
  94. <!-- <el-table-column label="教学点" align="center" prop="schoolName">
  95. <template slot-scope="scope">
  96. <div>{{scope.row.schoolName?scope.row.schoolName:'网络教室'}}</div>
  97. </template>
  98. </el-table-column>-->
  99. <el-table-column label="操作"
  100. width="250px"
  101. align="center"
  102. fixed="right">
  103. <template slot-scope="scope">
  104. <div>
  105. <el-button type="text"
  106. v-if="!scope.row.isSettlement && permission('courseSchedule/practiceCourseAdjust')"
  107. @click="resetClass(scope.row)">调整</el-button>
  108. <el-button type="text"
  109. v-if="!scope.row.isSettlement && scope.row.status == 'NOT_START' && permission('accompanys/remove')"
  110. @click="removeClass(scope.row)">删除</el-button>
  111. <el-button type="text"
  112. v-if="scope.row.status == 'NOT_START'&&courseType!='TRIAL'&& permission('courseSchedule/practiceCourseTeacherAdjust')"
  113. @click="resetTeacher(scope.row)">更换老师</el-button>
  114. <el-button v-if="scope.row.status == 'OVER' && scope.row.isSettlement == 0 && permission('/accompanys/teacherAttendance/updateTeacherAttendance')"
  115. type="text"
  116. @click="onMarkAttendance(scope.row)">补考勤</el-button>
  117. <!-- && permission('studentAttendance/updateStudentAttendances', '/accompanys') -->
  118. <el-button v-if="scope.row.status == 'OVER' && permission('/accompanys/studentAttendance/updateStudentAttendances')"
  119. type="text"
  120. @click="onCallName(scope.row)">点名表</el-button>
  121. <el-button type="text"
  122. v-if="!scope.row.isSettlement && permission('accompanys/cleanAttendance')"
  123. @click="clearAttend(scope.row)">清除考勤</el-button>
  124. </div>
  125. </template>
  126. </el-table-column>
  127. </el-table>
  128. <!-- <pagination :total="rules.total"
  129. :page.sync="rules.page"
  130. :limit.sync="rules.limit"
  131. :page-sizes="rules.page_size"
  132. @pagination="getList" /> 乔乔说后台没有分页所以一口气都展示-->
  133. </div>
  134. <el-dialog title="有效期调整"
  135. width="400px"
  136. :before-close="expireClose"
  137. :visible.sync="expireVisible">
  138. <el-form :model="expireForm"
  139. ref="expireForm"
  140. :rules="expireRules"
  141. label-position="right"
  142. label-width="80px;"
  143. :inline="true">
  144. <el-form-item label="课程结束时间"
  145. prop="coursesExpireDate">
  146. <el-date-picker v-model.trim="expireForm.coursesExpireDate"
  147. style="width:200px!important;"
  148. type="date"
  149. :picker-options="bigin"
  150. value-format="yyyy-MM-dd"
  151. placeholder="选择日期"></el-date-picker>
  152. </el-form-item>
  153. <div style="padding-left: 15px; color: red;">课程结束时间不得早于,{{ expireForm.tempCoursesExpireDate }}</div>
  154. </el-form>
  155. <div slot="footer"
  156. class="dialog-footer">
  157. <el-button @click="expireVisible = false">取 消</el-button>
  158. <el-button type="primary"
  159. @click="submitExpireDate">确 定</el-button>
  160. </div>
  161. </el-dialog>
  162. <el-dialog title="补考勤"
  163. width="400px"
  164. :visible.sync="markAttendance.status">
  165. <el-form>
  166. <el-form-item label="签到状态">{{ markAttendance.dataInfo.isSignIn | attendanceType }}</el-form-item>
  167. <el-form-item label="签到时间">{{ markAttendance.dataInfo.signInTime}}</el-form-item>
  168. <el-form-item label="签退状态">{{ markAttendance.dataInfo.isSignOut | attendanceOutType }}</el-form-item>
  169. <el-form-item label="签退时间">{{ markAttendance.dataInfo.signOutTime}}</el-form-item>
  170. </el-form>
  171. <div slot="footer"
  172. class="dialog-footer">
  173. <el-button @click="markAttendance.status = false">取 消</el-button>
  174. <el-button type="primary"
  175. :disabled="markAttendance.dataInfo.isSignIn == 1 && markAttendance.dataInfo.isSignOut == 1 ? true : false"
  176. @click="batchAdjustmentTime">确定补卡</el-button>
  177. </div>
  178. </el-dialog>
  179. <el-dialog title="课程调整"
  180. width="400px"
  181. :before-close="handleClose"
  182. :visible.sync="courseVisible">
  183. <el-form :model="maskForm"
  184. ref="maskForm"
  185. :rules="maskRules"
  186. label-position="right"
  187. label-width="80px"
  188. :inline="true">
  189. <el-form-item label="上课日期"
  190. prop="date"
  191. v-if="courseType != 'TRIAL'">
  192. <el-date-picker v-model.trim="maskForm.date"
  193. type="date"
  194. :picker-options="courseOption"
  195. value-format="yyyy-MM-dd"
  196. placeholder="选择日期"></el-date-picker>
  197. </el-form-item>
  198. <el-form-item label="上课日期"
  199. prop="date"
  200. v-else>
  201. <el-date-picker v-model.trim="maskForm.date"
  202. style="width:200px!important;"
  203. type="date"
  204. value-format="yyyy-MM-dd"
  205. :picker-options="{
  206. firstDayOfWeek: 1
  207. }"
  208. placeholder="选择日期"></el-date-picker>
  209. </el-form-item>
  210. <el-form-item label="开始时间"
  211. prop="startTime"
  212. :rules="[{ required: true, message: '请选择开始时间', trigger: 'change' }]">
  213. <el-time-picker placeholder="起始时间"
  214. v-model="maskForm.startTime"
  215. @change="changeStartTime"
  216. format='HH:mm'
  217. value-format='HH:mm'
  218. :picker-options="{
  219. selectableRange: '04:30:00 - 23:30:00'
  220. }"></el-time-picker>
  221. </el-form-item>
  222. <el-form-item label="结束时间"
  223. prop="endTime">
  224. <el-time-picker placeholder="结束时间"
  225. format='HH:mm'
  226. value-format='HH:mm'
  227. v-model="maskForm.endTime"
  228. disabled>
  229. </el-time-picker>
  230. </el-form-item> <!-- v-show="maskForm.teachMode=='OFFLINE'"-->
  231. <!-- <el-form-item label="课程类型" prop="courseType">
  232. <el-select clearable v-model.trim="maskForm.teachMode">
  233. <el-option label="线上课" value="ONLINE"></el-option>
  234. <el-option label="线下课" value="OFFLINE"></el-option>
  235. </el-select>
  236. </el-form-item>-->
  237. <!-- <el-form-item label="教学地点" v-show="maskForm.teachMode == 'OFFLINE'">
  238. <el-select v-model.trim="maskForm.address" filterable clearable>
  239. <el-option
  240. v-for="(item,index) in schoolList"
  241. :key="index"
  242. :value="item.id"
  243. :label="item.name"
  244. ></el-option>
  245. </el-select>
  246. </el-form-item> 1-->
  247. </el-form>
  248. <div slot="footer"
  249. class="dialog-footer">
  250. <el-button @click="handleClose">取 消</el-button>
  251. <el-button type="primary"
  252. @click="submitResetClass">确 定</el-button>
  253. </div>
  254. </el-dialog>
  255. <el-dialog :title="isMultiple?'课程组调整':'更换老师'"
  256. width="400px"
  257. :before-close="teacherClose"
  258. :visible.sync="teacherVisible">
  259. <el-form :model="teacherForm"
  260. ref="teacherForm"
  261. :rules="teacherRules"
  262. label-position="right"
  263. label-width="80px;"
  264. :inline="true">
  265. <el-form-item label="课程班名称"
  266. v-show="isMultiple">
  267. <el-input v-model.trim="teacherForm.name"
  268. disabled></el-input>
  269. </el-form-item>
  270. <el-form-item label="课程组声部"
  271. v-show="isMultiple">
  272. <el-select v-model.trim="teacherForm.subjectId"
  273. @change="changeSound"
  274. filterable
  275. clearable>
  276. <el-option v-for="(item,index) in subjectList"
  277. :key="index"
  278. :value="item.id"
  279. :label="item.name"></el-option>
  280. </el-select>
  281. </el-form-item>
  282. <el-form-item label="课程组老师"
  283. v-if="isMultiple">
  284. <el-select v-model.trim="teacherForm.teacher"
  285. filterable
  286. clearable>
  287. <el-option v-for="(item,index) in teacherList"
  288. :key="index"
  289. :value="item.id"
  290. :label="item.realName"></el-option>
  291. </el-select>
  292. </el-form-item>
  293. <el-form-item label="指导老师"
  294. v-else="isMultiple">
  295. <el-select v-model.trim="teacherForm.teacher"
  296. filterable
  297. clearable>
  298. <el-option v-for="(item,index) in teacherList"
  299. :key="index"
  300. :value="item.id"
  301. :label="item.realName"></el-option>
  302. </el-select>
  303. </el-form-item>
  304. <el-form-item label="乐团主管"
  305. v-show="isMultiple">
  306. <el-select v-model.trim="teacherForm.educationalTeacherId"
  307. filterable
  308. clearable>
  309. <el-option v-for="(item,index) in educationList"
  310. :key="index"
  311. :value="item.userId"
  312. :label="item.userName"></el-option>
  313. </el-select>
  314. </el-form-item>
  315. <el-form-item v-if="isMultiple">
  316. <p style="color:#FF5353">*更改课程组老师,将更换全部未开始课程的老师</p>
  317. </el-form-item>
  318. </el-form>
  319. <div slot="footer"
  320. class="dialog-footer">
  321. <el-button @click="teacherVisible = false">取 消</el-button>
  322. <el-button type="primary"
  323. @click="subresetTeacher">确 定</el-button>
  324. </div>
  325. </el-dialog>
  326. <el-dialog :title="adjustmentName"
  327. width="800px"
  328. :visible.sync="adjustmentVisible">
  329. <el-form :model="adjustmentForm"
  330. label-position="right"
  331. label-width="120px"
  332. ref="adjustmentForm"
  333. :rules="adjustmentRules"
  334. :inline="true">
  335. <el-form-item label="已选择课时数"
  336. v-if="!isaddCourse">
  337. <el-input disabled
  338. v-model.trim="adjustmentForm.count"></el-input>
  339. </el-form-item>
  340. <el-form-item label="添加课时数"
  341. prop="addCount"
  342. v-if="isaddCourse">
  343. <el-input type="number"
  344. @mousewheel.native.prevent
  345. v-model.trim="adjustmentForm.addCount"></el-input>
  346. </el-form-item>
  347. <br />
  348. <!-- <el-form-item label="单课费用" prop="fee" v-show="isaddCourse">
  349. <el-input v-model.trim="adjustmentForm.fee"></el-input>
  350. </el-form-item>-->
  351. <el-form-item label="排课起始时间"
  352. prop="courseTime">
  353. <el-date-picker v-model.trim="adjustmentForm.courseTime"
  354. :picker-options="pickerOptions"
  355. style="width:200px!important;"
  356. type="date"
  357. value-format="yyyy-MM-dd"
  358. placeholder="选择日期"></el-date-picker>
  359. <el-checkbox style="margin-left:10px;"
  360. v-model.trim="adjustmentForm.checked">是否跳过节假日</el-checkbox>
  361. </el-form-item>
  362. </el-form>
  363. <div class="WeekWrap">
  364. <h3 style="margin-bottom:20px;">
  365. 循环次数
  366. <el-button type="text"
  367. style="margin-left:10px;"
  368. @click="addWeek">添加</el-button>
  369. </h3>
  370. <div class="countWrap"
  371. style="margin-bottom:10px;">
  372. <div class="countItem"
  373. style="margin-bottom:20px;"
  374. v-for="(item,index) in weekList"
  375. :key="index">
  376. <span>循环周期:</span>
  377. <el-select v-model.trim="item.dayOfWeek"
  378. filterable
  379. clearable>
  380. <el-option v-for="(item,index) in weekDateList"
  381. :key="index"
  382. :label="item.label"
  383. :value="item.value"></el-option>
  384. </el-select>
  385. <span style="margin-left:10px;">开始时间</span>
  386. <el-time-picker style="margin-left:10px;"
  387. placeholder
  388. v-model.trim="item.startClassTime"
  389. @change="(val)=>{changeStartTimes(val,item)}"
  390. format='HH:mm'
  391. value-format='HH:mm'
  392. :picker-options="{
  393. selectableRange: '04:30:00 - 23:30:00'
  394. }"></el-time-picker>
  395. <span style="margin-left:10px;">结束时间</span>
  396. <el-time-picker style="margin-left:10px;"
  397. placeholder
  398. v-model.trim="item.endClassTime"
  399. format='HH:mm'
  400. value-format='HH:mm'
  401. disabled
  402. :picker-options="{
  403. selectableRange: '04:30:00 - 23:30:00'
  404. }"></el-time-picker>
  405. <el-button style="margin-left:10px;"
  406. type="danger"
  407. @click="removeWeek(item)"
  408. icon="el-icon-delete"
  409. circle></el-button>
  410. </div>
  411. </div>
  412. </div>
  413. <div slot="footer"
  414. class="dialog-footer">
  415. <el-button @click="adjustmentVisible = false">取 消</el-button>
  416. <el-button type="primary"
  417. v-show="!isaddCourse"
  418. @click="submitAdjustment">确 定</el-button>
  419. <el-button type="primary"
  420. v-show="isaddCourse"
  421. @click="addCourseSubmit">确 定</el-button>
  422. </div>
  423. </el-dialog>
  424. <el-dialog title='点名表'
  425. width="700px"
  426. :visible.sync="rollCall.status">
  427. <el-table :data="rollCall.gridData">
  428. <el-table-column align='center'
  429. property="userName"
  430. label="学员姓名"></el-table-column>
  431. <el-table-column align='center'
  432. property="phone"
  433. label="手机号"></el-table-column>
  434. <el-table-column align='center'
  435. property="subjectName"
  436. label="学员声部"></el-table-column>
  437. <el-table-column align='center'
  438. label="到课状态">
  439. <template slot-scope="scope">
  440. {{ scope.row.status | studentCallName }}
  441. </template>
  442. </el-table-column>
  443. <el-table-column align='center'
  444. label="操作"
  445. v-if="rollCall.selectItem.isSettlement == 0"
  446. width="220px">
  447. <template slot-scope="scope">
  448. <el-button size="small"
  449. @click="onChangeRollCall('TRUANT', scope.row)"
  450. type="primary"
  451. round>未到</el-button>
  452. <el-button size="small"
  453. @click="onChangeRollCall('LEAVE', scope.row)"
  454. type="warning"
  455. round>请假</el-button>
  456. <el-button size="small"
  457. @click="onChangeRollCall('NORMAL', scope.row)"
  458. type="success"
  459. round>到课</el-button>
  460. </template>
  461. </el-table-column>
  462. </el-table>
  463. <pagination :total="rollCall.total"
  464. :page.sync="rollCall.page"
  465. :limit.sync="rollCall.limit"
  466. :page-sizes="rollCall.page_size"
  467. @pagination="getCallName" />
  468. </el-dialog>
  469. </div>
  470. </template>
  471. <script>
  472. import pagination from "@/components/Pagination/index";
  473. import { permission } from "@/utils/directivePage";
  474. import { nextMonthLastDay } from "@/utils/validate";
  475. import {
  476. findPracticeGroupCourseSchedules,
  477. practiceCourseAdjus,
  478. getTeacher,
  479. practiceGroupManage,
  480. practiceGroupTeacherAdjust,
  481. practiceCourseTeacherAdjust,
  482. cleanAttendance,
  483. batchAddCourses,
  484. getPracticeApplySubjects,
  485. batchUpdateCourseSchedule,
  486. findEducationUsers,
  487. updateTeacherAttendance,
  488. updateCoursesExpireDate,
  489. findAttendanceStudentByCourseWithPage,
  490. updateStudentAttendances,
  491. resetCourse
  492. } from "@/api/buildTeam";
  493. import {
  494. vipCourseAdjust,
  495. batchAppendVipGroupCourses,
  496. bathDelete
  497. } from "@/api/vipSeting";
  498. // import { start } from 'repl';
  499. import { diffTimerFormMinute, addTimerFormMinute } from '@/utils/date'
  500. import dayjs from 'dayjs'
  501. export default {
  502. components: {
  503. pagination
  504. },
  505. data () {
  506. return {
  507. adjustmentName: "",
  508. isaddCourse: false,
  509. adjustmentVisible: false,
  510. expireVisible: false,
  511. isMultiple: true,
  512. name: "网管课程组",
  513. courseVisible: false,
  514. teacherVisible: false,
  515. Frules: null,
  516. FsearchForm: null,
  517. userId: null,
  518. activeRow: null,
  519. courseType: null,
  520. rules: {
  521. // 分页规则
  522. limit: 20, // 限制显示条数
  523. page: 1, // 当前页
  524. total: 0, // 总条数
  525. page_size: [10, 20, 50, 100] // 选择限制显示条数
  526. },
  527. tableList: [],
  528. teacherList: [],
  529. courseData: [],
  530. practiceId: null,
  531. subjectList: [],
  532. maskForm: {
  533. date: "",
  534. startTime: "",
  535. id: "",
  536. endTime: ""
  537. },
  538. adjustmentForm: {
  539. count: "",
  540. courseTime: "",
  541. checked: false,
  542. addCount: "",
  543. courseType: "",
  544. fee: ""
  545. },
  546. startTime: null,
  547. expireForm: {
  548. coursesExpireDate: null,
  549. tempCoursesExpireDate: null
  550. },
  551. expireRules: {
  552. coursesExpireDate: [{ required: true, message: "请选择课程结束时间", trigger: "blur" }]
  553. },
  554. maskRules: {
  555. date: [{ required: true, message: "请选择上课时间", trigger: "blur" }],
  556. // startTime: [{ required: true, message: '请选择上课开始时间', trigger: 'blur' },],
  557. // endTime: [
  558. // { required: true, message: "请选择上课结束时间", trigger: "blur" }
  559. // ]
  560. },
  561. teacherRules: {
  562. teacher: [{ required: true, message: "请选择老师", trigger: "blur" }],
  563. subjectId: [{ required: true, message: "请选择声部", trigger: "blur" }],
  564. educationalTeacherId: [{ required: true, message: "请选择乐团主管", trigger: "blur" }]
  565. },
  566. teacherForm: {
  567. teacher: null,
  568. name: null,
  569. subjectId: null,
  570. educationalTeacherId: null
  571. },
  572. courseOption: null,
  573. coursesExpireDate: null,
  574. adjustmentRules: {
  575. courseTime: [{ required: true, message: "请选择开始时间" }],
  576. addCount: [{ required: true, message: "请输入加课次数" }],
  577. courseType: [{ required: true, message: "请选择课程类型" }],
  578. fee: [{ required: true, message: "请输入费用" }]
  579. },
  580. pickerOptions: {
  581. firstDayOfWeek: 1,
  582. disabledDate (time) {
  583. return time.getTime() + 86400000 <= new Date().getTime();
  584. }
  585. },
  586. weekList: [
  587. {
  588. dayOfWeek: "",
  589. startTime: "",
  590. endTime: "",
  591. moid: new Date().getTime()
  592. }
  593. ],
  594. weekDateList: [
  595. { value: "1", label: "星期一" },
  596. { value: "2", label: "星期二" },
  597. { value: "3", label: "星期三" },
  598. { value: "4", label: "星期四" },
  599. { value: "5", label: "星期五" },
  600. { value: "6", label: "星期六" },
  601. { value: "7", label: "星期日" }
  602. ],
  603. activeList: [],
  604. educationList: [],
  605. timers: null,
  606. markAttendance: {
  607. // 考勤状态
  608. status: false,
  609. dataInfo: {}
  610. },
  611. bigin: this.beginDate(),
  612. rollCall: { // 点名表
  613. status: false,
  614. gridData: [],
  615. selectItem: {}, // 选中状态
  616. limit: 10, // 限制显示条数
  617. page: 1, // 当前页
  618. total: 0, // 总条数
  619. page_size: [10, 20, 40, 50] // 选择限制显示条数
  620. },
  621. accompanTime: 25
  622. };
  623. },
  624. mounted () {
  625. this.init();
  626. },
  627. methods: {
  628. init () {
  629. this.practiceId = this.$route.query.id;
  630. this.userId = this.$route.query.userId;
  631. this.courseType = this.$route.query.type;
  632. // 获取乐团主管
  633. findEducationUsers().then(res => {
  634. if (res.code == 200) {
  635. this.educationList = res.data
  636. }
  637. });
  638. // <!-- 状态 指导老师 活动方案-->
  639. getTeacher({ organId: this.organId }).then(res => {
  640. if (res.code == 200) {
  641. this.teacherList = res.data;
  642. }
  643. });
  644. // 获取默认声部信息
  645. getPracticeApplySubjects().then(res => {
  646. if (res.code == 200) {
  647. this.subjectList = res.data;
  648. }
  649. });
  650. // 获取课程组信息
  651. this.courseOption = this.coursesDate();
  652. this.getCourseGroup();
  653. this.getList();
  654. },
  655. onCallName (item) { // 点名表
  656. this.rollCall.page = 1
  657. this.rollCall.selectItem = item
  658. this.getCallName()
  659. },
  660. getCallName () {
  661. let rollCall = this.rollCall
  662. let params = {
  663. page: rollCall.page,
  664. rows: rollCall.limit,
  665. courseScheduleId: rollCall.selectItem.id
  666. }
  667. findAttendanceStudentByCourseWithPage(params).then(res => {
  668. let result = res.data
  669. rollCall.status = true
  670. if (res.code == 200) {
  671. rollCall.gridData = result.rows
  672. rollCall.total = result.total
  673. }
  674. })
  675. },
  676. onChangeRollCall (type, row) {
  677. let rollCall = this.rollCall
  678. let params = {
  679. courseScheduleId: rollCall.selectItem.id,
  680. studentAttendances: [{
  681. userId: row.studentId,
  682. status: type
  683. }]
  684. }
  685. updateStudentAttendances(params).then(res => {
  686. if (res.code == 200) {
  687. this.$message.success('修改成功')
  688. row.status = type
  689. this.getList()
  690. } else {
  691. this.$message.error(res.msg)
  692. }
  693. })
  694. },
  695. lookStudents (row) {
  696. let id = row.id;
  697. getStudyStudents({ courseScheduleId: id }).then(res => {
  698. if (res.code == 200) {
  699. this.studentList = res.data;
  700. this.studentVisible = true;
  701. }
  702. })
  703. },
  704. getCourseGroup () {
  705. practiceGroupManage({ search: this.practiceId }).then(res => {
  706. if (res.code == 200) {
  707. this.courseData = res.data.rows;
  708. if (this.courseData.length > 0) {
  709. this.name = this.courseData[0].name;
  710. this.expireForm.coursesExpireDate = this.courseData[0].coursesExpireDate.substring(0, 10);
  711. this.timers =
  712. this.courseData[0].coursesStartDate.substring(0, 10) +
  713. "至" +
  714. this.courseData[0].coursesExpireDate.substring(0, 10);
  715. let originalStartDate = this.courseData[0].coursesStartDate ? new Date(this.courseData[0].coursesStartDate) : new Date()
  716. let buyMonths = this.courseData[0].buyMonths
  717. let lastDayNum = nextMonthLastDay(originalStartDate.getFullYear(), (originalStartDate.getMonth() + buyMonths + 1))
  718. if (lastDayNum[2] >= originalStartDate.getDate()) {
  719. originalStartDate.setMonth(originalStartDate.getMonth() + buyMonths)
  720. } else {
  721. originalStartDate = new Date(lastDayNum.join('-'))
  722. }
  723. originalStartDate.setDate(originalStartDate.getDate() - 1)
  724. let overTime = originalStartDate.getFullYear() + '-' + (originalStartDate.getMonth() + 1) + '-' + originalStartDate.getDate()
  725. this.expireForm.tempCoursesExpireDate = overTime
  726. }
  727. }
  728. });
  729. },
  730. permission (str, parent) {
  731. return permission(str, parent);
  732. },
  733. beginDate () {
  734. let self = this
  735. return {
  736. firstDayOfWeek: 1,
  737. disabledDate (time) {
  738. if (self.expireForm.tempCoursesExpireDate) {
  739. return new Date(self.expireForm.tempCoursesExpireDate).getTime() > time.getTime()
  740. } else {
  741. return time.getTime() >= Date.now()
  742. //开始时间不选时,结束时间最大值小于等于当天
  743. }
  744. }
  745. }
  746. },
  747. submitExpireDate () {
  748. this.$refs.expireForm.validate(some => {
  749. if (some) {
  750. updateCoursesExpireDate({
  751. practiceGroupId: this.practiceId,
  752. coursesExpireDate: this.expireForm.coursesExpireDate
  753. }).then(res => {
  754. if (res.code == 200) {
  755. this.$message.success("有效期修改成功")
  756. this.expireVisible = false
  757. this.getCourseGroup()
  758. this.getList();
  759. } else {
  760. this.$message.error(res.msg)
  761. }
  762. })
  763. } else {
  764. return;
  765. }
  766. });
  767. },
  768. onMarkAttendance (item) {
  769. // 补考勤
  770. this.markAttendance = {
  771. status: true,
  772. dataInfo: item
  773. };
  774. },
  775. batchAdjustmentTime () {
  776. let tempData = this.markAttendance.dataInfo;
  777. let params = {
  778. teacherId: tempData.actualTeacherId,
  779. courseScheduleId: tempData.id,
  780. signInStatus: 1,
  781. signOutStatus: 1
  782. };
  783. updateTeacherAttendance(params).then(res => {
  784. if (res.code == 200) {
  785. this.$message.success("补卡成功");
  786. this.markAttendance.status = false;
  787. this.getList();
  788. } else {
  789. this.$message.error(res.msg);
  790. }
  791. });
  792. },
  793. getList () {
  794. // 乔乔说后台分页数据是假的所以不分页 page: this.rules.page, rows: this.rules.limit this.rules.total = res.data.pageInfo.total;
  795. findPracticeGroupCourseSchedules({ practiceId: this.practiceId, }).then(
  796. res => {
  797. if (res.code == 200) {
  798. this.tableList = res.data.pageInfo.rows;
  799. }
  800. }
  801. );
  802. },
  803. goBack () {
  804. this.$store.dispatch('delVisitedViews', this.$route)
  805. this.$router.push({
  806. path: "/business/accompany"
  807. });
  808. },
  809. teacherClose () {
  810. this.isMultiple = false;
  811. this.teacherForm.teacher = null;
  812. this.teacherVisible = false;
  813. },
  814. handleClose () {
  815. console.log(true)
  816. this.$refs["maskForm"].resetFields();
  817. this.courseVisible = false;
  818. // this.startTime = "";
  819. // this.maskForm = {
  820. // date: "",
  821. // startTime: "",
  822. // id: ""
  823. // };
  824. },
  825. expireClose () {
  826. this.expireVisible = false;
  827. this.expireForm.coursesExpireDate = null
  828. this.$refs["expireForm"].resetFields();
  829. },
  830. submitResetClass () {
  831. // endClassTimeStr: this.maskForm.endTime,
  832. this.$refs.maskForm.validate(valid => {
  833. if(valid) {
  834. let obj = {
  835. startClassTime: dayjs(this.maskForm.date + ' ' + this.maskForm.startTime).format('YYYY-MM-DD HH:mm:ss'),
  836. id: this.maskForm.id,
  837. classDate: this.maskForm.date,
  838. groupType: 'PRACTICE'
  839. };
  840. resetCourse(obj).then(res => {
  841. if (res.code == 200) {
  842. this.$message.success("修改成功");
  843. this.courseVisible = false;
  844. this.getList();
  845. }
  846. });
  847. }
  848. })
  849. // if (!this.startTime) {
  850. // this.$message.error("请填写修改时间");
  851. // return;
  852. // }
  853. // let obj = {
  854. // startClassTime: dayjs(this.maskForm.date + ' ' + this.startTime).format('YYYY-MM-DD HH:mm:ss'),
  855. // id: this.maskForm.id,
  856. // classDate: this.maskForm.date,
  857. // groupType: 'PRACTICE'
  858. // };
  859. // resetCourse(obj).then(res => {
  860. // if (res.code == 200) {
  861. // this.$message.success("修改成功");
  862. // this.courseVisible = false;
  863. // this.getList();
  864. // }
  865. // });
  866. },
  867. resetClass (row) {
  868. /**
  869. * maskForm.startTime
  870. *
  871. */
  872. this.$nextTick(() => {
  873. this.maskForm = {
  874. date: dayjs(row.classDate).format('YYYY-MM-DD'),
  875. startTime: row.startClassTimeStr.substring(0, 5),
  876. endTime: row.endClassTimeStr.substring(0, 5),
  877. id: row.id
  878. }
  879. // this.startTime = row.startClassTimeStr.substring(0, 5);
  880. })
  881. this.coursesExpireDate = row.coursesExpireDate;
  882. // 修改课时
  883. this.courseVisible = true;
  884. },
  885. resetTeacher (row) {
  886. // 单节课
  887. this.isMultiple = false;
  888. this.activeRow = row;
  889. this.teacherForm.teacher = row.actualTeacherId;
  890. this.teacherVisible = true;
  891. },
  892. resetTeachers () {
  893. // 课程组
  894. this.isMultiple = true;
  895. this.teacherForm.teacher = this.courseData[0].userId;
  896. this.teacherForm.name = this.courseData[0].name;
  897. this.teacherForm.subjectId = this.courseData[0].subjectId;
  898. this.teacherForm.educationalTeacherId = this.courseData[0].educationalTeacherId || null;
  899. this.teacherVisible = true;
  900. },
  901. // 提交课程组修改
  902. subresetTeacher () {
  903. this.$refs.teacherForm.validate(some => {
  904. if (some) {
  905. if (this.isMultiple) {
  906. // 修改课程组老师
  907. practiceGroupTeacherAdjust({
  908. practiceGroupId: this.practiceId,
  909. teacherId: this.teacherForm.teacher,
  910. subjectId: this.teacherForm.subjectId,
  911. educationalTeacherId: this.teacherForm.educationalTeacherId
  912. }).then(res => {
  913. if (res.code == 200) {
  914. this.$message.success("修改成功");
  915. this.getCourseGroup();
  916. this.getList();
  917. this.teacherVisible = false;
  918. }
  919. });
  920. } else {
  921. // 修改单节课老师
  922. practiceCourseTeacherAdjust({
  923. courseScheduleId: this.activeRow.id,
  924. teacherId: this.teacherForm.teacher
  925. }).then(res => {
  926. if (res.code == 200) {
  927. this.$message.success("修改成功");
  928. this.getList();
  929. this.teacherVisible = false;
  930. }
  931. });
  932. }
  933. } else {
  934. return;
  935. }
  936. });
  937. },
  938. coursesDate () {
  939. let self = this;
  940. return {
  941. firstDayOfWeek: 1,
  942. disabledDate: time => {
  943. // if (self.leftForm.courseStart) {
  944. // let date = new Date(self.leftForm.courseStart.replace(/-/, "/"));
  945. // coursesExpireDate
  946. let date = new Date(this.coursesExpireDate.replace(/-/, "/"));
  947. return time.getTime() > date.getTime();
  948. // }
  949. // return;
  950. }
  951. };
  952. },
  953. // 是否允许批量调整
  954. isDisabled (row, index) {
  955. // || !row.isCallNames
  956. if (row.isSettlement) {
  957. return false;
  958. } else {
  959. return true;
  960. }
  961. },
  962. onCourseExpireDate () {
  963. // 修改课程有效期
  964. },
  965. adjustment () {
  966. this.adjustmentName = "批量调整";
  967. this.isaddCourse = false;
  968. if (this.adjustmentForm.count <= 0) {
  969. this.$message.error("请至少勾选一节课");
  970. } else {
  971. this.adjustmentVisible = true;
  972. }
  973. },
  974. changeSound (val) {
  975. if (val) {
  976. this.subjectList.forEach(item => {
  977. if (item.id == val) {
  978. let strArr = this.teacherForm.name.split("•");
  979. this.teacherForm.name = item.name + "•" + strArr[1];
  980. }
  981. });
  982. }
  983. },
  984. addWeek () {
  985. // 添加循环周期
  986. this.weekList.push({
  987. dayOfWeek: "",
  988. startClassTime: "",
  989. endClassTime: "",
  990. id: new Date()
  991. });
  992. },
  993. // 删除循环周
  994. removeWeek (item) {
  995. for (let i in this.weekList) {
  996. if (this.weekList[i].id == item.id) {
  997. this.weekList.splice(i, 1);
  998. }
  999. }
  1000. },
  1001. // 批量调整
  1002. submitAdjustment () {
  1003. this.$refs["adjustmentForm"].validate(item => {
  1004. if (item) {
  1005. let week = this.weekList;
  1006. if (!week[0] || !week[0].startClassTime || !week[0].dayOfWeek) {
  1007. this.$message.error("至少排一节课");
  1008. return;
  1009. }
  1010. // 开始
  1011. let obj = {};
  1012. let idArr = this.activeList.map(item => {
  1013. return item.id;
  1014. });
  1015. // courseScheduleIdList
  1016. let courseScheduleIdList = idArr;
  1017. obj.courseScheduleIdList = courseScheduleIdList;
  1018. obj.startDate = this.adjustmentForm.courseTime;
  1019. obj.coursesTimes = this.adjustmentForm.addCount;
  1020. obj.teachingArrangementList = this.weekList;
  1021. obj.isJumpHoliday = this.adjustmentForm.checked;
  1022. obj.musicGroupId = this.practiceId;
  1023. obj.teachMode = "ONLINE";
  1024. obj.type = "PRACTICE";
  1025. batchUpdateCourseSchedule(obj).then(res => {
  1026. if (res.code == 200) {
  1027. this.$message.success("恭喜您修改成功");
  1028. this.adjustmentVisible = false;
  1029. this.getList();
  1030. }
  1031. });
  1032. }
  1033. });
  1034. },
  1035. handleSelectionChange (val) {
  1036. this.adjustmentForm.count = val.length;
  1037. this.activeList = val;
  1038. },
  1039. clearAttend (row) {
  1040. this.$confirm("是否清除考勤记录?", "提示", {
  1041. confirmButtonText: "确定",
  1042. cancelButtonText: "取消",
  1043. type: "warning"
  1044. })
  1045. .then(() => {
  1046. cleanAttendance({ courseScheduleIds: row.id }).then(res => {
  1047. if (res.code == 200) {
  1048. this.$message.success("清除成功");
  1049. this.getList();
  1050. } else {
  1051. this.$message.error(res.msg);
  1052. }
  1053. });
  1054. })
  1055. .catch(() => { });
  1056. },
  1057. // 网管课加课弹窗
  1058. addCourse () {
  1059. this.adjustmentName = "网管课加课";
  1060. this.isaddCourse = true;
  1061. this.adjustmentVisible = true;
  1062. },
  1063. // 网管课加课提交
  1064. addCourseSubmit () {
  1065. this.$refs["adjustmentForm"].validate(item => {
  1066. if (item) {
  1067. let week = this.weekList;
  1068. if (!week[0] || !week[0].startClassTime || !week[0].dayOfWeek) {
  1069. this.$message.error("至少排一节课");
  1070. return;
  1071. }
  1072. // 开始
  1073. let obj = {};
  1074. obj.startDate = this.adjustmentForm.courseTime;
  1075. obj.coursesTimes = this.adjustmentForm.addCount;
  1076. obj.teachingArrangementList = this.weekList;
  1077. obj.isJumpHoliday = this.adjustmentForm.checked;
  1078. obj.musicGroupId = this.practiceId;
  1079. obj.teachMode = "ONLINE";
  1080. obj.type = "PRACTICE";
  1081. batchAddCourses(obj).then(res => {
  1082. if (res.code == 200) {
  1083. this.$message.success("恭喜您添加成功");
  1084. this.adjustmentVisible = false;
  1085. this.getList();
  1086. }
  1087. });
  1088. }
  1089. });
  1090. },
  1091. // 删除
  1092. removeClass (row) {
  1093. this.$confirm("是否删除该课程?", "提示", {
  1094. confirmButtonText: "确定",
  1095. cancelButtonText: "取消",
  1096. type: "warning"
  1097. }).then(() => {
  1098. bathDelete({ courseScheduleIds: row.id }).then(res => {
  1099. if (res.code == 200) {
  1100. this.$message.success("删除成功");
  1101. this.getList();
  1102. }
  1103. });
  1104. });
  1105. },
  1106. changeStartTime (val) {
  1107. this.$nextTick(res => {
  1108. if (val) {
  1109. this.$set(this.maskForm, 'endTime', addTimerFormMinute(this.maskForm.date, val, this.accompanTime))
  1110. } else {
  1111. this.$set(this.maskForm, 'endTime', '')
  1112. }
  1113. })
  1114. },
  1115. changeStartTimes (val, item) {
  1116. this.$nextTick(res => {
  1117. if (val) {
  1118. let str = dayjs(new Date()).format('YYYY-MM-DD')
  1119. this.$set(item, 'endClassTime', addTimerFormMinute(str, val, this.accompanTime))
  1120. } else {
  1121. this.$set(item, 'endClassTime', '')
  1122. }
  1123. })
  1124. }
  1125. },
  1126. filters: {
  1127. studentCallName: value => {
  1128. let template = {
  1129. NORMAL: "到课",
  1130. TRUANT: "未到",
  1131. LEAVE: "请假",
  1132. DROP_OUT: "退学",
  1133. '': '未到'
  1134. }
  1135. return template[value]
  1136. }
  1137. },
  1138. watch: {
  1139. adjustmentVisible (val) {
  1140. if (!val) {
  1141. this.$refs.adjustmentForm.resetFields();
  1142. }
  1143. }
  1144. }
  1145. };
  1146. </script>
  1147. <style lang="scss" scoped>
  1148. .titlewrap {
  1149. display: flex;
  1150. flex-direction: row;
  1151. justify-content: flex-start;
  1152. align-items: center;
  1153. }
  1154. .wrap {
  1155. display: flex;
  1156. flex-direction: row;
  1157. justify-content: flex-start;
  1158. div {
  1159. margin-right: 20px;
  1160. }
  1161. }
  1162. .countWrap {
  1163. /deep/.el-date-editor.el-input,
  1164. /deep/.el-date-editor.el-input__inner {
  1165. width: 100px !important;
  1166. }
  1167. }
  1168. </style>