sporadicList.vue 31 KB

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