InvoiceManager.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. <template>
  2. <div class="manage-root">
  3. <Header />
  4. <div class="manage-root-contain">
  5. <nav-menu
  6. class="manage-root-contain-left"
  7. :activeMenuIndex="activeMenuIndex"
  8. ></nav-menu>
  9. <div class="manage-root-contain-right">
  10. <breadcrumb
  11. :breadcrumbList="breadcrumbList"
  12. class="breadcrumb-box"
  13. ></breadcrumb>
  14. <div class="personal-inner">
  15. <div class="common-title-box">
  16. <h3>发票列表</h3>
  17. </div>
  18. <div class="search-box">
  19. <div class="search-item">
  20. <label>发票申请状态</label>
  21. <el-select
  22. v-model="searchStatus"
  23. @change="getList(1)"
  24. placeholder="请选择"
  25. >
  26. <el-option
  27. v-for="item in transactionList"
  28. :key="item.status"
  29. :label="item.status_name"
  30. :value="item.status"
  31. >
  32. </el-option>
  33. </el-select>
  34. </div>
  35. </div>
  36. <el-table
  37. class="search-table"
  38. :data="tableData"
  39. style="width: 100%"
  40. @sort-change="handleSort"
  41. :default-sort="dataSort"
  42. :max-height="tableHeight"
  43. v-loading="tableLoading"
  44. >
  45. <el-table-column
  46. type="index"
  47. label="#"
  48. sortable
  49. width="54"
  50. :index="(pageNumber - 1) * pageSize + 1"
  51. >
  52. </el-table-column>
  53. <!-- <el-table-column prop="id" label="ID" width="250">
  54. </el-table-column> -->
  55. <el-table-column prop="sn" label="编号" width="190">
  56. </el-table-column>
  57. <el-table-column prop="invoice_type" label="发票类型" width="90">
  58. <template slot-scope="scope">
  59. <span>{{ goodsTypeListCss[scope.row.invoice_type].text }}</span>
  60. </template>
  61. </el-table-column>
  62. <el-table-column prop="invoice_object" label="抬头类型" width="90">
  63. <template slot-scope="scope">
  64. <span>{{
  65. goodsObjectListCss[scope.row.invoice_object].text
  66. }}</span>
  67. </template>
  68. </el-table-column>
  69. <el-table-column prop="amount" label="金额" width="90">
  70. <template slot-scope="scope">
  71. <span class="currectPrice"
  72. >¥{{ scope.row.amount | cutMoneyFiter }}</span
  73. >
  74. </template>
  75. </el-table-column>
  76. <el-table-column
  77. prop="submit_person_name"
  78. label="提交人姓名"
  79. width="120"
  80. >
  81. </el-table-column>
  82. <el-table-column prop="submit_time" label="提交时间" width="180">
  83. </el-table-column>
  84. <el-table-column prop="status" label="状态" width="112">
  85. <template slot-scope="scope">
  86. <div class="status-box">
  87. <span
  88. :style="{
  89. background: refundStatusList[scope.row.status].bg,
  90. }"
  91. ></span>
  92. <b
  93. :style="{
  94. color: refundStatusList[scope.row.status].textColor,
  95. }"
  96. >{{ refundStatusList[scope.row.status].text }}</b
  97. >
  98. </div>
  99. </template>
  100. </el-table-column>
  101. <el-table-column prop="auditor_name" label="审核人姓名" width="109">
  102. </el-table-column>
  103. <el-table-column prop="audit_time" label="审核时间" width="180">
  104. </el-table-column>
  105. <el-table-column prop="reject_reason" label="驳回原因" width="180">
  106. </el-table-column>
  107. <el-table-column fixed="right" label="操作" width="140">
  108. <template slot-scope="scope">
  109. <el-button
  110. type="text"
  111. size="small"
  112. class="primary-btn"
  113. @click.native.prevent="handleDetail(scope.row, scope.$index)"
  114. >
  115. 详情
  116. </el-button>
  117. <template v-if="scope.row.status === 0">
  118. <el-button
  119. type="text"
  120. size="small"
  121. class="primary-btn"
  122. @click.native.prevent="
  123. passId = scope.row.id;
  124. dialogVisiblePass = true;
  125. "
  126. >
  127. 通过
  128. </el-button>
  129. <el-button
  130. @click.native.prevent="
  131. handleRefuse(scope.row, scope.$index)
  132. "
  133. type="text"
  134. size="small"
  135. class="red-btn"
  136. >
  137. 驳回
  138. </el-button>
  139. </template>
  140. </template>
  141. </el-table-column>
  142. </el-table>
  143. <el-pagination
  144. background
  145. @size-change="handleSizeChange"
  146. @current-change="handleCurrentChange"
  147. :current-page="pageNumber"
  148. :page-sizes="[10, 20, 30, 40]"
  149. :page-size="pageSize"
  150. layout="total, prev, pager, next, sizes, jumper"
  151. :total="total_count"
  152. >
  153. </el-pagination>
  154. </div>
  155. </div>
  156. </div>
  157. <el-dialog
  158. title="发票申请信息"
  159. :visible.sync="dialogVisible"
  160. width="600px"
  161. class="invoice-dialog"
  162. v-if="ktjeInfo"
  163. >
  164. <h5>发票信息</h5>
  165. <div class="item-info">
  166. <label>发票类型:</label>
  167. <b>{{ goodsTypeListCss[ktjeInfo.invoice_type].text }}</b>
  168. </div>
  169. <div class="item-info">
  170. <label>抬头类型:</label>
  171. <b>{{ goodsObjectListCss[ktjeInfo.invoice_object].text }}</b>
  172. </div>
  173. <div class="item-info">
  174. <label>抬头名称:</label>
  175. <b>{{ ktjeInfo.buyer_info_mc }}</b>
  176. </div>
  177. <template v-if="ktjeInfo.invoice_object === 1">
  178. <div class="item-info">
  179. <label>单位税号:</label>
  180. <b>{{ ktjeInfo.buyer_info_sh }}</b>
  181. </div>
  182. <div class="item-info">
  183. <label>注册地址:</label>
  184. <b>{{ ktjeInfo.buyer_info_dz }}</b>
  185. </div>
  186. <div class="item-info">
  187. <label>注册电话:</label>
  188. <b>{{ ktjeInfo.buyer_info_dh }}</b>
  189. </div>
  190. <div class="item-info">
  191. <label>开户银行:</label>
  192. <b>{{ ktjeInfo.buyer_info_khh }}</b>
  193. </div>
  194. <div class="item-info">
  195. <label>银行账号:</label>
  196. <b>{{ ktjeInfo.buyer_info_zh }}</b>
  197. </div>
  198. </template>
  199. <template v-else>
  200. <div class="item-info">
  201. <label>身份证号:</label>
  202. <b>{{ ktjeInfo.buyer_info_sfzh }}</b>
  203. </div>
  204. </template>
  205. <div class="item-info">
  206. <label>金额:</label>
  207. <b>¥{{ ktjeInfo.amount | cutMoneyFiter }}</b>
  208. </div>
  209. <template v-if="ktjeInfo.invoice_file_url">
  210. <div class="item-info">
  211. <label>发票地址:</label>
  212. <b
  213. ><a
  214. style="text-decoration: underline; color: #165dff"
  215. target="_blank"
  216. :href="ktjeInfo.invoice_file_url"
  217. >点击查看</a
  218. ></b
  219. >
  220. </div>
  221. </template>
  222. <div class="item-info">
  223. <label>审核状态:</label>
  224. <b
  225. :style="{
  226. color: refundStatusList[ktjeInfo.status].bg,
  227. }"
  228. >{{ refundStatusList[ktjeInfo.status].text }}</b
  229. >
  230. </div>
  231. <template v-if="ktjeInfo.reject_reason">
  232. <div class="item-info">
  233. <label>驳回原因:</label>
  234. <b>{{ ktjeInfo.reject_reason }}</b>
  235. </div>
  236. </template>
  237. <template v-if="ktje.length > 0">
  238. <h5>订单列表</h5>
  239. <el-table class="search-table" :data="ktje" style="width: 100%">
  240. <el-table-column type="index" label="#" width="54"> </el-table-column>
  241. <!-- <el-table-column prop="id" label="订单ID" width="250">
  242. </el-table-column> -->
  243. <el-table-column prop="sn" label="订单编号" width="190">
  244. </el-table-column>
  245. <el-table-column prop="name" label="订单名称"> </el-table-column>
  246. </el-table>
  247. </template>
  248. <span slot="footer" class="dialog-footer">
  249. <el-button size="small" type="primary" @click="dialogVisible = false"
  250. >关 闭</el-button
  251. >
  252. </span>
  253. </el-dialog>
  254. <!-- 审核通过 -->
  255. <el-dialog
  256. title="发票申请审核通过"
  257. :visible.sync="dialogVisiblePass"
  258. width="500px"
  259. >
  260. <el-upload
  261. class="upload-demo"
  262. :action="url"
  263. :on-preview="handlePreview"
  264. :on-remove="handleRemove"
  265. :before-remove="beforeRemove"
  266. multiple
  267. :limit="1"
  268. :on-exceed="handleExceed"
  269. :on-success="handleSuccess"
  270. :file-list="fileList"
  271. >
  272. <el-button size="small" type="primary">点击上传发票</el-button>
  273. <div slot="tip" class="el-upload__tip">只能上传1个文件</div>
  274. </el-upload>
  275. <span slot="footer" class="dialog-footer">
  276. <el-button size="small" @click="dialogVisiblePass = false"
  277. >取 消</el-button
  278. >
  279. <el-button size="small" type="primary" @click="handleRefund"
  280. >确 定</el-button
  281. >
  282. </span>
  283. </el-dialog>
  284. </div>
  285. </template>
  286. <script>
  287. //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  288. //例如:import 《组件名称》from ‘《组件路径》';
  289. import Header from "../../components/Header.vue";
  290. import NavMenu from "../../components/NavMenu.vue";
  291. import Breadcrumb from "../../components/Breadcrumb.vue";
  292. import { getLogin } from "@/api/ajax";
  293. import { cutMoneyFiter } from "@/utils/defined";
  294. import { getToken } from "@/utils/auth";
  295. export default {
  296. //import引入的组件需要注入到对象中才能使用
  297. components: { Header, NavMenu, Breadcrumb },
  298. props: {},
  299. filters: {
  300. cutMoneyFiter,
  301. },
  302. data() {
  303. //这里存放数据
  304. return {
  305. activeMenuIndex: "invoice_manage",
  306. breadcrumbList: [
  307. {
  308. icon: "money-cny-box-line",
  309. url: "",
  310. text: "",
  311. },
  312. {
  313. icon: "",
  314. url: "",
  315. notLink: true,
  316. text: "财务中心",
  317. },
  318. {
  319. icon: "",
  320. url: "",
  321. text: "发票管理",
  322. },
  323. ],
  324. searchStatus: -1,
  325. transactionList: [
  326. {
  327. status_name: "全部",
  328. status: -1,
  329. },
  330. {
  331. status_name: "待审核",
  332. status: 0,
  333. },
  334. {
  335. status_name: "驳回",
  336. status: 1,
  337. },
  338. {
  339. status_name: "审核通过",
  340. status: 2,
  341. },
  342. ], //交易状态列表
  343. goodsTypeListCss: {
  344. 0: {
  345. text: "普通发票",
  346. color: "#722ED1",
  347. },
  348. 1: {
  349. text: "专用发票",
  350. color: "#722ED1",
  351. },
  352. },
  353. goodsObjectListCss: {
  354. 0: {
  355. text: "个人",
  356. color: "#722ED1",
  357. },
  358. 1: {
  359. text: "企业",
  360. color: "#722ED1",
  361. },
  362. },
  363. refundStatusList: {
  364. 2: {
  365. text: "审核通过",
  366. bg: "#00B42A",
  367. textColor: "#1D2129",
  368. },
  369. 0: {
  370. text: "待审核",
  371. bg: "#165DFF",
  372. textColor: "#1D2129",
  373. },
  374. 1: {
  375. text: "驳回",
  376. bg: "#FF7D00",
  377. textColor: "#1D2129",
  378. },
  379. },
  380. tableData: [],
  381. pageSize: window.localStorage.getItem("pageSize")
  382. ? Number(window.localStorage.getItem("pageSize"))
  383. : 10,
  384. pageNumber: window.localStorage.getItem("pageNumber")
  385. ? Number(window.localStorage.getItem("pageNumber"))
  386. : 1,
  387. tableHeight: "", // 表格高度
  388. total_count: 0,
  389. dataSort: {},
  390. props: { multiple: true },
  391. tableLoading: false,
  392. exportLoading: false,
  393. exportFlag:
  394. getToken() && JSON.parse(getToken())
  395. ? JSON.parse(getToken()).popedom_code_list.indexOf(40002) > -1
  396. : false,
  397. dialogVisible: false,
  398. ktje: [],
  399. refundId: "",
  400. ktjeInfo: null,
  401. dialogVisiblePass: false,
  402. passId: "",
  403. fileList: [],
  404. };
  405. },
  406. //计算属性 类似于data概念
  407. computed: {
  408. url() {
  409. let userInfor = getToken();
  410. let access_token = "";
  411. if (userInfor) {
  412. let user = JSON.parse(getToken());
  413. access_token = user.access_token;
  414. }
  415. return (
  416. process.env.VUE_APP_BASE_API +
  417. "/FileServer/WebFileUpload?AccessToken=" +
  418. access_token +
  419. "&SecurityLevel=High"
  420. );
  421. },
  422. },
  423. //监控data中数据变化
  424. watch: {},
  425. //方法集合
  426. methods: {
  427. handleSort(value) {
  428. let dataSort = {
  429. prop: value.prop,
  430. order: value.order,
  431. };
  432. this.dataSort = dataSort;
  433. this.getList();
  434. },
  435. // 查询列表
  436. getList(page) {
  437. this.tableLoading = true;
  438. if (page) {
  439. this.pageNumber = page;
  440. }
  441. let MethodName =
  442. "/ShopServer/Manager/FinanceManager/PageQueryInvoiceApplyList";
  443. let order_column_list = [];
  444. if (this.dataSort != {}) {
  445. if (this.dataSort.order == "descending") {
  446. order_column_list = [this.dataSort.prop + ":desc"];
  447. } else if (this.dataSort.order == "ascending") {
  448. // 升序不传值
  449. order_column_list = [this.dataSort.prop];
  450. } else {
  451. order_column_list = ["submit_time:desc"];
  452. }
  453. } else {
  454. order_column_list = ["submit_time:desc"];
  455. }
  456. let data = {
  457. page_capacity: this.pageSize,
  458. cur_page: this.pageNumber,
  459. order_column_list: order_column_list,
  460. status: this.searchStatus,
  461. };
  462. getLogin(MethodName, data)
  463. .then((res) => {
  464. this.tableLoading = false;
  465. if (res.status === 1) {
  466. this.tableData = res.invoice_apply_list;
  467. this.total_count = res.total_count;
  468. }
  469. })
  470. .catch(() => {
  471. this.tableLoading = false;
  472. });
  473. },
  474. // 发票申请详情
  475. handleDetail(row) {
  476. this.ktjeInfo = null;
  477. let Mnames = "/ShopServer/Manager/FinanceManager/GetInvoiceApplyInfo";
  478. let datas = {
  479. id: row.id,
  480. };
  481. getLogin(Mnames, datas).then((res) => {
  482. if (res.status === 1) {
  483. this.ktje = res.order_list;
  484. this.ktjeInfo = res.invoice_apply;
  485. this.dialogVisible = true;
  486. }
  487. });
  488. },
  489. // 拒绝
  490. handleRefuse(row, index) {
  491. this.$prompt("请输入驳回原因", "确定驳回吗?", {
  492. confirmButtonText: "确定",
  493. cancelButtonText: "取消",
  494. })
  495. .then(({ value }) => {
  496. let Mname = "/ShopServer/Manager/FinanceManager/AuditInvoiceApply";
  497. let data = {
  498. id: row.id,
  499. is_pass: "false",
  500. reject_reason: value,
  501. };
  502. getLogin(Mname, data).then((res) => {
  503. this.$message.success("操作成功");
  504. this.getList();
  505. });
  506. })
  507. .catch(() => {
  508. // this.$message({
  509. // type: "info",
  510. // message: "取消输入",
  511. // });
  512. });
  513. },
  514. // 审核通过
  515. handleRefund() {
  516. if (this.fileList.length === 0) {
  517. this.$message.warning("请上传发票文件");
  518. return;
  519. }
  520. let Mnames = "/ShopServer/Manager/FinanceManager/AuditInvoiceApply";
  521. let datas = {
  522. id: this.passId,
  523. is_pass: "true",
  524. invoice_file_id: this.fileList[0].response.file_info_list[0].file_id,
  525. };
  526. getLogin(Mnames, datas)
  527. .then((res) => {
  528. if (res.status === 1) {
  529. this.$message.success("操作成功");
  530. this.getList();
  531. this.dialogVisiblePass = false;
  532. }
  533. })
  534. .catch(() => {
  535. this.dialogVisiblePass = false;
  536. });
  537. },
  538. handleSizeChange(val) {
  539. this.pageSize = val;
  540. this.pageNumber = 1;
  541. this.getList();
  542. },
  543. handleCurrentChange(val) {
  544. this.pageNumber = val;
  545. this.getList();
  546. },
  547. //计算table高度(动态设置table高度)
  548. getTableHeight() {
  549. let tableH = 370; //距离页面下方的高度
  550. let tableHeightDetil = window.innerHeight - tableH;
  551. if (tableHeightDetil <= 300) {
  552. this.tableHeight = 300;
  553. } else {
  554. this.tableHeight = window.innerHeight - tableH;
  555. }
  556. },
  557. handleRemove(file, fileList) {
  558. this.fileList = [];
  559. },
  560. handlePreview(file) {
  561. console.log(file);
  562. },
  563. handleExceed(files, fileList) {
  564. this.$message.warning(
  565. `当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  566. files.length + fileList.length
  567. } 个文件`
  568. );
  569. },
  570. beforeRemove(file, fileList) {
  571. return this.$confirm(`确定移除 ${file.name}?`);
  572. },
  573. handleSuccess(response, file, fileList) {
  574. if (response.status == 1) {
  575. this.fileList = fileList;
  576. } else {
  577. this.fileList = [];
  578. this.$message.warning(response.msg);
  579. }
  580. },
  581. },
  582. //生命周期 - 创建完成(可以访问当前this实例)
  583. created() {
  584. this.getTableHeight();
  585. this.getList();
  586. },
  587. //生命周期 - 挂载完成(可以访问DOM元素)
  588. mounted() {
  589. let _this = this;
  590. let input = document.querySelector("input");
  591. input.addEventListener("keyup", function (event) {
  592. // 判断是否按下回车键
  593. if (event.keyCode === 13) {
  594. // 回车键被按下,执行你想要的操作
  595. _this.getList(1);
  596. }
  597. });
  598. },
  599. //生命周期-创建之前
  600. beforeCreated() {},
  601. //生命周期-挂载之前
  602. beforeMount() {},
  603. //生命周期-更新之前
  604. beforUpdate() {},
  605. //生命周期-更新之后
  606. updated() {},
  607. //生命周期-销毁之前
  608. beforeDestory() {},
  609. //生命周期-销毁完成
  610. destoryed() {},
  611. //如果页面有keep-alive缓存功能,这个函数会触发
  612. activated() {},
  613. };
  614. </script>
  615. <style lang="scss" scoped>
  616. /* @import url(); 引入css类 */
  617. </style>
  618. <style lang="scss">
  619. .btn-box {
  620. display: flex;
  621. }
  622. .search-item {
  623. margin-bottom: 20px;
  624. }
  625. .search-table {
  626. margin-top: 0;
  627. }
  628. .code {
  629. color: #175dff;
  630. }
  631. .item-info {
  632. display: flex;
  633. width: 100%;
  634. margin: 10px 0;
  635. label {
  636. width: 90px;
  637. text-align: right;
  638. flex-shrink: 0;
  639. }
  640. }
  641. .invoice-dialog {
  642. h5 {
  643. font-size: 16px;
  644. margin: 10px 0 15px 0;
  645. }
  646. .el-dialog__body {
  647. padding: 0px 20px;
  648. }
  649. }
  650. </style>