新版仿ok交易所-后端
zyy
2025-09-08 dde747aa04edfb099a1151101961ecaa67b7d152
C2C修复
3 files modified
1 files added
363 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java 8 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java 3 ●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java 181 ●●●●● patch | view | raw | blame | history
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java 171 ●●●●● patch | view | raw | blame | history
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);
    }
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);
        }
        // 多语言
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;
    }
}
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java
New file
@@ -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;
    }
}