receipt_list.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. <template>
  2. <div class="app-container">
  3. <div v-if="showDetail == 1">
  4. <!-- 筛选条件 -->
  5. <div>
  6. <Collapse :screen-form="searchForm">
  7. <template #right_btn>
  8. <el-button size="mini" @click="cancelFn">清空</el-button>
  9. <el-button size="mini" type="primary" @click="searchFn">搜索</el-button>
  10. </template>
  11. <template #search>
  12. <el-form ref="searchForm" :model="searchForm" label-width="100px" size="mini" label-position="left">
  13. <el-row :gutter="20">
  14. <el-col :xs="24" :sm="12" :lg="6">
  15. <el-form-item label="单据类型" prop="billType">
  16. <!-- <el-input v-model="searchForm.billType" placeholder="请输入"></el-input> -->
  17. <el-select v-model="searchForm.billType" class="selectStyle" placeholder="请选择" filterable>
  18. <el-option label="收款单" value="1"></el-option>
  19. <el-option label="付款单" value="3"></el-option>
  20. <el-option label="退款单" value="2"></el-option>
  21. </el-select>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :xs="24" :sm="12" :lg="6">
  25. <el-form-item label="单据编号" prop="billNo">
  26. <el-input v-model="searchForm.billNo" placeholder="请输入"></el-input>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :xs="24" :sm="12" :lg="6">
  30. <el-form-item label="往来单位" prop="wlCompanyType">
  31. <!-- <el-input v-model="searchForm.wlCompanyType" placeholder="请输入"></el-input> -->
  32. <el-select
  33. class="selectStyle"
  34. v-model="searchForm.wlCompanyType"
  35. placeholder="请选择"
  36. filterable
  37. clearable
  38. >
  39. <el-option v-for="(v, i) in customerList" :key="i" :label="v.name" :value="v.name"></el-option>
  40. </el-select>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :xs="24" :sm="12" :lg="6">
  44. <el-form-item label="付款单位" prop="customerName">
  45. <!-- <el-input v-model="searchForm.customerName" placeholder="请输入"></el-input> -->
  46. <el-select
  47. class="selectStyle"
  48. v-model="searchForm.customerName"
  49. placeholder="请选择"
  50. filterable
  51. clearable
  52. >
  53. <el-option v-for="(v, i) in customerList" :key="i" :label="v.name" :value="v.name"></el-option>
  54. </el-select>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :xs="24" :sm="12" :lg="6">
  58. <el-form-item label="结算方式" prop="settleType">
  59. <el-input v-model="searchForm.settleType" placeholder="请输入"></el-input>
  60. </el-form-item>
  61. </el-col>
  62. <!-- <el-col :xs="24" :sm="12" :lg="6">
  63. <el-form-item label="收款用途" prop="">
  64. <el-input v-model="searchForm." placeholder="请输入"></el-input>
  65. </el-form-item>
  66. </el-col> -->
  67. <el-col :xs="24" :sm="12" :lg="6">
  68. <el-form-item label="开始时间" prop="startTime">
  69. <el-date-picker
  70. class="selectStyle"
  71. v-model="searchForm.startTime"
  72. type="datetime"
  73. placeholder="选择日期时间"
  74. default-time="00:00:00"
  75. value-format="yyyy-MM-dd HH:mm:ss"
  76. >
  77. </el-date-picker>
  78. </el-form-item>
  79. </el-col>
  80. <el-col :xs="24" :sm="12" :lg="6">
  81. <el-form-item label="结束时间" prop="endTime">
  82. <el-date-picker
  83. class="selectStyle"
  84. v-model="searchForm.endTime"
  85. type="datetime"
  86. placeholder="选择日期时间"
  87. default-time="00:00:00"
  88. value-format="yyyy-MM-dd HH:mm:ss"
  89. >
  90. </el-date-picker>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :xs="24" :sm="12" :lg="6">
  94. <el-form-item label="区域" prop="websitNumber">
  95. <!-- <el-input v-model="searchForm.customerName" placeholder="请输入"></el-input> -->
  96. <el-select
  97. class="selectStyle"
  98. v-model="searchForm.websitNumber"
  99. placeholder="请选择"
  100. filterable
  101. clearable
  102. >
  103. <el-option v-for="(v, i) in orage" :key="i" :label="v.label" :value="v.value"></el-option>
  104. </el-select>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. </el-form>
  109. </template>
  110. </Collapse>
  111. </div>
  112. <!-- 按钮 -->
  113. <div class="btn-group clearfix">
  114. <div class="fl">
  115. <el-button
  116. type="primary"
  117. size="mini"
  118. v-if="$checkBtnRole('print', $route.meta.roles)"
  119. @click="toPrint"
  120. :disabled="tableSelection.length < 1"
  121. >打印发货单
  122. </el-button>
  123. </div>
  124. <!-- <importButton class="improt" imUrl="k3/receipt/export"/> -->
  125. <div class="fr">
  126. <ExportButton :exUrl="'k3/receipt/export'" :exParams="exParams" class="exportClass" />
  127. </div>
  128. </div>
  129. <!-- 列表 -->
  130. <div class="mymain-container">
  131. <div class="table">
  132. <el-table
  133. ref="table"
  134. v-loading="listLoading"
  135. :data="dataList"
  136. element-loading-text="Loading"
  137. border
  138. fit
  139. highlight-current-row
  140. stripe
  141. show-summary
  142. :summary-method="getSummaries"
  143. @select="handleSelect"
  144. @select-all="handleSelectAll"
  145. >
  146. <el-table-column align="center" type="selection" width="55"></el-table-column>
  147. <el-table-column align="left" label="单据类型" prop="billType" min-width="160" show-overflow-tooltip>
  148. <template slot-scope="scope">
  149. {{
  150. scope.row.billType == 1
  151. ? '收款单'
  152. : scope.row.billType == 2
  153. ? '退款单'
  154. : scope.row.billType == 3
  155. ? '付款单'
  156. : ''
  157. }}
  158. </template>
  159. </el-table-column>
  160. <el-table-column align="left" label="单据编码" prop="billNo" min-width="160" show-overflow-tooltip>
  161. <template slot-scope="scope">
  162. <CopyButton :copyText="scope.row.billNo" />
  163. <span>{{ scope.row.billNo }}</span>
  164. </template>
  165. </el-table-column>
  166. <el-table-column align="left" label="业务日期" prop="theTime" min-width="160" show-overflow-tooltip>
  167. </el-table-column>
  168. <!-- <el-table-column
  169. align="left"
  170. label="币别"
  171. prop="bibie"
  172. min-width="160"
  173. show-overflow-tooltip
  174. ></el-table-column> -->
  175. <el-table-column align="left" label="单据状态" prop="status" min-width="160" show-overflow-tooltip>
  176. <template slot-scope="scope">
  177. <el-tag size="mini" v-show="scope.row.status == 'A'">保存</el-tag>
  178. <el-tag size="mini" v-show="scope.row.status == 'B'" type="info">审核中</el-tag>
  179. <el-tag size="mini" v-show="scope.row.status == 'C'" type="success">已审核</el-tag>
  180. <el-tag size="mini" v-show="scope.row.status == 'D'" type="warning">重新审核</el-tag>
  181. </template>
  182. </el-table-column>
  183. <el-table-column align="left" label="钱包" prop="walletName" min-width="160" show-overflow-tooltip>
  184. </el-table-column>
  185. <el-table-column align="right" label="表头·应收金额" prop="" min-width="160" show-overflow-tooltip>
  186. </el-table-column>
  187. <el-table-column align="left" label="往来单位" prop="wlCompanyName" min-width="260" show-overflow-tooltip>
  188. <template slot-scope="scope">
  189. <CopyButton :copyText="scope.row.wlCompanyName" />
  190. <span>{{ scope.row.wlCompanyName }}</span>
  191. </template>
  192. </el-table-column>
  193. <el-table-column align="right" label="表头·实收金额" prop="amount" min-width="160" show-overflow-tooltip>
  194. <template slot-scope="scope">
  195. {{
  196. scope.row.billType == 3 || scope.row.billType == 2 ? -scope.row.amount : scope.row.amount | numToFixed
  197. }}
  198. </template>
  199. </el-table-column>
  200. <el-table-column
  201. align="right"
  202. label="收款金额"
  203. prop=""
  204. min-width="160"
  205. show-overflow-tooltip
  206. ></el-table-column>
  207. <!-- <el-table-column
  208. align="center"
  209. label="结算方式"
  210. prop="settleType"
  211. min-width="160"
  212. show-overflow-tooltip
  213. ></el-table-column> -->
  214. <!-- <el-table-column
  215. align="center"
  216. label="收款用途"
  217. prop=""
  218. min-width="160"
  219. show-overflow-tooltip
  220. ></el-table-column> -->
  221. <el-table-column align="left" label="付款单位" prop="customerName" min-width="260" show-overflow-tooltip>
  222. <template slot-scope="scope">
  223. <CopyButton :copyText="scope.row.customerName" />
  224. <span>{{ scope.row.customerName }}</span>
  225. </template>
  226. </el-table-column>
  227. <el-table-column align="right" label="表体·实收金额" prop="amount" min-width="160" show-overflow-tooltip>
  228. <template slot-scope="scope">
  229. {{
  230. scope.row.billType == 3 || scope.row.billType == 2 ? -scope.row.amount : scope.row.amount | numToFixed
  231. }}
  232. </template>
  233. </el-table-column>
  234. <el-table-column align="left" label="勾对" prop="" min-width="160" show-overflow-tooltip></el-table-column>
  235. <el-table-column align="left" label="备注" prop="remark" min-width="160" show-overflow-tooltip>
  236. </el-table-column>
  237. <el-table-column align="center" label="操作" min-width="160" show-overflow-tooltip fixed="right">
  238. <template slot-scope="scope">
  239. <el-button
  240. type="text"
  241. class="textColor"
  242. v-if="$checkBtnRole('examine', $route.meta.roles) && scope.row.status == 'C'"
  243. @click="NoExamineFn(scope.row.id)"
  244. >弃审
  245. </el-button
  246. >
  247. <el-button type="text" class="textColor" @click="seeFn(scope.row.id)">查看</el-button>
  248. <el-button
  249. type="text"
  250. class="textColor"
  251. v-if="$checkBtnRole('print', $route.meta.roles)"
  252. @click="toPrint(scope.row, 2)"
  253. >打印
  254. </el-button
  255. >
  256. </template>
  257. </el-table-column>
  258. </el-table>
  259. </div>
  260. <!-- 分页 -->
  261. <div class="fr">
  262. <el-pagination
  263. @size-change="handleSizeChange"
  264. @current-change="handleCurrentChange"
  265. :current-page="currentPage"
  266. :page-sizes="[10, 20, 30, 50, 500]"
  267. :page-size="pageSize"
  268. layout="total, sizes, prev, pager, next, jumper"
  269. :total="listTotal"
  270. >
  271. </el-pagination>
  272. </div>
  273. </div>
  274. </div>
  275. <ReceiptPrint :listItem="queryItem" v-else-if="showDetail == 2" @backListFormDetail="backList" />
  276. <ReceiptListDetail :detailId="detailId" v-else />
  277. <print-preview ref="preView" />
  278. </div>
  279. </template>
  280. <script>
  281. import { disAutoConnect, hiprint } from 'vue-plugin-hiprint'
  282. disAutoConnect()
  283. import printPreview from './components/design/preview.vue'
  284. import { getCompanyList } from '@/api/user'
  285. import { getCustomerList } from '@/api/finance/wallet'
  286. import { getK3ReceiptList, getK3ReceiptDetail, getK3ReceiptAbandon } from '@/api/finance/receipt_list'
  287. import ReceiptListDetail from './components/receipt_list-detail'
  288. import ReceiptPrint from '@/views/finance/components/receipt_print.vue'
  289. import importButton from '@/components/Common/import-button.vue'
  290. import { changeNumberMoneyToChinese, dateFormat } from '@/utils/util'
  291. import { numToFixed } from '@/filters'
  292. export default {
  293. components: {
  294. ReceiptPrint,
  295. printPreview,
  296. importButton,
  297. ReceiptListDetail
  298. },
  299. data() {
  300. return {
  301. customerList: [],
  302. currentPage: 1, // 当前页码
  303. pageSize: 10, // 每页数量
  304. listTotal: 0, // 列表总数
  305. dataList: [], // 列表数据
  306. searchForm: {
  307. billType: '',
  308. billNo: '',
  309. wlCompanyType: '',
  310. customerName: '',
  311. settleType: '',
  312. startTime: '',
  313. endTime: '',
  314. websitNumber: ''
  315. }, //搜索表单
  316. listLoading: false, // 列表加载loading
  317. showDetail: 1,
  318. detailId: null,
  319. queryItem: {},
  320. tableSelection: [],
  321. company: '',
  322. panel: '',
  323. isCollapse: true,
  324. hiprintTemplate: '',
  325. orage: [
  326. {
  327. value: 'GZ',
  328. label: '广州'
  329. },
  330. {
  331. value: 'FS',
  332. label: '佛山'
  333. }
  334. ]
  335. }
  336. },
  337. computed: {
  338. exParams() {
  339. return {
  340. ...this.searchForm
  341. }
  342. }
  343. },
  344. created() {
  345. this.getDataList()
  346. this.getCustomerDataList()
  347. this.getCompanyList()
  348. },
  349. mounted() {
  350. },
  351. methods: {
  352. //获取经销商列表
  353. async getCustomerDataList() {
  354. let res = await getCustomerList({
  355. pageNum: 1,
  356. pageSize: -1
  357. })
  358. this.customerList = res.data.records
  359. },
  360. //合计
  361. getSummaries(param) {
  362. const { columns, data } = param
  363. const sums = []
  364. columns.forEach((column, index) => {
  365. if (index === 0) {
  366. sums[index] = '合计'
  367. }
  368. if (index === 8) {
  369. let arr = []
  370. data.forEach(v => {
  371. if (v.billType == 2 || v.billType == 3) {
  372. arr.push(-v.amount)
  373. } else {
  374. arr.push(v.amount)
  375. }
  376. })
  377. let a = arr.reduce((prev, curr) => {
  378. const value = Number(curr)
  379. if (!isNaN(value)) {
  380. return prev + curr
  381. } else {
  382. return prev
  383. }
  384. }, 0)
  385. sums[index] = numToFixed(a)
  386. sums[11] = numToFixed(a)
  387. }
  388. })
  389. return sums
  390. },
  391. //弃审
  392. async NoExamineFn(id) {
  393. await getK3ReceiptAbandon({ id })
  394. this.$message.success('弃审成功')
  395. this.getDataList({ pageSize: this.pageSize, pageNum: this.currentPage })
  396. },
  397. // 更改每页数量
  398. handleSizeChange(val) {
  399. this.pageSize = val
  400. this.currentPage = 1
  401. this.getDataList()
  402. },
  403. // 更改当前页
  404. handleCurrentChange(val) {
  405. this.currentPage = val
  406. this.getDataList()
  407. },
  408. //清空
  409. cancelFn() {
  410. this.$refs.searchForm.resetFields()
  411. },
  412. //搜索
  413. searchFn() {
  414. this.getDataList()
  415. },
  416. async getDataList() {
  417. let params = {
  418. billType: this.searchForm.billType,
  419. billNo: this.searchForm.billNo,
  420. wlCompanyType: this.searchForm.wlCompanyType,
  421. customerName: this.searchForm.customerName,
  422. settleType: this.searchForm.settleType,
  423. startTime: this.searchForm.startTime,
  424. endTime: this.searchForm.endTime,
  425. websitNumber: this.searchForm.websitNumber,
  426. pageNum: this.currentPage,
  427. pageSize: this.pageSize
  428. }
  429. const res = await getK3ReceiptList(params)
  430. // console.log(res);
  431. // res.data.records.forEach((item) => {
  432. // item.sums1 = [];
  433. // item.sums2 = ["amount"];
  434. // });
  435. this.dataList = res.data.records
  436. this.listTotal = res.data.total
  437. },
  438. seeFn(id) {
  439. this.detailId = id
  440. this.showDetail = 3
  441. },
  442. handleSelect(selection, row) {
  443. this.$refs.table.toggleRowSelection(row)
  444. this.dataList.forEach(item => {
  445. if (item.id === row.id) {
  446. this.$refs.table.toggleRowSelection(item)
  447. }
  448. })
  449. this.tableSelection = this.$refs.table.selection
  450. },
  451. handleSelectAll(selection) {
  452. this.tableSelection = this.$refs.table.selection
  453. },
  454. backList() {
  455. this.queryItem = {}
  456. this.isShowPrint = false
  457. },
  458. // 获取当前时间
  459. nowDate() {
  460. var date = new Date()
  461. var seperator1 = '-'
  462. var year = date.getFullYear()
  463. var month = date.getMonth() + 1
  464. var strDate = date.getDate()
  465. if (month >= 1 && month <= 9) {
  466. month = '0' + month
  467. }
  468. if (strDate >= 0 && strDate <= 9) {
  469. strDate = '0' + strDate
  470. }
  471. var currentdate = year + seperator1 + month + seperator1 + strDate
  472. console.log(currentdate)
  473. return currentdate
  474. },
  475. // 点击打印
  476. async toPrint(row, type) {
  477. // 初始化模板,否则生成的模板叠加
  478. hiprint.init()
  479. this.hiprintTemplate = new hiprint.PrintTemplate()
  480. // 兼容批量打印
  481. let params = !type ? this.tableSelection : [row.id]
  482. let len = params.length
  483. let loadingLen = len
  484. // 使用 i-- 提升for效率
  485. this.$startLoading()
  486. for (let i = len; i > 0; i--) {
  487. try {
  488. const { data } = await getK3ReceiptDetail({
  489. id: params[i - 1].id || params[i - 1]
  490. })
  491. // 模板基础配置
  492. this.panel = this.hiprintTemplate.addPrintPanel({
  493. height: 140,
  494. width: 241,
  495. fontFamily: '黑体',
  496. fontSize: 13,
  497. paperFooter: 340,
  498. paperHeader: 10,
  499. paperNumberDisabled: true
  500. })
  501. // 获取收款单模板和基础配置
  502. this.panel.addPrintHtml({
  503. options: {
  504. width: 633,
  505. top: 30,
  506. left: 20,
  507. fontFamily: '黑体',
  508. fontSize: 13,
  509. content: this.setTableDom(data)
  510. }
  511. })
  512. loadingLen--
  513. } catch (error) {
  514. this.$endLoading()
  515. return
  516. }
  517. }
  518. if (loadingLen === 0) {
  519. this.$endLoading()
  520. }
  521. // 预览打印内容
  522. this.$refs.preView.show(this.hiprintTemplate, this.panel)
  523. },
  524. getCompanyList() {
  525. getCompanyList().then(res => {
  526. this.company = res.data ? res.data[0].companyName : ''
  527. })
  528. },
  529. // 收款单打印模板
  530. setTableDom(data) {
  531. return `
  532. <div style="font-family:'黑体';">
  533. <h1 style="text-align:center">${this.company}收款单</h1>
  534. <div >
  535. <table border=".5" cellspacing="0" width="856" height="250"
  536. style="border-color: rgb(0,0,0);
  537. border-collapse: collapse;
  538. border-style: none;
  539. border: 1px solid rgb(0,0,0);
  540. font-weight: normal;
  541. direction: ltr;
  542. padding-bottom: 0pt;
  543. padding-left: 4pt;
  544. padding-right: 4pt;
  545. padding-top: 0pt;
  546. text-decoration: none;
  547. vertical-align: middle;
  548. box-sizing: border-box;
  549. word-wrap: break-word;
  550. word-break: break-all;">
  551. <tr>
  552. <td>单据编号</td>
  553. <td>${data.billNo}</td>
  554. <td>业务日期</td>
  555. <td>${data.theTime}</td>
  556. <td>打印日期</td>
  557. <td>${this.nowDate()}</td>
  558. </tr>
  559. <tr>
  560. <td>付款单位</td>
  561. <td colspan="5">${data.customerName}</td>
  562. </tr>
  563. <tr>
  564. <td>钱包</td>
  565. <td>${data.walletName}</td>
  566. <td>实收金额</td>
  567. <td style="text-align:right">${numToFixed(data.amount)}</td>
  568. <td colspan="2">${changeNumberMoneyToChinese(data.amount)}</td>
  569. </tr>
  570. <tr>
  571. <td>备注</td>
  572. <td colspan="5">${data.remark}</td>
  573. </tr>
  574. </table>
  575. </div>
  576. <div style="margin:100px 0 0 0">
  577. <div>打印</div>
  578. </div>
  579. </div>
  580. `
  581. }
  582. }
  583. }
  584. </script>
  585. <style lang="scss" scoped>
  586. .selectStyle {
  587. width: 100%;
  588. }
  589. .improt{
  590. display: flex;
  591. }
  592. </style>