diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentChartSummaryController.java b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentChartSummaryController.java new file mode 100644 index 0000000..32f698e --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentChartSummaryController.java @@ -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 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)); + } +} diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentMineController.java b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentMineController.java index 4ba5373..3626de7 100644 --- a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentMineController.java +++ b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentMineController.java @@ -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); } diff --git a/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentRefundController.java b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentRefundController.java new file mode 100644 index 0000000..8560d0d --- /dev/null +++ b/src/main/java/io/v/nutz/zhgh/memberCost/controller/MemberPaymentRefundController.java @@ -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; + } + + +} diff --git a/src/main/resources/views/platform/membercost/chartSummary/index.html b/src/main/resources/views/platform/membercost/chartSummary/index.html new file mode 100644 index 0000000..5c093e9 --- /dev/null +++ b/src/main/resources/views/platform/membercost/chartSummary/index.html @@ -0,0 +1,382 @@ + + + + +
+ +
+ +
+ +
+ + - + +
+ +
总缴费金额
+
{{numData.payMoney?numData.payMoney:'0'}}
+
+
+ +
退款金额
+
{{numData.refundMoney?numData.refundMoney:'0'}}
+
+
+ +
退款订单数
+
{{numData.refundSize?numData.refundSize:'0'}}
+
+
+ +
总缴费人数
+
{{numData.paySize?numData.paySize:'0'}}
+
+
+
+ +
+ + - + +
+ +
已缴人数
+
+
+ +
已缴金额
+
+
+
+ + + +
+ +
+
+ + + +
+ +
+
+
+
+
+
+
+ + +
+ + + + + diff --git a/src/main/resources/views/platform/membercost/mine/index.html b/src/main/resources/views/platform/membercost/mine/index.html index 6e97877..23d7cf5 100644 --- a/src/main/resources/views/platform/membercost/mine/index.html +++ b/src/main/resources/views/platform/membercost/mine/index.html @@ -16,7 +16,7 @@ layout("/layouts/platform.html"){
- +