sporadicList.vue 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 零星管理
  6. </h2>
  7. <div class="m-core">
  8. <!-- v-permission="'sporadicChargeInfo/add'" -->
  9. <save-form
  10. :inline="true"
  11. :model="searchForm"
  12. @submit="search"
  13. @reset="onReSet"
  14. >
  15. <el-form-item>
  16. <el-input
  17. placeholder="标题或学生姓名"
  18. clearable
  19. v-model.trim="searchForm.search"
  20. ></el-input>
  21. </el-form-item>
  22. <el-form-item>
  23. <el-select
  24. v-model.trim="searchForm.organId"
  25. placeholder="请选择分部"
  26. clearable
  27. filterable
  28. >
  29. <el-option
  30. v-for="(item, index) in selects.branchs"
  31. :key="index"
  32. :value="item.id"
  33. :label="item.name"
  34. ></el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item>
  38. <el-select
  39. v-model.trim="searchForm.chargeType"
  40. placeholder="请选择收费类型"
  41. clearable
  42. >
  43. <el-option
  44. v-for="item in orderType"
  45. :key="item.value"
  46. :label="item.label"
  47. :value="item.value"
  48. ></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item>
  52. <el-select
  53. v-model.trim="searchForm.openFlag"
  54. placeholder="收费状态"
  55. clearable
  56. >
  57. <el-option label="关闭" value="1"></el-option>
  58. <el-option label="开启" value="0"></el-option>
  59. </el-select>
  60. </el-form-item>
  61. <el-form-item>
  62. <el-select
  63. v-model.trim="searchForm.type"
  64. placeholder="请选择订单类型"
  65. clearable
  66. >
  67. <el-option label="个人" value="personal"></el-option>
  68. <el-option label="公用" value="common"></el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item>
  72. <el-button type="danger" native-type="submit">搜索</el-button>
  73. <el-button native-type="reset" type="primary">重置</el-button>
  74. <el-button
  75. @click="exportSporad"
  76. v-permission="'export/sporadicChargeInfo'"
  77. >导出</el-button
  78. >
  79. </el-form-item>
  80. </save-form>
  81. <el-button
  82. v-permission="'sporadicChargeInfo/add'"
  83. @click="newVisible"
  84. type="primary"
  85. style="margin-bottom: 20px"
  86. >
  87. 新增公用收费
  88. </el-button>
  89. <el-button
  90. v-permission="'sporadicChargeInfo/add'"
  91. @click="newVisible1"
  92. type="primary"
  93. style="margin-bottom: 20px"
  94. >
  95. 新增个人收费
  96. </el-button>
  97. <div class="tableWrap">
  98. <el-table
  99. :data="tableList"
  100. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  101. >
  102. <el-table-column align="center" label="分部" prop="organName">
  103. <template slot-scope="scope">
  104. <div>
  105. <copy-text>{{ scope.row.organName }}</copy-text>
  106. </div>
  107. </template>
  108. </el-table-column>
  109. <el-table-column align="center" label="收费类型">
  110. <template slot-scope="scope">
  111. <div>
  112. {{ scope.row.chargeType | chargeTypeFilter }}
  113. </div>
  114. </template>
  115. </el-table-column>
  116. <el-table-column align="center" label="标题" prop="title">
  117. <template slot-scope="scope">
  118. <div>
  119. <copy-text>{{ scope.row.title }}</copy-text>
  120. </div>
  121. </template>
  122. </el-table-column>
  123. <el-table-column align="center" label="学生姓名" prop="userName">
  124. <template slot-scope="scope">
  125. <copy-text>{{ scope.row.userName }}</copy-text>
  126. </template>
  127. </el-table-column>
  128. <el-table-column align="center" label="收费状态">
  129. <template slot-scope="scope">
  130. <div>
  131. {{ scope.row.openFlag ? "关闭" : "开启" }}
  132. </div>
  133. </template>
  134. </el-table-column>
  135. <el-table-column align="center" label="金额" prop="amount">
  136. <template slot-scope="scope">
  137. <div>
  138. {{ scope.row.amount | moneyFormat }}
  139. </div>
  140. </template>
  141. </el-table-column>
  142. <el-table-column align="center" label="时间">
  143. <template slot-scope="scope">
  144. <div>
  145. {{ scope.row.createTime | formatTimer }}
  146. </div>
  147. </template>
  148. </el-table-column>
  149. <el-table-column align="center" label="订单类型">
  150. <template slot-scope="scope">
  151. {{ scope.row.userId ? "个人" : "公用" }}
  152. </template>
  153. </el-table-column>
  154. <el-table-column align="center" label="创建人" prop="operatorName">
  155. </el-table-column>
  156. <el-table-column align="center" label="操作">
  157. <template slot-scope="scope">
  158. <div>
  159. <el-button
  160. type="text"
  161. v-if="scope.row.chargeType == 12"
  162. key="update"
  163. v-permission="'sporadicChargeInfo/update'"
  164. @click="lookVisible(scope.row)"
  165. >修改</el-button
  166. >
  167. <el-button
  168. type="text"
  169. v-else
  170. key="update"
  171. v-permission="'sporadicChargeInfo/look'"
  172. @click="lookVisible(scope.row)"
  173. >查看</el-button
  174. >
  175. <el-button
  176. type="text"
  177. v-permission="'sporadicChargeInfo/delete'"
  178. @click="removeItem(scope.row)"
  179. >删除</el-button
  180. >
  181. <el-button
  182. type="text"
  183. v-if="scope.row.openFlag"
  184. v-permission="'sporadicChargeInfo/updateOpenFlag'"
  185. @click="setSporadic(scope.row)"
  186. >开启</el-button
  187. >
  188. <el-button
  189. type="text"
  190. v-else
  191. v-permission="'sporadicChargeInfo/updateOpenFlag'"
  192. @click="setSporadic(scope.row)"
  193. >关闭</el-button
  194. >
  195. </div>
  196. </template>
  197. </el-table-column>
  198. </el-table>
  199. <pagination
  200. sync
  201. :total.sync="pageInfo.total"
  202. :page.sync="pageInfo.page"
  203. :limit.sync="pageInfo.limit"
  204. :page-sizes="pageInfo.page_size"
  205. @pagination="getList"
  206. />
  207. </div>
  208. </div>
  209. <el-dialog
  210. :title="title"
  211. :visible.sync="zeroVisible"
  212. @close="onFormClose('maskForm')"
  213. width="650px"
  214. >
  215. <el-form
  216. :model="maskForm"
  217. :rules="maskRules"
  218. label-width="110px"
  219. label-position="right"
  220. :inline="true"
  221. ref="maskForm"
  222. >
  223. <el-form-item label="标题" prop="title">
  224. <el-input
  225. v-model.trim="maskForm.title"
  226. maxlength="50"
  227. :disabled="!isNew"
  228. ></el-input>
  229. </el-form-item>
  230. <el-form-item label="收费类型" prop="type">
  231. <el-select
  232. v-model.trim="maskForm.type"
  233. :disabled="!isNew"
  234. clearable
  235. filterable
  236. style="width: 180px !important"
  237. >
  238. <el-option
  239. v-for="item in isNew ? orderType1 : orderType"
  240. :key="item.value"
  241. :label="item.label"
  242. :value="item.value"
  243. ></el-option>
  244. </el-select>
  245. </el-form-item>
  246. <el-form-item label="金额" prop="money">
  247. <el-input
  248. v-model.trim="maskForm.money"
  249. type="number"
  250. @mousewheel.native.prevent
  251. :disabled="!isNew"
  252. ></el-input>
  253. </el-form-item>
  254. <el-form-item
  255. label="是否开启限制"
  256. prop="openMaxTerm"
  257. :rules="[
  258. {
  259. required: true,
  260. message: '请选择是否开启目标金额',
  261. trigger: 'change'
  262. }
  263. ]"
  264. v-if="maskForm.type == 12"
  265. >
  266. <el-select v-model.trim="maskForm.openMaxTerm" clearable>
  267. <el-option :value="1" label="是"></el-option>
  268. <el-option :value="0" label="否"></el-option>
  269. </el-select>
  270. </el-form-item>
  271. <el-form-item
  272. label="目标金额"
  273. prop="maxAmount"
  274. :rules="[{ required: true, validator: validMaxNum, trigger: 'blur' }]"
  275. v-if="maskForm.type == 12"
  276. >
  277. <el-input
  278. v-model.trim="maskForm.maxAmount"
  279. type="number"
  280. @mousewheel.native.prevent
  281. ></el-input>
  282. </el-form-item>
  283. <el-form-item label="减免金额" v-if="maskForm.type == 6" prop="money">
  284. <el-input
  285. v-model.trim="maskForm.subMoney"
  286. type="number"
  287. @mousewheel.native.prevent
  288. :disabled="!isNew"
  289. ></el-input>
  290. </el-form-item>
  291. <el-form-item label="分部" prop="organId">
  292. <el-select
  293. v-model.trim="maskForm.organId"
  294. :disabled="!isNew"
  295. clearable
  296. @change="onMusicGroupChange"
  297. filterable
  298. multiple
  299. collapse-tags
  300. style="width: 180px !important"
  301. >
  302. <el-option
  303. v-for="(item, index) in selects.branchs"
  304. :key="index"
  305. :value="item.id"
  306. :label="item.name"
  307. ></el-option>
  308. </el-select>
  309. </el-form-item>
  310. <el-form-item
  311. label="所属乐团"
  312. v-if="maskForm.type != 12"
  313. prop="musicGroupId"
  314. >
  315. <el-select
  316. v-model.trim="maskForm.musicGroupId"
  317. :disabled="!isNew || !maskForm.organId"
  318. clearable
  319. filterable
  320. style="width: 180px !important"
  321. >
  322. <el-option
  323. v-for="item in maskMusicList"
  324. :key="item.musicGroupId"
  325. :value="item.musicGroupId"
  326. :label="item.musicGroupName"
  327. ></el-option>
  328. </el-select>
  329. </el-form-item>
  330. <el-form-item label="查看链接" v-if="!isNew">
  331. <el-input
  332. style="width: 400px !important"
  333. :disabled="!isNew"
  334. v-model.trim="maskForm.code"
  335. ></el-input>
  336. <el-button type="danger" @click="qrcodeStatus = true"
  337. >二维码</el-button
  338. >
  339. </el-form-item>
  340. <el-form-item label="收费详情" prop="desc">
  341. <el-input
  342. type="textarea"
  343. :disabled="!isNew"
  344. v-model.trim="maskForm.desc"
  345. style="width: 490px"
  346. maxlength="300"
  347. :autosize="{ minRows: 5 }"
  348. ></el-input>
  349. </el-form-item>
  350. </el-form>
  351. <span slot="footer" class="dialog-footer">
  352. <el-button @click="zeroVisible = false">取 消</el-button>
  353. <el-button type="primary" v-if="isNew" @click="addZero"
  354. >确 定</el-button
  355. >
  356. <el-button v-if="!isNew" type="primary" @click="updateZero"
  357. >确定</el-button
  358. >
  359. </span>
  360. </el-dialog>
  361. <el-dialog
  362. :title="title1"
  363. :visible.sync="zeroVisible1"
  364. @close="onFormClose('maskForm1')"
  365. width="650px"
  366. >
  367. <el-form
  368. :model="maskForm1"
  369. :rules="maskRules1"
  370. label-width="100px"
  371. label-position="right"
  372. :inline="true"
  373. ref="maskForm1"
  374. >
  375. <el-form-item label="标题" prop="title">
  376. <el-input
  377. v-model.trim="maskForm1.title"
  378. maxlength="50"
  379. :disabled="!isNew1"
  380. ></el-input>
  381. </el-form-item>
  382. <el-form-item label="收费类型" prop="type">
  383. <el-select
  384. v-model.trim="maskForm1.type"
  385. :disabled="!isNew1"
  386. clearable
  387. filterable
  388. style="width: 180px !important"
  389. >
  390. <template v-for="item in isNew1 ? orderType1 : orderType">
  391. <el-option
  392. v-if="item.value != 12"
  393. :key="item.value"
  394. :label="item.label"
  395. :value="item.value"
  396. ></el-option>
  397. </template>
  398. </el-select>
  399. </el-form-item>
  400. <el-form-item label="学员编号" prop="studentId">
  401. <el-input
  402. v-model.trim="maskForm1.studentId"
  403. @blur="onStudentChange"
  404. type="number"
  405. maxlength="10"
  406. @mousewheel.native.prevent
  407. :disabled="!isNew1"
  408. ></el-input>
  409. </el-form-item>
  410. <el-form-item label="金额" prop="money">
  411. <el-input
  412. v-model.trim="maskForm1.money"
  413. type="number"
  414. @mousewheel.native.prevent
  415. :disabled="!isNew1"
  416. ></el-input>
  417. </el-form-item>
  418. <el-form-item label="学员姓名" prop="studentName">
  419. <el-input
  420. v-model.trim="maskForm1.studentName"
  421. :disabled="true"
  422. ></el-input>
  423. </el-form-item>
  424. <el-form-item label="所属乐团" prop="musicGroupId">
  425. <el-select
  426. v-model.trim="maskForm1.musicGroupId"
  427. :disabled="!isNew1"
  428. clearable
  429. filterable
  430. style="width: 180px !important"
  431. >
  432. <el-option
  433. v-for="(item, index) in maskMusicList1"
  434. :key="index"
  435. :value="item.musicGroupId"
  436. :label="item.musicGroupName"
  437. ></el-option>
  438. </el-select>
  439. </el-form-item>
  440. <el-form-item label="查看链接" v-if="!isNew1">
  441. <el-input
  442. style="width: 400px !important"
  443. :disabled="!isNew1"
  444. v-model.trim="maskForm1.code"
  445. ></el-input>
  446. <el-button type="danger" @click="qrcodeStatus = true"
  447. >二维码</el-button
  448. >
  449. </el-form-item>
  450. <el-form-item label="收费详情" prop="desc">
  451. <el-input
  452. type="textarea"
  453. :disabled="!isNew1"
  454. v-model.trim="maskForm1.desc"
  455. style="width: 490px"
  456. maxlength="300"
  457. :autosize="{ minRows: 5 }"
  458. ></el-input>
  459. </el-form-item>
  460. </el-form>
  461. <span slot="footer" class="dialog-footer">
  462. <el-button @click="zeroVisible1 = false">取 消</el-button>
  463. <el-button type="primary" v-if="isNew1" @click="addZero1"
  464. >确 定</el-button
  465. >
  466. <el-button v-if="!isNew1" type="primary" @click="zeroVisible1 = false"
  467. >确定</el-button
  468. >
  469. </span>
  470. </el-dialog>
  471. <el-dialog
  472. :visible.sync="qrcodeStatus"
  473. center
  474. width="300px"
  475. title="缴费链接"
  476. >
  477. <div class="right-code">
  478. <!-- <h2 class="title">缴费链接</h2> -->
  479. <vue-qr :text="qrCodeUrl" style="width: 100%" :margin="0"></vue-qr>
  480. <!-- <div id="qrcode"
  481. class="qrcode code"
  482. ref="qrCodeUrl"></div> -->
  483. <!-- <p class="code-url"
  484. v-if="codeUrl2">{{ codeUrl2 }}</p> -->
  485. </div>
  486. </el-dialog>
  487. </div>
  488. </template>
  489. <script>
  490. import { getAgreement } from "@/api/buildTeam";
  491. import pagination from "@/components/Pagination/index";
  492. import { vaildStudentUrl } from "@/utils/validate";
  493. import cleanDeep from "clean-deep";
  494. import {
  495. addZero,
  496. getZero,
  497. updateZero,
  498. removeZero,
  499. getBasic,
  500. updateOpenFlag,
  501. queryOrganMusicInfos,
  502. queryUserMusicInfos
  503. } from "@/api/zeroManager";
  504. import axios from "axios";
  505. import qs from "qs";
  506. import { getToken, getTenantId } from "@/utils/auth";
  507. import load from "@/utils/loading";
  508. // import QRCode from 'qrcodejs2'
  509. import vueQr from "vue-qr";
  510. let validMaxNum = (rule, value, callback) => {
  511. if ((value == "" && typeof value == "string") || value == null) {
  512. callback(new Error("请输入缴费金额"));
  513. } else if (value < 0) {
  514. callback(new Error("输入缴费金额必须大于0"));
  515. } else {
  516. callback();
  517. }
  518. };
  519. export default {
  520. name: "sporadicList",
  521. components: { pagination, vueQr },
  522. data() {
  523. return {
  524. validMaxNum: validMaxNum,
  525. zeroVisible: false,
  526. qrCodeUrl: null,
  527. searchForm: {
  528. organId: null,
  529. chargeType: null,
  530. type: null,
  531. search: null,
  532. openFlag: null
  533. },
  534. tableList: [],
  535. organList: [],
  536. orderType: [
  537. // { label: "考级", value: 1 },
  538. { label: "声部更改", value: 2 },
  539. { label: "乐器更换", value: 3 },
  540. { label: "配件销售", value: 4 },
  541. { label: "维修费", value: 5 },
  542. { label: "福袋活动", value: 6 },
  543. { label: "双十一活动", value: 12 },
  544. { label: "上门费", value: 7 },
  545. { label: "账户充值", value: 9 },
  546. // { label: "乐保服务", value: 10 },
  547. // { label: "网基课活动", value: 13 },
  548. // { label: "云教练购买", value: 15 },
  549. { label: "其它", value: 11 }
  550. ],
  551. orderType1: [
  552. // { label: "考级", value: 1 },
  553. // { label: "声部更改", value: 2 },
  554. // { label: '乐器更换', value: 3 },
  555. // { label: '配件销售', value: 4 },
  556. // { label: '双十一活动', value: 12 },
  557. { label: "上门费", value: 7 },
  558. { label: "账户充值", value: 9 },
  559. { label: "其它", value: 11 }
  560. // { label: "乐保服务", value: 10 },
  561. // { label: "网基课活动", value: 13 },
  562. // { label: "云教练购买", value: 15 },
  563. ],
  564. maskForm: {
  565. organId: [],
  566. type: "",
  567. money: "",
  568. desc: "",
  569. title: "",
  570. code: "",
  571. musicGroupId: "",
  572. maxAmount: null,
  573. openMaxTerm: null,
  574. subMoney: ""
  575. },
  576. maskMusicList: [],
  577. maskRules: {
  578. organId: [{ required: true, message: "请选择分部", trigger: "change" }],
  579. // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
  580. type: [
  581. { required: true, message: "请选择收费类型", trigger: "change" }
  582. ],
  583. money: [
  584. { required: true, message: "请输入收费金额", trigger: "change" }
  585. ],
  586. title: [
  587. { required: true, message: "请输入标题名称", trigger: "change" }
  588. ],
  589. desc: [{ required: true, message: "请输入收费详情" }]
  590. },
  591. pageInfo: {
  592. // 分页规则
  593. limit: 10, // 限制显示条数
  594. page: 1, // 当前页
  595. total: 0, // 总条数
  596. page_size: [10, 20, 40, 50] // 选择限制显示条数
  597. },
  598. isNew: false,
  599. title: "新增收费",
  600. qrcodeStatus: false,
  601. qrcodes: true,
  602. activeRow: null,
  603. title1: "新增收费",
  604. activeRow1: null,
  605. zeroVisible1: false,
  606. maskForm1: {
  607. type: null,
  608. money: null,
  609. desc: null,
  610. title: null,
  611. code: null,
  612. musicGroupId: null,
  613. studentId: null,
  614. studentName: null
  615. },
  616. isNew1: false,
  617. maskMusicList1: [],
  618. maskRules1: {
  619. organId: [{ required: true, message: "请选择分部", trigger: "change" }],
  620. // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
  621. type: [
  622. { required: true, message: "请选择收费类型", trigger: "change" }
  623. ],
  624. money: [
  625. { required: true, message: "请输入收费金额", trigger: "change" }
  626. ],
  627. title: [
  628. { required: true, message: "请输入标题名称", trigger: "change" }
  629. ],
  630. studentId: [
  631. { required: true, message: "请输入学员编号", trigger: "blur" }
  632. ],
  633. desc: [{ required: true, message: "请输入收费详情" }]
  634. }
  635. };
  636. },
  637. mounted() {
  638. // getEmployeeOrgan().then(res => {
  639. // if (res.code == 200) {
  640. // this.organList = res.data;
  641. // }
  642. // })
  643. this.$store.dispatch("setBranchs");
  644. this.getList();
  645. this.getAgreement();
  646. },
  647. methods: {
  648. search() {
  649. this.pageInfo.page = 1;
  650. this.getList();
  651. },
  652. onReSet() {
  653. this.searchForm = {
  654. organId: null,
  655. chargeType: null,
  656. type: null,
  657. search: null
  658. };
  659. this.search();
  660. },
  661. getList() {
  662. let searchForm = this.searchForm;
  663. let params = {
  664. organId: searchForm.organId ? searchForm.organId : null,
  665. chargeType: searchForm.chargeType ? searchForm.chargeType : null,
  666. type: searchForm.type ? searchForm.type : null,
  667. search: searchForm.search ? searchForm.search : null,
  668. openFlag: searchForm.openFlag ? searchForm.openFlag * 1 : null,
  669. page: this.pageInfo.page,
  670. rows: this.pageInfo.limit
  671. };
  672. getZero(params).then(res => {
  673. if (res.code == 200) {
  674. this.tableList = res.data.rows;
  675. this.pageInfo.total = res.data.total;
  676. }
  677. });
  678. },
  679. onFormClose(formName) {
  680. // 关闭弹窗重置验证
  681. if (formName == "maskForm") {
  682. this.maskForm = {
  683. organId: [],
  684. musicGroupId: null,
  685. type: null,
  686. money: null,
  687. maxAmount: null,
  688. openMaxTerm: null,
  689. desc: null,
  690. title: null,
  691. code: null
  692. };
  693. } else if (formName == "maskForm1") {
  694. this.maskForm1 = {
  695. type: null,
  696. musicGroupId: null,
  697. money: null,
  698. desc: null,
  699. title: null,
  700. code: null,
  701. studentId: null,
  702. studentName: null
  703. };
  704. }
  705. if (this.$refs[formName]) {
  706. this.$refs[formName].resetFields();
  707. }
  708. },
  709. newVisible() {
  710. this.isNew = true;
  711. this.zeroVisible = true;
  712. this.title = "新增公用收费";
  713. },
  714. newVisible1() {
  715. this.isNew1 = true;
  716. this.zeroVisible1 = true;
  717. this.title1 = "新增个人收费";
  718. },
  719. async getAgreement() {
  720. try {
  721. const res = await getAgreement();
  722. if (!res.data) {
  723. this.$bus.$emit("showguide", ["agreement"]);
  724. }
  725. } catch (e) {}
  726. },
  727. lookVisible(row) {
  728. let maskForm = null;
  729. if (row.userId) {
  730. maskForm = this.maskForm1;
  731. this.isNew1 = false;
  732. this.zeroVisible1 = true;
  733. this.title1 = "查看个人收费";
  734. let url =
  735. vaildStudentUrl() +
  736. `/#/sporadicPay?id=${row.id}&userId=${row.userId}`;
  737. this.qrCodeUrl = url;
  738. maskForm.code = url;
  739. maskForm.studentId = row.userId;
  740. maskForm.studentName = row.userName;
  741. } else {
  742. maskForm = this.maskForm;
  743. this.isNew = false;
  744. this.zeroVisible = true;
  745. this.title = "查看公用收费";
  746. let url = vaildStudentUrl() + `/#/sporadicLogin?id=${row.id}`;
  747. this.qrCodeUrl = url;
  748. maskForm.code = url;
  749. }
  750. maskForm.type = parseInt(row.chargeType);
  751. maskForm.id = row.id;
  752. maskForm.desc = row.detail;
  753. maskForm.title = row.title;
  754. maskForm.organId = row.organId;
  755. maskForm.money = row.amount;
  756. maskForm.subMoney = row.discountAmount;
  757. maskForm.maxAmount = row.maxAmount;
  758. maskForm.openMaxTerm = row.openMaxTerm;
  759. maskForm.musicGroupId = row.musicGroupId ? row.musicGroupId : null;
  760. if (row.userId) {
  761. queryUserMusicInfos({ userId: row.userId }).then(studentInfo => {
  762. if (studentInfo.code == 200) {
  763. this.maskMusicList1 = studentInfo.data;
  764. }
  765. });
  766. } else {
  767. this.onMusicGroupChange(true);
  768. }
  769. },
  770. onMusicGroupChange(status) {
  771. let maskForm = this.maskForm;
  772. if (!maskForm.organId) {
  773. return;
  774. }
  775. if (!status) {
  776. maskForm.musicGroupId = null; // 重置可能已经选中的乐团
  777. }
  778. queryOrganMusicInfos({ organId: maskForm.organId.join(",") }).then(
  779. res => {
  780. if (res.code == 200) {
  781. this.maskMusicList = res.data;
  782. }
  783. }
  784. );
  785. },
  786. updateZero() {
  787. let maskForm = this.maskForm;
  788. if (maskForm.type != 12) {
  789. this.zeroVisible = false;
  790. return;
  791. }
  792. this.$refs["maskForm"].validate(item => {
  793. if (item) {
  794. updateZero(
  795. cleanDeep({
  796. id: maskForm.id,
  797. maxAmount: maskForm.maxAmount,
  798. openMaxTerm: maskForm.openMaxTerm
  799. })
  800. ).then(res => {
  801. if (res.code == 200) {
  802. this.$message.success("更新成功");
  803. this.zeroVisible = false;
  804. this.getList();
  805. }
  806. });
  807. }
  808. });
  809. },
  810. addZero() {
  811. this.$refs["maskForm"].validate(item => {
  812. if (item) {
  813. let maskForm = this.maskForm;
  814. let obj = {
  815. chargeType: maskForm.type,
  816. detail: maskForm.desc,
  817. title: maskForm.title,
  818. organId: maskForm.organId ? maskForm.organId.join(",") : "",
  819. amount: maskForm.money,
  820. musicGroupId: maskForm.musicGroupId,
  821. discountAmount: maskForm.subMoney
  822. };
  823. if (maskForm.type == 12) {
  824. (obj.maxAmount = maskForm.maxAmount),
  825. (obj.openMaxTerm = maskForm.openMaxTerm);
  826. }
  827. addZero(obj).then(res => {
  828. if (res.code == 200) {
  829. this.$message.success("新增成功");
  830. this.zeroVisible = false;
  831. this.getList();
  832. }
  833. });
  834. }
  835. });
  836. },
  837. addZero1() {
  838. this.$refs["maskForm1"].validate(item => {
  839. if (item) {
  840. let maskForm1 = this.maskForm1;
  841. if (!maskForm1.studentName) {
  842. this.$message.error("学员信息不存在");
  843. return;
  844. }
  845. let obj = {
  846. chargeType: maskForm1.type,
  847. detail: maskForm1.desc,
  848. title: maskForm1.title,
  849. musicGroupId: this.maskForm1.musicGroupId,
  850. userId: maskForm1.studentId,
  851. amount: maskForm1.money
  852. };
  853. addZero(obj).then(res => {
  854. if (res.code == 200) {
  855. this.$message.success("新增成功");
  856. this.zeroVisible1 = false;
  857. this.getList();
  858. }
  859. });
  860. }
  861. });
  862. },
  863. async onStudentChange() {
  864. let studentId = this.maskForm1.studentId;
  865. // 判断学生编号是否存在
  866. if (!studentId) {
  867. return;
  868. }
  869. if (studentId.length > 10) {
  870. this.$message.error("学员编号不合法");
  871. return;
  872. }
  873. await getBasic({ userId: studentId }).then(res => {
  874. if (res.code == 200) {
  875. if (res.data) {
  876. this.maskForm1.studentName = res.data.name;
  877. queryUserMusicInfos({ userId: studentId }).then(studentInfo => {
  878. if (studentInfo.code == 200) {
  879. this.maskMusicList1 = studentInfo.data;
  880. }
  881. });
  882. } else {
  883. this.maskForm1.studentName = null;
  884. }
  885. }
  886. });
  887. },
  888. removeItem(row) {
  889. this.$confirm("是否删除该收费", "提示", {
  890. confirmButtonText: "确定",
  891. cancelButtonText: "取消",
  892. type: "warning"
  893. })
  894. .then(() => {
  895. removeZero({ id: row.id }).then(res => {
  896. if (res.code == 200) {
  897. this.$message.success("删除成功");
  898. this.zeroVisible = false;
  899. this.getList();
  900. }
  901. });
  902. })
  903. .catch(() => {});
  904. },
  905. setSporadic(row) {
  906. // openFlag
  907. let str = "";
  908. let openFlag = "";
  909. if (row.openFlag) {
  910. // 关闭=>开启 1是关闭
  911. openFlag = 0;
  912. str = "开启";
  913. } else {
  914. // 开启=>关闭 0是开启
  915. openFlag = 1;
  916. str = "关闭";
  917. }
  918. this.$confirm(`是否${str}该收费`, "提示", {
  919. confirmButtonText: "确定",
  920. cancelButtonText: "取消",
  921. type: "warning"
  922. })
  923. .then(() => {
  924. updateOpenFlag({ sporadicId: row.id, openFlag }).then(res => {
  925. if (res.code == 200) {
  926. this.$message.success(`${str}成功`);
  927. this.getList();
  928. }
  929. });
  930. })
  931. .catch(() => {});
  932. },
  933. exportSporad() {
  934. let url = "/api-web/export/sporadicChargeInfo";
  935. let data = this.searchForm;
  936. const options = {
  937. method: "get",
  938. headers: {
  939. Authorization: getToken(),
  940. tenantId: getTenantId()
  941. },
  942. params: data,
  943. url,
  944. responseType: "blob"
  945. };
  946. this.$confirm("您确定导出零星缴费列表", "提示", {
  947. confirmButtonText: "确定",
  948. cancelButtonText: "取消",
  949. type: "warning"
  950. })
  951. .then(() => {
  952. load.startLoading();
  953. axios(options)
  954. .then(res => {
  955. let blob = new Blob([res.data], {
  956. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  957. type: "application/vnd.ms-excel;charset=utf-8"
  958. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  959. });
  960. let text = new Response(blob).text();
  961. text.then(res => {
  962. // 判断是否报错
  963. if (res.indexOf("code") != -1) {
  964. let json = JSON.parse(res);
  965. if (json.code == 403) {
  966. this.$message.error(`登录过期,请重新登录!`);
  967. setTimeout(() => {
  968. this.$store.dispatch("user/resetToken").then(() => {
  969. location.reload();
  970. });
  971. }, 1000);
  972. return;
  973. }
  974. this.$message.error(json.msg);
  975. } else {
  976. let objectUrl = URL.createObjectURL(blob);
  977. let link = document.createElement("a");
  978. let nowTime = new Date();
  979. let ymd =
  980. nowTime.getFullYear() +
  981. "" +
  982. (nowTime.getMonth() + 1) +
  983. "" +
  984. nowTime.getDate();
  985. let fname = ymd + "零星缴费.xls"; //下载文件的名字
  986. link.href = objectUrl;
  987. link.setAttribute("download", fname);
  988. document.body.appendChild(link);
  989. link.click();
  990. }
  991. });
  992. load.endLoading();
  993. })
  994. .catch(error => {
  995. this.$message.error("导出数据失败,请联系管理员");
  996. load.endLoading();
  997. });
  998. })
  999. .catch(() => {});
  1000. }
  1001. },
  1002. watch: {
  1003. zeroVisible(val) {
  1004. if (!val) {
  1005. this.maskForm = {
  1006. organId: "",
  1007. type: "",
  1008. money: "",
  1009. desc: "",
  1010. title: "",
  1011. maxAmount: null,
  1012. openMaxTerm: null,
  1013. code: ""
  1014. };
  1015. // this.$refs['maskForm'].resetFields()
  1016. // console.log(this.$refs['zeroForm'].resetFields)
  1017. }
  1018. }
  1019. },
  1020. filters: {
  1021. chargeTypeFilter(val) {
  1022. let template = {
  1023. 1: "考级",
  1024. 2: "声部更改",
  1025. 3: "乐器更换",
  1026. 4: "配件销售",
  1027. 5: "维修费",
  1028. 6: "福袋活动",
  1029. 7: "上门费",
  1030. 9: "账户充值",
  1031. 10: "乐保服务",
  1032. 11: "其它",
  1033. 12: "双十一活动",
  1034. 13: "网基课活动",
  1035. 15: "云教练购买"
  1036. };
  1037. return template[val];
  1038. }
  1039. }
  1040. };
  1041. </script>
  1042. <style lang="scss" scoped>
  1043. .right-code {
  1044. // width: 50%;
  1045. // float: left;
  1046. .title {
  1047. font-size: 18px;
  1048. text-align: center;
  1049. padding-bottom: 8px;
  1050. }
  1051. }
  1052. .newBand {
  1053. display: inline-block;
  1054. }
  1055. .el-input {
  1056. width: 180px !important;
  1057. }
  1058. ::v-deep .el-select {
  1059. width: auto !important;
  1060. }
  1061. </style>