sporadicList.vue 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  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" :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. :autosize="{ minRows: 5 }"
  337. ></el-input>
  338. </el-form-item>
  339. </el-form>
  340. <span slot="footer" class="dialog-footer">
  341. <el-button @click="zeroVisible = false">取 消</el-button>
  342. <el-button type="primary" v-if="isNew" @click="addZero"
  343. >确 定</el-button
  344. >
  345. <el-button v-if="!isNew" type="primary" @click="updateZero"
  346. >确定</el-button
  347. >
  348. </span>
  349. </el-dialog>
  350. <el-dialog
  351. :title="title1"
  352. :visible.sync="zeroVisible1"
  353. @close="onFormClose('maskForm1')"
  354. width="650px"
  355. >
  356. <el-form
  357. :model="maskForm1"
  358. :rules="maskRules1"
  359. label-width="100px"
  360. label-position="right"
  361. :inline="true"
  362. ref="maskForm1"
  363. >
  364. <el-form-item label="标题" prop="title">
  365. <el-input
  366. v-model.trim="maskForm1.title"
  367. :disabled="!isNew1"
  368. ></el-input>
  369. </el-form-item>
  370. <el-form-item label="收费类型" prop="type">
  371. <el-select
  372. v-model.trim="maskForm1.type"
  373. :disabled="!isNew1"
  374. clearable
  375. filterable
  376. >
  377. <template v-for="item in (isNew1 ? orderType1 : orderType)">
  378. <el-option
  379. v-if="item.value != 12"
  380. :key="item.value"
  381. :label="item.label"
  382. :value="item.value"
  383. ></el-option>
  384. </template>
  385. </el-select>
  386. </el-form-item>
  387. <el-form-item label="学员编号" prop="studentId">
  388. <el-input
  389. v-model.trim="maskForm1.studentId"
  390. @blur="onStudentChange"
  391. type="number"
  392. maxlength="10"
  393. @mousewheel.native.prevent
  394. :disabled="!isNew1"
  395. ></el-input>
  396. </el-form-item>
  397. <el-form-item label="金额" prop="money">
  398. <el-input
  399. v-model.trim="maskForm1.money"
  400. type="number"
  401. @mousewheel.native.prevent
  402. :disabled="!isNew1"
  403. ></el-input>
  404. </el-form-item>
  405. <el-form-item label="学员姓名" prop="studentName">
  406. <el-input
  407. v-model.trim="maskForm1.studentName"
  408. :disabled="true"
  409. ></el-input>
  410. </el-form-item>
  411. <el-form-item label="所属乐团" prop="musicGroupId">
  412. <el-select
  413. v-model.trim="maskForm1.musicGroupId"
  414. :disabled="!isNew1"
  415. clearable
  416. filterable
  417. >
  418. <el-option
  419. v-for="(item, index) in maskMusicList1"
  420. :key="index"
  421. :value="item.musicGroupId"
  422. :label="item.musicGroupName"
  423. ></el-option>
  424. </el-select>
  425. </el-form-item>
  426. <el-form-item label="查看链接" v-if="!isNew1">
  427. <el-input
  428. style="width: 400px !important"
  429. :disabled="!isNew1"
  430. v-model.trim="maskForm1.code"
  431. ></el-input>
  432. <el-button type="danger" @click="qrcodeStatus = true"
  433. >二维码</el-button
  434. >
  435. </el-form-item>
  436. <el-form-item label="收费详情" prop="desc">
  437. <el-input
  438. type="textarea"
  439. :disabled="!isNew1"
  440. v-model.trim="maskForm1.desc"
  441. style="width: 490px"
  442. :autosize="{ minRows: 5 }"
  443. ></el-input>
  444. </el-form-item>
  445. </el-form>
  446. <span slot="footer" class="dialog-footer">
  447. <el-button @click="zeroVisible1 = false">取 消</el-button>
  448. <el-button type="primary" v-if="isNew1" @click="addZero1"
  449. >确 定</el-button
  450. >
  451. <el-button v-if="!isNew1" type="primary" @click="zeroVisible1 = false"
  452. >确定</el-button
  453. >
  454. </span>
  455. </el-dialog>
  456. <el-dialog :visible.sync="qrcodeStatus" center width="300px" title="缴费链接">
  457. <div class="right-code">
  458. <!-- <h2 class="title">缴费链接</h2> -->
  459. <vue-qr :text="qrCodeUrl" style="width: 100%" :margin="0"></vue-qr>
  460. <!-- <div id="qrcode"
  461. class="qrcode code"
  462. ref="qrCodeUrl"></div> -->
  463. <!-- <p class="code-url"
  464. v-if="codeUrl2">{{ codeUrl2 }}</p> -->
  465. </div>
  466. </el-dialog>
  467. </div>
  468. </template>
  469. <script>
  470. import { getEmployeeOrgan } from "@/api/buildTeam";
  471. import pagination from "@/components/Pagination/index";
  472. import { vaildStudentUrl } from "@/utils/validate";
  473. import cleanDeep from "clean-deep";
  474. import {
  475. addZero,
  476. getZero,
  477. updateZero,
  478. removeZero,
  479. getBasic,
  480. updateOpenFlag,
  481. queryOrganMusicInfos,
  482. queryUserMusicInfos,
  483. } from "@/api/zeroManager";
  484. import axios from "axios";
  485. import qs from "qs";
  486. import { getToken } from "@/utils/auth";
  487. import load from "@/utils/loading";
  488. // import QRCode from 'qrcodejs2'
  489. import vueQr from "vue-qr";
  490. let validMaxNum = (rule, value, callback) => {
  491. if ((value == "" && typeof value == "string") || value == null) {
  492. callback(new Error("请输入缴费金额"));
  493. } else if (value < 0) {
  494. callback(new Error("输入缴费金额必须大于0"));
  495. } else {
  496. callback();
  497. }
  498. };
  499. export default {
  500. name: "sporadicList",
  501. components: { pagination, vueQr },
  502. data() {
  503. return {
  504. validMaxNum: validMaxNum,
  505. zeroVisible: false,
  506. qrCodeUrl: null,
  507. searchForm: {
  508. organId: null,
  509. chargeType: null,
  510. type: null,
  511. search: null,
  512. openFlag: null,
  513. },
  514. tableList: [],
  515. organList: [],
  516. orderType: [
  517. { label: "考级", value: 1 },
  518. { label: "声部更改", value: 2 },
  519. { label: "乐器更换", value: 3 },
  520. { label: "配件销售", value: 4 },
  521. { label: "维修费", value: 5 },
  522. { label: "福袋活动", value: 6 },
  523. { label: "双十一活动", value: 12 },
  524. { label: "上门费", value: 7 },
  525. { label: "账户充值", value: 9 },
  526. { label: "乐保服务", value: 10 },
  527. { label: "网基课活动", value: 13 },
  528. { label: "云教练收费", value: 15 },
  529. { label: "其它", value: 11 },
  530. ],
  531. orderType1: [
  532. { label: "考级", value: 1 },
  533. // { label: "声部更改", value: 2 },
  534. // { label: '乐器更换', value: 3 },
  535. // { label: '配件销售', value: 4 },
  536. // { label: '双十一活动', value: 12 },
  537. { label: "上门费", value: 7 },
  538. { label: "账户充值", value: 9 },
  539. { label: "乐保服务", value: 10 },
  540. { label: "网基课活动", value: 13 },
  541. { label: "云教练收费", value: 15 },
  542. ],
  543. maskForm: {
  544. organId: "",
  545. type: "",
  546. money: "",
  547. desc: "",
  548. title: "",
  549. code: "",
  550. musicGroupId: "",
  551. maxAmount: null,
  552. openMaxTerm: null,
  553. subMoney: "",
  554. },
  555. maskMusicList: [],
  556. maskRules: {
  557. organId: [{ required: true, message: "请选择分部", trigger: "change" }],
  558. // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
  559. type: [
  560. { required: true, message: "请选择收费类型", trigger: "change" },
  561. ],
  562. money: [
  563. { required: true, message: "请输入收费金额", trigger: "change" },
  564. ],
  565. title: [
  566. { required: true, message: "请输入标题名称", trigger: "change" },
  567. ],
  568. desc: [{ required: true, message: "请输入收费详情" }],
  569. },
  570. pageInfo: {
  571. // 分页规则
  572. limit: 10, // 限制显示条数
  573. page: 1, // 当前页
  574. total: 0, // 总条数
  575. page_size: [10, 20, 40, 50], // 选择限制显示条数
  576. },
  577. isNew: false,
  578. title: "新增收费",
  579. qrcodeStatus: false,
  580. qrcodes: true,
  581. activeRow: null,
  582. title1: "新增收费",
  583. activeRow1: null,
  584. zeroVisible1: false,
  585. maskForm1: {
  586. type: null,
  587. money: null,
  588. desc: null,
  589. title: null,
  590. code: null,
  591. musicGroupId: null,
  592. studentId: null,
  593. studentName: null,
  594. },
  595. isNew1: false,
  596. maskMusicList1: [],
  597. maskRules1: {
  598. organId: [{ required: true, message: "请选择分部", trigger: "change" }],
  599. // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
  600. type: [
  601. { required: true, message: "请选择收费类型", trigger: "change" },
  602. ],
  603. money: [
  604. { required: true, message: "请输入收费金额", trigger: "change" },
  605. ],
  606. title: [
  607. { required: true, message: "请输入标题名称", trigger: "change" },
  608. ],
  609. studentId: [
  610. { required: true, message: "请输入学员编号", trigger: "blur" },
  611. ],
  612. desc: [{ required: true, message: "请输入收费详情" }],
  613. },
  614. };
  615. },
  616. mounted() {
  617. // getEmployeeOrgan().then(res => {
  618. // if (res.code == 200) {
  619. // this.organList = res.data;
  620. // }
  621. // })
  622. this.$store.dispatch("setBranchs");
  623. this.getList();
  624. },
  625. methods: {
  626. search() {
  627. this.pageInfo.page = 1;
  628. this.getList();
  629. },
  630. onReSet() {
  631. this.searchForm = {
  632. organId: null,
  633. chargeType: null,
  634. type: null,
  635. search: null,
  636. };
  637. this.search()
  638. },
  639. getList() {
  640. let searchForm = this.searchForm;
  641. let params = {
  642. organId: searchForm.organId ? searchForm.organId : null,
  643. chargeType: searchForm.chargeType ? searchForm.chargeType : null,
  644. type: searchForm.type ? searchForm.type : null,
  645. search: searchForm.search ? searchForm.search : null,
  646. openFlag: searchForm.openFlag ? searchForm.openFlag * 1 : null,
  647. page: this.pageInfo.page,
  648. rows: this.pageInfo.limit,
  649. };
  650. getZero(params).then((res) => {
  651. if (res.code == 200) {
  652. this.tableList = res.data.rows;
  653. this.pageInfo.total = res.data.total;
  654. }
  655. });
  656. },
  657. onFormClose(formName) {
  658. // 关闭弹窗重置验证
  659. if (formName == "maskForm") {
  660. this.maskForm = {
  661. organId: null,
  662. musicGroupId: null,
  663. type: null,
  664. money: null,
  665. maxAmount: null,
  666. openMaxTerm: null,
  667. desc: null,
  668. title: null,
  669. code: null,
  670. };
  671. } else if (formName == "maskForm1") {
  672. this.maskForm1 = {
  673. type: null,
  674. musicGroupId: null,
  675. money: null,
  676. desc: null,
  677. title: null,
  678. code: null,
  679. studentId: null,
  680. studentName: null,
  681. };
  682. }
  683. if (this.$refs[formName]) {
  684. this.$refs[formName].resetFields();
  685. }
  686. },
  687. newVisible() {
  688. this.isNew = true;
  689. this.zeroVisible = true;
  690. this.title = "新增公用收费";
  691. },
  692. newVisible1() {
  693. this.isNew1 = true;
  694. this.zeroVisible1 = true;
  695. this.title1 = "新增个人收费";
  696. },
  697. lookVisible(row) {
  698. let maskForm = null;
  699. if (row.userId) {
  700. maskForm = this.maskForm1;
  701. this.isNew1 = false;
  702. this.zeroVisible1 = true;
  703. this.title1 = "查看个人收费";
  704. let url =
  705. vaildStudentUrl() +
  706. `/#/sporadicPay?id=${row.id}&userId=${row.userId}`;
  707. this.qrCodeUrl = url;
  708. maskForm.code = url;
  709. maskForm.studentId = row.userId;
  710. maskForm.studentName = row.userName;
  711. } else {
  712. maskForm = this.maskForm;
  713. this.isNew = false;
  714. this.zeroVisible = true;
  715. this.title = "查看公用收费";
  716. let url = vaildStudentUrl() + `/#/sporadicLogin?id=${row.id}`;
  717. this.qrCodeUrl = url;
  718. maskForm.code = url;
  719. }
  720. maskForm.type = parseInt(row.chargeType);
  721. maskForm.id = row.id;
  722. maskForm.desc = row.detail;
  723. maskForm.title = row.title;
  724. maskForm.organId = row.organId;
  725. maskForm.money = row.amount;
  726. maskForm.subMoney = row.discountAmount;
  727. maskForm.maxAmount = row.maxAmount;
  728. maskForm.openMaxTerm = row.openMaxTerm;
  729. maskForm.musicGroupId = row.musicGroupId ? row.musicGroupId : null;
  730. if (row.userId) {
  731. queryUserMusicInfos({ userId: row.userId }).then((studentInfo) => {
  732. if (studentInfo.code == 200) {
  733. this.maskMusicList1 = studentInfo.data;
  734. }
  735. });
  736. } else {
  737. this.onMusicGroupChange(true);
  738. }
  739. },
  740. onMusicGroupChange(status) {
  741. let maskForm = this.maskForm;
  742. if (!maskForm.organId) {
  743. return;
  744. }
  745. if (!status) {
  746. maskForm.musicGroupId = null; // 重置可能已经选中的乐团
  747. }
  748. queryOrganMusicInfos({ organId: maskForm.organId }).then((res) => {
  749. if (res.code == 200) {
  750. this.maskMusicList = res.data;
  751. }
  752. });
  753. },
  754. updateZero() {
  755. let maskForm = this.maskForm;
  756. if (maskForm.type != 12) {
  757. this.zeroVisible = false;
  758. return;
  759. }
  760. this.$refs["maskForm"].validate((item) => {
  761. if (item) {
  762. updateZero(
  763. cleanDeep({
  764. id: maskForm.id,
  765. maxAmount: maskForm.maxAmount,
  766. openMaxTerm: maskForm.openMaxTerm,
  767. })
  768. ).then((res) => {
  769. if (res.code == 200) {
  770. this.$message.success("更新成功");
  771. this.zeroVisible = false;
  772. this.getList();
  773. }
  774. });
  775. }
  776. });
  777. },
  778. addZero() {
  779. this.$refs["maskForm"].validate((item) => {
  780. if (item) {
  781. let maskForm = this.maskForm;
  782. let obj = {
  783. chargeType: maskForm.type,
  784. detail: maskForm.desc,
  785. title: maskForm.title,
  786. organId: maskForm.organId,
  787. amount: maskForm.money,
  788. musicGroupId: maskForm.musicGroupId,
  789. discountAmount: maskForm.subMoney,
  790. };
  791. if (maskForm.type == 12) {
  792. (obj.maxAmount = maskForm.maxAmount),
  793. (obj.openMaxTerm = maskForm.openMaxTerm);
  794. }
  795. addZero(obj).then((res) => {
  796. if (res.code == 200) {
  797. this.$message.success("新增成功");
  798. this.zeroVisible = false;
  799. this.getList();
  800. }
  801. });
  802. }
  803. });
  804. },
  805. addZero1() {
  806. this.$refs["maskForm1"].validate((item) => {
  807. if (item) {
  808. let maskForm1 = this.maskForm1;
  809. if (!maskForm1.studentName) {
  810. this.$message.error("学员信息不存在");
  811. return;
  812. }
  813. let obj = {
  814. chargeType: maskForm1.type,
  815. detail: maskForm1.desc,
  816. title: maskForm1.title,
  817. musicGroupId: this.maskForm1.musicGroupId,
  818. userId: maskForm1.studentId,
  819. amount: maskForm1.money,
  820. };
  821. addZero(obj).then((res) => {
  822. if (res.code == 200) {
  823. this.$message.success("新增成功");
  824. this.zeroVisible1 = false;
  825. this.getList();
  826. }
  827. });
  828. }
  829. });
  830. },
  831. async onStudentChange() {
  832. let studentId = this.maskForm1.studentId;
  833. // 判断学生编号是否存在
  834. if (!studentId) {
  835. return;
  836. }
  837. if (studentId.length > 10) {
  838. this.$message.error("学员编号不合法");
  839. return;
  840. }
  841. await getBasic({ userId: studentId }).then((res) => {
  842. if (res.code == 200) {
  843. if (res.data) {
  844. this.maskForm1.studentName = res.data.name;
  845. queryUserMusicInfos({ userId: studentId }).then((studentInfo) => {
  846. if (studentInfo.code == 200) {
  847. this.maskMusicList1 = studentInfo.data;
  848. }
  849. });
  850. } else {
  851. this.maskForm1.studentName = null;
  852. }
  853. }
  854. });
  855. },
  856. removeItem(row) {
  857. this.$confirm("是否删除该收费", "提示", {
  858. confirmButtonText: "确定",
  859. cancelButtonText: "取消",
  860. type: "warning",
  861. })
  862. .then(() => {
  863. removeZero({ id: row.id }).then((res) => {
  864. if (res.code == 200) {
  865. this.$message.success("删除成功");
  866. this.zeroVisible = false;
  867. this.getList();
  868. }
  869. });
  870. })
  871. .catch(() => {});
  872. },
  873. setSporadic(row) {
  874. // openFlag
  875. let str = "";
  876. let openFlag = "";
  877. if (row.openFlag) {
  878. // 关闭=>开启 1是关闭
  879. openFlag = 0;
  880. str = "开启";
  881. } else {
  882. // 开启=>关闭 0是开启
  883. openFlag = 1;
  884. str = "关闭";
  885. }
  886. this.$confirm(`是否${str}该收费`, "提示", {
  887. confirmButtonText: "确定",
  888. cancelButtonText: "取消",
  889. type: "warning",
  890. })
  891. .then(() => {
  892. updateOpenFlag({ sporadicId: row.id, openFlag }).then((res) => {
  893. if (res.code == 200) {
  894. this.$message.success(`${str}成功`);
  895. this.getList();
  896. }
  897. });
  898. })
  899. .catch(() => {});
  900. },
  901. exportSporad() {
  902. let url = "/api-web/export/sporadicChargeInfo";
  903. let data = this.searchForm;
  904. const options = {
  905. method: "get",
  906. headers: {
  907. Authorization: getToken(),
  908. },
  909. params: data,
  910. url,
  911. responseType: "blob",
  912. };
  913. this.$confirm("您确定导出零星缴费列表", "提示", {
  914. confirmButtonText: "确定",
  915. cancelButtonText: "取消",
  916. type: "warning",
  917. })
  918. .then(() => {
  919. load.startLoading();
  920. axios(options)
  921. .then((res) => {
  922. let blob = new Blob([res.data], {
  923. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  924. type: "application/vnd.ms-excel;charset=utf-8",
  925. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  926. });
  927. let text = new Response(blob).text();
  928. text.then((res) => {
  929. // 判断是否报错
  930. if (res.indexOf("code") != -1) {
  931. let json = JSON.parse(res);
  932. this.$message.error(json.msg);
  933. } else {
  934. let objectUrl = URL.createObjectURL(blob);
  935. let link = document.createElement("a");
  936. let nowTime = new Date();
  937. let ymd =
  938. nowTime.getFullYear() +
  939. "" +
  940. (nowTime.getMonth() + 1) +
  941. "" +
  942. nowTime.getDate();
  943. let fname = ymd + "零星缴费.xls"; //下载文件的名字
  944. link.href = objectUrl;
  945. link.setAttribute("download", fname);
  946. document.body.appendChild(link);
  947. link.click();
  948. }
  949. });
  950. load.endLoading();
  951. })
  952. .catch((error) => {
  953. this.$message.error("导出数据失败,请联系管理员");
  954. load.endLoading();
  955. });
  956. })
  957. .catch(() => {});
  958. },
  959. },
  960. watch: {
  961. zeroVisible(val) {
  962. if (!val) {
  963. this.maskForm = {
  964. organId: "",
  965. type: "",
  966. money: "",
  967. desc: "",
  968. title: "",
  969. maxAmount: null,
  970. openMaxTerm: null,
  971. code: "",
  972. };
  973. // this.$refs['maskForm'].resetFields()
  974. // console.log(this.$refs['zeroForm'].resetFields)
  975. }
  976. },
  977. },
  978. filters: {
  979. chargeTypeFilter(val) {
  980. let template = {
  981. 1: "考级",
  982. 2: "声部更改",
  983. 3: "乐器更换",
  984. 4: "配件销售",
  985. 5: "维修费",
  986. 6: "福袋活动",
  987. 7: "上门费",
  988. 9: "账户充值",
  989. 10: "乐保服务",
  990. 11: "其它",
  991. 12: "双十一活动",
  992. 13: '网基课活动',
  993. 15: '云教练收费',
  994. };
  995. return template[val];
  996. },
  997. },
  998. };
  999. </script>
  1000. <style lang="scss" scoped>
  1001. .right-code {
  1002. // width: 50%;
  1003. // float: left;
  1004. .title {
  1005. font-size: 18px;
  1006. text-align: center;
  1007. padding-bottom: 8px;
  1008. }
  1009. }
  1010. .newBand {
  1011. display: inline-block;
  1012. }
  1013. .el-input {
  1014. width: 180px !important;
  1015. }
  1016. </style>