This commit is contained in:
2025-03-11 19:09:45 +08:00
parent 163731588c
commit ec49bcfa8b
6 changed files with 887 additions and 14 deletions
@@ -0,0 +1,169 @@
package io.v.nutz.zhgh.memberCost.controller;
import cn.wizzer.framework.base.Result;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentProject;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName MemberPaymentChartSummaryController
* @Description 图表汇总
* @Author zhf
* @Date 2025/3/11 下午3:20
*/
@IocBean
@Slf4j
@Ok("json:full")
@At("/platform/member/payment/chartSummary")
public class MemberPaymentChartSummaryController {
@Inject
private MemberPaymentService memberPaymentService;
@At("")
@Ok("beetl:/platform/membercost/chartSummary/index.html")
@RequiresPermissions("member.payment.chartSummary")
public void index() {
}
@At
@RequiresPermissions("member.payment.chartSummary")
public Object getPayProjectChart(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear) {
Sql sql = Sqls.create("""
SELECT
mpp.projectName,
COUNT( mpi.id ) AS num
FROM
member_payment_project mpp
LEFT JOIN member_payment_info mpi ON mpi.paymentProjectId = mpp.id
AND mpi.isPayment = 1
WHERE
YEAR ( mpp.createTime ) BETWEEN @startYear
AND @endYear
GROUP BY
mpp.id
""").setParam("startYear", startYear).setParam("endYear", endYear);
return Result.success(memberPaymentService.listMap(sql));
}
@At
@RequiresPermissions("member.payment.chartSummary")
public Object getRefundProjectChart(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear) {
Sql sql = Sqls.create("""
SELECT
mpp.projectName,
COUNT( pt.id ) AS num
FROM
member_payment_project mpp
LEFT JOIN member_payment_info mpi ON mpi.paymentProjectId = mpp.id
LEFT JOIN payment_transaction pt ON pt.memberPaymentInfoId = mpi.id
AND pt.isRefund = 1
WHERE
YEAR ( mpp.createTime ) BETWEEN @startYear
AND @endYear
GROUP BY
mpp.id
""").setParam("startYear", startYear).setParam("endYear", endYear);
return Result.success(memberPaymentService.listMap(sql));
}
@At
@RequiresPermissions("member.payment.chartSummary")
public Object getPayMoneyChart(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear) {
Sql sql = Sqls.create("""
SELECT
mpp.projectName,
SUM( pt.tradingAmount * 0.01 ) AS money
FROM
member_payment_project mpp
LEFT JOIN member_payment_info mpi ON mpi.paymentProjectId = mpp.id
AND mpi.isPayment = 1
LEFT JOIN payment_transaction pt ON pt.memberPaymentInfoId = mpi.id
AND pt.isRefund = 0
AND pt.tradingState = 'PAY_SUCCESS'
WHERE
YEAR ( mpp.createTime ) BETWEEN @startYear
AND @endYear
GROUP BY
mpp.id
""").setParam("startYear", startYear).setParam("endYear", endYear);
return Result.success(memberPaymentService.listMap(sql));
}
@At
@RequiresPermissions("member.payment.chartSummary")
public Object getNumData(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear) {
Sql sql = Sqls.create("""
SELECT
pt.tradingAmount * 0.01 AS money,
pt.isRefund
FROM
member_payment_project mpp
LEFT JOIN member_payment_info mpi ON mpi.paymentProjectId = mpp.id
AND mpi.isPayment = 1
LEFT JOIN payment_transaction pt ON pt.memberPaymentInfoId = mpi.id
AND pt.tradingState = 'PAY_SUCCESS'
WHERE
YEAR ( mpp.createTime ) BETWEEN @startYear
AND @endYear
""").setParam("startYear", startYear).setParam("endYear", endYear);
List<NutMap> map = memberPaymentService.listMap(sql);
double payMoney = map.stream().filter(v -> !v.getBoolean("isRefund")).mapToDouble(v -> v.getDouble("money")).sum();
double refundMoney = map.stream().filter(v -> v.getBoolean("isRefund")).mapToDouble(v -> v.getDouble("money")).sum();
int refundSize = map.stream().filter(v -> v.getBoolean("isRefund")).collect(Collectors.toList()).size();
int paySize = map.stream().filter(v -> !v.getBoolean("isRefund")).collect(Collectors.toList()).size();
NutMap data = new NutMap();
data.put("payMoney", payMoney);
data.put("refundMoney", refundMoney);
data.put("paySize", paySize);
data.put("refundSize", refundSize);
return Result.success(data);
}
@At
@RequiresPermissions("member.payment.chartSummary")
public Object allUnionMoney(String paymentProjectId) {
Sql sql = Sqls.create("""
SELECT
un.unionname,
COALESCE ( SUM( pt.tradingAmount * 0.01 ), 0 ) AS money
FROM
sys_union un
LEFT JOIN payment_transaction pt ON pt.unionId = un.id
AND pt.tradingState = 'PAY_SUCCESS'
AND pt.isRefund = 0
LEFT JOIN member_payment_info mpi ON mpi.id = pt.memberPaymentInfoId
AND mpi.paymentProjectId=@paymentProjectId
GROUP BY
un.id
ORDER BY
un.unioncode
""").setParam("paymentProjectId", paymentProjectId);
return Result.success(memberPaymentService.listMap(sql));
}
}
@@ -53,13 +53,11 @@ public class MemberPaymentMineController {
public Object pageData(PageForm pageForm, Integer year, Integer isPay) {
Sql sql = Sqls.create("""
SELECT
mpp.`year`,
mpp.projectName,
mpp.startTime,
mpp.endTime,
mpi.id,
mpi.payId,
mpi.isPayment,
mpi.payPersonnel,
mpi.personType,
@@ -88,10 +86,11 @@ public class MemberPaymentMineController {
@At
@RepeatSubmit
@RequiresPermissions("member.payment.mine")
public Object pcOrderPay(Integer paymentMoney) {
public Object pcOrderPay(Integer paymentMoney, String paymentInfoId) {
WxPayNeedParamVo paramVo = new WxPayNeedParamVo();
paramVo.setDescription(ShiroUtil.getPlatformUsername() + "会费缴纳支付");
paramVo.setAttach("");
paramVo.setMemberPaymentInfoId(paymentInfoId);
paramVo.setAmount(new Amount().setTotal(paymentMoney));
return wxPayCommonService.nativePay(paramVo);
}
@@ -0,0 +1,114 @@
package io.v.nutz.zhgh.memberCost.controller;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import io.v.nutz.base.annontation.RepeatSubmit;
import io.v.nutz.base.annontation.Valid;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.payment.enums.TradingStateEnum;
import io.v.nutz.base.payment.enums.WxPayResultCode;
import io.v.nutz.base.payment.model.PaymentTransaction;
import io.v.nutz.base.payment.wxpay.service.WxPayCommonService;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.result.Result;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.io.Reader;
/**
* @ClassName MemberPaymentRefundController
* @Description 退款
* @Author zhf
* @Date 2025/3/11 上午8:51
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/member/payment/refund")
public class MemberPaymentRefundController {
@Inject
private WxPayCommonService wxPayCommonService;
@Inject
private MemberPaymentService memberPaymentService;
@At("")
@Ok("beetl:/platform/membercost/refund/index.html")
@RequiresPermissions("member.payment.refund")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("member.payment.refund")
public Object pageData(PageForm pageForm, String paymentProjectId, String transactionId, Integer isRefund) {
Sql sql = Sqls.create("""
SELECT
mpp.`year`,
mpp.projectName,
mpp.startTime,
mpp.endTime,
mpi.isPayment,
mpi.payPersonnel,
mpi.personType,
mpi.paymentMonth,
mpi.paymentTime,
pt.id,
pt.outTradeNo,
pt.transactionId,
pt.userName,
pt.loginName,
pt.unitName,
pt.unionName,
pt.tradingAmount,
pt.isRefund,
prr.createdAt AS refundTime
FROM
payment_transaction pt
LEFT JOIN `member_payment_info` mpi ON pt.memberPaymentInfoId = mpi.id
LEFT JOIN `payment_refund_record` prr ON pt.memberPaymentInfoId = mpi.id
LEFT JOIN member_payment_project mpp ON mpi.paymentProjectId = mpp.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("mpi.paymentProjectId", "=", paymentProjectId);
cnd.andEX("pt.tradingState", "=", TradingStateEnum.PAY_SUCCESS);
cnd.and(Cnd.likeEX("pt.transactionId", transactionId));
if (isRefund != 3) {
cnd.andEX("pt.isRefund", "=", isRefund);
}
if (ObjectUtil.isNotEmpty(pageForm.getSearchKeyword())) {
SqlExpressionGroup group = new SqlExpressionGroup();
group.orLike("pt.userName", pageForm.getSearchKeyword());
group.orLike("pt.loginName", pageForm.getSearchKeyword());
cnd.and(group);
}
cnd.groupBy("pt.id");
sql.setCondition(cnd);
return memberPaymentService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@At
@RepeatSubmit
@RequiresPermissions("member.payment.refund")
public Object doRefund(@Valid String id) {
PaymentTransaction transaction = memberPaymentService.dao().fetch(PaymentTransaction.class, id);
Result refund = wxPayCommonService.refund(transaction.getTransactionId(), transaction.getOutTradeNo());
return refund;
}
}
@@ -0,0 +1,382 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.top_block {
width: 100%;
padding: 20px 80px;
border-bottom: 10px solid rgb(240, 240, 240);
}
.top_title {
font-size: 14px;
color: #808492;
height: 30px;
line-height: 30px;
margin-bottom: 5px;
}
.top_num {
font-size: 26px;
}
.cut-off-line {
width: 1px;
height: 70%;
position: absolute;
right: 0;
top: 0;
bottom: 0;
margin: auto;
background-color: rgb(230, 230, 230);
}
.chartTitle {
font-size: 14px;
color: #808492;
margin-bottom: 20px;
}
</style>
<div id="app" v-cloak>
<div class="p10">
<el-card shadow="never">
<div class="top_block" v-loading="top_block_loading">
<el-row gutter="60">
<div style="position: absolute; top: -35px; right: -8px">
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="numForm.startYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(numForm.endYear){getNumData();}"
placeholder="选择年"
></el-date-picker>
-
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="numForm.endYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(numForm.startYear){getNumData();}"
placeholder="选择年"
></el-date-picker>
</div>
<el-col :span="6" style="position: relative">
<div class="top_title">总缴费金额</div>
<div class="top_num">{{numData.payMoney?numData.payMoney:'0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="6" style="position: relative">
<div class="top_title">退款金额</div>
<div class="top_num">{{numData.refundMoney?numData.refundMoney:'0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="6" style="position: relative">
<div class="top_title">退款订单数</div>
<div class="top_num">{{numData.refundSize?numData.refundSize:'0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="6" style="position: relative">
<div class="top_title">总缴费人数</div>
<div class="top_num">{{numData.paySize?numData.paySize:'0'}}</div>
</el-col>
</el-row>
</div>
<el-row style="padding: 30px 0; border-bottom: 10px solid rgb(240, 240, 240)">
<div style="position: absolute; top: 25px; right: 40px; z-index: 200">
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="oneForm.startYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(oneForm.endYear){getPayProjectChart();getPayMoneyChart();}"
placeholder="选择年"
></el-date-picker>
-
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="oneForm.endYear"
type="year"
:clearable="false"
value-format="yyyy"
@change="if(oneForm.startYear){getPayProjectChart();getPayMoneyChart();}"
placeholder="选择年"
></el-date-picker>
</div>
<el-col :span="12" style="padding: 0 20px" v-loading="payProjectLoading">
<div class="chartTitle">已缴人数</div>
<div id="payProjectChart" style="width: 100%; height: 330px"></div>
</el-col>
<el-col :span="12" style="padding: 0 20px" v-loading="payMoneyLoading">
<div class="chartTitle">已缴金额</div>
<div id="payMoneyChart" style="width: 100%; height: 330px"></div>
</el-col>
</el-row>
<el-row style="padding: 30px 0; border-bottom: 10px solid rgb(240, 240, 240)">
<div style="position: absolute; top: 25px; right: 250px; z-index: 999">
<el-date-picker
class="year"
style="width: 120px"
size="mini"
v-model="unionForm.year"
type="year"
:clearable="false"
value-format="yyyy"
@change="getProjectList"
placeholder="选择年"
></el-date-picker>
</div>
<div style="position: absolute; top: 25px; right: 40px; z-index: 999">
<el-select
placeholder="请选择项目"
v-model="unionForm.paymentProjectId"
style="width: 100%"
size="mini"
:clearable="false"
@change="doSearch"
@clear="doSearch"
filterable="true"
>
<el-option v-for="item in paymentProjectList"
:label="item.projectName" :value="item.id"></el-option>
</el-select>
</div>
<el-col :span="24" style="padding: 0 20px" v-loading="all_union_loading">
<div class="chartTitle" style="margin-bottom: 50px">
</div>
<div id="allUnionChart" style="width: 100%; height: 300px"></div>
</el-col>
</el-row>
</el-card>
</div>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
oneForm: {
startYear: new Date().getFullYear() - 2 + "",
endYear: new Date().getFullYear() + ""
},
twoForm: {
startYear: new Date().getFullYear() - 2 + "",
endYear: new Date().getFullYear() + ""
},
numForm: {
startYear: new Date().getFullYear() - 2 + "",
endYear: new Date().getFullYear() + ""
},
payProjectLoading: false,
refundProjectLoading: false,
payMoneyLoading: false,
top_block_loading: false,
numData: {},
all_union_loading: false,
unionForm: {
year: new Date().getFullYear() + ""
},
paymentProjectList:[],
}
},
methods: {
async getNumData() {
this.top_block_loading = true
const resp = await $.post("/platform/member/payment/chartSummary/getNumData", this.numForm)
if (resp.code === 0) {
this.numData = resp.data
}
this.top_block_loading = false
},
async getPayProjectChart() {
this.payProjectLoading = true
const resp = await $.post("/platform/member/payment/chartSummary/getPayProjectChart", this.oneForm)
if (resp.code === 0) {
let { data } = resp
document.getElementById("payProjectChart").innerHTML = ""
const config = {
xField: "projectName",
yField: "num",
label: {
position: "middle", // 'top', 'bottom', 'middle',
style: {
fill: "#FFFFFF",
opacity: 0.6
}
},
xAxis: {
label: {
autoHide: true,
autoRotate: false
}
},
color: ({ type }) => {
return "#63DAAB"
},
meta: {
projectName: {
alias: "项目"
},
num: {
alias: "缴费人数"
}
}
}
const plot = new G2Plot.Column(document.getElementById("payProjectChart"), {
data,
...config
})
plot.render()
}
this.payProjectLoading = false
},
async getPayMoneyChart() {
this.payMoneyLoading = true
const resp = await $.post("/platform/member/payment/chartSummary/getPayMoneyChart", this.oneForm)
if (resp.code === 0) {
let { data } = resp
document.getElementById("payMoneyChart").innerHTML = ""
const config = {
xField: "projectName",
yField: "money",
label: {
position: "middle", // 'top', 'bottom', 'middle',
style: {
fill: "#FFFFFF",
opacity: 0.6
}
},
xAxis: {
label: {
autoHide: true,
autoRotate: false
}
},
color: ({ type }) => {
return "#63DAAB"
},
meta: {
projectName: {
alias: "项目"
},
money: {
alias: "金额(元)"
}
}
}
const plot = new G2Plot.Column(document.getElementById("payMoneyChart"), {
data,
...config
})
plot.render()
}
this.payMoneyLoading = false
},
async allUnionMoney() {
this.all_union_loading = true
const resp = await $.get("/platform/member/payment/chartSummary/allUnionMoney", {
paymentProjectId: this.unionForm.paymentProjectId
})
if (resp.code === 0) {
let { data } = resp
document.getElementById("allUnionChart").innerHTML = ""
const config = {
isStack: true,
legend: {
position: "top-right",
flipPage: false
},
autoFit: true,
title: {
visible: true,
text: "年工会经费及活动详情"
},
description: {
visible: true,
text: "单位(元)"
},
xField: "unionname",
yField: "money",
stackField: "type",
color: ["#5B8FF9", "#5AD8A6"],
xAxis: {
label: {
formatter: (v) => {
if (data.length > 30 && v.length > 3) {
return v.substr(0, 2) + "..."
} else if (data.length > 20 && v.length > 4) {
return v.substr(0, 3) + "..."
} else if (data.length > 10 && v.length > 6) {
return v.substr(0, 5) + "..."
}
return v
}
}
},
yAxis: {},
meta: {
unionname: {
alias: "工会"
},
money: {
alias: "金额"
}
},
connectedArea: {
visible: true,
triggerOn: false
}
}
const plot = new G2Plot.Column(document.getElementById("allUnionChart"), {
data,
...config
})
plot.render()
}
this.all_union_loading = false
},
async getProjectList() {
const resp = await $.get("/platform/member/payment/project/getAllProject", { year: this.unionForm.year })
if (resp.code === 0) {
this.paymentProjectList = resp.data
this.$set(this.unionForm, "paymentProjectId", this.paymentProjectList ? this.paymentProjectList[0].id : null)
await this.allUnionMoney()
}
}
},
async created() {
await this.getPayProjectChart()
await this.getPayMoneyChart()
await this.getNumData()
await this.getProjectList()
}
})
</script>
<!--#
}
#-->
@@ -16,7 +16,7 @@ layout("/layouts/platform.html"){
<div class="search-item-option">
<el-date-picker
:clearable="false"
@change="doSearch();getProjectList()"
@change="doSearch"
placeholder="选择年度"
type="year"
style="width: 100%"
@@ -27,7 +27,7 @@ layout("/layouts/platform.html"){
</div>
</div>
</el-card>
<el-card shadow="never">
<el-card shadow="never" class="mt10">
<table-tool label="缴费列表" :app="this">
<template #func>
<el-radio-group @change="doSearch" class="mr10" size="small"
@@ -132,7 +132,7 @@ layout("/layouts/platform.html"){
<div v-if="payActive===1" class="mt25">
<el-form-item label="商品订单">
{{formData.tradingOrderNo}}
{{formData.transactionId}}
</el-form-item>
<el-form-item label="支付金额">
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}</div>
@@ -178,7 +178,7 @@ layout("/layouts/platform.html"){
</div>
</div>
<el-form-item label="商品订单">
{{formData.tradingOrderNo}}
{{formData.transactionId}}
</el-form-item>
<el-form-item label="支付金额">
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}
@@ -198,7 +198,7 @@ layout("/layouts/platform.html"){
</div>
<script>
const vue = new Vue({
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
@@ -246,7 +246,10 @@ layout("/layouts/platform.html"){
this.qrcodeLoading = true
const paymentMoney = Math.floor(this.formData.paymentMoney * 100)
this.payActive = this.payActive + 1
const resp = await $.post("/platform/member/payment/mine/pcOrderPay", { paymentMoney })
const resp = await $.post("/platform/member/payment/mine/pcOrderPay", {
paymentMoney: paymentMoney,
paymentInfoId: this.formData.paymentInfoId
})
if (resp.code === 0) {
const data = JSON.parse(resp.data)
this.$nextTick(() => {
@@ -259,7 +262,7 @@ layout("/layouts/platform.html"){
correctLevel: 3
})
})
this.formData.tradingOrderNo = data.tradingOrderNo
this.formData.transactionId = data.transactionId
await this.getIsPay()
}
this.qrcodeLoading = false
@@ -301,12 +304,8 @@ layout("/layouts/platform.html"){
this.$set(this.formData, "payModeValueList", payStandard.payModeValueList)
this.$set(this.formData, "paymentMoney", 0)
}
this.payVisible = true
},
doSubmit() {
}
},
created() {
this.pageData()
@@ -0,0 +1,210 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
:clearable="false"
@change="doSearch();getProjectList()"
placeholder="选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">缴费项目:</div>
<div class="search-item-option">
<el-select
placeholder="请选择项目"
v-model="pageForm.paymentProjectId"
style="width: 100%"
:clearable="false"
@change="doSearch"
@clear="doSearch"
filterable="true"
>
<el-option v-for="item in paymentProjectList"
:label="item.projectName" :value="item.id"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">工号/姓名:</div>
<div class="search-item-option">
<el-input placeholder="请输入工号/姓名"
v-model="pageForm.searchKeyword" clearable>
<template slot="prepend">姓名/工号</template>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">交易单号:</div>
<div class="search-item-option">
<el-input placeholder="请输入交易单号"
v-model="pageForm.transactionId" clearable>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">
<el-button @click="doSearch" type="primary">查询</el-button>
</div>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="缴费列表" :app="this">
<template #func>
<el-radio-group @change="doSearch" class="mr10" size="small"
v-model="pageForm.isRefund">
<el-radio-button :label="3">全部</el-radio-button>
<el-radio-button :label="0">未退款</el-radio-button>
<el-radio-button :label="1">已退款</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
class="vi-table"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop==='isRefund'">
<span v-if="row.isRefund" style="color: red">已全额退款</span>
<span v-else style="color: #2cd000">支付成功</span>
</template>
<template scope="{row}" v-else-if="column.prop==='tradingAmount'">
{{row.tradingAmount*0.01}}
</template>
<template scope="{row}" v-else-if="column.prop==='refundTime'">
<span v-if="!row.refundTime"></span>
<span
v-else>{{moment(row.refundTime).format("YYYY-MM-DD HH:mm:ss")}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
prop="userOnline" width="200px">
<template scope="{row}">
<el-button :disabled="row.isRefund" @click="doRefund(row)"
size="mini" type="danger" :loading="submitLoading">退款
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
</div>
<script>
new Vue({
el: "#app",
mixins: [initTableMixins],
data() {
return {
paymentProjectList: [],
pageForm: {
isRefund: 3,
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "loginName", label: "工号", sortable: true },
{ prop: "userName", label: "姓名", sortable: true },
{ prop: "unitName", label: "单位", sortable: true },
{ prop: "unionName", label: "工会", sortable: true },
{ prop: "projectName", label: "项目名称", sortable: true },
{ prop: "tradingAmount", label: "缴费金额(元)", sortable: true },
{ prop: "paymentTime", label: "支付时间", sortable: true },
{ prop: "transactionId", label: "交易单号", sortable: true },
{ prop: "isRefund", label: "是否退款", sortable: true },
{ prop: "refundTime", label: "退款到账时间", sortable: true }
]
}
},
methods: {
doRefund(row) {
this.$confirm("您确定要退款吗?退款金额将原路退还,退款后将不能撤回!", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
this.submitLoading = true
const resp = await $.post("/platform/member/payment/refund/doRefund", {
id: row.id
})
this.submitLoading = false
if (resp.code === 0) {
this.doSearch()
this.$message({
type: "success",
message: resp.data
})
} else {
this.$message({
type: "error",
message: resp.data
})
}
})
},
async getProjectList() {
const resp = await $.get("/platform/member/payment/project/getAllProject", { year: this.pageForm.year })
if (resp.code === 0) {
this.paymentProjectList = resp.data
this.$set(this.pageForm, "paymentProjectId", this.paymentProjectList ? this.paymentProjectList[0].id : null)
}
}
},
async created() {
await this.getProjectList()
this.pageData()
}
})
</script>
<!--#
}
#-->