billPush-detail-list.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. <template>
  2. <el-dialog
  3. :visible.sync="showDialog"
  4. :title="title"
  5. width="70%"
  6. :modal-append-to-body="true"
  7. style="text-align:left;"
  8. @close="closeDialog"
  9. :close-on-click-modal="false"
  10. append-to-body
  11. >
  12. <div class="user-panel" v-loading="loading">
  13. <el-form ref="form" :model="formModel" label-width="150">
  14. <el-row :gutter="20" >
  15. <el-col :span="8">
  16. <div class="grid-content bg-purple">
  17. <span class="fontText">账单名称</span>
  18. <span class="data">{{formModel.name}}</span>
  19. </div>
  20. </el-col>
  21. <el-col :span="8">
  22. <span class="fontText">收款方</span>
  23. <span class="data">{{formModel.payee}}</span>
  24. </el-col>
  25. <el-col :span="8">
  26. <span class="fontText">收款账户</span>
  27. <span class="data">{{formModel.collectionAccount}}</span>
  28. </el-col>
  29. </el-row>
  30. <el-row :gutter="20" >
  31. <el-col :span="8">
  32. <div class="grid-content bg-purple">
  33. <span class="fontText">缴费单位</span>
  34. <span class="data">{{formModel.companyName}}</span>
  35. </div>
  36. </el-col>
  37. <el-col :span="8">
  38. <span class="fontText" >推送用户</span>
  39. <span class="data" >{{formModel.personName}}</span>
  40. </el-col>
  41. <el-col :span="8">
  42. <span class="fontText">推送状态</span>
  43. <span class="data" v-if="formModel.status=='0'" style="color:#F56C6C">未推送</span>
  44. <span class="data" v-else-if="formModel.status=='1'" style="color:#67C23A">
  45. <span v-if="formModel.payStatus=='20'" style="color:#67C23A">已完成</span>
  46. <span v-else style="color:#67C23A">已推送</span>
  47. </span>
  48. <span class="data" v-else-if="formModel.status=='2'" style="color:#E6A23C">推送失败</span>
  49. <span class="data" v-else-if="formModel.status=='3'" style="color:#909399">已作废</span>
  50. </el-col>
  51. </el-row>
  52. <el-row :gutter="20" >
  53. <el-col :span="8">
  54. <div class="grid-content bg-purple">
  55. <span class="fontText">推送时间</span>
  56. <span class="data">{{formModel.pushTime}}</span>
  57. </div>
  58. </el-col>
  59. <el-col :span="8">
  60. <span class="fontText" >缴费状态</span>
  61. <span class="data" v-if="formModel.payStatus=='10'" style="color:#F56C6C">未支付</span>
  62. <span class="data" v-if="formModel.payStatus=='15'" style="color:#E6A23C">部分支付</span>
  63. <span class="data" v-else-if="formModel.payStatus=='20'" style="color:#67C23A">已支付</span>
  64. <span class="data" v-else-if="formModel.payStatus=='30'" style="color:#909399">已关闭</span>
  65. <span class="data" v-else-if="formModel.payStatus=='40'" style="color:#909399">已退款</span>
  66. </el-col>
  67. <el-col :span="8">
  68. <span class="fontText">支付方式</span>
  69. <el-link class="data" type="primary" v-if="formModel.payStatus=='10'" @click="handlePayTime">{{formModel.payName}}</el-link>
  70. <span class="data" v-else>{{formModel.payName}}</span>
  71. </el-col>
  72. </el-row>
  73. <el-row :gutter="20" >
  74. <el-col :span="8">
  75. <div class="grid-content bg-purple">
  76. <span class="fontText">支付时间</span>
  77. <span class="data">{{formModel.payTime}}</span>
  78. </div>
  79. </el-col>
  80. <el-col :span="8">
  81. <span class="fontText">账单备注</span>
  82. <span class="data">{{formModel.bak}}</span>
  83. </el-col>
  84. <el-col :span="8">
  85. <span class="fontText">开票类型</span>
  86. <span class="data">{{formModel.invoiceTypeN}}</span>
  87. </el-col>
  88. </el-row>
  89. <el-row :gutter="20" >
  90. <el-col :span="8">
  91. <div class="grid-content bg-purple">
  92. <span class="fontText">是否开票</span>
  93. <span class="data">
  94. <el-switch
  95. v-model="formModel.invoiced"
  96. active-color="#13ce66"
  97. inactive-color="#ff4949"
  98. @change="handleSwitchChange(formModel,'2')">
  99. </el-switch>
  100. </span>
  101. </div>
  102. </el-col>
  103. <el-col :span="8">
  104. <div class="grid-content bg-purple" v-if="formModel.isMobilePayment">
  105. <span class="fontText">微信支付</span>
  106. <span class="data">
  107. <el-switch
  108. v-model="formModel.isOpenWechat"
  109. active-color="#13ce66"
  110. inactive-color="#ff4949"
  111. @change="handleSwitchChange(formModel,'0')">
  112. </el-switch>
  113. </span>
  114. </div>
  115. </el-col>
  116. <el-col :span="8" v-if="formModel.isMobilePayment">
  117. <span class="fontText">支付宝支付</span>
  118. <span class="data">
  119. <el-switch
  120. v-model="formModel.isOpenAlipay"
  121. active-color="#13ce66"
  122. inactive-color="#ff4949"
  123. @change="handleSwitchChange(formModel,'1')">
  124. </el-switch>
  125. </span>
  126. </el-col>
  127. </el-row>
  128. </el-form>
  129. </div>
  130. <el-divider></el-divider>
  131. <el-row class="button-group" >
  132. <el-button type="success" size="small" v-if="formModel.status=='1'" @click="handleQucodePay(formModel.orderId)">付款码</el-button>
  133. <el-button type="success" size="small" plain icon="el-icon-download" @click="exportXls()">导出账单</el-button>
  134. <el-button
  135. type="primary"
  136. size="small"
  137. plain
  138. icon="el-icon-edit"
  139. @click="handleEdit" v-if="formModel.status=='0'"
  140. >修改账单</el-button
  141. >
  142. <el-button
  143. type="primary"
  144. size="small"
  145. plain
  146. icon="el-icon-edit"
  147. disabled
  148. @click="handleEdit" v-else
  149. >修改账单</el-button
  150. >
  151. <el-button
  152. type="warning"
  153. size="small"
  154. plain
  155. icon="el-icon-s-promotion"
  156. @click="handlePush(row)"
  157. >推送账单</el-button
  158. >
  159. </el-row>
  160. <el-table :data="tableData" v-loading="loading" stripe show-summary :summary-method="getSummaries">
  161. <el-table-column type="index" label="序号" width="80"></el-table-column>
  162. <el-table-column prop="goodsName" label="收费项目"></el-table-column>
  163. <el-table-column prop="beginEndTime" label="起止时间" width="300"></el-table-column>
  164. <el-table-column prop="num" label="数量" width="300"></el-table-column>
  165. <el-table-column prop="standard" label="收费标准(元)"></el-table-column>
  166. <el-table-column prop="totalFee" label="收费金额(元)">
  167. <template slot-scope="{row}">
  168. {{fmtMoney(row.totalFee)}}
  169. </template>
  170. </el-table-column>
  171. </el-table>
  172. <el-pagination style="text-align: center;"
  173. :current-page.sync="pageIndex"
  174. :total="totalElements"
  175. :page-sizes="pageSizeList"
  176. @current-change="changePage"
  177. @size-change="pageSizeChange"
  178. layout="total, sizes, prev, pager, next, jumper"
  179. ></el-pagination>
  180. <billPush-detail
  181. v-if="showModal"
  182. :businessKey="businessKey"
  183. :title="modalTitle"
  184. @close="onDetailModalClose"
  185. ></billPush-detail>
  186. <billPush-order-payTime
  187. v-if="showModal2"
  188. :businessKey="businessKey"
  189. :title="modalTitle2"
  190. @close="onDetailModalClose2"
  191. ></billPush-order-payTime>
  192. <billPush-qrcode-pay
  193. v-if="showModal3"
  194. :title="modalTitle3"
  195. :orderId="orderId"
  196. @close="onDetailModalClose3"
  197. ></billPush-qrcode-pay>
  198. </el-dialog>
  199. </template>
  200. <script>
  201. import Constant from "@/constant";
  202. import billPushApi from "@/api/business/billPush";
  203. import billPushPersonApi from "@/api/business/billPushPerson";
  204. import billPushDetail from "./billPush-detail";
  205. import billPushOrderPayTime from "./billPush-order-payTime";
  206. import billPushQrcodePay from "./billPush-qrcode-pay";
  207. export default {
  208. props: ["businessKey", "title"],
  209. data() {
  210. return{
  211. formModel:{
  212. },
  213. queryModel: {
  214. name: "",
  215. status: "",
  216. pushTimeRange: ['',''],
  217. companyId:"",
  218. payService:"",
  219. },
  220. formModel2:{
  221. id:"",
  222. payName:"",
  223. payTime:"",
  224. },
  225. payModal:true,
  226. payTime:"",
  227. tableData:[],
  228. pageIndex: 1,
  229. pageSize: 10,
  230. totalPages: 0,
  231. totalElements: 0,
  232. pageSizeList: [10, 20, 30],
  233. multipleSelection: [],
  234. activeName:"first",
  235. showDialog: true,
  236. loading: false,
  237. showModal: false,
  238. showModal2:false,
  239. showModal3:false,
  240. submitting: false,
  241. modified: false
  242. }
  243. },
  244. methods:{
  245. closeDialog() {
  246. this.$emit("close", this.modified);
  247. },
  248. handleClick(){
  249. },
  250. handleEdit() {
  251. this.modalTitle = "编辑";
  252. this.operation = "edit";
  253. this.businessKey = this.businessKey;
  254. this.showModal = true;
  255. },
  256. handleQucodePay(orderId){
  257. this.modalTitle3 = "付款码";
  258. this.operation = "edit";
  259. this.orderId = orderId;
  260. this.showModal3 = true;
  261. },
  262. changePage(pageIndex,exportFlag) {
  263. var self = this;
  264. self.loading = true;
  265. var billPushId = self.businessKey;
  266. self.pageIndex = pageIndex;
  267. var formData = new FormData();
  268. formData.append("billPushId", billPushId);
  269. formData.append("pageIndex", self.pageIndex);
  270. if(exportFlag!=null){
  271. formData.append("exportFlag", exportFlag);
  272. formData.append("pageSize", 10000);
  273. }
  274. else{
  275. formData.append("pageSize", self.pageSize);
  276. }
  277. billPushApi.goodsPageList(formData)
  278. .then(function(response) {
  279. self.loading = false;
  280. var jsonData = response.data;
  281. if(jsonData.result) {
  282. if(exportFlag){
  283. if(document.location.href.startsWith("https://")){
  284. jsonData.data = jsonData.data.replace("http://","https://");
  285. }
  286. //导出
  287. self.$message({
  288. showClose: true,
  289. type: "success",
  290. message: `报表已生成,<a href="${jsonData.data}">请点击链接下载</a>`,
  291. dangerouslyUseHTMLString: true,
  292. duration: 30000
  293. });
  294. }
  295. else{
  296. //分页查看
  297. var page = jsonData.data;
  298. self.tableData = page.data;
  299. self.totalPages = page.totalPages;
  300. self.totalElements = page.recordsTotal;
  301. }
  302. }
  303. else{
  304. self.$message.warning(jsonData.message);
  305. }
  306. // self.tableData = jsonData.data;
  307. // self.totalPages = jsonData.totalPages;
  308. // self.totalElements = jsonData.recordsTotal;
  309. })
  310. .catch(error => {
  311. self.loading = false;
  312. // self.$message.error(error + "");
  313. });
  314. },
  315. fmtMoney(value){
  316. const num = Number(value);
  317. if (!isNaN(num)) {
  318. return num.toFixed(2);
  319. }
  320. else{
  321. return num;
  322. }
  323. },
  324. pageSizeChange(pageSize) {
  325. this.pageSize = pageSize;
  326. },
  327. onDetailModalClose(retObj) {
  328. //保存成功后回调
  329. this.showModal = false;
  330. //this.closeDialog();
  331. this.modified = retObj;
  332. if(retObj){
  333. this.changePage(1,false);
  334. }
  335. },
  336. exportXls() {
  337. this.changePage(1,true);
  338. },
  339. getSummaries(param) {
  340. const { columns, data } = param;
  341. const sums = [];
  342. columns.forEach((column, index) => {
  343. if (index === 0) {
  344. sums[index] = '合计';
  345. return;
  346. }
  347. const values = data.map(item => Number(item[column.property]));
  348. if (!values.every(value => isNaN(value))) {
  349. sums[5] = values.reduce((prev, curr) => {
  350. const value = Number(curr);
  351. if (!isNaN(value)) {
  352. return prev + curr;
  353. } else {
  354. return prev;
  355. }
  356. }, 0);
  357. sums[5] = this.fmtMoney(sums[5]);
  358. } else {
  359. sums[index] = '';
  360. }
  361. });
  362. return sums;
  363. },
  364. onDetailModalClose2(){
  365. //保存成功后回调
  366. this.showModal2 = false;
  367. var self = this;
  368. (function() {
  369. if (self.businessKey.length == 0) {
  370. return billPushApi.createGoods();
  371. } else {
  372. return billPushApi.detail(self.businessKey);
  373. }
  374. })()
  375. .then(response => {
  376. var jsonData = response.data;
  377. self.loading = false;
  378. if (jsonData.result) {
  379. self.formModel = jsonData.data;
  380. } else {
  381. self.$message.error(jsonData.message + "");
  382. }
  383. })
  384. .catch(error => {
  385. self.$message.error(error + "");
  386. });
  387. },
  388. onDetailModalClose3(retObj) {
  389. //保存成功后回调
  390. this.showModal3 = false;
  391. //this.closeDialog();
  392. this.modified = retObj;
  393. if(retObj){
  394. this.changePage(1,false);
  395. }
  396. },
  397. handlePayTime(){
  398. var self = this;
  399. var billPushId = self.businessKey;
  400. this.modalTitle2 = "账单推送详情";
  401. this.operation = "detail";
  402. this.businessKey = billPushId;
  403. this.showModal2 = true;
  404. },
  405. handlePush(){
  406. var self = this;
  407. self.$confirm("是否确认推送账单?", "提示", {
  408. confirmButtonText: "确定",
  409. cancelButtonText: "取消",
  410. type: "warning"
  411. })
  412. .then(() => {
  413. var formData = new FormData();
  414. formData.append("id", self.businessKey);
  415. billPushApi.pushBill(formData).then((response)=>{
  416. var jsonData = response.data;
  417. if (jsonData.result) {
  418. this.formModel.status="1";
  419. this.$message.success("账单消息推送成功!");
  420. } else {
  421. this.$message.error(jsonData.message + "");
  422. }
  423. });
  424. });
  425. },
  426. handleSwitchChange(record,type){
  427. var self = this;
  428. var formData = new FormData();
  429. self.loading = true;
  430. formData.append("id", self.businessKey);
  431. if(type=="0"){
  432. formData.append("isOpen", record.isOpenWechat);
  433. }
  434. else if(type=="1"){
  435. formData.append("isOpen", record.isOpenAlipay);
  436. }
  437. else if(type=="2"){
  438. formData.append("isOpen", record.invoiced);
  439. }
  440. formData.append("type", type);
  441. billPushApi.updateIsOpenWechatOrAlipay(formData).then(function (response) {
  442. var jsonData = response.data;
  443. self.loading = false;
  444. if (jsonData.result) {
  445. //self.changePage(self.pageIndex);
  446. self.modified = true;
  447. }
  448. else{
  449. self.$message.error(jsonData.message + "");
  450. }
  451. });
  452. }
  453. },
  454. components: {
  455. "billPush-detail": billPushDetail,
  456. "billPush-order-payTime":billPushOrderPayTime,
  457. "billPush-qrcode-pay":billPushQrcodePay
  458. },
  459. mounted: function() {
  460. var self = this;
  461. (function() {
  462. if (self.businessKey.length == 0) {
  463. return billPushApi.createGoods();
  464. } else {
  465. return billPushApi.detail(self.businessKey);
  466. }
  467. })()
  468. .then(response => {
  469. var jsonData = response.data;
  470. self.loading = false;
  471. if (jsonData.result) {
  472. self.formModel = jsonData.data;
  473. } else {
  474. self.$message.error(jsonData.message + "");
  475. }
  476. })
  477. .catch(error => {
  478. self.$message.error(error + "");
  479. });
  480. this.changePage(1,false);
  481. }
  482. }
  483. </script>
  484. <style scoped>
  485. .user-panel {
  486. margin: 10px auto;
  487. margin-left: 20px;
  488. }
  489. .data{
  490. margin-left: 50px;
  491. font-weight:bold
  492. }
  493. .el-row {
  494. margin-bottom: 20px;
  495. }
  496. .el-col {
  497. border-radius: 4px;
  498. }
  499. .grid-content {
  500. border-radius: 4px;
  501. min-height: 36px;
  502. }
  503. .title1{
  504. margin-bottom: 40px;
  505. }
  506. .title2{
  507. margin-top: 40px;
  508. margin-bottom: 40px;
  509. }
  510. </style>