| | |
| | | package com.taoke.autopay.task; |
| | | |
| | | import com.taoke.autopay.dao.KeyOrderMapper; |
| | | import com.taoke.autopay.dto.DYOrderDto; |
| | | import com.taoke.autopay.entity.ClientInfo; |
| | | import com.taoke.autopay.entity.KeyOrder; |
| | | import com.taoke.autopay.exception.KeyOrderException; |
| | | import com.taoke.autopay.manager.OrderPayFailProcessor; |
| | | import com.taoke.autopay.service.ClientInfoService; |
| | | import com.taoke.autopay.service.KeyOrderService; |
| | | import com.taoke.autopay.utils.Constant; |
| | | import com.taoke.autopay.utils.StringUtil; |
| | | import com.taoke.autopay.utils.order.DYOrderApi; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.scheduling.annotation.EnableScheduling; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | |
| | | private KeyOrderService keyOrderService; |
| | | |
| | | @Scheduled(cron = "0/5 * * * * ? ") |
| | | private void distribute(){ |
| | | private void distribute() { |
| | | try { |
| | | List<KeyOrder> results = keyOrderService.listNotDistributed(1, 20); |
| | | if (results != null) { |
| | | for (KeyOrder order : results) { |
| | | if (order.getDistributeClientUid() == null) { |
| | | if (order.getDistributeClientUid() != null) { |
| | | continue; |
| | | } |
| | | Long uid = keyOrderService.getCanDistributeUid(); |
| | | Long uid = keyOrderService.getCanDistributeUid(Constant.MAX_PAY_ACCOUNT_QUEUE_SIZE); |
| | | if (uid != null) { |
| | | KeyOrder orderUpdate = new KeyOrder(); |
| | | orderUpdate.setId(order.getId()); |
| | |
| | | } |
| | | } |
| | | } |
| | | }catch(Exception e){ |
| | | } catch (Exception e) { |
| | | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * @return void |
| | | * @author hxh |
| | | * @description 修正已经处理的订单 |
| | | * @date 17:53 2024/6/20 |
| | | **/ |
| | | @Scheduled(cron = "0/5 * * * * ? ") |
| | | private void repaireProcessedOrders() { |
| | | // TODO 待完成 |
| | | KeyOrderMapper.DaoQuery query = new KeyOrderMapper.DaoQuery(); |
| | | // 修正1分钟到1小时的数据之前执行的数据 |
| | | query.maxUpdateTime = new Date(System.currentTimeMillis() - 1000 * 60 * 1L); |
| | | query.minUpdateTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60L); |
| | | query.sortList = Arrays.asList(new String[]{"update_time asc"}); |
| | | query.stateList = Arrays.asList(new Integer[]{KeyOrder.STATE_NOT_PAY, KeyOrder.STATE_PAY}); |
| | | query.orderState = DYOrderDto.ORDER_STATUS_NOT_PAY; |
| | | query.start = 0; |
| | | query.count = 20; |
| | | List<KeyOrder> list = keyOrderService.list(query); |
| | | if (list != null && list.size() > 0) { |
| | | for (KeyOrder order : list) { |
| | | // 如果没有拿到订单就不做处理 |
| | | if (StringUtil.isNullOrEmpty(order.getOrderNo())) { |
| | | continue; |
| | | } |
| | | // 查询结果 |
| | | DYOrderDto dto = null; |
| | | try { |
| | | dto = DYOrderApi.getOrderDetail(order.getOrderNo()); |
| | | if (dto.getOrder_status() != DYOrderDto.ORDER_STATUS_NOT_PAY) { |
| | | // 订单不处于尚未付款状态 |
| | | KeyOrder orderUpdate = new KeyOrder(); |
| | | orderUpdate.setId(order.getId()); |
| | | orderUpdate.setOrderState(dto.getOrder_status()); |
| | | orderUpdate.setState(KeyOrder.STATE_PAY); |
| | | orderUpdate.setStateDesc(dto.getOrder_status_desc()); |
| | | keyOrderService.update(orderUpdate); |
| | | } else { |
| | | KeyOrder update = new KeyOrder(); |
| | | update.setId(order.getId()); |
| | | update.setState(KeyOrder.STATE_NOT_PROCESS); |
| | | update.setStateDesc("重置未分配"); |
| | | update.setOrderState(dto.getOrder_status()); |
| | | keyOrderService.update(update); |
| | | } |
| | | } catch (KeyOrderException e) { |
| | | e.printStackTrace(); |
| | | KeyOrder orderUpdate = new KeyOrder(); |
| | | orderUpdate.setId(order.getId()); |
| | | orderUpdate.setState(KeyOrder.STATE_PAY); |
| | | orderUpdate.setStateDesc(e.getMessage()); |
| | | keyOrderService.update(orderUpdate); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | @Resource |
| | | private OrderPayFailProcessor orderPayFailProcessor; |
| | | |
| | | @Scheduled(cron = "0/5 * * * * ? ") |
| | | private void processPayFail() { |
| | | for (int i = 0; i < 10; i++) { |
| | | // 一次最多处理10条数据 |
| | | orderPayFailProcessor.processFromQueue(); |
| | | } |
| | | } |
| | | |
| | | @Scheduled(cron = "0 0 3 * * ? ") |
| | | private void clearProcessPayFailCache() { |
| | | orderPayFailProcessor.clearCacheData(); |
| | | } |
| | | |
| | | @Resource |
| | | private ClientInfoService clientInfoService; |
| | | |
| | | // 处理设备下线 |
| | | @Scheduled(cron = "0 0/1 * * * ? ") |
| | | private void processPayClientOffLine() { |
| | | KeyOrderMapper.DaoQuery daoQuery = new KeyOrderMapper.DaoQuery(); |
| | | // 分配时间在最近5分钟到最近30分钟的,状态为未处理的需要重新分配 |
| | | daoQuery.stateList = Arrays.asList(new Integer[]{KeyOrder.STATE_NOT_PAY, KeyOrder.STATE_NOT_PROCESS}); |
| | | daoQuery.minDistributeTime = new Date(System.currentTimeMillis() - 1000 * 60 * 30L); |
| | | daoQuery.maxDistributeTime = new Date(System.currentTimeMillis() - 1000 * 60 * 5L); |
| | | daoQuery.sortList = Arrays.asList(new String[]{"create_time desc"}); |
| | | daoQuery.count = 10; |
| | | List<KeyOrder> orderList = keyOrderService.list(daoQuery); |
| | | for (KeyOrder order : orderList) { |
| | | // 查询设备活跃时间是否已经有5分钟未活跃 |
| | | if (order.getDistributeClientUid() == null) { |
| | | continue; |
| | | } |
| | | |
| | | ClientInfo clientInfo = clientInfoService.selectByPrimaryKey(order.getDistributeClientUid()); |
| | | if (clientInfo.getActiveTime()==null||System.currentTimeMillis() - clientInfo.getActiveTime().getTime() < 1000 * 60 * 5L) { |
| | | continue; |
| | | } |
| | | // 重新分配 |
| | | keyOrderService.removeDistributedClient(order.getId()); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |