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