From 03e155cb2b3877f24cbf63419b6b1d59c1369525 Mon Sep 17 00:00:00 2001 From: fengjundan <1436525664@qq.com> Date: Mon, 2 Aug 2021 11:42:20 +0800 Subject: [PATCH] =?UTF-8?q?1=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=202=E4=BF=AE=E6=94=B9=E9=80=80=E6=AC=BE=E8=AE=A2?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/StatusConstants.java | 25 +- .../xhpc/common/core/utils/StringUtils.java | 228 ++++++-------- .../controller/AlipayPaymentController.java | 55 ---- .../controller/WxPaymentController.java | 221 +------------ .../controller/XhpcRefundAuditController.java | 294 ++++++++++++++++++ .../controller/XhpcRefundOrderController.java | 13 +- .../XhpcUserAccountStatementController.java | 16 +- .../payment/mapper/XhpcRefundOrderMapper.java | 9 + .../XhpcUserAccountStatementMapper.java | 9 + .../service/IXhpcRefundAuditService.java | 3 +- .../service/IXhpcRefundOrderService.java | 3 +- .../IXhpcUserAccountStatementService.java | 7 + .../impl/XhpcRefundAuditServiceImpl.java | 12 +- .../impl/XhpcRefundOrderServiceImpl.java | 11 +- .../XhpcUserAccountStatementServiceImpl.java | 11 + .../mapper/XhpcRefundOrderMapper.xml | 9 + .../mapper/XhpcUserAccountStatementMapper.xml | 14 + .../controller/XhpcAppUserController.java | 8 +- .../user/controller/XhpcUserController.java | 2 +- .../resources/mapper/XhpcAppUserMapper.xml | 17 +- 20 files changed, 539 insertions(+), 428 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/constant/StatusConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/constant/StatusConstants.java index 14a28323..e89c06d5 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/constant/StatusConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/constant/StatusConstants.java @@ -68,11 +68,6 @@ public class StatusConstants { */ public static final Integer EXPIRE_TIME = 5 * 60 * 1000; - /** - * 状态(0待支付 1充值成功,2充值失败) - */ - private Integer status; - /** * 充值订单状态待支付 */ @@ -162,4 +157,24 @@ public class StatusConstants { * 清分状态待审核 */ public static final Integer SORTING_STATUS_EXAMINE = 4; + + /** + * 类型(1充值 2退款 3充电) + */ + private Integer type; + + /** + * 用户充值流水 + */ + public static final Integer FLOWING_WATER_RECHARGE_TYPE = 1; + + /** + * 用户退款流水 + */ + public static final Integer FLOWING_WATER_REFUND_TYPE = 2; + + /** + * 用户充电流水 + */ + public static final Integer FLOWING_WATER_CHARGE_TYPE = 3; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/utils/StringUtils.java index e275115e..43395e25 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/utils/StringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/xhpc/common/core/utils/StringUtils.java @@ -6,6 +6,7 @@ import org.springframework.util.AntPathMatcher; import java.beans.PropertyDescriptor; import java.math.BigInteger; import java.security.MessageDigest; +import java.text.DecimalFormat; import java.util.Collection; import java.util.List; import java.util.Map; @@ -15,12 +16,15 @@ import java.util.Map; * * @author ruoyi */ -public class StringUtils extends org.apache.commons.lang3.StringUtils -{ - /** 空字符串 */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ private static final String NULLSTR = ""; - /** 下划线 */ + /** + * 下划线 + */ private static final char SEPARATOR = '_'; /** @@ -29,8 +33,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param value defaultValue 要判断的value * @return value 返回值 */ - public static T nvl(T value, T defaultValue) - { + public static T nvl(T value, T defaultValue) { return value != null ? value : defaultValue; } @@ -40,8 +43,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param coll 要判断的Collection * @return true:为空 false:非空 */ - public static boolean isEmpty(Collection coll) - { + public static boolean isEmpty(Collection coll) { return isNull(coll) || coll.isEmpty(); } @@ -51,8 +53,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param coll 要判断的Collection * @return true:非空 false:空 */ - public static boolean isNotEmpty(Collection coll) - { + public static boolean isNotEmpty(Collection coll) { return !isEmpty(coll); } @@ -60,10 +61,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * * 判断一个对象数组是否为空 * * @param objects 要判断的对象数组 - ** @return true:为空 false:非空 + * * @return true:为空 false:非空 */ - public static boolean isEmpty(Object[] objects) - { + public static boolean isEmpty(Object[] objects) { return isNull(objects) || (objects.length == 0); } @@ -73,8 +73,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param objects 要判断的对象数组 * @return true:非空 false:空 */ - public static boolean isNotEmpty(Object[] objects) - { + public static boolean isNotEmpty(Object[] objects) { return !isEmpty(objects); } @@ -84,8 +83,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param map 要判断的Map * @return true:为空 false:非空 */ - public static boolean isEmpty(Map map) - { + public static boolean isEmpty(Map map) { return isNull(map) || map.isEmpty(); } @@ -95,8 +93,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param map 要判断的Map * @return true:非空 false:空 */ - public static boolean isNotEmpty(Map map) - { + public static boolean isNotEmpty(Map map) { return !isEmpty(map); } @@ -106,8 +103,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param str String * @return true:为空 false:非空 */ - public static boolean isEmpty(String str) - { + public static boolean isEmpty(String str) { return isNull(str) || NULLSTR.equals(str.trim()); } @@ -117,8 +113,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param str String * @return true:非空串 false:空串 */ - public static boolean isNotEmpty(String str) - { + public static boolean isNotEmpty(String str) { return !isEmpty(str); } @@ -128,8 +123,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param object Object * @return true:为空 false:非空 */ - public static boolean isNull(Object object) - { + public static boolean isNull(Object object) { return object == null; } @@ -139,8 +133,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param object Object * @return true:非空 false:空 */ - public static boolean isNotNull(Object object) - { + public static boolean isNotNull(Object object) { return !isNull(object); } @@ -150,44 +143,37 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param object 对象 * @return true:是数组 false:不是数组 */ - public static boolean isArray(Object object) - { + public static boolean isArray(Object object) { return isNotNull(object) && object.getClass().isArray(); } /** * 去空格 */ - public static String trim(String str) - { + public static String trim(String str) { return (str == null ? "" : str.trim()); } /** * 截取字符串 * - * @param str 字符串 + * @param str 字符串 * @param start 开始 * @return 结果 */ - public static String substring(final String str, int start) - { - if (str == null) - { + public static String substring(final String str, int start) { + if (str == null) { return NULLSTR; } - if (start < 0) - { + if (start < 0) { start = str.length() + start; } - if (start < 0) - { + if (start < 0) { start = 0; } - if (start > str.length()) - { + if (start > str.length()) { return NULLSTR; } @@ -197,43 +183,35 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 截取字符串 * - * @param str 字符串 + * @param str 字符串 * @param start 开始 - * @param end 结束 + * @param end 结束 * @return 结果 */ - public static String substring(final String str, int start, int end) - { - if (str == null) - { + public static String substring(final String str, int start, int end) { + if (str == null) { return NULLSTR; } - if (end < 0) - { + if (end < 0) { end = str.length() + end; } - if (start < 0) - { + if (start < 0) { start = str.length() + start; } - if (end > str.length()) - { + if (end > str.length()) { end = str.length(); } - if (start > end) - { + if (start > end) { return NULLSTR; } - if (start < 0) - { + if (start < 0) { start = 0; } - if (end < 0) - { + if (end < 0) { end = 0; } @@ -246,18 +224,14 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param str 要判断的value * @return 结果 */ - public static boolean hasText(String str) - { + public static boolean hasText(String str) { return (str != null && !str.isEmpty() && containsText(str)); } - private static boolean containsText(CharSequence str) - { + private static boolean containsText(CharSequence str) { int strLen = str.length(); - for (int i = 0; i < strLen; i++) - { - if (!Character.isWhitespace(str.charAt(i))) - { + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(str.charAt(i))) { return true; } } @@ -274,13 +248,11 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
* * @param template 文本模板,被替换的部分用 {} 表示 - * @param params 参数值 + * @param params 参数值 * @return 格式化后的文本 */ - public static String format(String template, Object... params) - { - if (isEmpty(params) || isEmpty(template)) - { + public static String format(String template, Object... params) { + if (isEmpty(params) || isEmpty(template)) { return template; } return StrFormatter.format(template, params); @@ -289,10 +261,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 驼峰转下划线命名 */ - public static String toUnderScoreCase(String str) - { - if (str == null) - { + public static String toUnderScoreCase(String str) { + if (str == null) { return null; } StringBuilder sb = new StringBuilder(); @@ -302,31 +272,23 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils boolean curreCharIsUpperCase = true; // 下一字符是否大写 boolean nexteCharIsUpperCase = true; - for (int i = 0; i < str.length(); i++) - { + for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); - if (i > 0) - { + if (i > 0) { preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); - } - else - { + } else { preCharIsUpperCase = false; } curreCharIsUpperCase = Character.isUpperCase(c); - if (i < (str.length() - 1)) - { + if (i < (str.length() - 1)) { nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); } - if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) - { + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { sb.append(SEPARATOR); - } - else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) - { + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { sb.append(SEPARATOR); } sb.append(Character.toLowerCase(c)); @@ -338,18 +300,14 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 是否包含字符串 * - * @param str 验证字符串 + * @param str 验证字符串 * @param strs 字符串组 * @return 包含返回true */ - public static boolean inStringIgnoreCase(String str, String... strs) - { - if (str != null && strs != null) - { - for (String s : strs) - { - if (str.equalsIgnoreCase(trim(s))) - { + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { return true; } } @@ -363,27 +321,21 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param name 转换前的下划线大写方式命名的字符串 * @return 转换后的驼峰式命名的字符串 */ - public static String convertToCamelCase(String name) - { + public static String convertToCamelCase(String name) { StringBuilder result = new StringBuilder(); // 快速检查 - if (name == null || name.isEmpty()) - { + if (name == null || name.isEmpty()) { // 没必要转换 return ""; - } - else if (!name.contains("_")) - { + } else if (!name.contains("_")) { // 不含下划线,仅将首字母大写 return name.substring(0, 1).toUpperCase() + name.substring(1); } // 用下划线将原始字符串分割 String[] camels = name.split("_"); - for (String camel : camels) - { + for (String camel : camels) { // 跳过原始字符串中开头、结尾的下换线或双重下划线 - if (camel.isEmpty()) - { + if (camel.isEmpty()) { continue; } // 首字母大写 @@ -396,30 +348,22 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 驼峰式命名法 例如:user_name->userName */ - public static String toCamelCase(String s) - { - if (s == null) - { + public static String toCamelCase(String s) { + if (s == null) { return null; } s = s.toLowerCase(); StringBuilder sb = new StringBuilder(s.length()); boolean upperCase = false; - for (int i = 0; i < s.length(); i++) - { + for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); - if (c == SEPARATOR) - { + if (c == SEPARATOR) { upperCase = true; - } - else if (upperCase) - { + } else if (upperCase) { sb.append(Character.toUpperCase(c)); upperCase = false; - } - else - { + } else { sb.append(c); } } @@ -429,20 +373,16 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils /** * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 * - * @param str 指定字符串 + * @param str 指定字符串 * @param strs 需要检查的字符串数组 * @return 是否匹配 */ - public static boolean matches(String str, List strs) - { - if (isEmpty(str) || isEmpty(strs)) - { + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { return false; } - for (String pattern : strs) - { - if (isMatch(pattern, str)) - { + for (String pattern : strs) { + if (isMatch(pattern, str)) { return true; } } @@ -459,15 +399,13 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param url 需要匹配的url * @return */ - public static boolean isMatch(String pattern, String url) - { + public static boolean isMatch(String pattern, String url) { AntPathMatcher matcher = new AntPathMatcher(); return matcher.match(pattern, url); } @SuppressWarnings("unchecked") - public static T cast(Object obj) - { + public static T cast(Object obj) { return (T) obj; } @@ -526,4 +464,18 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } } + /** + * 获取编号 + * + * @param userId + * @param type + * @return + */ + public static String numFormat(Long userId, int channelType, int type) { + StringBuffer num = new StringBuffer(); + DecimalFormat decimalFormat = new DecimalFormat("0000000"); + int random = (int) (1 + Math.random() * (10 - 1 + 1)); + num.append(decimalFormat.format(userId)).append(DateUtils.timePath()).append(channelType).append(type).append(random); + return num.toString(); + } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java index 0c534687..dfa3c00a 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java @@ -3,12 +3,9 @@ package com.xhpc.payment.controller; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; -import com.alipay.api.CertAlipayRequest; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.internal.util.AlipaySignature; -import com.alipay.api.request.AlipayFundTransUniTransferRequest; import com.alipay.api.request.AlipayTradeCreateRequest; -import com.alipay.api.response.AlipayFundTransUniTransferResponse; import com.alipay.api.response.AlipayTradeCreateResponse; import com.xhpc.common.core.utils.DateUtils; import io.swagger.annotations.Api; @@ -112,56 +109,4 @@ public class AlipayPaymentController { System.out.println(AlipaySignature.getSignCheckContentV1(params)); } } - - /** - * 25 * 支付宝转账到用户账号 - * 26 * @throws IOException - * 27 - */ - @GetMapping(value = "/enterpriseCheckOut") - public void toHtml() throws AlipayApiException { - - String orderNumber = "alipay" + DateUtils.timePath(); - - String filePath = this.getClass().getResource("/").getPath() + "证书名字"; - System.out.println(filePath); - CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); - certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); - certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID")); - certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));//密钥 - certAlipayRequest.setFormat("json"); - certAlipayRequest.setCharset("UTF-8"); - certAlipayRequest.setSignType("RSA2"); - certAlipayRequest.setCertPath(filePath + "appCertPublicKey.crt");//应用证书 - certAlipayRequest.setAlipayPublicCertPath(filePath + "alipayCertPublicKey_RSA2.crt");//支付证书 - certAlipayRequest.setRootCertPath(filePath + "alipayRootCert.crt"); - DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); - AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); - //价格 - Double money = 0.01; - //转账标题 - String order_title = "支付宝提现"; - //支付宝会员id - String identity = "123"; - //实名信息 - String name = ""; - request.setBizContent("{" + - "\"out_biz_no\":\"201806300001\"," + - - "\"trans_amount\":" + money + "," + - "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," + - "\"biz_scene\":\"DIRECT_TRANSFER\"," + - "\"order_title\":\"" + order_title + "\"," + - "\"payee_info\":{" + - "\"identity\":\"" + identity + "\"," + - "\"identity_type\":\"ALIPAY_USER_ID \"," + - " }," + - " }"); - AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); - if (response.isSuccess()) { - System.out.println("调用成功"); - } else { - System.out.println("调用失败"); - } - } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java index f2a572d8..a8967297 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/WxPaymentController.java @@ -2,27 +2,16 @@ package com.xhpc.payment.controller; import com.xhpc.common.core.constant.HttpStatus; import com.xhpc.common.core.constant.StatusConstants; -import com.xhpc.common.core.listener.ConfigListener; -import com.xhpc.common.core.utils.DateUtils; import com.xhpc.common.core.utils.StringUtils; import com.xhpc.common.core.utils.WXPayUtil; import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.payment.domain.XhpcAppUser; import com.xhpc.payment.domain.XhpcRechargeOrder; +import com.xhpc.payment.domain.XhpcUserAccountStatement; import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper; import com.xhpc.payment.service.IXhpcRechargeOrderService; -import com.xhpc.payment.service.IXhpcRefundOrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContexts; -import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.PostMapping; @@ -30,15 +19,16 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.net.ssl.SSLContext; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; import java.math.BigDecimal; import java.net.URL; import java.net.URLConnection; -import java.security.KeyStore; import java.security.SecureRandom; import java.text.SimpleDateFormat; import java.util.Date; @@ -61,10 +51,6 @@ public class WxPaymentController { @Autowired private XhpcUserAccountStatementMapper xhpcUserAccountStatementMapper; - @Autowired - private IXhpcRefundOrderService iXhpcRefundOrderService; - - @Autowired private Environment environment; @@ -86,7 +72,7 @@ public class WxPaymentController { return AjaxResult.error(HttpStatus.NOT_NULL, "用户信息不能为空"); } Double amount1 = Double.parseDouble(amount) * 100; - String orderNumber = String.format("%07d", userId) + DateUtils.timePath() + 1 + 1 + (int) (1 + Math.random() * (10 - 1 + 1)); + String orderNumber = StringUtils.numFormat(Long.parseLong(userId), 1, StatusConstants.FLOWING_WATER_RECHARGE_TYPE); if (0.0 == amount1) { return AjaxResult.error(HttpStatus.NOT_NULL, "充值金额不能为0"); } @@ -353,10 +339,16 @@ public class WxPaymentController { xhpcAppUser.setAppUserId(xhpcRechargeOrder.getUserId()); xhpcAppUser.setBalance(BigDecimal.valueOf(Double.valueOf(balance)).add(xhpcRechargeOrder.getAmount())); xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_RECHARGE_TYPE); + xhpcUserAccountStatement.setRechargeOrderId(xhpcRechargeOrder.getRechargeOrderId()); + xhpcUserAccountStatement.setUserId(xhpcRechargeOrder.getUserId()); + xhpcUserAccountStatement.setAmount(xhpcRechargeOrder.getAmount()); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); } } - /** * 回调Api */ @@ -417,191 +409,4 @@ public class WxPaymentController { } return null; } - - - /** - * 企业退款 - * - * @return - */ - @PostMapping("/enterpriseCheckOut") - @ApiOperation(value = "企业退款") - public synchronized Object enterpriseCheckOut(@RequestBody Map map) { - //用户信息id - String refundOrderId = StringUtils.valueOf(map.get("refundOrderId")); - if (StringUtils.isNull(refundOrderId)) { - return AjaxResult.error(HttpStatus.NOT_NULL, "订单信息不能为空"); - } - Map xhpcRefundOrder = iXhpcRefundOrderService.info(Long.parseLong(refundOrderId)); - if (StringUtils.isNull(xhpcRefundOrder)) { - return AjaxResult.error(HttpStatus.DATA_ERROR, "订单不存在"); - } - String examineStatus = StringUtils.valueOf(xhpcRefundOrder.get("examineStatus")); - if ("1".equals(examineStatus)) { - return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); - } - - String status = StringUtils.valueOf(xhpcRefundOrder.get("status")); - if ("0".equals(status)) { - return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); - } - - CloseableHttpClient httpClient = null; - try { - //证书的地址 - ConfigListener.getConf().get("certPath"); - httpClient = initCert(); - } catch (Exception e) { - e.printStackTrace(); - - } - String orderOutNumber = StringUtils.valueOf(xhpcRefundOrder.get("refundOrderNumber")); - String openId = StringUtils.valueOf(xhpcRefundOrder.get("openId")); - Double amount = Double.parseDouble(StringUtils.valueOf(xhpcRefundOrder.get("amount"))); - //退款金额单位为分 - Double value = amount * 100; - Integer refund_fee = value.intValue(); - if (refund_fee <= 0) { - return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单金额出错"); - } - String userId = StringUtils.valueOf(map.get("userId")); - Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId)); - String balance = StringUtils.valueOf(appUserInfo.get("balance")); - - if (StringUtils.isNotNull(appUserInfo)) { - return AjaxResult.error(HttpStatus.DATA_ERROR, "用户不存在"); - } - BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(BigDecimal.valueOf(amount)); - if (surplus.compareTo(BigDecimal.ZERO) == -1) { - return AjaxResult.error(HttpStatus.ERROR_STATUS, "余额不足"); - } - String result = ""; - HttpPost httpPost = new HttpPost(environment.getProperty("WXTRANSFERS")); - StringEntity postEntity = new StringEntity(creatXMLParam(orderOutNumber, refund_fee.toString(), "退款申请", openId), "UTF-8"); - httpPost.addHeader("Content-Type", "text/xml"); - httpPost.setEntity(postEntity); - try { - HttpResponse response = null; - try { - response = httpClient.execute(httpPost); - } catch (IOException e) { - e.printStackTrace(); - } - HttpEntity entity = response.getEntity(); - try { - result = EntityUtils.toString(entity, "UTF-8"); - } catch (IOException e) { - e.printStackTrace(); - } - } finally { - httpPost.abort(); - } - return parseXml(result, Long.parseLong(refundOrderId), surplus, userId); - } - - - /** - * 加载证书 - * - * @param - * @throws Exception - */ - private CloseableHttpClient initCert() throws Exception { - String path = "apiclient_cert.p12"; - File file = new File(this.getClass().getResource("/").getPath() + path); - //线上地址 - //File file = new File("/www/wwwroot/msjd.project2.tingsun.net/" + path); - // 证书密码,默认为商户ID - String key = environment.getProperty("MCHID"); - // 指定读取证书格式为PKCS12 - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - // 读取本机存放的PKCS12证书文件 - FileInputStream instream = new FileInputStream(file); - try { - // 指定PKCS12的密码(商户ID) - keyStore.load(instream, key.toCharArray()); - } finally { - instream.close(); - } - SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build(); - SSLConnectionSocketFactory sslsf = - new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, - SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); - return HttpClients.custom().setSSLSocketFactory(sslsf).build(); - } - - /** - * 生成xml格式 添加参数时,按照abcd26个字母顺序添加 - * - * @param openid 用户openid - * @param partner_trade_no 商户退款单号 - * @param amount 退款金额 - * @param refund_desc 退款原因 - * @return - */ - private String creatXMLParam(String partner_trade_no, String amount, String refund_desc, String openid) { - String param = ""; - //随机字符串 - String nonceStr = WXPayUtil.generateNonceStr(); - //退款金额 - param += "amount=" + amount; - //校验用户姓名选项 - param += "&check_name=" + "NO_CHECK"; - //退款原因 - param += "&desc=" + refund_desc; - param += "&mch_appid=" + environment.getProperty("APPID"); - //商户id - param += "&mchid=" + environment.getProperty("MCHID"); - //随机字符串 - param += "&nonce_str=" + nonceStr; - //用户openid - param += "&openid=" + openid; - //商户退款单号 一个订单唯一 - param += "&partner_trade_no=" + partner_trade_no; - //生成签名 添加key值 - String stringSignTemp = param + "&key=" + environment.getProperty("KEY"); - //签名 不参与签名 默认MD5算法 - String sign = StringUtils.md5(stringSignTemp); - String xmlString = "\n" + - " " + amount + "\n" + - " " + "NO_CHECK" + "\n" + - " " + refund_desc + "\n" + - " " + environment.getProperty("APPID") + "\n" + - " " + environment.getProperty("MCHID") + "\n" + - " " + nonceStr + "\n" + - " " + openid + "\n" + - " " + partner_trade_no + "\n" + - " " + sign + "\n" + - " "; - return xmlString; - } - - /** - * 解析xml字符串 - * - * @param result 请求后的结果 - * @return - */ - private AjaxResult parseXml(String result, Long id, BigDecimal amount, String userId) { - try { - Map map = WXPayUtil.xmlToMap(result); - String result_code = map.get("result_code"); - if ("FAIL".equals(result_code)) { - return AjaxResult.error(map.get("err_code_des")); - } else { - //退款成功修改订单 - iXhpcRefundOrderService.updateRefundOrder(id, StatusConstants.OPERATION_WX_TYPE, StatusConstants.REFUND_ORDER_STATUS_SUCCESS); - //减少用户余额 - XhpcAppUser xhpcAppUser = new XhpcAppUser(); - xhpcAppUser.setAppUserId(Long.parseLong(userId)); - xhpcAppUser.setBalance(amount); - xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); - return AjaxResult.success("退款成功"); - } - } catch (Exception e) { - AjaxResult.error(e.getMessage()); - e.printStackTrace(); - } - return AjaxResult.error(); - } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java index 8265bbe4..350aad37 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java @@ -1,15 +1,46 @@ package com.xhpc.payment.controller; +import com.alipay.api.AlipayApiException; +import com.alipay.api.CertAlipayRequest; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; +import com.xhpc.common.core.constant.HttpStatus; +import com.xhpc.common.core.constant.StatusConstants; +import com.xhpc.common.core.listener.ConfigListener; +import com.xhpc.common.core.utils.DateUtils; +import com.xhpc.common.core.utils.StringUtils; +import com.xhpc.common.core.utils.WXPayUtil; import com.xhpc.common.core.web.controller.BaseController; import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.common.core.web.page.TableDataInfo; +import com.xhpc.payment.domain.XhpcAppUser; import com.xhpc.payment.domain.XhpcRefundAudit; +import com.xhpc.payment.domain.XhpcUserAccountStatement; +import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper; import com.xhpc.payment.service.IXhpcRefundAuditService; +import com.xhpc.payment.service.IXhpcRefundOrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.*; +import javax.net.ssl.SSLContext; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.security.KeyStore; import java.util.List; import java.util.Map; @@ -21,6 +52,15 @@ public class XhpcRefundAuditController extends BaseController { @Autowired private IXhpcRefundAuditService iXhpcRefundAuditService; + @Autowired + private IXhpcRefundOrderService iXhpcRefundOrderService; + + @Autowired + private XhpcUserAccountStatementMapper xhpcUserAccountStatementMapper; + + @Autowired + private Environment environment; + /** * 退款审核 * @@ -30,6 +70,16 @@ public class XhpcRefundAuditController extends BaseController { @GetMapping("/examine") @ApiOperation(value = "退款审核") public AjaxResult info(@RequestBody XhpcRefundAudit xhpcRefundAudit) { + if (StatusConstants.REFUND_ORDER_STATUS_SUCCESS == xhpcRefundAudit.getStatus()) { + Map map = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId()); + if (null == map) { + AjaxResult.error(HttpStatus.DATA_ERROR, "退款订单不存在"); + } + String refundOrderId = StringUtils.valueOf(map.get("refundOrderId")); + if (StatusConstants.OPERATION_WX_TYPE.equals(refundOrderId)) { + enterpriseCheckOut(xhpcRefundAudit); + } + } return AjaxResult.success(iXhpcRefundAuditService.insert(xhpcRefundAudit)); } @@ -42,4 +92,248 @@ public class XhpcRefundAuditController extends BaseController { List> list = iXhpcRefundAuditService.list(refundOrderId); return getDataTable(list); } + + + /** + * 企业退款 + * + * @return + */ + public synchronized Object enterpriseCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit) { + //只有审核通过才能退款 + Map xhpcRefundOrder = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId()); + if (StringUtils.isNull(xhpcRefundOrder)) { + return AjaxResult.error(HttpStatus.DATA_ERROR, "订单不存在"); + } + String examineStatus = StringUtils.valueOf(xhpcRefundOrder.get("examineStatus")); + if (!"1".equals(examineStatus)) { + return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); + } + + String status = StringUtils.valueOf(xhpcRefundOrder.get("status")); + if (!"0".equals(status)) { + return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); + } + + CloseableHttpClient httpClient = null; + try { + //证书的地址 + ConfigListener.getConf().get("certPath"); + httpClient = initCert(); + } catch (Exception e) { + e.printStackTrace(); + + } + String orderOutNumber = StringUtils.valueOf(xhpcRefundOrder.get("refundOrderNumber")); + String openId = StringUtils.valueOf(xhpcRefundOrder.get("openId")); + Double amount = Double.parseDouble(StringUtils.valueOf(xhpcRefundOrder.get("amount"))); + //退款金额单位为分 + Double value = amount * 100; + Integer refund_fee = value.intValue(); + if (refund_fee <= 0) { + return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单金额出错"); + } + String userId = StringUtils.valueOf(xhpcRefundOrder.get("userId")); + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId)); + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + + if (StringUtils.isNull(appUserInfo)) { + return AjaxResult.error(HttpStatus.DATA_ERROR, "用户不存在"); + } + BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(BigDecimal.valueOf(amount)); + if (surplus.compareTo(BigDecimal.ZERO) == -1) { + return AjaxResult.error(HttpStatus.ERROR_STATUS, "余额不足"); + } + String result = ""; + HttpPost httpPost = new HttpPost(environment.getProperty("WXTRANSFERS")); + StringEntity postEntity = new StringEntity(creatXMLParam(orderOutNumber, refund_fee.toString(), "退款申请", openId), "UTF-8"); + httpPost.addHeader("Content-Type", "text/xml"); + httpPost.setEntity(postEntity); + try { + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (IOException e) { + e.printStackTrace(); + } + HttpEntity entity = response.getEntity(); + try { + result = EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } finally { + httpPost.abort(); + } + return parseXml(result, xhpcRefundAudit.getRefundOrderId(), BigDecimal.valueOf(amount), userId); + } + + + /** + * 加载证书 + * + * @param + * @throws Exception + */ + private CloseableHttpClient initCert() throws Exception { + String path = "apiclient_cert.p12"; + File file = new File(this.getClass().getResource("/").getPath() + path); + //线上地址 + //File file = new File("/www/wwwroot/msjd.project2.tingsun.net/" + path); + // 证书密码,默认为商户ID + String key = environment.getProperty("MCHID"); + // 指定读取证书格式为PKCS12 + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + // 读取本机存放的PKCS12证书文件 + FileInputStream instream = new FileInputStream(file); + try { + // 指定PKCS12的密码(商户ID) + keyStore.load(instream, key.toCharArray()); + } finally { + instream.close(); + } + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build(); + SSLConnectionSocketFactory sslsf = + new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, + SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + return HttpClients.custom().setSSLSocketFactory(sslsf).build(); + } + + /** + * 生成xml格式 添加参数时,按照abcd26个字母顺序添加 + * + * @param openid 用户openid + * @param partner_trade_no 商户退款单号 + * @param amount 退款金额 + * @param refund_desc 退款原因 + * @return + */ + private String creatXMLParam(String partner_trade_no, String amount, String refund_desc, String openid) { + String param = ""; + //随机字符串 + String nonceStr = WXPayUtil.generateNonceStr(); + //退款金额 + param += "amount=" + amount; + //校验用户姓名选项 + param += "&check_name=" + "NO_CHECK"; + //退款原因 + param += "&desc=" + refund_desc; + param += "&mch_appid=" + environment.getProperty("APPID"); + //商户id + param += "&mchid=" + environment.getProperty("MCHID"); + //随机字符串 + param += "&nonce_str=" + nonceStr; + //用户openid + param += "&openid=" + openid; + //商户退款单号 一个订单唯一 + param += "&partner_trade_no=" + partner_trade_no; + //生成签名 添加key值 + String stringSignTemp = param + "&key=" + environment.getProperty("KEY"); + //签名 不参与签名 默认MD5算法 + String sign = StringUtils.md5(stringSignTemp); + String xmlString = "\n" + + " " + amount + "\n" + + " " + "NO_CHECK" + "\n" + + " " + refund_desc + "\n" + + " " + environment.getProperty("APPID") + "\n" + + " " + environment.getProperty("MCHID") + "\n" + + " " + nonceStr + "\n" + + " " + openid + "\n" + + " " + partner_trade_no + "\n" + + " " + sign + "\n" + + " "; + return xmlString; + } + + /** + * 解析xml字符串 + * + * @param result 请求后的结果 + * @return + */ + private AjaxResult parseXml(String result, Long id, BigDecimal amount, String userId) { + try { + Map map = WXPayUtil.xmlToMap(result); + String result_code = map.get("result_code"); + if ("FAIL".equals(result_code)) { + return AjaxResult.error(map.get("err_code_des")); + } else { + //退款成功修改订单 + iXhpcRefundOrderService.updateRefundOrder(id, StatusConstants.OPERATION_WX_TYPE, StatusConstants.REFUND_ORDER_STATUS_SUCCESS); + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId)); + if (StringUtils.isNotNull(appUserInfo)) { + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(Long.parseLong(userId)); + BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(amount); + xhpcAppUser.setBalance(surplus); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + XhpcUserAccountStatement xhpcUserAccountStatement = new XhpcUserAccountStatement(); + xhpcUserAccountStatement.setType(StatusConstants.FLOWING_WATER_REFUND_TYPE); + xhpcUserAccountStatement.setRefundOrderId(id); + xhpcUserAccountStatement.setUserId(Long.parseLong(userId)); + xhpcUserAccountStatement.setAmount(amount); + xhpcUserAccountStatement.setRemainingSum(xhpcAppUser.getBalance()); + xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); + } + return AjaxResult.success("退款成功"); + } + } catch (Exception e) { + AjaxResult.error(e.getMessage()); + e.printStackTrace(); + } + return AjaxResult.error(); + } + + /** + * 25 * 支付宝转账到用户账号 + * 26 * @throws IOException + * 27 + */ + public void enterpriseCheckOut() throws AlipayApiException { + + String orderNumber = "alipay" + DateUtils.timePath(); + + String filePath = this.getClass().getResource("/").getPath() + "证书名字"; + System.out.println(filePath); + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID")); + certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));//密钥 + certAlipayRequest.setFormat("json"); + certAlipayRequest.setCharset("UTF-8"); + certAlipayRequest.setSignType("RSA2"); + certAlipayRequest.setCertPath(filePath + "appCertPublicKey.crt");//应用证书 + certAlipayRequest.setAlipayPublicCertPath(filePath + "alipayCertPublicKey_RSA2.crt");//支付证书 + certAlipayRequest.setRootCertPath(filePath + "alipayRootCert.crt"); + DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + //价格 + Double money = 0.01; + //转账标题 + String order_title = "支付宝提现"; + //支付宝会员id + String identity = "123"; + //实名信息 + String name = ""; + request.setBizContent("{" + + "\"out_biz_no\":\"201806300001\"," + + + "\"trans_amount\":" + money + "," + + "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," + + "\"biz_scene\":\"DIRECT_TRANSFER\"," + + "\"order_title\":\"" + order_title + "\"," + + "\"payee_info\":{" + + "\"identity\":\"" + identity + "\"," + + "\"identity_type\":\"ALIPAY_USER_ID \"," + + " }," + + " }"); + AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); + if (response.isSuccess()) { + System.out.println("调用成功"); + } else { + System.out.println("调用失败"); + } + } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java index 80f931d3..5b6ef510 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOrderController.java @@ -1,7 +1,7 @@ package com.xhpc.payment.controller; import com.xhpc.common.core.constant.HttpStatus; -import com.xhpc.common.core.utils.DateUtils; +import com.xhpc.common.core.constant.StatusConstants; import com.xhpc.common.core.utils.StringUtils; import com.xhpc.common.core.web.controller.BaseController; import com.xhpc.common.core.web.domain.AjaxResult; @@ -51,9 +51,14 @@ public class XhpcRefundOrderController extends BaseController { return AjaxResult.error(HttpStatus.NOT_NULL, "退款渠道不能为空"); } //生成退款订单 - String orderOutNumber = String.format("%07d", userId) + DateUtils.timePath() + type + 2 + (int) (1 + Math.random() * (10 - 1 + 1)); - iXhpcRefundOrderService.addRefundOrder(userId, BigDecimal.valueOf(Double.parseDouble(amount)), type, orderOutNumber, openid); - return AjaxResult.success(); + String orderOutNumber = StringUtils.numFormat(Long.parseLong(userId), Integer.parseInt(type), StatusConstants.FLOWING_WATER_REFUND_TYPE); + + return iXhpcRefundOrderService.addRefundOrder(userId, BigDecimal.valueOf(Double.parseDouble(amount)), type, orderOutNumber, openid); + } + + public static void main(String[] args) { + + System.out.println(StringUtils.numFormat(Long.parseLong("11"), Integer.parseInt("1"), StatusConstants.FLOWING_WATER_REFUND_TYPE));//打印结果"000006" } /** diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcUserAccountStatementController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcUserAccountStatementController.java index 6280a2e7..3470b310 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcUserAccountStatementController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcUserAccountStatementController.java @@ -1,6 +1,7 @@ package com.xhpc.payment.controller; import com.xhpc.common.core.web.controller.BaseController; +import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.common.core.web.page.TableDataInfo; import com.xhpc.payment.service.IXhpcUserAccountStatementService; import io.swagger.annotations.Api; @@ -29,10 +30,23 @@ public class XhpcUserAccountStatementController extends BaseController { * @return */ @ApiOperation(value = "用户流水分页列表") - @GetMapping("/list") + @GetMapping("/page") public TableDataInfo page(@RequestParam Long appUserId) { startPage(); List> list = iXhpcUserAccountStatementService.page(appUserId); return getDataTable(list); } + + /** + * 用户流水列表 + * + * @param appUserId C端用户id + * @return + */ + @ApiOperation(value = "用户流水列表") + @GetMapping("/list") + public AjaxResult list(@RequestParam Long appUserId) { + List> list = iXhpcUserAccountStatementService.list(appUserId); + return AjaxResult.success(list); + } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOrderMapper.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOrderMapper.java index 553d2bf7..5ddcacdb 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOrderMapper.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcRefundOrderMapper.java @@ -48,4 +48,13 @@ public interface XhpcRefundOrderMapper { * @return */ public List> page(@Param("phone") String phone, @Param("refundOrderNumber") String refundOrderNumber, @Param("status") String status, @Param("createTimeStart") String createTimeStart, @Param("createTimeEnd") String createTimeEnd); + + /** + * 通过用户id查询未完成充电订单 + * + * @param userId 用户id + * @return 结果 + */ + public List> getNotChargeOrder(@Param("userId") Long userId); + } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java index 608c206a..1550e7ff 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/mapper/XhpcUserAccountStatementMapper.java @@ -46,4 +46,13 @@ public interface XhpcUserAccountStatementMapper { * @return */ public int updateAppUserBalance(XhpcAppUser xhpcAppUser); + + + /** + * 用户流水列表 + * + * @param appUserId C端用户id + * @return + */ + public List> list(@Param("appUserId") Long appUserId); } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundAuditService.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundAuditService.java index 43b8fa81..1fa51415 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundAuditService.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundAuditService.java @@ -1,5 +1,6 @@ package com.xhpc.payment.service; +import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.payment.domain.XhpcRefundAudit; import java.util.List; @@ -17,7 +18,7 @@ public interface IXhpcRefundAuditService { * * @param xhpcRefundAudit 退款审核 */ - public int insert(XhpcRefundAudit xhpcRefundAudit); + public AjaxResult insert(XhpcRefundAudit xhpcRefundAudit); /** * 退款审核列表 diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOrderService.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOrderService.java index 658f9cfb..41a87d27 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOrderService.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcRefundOrderService.java @@ -1,5 +1,6 @@ package com.xhpc.payment.service; +import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.payment.domain.XhpcRefundOrder; import java.math.BigDecimal; @@ -48,7 +49,7 @@ public interface IXhpcRefundOrderService { * @param type 退款渠道(1微信 2支付宝) * @return */ - public XhpcRefundOrder addRefundOrder(String appUserId, BigDecimal amount, String type, String refundOrderNumber, String openid); + public AjaxResult addRefundOrder(String appUserId, BigDecimal amount, String type, String refundOrderNumber, String openid); /** * 修改订单状态 退款订单 diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcUserAccountStatementService.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcUserAccountStatementService.java index 5962e0b6..aadd2a7c 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcUserAccountStatementService.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/IXhpcUserAccountStatementService.java @@ -27,4 +27,11 @@ public interface IXhpcUserAccountStatementService { */ public List> page(Long appUserId); + /** + * 用户流水列表 + * + * @param appUserId C端用户id + * @return + */ + public List> list(Long appUserId); } \ No newline at end of file diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java index 4c790596..aed4d8f0 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java @@ -1,7 +1,9 @@ package com.xhpc.payment.service.impl; +import com.xhpc.common.core.constant.HttpStatus; import com.xhpc.common.core.constant.StatusConstants; import com.xhpc.common.core.utils.StringUtils; +import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.payment.domain.XhpcRefundAudit; import com.xhpc.payment.domain.XhpcRefundOrder; import com.xhpc.payment.mapper.XhpcRefundAuditMapper; @@ -36,18 +38,22 @@ public class XhpcRefundAuditServiceImpl implements IXhpcRefundAuditService { * @param xhpcRefundAudit 退款审核 */ @Override - public int insert(XhpcRefundAudit xhpcRefundAudit) { + public AjaxResult insert(XhpcRefundAudit xhpcRefundAudit) { XhpcRefundOrder xhpcRefundOrder = new XhpcRefundOrder(); xhpcRefundOrder.setRefundOrderId(xhpcRefundAudit.getRefundOrderId()); xhpcRefundOrder.setExamineStatus(xhpcRefundAudit.getStatus()); xhpcRefundOrderMapper.update(xhpcRefundOrder); - if (StatusConstants.REFUND_ORDER_STATUS_SUCCESS == xhpcRefundOrder.getStatus()) { + if (StatusConstants.REFUND_ORDER_STATUS_SUCCESS == xhpcRefundAudit.getStatus()) { Map map = xhpcRefundOrderMapper.info(xhpcRefundOrder.getRefundOrderId()); + if (null == map) { + AjaxResult.error(HttpStatus.DATA_ERROR, "退款订单不存在"); + } String amount = "-" + StringUtils.valueOf(map.get("amount")); String userId = StringUtils.valueOf(map.get("userId")); xhpcUserAccountStatementService.add(xhpcRefundAudit.getRefundOrderId(), amount, userId, StatusConstants.FLOWING_WATER_REFUND); } - return xhpcRefundAuditMapper.insert(xhpcRefundAudit); + xhpcRefundAuditMapper.insert(xhpcRefundAudit); + return AjaxResult.success(); } /** diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOrderServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOrderServiceImpl.java index 0ffa5a71..89af30a7 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOrderServiceImpl.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOrderServiceImpl.java @@ -1,6 +1,8 @@ package com.xhpc.payment.service.impl; +import com.xhpc.common.core.constant.HttpStatus; import com.xhpc.common.core.constant.StatusConstants; +import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.payment.domain.XhpcRefundOrder; import com.xhpc.payment.mapper.XhpcRefundOrderMapper; import com.xhpc.payment.service.IXhpcRefundOrderService; @@ -67,7 +69,12 @@ public class XhpcRefundOrderServiceImpl implements IXhpcRefundOrderService { * @return */ @Override - public XhpcRefundOrder addRefundOrder(String appUserId, BigDecimal amount, String type, String refundOrderNumber, String openid) { + public AjaxResult addRefundOrder(String appUserId, BigDecimal amount, String type, String refundOrderNumber, String openid) { + + List> list = xhpcRefundOrderMapper.getNotChargeOrder(Long.parseLong(appUserId)); + if (null != list && list.size() > 0) { + return AjaxResult.error(HttpStatus.ERROR_STATUS, "还有未完成的订单,不能退款"); + } XhpcRefundOrder xhpcRefundOrder = new XhpcRefundOrder(); xhpcRefundOrder.setUserId(Long.parseLong(appUserId)); xhpcRefundOrder.setAmount(amount); @@ -79,7 +86,7 @@ public class XhpcRefundOrderServiceImpl implements IXhpcRefundOrderService { xhpcRefundOrder.setAlipayId(openid); } xhpcRefundOrderMapper.insert(xhpcRefundOrder); - return xhpcRefundOrder; + return AjaxResult.success(); } /** diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcUserAccountStatementServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcUserAccountStatementServiceImpl.java index 3f81aec1..010a93ac 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcUserAccountStatementServiceImpl.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcUserAccountStatementServiceImpl.java @@ -71,4 +71,15 @@ public class XhpcUserAccountStatementServiceImpl implements IXhpcUserAccountStat } xhpcUserAccountStatementMapper.insert(xhpcUserAccountStatement); } + + /** + * 用户流水列表 + * + * @param appUserId C端用户id + * @return + */ + @Override + public List> list(Long appUserId) { + return xhpcUserAccountStatementMapper.list(appUserId); + } } diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOrderMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOrderMapper.xml index 793ac67e..927e27f2 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOrderMapper.xml +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcRefundOrderMapper.xml @@ -179,4 +179,13 @@ ORDER BY xro.create_time DESC + \ No newline at end of file diff --git a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml index 4006247b..4647a20b 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml +++ b/xhpc-modules/xhpc-payment/src/main/resources/mapper/XhpcUserAccountStatementMapper.xml @@ -148,4 +148,18 @@ WHERE app_user_id = #{appUserId} + + \ No newline at end of file diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java index 22dd3c30..3ea031b4 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java @@ -74,8 +74,12 @@ public class XhpcAppUserController extends BaseController { @ApiOperation("禁用/启用C端用户") //@PreAuthorize(hasPermi = "app:user:status") @PostMapping("/status") - public AjaxResult status(@RequestParam Long appUserId) { - iXhpcAppUserUserService.status(appUserId); + public AjaxResult status(@RequestBody Map map) { + String appUserId = StringUtils.valueOf(map.get("appUserId")); + if (StringUtils.isEmpty(appUserId)) { + return AjaxResult.error(HttpStatus.NOT_NULL, "C端用户信息不能为空"); + } + iXhpcAppUserUserService.status(Long.parseLong(appUserId)); return AjaxResult.success(); } diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcUserController.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcUserController.java index b63d3b3c..59727b27 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcUserController.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcUserController.java @@ -96,7 +96,7 @@ public class XhpcUserController extends BaseController { @ApiOperation("平台用户详情") //@PreAuthorize(hasPermi = "user:pc:info") @GetMapping("/pc/info") - public AjaxResult pcInfo(@RequestBody Long userId) { + public AjaxResult pcInfo(@RequestParam Long userId) { return AjaxResult.success(iXhpcUserService.pcInfo(userId)); } diff --git a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml index b07b26a6..93804905 100644 --- a/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml +++ b/xhpc-modules/xhpc-user/src/main/resources/mapper/XhpcAppUserMapper.xml @@ -167,15 +167,18 @@