package com.yami.trading.api.controller; import com.yami.trading.bean.c2c.C2cAdvert; import com.yami.trading.bean.c2c.C2cOrder; import com.yami.trading.bean.model.C2cPaymentMethod; import com.yami.trading.bean.model.User; import com.yami.trading.common.constants.Constants; import com.yami.trading.common.constants.RedisKeys; import com.yami.trading.common.domain.Result; import com.yami.trading.common.exception.BusinessException; import com.yami.trading.common.exception.YamiShopBindException; import com.yami.trading.common.util.*; import com.yami.trading.security.common.util.SecurityUtils; import com.yami.trading.service.SessionTokenService; import com.yami.trading.service.c2c.C2cAdvertService; import com.yami.trading.service.c2c.C2cOrderService; import com.yami.trading.service.c2c.C2cPaymentMethodService; import com.yami.trading.service.syspara.SysparaService; import com.yami.trading.service.user.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @RestController @Slf4j public class ApiC2cOrderController { @Autowired private C2cOrderService c2cOrderService; private final String action = "/api/c2cOrder!"; @Autowired SessionTokenService sessionTokenService; @Autowired C2cAdvertService c2cAdvertService; @Autowired SysparaService sysparaService; @Autowired RedisTemplate redisTemplate; @Autowired UserService userService; @Autowired C2cPaymentMethodService c2cPaymentMethodService; /** * 首次进入下单页面,传递session_token */ @RequestMapping(action + "order_open.action") public Object order_open(HttpServletRequest request) throws IOException { String currency = request.getParameter("currency"); if (StringUtils.isEmptyString(currency)) { throw new YamiShopBindException("支付币种不正确"); } String partyId = SecurityUtils.getCurrentUserId(); String session_token = sessionTokenService.savePut(partyId); Map allPrice = c2cAdvertService.getAllSymbolPrice(currency); Map data = new HashMap(); data.put("session_token", session_token); data.put("all_price", allPrice); return Result.succeed(data); } /** * 自选区下单:购买、出售 * * safe_password 资金密码 * c2c_advert_id 广告id * payment_method_id 支付方式ID:购买为承兑商收款方式ID,出售为用户收款方式ID * order_type 订单类型:by_amount按支付金额/by_num按币种数量 * amount 支付金额 * coin_amount 币种数量 * remark 备注 */ @RequestMapping(action + "open.action") public Object open(HttpServletRequest request) { String session_token = request.getParameter("session_token"); // String safe_password = request.getParameter("safe_password"); String c2c_advert_id = request.getParameter("c2c_advert_id"); String payment_method_id = request.getParameter("payment_method_id"); String order_type = request.getParameter("order_type"); String direction = request.getParameter("direction"); String amount = request.getParameter("amount"); String coin_amount = request.getParameter("coin_amount"); String remark = request.getParameter("remark"); String partyId =SecurityUtils.getCurrentUserId(); Result resultObject=new Result(); boolean lock = false; User party=null; String orderNo = DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8); try { party = userService.getById(partyId); log.error("用户"+direction+"开始当前用户uid:"+party.getUserCode()+"当前用户名:"+party.getUserName()+"生成的订单号:"+orderNo); if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) { throw new YamiShopBindException("无权限"); } if (!C2cLock.add(partyId)) { throw new YamiShopBindException("Please try again later"); } lock = true; Object object = this.sessionTokenService.cacheGet(session_token); this.sessionTokenService.del(session_token); if (null == object || !partyId.equals((String) object)) { throw new YamiShopBindException("请稍后再试"); } if (!party.isEnabled()) { return Result.succeed("用户已锁定"); } // C2C用户未结束订单最大数量 Long nofinishOrderCount = c2cOrderService.getNofinishOrderCount(partyId); String c2c_sell_only_one = sysparaService.find("c2c_sell_only_one").getSvalue(); if(StringUtils.isNotEmpty(c2c_sell_only_one)&&"1".equals(c2c_sell_only_one)) { if(nofinishOrderCount >= 1) { throw new YamiShopBindException("提交失败,当前有未处理订单"); } Long.valueOf(c2c_sell_only_one).longValue(); } Object obj2 = this.sysparaService.find("c2c_nofinish_order_count_max"); if (null != obj2) { if (nofinishOrderCount >= Long.valueOf(this.sysparaService.find("c2c_nofinish_order_count_max").getSvalue()).longValue()) { throw new YamiShopBindException("用户未结束订单数量已达上限"); } } // C2C用户下单是否需要基础认证(true:是,false:否) Object obj = this.sysparaService.find("c2c_order_need_kyc"); if (null != obj) { if (!party.isRealNameAuthority() && "true".equals(this.sysparaService.find("c2c_order_need_kyc").getSvalue())) { return Result.succeed("未实名认证,是否认证?"); } } // C2C每日订单取消最大次数 int orderCancelDayTimes = 0; Map map = (Map)redisTemplate.opsForValue() .get(RedisKeys.C2C_ORDER_CANCEL_DAY_TIMES); if (null != map && null != map.get(partyId)) { orderCancelDayTimes = map.get(partyId); } Object obj1 = this.sysparaService.find("c2c_order_cancel_day_times"); if (null != obj1) { if (orderCancelDayTimes >= Integer.valueOf(this.sysparaService.find("c2c_order_cancel_day_times").getSvalue()).intValue()) { throw new YamiShopBindException("今日取消订单次数太多了,请明日再试"); } } C2cAdvert c2cAdvert = this.c2cAdvertService.getById(c2c_advert_id); if (null == c2cAdvert) { throw new YamiShopBindException("广告不存在"); } C2cPaymentMethod method =c2cPaymentMethodService.get(payment_method_id); if (null == method) { throw new YamiShopBindException("支付方式不存在"); } if (StringUtils.isEmptyString(order_type) || !Arrays.asList("by_amount", "by_num").contains(order_type)) { throw new YamiShopBindException("订单类型不正确"); } if (C2cOrder.ORDER_TYPE_BY_AMOUNT.equals(order_type)) { // 按支付金额支付 if (StringUtils.isEmptyString(amount) || !StringUtils.isDouble(amount) || Double.valueOf(amount).doubleValue() <= 0) { throw new YamiShopBindException("支付金额不正确"); } coin_amount = "0"; } else { // 按币种数量支付 if (StringUtils.isEmptyString(coin_amount) || !StringUtils.isDouble(coin_amount) || Double.valueOf(coin_amount).doubleValue() <= 0) { throw new YamiShopBindException("币种数量不正确"); } amount = "0"; } Map data = new HashMap(); C2cOrder c2cOrder = new C2cOrder(); c2cOrder.setPartyId(partyId); c2cOrder.setC2cUserId(c2cAdvert.getC2cUserId()); c2cOrder.setC2cAdvertId(c2c_advert_id); c2cOrder.setPaymentMethodId(payment_method_id); c2cOrder.setOrderType(order_type); c2cOrder.setOrderNo(orderNo); // 0未付款 c2cOrder.setState("0"); c2cOrder.setAmount(StringUtils.isEmptyString(amount) ? 0 : Double.valueOf(amount).doubleValue()); c2cOrder.setCoinAmount(StringUtils.isEmptyString(coin_amount) ? 0 : Double.valueOf(coin_amount).doubleValue()); c2cOrder.setRemark(remark); String remarks = "name:"+party.getUserName()+"code:"+party.getUserCode()+"direction:"+direction+"orderNo:"+orderNo; this.c2cOrderService.saveOpen(c2cOrder,remarks); data.put("order_no", c2cOrder.getOrderNo()); resultObject.setData(data); } catch (BusinessException e) { log.error("用户"+direction+"执行异常1当前用户uid:"+party.getUserCode()+"当前用户名:"+party.getUserName()+"生成的订单号:"+orderNo); resultObject.setCode(1); resultObject.setMsg(e.getMessage()); log.error("error:"+e.getMessage()); } catch (Throwable t) { log.error("用户"+direction+"执行异常2当前用户uid:"+party.getUserCode()+"当前用户名:"+party.getUserName()+"生成的订单号:"+orderNo); resultObject.setCode(1); resultObject.setMsg("程序错误"); log.error("error:", t); } finally { if (lock) { C2cLock.remove(partyId); } } return resultObject; } }