sporadicList.vue 31 KB

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