forecastName.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. <template>
  2. <div class="forecastName">
  3. <!-- <h2> m-container
  4. <el-page-header @back="onCancel" :content="teamName"></el-page-header>
  5. </h2> -->
  6. <!-- <p style="margin-bottom: 15px; font-size: 18px; font-weight: 400">
  7. 缴费截止时间:{{ '2020-12-12' | formatTimer }}
  8. </p> -->
  9. <div class="btnList">
  10. <auth :auths="['musicGroup/sendParentMeetingNotice']" v-if="isedit || $route.query.team_status=='PRE_BUILD_FEE'">
  11. <el-button type="primary" @click="extendPaymentStatus = true"
  12. >预报名家长会通知</el-button
  13. >
  14. </auth>
  15. <auth :auths="['forecastName/forecastLink']" v-if="isedit">
  16. <el-button type="primary" @click="codeStatus = true"
  17. >预报名问卷</el-button
  18. >
  19. </auth>
  20. <auth :auths="['studentRegistration/preRegisterExport']">
  21. <el-button type="primary" @click="downloadFile"
  22. >预报名信息导出</el-button
  23. >
  24. </auth>
  25. <auth :auths="['studentRegistration/queryPreApplySubjectList']">
  26. <el-button type="primary" @click="subjectVisible = true"
  27. >意向统计</el-button
  28. >
  29. </auth>
  30. <auth :auths="['musicGroup/finishPreApply']">
  31. <el-button type="primary" @click="onPaymentGroup" v-if="isedit"
  32. >乐团缴费</el-button
  33. >
  34. </auth>
  35. <auth :auths="['musicGroup/finishPreApply/item']" v-if="isedit">
  36. <el-button type="primary" @click="onPaymentGroup(1)"
  37. >特色乐团缴费</el-button
  38. >
  39. </auth>
  40. <el-button type="primary" @click="codedetailStatus = true" v-if="isedit"
  41. >预报名H5统计</el-button
  42. >
  43. </div>
  44. <div class="m-core">
  45. <save-form
  46. :inline="true"
  47. @reset="onReSet"
  48. @submit="search"
  49. :model="searchForm"
  50. save-key="/forecastName"
  51. ref="searchForm"
  52. >
  53. <el-form-item prop="name">
  54. <el-input
  55. v-model.trim="searchForm.name"
  56. clearable
  57. @keyup.enter.native="search"
  58. placeholder="学生编号/姓名/手机号"
  59. ></el-input>
  60. </el-form-item>
  61. <el-form-item prop="isAllowAdjust">
  62. <el-select
  63. v-model.trim="searchForm.isAllowAdjust"
  64. clearable
  65. placeholder="是否允许调剂"
  66. >
  67. <el-option label="是" :value="1"></el-option>
  68. <el-option label="否" :value="0"></el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item prop="teacherRecommandSubjectId">
  72. <el-select
  73. clearable
  74. v-model="searchForm.teacherRecommandSubjectId"
  75. placeholder="老师推荐声部"
  76. >
  77. <el-option
  78. v-for="item in subjectList"
  79. :value="item.id"
  80. :label="item.name"
  81. :key="item.id"
  82. ></el-option>
  83. </el-select>
  84. </el-form-item>
  85. <el-form-item prop="selectionSubjectId">
  86. <el-select
  87. clearable
  88. v-model="searchForm.selectionSubjectId"
  89. placeholder="选报声部"
  90. >
  91. <el-option
  92. v-for="item in selects.subjects"
  93. :value="item.id"
  94. :label="item.name"
  95. :key="item.id"
  96. ></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item prop="subjectId">
  100. <el-select
  101. clearable
  102. v-model="searchForm.subjectId"
  103. placeholder="所选专业"
  104. >
  105. <el-option
  106. v-for="item in selects.subjects"
  107. :value="item.id"
  108. :label="item.name"
  109. :key="item.id"
  110. ></el-option>
  111. </el-select>
  112. </el-form-item>
  113. <!-- kitPurchaseMethod -->
  114. <el-form-item prop="kitPurchaseMethod">
  115. <el-select
  116. v-model.trim="searchForm.kitPurchaseMethod"
  117. clearable
  118. placeholder="乐器准备方式"
  119. >
  120. <el-option label="团购" value="GROUP"></el-option>
  121. <el-option label="自备" value="OWNED"></el-option>
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item prop="cloudTeacherMethod">
  125. <el-select
  126. v-model.trim="searchForm.cloudTeacherMethod"
  127. clearable
  128. placeholder="系统意向"
  129. >
  130. <el-option label="团购" value="GROUP"></el-option>
  131. <el-option label="自备" value="OWNED"></el-option>
  132. </el-select>
  133. </el-form-item>
  134. <el-form-item>
  135. <el-button type="danger" native-type="seach">搜索</el-button>
  136. <el-button native-type="reset" type="primary">重置</el-button>
  137. </el-form-item>
  138. </save-form>
  139. <div class="tableWrap">
  140. <el-table
  141. style="width: 100%"
  142. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  143. :data="tableList"
  144. >
  145. <el-table-column align="center" prop="userId" label="学员编号">
  146. <template slot-scope="scope">
  147. <copy-text>{{ scope.row.userId }}</copy-text>
  148. </template>
  149. </el-table-column>
  150. <el-table-column
  151. align="center"
  152. prop="userName"
  153. label="学员姓名"
  154. ></el-table-column>
  155. <el-table-column align="center" prop="gender" label="性别">
  156. <template slot-scope="scope">
  157. {{ scope.row.gender ? "男" : "女" }}
  158. </template>
  159. </el-table-column>
  160. <el-table-column align="center" prop="phone" label="联系电话">
  161. <template slot-scope="scope">
  162. <copy-text>{{ scope.row.phone }}</copy-text>
  163. </template>
  164. </el-table-column>
  165. <el-table-column align="center" label="年级班级">
  166. <template slot-scope="scope">
  167. {{ scope.row.currentGrade }}{{ scope.row.currentClass }}
  168. </template>
  169. </el-table-column>
  170. <el-table-column
  171. align="center"
  172. prop="teacherRecommandSubjectId"
  173. label="老师推荐声部"
  174. >
  175. <template slot-scope="scope">
  176. {{
  177. scope.row.teacherRecommandSubjectId
  178. ? scope.row.teacherRecommandSubjectName
  179. : null
  180. }}
  181. {{
  182. !scope.row.teacherRecommandSubjectName &&
  183. scope.row.teacherRecommandSubjectId == 999
  184. ? "听从老师安排"
  185. : null
  186. }}
  187. {{
  188. scope.row.teacherRecommandSubjectId == -1 &&
  189. !scope.row.teacherRecommandSubjectName
  190. ? "无"
  191. : null
  192. }}
  193. </template>
  194. </el-table-column>
  195. <el-table-column
  196. align="center"
  197. prop="selectionSubjectId"
  198. label="选报声部"
  199. >
  200. <template slot-scope="scope">
  201. {{
  202. scope.row.selectionSubjectId
  203. ? scope.row.selectionSubjectName
  204. : null
  205. }}
  206. {{
  207. !scope.row.selectionSubjectName &&
  208. scope.row.selectionSubjectId == 999
  209. ? "听从老师安排"
  210. : null
  211. }}
  212. {{
  213. !scope.row.selectionSubjectId && !scope.row.selectionSubjectName
  214. ? "无"
  215. : null
  216. }}
  217. </template>
  218. </el-table-column>
  219. <el-table-column
  220. align="center"
  221. prop="subjectFirstName"
  222. label="选报声部1"
  223. >
  224. <template slot-scope="scope">
  225. {{
  226. scope.row.subjectFirstName ? scope.row.subjectFirstName : null
  227. }}
  228. {{
  229. !scope.row.subjectFirstName && scope.row.subjectFirst == 999
  230. ? "听从老师安排"
  231. : null
  232. }}
  233. {{
  234. !scope.row.subjectFirstName && !scope.row.subjectFirst
  235. ? "无"
  236. : null
  237. }}
  238. </template>
  239. </el-table-column>
  240. <el-table-column
  241. align="center"
  242. prop="subjectSecondName"
  243. label="选报声部2"
  244. >
  245. <template slot-scope="scope">
  246. {{
  247. scope.row.subjectSecondName ? scope.row.subjectSecondName : null
  248. }}
  249. {{
  250. !scope.row.subjectSecondName && scope.row.subjectSecond == 999
  251. ? "听从老师安排"
  252. : null
  253. }}
  254. {{
  255. !scope.row.subjectSecondName && !scope.row.subjectSecond
  256. ? "无"
  257. : null
  258. }}
  259. </template>
  260. </el-table-column>
  261. <el-table-column
  262. align="center"
  263. prop="isAllowAdjust"
  264. label="是否服从调剂"
  265. >
  266. <template slot-scope="scope">
  267. {{ scope.row.isAllowAdjust ? "是" : "否" }}
  268. </template>
  269. </el-table-column>
  270. <el-table-column align="center" label="乐器准备方式">
  271. <template slot-scope="scope">
  272. {{ scope.row.kitPurchaseMethod | instrumentType }}
  273. </template>
  274. </el-table-column>
  275. <el-table-column align="center" label="系统意向">
  276. <template slot-scope="scope">
  277. {{ scope.row.cloudTeacherMethod | instrumentType }}
  278. </template>
  279. </el-table-column>
  280. <el-table-column
  281. align="center"
  282. prop="courseScheduleId"
  283. width="150"
  284. label="操作"
  285. v-if="isedit"
  286. >
  287. <!-- :router="['/business/forecastName']" -->
  288. <template slot-scope="scope">
  289. <auth :auths="['visit/add/teamForecastName']">
  290. <el-button type="text" @click="addVisited(scope.row)"
  291. >新增回访</el-button
  292. >
  293. </auth>
  294. </template>
  295. </el-table-column>
  296. </el-table>
  297. <pagination
  298. save-key="/forecastName"
  299. sync
  300. :total.sync="pageInfo.total"
  301. :page.sync="pageInfo.page"
  302. :limit.sync="pageInfo.limit"
  303. :page-sizes="pageInfo.page_size"
  304. @pagination="getList"
  305. />
  306. </div>
  307. </div>
  308. <!-- 预报名链接 -->
  309. <qr-code
  310. v-model="codeStatus"
  311. title="预报名问卷"
  312. :codeUrl="codeUrl"
  313. @preLook="preLook"
  314. :ispreLook="true"
  315. />
  316. <!-- 预报名详情 -->
  317. <qr-code
  318. v-model="codedetailStatus"
  319. title="预报名H5统计"
  320. :codeUrl="detailUrl"
  321. />
  322. <!-- 发送家长会通知 -->
  323. <el-dialog
  324. title="预报名家长会通知"
  325. :visible.sync="extendPaymentStatus"
  326. @close="onClose('extendForm')"
  327. width="400px"
  328. >
  329. <parentsMeeting
  330. v-if="extendPaymentStatus"
  331. ref="extendForm"
  332. :extendForm="extendForm"
  333. :sysMsgStr="sysMsgStr"
  334. :msg="'确认后该短信将发送给已填写预报名问卷的学员'"
  335. />
  336. <div slot="footer" class="dialog-footer">
  337. <el-button @click="extendPaymentStatus = false">取 消</el-button>
  338. <el-button type="primary" @click="onExtendPayment('extendForm')"
  339. >确 定</el-button
  340. >
  341. </div>
  342. </el-dialog>
  343. <!-- 回访记录 -->
  344. <el-dialog
  345. title="新增回访"
  346. width="600px"
  347. v-if="visitVisible"
  348. :close-on-click-modal="false"
  349. :visible.sync="visitVisible"
  350. >
  351. <visit-model
  352. v-if="visitVisible"
  353. @close="visitVisible = false"
  354. :detail="visitDetail"
  355. @submited="getList"
  356. />
  357. </el-dialog>
  358. <!-- 回访记录 -->
  359. <el-dialog
  360. title="意向统计"
  361. width="600px"
  362. :close-on-click-modal="false"
  363. :visible.sync="subjectVisible"
  364. v-if="subjectVisible"
  365. >
  366. <intention-model v-if="subjectVisible" @close="subjectVisible = false" />
  367. </el-dialog>
  368. <el-dialog
  369. title="预览"
  370. width="500px"
  371. :close-on-click-modal="false"
  372. append-to-body
  373. :visible.sync="preLookVisible"
  374. >
  375. <iframe
  376. width="100%"
  377. height="600px"
  378. :src="codeUrl + '&look=true'"
  379. frameborder="0"
  380. ></iframe>
  381. </el-dialog>
  382. </div>
  383. </template>
  384. <script>
  385. import pagination from "@/components/Pagination/index";
  386. import qrCode from "@/components/QrCode/index";
  387. import { permission } from "@/utils/directivePage";
  388. import { vaildStudentUrl, vaildTeachingUrl } from "@/utils/validate";
  389. import { Export } from "@/utils/downLoadFile";
  390. import visitModel from "@/views/withdrawal-application/modals/visit";
  391. import intentionModel from "./modals/intention";
  392. import parentsMeeting from './modals/parentsMeeting'
  393. import {
  394. queryPreApplyList,
  395. finishPreApply,
  396. sendParentMeetingNotice,
  397. getSysMessageConfig,
  398. } from "./api";
  399. export default {
  400. name: "forecastName",
  401. components: { pagination, qrCode, visitModel, intentionModel,parentsMeeting },
  402. props: ["isedit"],
  403. data() {
  404. const query = this.$route.query;
  405. return {
  406. codedetailStatus: false,
  407. teamName: query.name || null,
  408. codeStatus: false,
  409. musicGroupId: query.id,
  410. codeUrl:
  411. vaildStudentUrl() +
  412. "/project/forecastName/index.html?musicGroupId=" +
  413. query.id,
  414. searchForm: {
  415. name: null,
  416. subjectId: null,
  417. teacherRecommandSubjectId: null,
  418. selectionSubjectId: null,
  419. isAllowAdjust: null,
  420. cloudTeacherMethod: null,
  421. kitPurchaseMethod: null,
  422. },
  423. tableList: [],
  424. pageInfo: {
  425. // 分页规则
  426. limit: 10, // 限制显示条数
  427. page: 1, // 当前页
  428. total: 0, // 总条数
  429. page_size: [10, 20, 40, 50], // 选择限制显示条数
  430. },
  431. visitVisible: false,
  432. subjectVisible: false,
  433. visitDetail: null,
  434. extendPaymentStatus: false,
  435. extendForm: {
  436. meetingDate: null,
  437. address: null,
  438. },
  439. extendRule: {
  440. meetingDate: [
  441. { required: true, message: "请选择家长会时间", trigger: "change" },
  442. ],
  443. address: [
  444. { required: true, message: "请输入家长会地址", trigger: "blur" },
  445. ],
  446. },
  447. preLookVisible: false,
  448. sysMsg: "",
  449. subjectList: [],
  450. tenantId:null
  451. };
  452. },
  453. async mounted() {
  454. this.tenantId= this.$helpers.tenantId
  455. await this.$store.dispatch("setSubjects");
  456. // 获取短信推送模板
  457. this.subjectList = [...this.selects.subjects];
  458. this.subjectList.push({ id: -1, name: "无" });
  459. const rus = await getSysMessageConfig({
  460. type: "STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE",
  461. });
  462. this.sysMsg = rus.data?.content||'';
  463. this.getList();
  464. },
  465. methods: {
  466. permission,
  467. onReSet() {
  468. this.$refs["searchForm"].resetFields();
  469. this.search();
  470. },
  471. search() {
  472. this.pageInfo.page = 1;
  473. this.getList();
  474. },
  475. onCancel() {
  476. this.$store.dispatch("delVisitedViews", this.$route);
  477. this.$router.push({ path: "/teamList" });
  478. },
  479. downloadFile() {
  480. let params = this.searchForm;
  481. Export(
  482. this,
  483. {
  484. url: "/api-web/studentRegistration/preRegisterExport",
  485. params: {
  486. ...params,
  487. musicGroupId: this.musicGroupId,
  488. },
  489. fileName: "预报名列表.xls",
  490. },
  491. "是否确认导出报表?"
  492. );
  493. },
  494. async getList() {
  495. try {
  496. const result = await queryPreApplyList({
  497. ...this.searchForm,
  498. musicGroupId: this.musicGroupId,
  499. page: this.pageInfo.page,
  500. rows: this.pageInfo.limit,
  501. });
  502. this.tableList = result.data.rows;
  503. this.pageInfo.total = result.data.total;
  504. } catch (error) {}
  505. },
  506. async onPaymentGroup(type) {
  507. try {
  508. this.$confirm("您是否确定开启乐团缴费?", "提示", {
  509. confirmButtonText: "确定",
  510. cancelButtonText: "取消",
  511. type: "warning",
  512. }).then(async () => {
  513. const result = await finishPreApply({
  514. isCheckStudentNum: type == 1 ? false : true,
  515. musicGroupId: this.musicGroupId,
  516. });
  517. this.$store.dispatch("delVisitedViews", this.$route);
  518. this.$router.push({
  519. path: "/teamList",
  520. });
  521. });
  522. } catch (error) {}
  523. },
  524. addVisited(rows) {
  525. // 新增回访
  526. this.visitVisible = true;
  527. this.visitDetail = {
  528. musicGroupId: rows.musicGroupId,
  529. overview: "",
  530. purpose: "",
  531. userId: rows.userId,
  532. type: "",
  533. visitTime: "",
  534. visitType: "",
  535. feedback: "",
  536. realName: rows.userName,
  537. };
  538. // this.visitDetail = rows
  539. },
  540. onClose(formName) {
  541. this.extendForm= {
  542. meetingDate: null,
  543. address: null,
  544. }
  545. // this.$refs[formName].$refs[formName].resetFields();
  546. },
  547. onExtendPayment(formName) {
  548. // console.log(formName)
  549. // console.log(this.$refs)
  550. // return
  551. this.$refs[formName].$refs[formName].validate(async (valid) => {
  552. if (valid) {
  553. try {
  554. await this.$confirm("您是否确定发送家长会通知?", "提示", {
  555. confirmButtonText: "确定",
  556. cancelButtonText: "取消",
  557. type: "warning",
  558. });
  559. await sendParentMeetingNotice({
  560. ...this.extendForm,
  561. musicGroupId: this.musicGroupId,
  562. });
  563. this.$message.success("家长会通知已发送");
  564. this.extendPaymentStatus = false;
  565. } catch (error) {}
  566. }
  567. });
  568. },
  569. applyDates() {
  570. return {
  571. firstDayOfWeek: 1,
  572. disabledDate(time) {
  573. if (end) {
  574. return new Date(end).getTime() - 86400000 >= time.getTime();
  575. } else {
  576. return time.getTime() + 86400000 < Date.now();
  577. //开始时间不选时,结束时间最大值小于等于当天
  578. }
  579. },
  580. };
  581. },
  582. preLook(val) {
  583. this.preLookVisible = true;
  584. },
  585. },
  586. computed: {
  587. sysMsgStr() {
  588. let strArr = this.sysMsg.split("{}");
  589. if (strArr.length == 3) {
  590. return `${strArr[0]}<span style="color:red">"${
  591. this.extendForm.meetingDate ? this.extendForm.meetingDate : "--"
  592. }"</span>${strArr[1]}<span style="color:red">"${
  593. this.extendForm.address ? this.extendForm.address : "--"
  594. }"</span>
  595. ${strArr[2]}`;
  596. } else {
  597. return ``;
  598. }
  599. },
  600. detailUrl(){
  601. return vaildTeachingUrl() + "/#/preApplySubject?musicGroupId=" + this.$route.query.id+'&tenantId='+this.tenantId
  602. }
  603. },
  604. };
  605. </script>
  606. <style lang="less" scoped>
  607. .msgP {
  608. line-height: 24px;
  609. margin-top: 10px;
  610. }
  611. </style>