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.beans.factory.annotation.Value; 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; @Configuration @EnableScheduling public class KeyOrderDistributeTask { @Value("${task-enable}") private boolean taskEnable; @Resource private KeyOrderService keyOrderService; @Scheduled(cron = "0/5 * * * * ? ") private void distribute() { if(!taskEnable){ return; } try { List results = keyOrderService.listNotDistributed(1, 20); if (results != null) { for (KeyOrder order : results) { if (order.getDistributeClientUid() != null) { continue; } Long uid = keyOrderService.getCanDistributeUid(Constant.MAX_PAY_ACCOUNT_QUEUE_SIZE); if (uid != null) { KeyOrder orderUpdate = new KeyOrder(); orderUpdate.setId(order.getId()); orderUpdate.setDistributeClientUid(uid); orderUpdate.setDistributeTime(new Date()); keyOrderService.update(orderUpdate); } } } } catch (Exception e) { } } /** * @return void * @author hxh * @description 修正已经处理的订单 * @date 17:53 2024/6/20 **/ @Scheduled(cron = "0/5 * * * * ? ") private void repaireProcessedOrders() { if(!taskEnable){ return; } // 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 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() { if(!taskEnable){ return; } for (int i = 0; i < 10; i++) { // 一次最多处理10条数据 orderPayFailProcessor.processFromQueue(); } } @Scheduled(cron = "0 0 3 * * ? ") private void clearProcessPayFailCache() { if(!taskEnable){ return; } orderPayFailProcessor.clearCacheData(); } @Resource private ClientInfoService clientInfoService; // 处理设备下线 @Scheduled(cron = "0 0/1 * * * ? ") private void processPayClientOffLine() { if(!taskEnable){ return; } 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 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()); } } }