recharge-list.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template>
  2. <div class="app-container" v-loading="listLoading">
  3. <el-table :data="list" border fit highlight-current-row>
  4. <el-table-column align="center" :label="$t('finance.createdTime')" prop="CREATED_AT" min-width="140px">
  5. <template slot-scope="{row}">
  6. <span>{{ row.CREATED_AT | parseTime('{y}-{m}-{d} {h}:{i}') }}</span>
  7. </template>
  8. </el-table-column>
  9. <el-table-column align="center" min-width="160px" :label="$t('finance.rechargeAmount')" prop="AMOUNT">
  10. <template slot-scope="{row}">
  11. {{ row.AMOUNT | toThousandFilter }}
  12. </template>
  13. </el-table-column>
  14. <el-table-column align="center" min-width="150px" :label="$t('finance.rechargeStatus')" prop="STATUS_NAME">
  15. <template slot-scope="{row}">
  16. <el-tag :type="row.AUDIT_STATUS | statusFilter">{{row.STATUS_NAME}}</el-tag>
  17. </template>
  18. </el-table-column>
  19. <el-table-column align="center" min-width="180px" :label="$t('finance.bankName')" prop="OPEN_BANK_NAME"></el-table-column>
  20. <el-table-column align="center" min-width="150px" :label="$t('finance.bankAccount')" prop="BANK_NO"></el-table-column>
  21. <el-table-column align="center" min-width="150px" :label="$t('finance.printVoucher')">
  22. <template slot-scope="{row}">
  23. <el-button type="primary" size="mini" v-if="row.AUDIT_STATUS === '0'" @click="handleUpload(row.ID)">{{ $t('finance.uploadVoucher') }}</el-button>
  24. <el-button type="success" size="mini" v-if="row.AUDIT_STATUS !== '0'" @click="handleView(row)">{{ $t('finance.viewVoucher') }}</el-button>
  25. </template>
  26. </el-table-column>
  27. </el-table>
  28. <div class="white-box-footer" style="margin-top: 10px;">
  29. <el-button size="small" type="primary" @click="dialog = true">{{ $t('finance.recharge') }}</el-button>
  30. <pagination v-show="total > 0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.pageSize" @pagination="getList" />
  31. </div>
  32. <el-dialog :title="$t('finance.recharge')" :visible.sync="dialog" :width="screenWidth" style="margin-top: -70px;">
  33. <el-form ref="form" :model="form" :rules="rules" :label-position="labelPosition" v-loading="loading" style="margin-top: -20px; margin-bottom: -30px;">
  34. <el-row :gutter="20">
  35. <el-col :xs="24" :sm="24" :lg="24">
  36. <el-form-item :label="$t('finance.rechargeAmount')" prop="applyAmount" required>
  37. <el-input-number v-model.number="form.applyAmount" :min="minAmount" :max="maxAmount" :step="10000" style="width: 100%" clearable></el-input-number>
  38. </el-form-item>
  39. <el-form-item :label="$t('finance.bankAccount')" prop="bankNo" required>
  40. <el-input v-model.trim="form.bankNo" type="text" clearable style="width: 100%"></el-input>
  41. </el-form-item>
  42. <el-form-item :label="$t('finance.bankName')" prop="openBank" required>
  43. <el-select v-model="form.openBank" clearable filterable style="width: 100%">
  44. <el-option v-for="(item,key) in bankList" :key="key" :label="item.BANK_NAME" :value="item.BANK_CODE"></el-option>
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item>
  48. <el-button type="warning" size="small" @click="onCancel">{{ $t('table.cancel') }}</el-button>
  49. <el-button type="primary" size="small" @click="onSubmit">{{ $t('table.confirm') }}</el-button>
  50. </el-form-item>
  51. </el-col>
  52. </el-row>
  53. </el-form>
  54. </el-dialog>
  55. <el-dialog :title="$t('finance.viewVoucher')" :visible.sync="viewVoucher" :width="screenWidth" style="margin-top: -70px;">
  56. <div>
  57. <img :src="voucher" alt="" style="height: 100%; width: 100%;" />
  58. </div>
  59. <div slot="footer" class="dialog-footer">
  60. <el-button size="small" type="primary" @click="uploadAgain(auditId)">{{ $t('finance.uploadVoucher') }}</el-button>
  61. <el-button size="small" type="normal" @click="viewVoucher = false">{{ $t('common.close') }}</el-button>
  62. </div>
  63. </el-dialog>
  64. <el-dialog :title="$t('finance.uploadVoucher')" :visible.sync="uploadVoucher" :width="screenWidth" style="margin-top: -70px;">
  65. <el-upload
  66. class="avatar-uploader"
  67. :action="uploadUrl"
  68. :show-file-list="false"
  69. :headers="uploaderHeaders"
  70. :data="uploaderData"
  71. :on-success="handleSuccess"
  72. :before-upload="uploaderHandleBefore"
  73. :on-error="handleError">
  74. <img v-if="imageUrl" :src="imageUrl" class="avatar" alt="" />
  75. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  76. </el-upload>
  77. </el-dialog>
  78. </div>
  79. </template>
  80. <script>
  81. import {fetchApplyRecharge,fetchBankList, fetchRechargeList} from '@/api/finance'
  82. import {fetchToken} from "@/api/file"
  83. import waves from '@/directive/waves'
  84. import Pagination from '@/components/Pagination'
  85. import tool from "@/utils/tool"
  86. import {formatAmount, getScreenWidth} from "@/utils"
  87. import {integer, range, required} from "@/utils/rules"
  88. import LeoUploader from "@/components/Upload/Uploader"
  89. export default {
  90. name: 'RechargeDetails',
  91. components: { Pagination,LeoUploader },
  92. directives: { waves },
  93. filters: {
  94. statusFilter(status) {
  95. const statusEnums = {
  96. '0': 'info',
  97. '1': 'primary',
  98. '2': 'success',
  99. '3': 'danger',
  100. }
  101. return statusEnums[status] || 'warning'
  102. },
  103. },
  104. data() {
  105. return {
  106. tool: tool,
  107. list: [],
  108. total: 0,
  109. listLoading: true,
  110. listQuery: {
  111. page: 1,
  112. pageSize: 5,
  113. },
  114. dialog: false,
  115. loading: false,
  116. form: {
  117. applyAmount: 0,
  118. bankNo: '',
  119. openBank: '',
  120. bankAddress: '',
  121. },
  122. minAmount: 1,
  123. maxAmount: 10000000000,
  124. rules: {
  125. applyAmount: [required, integer, range(this.minAmount, this.maxAmount)],
  126. bankNo: [required],
  127. openBank: [required],
  128. },
  129. bankList: [],
  130. screenWidth: getScreenWidth() > 600 ? '500px' : getScreenWidth() + 'px',
  131. labelPosition: getScreenWidth() > 600 ? 'right' : 'top',
  132. viewVoucher: false,
  133. voucher: '',
  134. auditId: null,
  135. voucherLoading: false,
  136. uploadVoucher: false,
  137. imageUrl: '',
  138. uploadUrl: '',
  139. uploaderData: {
  140. uploadToken: '',
  141. },
  142. uploaderHeaders: {
  143. 'Device-Type': 'pc',
  144. 'Suppress-Response-Code': '1',
  145. 'Authorization': '',
  146. },
  147. }
  148. },
  149. created() {
  150. this.getList()
  151. },
  152. mounted() {
  153. this.fetchBankList()
  154. },
  155. methods: {
  156. getList() {
  157. this.listLoading = true
  158. fetchRechargeList(this.listQuery).then(response => {
  159. this.list = response.data.list
  160. this.total = response.data.totalCount
  161. setTimeout(() => {
  162. this.listLoading = false
  163. }, 0.5 * 1000)
  164. })
  165. },
  166. fetchBankList() {
  167. fetchBankList().then(response => {
  168. this.bankList = response.data.allOpenBank
  169. })
  170. },
  171. onSubmit() {
  172. this.$refs['form'].validate((valid) => {
  173. if (valid) {
  174. this.loading = true
  175. fetchApplyRecharge(this.form).then(response => {
  176. this.$message({
  177. message: response.data,
  178. type: 'success',
  179. duration: 1.5 * 1000
  180. })
  181. this.$refs['form'].resetFields()
  182. this.dialog = false
  183. this.loading = false
  184. this.getList()
  185. }).catch((err) => {
  186. this.$message({
  187. message: err,
  188. type: 'error',
  189. duration: 3 * 1000
  190. })
  191. this.loading = false
  192. })
  193. } else {
  194. return false;
  195. }
  196. });
  197. },
  198. onCancel() {
  199. this.dialog = false
  200. this.$refs['form'].resetFields()
  201. },
  202. handleView(row) {
  203. this.voucher = tool.getArImage(row.BANK_PROVE, 'files/')
  204. this.auditId = row.ID
  205. this.viewVoucher = true
  206. },
  207. uploadAgain(id) {
  208. this.viewVoucher = false
  209. this.auditId = id
  210. this.uploadUrl = `${process.env.VUE_APP_BASE_API}/v1/finance/prove-add?id=${this.auditId}`
  211. this.uploadVoucher = true
  212. },
  213. handleUpload(id) {
  214. setTimeout(() => {
  215. this.auditId = id
  216. this.uploadUrl = `${process.env.VUE_APP_BASE_API}/v1/finance/prove-add?id=${this.auditId}`
  217. this.uploadVoucher = true
  218. }, 0.5 * 1000)
  219. },
  220. async uploaderHandleBefore() {
  221. this.$message({
  222. message: this.$t('common.uploadHints'),
  223. type: 'warning',
  224. duration: 500,
  225. })
  226. await fetchToken().then(response => {
  227. this.uploaderHeaders.Authorization = process.env.VUE_APP_ACCESS_TOKEN_PREFIX + response.data
  228. this.uploaderData.uploadToken = response.data
  229. })
  230. },
  231. handleSuccess(res, file) {
  232. this.imageUrl = URL.createObjectURL(file.raw)
  233. setTimeout(() => {
  234. this.uploadVoucher = false
  235. this.getList()
  236. }, 2 * 1000)
  237. },
  238. beforeUpload(file) {
  239. const typeAllowed = ['image/jpeg', 'image/jpg', 'image/png']
  240. const isLt2M = file.size / 1024 / 1024 < 2
  241. if (!typeAllowed.includes(file.type)) {
  242. this.$message.error('图片只能是 JPG/JPEG/PNG 格式!')
  243. return false
  244. }
  245. if (!isLt2M) {
  246. this.$message.error('图片大小不能超过 2MB!')
  247. return false
  248. }
  249. return true
  250. },
  251. handleError(err, file) {
  252. console.log(err, file)
  253. },
  254. }
  255. }
  256. </script>
  257. <style>
  258. .avatar-uploader .el-upload {
  259. border: 1px dashed #d9d9d9;
  260. border-radius: 6px;
  261. cursor: pointer;
  262. position: relative;
  263. overflow: hidden;
  264. }
  265. .avatar-uploader .el-upload:hover {
  266. border-color: #409EFF;
  267. }
  268. .avatar-uploader-icon {
  269. font-size: 28px;
  270. color: #8c939d;
  271. width: 178px;
  272. height: 178px;
  273. line-height: 178px;
  274. text-align: center;
  275. }
  276. .avatar {
  277. width: 178px;
  278. height: 178px;
  279. display: block;
  280. }
  281. </style>