From dde747aa04edfb099a1151101961ecaa67b7d152 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Mon, 08 Sep 2025 15:34:43 +0800
Subject: [PATCH] C2C修复
---
trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java | 8
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java | 171 ++++++++++++++++++++++++
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java | 181 +++++++++++++++++++++++++
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java | 3
4 files changed, 360 insertions(+), 3 deletions(-)
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
index 18f6b75..a50e22b 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
@@ -15,6 +15,7 @@
import com.yami.trading.common.constants.Constants;
import com.yami.trading.common.domain.Result;
import com.yami.trading.common.util.IPHelper;
+import com.yami.trading.security.common.manager.PasswordManager;
import com.yami.trading.security.common.util.SecurityUtils;
import com.yami.trading.security.common.enums.SysTypeEnum;
import com.yami.trading.security.common.manager.TokenStore;
@@ -60,6 +61,9 @@
@Autowired
PermissionFacade permissionFacade;
+
+ @Autowired
+ PasswordManager passwordManager;
@PostMapping("list")
@ApiOperation("列表")
@@ -115,7 +119,7 @@
public Result restLoginPasswrod(@Valid @RequestBody RestLoginPasswrodModel model) {
sysUserService.checkGooleAuthCode(Long.valueOf(model.getGoogleAuthCode()));
sysUserService.checkSafeWord(model.getLoginSafeword());
- userService.restLoginPasswrod(model.getUserId(), model.getPassword());
+ userService.restLoginPasswrod(model.getUserId(), passwordManager.decryptPassword(model.getPassword()));
return Result.ok(null);
}
@@ -134,7 +138,7 @@
public Result restSafePassword(@Valid @RequestBody RestSafePasswordModel model) {
sysUserService.checkGooleAuthCode(Long.valueOf(model.getGoogleAuthCode()));
sysUserService.checkSafeWord(model.getLoginSafeword());
- userService.restSafePassword(model.getUserId(), model.getNewSafeword());
+ userService.restSafePassword(model.getUserId(), passwordManager.decryptPassword(model.getNewSafeword()));
return Result.ok(null);
}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java
index b111b53..585e685 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java
@@ -499,7 +499,8 @@
// c2cOrder.setUnreadMsg(unreadMsg.intValue());
// }
if (StringUtils.isNotEmpty(c2cOrder.getMethodImg())) {
- String path = Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + c2cOrder.getMethodImg();
+ //String path = Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + c2cOrder.getMethodImg();
+ String path = Constants.IMAGES_HTTP + c2cOrder.getMethodImg();
c2cOrder.setMethodImg(path);
}
// 多语言
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java
index f4c50d7..5227a86 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java
@@ -26,8 +26,10 @@
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
@RestController
@Slf4j
@@ -232,4 +234,183 @@
return resultObject;
}
+ @RequestMapping(action + "pay_finish.action")
+ public Object pay_finish(HttpServletRequest request) {
+ String order_no = request.getParameter("order_no");
+ String safe_password = request.getParameter("safe_password");
+
+ Result resultObject = new Result();
+
+ boolean lock = false;
+
+ try {
+
+ String partyId = SecurityUtils.getCurrentUserId();
+ if (null == partyId) {
+ throw new BusinessException("请重新登录");
+ }
+
+ User party = userService.getById(partyId);
+ if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
+ throw new BusinessException("无权限");
+ }
+
+ if (!userService.checkLoginSafeword(partyId, safe_password)) {
+ throw new BusinessException("资金密码错误");
+ }
+
+ if (!party.isEnabled()) {
+ return Result.succeed("User is locked");
+ }
+
+ C2cOrder order = this.c2cOrderService.get(order_no);
+ if (null == order) {
+ throw new BusinessException("订单不存在");
+ }
+
+ if (partyId.equals(order.getPartyId())) {
+ // 用户操作
+ if (!"buy".equals(order.getDirection())) {
+ throw new BusinessException("用户不能支付卖单");
+ }
+ } else if (partyId.equals(order.getC2cUserPartyId())) {
+ // 承兑商操作
+ if (!"sell".equals(order.getDirection())) {
+ throw new BusinessException("承兑商不能支付买单");
+ }
+ } else {
+ throw new BusinessException("无权限");
+ }
+
+ if (!"0".equals(order.getState())) {
+ throw new BusinessException("订单不是未付款状态");
+ }
+
+ if (!C2cOrderLock.add(order_no)) {
+ throw new BusinessException(1, "请稍后再试");
+ }
+
+ lock = true;
+
+ order.setState("1");
+ order.setPayTime(new Date());
+ this.c2cOrderService.updateById(order);
+
+ if (Arrays.asList("0", "1").contains(order.getState())) {
+ // 只有未付款和已付款的订单存入redis
+ redisTemplate.opsForValue().set(RedisKeys.C2C_ORDER_NO + order.getOrderNo(), order);
+ } else {
+ redisTemplate.delete(RedisKeys.C2C_ORDER_NO + order.getOrderNo());
+ }
+
+ // 订单自动取消时间和确认收款超时时间(0未付款/1已付款)
+ Map<String, Long> map = (Map<String, Long>) redisTemplate.opsForValue().get(RedisKeys.C2C_ORDER_NO_EXPIRE_TIME);
+ if (null == map) {
+ map = new ConcurrentHashMap<String, Long>();
+ }
+ if (!Arrays.asList("0", "1").contains(order.getState())) {
+ map.remove(order.getOrderNo() + "_auto_cancel");
+ map.remove(order.getOrderNo() + "_expire");
+ } else {
+ if (Arrays.asList("0").contains(order.getState())) {
+ map.put(order.getOrderNo() + "_auto_cancel", order.getCreateTime().getTime() + (long) order.getExpireTime() * 60 * 1000);
+ map.put(order.getOrderNo() + "_expire", order.getCreateTime().getTime() + (long) order.getExpireTime() * 60 * 1000 * 2);
+ } else if (Arrays.asList("1").contains(order.getState())) {
+ map.put(order.getOrderNo() + "_auto_cancel", order.getCreateTime().getTime() + (long) order.getExpireTime() * 60 * 1000);
+ map.put(order.getOrderNo() + "_expire", order.getPayTime().getTime() + (long) order.getExpireTime() * 60 * 1000);
+ }
+ }
+ this.redisTemplate.opsForValue().set(RedisKeys.C2C_ORDER_NO_EXPIRE_TIME, map);
+
+ resultObject.setCode(0);
+ } catch (BusinessException e) {
+ resultObject.setCode(1);
+ resultObject.setMsg(e.getMessage());
+ log.error("error: {}", e.getMessage());
+ } catch (Throwable t) {
+ resultObject.setCode(1);
+ //resultObject.setMsg("程序错误");
+ resultObject.setMsg(t.getMessage());
+ log.error("error:", t);
+ } finally {
+ if (lock) {
+ ThreadUtils.sleep(100);
+ C2cOrderLock.remove(order_no);
+ }
+ }
+
+ return resultObject;
+ }
+
+ /**
+ * 订单放行
+ */
+ @RequestMapping(action + "order_pass.action")
+ public Object order_pass(HttpServletRequest request) {
+ String order_no = request.getParameter("order_no");
+ String safe_password = request.getParameter("safe_password");
+
+ Result resultObject = new Result();
+ boolean lock = false;
+ try {
+
+ String partyId = SecurityUtils.getCurrentUserId();
+ if (null == partyId) {
+ throw new BusinessException("请重新登录");
+ }
+
+ User party = userService.getById(partyId);
+ if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
+ throw new BusinessException("无权限");
+ }
+
+ if (!C2cOrderLock.add(order_no)) {
+ throw new BusinessException(1, "请稍后再试");
+ }
+
+ lock = true;
+
+ if (!userService.checkLoginSafeword(partyId, safe_password)) {
+ throw new BusinessException("资金密码错误");
+ }
+ if (!party.isEnabled()) {
+ return Result.succeed("User is locked");
+ }
+
+ C2cOrder order = this.c2cOrderService.get(order_no);
+ if (null == order || !order.getPartyId().equals(partyId)) {
+ throw new BusinessException("订单不存在");
+ }
+ if ("0".equals(order.getState())) {
+ throw new BusinessException("待付款的订单无法放行");
+ }
+ if ("3".equals(order.getState())) {
+ throw new BusinessException("订单已完成,无法放行");
+ }
+ if ("4".equals(order.getState())) {
+ throw new BusinessException("订单已取消,无法放行");
+ }
+
+ this.c2cOrderService.saveOrderPass(order);
+ resultObject.setCode(0);
+ } catch (BusinessException e) {
+ resultObject.setCode(1);
+ resultObject.setMsg(e.getMessage());
+ log.error("error:{}", e.getMessage());
+ } catch (Throwable t) {
+ resultObject.setCode(1);
+ //resultObject.setMsg("程序错误");
+ resultObject.setMsg(t.getMessage());
+ log.error("error:", t);
+ } finally {
+ if (lock) {
+ ThreadUtils.sleep(100);
+ C2cOrderLock.remove(order_no);
+ }
+ }
+
+ return resultObject;
+ }
+
+
}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java
new file mode 100644
index 0000000..9e43987
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java
@@ -0,0 +1,171 @@
+package com.yami.trading.api.controller;
+
+import java.text.DecimalFormat;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.yami.trading.admin.controller.c2c.C2cUserController;
+import com.yami.trading.bean.c2c.C2cAdvert;
+import com.yami.trading.bean.c2c.C2cUser;
+import com.yami.trading.bean.c2c.C2cUserParamBaseSet;
+import com.yami.trading.bean.model.C2cPaymentMethodConfig;
+import com.yami.trading.bean.model.C2cTranslate;
+import com.yami.trading.bean.model.User;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.exception.BusinessException;
+import com.yami.trading.common.exception.YamiShopBindException;
+import com.yami.trading.common.util.Arith;
+import com.yami.trading.common.util.StringUtils;
+import com.yami.trading.common.web.ResultObject;
+import com.yami.trading.service.c2c.*;
+import com.yami.trading.service.user.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * C2C承兑商
+ */
+@RestController
+@Slf4j
+public class ApiC2cUserController {
+
+ private Logger logger = LoggerFactory.getLogger(C2cUserController.class);
+
+ @Autowired
+ private C2cUserService c2cUserService;
+ @Autowired
+ private C2cUserParamBaseSetService c2cUserParamBaseSetService;
+ @Autowired
+ private C2cAdvertService c2cAdvertService;
+ @Autowired
+ private C2cPaymentMethodConfigService c2cPaymentMethodConfigService;
+ @Autowired
+ private C2cTranslateService c2cTranslateService;
+ @Autowired
+ UserService userService;
+
+ private final String action = "/api/c2cUser!";
+
+ /**
+ * 获取 承兑商 详情
+ */
+ @RequestMapping(action + "get.action")
+ public Object get(HttpServletRequest request) {
+ String c2c_user_id = request.getParameter("c2c_user_id");
+ String language = request.getParameter("language");
+
+ ResultObject resultObject = new ResultObject();
+
+ try {
+
+ Map<String, Object> result = new HashMap<String, Object>();
+
+ C2cUser c2cUser = this.c2cUserService.getById(c2c_user_id);
+ if (null == c2cUser) {
+ throw new BusinessException("承兑商不存在");
+ }
+
+ C2cUserParamBaseSet paramBaseSet = this.c2cUserParamBaseSetService.getByPartyId(c2cUser.getC2cUserPartyId());
+ if (null == paramBaseSet) {
+ throw new BusinessException("承兑商参数基础设置不存在");
+ }
+
+ if (StringUtils.isNotEmpty(c2cUser.getHeadImg())) {
+ String path = Constants.IMAGES_HTTP + c2cUser.getHeadImg();
+ c2cUser.setHeadImg(path);
+ }
+
+ User party = userService.getById(c2cUser.getC2cUserPartyId());
+ if (null == party) {
+ throw new YamiShopBindException("承兑商的用户信息不存在");
+ }
+
+ DecimalFormat df = new DecimalFormat("#.########");
+
+ c2cUser.setThirtyDaysOrder(paramBaseSet.getThirtyDaysOrder() + c2cUser.getThirtyDaysOrder());
+ c2cUser.setThirtyDaysOrderRatio(0 != paramBaseSet.getThirtyDaysOrderRatio() ? paramBaseSet.getThirtyDaysOrderRatio() : c2cUser.getThirtyDaysOrderRatio());
+ c2cUser.setThirtyDaysPassAverageTime(0 != paramBaseSet.getThirtyDaysPassAverageTime() ? paramBaseSet.getThirtyDaysPassAverageTime() : c2cUser.getThirtyDaysPassAverageTime());
+ c2cUser.setThirtyDaysPayAverageTime(0 != paramBaseSet.getThirtyDaysPayAverageTime() ? paramBaseSet.getThirtyDaysPayAverageTime() : c2cUser.getThirtyDaysPayAverageTime());
+ c2cUser.setThirtyDaysAmount(Double.valueOf(df.format(Arith.add(paramBaseSet.getThirtyDaysAmount(), c2cUser.getThirtyDaysAmount()))).doubleValue());
+ c2cUser.setBuyAmount(Double.valueOf(df.format(Arith.add(paramBaseSet.getBuyAmount(), c2cUser.getBuyAmount()))).doubleValue());
+ c2cUser.setSellAmount(Double.valueOf(df.format(Arith.add(paramBaseSet.getSellAmount(), c2cUser.getSellAmount()))).doubleValue());
+ c2cUser.setTotalAmount(Double.valueOf(df.format(Arith.add(paramBaseSet.getTotalAmount(), c2cUser.getTotalAmount()))).doubleValue());
+ c2cUser.setAccountCreateDays(paramBaseSet.getAccountCreateDays() + c2cUser.getAccountCreateDays());
+ c2cUser.setFirstExchangeDays(paramBaseSet.getFirstExchangeDays() + c2cUser.getFirstExchangeDays());
+ c2cUser.setExchangeUsers(paramBaseSet.getExchangeUsers() + c2cUser.getExchangeUsers());
+ c2cUser.setBuySuccessOrders(paramBaseSet.getBuySuccessOrders() + c2cUser.getBuySuccessOrders());
+ c2cUser.setSellSuccessOrders(paramBaseSet.getSellSuccessOrders() + c2cUser.getSellSuccessOrders());
+ c2cUser.setTotalSuccessOrders(paramBaseSet.getTotalSuccessOrders() + c2cUser.getTotalSuccessOrders());
+ c2cUser.setAppraiseGood(paramBaseSet.getAppraiseGood() + c2cUser.getAppraiseGood());
+ c2cUser.setAppraiseBad(paramBaseSet.getAppraiseBad() + c2cUser.getAppraiseBad());
+
+ c2cUser.setOrderMailNoticeOpen(1 == paramBaseSet.getOrderMailNoticeOpen() || 1 == c2cUser.getOrderMailNoticeOpen() ? 1 : 0);
+ c2cUser.setOrderSmsNoticeOpen(1 == paramBaseSet.getOrderSmsNoticeOpen() || 1 == c2cUser.getOrderSmsNoticeOpen() ? 1 : 0);
+ c2cUser.setOrderAppNoticeOpen(1 == paramBaseSet.getOrderAppNoticeOpen() || 1 == c2cUser.getOrderAppNoticeOpen() ? 1 : 0);
+ c2cUser.setAppealMailNoticeOpen(1 == paramBaseSet.getAppealMailNoticeOpen() || 1 == c2cUser.getAppealMailNoticeOpen() ? 1 : 0);
+ c2cUser.setAppealSmsNoticeOpen(1 == paramBaseSet.getAppealSmsNoticeOpen() || 1 == c2cUser.getAppealSmsNoticeOpen() ? 1 : 0);
+ c2cUser.setAppealAppNoticeOpen(1 == paramBaseSet.getAppealAppNoticeOpen() || 1 == c2cUser.getAppealAppNoticeOpen() ? 1 : 0);
+ c2cUser.setChatAppNoticeOpen(1 == paramBaseSet.getChatAppNoticeOpen() || 1 == c2cUser.getChatAppNoticeOpen() ? 1 : 0);
+ c2cUser.setSecurityMailNoticeOpen(1 == paramBaseSet.getSecurityMailNoticeOpen() || 1 == c2cUser.getSecurityMailNoticeOpen() ? 1 : 0);
+ c2cUser.setSecuritySmsNoticeOpen(1 == paramBaseSet.getSecuritySmsNoticeOpen() || 1 == c2cUser.getSecuritySmsNoticeOpen() ? 1 : 0);
+ c2cUser.setSecurityAppNoticeOpen(1 == paramBaseSet.getSecurityAppNoticeOpen() || 1 == c2cUser.getSecurityAppNoticeOpen() ? 1 : 0);
+
+ Map<String, Object> partyMap = new HashMap<String, Object>();
+
+ partyMap.put("phoneAuthority", paramBaseSet.getPhoneAuthority());
+ partyMap.put("emailAuthority", paramBaseSet.getEmailAuthority());
+ partyMap.put("kycAuthority", paramBaseSet.getKycAuthority());
+ partyMap.put("kycHighlevelAuthority", paramBaseSet.getKycHighlevelAuthority());
+
+
+ List<C2cAdvert> adverts = this.c2cAdvertService.getByC2cUserId(c2c_user_id);
+ for (int i = 0; i < adverts.size(); i++) {
+ C2cAdvert adv = adverts.get(i);
+ if (null != adv) {
+
+ if (StringUtils.isNotEmpty(adv.getPayType())) {
+ List<String> pay_type = new LinkedList<String>();
+ String[] types = adv.getPayType().split(",");
+ for (String type : types) {
+ C2cPaymentMethodConfig method = this.c2cPaymentMethodConfigService.get(type.trim());
+ if (null != method) {
+ C2cTranslate trans = this.c2cTranslateService.get(method.getMethodName(), language);
+ if (null != trans) {
+ pay_type.add(trans.getTranslate());
+ } else {
+ pay_type.add(method.getMethodName());
+ }
+ }
+ }
+ adv.setPayTypeName(String.join(",", pay_type));
+ }
+ }
+ }
+
+ result.put("c2c_user", c2cUser);
+ result.put("party", partyMap);
+ result.put("advert", adverts);
+
+ resultObject.setData(result);
+
+ } catch (BusinessException e) {
+ resultObject.setCode("1");
+ resultObject.setMsg(e.getMessage());
+ } catch (Throwable t) {
+ resultObject.setCode("1");
+ resultObject.setMsg("程序错误");
+ logger.error("error:", t);
+ }
+ return resultObject;
+ }
+
+}
--
Gitblit v1.9.3