receivable_list.vue 21 KB

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