commit
This commit is contained in:
+169
@@ -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) {
|
public Object pageData(PageForm pageForm, Integer year, Integer isPay) {
|
||||||
Sql sql = Sqls.create("""
|
Sql sql = Sqls.create("""
|
||||||
SELECT
|
SELECT
|
||||||
|
|
||||||
mpp.`year`,
|
mpp.`year`,
|
||||||
mpp.projectName,
|
mpp.projectName,
|
||||||
mpp.startTime,
|
mpp.startTime,
|
||||||
mpp.endTime,
|
mpp.endTime,
|
||||||
mpi.id,
|
mpi.id,
|
||||||
mpi.payId,
|
|
||||||
mpi.isPayment,
|
mpi.isPayment,
|
||||||
mpi.payPersonnel,
|
mpi.payPersonnel,
|
||||||
mpi.personType,
|
mpi.personType,
|
||||||
@@ -88,10 +86,11 @@ public class MemberPaymentMineController {
|
|||||||
@At
|
@At
|
||||||
@RepeatSubmit
|
@RepeatSubmit
|
||||||
@RequiresPermissions("member.payment.mine")
|
@RequiresPermissions("member.payment.mine")
|
||||||
public Object pcOrderPay(Integer paymentMoney) {
|
public Object pcOrderPay(Integer paymentMoney, String paymentInfoId) {
|
||||||
WxPayNeedParamVo paramVo = new WxPayNeedParamVo();
|
WxPayNeedParamVo paramVo = new WxPayNeedParamVo();
|
||||||
paramVo.setDescription(ShiroUtil.getPlatformUsername() + "会费缴纳支付");
|
paramVo.setDescription(ShiroUtil.getPlatformUsername() + "会费缴纳支付");
|
||||||
paramVo.setAttach("");
|
paramVo.setAttach("");
|
||||||
|
paramVo.setMemberPaymentInfoId(paymentInfoId);
|
||||||
paramVo.setAmount(new Amount().setTotal(paymentMoney));
|
paramVo.setAmount(new Amount().setTotal(paymentMoney));
|
||||||
return wxPayCommonService.nativePay(paramVo);
|
return wxPayCommonService.nativePay(paramVo);
|
||||||
}
|
}
|
||||||
|
|||||||
+114
@@ -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">
|
<div class="search-item-option">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
:clearable="false"
|
:clearable="false"
|
||||||
@change="doSearch();getProjectList()"
|
@change="doSearch"
|
||||||
placeholder="选择年度"
|
placeholder="选择年度"
|
||||||
type="year"
|
type="year"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
@@ -27,7 +27,7 @@ layout("/layouts/platform.html"){
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card shadow="never">
|
<el-card shadow="never" class="mt10">
|
||||||
<table-tool label="缴费列表" :app="this">
|
<table-tool label="缴费列表" :app="this">
|
||||||
<template #func>
|
<template #func>
|
||||||
<el-radio-group @change="doSearch" class="mr10" size="small"
|
<el-radio-group @change="doSearch" class="mr10" size="small"
|
||||||
@@ -132,7 +132,7 @@ layout("/layouts/platform.html"){
|
|||||||
|
|
||||||
<div v-if="payActive===1" class="mt25">
|
<div v-if="payActive===1" class="mt25">
|
||||||
<el-form-item label="商品订单">
|
<el-form-item label="商品订单">
|
||||||
{{formData.tradingOrderNo}}
|
{{formData.transactionId}}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="支付金额">
|
<el-form-item label="支付金额">
|
||||||
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}</div>
|
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}</div>
|
||||||
@@ -178,7 +178,7 @@ layout("/layouts/platform.html"){
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-form-item label="商品订单">
|
<el-form-item label="商品订单">
|
||||||
{{formData.tradingOrderNo}}
|
{{formData.transactionId}}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="支付金额">
|
<el-form-item label="支付金额">
|
||||||
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}
|
<div style="color: #2cd000;font-size: 25px">¥ {{formData.paymentMoney}}
|
||||||
@@ -198,7 +198,7 @@ layout("/layouts/platform.html"){
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
const vue = new Vue({
|
new Vue({
|
||||||
el: "#app",
|
el: "#app",
|
||||||
mixins: [initTableMixins],
|
mixins: [initTableMixins],
|
||||||
data() {
|
data() {
|
||||||
@@ -246,7 +246,10 @@ layout("/layouts/platform.html"){
|
|||||||
this.qrcodeLoading = true
|
this.qrcodeLoading = true
|
||||||
const paymentMoney = Math.floor(this.formData.paymentMoney * 100)
|
const paymentMoney = Math.floor(this.formData.paymentMoney * 100)
|
||||||
this.payActive = this.payActive + 1
|
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) {
|
if (resp.code === 0) {
|
||||||
const data = JSON.parse(resp.data)
|
const data = JSON.parse(resp.data)
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
@@ -259,7 +262,7 @@ layout("/layouts/platform.html"){
|
|||||||
correctLevel: 3
|
correctLevel: 3
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
this.formData.tradingOrderNo = data.tradingOrderNo
|
this.formData.transactionId = data.transactionId
|
||||||
await this.getIsPay()
|
await this.getIsPay()
|
||||||
}
|
}
|
||||||
this.qrcodeLoading = false
|
this.qrcodeLoading = false
|
||||||
@@ -301,12 +304,8 @@ layout("/layouts/platform.html"){
|
|||||||
this.$set(this.formData, "payModeValueList", payStandard.payModeValueList)
|
this.$set(this.formData, "payModeValueList", payStandard.payModeValueList)
|
||||||
this.$set(this.formData, "paymentMoney", 0)
|
this.$set(this.formData, "paymentMoney", 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this.payVisible = true
|
this.payVisible = true
|
||||||
},
|
},
|
||||||
doSubmit() {
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.pageData()
|
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>
|
||||||
|
<!--#
|
||||||
|
}
|
||||||
|
#-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user