sporadicList.vue 34 KB

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