sporadicList.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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 class="newBand"
  10. v-permission="'sporadicChargeInfo/add'"
  11. @click="newVisible">新增公用收费</div>
  12. <div class="newBand"
  13. v-permission="'sporadicChargeInfo/add'"
  14. @click="newVisible1">新增个人收费</div>
  15. <el-form :inline="true"
  16. :model="searchForm">
  17. <el-form-item>
  18. <el-input placeholder="标题或学生姓名" v-model="searchForm.search"></el-input>
  19. </el-form-item>
  20. <el-form-item>
  21. <el-select v-model="searchForm.organId"
  22. placeholder='请选择分部'
  23. clearable
  24. filterable>
  25. <el-option v-for='(item,index) in organList'
  26. :key="index"
  27. :value="item.id"
  28. :label="item.name"></el-option>
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item>
  32. <el-select v-model="searchForm.chargeType"
  33. placeholder='请选择收费类型'
  34. clearable>
  35. <el-option label="考级"
  36. :value="1"></el-option>
  37. <el-option label="缴费"
  38. :value="2"></el-option>
  39. <el-option label="声部更改"
  40. :value="3"></el-option>
  41. <el-option label="乐器更换"
  42. :value="4"></el-option>
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item>
  46. <el-select v-model="searchForm.type"
  47. placeholder='请选择订单类型'
  48. clearable>
  49. <el-option label="个人"
  50. value="personal"></el-option>
  51. <el-option label="公用"
  52. value="common"></el-option>
  53. </el-select>
  54. </el-form-item>
  55. <el-form-item>
  56. <el-button type="danger"
  57. @click="search">搜索</el-button>
  58. <el-button @click="onReSet"
  59. type="primary">重置</el-button>
  60. </el-form-item>
  61. </el-form>
  62. <div class="tableWrap">
  63. <el-table :data='tableList'
  64. :header-cell-style="{background:'#EDEEF0',color:'#444'}">
  65. <el-table-column align='center'
  66. label="分部"
  67. prop="organName">
  68. </el-table-column>
  69. <el-table-column align='center'
  70. label="收费类型">
  71. <template slot-scope="scope">
  72. <div>
  73. {{ scope.row.chargeType | chargeTypeFilter }}
  74. </div>
  75. </template>
  76. </el-table-column>
  77. <el-table-column align='center'
  78. label="标题"
  79. prop="title">
  80. </el-table-column>
  81. <el-table-column align='center'
  82. label="金额"
  83. prop="amount">
  84. </el-table-column>
  85. <el-table-column align='center'
  86. label="时间">
  87. <template slot-scope="scope">
  88. <div>
  89. {{ scope.row.createTime | formatTimer }}
  90. </div>
  91. </template>
  92. </el-table-column>
  93. <el-table-column align='center'
  94. label="学生姓名"
  95. prop="userName">
  96. <template slot-scope="scope">
  97. {{ scope.row.userName || '-' }}
  98. </template>
  99. </el-table-column>
  100. <el-table-column align='center'
  101. label="订单类型">
  102. <template slot-scope="scope">
  103. {{ scope.row.userId ? '人个' : '公用' }}
  104. </template>
  105. </el-table-column>
  106. <el-table-column align='center'
  107. label="创建人"
  108. prop="operatorName">
  109. </el-table-column>
  110. <el-table-column align='center'
  111. label="操作">
  112. <template slot-scope="scope">
  113. <div>
  114. <el-button type="text"
  115. @click="lookVisible(scope.row)">查看</el-button>
  116. <el-button type="text"
  117. v-permission="'sporadicChargeInfo/delete'"
  118. @click="removeItem(scope.row)">删除</el-button>
  119. </div>
  120. </template>
  121. </el-table-column>
  122. </el-table>
  123. <pagination :total="pageInfo.total"
  124. :page.sync="pageInfo.page"
  125. :limit.sync="pageInfo.limit"
  126. :page-sizes="pageInfo.page_size"
  127. @pagination="getList" />
  128. </div>
  129. </div>
  130. <el-dialog :title="title"
  131. :visible.sync="zeroVisible"
  132. @close="onFormClose('maskForm')"
  133. width="650px">
  134. <el-form :model='maskForm'
  135. :rules="maskRules"
  136. label-width="100px"
  137. label-position="right"
  138. :inline="true"
  139. ref="maskForm">
  140. <el-form-item label="标题"
  141. prop="title">
  142. <el-input v-model="maskForm.title"
  143. :disabled='!isNew'></el-input>
  144. </el-form-item>
  145. <el-form-item label="收费类型"
  146. prop="type">
  147. <el-select v-model="maskForm.type"
  148. :disabled='!isNew'
  149. clearable
  150. filterable>
  151. <el-option label="考级"
  152. :value="1"></el-option>
  153. <el-option label="缴费"
  154. :value="2"></el-option>
  155. <el-option label="声部更改"
  156. :value="3"></el-option>
  157. <el-option label="乐器更换"
  158. :value="4"></el-option>
  159. </el-select>
  160. </el-form-item>
  161. <el-form-item label="金额"
  162. prop='money'>
  163. <el-input v-model="maskForm.money"
  164. type="number"
  165. @mousewheel.native.prevent
  166. :disabled='!isNew'></el-input>
  167. </el-form-item>
  168. <el-form-item label="分部"
  169. prop="organId">
  170. <el-select v-model="maskForm.organId"
  171. :disabled='!isNew'
  172. clearable
  173. filterable>
  174. <el-option v-for='(item,index) in organList'
  175. :key="index"
  176. :value="item.id"
  177. :label="item.name"></el-option>
  178. </el-select>
  179. </el-form-item>
  180. <el-form-item label="查看链接"
  181. v-if="!isNew">
  182. <el-input style='width:400px'
  183. :disabled='!isNew'
  184. v-model="maskForm.code"></el-input>
  185. <el-button type='danger'
  186. @click="onCreateQRCode">二维码</el-button>
  187. </el-form-item>
  188. <el-form-item label="收费详情"
  189. prop="desc">
  190. <el-input type='textarea'
  191. :disabled='!isNew'
  192. v-model="maskForm.desc"
  193. style="width:490px"
  194. :autosize="{minRows: 5}"></el-input>
  195. </el-form-item>
  196. </el-form>
  197. <span slot="footer"
  198. class="dialog-footer">
  199. <el-button @click="zeroVisible = false">取 消</el-button>
  200. <el-button type="primary"
  201. v-if="isNew"
  202. @click="addZero">确 定</el-button>
  203. <el-button v-if="!isNew"
  204. type="primary"
  205. @click="zeroVisible = false">确定</el-button>
  206. </span>
  207. </el-dialog>
  208. <el-dialog :title="title1"
  209. :visible.sync="zeroVisible1"
  210. @close="onFormClose('maskForm1')"
  211. width="650px">
  212. <el-form :model='maskForm1'
  213. :rules="maskRules1"
  214. label-width="100px"
  215. label-position="right"
  216. :inline="true"
  217. ref="maskForm1">
  218. <el-form-item label="标题"
  219. prop="title">
  220. <el-input v-model="maskForm1.title"
  221. :disabled='!isNew1'></el-input>
  222. </el-form-item>
  223. <el-form-item label="收费类型"
  224. prop="type">
  225. <el-select v-model="maskForm1.type"
  226. :disabled='!isNew1'
  227. clearable
  228. filterable>
  229. <el-option label="考级"
  230. :value="1"></el-option>
  231. <el-option label="缴费"
  232. :value="2"></el-option>
  233. <el-option label="声部更改"
  234. :value="3"></el-option>
  235. <el-option label="乐器更换"
  236. :value="4"></el-option>
  237. </el-select>
  238. </el-form-item>
  239. <el-form-item label="学员编号"
  240. prop='studentId'>
  241. <el-input v-model="maskForm1.studentId"
  242. @blur="onStudentChange"
  243. type="number"
  244. @mousewheel.native.prevent
  245. :disabled='!isNew1'></el-input>
  246. </el-form-item>
  247. <el-form-item label="金额"
  248. prop='money'>
  249. <el-input v-model="maskForm1.money"
  250. type="number"
  251. @mousewheel.native.prevent
  252. :disabled='!isNew1'></el-input>
  253. </el-form-item>
  254. <el-form-item label="学员姓名"
  255. prop='studentName'>
  256. <el-input v-model="maskForm1.studentName"
  257. :disabled='true'></el-input>
  258. </el-form-item>
  259. <el-form-item label="查看链接"
  260. v-if="!isNew1">
  261. <el-input style='width:400px'
  262. :disabled='!isNew1'
  263. v-model="maskForm1.code"></el-input>
  264. <el-button type='danger'
  265. @click="onCreateQRCode">二维码</el-button>
  266. </el-form-item>
  267. <el-form-item label="收费详情"
  268. prop="desc">
  269. <el-input type='textarea'
  270. :disabled='!isNew1'
  271. v-model="maskForm1.desc"
  272. style="width:490px"
  273. :autosize="{minRows: 5}"></el-input>
  274. </el-form-item>
  275. </el-form>
  276. <span slot="footer"
  277. class="dialog-footer">
  278. <el-button @click="zeroVisible1 = false">取 消</el-button>
  279. <el-button type="primary"
  280. v-if="isNew1"
  281. @click="addZero1">确 定</el-button>
  282. <el-button v-if="!isNew1"
  283. type="primary"
  284. @click="zeroVisible1 = false">确定</el-button>
  285. </span>
  286. </el-dialog>
  287. <el-dialog :visible.sync="qrcodeStatus"
  288. center
  289. width="300px">
  290. <div class="right-code">
  291. <h2 class="title">缴费链接</h2>
  292. <div id="qrcode"
  293. class="qrcode code"
  294. ref="qrCodeUrl"></div>
  295. <!-- <p class="code-url"
  296. v-if="codeUrl2">{{ codeUrl2 }}</p> -->
  297. </div>
  298. </el-dialog>
  299. </div>
  300. </template>
  301. <script>
  302. import { getEmployeeOrgan } from '@/api/buildTeam'
  303. import pagination from '@/components/Pagination/index'
  304. import { vaildStudentUrl } from '@/utils/validate'
  305. import { addZero, getZero, removeZero, getBasic } from '@/api/zeroManager'
  306. import QRCode from 'qrcodejs2'
  307. export default {
  308. components: { pagination },
  309. data () {
  310. return {
  311. zeroVisible: false,
  312. searchForm: {
  313. organId: null,
  314. chargeType: null,
  315. type: null,
  316. search: null
  317. },
  318. tableList: [{}],
  319. organList: [],
  320. maskForm: {
  321. organId: '',
  322. type: '',
  323. money: '',
  324. desc: '',
  325. title: '',
  326. code: ''
  327. },
  328. maskRules: {
  329. organId: [{ required: true, message: '请选择分部', trigger: 'change' }],
  330. type: [{ required: true, message: '请选择收费类型', trigger: 'change' }],
  331. money: [{ required: true, message: '请输入收费金额', trigger: 'change' }],
  332. title: [{ required: true, message: '请输入标题名称', trigger: 'change' }],
  333. },
  334. pageInfo: {
  335. // 分页规则
  336. limit: 10, // 限制显示条数
  337. page: 1, // 当前页
  338. total: 0, // 总条数
  339. page_size: [10, 20, 40, 50] // 选择限制显示条数
  340. },
  341. isNew: false,
  342. title: '新增收费',
  343. qrcodeStatus: false,
  344. qrcodes: true,
  345. activeRow: null,
  346. title1: '新增收费',
  347. activeRow1: null,
  348. zeroVisible1: false,
  349. maskForm1: {
  350. type: null,
  351. money: null,
  352. desc: null,
  353. title: null,
  354. code: null,
  355. studentId: null,
  356. studentName: null,
  357. },
  358. isNew1: false,
  359. maskRules1: {
  360. organId: [{ required: true, message: '请选择分部', trigger: 'change' }],
  361. type: [{ required: true, message: '请选择收费类型', trigger: 'change' }],
  362. money: [{ required: true, message: '请输入收费金额', trigger: 'change' }],
  363. title: [{ required: true, message: '请输入标题名称', trigger: 'change' }],
  364. studentId: [{ required: true, message: '请输入学员编号', trigger: 'blur' }],
  365. },
  366. }
  367. }, mounted () {
  368. getEmployeeOrgan().then(res => {
  369. if (res.code == 200) {
  370. this.organList = res.data;
  371. }
  372. })
  373. this.getList();
  374. },
  375. methods: {
  376. search () {
  377. this.pageInfo.page = 1;
  378. this.getList()
  379. },
  380. onReSet () {
  381. this.searchForm = {
  382. organId: null,
  383. chargeType: null,
  384. type: null,
  385. search: null
  386. }
  387. },
  388. getList () {
  389. let searchForm = this.searchForm
  390. let params = {
  391. organId: searchForm.organId ? searchForm.organId : null,
  392. chargeType: searchForm.chargeType ? searchForm.chargeType : null,
  393. type: searchForm.type ? searchForm.type : null,
  394. search: searchForm.search ? searchForm.search : null,
  395. page: this.pageInfo.page,
  396. rows: this.pageInfo.limit
  397. }
  398. getZero(params).then(res => {
  399. if (res.code == 200) {
  400. this.tableList = res.data.rows
  401. this.pageInfo.total = res.data.total
  402. }
  403. })
  404. },
  405. onFormClose (formName) { // 关闭弹窗重置验证
  406. if(formName == 'maskForm') {
  407. this.maskForm = {
  408. organId: null,
  409. type: null,
  410. money: null,
  411. desc: null,
  412. title: null,
  413. code: null
  414. }
  415. } else if(formName == 'maskForm1') {
  416. this.maskForm1 = {
  417. type: null,
  418. money: null,
  419. desc: null,
  420. title: null,
  421. code: null,
  422. studentId: null,
  423. studentName: null,
  424. }
  425. }
  426. this.$refs[formName].resetFields()
  427. },
  428. newVisible () {
  429. this.isNew = true;
  430. this.zeroVisible = true;
  431. this.title = '新增公用收费'
  432. },
  433. newVisible1 () {
  434. this.isNew1 = true;
  435. this.zeroVisible1 = true;
  436. this.title1 = '新增个人收费'
  437. },
  438. lookVisible (row) {
  439. if(row.userId) {
  440. this.isNew1 = false;
  441. this.zeroVisible1 = true;
  442. this.title1 = '查看个人收费'
  443. this.activeRow = row
  444. this.maskForm1.code = vaildStudentUrl() + `/#/sporadicPay?id=${this.activeRow.id}&userId=${this.activeRow.userId}`
  445. this.maskForm1.type = parseInt(row.chargeType)
  446. this.maskForm1.desc = row.detail
  447. this.maskForm1.title = row.title
  448. this.maskForm1.money = row.amount
  449. this.maskForm1.studentId = row.userId
  450. this.maskForm1.studentName = row.userName
  451. } else {
  452. this.isNew = false;
  453. this.zeroVisible = true;
  454. this.title = '查看公用收费'
  455. this.activeRow = row
  456. this.maskForm.code = vaildStudentUrl() + `/#/sporadicLogin?id=${this.activeRow.id}`
  457. this.maskForm.type = parseInt(row.chargeType)
  458. this.maskForm.desc = row.detail
  459. this.maskForm.title = row.title
  460. this.maskForm.organId = row.organId
  461. this.maskForm.money = row.amount
  462. }
  463. },
  464. onCreateQRCode () { // 生成报名二维码
  465. this.qrcodeStatus = true
  466. setTimeout(() => {
  467. if (this.qrcodes) {
  468. this.qrcodes = false
  469. this.qrcode = new QRCode('qrcode', {
  470. width: 250,
  471. height: 250,
  472. colorDark: '#000000',
  473. colorLight: '#ffffff',
  474. correctLevel: QRCode.CorrectLevel.H
  475. })
  476. }
  477. this.qrcode.clear();
  478. if(this.activeRow.userId) {
  479. this.qrcode.makeCode(vaildStudentUrl() + `/#/sporadicPay?id=${this.activeRow.id}&userId=${this.activeRow.userId}`)
  480. } else {
  481. this.qrcode.makeCode(vaildStudentUrl() + `/#/sporadicLogin?id=${this.activeRow.id}`)
  482. }
  483. }, 500)
  484. },
  485. addZero () {
  486. this.$refs['maskForm'].validate(item => {
  487. if (item) {
  488. let obj = {
  489. chargeType: this.maskForm.type,
  490. detail: this.maskForm.desc,
  491. title: this.maskForm.title,
  492. organId: this.maskForm.organId,
  493. amount: this.maskForm.money
  494. }
  495. addZero(obj).then(res => {
  496. if (res.code == 200) {
  497. this.$message.success('新增成功')
  498. this.zeroVisible = false;
  499. this.getList()
  500. }
  501. })
  502. }
  503. })
  504. },
  505. addZero1 () {
  506. this.$refs['maskForm1'].validate(item => {
  507. if (item) {
  508. let maskForm1 = this.maskForm1
  509. if(!maskForm1.studentName) {
  510. this.$message.error('学员信息不存在')
  511. return
  512. }
  513. let obj = {
  514. chargeType: maskForm1.type,
  515. detail: maskForm1.desc,
  516. title: maskForm1.title,
  517. userId: maskForm1.studentId,
  518. amount: maskForm1.money
  519. }
  520. addZero(obj).then(res => {
  521. if (res.code == 200) {
  522. this.$message.success('新增成功')
  523. this.zeroVisible1 = false;
  524. this.getList()
  525. }
  526. })
  527. }
  528. })
  529. },
  530. onStudentChange() {
  531. let studentId = this.maskForm1.studentId
  532. // 判断学生编号是否存在
  533. if(!studentId) {
  534. return
  535. }
  536. getBasic({ userId: studentId }).then(res => {
  537. if(res.code == 200) {
  538. if(res.data) {
  539. this.maskForm1.studentName = res.data.name
  540. } else {
  541. this.maskForm1.studentName = null
  542. }
  543. }
  544. })
  545. },
  546. removeItem (row) {
  547. this.$confirm('是否删除该收费', '提示', {
  548. confirmButtonText: '确定',
  549. cancelButtonText: '取消',
  550. type: 'warning'
  551. }).then(() => {
  552. removeZero({ id: row.id }).then(res => {
  553. if (res.code == 200) {
  554. this.$message.success('删除成功')
  555. this.zeroVisible = false;
  556. this.getList()
  557. }
  558. })
  559. }).catch(() => {
  560. });
  561. }
  562. },
  563. watch: {
  564. zeroVisible (val) {
  565. if (!val) {
  566. this.maskForm = {
  567. organId: '',
  568. type: '',
  569. money: '',
  570. desc: '',
  571. title: '',
  572. code: ''
  573. }
  574. // this.$refs['maskForm'].resetFields()
  575. // console.log(this.$refs['zeroForm'].resetFields)
  576. }
  577. },
  578. },
  579. filters: {
  580. chargeTypeFilter (val) {
  581. let template = {
  582. '1': '考级',
  583. '2': '缴费',
  584. '3': '声部更改',
  585. '4': '乐器更换'
  586. }
  587. return template[val]
  588. }
  589. }
  590. }
  591. </script>
  592. <style lang="scss" scoped>
  593. .right-code {
  594. // width: 50%;
  595. // float: left;
  596. .title {
  597. font-size: 18px;
  598. text-align: center;
  599. padding-bottom: 8px;
  600. }
  601. }
  602. .newBand {
  603. display: inline-block;
  604. }
  605. </style>