package project.web.api; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.ObjectUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import kernel.exception.BusinessException; import kernel.sessiontoken.SessionTokenService; import kernel.util.StringUtils; import kernel.util.ThreadUtils; import kernel.web.ApplicationUtil; import kernel.web.BaseAction; import kernel.web.Page; import kernel.web.ResultObject; import project.Constants; import project.RedisKeys; import project.c2c.C2cAdvert; import project.c2c.C2cAdvertService; import project.c2c.C2cLock; import project.c2c.C2cOrder; import project.c2c.C2cOrderLock; import project.c2c.C2cOrderService; import project.c2c.C2cPaymentMethod; import project.c2c.C2cPaymentMethodService; import project.c2c.C2cTranslate; import project.c2c.C2cTranslateService; import project.onlinechat.otc.OtcOnlineChatMessageService; import project.party.PartyService; import project.party.model.Party; import project.redis.RedisHandler; import project.syspara.Syspara; import project.syspara.SysparaService; import util.DateUtil; import util.RandomUtil; /** * C2C订单 */ @RestController @CrossOrigin public class C2cOrderController extends BaseAction { private Logger logger = LoggerFactory.getLogger(C2cOrderController.class); @Autowired private C2cOrderService c2cOrderService; @Autowired protected OtcOnlineChatMessageService otcOnlineChatMessageService; @Autowired protected PartyService partyService; @Autowired private SessionTokenService sessionTokenService; @Autowired private SysparaService sysparaService; @Autowired private C2cAdvertService c2cAdvertService; @Autowired private C2cPaymentMethodService c2cPaymentMethodService; @Autowired private RedisHandler redisHandler; @Autowired private C2cTranslateService c2cTranslateService; private final String action = "/api/c2cOrder!"; /** * 首次进入下单页面,传递session_token */ @RequestMapping(action + "order_open.action") public Object order_open(HttpServletRequest request) throws IOException { String currency = request.getParameter("currency"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } try { if (StringUtils.isEmptyString(currency)) { throw new BusinessException("支付币种不正确"); } String partyId = this.getLoginPartyId(); String session_token = this.sessionTokenService.savePut(partyId); Map allPrice = this.c2cAdvertService.getAllSymbolPrice(currency); Map data = new HashMap(); data.put("session_token", session_token); data.put("all_price", allPrice); resultObject.setData(data); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } return resultObject; } /** * 自选区下单:购买、出售 * * 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"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } boolean lock = false; Party party = new Party(); String orderNo = DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8); try { party = this.partyService.cachePartyBy(partyId, false); if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { throw new BusinessException("无权限"); } if (!C2cLock.add(partyId)) { throw new BusinessException("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 BusinessException("请稍后再试"); } if (!party.getEnabled()) { resultObject.setCode("506"); resultObject.setMsg("用户已锁定"); return resultObject; } // C2C用户未结束订单最大数量 Long nofinishOrderCount = this.c2cOrderService.getNofinishOrderCount(partyId,direction); Syspara syspara = this.sysparaService.find("c2c_sell_only_one"); if(ObjectUtils.isNotEmpty(syspara)) { String c2c_sell_only_one = syspara.getValue(); if(StringUtils.isNotEmpty(c2c_sell_only_one)&&"1".equals(c2c_sell_only_one)) { if(nofinishOrderCount >= 1) { throw new BusinessException("提交失败,当前有未处理订单"); } 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").getValue()).longValue()) { throw new BusinessException("用户未结束订单数量已达上限"); } } // C2C用户下单是否需要基础认证(true:是,false:否) Object obj = this.sysparaService.find("c2c_order_need_kyc"); if (null != obj) { if (!party.getKyc_authority() && "true".equals(this.sysparaService.find("c2c_order_need_kyc").getValue())) { resultObject.setCode("401"); resultObject.setMsg("未实名认证,是否认证?"); return resultObject; } } // C2C每日订单取消最大次数 int orderCancelDayTimes = 0; Map map = (Map) this.redisHandler.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").getValue()).intValue()) { throw new BusinessException("今日取消订单次数太多了,请明日再试"); } } C2cAdvert c2cAdvert = this.c2cAdvertService.get(c2c_advert_id); if (null == c2cAdvert) { throw new BusinessException("广告不存在"); } C2cPaymentMethod method = this.c2cPaymentMethodService.get(payment_method_id); if (null == method) { throw new BusinessException("支付方式不存在"); } if (StringUtils.isEmptyString(order_type) || !Arrays.asList("by_amount", "by_num").contains(order_type)) { throw new BusinessException("订单类型不正确"); } if (C2cOrder.ORDER_TYPE_BY_AMOUNT.equals(order_type)) { // 按支付金额支付 if (StringUtils.isEmptyString(amount) || !StringUtils.isDouble(amount) || Double.valueOf(amount).doubleValue() <= 0) { throw new BusinessException("支付金额不正确"); } coin_amount = "0"; } else { // 按币种数量支付 if (StringUtils.isEmptyString(coin_amount) || !StringUtils.isDouble(coin_amount) || Double.valueOf(coin_amount).doubleValue() <= 0) { throw new BusinessException("币种数量不正确"); } amount = "0"; } Map data = new HashMap(); C2cOrder c2cOrder = new C2cOrder(); c2cOrder.setId(ApplicationUtil.getCurrentTimeUUID()); 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) { logger.error("用户"+direction+"执行异常1当前用户uid:"+party.getUsercode()+"当前用户名:"+party.getUsername()+"生成的订单号:"+orderNo); resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); logger.error("error:"+e.getMessage()); } catch (Throwable t) { logger.error("用户"+direction+"执行异常2当前用户uid:"+party.getUsercode()+"当前用户名:"+party.getUsername()+"生成的订单号:"+orderNo); resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } finally { if (lock) { C2cLock.remove(partyId); } } return resultObject; } // ================================================================================= /** * 快捷区下单:获取最优价格的广告 * * order_type 订单类型:by_amount按支付金额/by_num按币种数量 * amount 支付金额 * coin_amount 币种数量 * direction 买卖方式:buy买/sell卖 * currency 支付币种 * symbol 上架币种 */ @RequestMapping(action + "get_best_price_advert.action") public Object get_best_price_advert(HttpServletRequest request) { String order_type = request.getParameter("order_type"); String amount = request.getParameter("amount"); String coin_amount = request.getParameter("coin_amount"); String direction = request.getParameter("direction"); String currency = request.getParameter("currency"); String symbol = request.getParameter("symbol"); String language = request.getParameter("language"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } try { String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } Party party = this.partyService.cachePartyBy(partyId, false); if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { throw new BusinessException("无权限"); } if (!party.getEnabled()) { resultObject.setCode("506"); resultObject.setMsg("用户已锁定"); return resultObject; } String error = this.verifOpen(direction, currency, symbol, order_type); if (StringUtils.isNotEmpty(error)) { throw new BusinessException(error); } if (C2cOrder.ORDER_TYPE_BY_AMOUNT.equals(order_type)) { // 按支付金额支付 if (StringUtils.isEmptyString(amount) || !StringUtils.isDouble(amount) || Double.valueOf(amount).doubleValue() <= 0) { throw new BusinessException("支付金额不正确"); } coin_amount = "0"; } else { // 按币种数量支付 if (StringUtils.isEmptyString(coin_amount) || !StringUtils.isDouble(coin_amount) || Double.valueOf(coin_amount).doubleValue() <= 0) { throw new BusinessException("币种数量不正确"); } amount = "0"; } double amount_double = StringUtils.isEmptyString(amount) ? 0 : Double.valueOf(amount).doubleValue(); double coin_amount_double = StringUtils.isEmptyString(coin_amount) ? 0 : Double.valueOf(coin_amount).doubleValue(); Map cpmMap = new HashMap(); List cpmList = new ArrayList(); // 获取用户所有支付方式 id做key cpmMap = this.c2cPaymentMethodService.getByPartyId(partyId); if (null == cpmMap) { cpmMap = new HashMap(); } for (String id : cpmMap.keySet()) { C2cPaymentMethod cpm = cpmMap.get(id); if (null != cpm) { cpmList.add(cpm); } } Map> retMap = this.c2cAdvertService.getBestPriceAdvert(currency, symbol, direction, order_type, amount_double, coin_amount_double, cpmList); List> retList = new ArrayList>(); for (String pmi : retMap.keySet()) { Map map = retMap.get(pmi); if (null != map) { if (null != map.get("method_name") && StringUtils.isNotEmpty(map.get("method_name").toString())) { C2cTranslate trans = this.c2cTranslateService.get(map.get("method_name").toString(), language); if (null != trans) { map.put("method_name", trans.getTranslate()); } } retList.add(map); } } resultObject.setData(retList); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } return resultObject; } /** * 快捷区下单:购买、出售,提交订单 * * safe_password 资金密码 * payment_method_id 用户选择的自己的支付方式ID * order_type 订单类型:by_amount按支付金额/by_num按币种数量 * amount 支付金额 * coin_amount 币种数量 * direction 买卖方式:buy买/sell卖 * currency 支付币种 * symbol 上架币种 * remark 备注 */ @RequestMapping(action + "open_quick_apply.action") public Object open_quick_apply(HttpServletRequest request) { String session_token = request.getParameter("session_token"); // String safe_password = request.getParameter("safe_password"); String payment_method_id = request.getParameter("payment_method_id"); String order_type = request.getParameter("order_type"); String amount = request.getParameter("amount"); String coin_amount = request.getParameter("coin_amount"); String direction = request.getParameter("direction"); String currency = request.getParameter("currency"); String symbol = request.getParameter("symbol"); String remark = request.getParameter("remark"); String c2c_advert_id = request.getParameter("c2c_advert_id"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } try { String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } Party party = this.partyService.cachePartyBy(partyId, false); if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { throw new BusinessException("无权限"); } // if (!this.partyService.checkSafeword(safe_password, partyId)) { // throw new BusinessException("资金密码错误"); // } Object object = this.sessionTokenService.cacheGet(session_token); this.sessionTokenService.del(session_token); if (null == object || !partyId.equals((String) object)) { throw new BusinessException("请稍后再试"); } if (!party.getEnabled()) { resultObject.setCode("506"); resultObject.setMsg("用户已锁定"); return resultObject; } String error = this.verifOpen(direction, currency, symbol, order_type); if (StringUtils.isNotEmpty(error)) { throw new BusinessException(error); } if (StringUtils.isEmptyString(c2c_advert_id)) { throw new BusinessException("广告不存在"); } if (C2cOrder.ORDER_TYPE_BY_AMOUNT.equals(order_type)) { // 按支付金额支付 if (StringUtils.isEmptyString(amount) || !StringUtils.isDouble(amount) || Double.valueOf(amount).doubleValue() <= 0) { throw new BusinessException("支付金额不正确"); } coin_amount = "0"; } else { // 按币种数量支付 if (StringUtils.isEmptyString(coin_amount) || !StringUtils.isDouble(coin_amount) || Double.valueOf(coin_amount).doubleValue() <= 0) { throw new BusinessException("币种数量不正确"); } amount = "0"; } // C2C用户未结束订单最大数量 Long nofinishOrderCount = this.c2cOrderService.getNofinishOrderCount(partyId,direction); 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").getValue()).longValue()) { throw new BusinessException("用户未结束订单数量已达上限"); } } // C2C用户下单是否需要基础认证(true:是,false:否) Object obj = this.sysparaService.find("c2c_order_need_kyc"); if (null != obj) { if (!party.getKyc_authority() && "true".equals(this.sysparaService.find("c2c_order_need_kyc").getValue())) { resultObject.setCode("401"); resultObject.setMsg("未实名认证,是否认证?"); return resultObject; } } // C2C每日订单取消最大次数 int orderCancelDayTimes = 0; Map map = (Map) this.redisHandler.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").getValue()).intValue()) { throw new BusinessException("今日取消订单次数太多了,请明日再试"); } } C2cOrder c2cOrder = new C2cOrder(); c2cOrder.setId(ApplicationUtil.getCurrentTimeUUID()); c2cOrder.setPartyId(partyId); c2cOrder.setPaymentMethodId(payment_method_id); c2cOrder.setOrderType(order_type); c2cOrder.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8)); // 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.setDirection(direction); c2cOrder.setCurrency(currency); c2cOrder.setSymbol(symbol); c2cOrder.setRemark(remark); c2cOrder.setC2cAdvertId(c2c_advert_id); this.c2cOrderService.saveOpenQuickApply(c2cOrder); Map data = new HashMap(); data.put("order_no", c2cOrder.getOrderNo()); resultObject.setData(data); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } 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"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } boolean lock = false; try { String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } Party party = this.partyService.cachePartyBy(partyId, false); if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { throw new BusinessException("无权限"); } if (!this.partyService.checkSafeword(safe_password, partyId)) { throw new BusinessException("资金密码错误"); } if (!party.getEnabled()) { resultObject.setCode("506"); resultObject.setMsg("用户已锁定"); return resultObject; } 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.update(order); this.c2cOrderService.c2cSendMessageByState(order, "1"); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } finally { if (lock) { ThreadUtils.sleep(100); C2cOrderLock.remove(order_no); } } return resultObject; } /** * 取消订单 */ @RequestMapping(action + "order_cancel.action") public Object order_cancel(HttpServletRequest request) { String order_no = request.getParameter("order_no"); String remark = request.getParameter("remark"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } boolean lock = false; try { String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } Party party = this.partyService.cachePartyBy(partyId, false); if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { throw new BusinessException("无权限"); } if (!party.getEnabled()) { resultObject.setCode("506"); resultObject.setMsg("用户已锁定"); return resultObject; } C2cOrder order = this.c2cOrderService.get(order_no); if (null == order || !order.getPartyId().equals(this.getLoginPartyId())) { throw new BusinessException("订单不存在"); } if (!C2cOrderLock.add(order_no)) { throw new BusinessException(1, "请稍后再试"); } lock = true; if (StringUtils.isEmptyString(remark)) { throw new BusinessException("请选择取消理由"); } order.setRemark("订单号:"+order.getOrderNo()+"用户手动取消订单:"+remark); // 用户不能取消卖单,承兑商不能取消买单 if (partyId.equals(order.getPartyId())) { // 用户操作 if (!"buy".equals(order.getDirection())) { throw new BusinessException("用户不能取消卖单"); } this.c2cOrderService.saveOrderCancel(order, "user"); } else if (partyId.equals(order.getC2cUserPartyId())) { // 承兑商操作 if (!"sell".equals(order.getDirection())) { throw new BusinessException("承兑商不能取消买单"); } this.c2cOrderService.saveOrderCancel(order, "c2c_user"); } else { throw new BusinessException("无权限"); } } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.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"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } boolean lock = false; try { String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } Party party = this.partyService.cachePartyBy(partyId, false); if (Constants.SECURITY_ROLE_TEST.equals(party.getRolename())) { throw new BusinessException("无权限"); } if (!C2cOrderLock.add(order_no)) { throw new BusinessException(1, "请稍后再试"); } lock = true; if (!this.partyService.checkSafeword(safe_password, partyId)) { throw new BusinessException("资金密码错误"); } if (!party.getEnabled()) { resultObject.setCode("506"); resultObject.setMsg("用户已锁定"); return resultObject; } C2cOrder order = this.c2cOrderService.get(order_no); if (null == order || !order.getPartyId().equals(this.getLoginPartyId())) { 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); // PassDelayThread lockDelayThread = new PassDelayThread(order, this.c2cOrderService); // Thread t = new Thread(lockDelayThread); // t.start(); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } finally { if (lock) { ThreadUtils.sleep(100); C2cOrderLock.remove(order_no); } } return resultObject; } /** * 获取 用户订单 列表 */ @RequestMapping(action + "list.action") public Object list(HttpServletRequest request) { String page_no = request.getParameter("page_no"); String direction = request.getParameter("direction"); String state = request.getParameter("state"); String startTime = request.getParameter("startTime"); String endTime = request.getParameter("endTime"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } try { String partyId = this.getLoginPartyId(); if (null == partyId) { throw new BusinessException("请重新登录"); } if (StringUtils.isNullOrEmpty(page_no)) { page_no = "1"; } if (!StringUtils.isInteger(page_no)) { throw new BusinessException("页码不是整数"); } if (Integer.valueOf(page_no).intValue() <= 0) { throw new BusinessException("页码不能小于等于0"); } int page_no_int = Integer.valueOf(page_no).intValue(); if (StringUtils.isNotEmpty(direction) && !Arrays.asList("buy", "sell").contains(direction)) { throw new BusinessException("买卖方式不正确"); } if (StringUtils.isNotEmpty(state) && !Arrays.asList("0", "1", "2", "3", "4", "5").contains(state)) { throw new BusinessException("订单状态不正确"); } Page page = this.c2cOrderService.pagedQuery(page_no_int, 20, direction, state, partyId, false,startTime,endTime); if (null == page) { resultObject.setData(new ArrayList>()); } else { for (Map map : (List>) page.getElements()) { if (null == map.get("c2c_user_head_img")) { map.put("c2c_user_head_img", ""); } else { String headImg = map.get("c2c_user_head_img").toString(); map.put("c2c_user_head_img", Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + headImg); } } List nos = new ArrayList(); for (Map map : (List>) page.getElements()) { nos.add(map.get("order_no").toString()); } Map unreadMsgs = this.otcOnlineChatMessageService.unreadMsgsApi(nos); for (Map map : (List>) page.getElements()) { String orderNo = map.get("order_no").toString(); if (unreadMsgs.containsKey(orderNo)) { map.put("unread_msg", unreadMsgs.get(orderNo)); } } resultObject.setData((List>) page.getElements()); } } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } return resultObject; } /** * 获取 订单 详情 */ @RequestMapping(action + "get.action") public Object get(HttpServletRequest request) { String order_no = request.getParameter("order_no"); String language = request.getParameter("language"); ResultObject resultObject = new ResultObject(); resultObject = this.readSecurityContextFromSession(resultObject); if (!"0".equals(resultObject.getCode())) { return resultObject; } try { C2cOrder c2cOrder = this.c2cOrderService.get(order_no); if (null == c2cOrder) { throw new BusinessException("订单不存在"); } List nos = new ArrayList(); nos.add(c2cOrder.getOrderNo()); Map unreadMsgs = this.otcOnlineChatMessageService.unreadMsgsApi(nos); Integer unreadMsg = unreadMsgs.get(c2cOrder.getOrderNo()); if (null == unreadMsg) { c2cOrder.setUnreadMsg(0); } else { c2cOrder.setUnreadMsg(unreadMsg.intValue()); } if (StringUtils.isNotEmpty(c2cOrder.getC2cUserHeadImg())) { String path = Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + c2cOrder.getC2cUserHeadImg(); c2cOrder.setC2cUserHeadImg(path); } if (StringUtils.isNotEmpty(c2cOrder.getMethodImg())) { String path = Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + c2cOrder.getMethodImg(); c2cOrder.setMethodImg(path); } // 多语言 c2cOrder = this.c2cTranslateService.translateOrder(c2cOrder, language); long nowTimestamp = (new Date()).getTime(); long createTimestamp = c2cOrder.getCreateTime().getTime(); long autoCancelSeconds = 0; long remainSeconds = 0; if ("0".equals(c2cOrder.getState())) { autoCancelSeconds = c2cOrder.getExpireTime() * 60 * 1000 - (nowTimestamp - createTimestamp); remainSeconds = c2cOrder.getExpireTime() * 60 * 1000 * 2 - (nowTimestamp - createTimestamp); } else if ("1".equals(c2cOrder.getState())) { long payTimestamp = c2cOrder.getPayTime().getTime(); autoCancelSeconds = c2cOrder.getExpireTime() * 60 * 1000 - (nowTimestamp - createTimestamp); remainSeconds = c2cOrder.getExpireTime() * 60 * 1000 - (nowTimestamp - payTimestamp); } c2cOrder.setAutoCancelTimeRemain((int) (autoCancelSeconds <= 0 ? 0 : autoCancelSeconds / 1000)); c2cOrder.setExpireTimeRemain((int) (remainSeconds <= 0 ? 0 : remainSeconds / 1000)); resultObject.setData(c2cOrder); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Throwable t) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", t); } return resultObject; } private String verifOpen(String direction, String currency, String symbol, String order_type) { if (StringUtils.isEmptyString(direction) || !Arrays.asList("buy", "sell").contains(direction)) { return "买卖方式不正确"; } Map currencyMap = this.c2cAdvertService.getCurrencyMap(); Map symbolMap = this.c2cAdvertService.getSymbolMap(); if (null == currencyMap || !currencyMap.containsKey(currency)) { return "支付币种不正确"; } if (null == symbolMap || !symbolMap.containsKey(symbol)) { return "上架币种不正确"; } if (StringUtils.isEmptyString(order_type) || !Arrays.asList("by_amount", "by_num").contains(order_type)) { throw new BusinessException("订单类型不正确"); } return null; } // public class PassDelayThread implements Runnable { // // private C2cOrderService c2cOrderService; // private C2cOrder order; // // public void run() { // // try { // // while (true) { // if (C2cOrderLock.add(order.getOrderNo())) { // this.c2cOrderService.saveOrderPass(order); // // 处理完退出 // break; // } // ThreadUtils.sleep(200); // } // // } catch (Throwable t) { // logger.error("error:", t); // } finally { // C2cOrderLock.remove(order.getOrderNo()); // } // // } // // public PassDelayThread(C2cOrder order, C2cOrderService c2cOrderService) { // this.order = order; // this.c2cOrderService = c2cOrderService; // } // // } }