From fa677dec1c55db004a31beefb1e346e18c7858c2 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期四, 20 二月 2025 18:41:29 +0800 Subject: [PATCH] bug修改 --- src/main/java/com/taoke/autopay/service/impl/KeyOrderServiceImpl.java | 233 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 170 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/taoke/autopay/service/impl/KeyOrderServiceImpl.java b/src/main/java/com/taoke/autopay/service/impl/KeyOrderServiceImpl.java index 0cea788..acf1c45 100644 --- a/src/main/java/com/taoke/autopay/service/impl/KeyOrderServiceImpl.java +++ b/src/main/java/com/taoke/autopay/service/impl/KeyOrderServiceImpl.java @@ -1,23 +1,24 @@ package com.taoke.autopay.service.impl; +import com.google.gson.Gson; import com.taoke.autopay.dao.KeyOrderMapper; import com.taoke.autopay.dao.WxUserSettingsMapper; import com.taoke.autopay.dto.ChannelOrderStatistic; import com.taoke.autopay.dto.DYOrderDto; import com.taoke.autopay.entity.*; import com.taoke.autopay.entity.agent.ChannelAgent; +import com.taoke.autopay.entity.agent.ChannelAgentSettings; import com.taoke.autopay.exception.KeyOrderException; import com.taoke.autopay.exception.KeyVerifyException; import com.taoke.autopay.exception.WxOrderCountException; import com.taoke.autopay.factory.OrderFactory; -import com.taoke.autopay.service.KeyOrderService; -import com.taoke.autopay.service.SystemConfigService; -import com.taoke.autopay.service.WxUserOrderCountService; -import com.taoke.autopay.service.WxUserSettingService; +import com.taoke.autopay.service.*; import com.taoke.autopay.service.agent.ChannelAgentService; +import com.taoke.autopay.service.agent.ChannelAgentSettingService; import com.taoke.autopay.service.agent.ChannelAgentSharingRatioService; import com.taoke.autopay.utils.*; import com.taoke.autopay.utils.order.DYOrderApi; +import com.taoke.autopay.utils.order.OrderChannelUtil; import com.taoke.autopay.vo.SubmitKeyInfo; import net.sf.json.JSONArray; import org.springframework.stereotype.Service; @@ -57,6 +58,18 @@ @Resource private ChannelAgentSharingRatioService channelAgentSharingRatioService; + @Resource + private ChannelAgentSettingService channelAgentSettingService; + + @Resource + private ClientInfoService clientInfoService; + + @Resource + private PayMoneySettingService payMoneySettingService; + + @Resource + private WxUserService wxUserService; + @Override public KeyOrder selectById(String id) { @@ -65,11 +78,19 @@ @Transactional(rollbackFor = Exception.class) @Override - public KeyOrder addKeyOrder(SubmitKeyInfo keyInfo, Long uid, String day) throws KeyOrderException, WxOrderCountException { + public KeyOrder selectByIdForUpdate(String id) { + return keyOrderMapper.selectByPrimaryKeyForUpdate(id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public KeyOrder addKeyOrder(SubmitKeyInfo keyInfo, Long uid, String day, Integer orderType, DYOrderDto orderDto) throws KeyOrderException, WxOrderCountException { // 鍒ゆ柇鎻愪氦娆℃暟鏄惁杩囬噺 if (uid != null) { WxUserSettings settings = wxUserSettingService.getUserSettings(uid); - wxUserOrderCountService.addOrderCount(uid, OrderCountTypeEnum.SUBMIT_TOKEN_COUNT, day, 1, settings.getTotalOrderCountPerDay()); + OrderCountTypeEnum countType = OrderCountTypeEnum.SUBMIT_TOKEN_COUNT; + wxUserOrderCountService.addOrderCount(uid, countType,null, day, 1, settings.getTotalOrderCountPerDay()); + wxUserService.setLatestInfoInfo(uid, keyInfo.getIp(),keyInfo.getIpInfo()); } String id = OrderFactory.createId(keyInfo.getKey()); KeyOrder order = keyOrderMapper.selectById(id); @@ -90,6 +111,17 @@ if (agent.getStatus() != ChannelAgent.STATUS_NOMAL) { throw new KeyOrderException("娓犻亾鍙楅檺"); } + // 楠岃瘉娓犻亾鏃堕棿 + ChannelAgentSettings settings = channelAgentSettingService.selectByAgentId(agent.getId()); + if(settings!=null&&!StringUtil.isNullOrEmpty(settings.getStartSubmitTime())&&!StringUtil.isNullOrEmpty(settings.getEndSubmitTime())){ + String now = TimeUtil.getGernalTime(System.currentTimeMillis(), "HHmmss"); + String startTime = settings.getStartSubmitTime().replace(":",""); + String endTime = settings.getEndSubmitTime().replace(":",""); + if (Integer.parseInt(now) < Integer.parseInt(startTime) || Integer.parseInt(now) > Integer.parseInt(endTime)) { + throw new KeyOrderException(String.format("鍙d护鎻愪氦鏃堕棿娈典负锛�%s-%s",settings.getStartSubmitTime(), settings.getEndSubmitTime())); + } + } + order.setAgentId(agent.getId()); } } @@ -104,9 +136,18 @@ order.setState(KeyOrder.STATE_NOT_PROCESS); order.setStateDesc("灏氭湭澶勭悊"); order.setCreateTime(new Date()); + if(orderType!=Constant.ORDER_TYPE_UNKNOWN){ + order.setOrderType(orderType); + } + if (orderDto != null) { + order.setOrderNo(orderDto.getOrder_id()); + } + + order.setIp(keyInfo.getIp()); + if(keyInfo.getIpInfo()!=null) { + order.setIpInfo(new Gson().toJson(keyInfo.getIpInfo())); + } keyOrderMapper.insertSelective(order); - - return order; } @@ -128,7 +169,7 @@ @Transactional(rollbackFor = Exception.class) @Override - public void paySuccess(String id, String stateDesc, String day) throws WxOrderCountException { + public void paySuccess(String id, String stateDesc, String day,String payMerchant) throws WxOrderCountException { KeyOrder old = keyOrderMapper.selectByPrimaryKeyForUpdate(id); if (old == null) { return; @@ -137,12 +178,14 @@ return; } if (old.getUid() != null) { - wxUserOrderCountService.addOrderCount(old.getUid(), OrderCountTypeEnum.DY_ORDER_PAY, day, 1, null); + Integer orderType = old.getOrderType(); + wxUserOrderCountService.addOrderCount(old.getUid(), (orderType==null||orderType==Constant.ORDER_TYPE_DY)? OrderCountTypeEnum.DY_ORDER_PAY:OrderCountTypeEnum.KS_ORDER_PAY, OrderChannelUtil.getChannelByKey( old.getOrderChannel()), day, 1, null); } KeyOrder orderUpdate = new KeyOrder(); orderUpdate.setId(id); orderUpdate.setState(KeyOrder.STATE_PAY); orderUpdate.setStateDesc(stateDesc); + orderUpdate.setPayMerchant(payMerchant); if (old.getPayTime() == null) { orderUpdate.setPayTime(new Date()); } @@ -193,6 +236,7 @@ Map<OrderChannelEnum, BigDecimal> shareMoneyMap = channelAgentSharingRatioService.getShareMoneyMap(query.agentId); List<ChannelOrderStatistic> channelOrderStatisticList = keyOrderMapper.statisticChannelOrders(query); BigDecimal totalMoney = new BigDecimal(0); + long totalOrderCount = 0; for (ChannelOrderStatistic s : channelOrderStatisticList) { for (OrderChannelEnum channel : OrderChannelEnum.values()) { @@ -204,67 +248,101 @@ break; } } + totalOrderCount += s.getCount(); } long userCount = keyOrderMapper.countUser(query); ChannelOrderStatistic statistic = new ChannelOrderStatistic(); - statistic.setCount(userCount); + statistic.setUserCount(userCount); statistic.setMoney(totalMoney); + statistic.setCount(totalOrderCount); return statistic; } @Override public List<ChannelOrderStatistic> statisticChannelOrders(Long agentId, Date startTime, Date endTime) { - KeyOrderMapper.DaoQuery daoQuery=new KeyOrderMapper.DaoQuery(); - daoQuery.oMinCreateTime=startTime; - daoQuery.oMaxCreateTime=endTime; + KeyOrderMapper.DaoQuery daoQuery = new KeyOrderMapper.DaoQuery(); + daoQuery.minCreateTime = startTime; + daoQuery.maxCreateTime = endTime; daoQuery.agentId = agentId; - daoQuery.state =KeyOrder.STATE_PAY; - daoQuery.hasPayTime=true; + daoQuery.state = KeyOrder.STATE_PAY; + daoQuery.hasPayTime = true; + // 灏嗘暟鎹媺鍑烘潵 + long count = keyOrderMapper.count(daoQuery); + daoQuery.count = (int)count; + List<KeyOrder> orderList = keyOrderMapper.list(daoQuery); + Map<String,Set<Long>> uidsMap = new HashMap<>(); + Map<String,Integer> countMap = new HashMap<>(); + Map<String,BigDecimal> moneyMap = new HashMap<>(); - return keyOrderMapper.statisticChannelOrders(daoQuery); + Set<String> orderIds=new HashSet<>(); + for(KeyOrder order:orderList){ + String orderId=order.getOrderType()+"#"+ order.getOrderNo(); + if(!StringUtil.isNullOrEmpty(order.getOrderNo())){ + if(orderIds.contains(orderId)){ + continue; + } + orderIds.add(orderId); + } + String orderChannel = order.getOrderChannel(); + + if(!uidsMap.containsKey(orderChannel)){ + uidsMap.put(orderChannel, new HashSet<>()); + } + uidsMap.get(orderChannel).add(order.getUid()); + + if(!countMap.containsKey(orderChannel)){ + countMap.put(orderChannel,0); + } + countMap.put(orderChannel, countMap.get(orderChannel)+1); + + + if(!moneyMap.containsKey(orderChannel)){ + moneyMap.put(orderChannel, new BigDecimal(0)); + } + moneyMap.put(orderChannel, moneyMap.get(orderChannel).add(order.getOrderMoney())); + } + + List<ChannelOrderStatistic> results=new ArrayList<>(); + for(String orderChannel: moneyMap.keySet()){ + ChannelOrderStatistic statistic=new ChannelOrderStatistic(); + statistic.setCount(countMap.get(orderChannel)); + statistic.setMoney(moneyMap.get(orderChannel)); + statistic.setUserCount(uidsMap.get(orderChannel).size()); + statistic.setOrderChannel(orderChannel); + results.add(statistic); + } + return results; } @Override - public Long getCanDistributeUid() { + public Long getCanDistributeUid(int maxQueueSize) { // 鏈�杩�1灏忔椂鏈夋椿璺�,涓斾笉绠�12浠ヤ笂鏈墽琛岀殑鏁版嵁 - List<OrderDistributeCountInfo> list = keyOrderMapper.listDistributeUids(new Date(System.currentTimeMillis() - 1000 * 60 * 60L), new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 12L)); + List<OrderDistributeCountInfo> list = keyOrderMapper.listDistributeUids(new Date(System.currentTimeMillis() - 1000 * 60 * 31L), new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 12L)); if (list == null || list.size() == 0) { return null; } + // 鎺掗櫎閲嶆柊鍒嗛厤鐨勮澶� + List<Long> excludeIds = clientInfoService.getRePayClientIds(); + for (int i = 0; i < list.size(); i++) { + if (excludeIds.contains(list.get(i).getUid())) { + list.remove(i); + i--; + } + } + List<OrderDistributeCountInfo> filterList = new ArrayList<>(); // count灏忎簬2鐩存帴瑙嗕负0 for (OrderDistributeCountInfo info : list) { - if (info.getCount() < 2) { - info.setCount(0); + if (info.getCount() >= maxQueueSize) { + continue; } + filterList.add(info); + } + if (filterList.size() <= 0) { + return null; } - Comparator<OrderDistributeCountInfo> cm = new Comparator<OrderDistributeCountInfo>() { - @Override - public int compare(OrderDistributeCountInfo o1, OrderDistributeCountInfo o2) { - return o1.getCount() - o2.getCount(); - } - }; - list.sort(cm); - if (list.get(0).getCount() == 0) { - // 澶勭悊澶у鏁拌澶囬兘娌℃湁鍒嗛厤鐨勬儏鍐� - // 灏嗕负0鐨勬暟鎹殢鏈哄垎閰� - List<OrderDistributeCountInfo> tempList = new ArrayList<>(); - for (OrderDistributeCountInfo info : list) { - if (info.getCount() == 0) { - tempList.add(info); - } - } - int index = new Random().nextInt(tempList.size()); - if (index < 0) { - index = 0; - } - if (index >= tempList.size()) { - index = tempList.size() - 1; - } - return tempList.get(index).getUid(); - } - return list.get(0).getUid(); + return ClientDistributeUtil.computeDistributeClient(filterList); } @Override @@ -278,13 +356,24 @@ } @Override - public DYOrderDto verifyKey(String orderNoDesc, String orderStatus, String money) throws KeyVerifyException { - int orderType = Constant.ORDER_TYPE_UNKNOWN; - if (orderNoDesc.contains("鎶栭煶")) { - orderType = Constant.ORDER_TYPE_DY; - } else if (orderNoDesc.contains("蹇墜")) { - orderType = Constant.ORDER_TYPE_KS; + public DYOrderDto verifyKey(String orderNoDesc, String orderStatus, String money, Long uid, String keyId) throws KeyVerifyException { + int orderType = AlipayOrderUtil.getOrderType(orderNoDesc); + if (uid != null) { + WxUserSettings settings = wxUserSettingService.getUserSettings(uid); + OrderCountTypeEnum orderCountType = OrderCountTypeEnum.SUBMIT_TOKEN_COUNT; + int maxCount = settings.getTotalOrderCountPerDay(); + switch (orderType) { + case Constant.ORDER_TYPE_DY: + orderCountType = OrderCountTypeEnum.DY_ORDER_PAY; + maxCount = settings.getDyOrderCountPerDay(); + break; + case Constant.ORDER_TYPE_KS: + orderCountType = OrderCountTypeEnum.KS_ORDER_PAY; + maxCount = settings.getKsOrderCountPerDay(); + break; + } } + String orderNo = ""; // 鍖归厤杩炵画鐨勬暟瀛� @@ -311,10 +400,17 @@ try { if (orderType == Constant.ORDER_TYPE_DY && !StringUtil.isNullOrEmpty(orderNo)) { dyOrderDto = DYOrderApi.getOrderDetail(orderNo); - if (dyOrderDto != null) { + if (dyOrderDto != null && false) { // 楠岃瘉閲戦 if (dyOrderDto.getPay_amount().intValue() != new BigDecimal(money).multiply(new BigDecimal(100)).setScale(0).intValue()) { throw new KeyVerifyException(KeyVerifyException.CODE_ORDER_MONEY_NOT_MATCH, String.format("鏀粯閲戦涓庤鍗曢噾棰濅笉涓�鑷达細%s-%d", money, dyOrderDto.getPay_amount())); + } + // 楠岃瘉璁㈠崟鍙锋槸鍚﹀凡缁忓瓨鍦� + KeyOrderMapper.DaoQuery query = new KeyOrderMapper.DaoQuery(); + query.orderNo = orderNo; + query.orderType = orderType; + if (count(query) > 1) { + throw new KeyVerifyException(KeyVerifyException.CODE_ORDER_NO_REPEAT, "璁㈠崟鍙烽噸澶嶆彁浜�"); } } } else { @@ -323,15 +419,7 @@ } catch (KeyOrderException e) { // 鎶栭煶璁㈠崟鏈獙璇侀�氳繃锛屽尮閰嶉噾棰� // 楠岃瘉鎻愪氦鐨勯噾棰濇槸鍚︽纭� - String moneyStr = systemConfigService.getValueCache(SystemConfigKeyEnum.PAY_MONEY_LIST); - if (StringUtil.isNullOrEmpty(moneyStr)) { - throw new KeyVerifyException(KeyVerifyException.CODE_KEY_MONEY_NOT_MATCH, "灏氭湭閰嶇疆閲戦"); - } - JSONArray array = JSONArray.fromObject(moneyStr); - Set<String> moneySet = new HashSet<>(); - for (int i = 0; i < array.size(); i++) { - moneySet.add(MoneyUtil.getMoneyStr(new BigDecimal(array.optString(i)))); - } + Set<String> moneySet =payMoneySettingService.listAllMoneyAsStr(); // 鍖归厤閲戦 if (!moneySet.contains(money)) { throw new KeyVerifyException(KeyVerifyException.CODE_KEY_MONEY_NOT_MATCH, String.format("閲戦鏈湪绯荤粺璁剧疆涓細%s", money)); @@ -355,4 +443,23 @@ public long countAgentId(KeyOrderMapper.DaoQuery query) { return keyOrderMapper.countAgentId(query); } + + @Override + public long countUserNotDoOrder(Long uid, Date minCreateTime) { + KeyOrderMapper.DaoQuery daoQuery=new KeyOrderMapper.DaoQuery(); + daoQuery.uid = uid; + daoQuery.stateList=Arrays.asList(new Integer[]{KeyOrder.STATE_NOT_PROCESS,KeyOrder.STATE_NOT_PAY}); + daoQuery.minCreateTime = minCreateTime; + return keyOrderMapper.count(daoQuery); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void rejectPay(String id, String rejectMsg) { + KeyOrder keyOrder=new KeyOrder(); + keyOrder.setId(id); + keyOrder.setState(KeyOrder.STATE_REJECT_PAY); + keyOrder.setStateDesc(rejectMsg); + update(keyOrder); + } } -- Gitblit v1.8.0