memberTradeLog.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. <template>
  2. <div class="form-wrap">
  3. <el-form
  4. class="search-box"
  5. ref="form"
  6. :model="form"
  7. :inline="true"
  8. label-width="140px"
  9. >
  10. <div class="block-title">
  11. 查询条件
  12. </div>
  13. <el-form-item
  14. label="会员ID"
  15. prop="keyWords8">
  16. <el-input v-model="form.keyWords8"></el-input>
  17. </el-form-item>
  18. <el-form-item
  19. label="交易类型"
  20. prop="keyWords1"
  21. >
  22. <el-select
  23. v-model="form.keyWords1"
  24. placeholder="请选择"
  25. >
  26. <el-option
  27. v-for="item in memberTradeTypeList"
  28. :key="item.value"
  29. :label="item.label"
  30. :value="item.value">
  31. </el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item
  35. label="操作员"
  36. prop="keyWords2"
  37. >
  38. <el-input v-model="form.keyWords2"></el-input>
  39. </el-form-item>
  40. <el-form-item
  41. label="会员名字"
  42. prop="keyWords3"
  43. >
  44. <el-input v-model="form.keyWords3"></el-input>
  45. </el-form-item>
  46. <el-form-item
  47. label="IC卡号"
  48. prop="keyWords4">
  49. <ReaderInput
  50. type="IC"
  51. v-model="form.keyWords4"></ReaderInput>
  52. </el-form-item>
  53. <el-form-item
  54. label="身份证号"
  55. prop="keyWords5">
  56. <ReaderInput
  57. type="ID"
  58. v-model="form.keyWords5"></ReaderInput>
  59. </el-form-item>
  60. <el-form-item
  61. label="会员类型"
  62. prop="keyWords6"
  63. >
  64. <el-select
  65. v-model="form.keyWords6"
  66. placeholder="请选择"
  67. >
  68. <el-option
  69. label="全部"
  70. value=""
  71. >
  72. </el-option>
  73. <el-option
  74. v-for="item in memberTypeList"
  75. :key="item.id"
  76. :label="item.name"
  77. :value="item.id"
  78. >
  79. </el-option>
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item
  83. label="起始时间"
  84. prop="startDate"
  85. >
  86. <el-date-picker
  87. v-model="form.startDate"
  88. type="datetime"
  89. placeholder="选择日期时间"
  90. >
  91. </el-date-picker>
  92. </el-form-item>
  93. <el-form-item
  94. label="截止时间"
  95. prop="endDate"
  96. >
  97. <el-date-picker
  98. v-model="form.endDate"
  99. type="datetime"
  100. default-time="23:59:59"
  101. placeholder="选择日期时间"
  102. >
  103. </el-date-picker>
  104. </el-form-item>
  105. <el-form-item
  106. label="银行交易流水号"
  107. prop="keyWords17"
  108. label-width="180px"
  109. >
  110. <el-input v-model="form.keyWords17"></el-input>
  111. </el-form-item>
  112. <el-form-item
  113. label="支付方式"
  114. prop="keyWords10">
  115. <el-select v-model="form.keyWords10">
  116. <el-option
  117. v-for="item in payChannelOptions"
  118. :key="item"
  119. :label="item"
  120. :value="item">
  121. </el-option>
  122. </el-select>
  123. </el-form-item>
  124. <div class="btn-wrap">
  125. <el-button @click="exportStatist">
  126. 导出
  127. </el-button>
  128. <el-button
  129. @click="reset"
  130. >
  131. 重置
  132. </el-button>
  133. <el-button
  134. type="primary"
  135. @click="getList"
  136. >
  137. 搜索
  138. </el-button>
  139. </div>
  140. </el-form>
  141. <div class="table-box">
  142. <div class="block-title">
  143. 会员卡列表
  144. </div>
  145. <el-table
  146. border
  147. stripe
  148. v-loading="loading"
  149. :data="tableData">
  150. <el-table-column type="expand">
  151. <template slot-scope="props">
  152. <div
  153. class="block-title"
  154. v-if="props.row.upgrade_info">
  155. 升级信息
  156. </div>
  157. <el-form
  158. inline
  159. v-if="props.row.upgrade_info"
  160. class="table-expand">
  161. <!-- <el-form-item label="原卡ID">
  162. <span>{{ props.row.upgrade_info.old_memberTypeId }}</span>
  163. </el-form-item> -->
  164. <el-form-item label="原会员卡类型">
  165. <span>{{ props.row.upgrade_info.oldMemberTypeName }}</span>
  166. </el-form-item>
  167. <el-form-item label="订单号">
  168. <span>{{ props.row.upgrade_info.orderNo }}</span>
  169. </el-form-item>
  170. <el-form-item label="票号">
  171. <span>{{ props.row.upgrade_info.ticketNo }}</span>
  172. </el-form-item>
  173. </el-form>
  174. </template>
  175. </el-table-column>
  176. <el-table-column
  177. prop="iccardNo"
  178. label="IC卡号"
  179. >
  180. </el-table-column>
  181. <el-table-column
  182. prop="number"
  183. label="数量"
  184. >
  185. </el-table-column>
  186. <el-table-column
  187. prop="category"
  188. label="会员大类"
  189. >
  190. <template slot-scope="prop">
  191. {{ prop.row.category | memberCategory }}
  192. </template>
  193. </el-table-column>
  194. <el-table-column
  195. prop="memberTypeName"
  196. label="会员类型"
  197. >
  198. </el-table-column>
  199. <el-table-column
  200. prop="name"
  201. label="姓名"
  202. >
  203. </el-table-column>
  204. <el-table-column
  205. width="100"
  206. prop="address"
  207. label="地址"
  208. >
  209. <template slot-scope="prop">
  210. <Ellipsis
  211. type="tooltips"
  212. :content="prop.row.address"
  213. :length="10"></Ellipsis>
  214. </template>
  215. </el-table-column>
  216. <el-table-column
  217. label="交易天数"
  218. width="120"
  219. prop="recharge_day_time">
  220. </el-table-column>
  221. <el-table-column
  222. label="交易类型"
  223. >
  224. <template slot-scope="prop">
  225. {{ prop.row.trade_type | tradeType }}
  226. </template>
  227. </el-table-column>
  228. <el-table-column
  229. label="支付方式"
  230. width="120"
  231. prop="payChannel">
  232. </el-table-column>
  233. <el-table-column
  234. width="180"
  235. prop="idcardNo"
  236. label="身份证号"
  237. >
  238. <template slot-scope="scope">
  239. {{ isPapersIdDesensitize ? $options.filters.formatIDCard(scope.row.idcardNo) : scope.row.idcardNo }}
  240. </template>
  241. </el-table-column>
  242. <el-table-column
  243. prop="payChannel"
  244. label="支付方式"
  245. >
  246. </el-table-column>
  247. <el-table-column
  248. prop="pay_status"
  249. label="支付状态"
  250. >
  251. <template slot-scope="prop">
  252. <el-tag
  253. :type="getPayStatus(prop.row.pay_status,'type')"
  254. size="normal"
  255. >
  256. {{ getPayStatus(prop.row.pay_status) }}
  257. </el-tag>
  258. </template>
  259. </el-table-column>
  260. <el-table-column
  261. prop="total_money"
  262. label="交易金额"
  263. >
  264. </el-table-column>
  265. <el-table-column
  266. prop="creator"
  267. label="操作员"
  268. >
  269. </el-table-column>
  270. <el-table-column
  271. width="160"
  272. label="交易时间"
  273. >
  274. <template slot-scope="prop">
  275. {{ prop.row.trade_time | formatTime }}
  276. </template>
  277. </el-table-column>
  278. <el-table-column
  279. label="已开发票"
  280. width="120"
  281. prop="is_invoice_picked">
  282. <template slot-scope="scope">
  283. <el-tag :type="scope.row.is_invoice_picked?'success':'info'">
  284. {{ scope.row.is_invoice_picked?'是':'否' }}
  285. </el-tag>
  286. </template>
  287. </el-table-column>
  288. <el-table-column
  289. width="160"
  290. label="操作"
  291. >
  292. <template slot-scope="prop">
  293. <el-link
  294. v-if="(scenicName==='狼山景区'||scenicName==='军山景区')&&(prop.row.payChannel==='POS支付'||prop.row.payChannel==='中行支付')&&(prop.row.pay_status==='WAIT_PAY')"
  295. type="primary"
  296. @click="confirmPOS(prop.row)">
  297. 确认POS支付
  298. </el-link>
  299. <el-link
  300. type="primary"
  301. v-if="!prop.row.is_invoice_picked"
  302. @click="showPickInvoice(prop.row)">
  303. 开票
  304. </el-link>
  305. </template>
  306. </el-table-column>
  307. </el-table>
  308. <el-pagination
  309. background
  310. :current-page.sync="form.pageNum"
  311. :page-sizes="[10, 20, 50, 100]"
  312. :page-size="form.pageSize"
  313. @size-change="handleSizeChange"
  314. @current-change="getList()"
  315. layout="total, sizes, prev, pager, next, jumper"
  316. :total="total"
  317. >
  318. </el-pagination>
  319. </div>
  320. <el-dialog
  321. title="开票"
  322. :visible.sync="visible"
  323. width="500px"
  324. @close="visible=false">
  325. <el-form
  326. class="search-box"
  327. ref="formEl"
  328. :model="formEl"
  329. :inline="true"
  330. label-width="100px"
  331. style="background: transparent"
  332. >
  333. <el-form-item
  334. verify
  335. label="开票方式"
  336. prop="invoiceType"
  337. >
  338. <el-radio
  339. v-model="formEl.invoiceType"
  340. :label="1">
  341. 扫码开票
  342. </el-radio>
  343. <el-radio
  344. v-model="formEl.invoiceType"
  345. :label="0">
  346. 普通开票
  347. </el-radio>
  348. </el-form-item>
  349. <el-form-item
  350. v-if="!formEl.invoiceType"
  351. verify
  352. label="购买方"
  353. prop="invoiceBuyer"
  354. >
  355. <el-input
  356. v-model="formEl.invoiceBuyer"
  357. style="width:100%"></el-input>
  358. </el-form-item>
  359. <el-form-item
  360. v-if="!formEl.invoiceType"
  361. label="纳税⼈识别号"
  362. prop="invoiceBuyerTaxNum "
  363. >
  364. <el-input
  365. v-model="formEl.invoiceBuyerTaxNum"
  366. style="width:100%"></el-input>
  367. </el-form-item>
  368. <el-form-item
  369. v-if="!formEl.invoiceType"
  370. label="纳税⼈手机号"
  371. prop="invoiceBuyerPhone "
  372. >
  373. <el-input
  374. v-model="formEl.invoiceBuyerPhone"
  375. style="width:100%"></el-input>
  376. </el-form-item>
  377. <el-form-item
  378. v-if="!formEl.invoiceType"
  379. label="纳税⼈邮箱"
  380. prop="invoiceBuyerEmail "
  381. >
  382. <el-input
  383. v-model="formEl.invoiceBuyerEmail"
  384. style="width:100%"></el-input>
  385. </el-form-item>
  386. </el-form>
  387. <span slot="footer">
  388. <el-button @click="visible = false">取消</el-button>
  389. <el-button
  390. type="primary"
  391. @click="submitPickInvoice">确定</el-button>
  392. </span>
  393. </el-dialog>
  394. </div>
  395. </template>
  396. <script>
  397. import ReaderInput from '@/components/ReaderInput'
  398. import { memberTradeTypeList } from '@/assets/staticData'
  399. import { getMemberType, getMemberTradeList, pickInvoice } from '@/api/member'
  400. import { exportMemberTradeList } from '@/api/queryReport'
  401. import moment from 'moment'
  402. import { getPayStatus } from '@/utils/index'
  403. import { payPOS } from '@/api/pay'
  404. import { getSelf } from '@/api/systemSetting/account'
  405. const Store = require('electron-store')
  406. const localStore = new Store()
  407. export default {
  408. name: 'memberTradeLog',
  409. components: {
  410. ReaderInput
  411. },
  412. data () {
  413. return {
  414. comName: '',
  415. memberTradeTypeList,
  416. memberTypeList: [],
  417. form: {
  418. startDate: new Date(moment().startOf('day').valueOf()), // 销售起始时间
  419. endDate: new Date(moment().endOf('day').valueOf()), // 销售截止时间
  420. keyWords1: '', // 交易类型 1销售 2充值 3结算 4补卡
  421. keyWords2: '', // 创建人
  422. keyWords3: '', // 会员名字
  423. keyWords4: '', // ic卡号
  424. keyWords5: '', // 身份证号
  425. keyWords6: '', // 会员类型id
  426. keyWords8: '', // 会员类型id
  427. keyWords10: '', // 支付方式
  428. keyWords17: '', // 银行交易流水号
  429. orderByKeyWords: '',
  430. orderString: '',
  431. pageNum: 1,
  432. pageSize: 10
  433. },
  434. tableData: [],
  435. total: 0,
  436. loading: false,
  437. invoiceType: 0,
  438. formEl: {
  439. invoiceType: 1,
  440. invoiceBuyer: '',
  441. invoiceBuyerTaxNum: '',
  442. invoiceBuyerPhone: '',
  443. invoiceBuyerEmail: ''
  444. },
  445. currentOrder: {},
  446. visible: false
  447. }
  448. },
  449. computed: {
  450. isPapersIdDesensitize () {
  451. const value = this.$store.state.app.systemConfig.find(i => i.configKey === 'papers_id_desensitize')?.configValue
  452. return value === '1'
  453. },
  454. scenicName () {
  455. return this.$localStore.get('scenicName') || this.$store.state.user.scenicName
  456. },
  457. payChannelOptions () {
  458. return this.$store.state.app.payChannelOptions
  459. }
  460. },
  461. filters: {
  462. tradeType (input) {
  463. return memberTradeTypeList.find(i => i.value === input).label
  464. }
  465. },
  466. mounted () {
  467. this.getMemberTypeList().then(() => {
  468. this.getList()
  469. })
  470. },
  471. methods: {
  472. getPayStatus,
  473. reset () {
  474. this.$refs.form.resetFields()
  475. },
  476. exportStatist () {
  477. exportMemberTradeList(this.form).then(res => {
  478. this.$message.success('导出成功。')
  479. this.goToDownload()
  480. })
  481. },
  482. // 获取会员类型
  483. getMemberTypeList () {
  484. return getMemberType({
  485. pageNum: 1,
  486. pageSize: 10000
  487. }).then(res => {
  488. this.memberTypeList = res.list
  489. })
  490. },
  491. handleSizeChange (size) {
  492. this.form.pageSize = size
  493. this.getList()
  494. },
  495. // 获取列表
  496. getList () {
  497. this.loading = true
  498. getMemberTradeList(this.form).then(res => {
  499. this.total = res.total
  500. this.tableData = res.list
  501. }).finally(() => {
  502. this.loading = false
  503. })
  504. },
  505. confirmPOS (record) {
  506. this.$confirm('请确认该订单已付款,将手动更新订单状态为已支付', '提示', {
  507. confirmButtonText: '确定',
  508. cancelButtonText: '取消',
  509. type: 'warning'
  510. }).then(() => {
  511. getSelf().then(response => {
  512. const params = {
  513. managerId: response.id,
  514. id: record.id,
  515. payChannel: record.payChannel,
  516. posId: localStore.get('termId'),
  517. tradeInfo: '',
  518. type: 'MEMBER'
  519. }
  520. payPOS(params).then(res => {
  521. this.$message.success('操作成功')
  522. this.getList()
  523. })
  524. })
  525. }).catch(() => {
  526. })
  527. },
  528. showPickInvoice (order) {
  529. this.visible = true
  530. this.currentOrder = order
  531. },
  532. submitPickInvoice () {
  533. this.$refs.formEl.validate(valid => {
  534. if (!valid) return
  535. if (this.formEl.invoiceType) {
  536. this.formEl.invoiceBuyer = ''
  537. this.formEl.invoiceBuyerTaxNum = ''
  538. this.formEl.invoiceBuyerPhone = ''
  539. this.formEl.invoiceBuyerEmail = ''
  540. }
  541. pickInvoice([this.currentOrder.id], this.formEl.invoiceType, this.formEl.invoiceBuyer, this.formEl.invoiceBuyerTaxNum, this.formEl.invoiceBuyerPhone, this.formEl.invoiceBuyerEmail).then(res => {
  542. this.$message.success('操作成功')
  543. this.getList()
  544. this.visible = false
  545. this.currentOrder = {}
  546. this.formEl = {
  547. invoiceType: 1,
  548. invoiceBuyer: '',
  549. invoiceBuyerTaxNum: ''
  550. }
  551. this.$confirm('发票已生成,是否跳转到发票下载页?', '提示', {
  552. confirmButtonText: '确定',
  553. cancelButtonText: '取消',
  554. type: 'warning'
  555. }).then(() => {
  556. this.$router.push('/queryReport/invoiceRecord')
  557. })
  558. })
  559. })
  560. }
  561. }
  562. }
  563. </script>