From 24530b023d49fbc635741817696882993fa18c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 13 Aug 2024 14:35:51 +0800 Subject: [PATCH] 'commit' --- .../ManualOrderStatusHandlerController.java | 50 ++++-- .../charge/task/service/AsyncTaskService.java | 151 ++++++++++++------ .../task/service/HandleOrderTarckService.java | 12 +- ...$特收到的需求、分析与现状.docx | Bin 0 -> 162 bytes ...特收到的需求、分析与现状.docx | Bin 565831 -> 560167 bytes 5 files changed, 146 insertions(+), 67 deletions(-) create mode 100644 业务梳理/~$特收到的需求、分析与现状.docx diff --git a/Ylt/ms-task/src/main/java/com/charge/task/controller/ManualOrderStatusHandlerController.java b/Ylt/ms-task/src/main/java/com/charge/task/controller/ManualOrderStatusHandlerController.java index ac6a3b0..da1cf4f 100644 --- a/Ylt/ms-task/src/main/java/com/charge/task/controller/ManualOrderStatusHandlerController.java +++ b/Ylt/ms-task/src/main/java/com/charge/task/controller/ManualOrderStatusHandlerController.java @@ -22,6 +22,7 @@ import java.util.stream.Stream; /** * 手动处理异常订单状态 + * * @author hzh * @date 2023/6/6 */ @@ -41,50 +42,73 @@ public class ManualOrderStatusHandlerController { @ApiOperation("批量处理挂起正向订单,进行补单") @PostMapping("/completeUnReportOrder") - public ResultVO completeUnReportOrder(String startDate,String endDate){ + public ResultVO completeUnReportOrder(String startDate, String endDate) { Date startTime = ToolDateTime.startDateByDay(new Date(), -60); Date endTime = ToolDateTime.startDateByDay(new Date(), 0); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { - if (StringUtils.isNotEmpty(startDate)){ + if (StringUtils.isNotEmpty(startDate)) { startTime = format.parse(startDate); } - if (StringUtils.isNotEmpty(endDate)){ + if (StringUtils.isNotEmpty(endDate)) { endTime = format.parse(endDate); } } catch (ParseException e) { - return ResultVO.custom("时间格式错误",500); + return ResultVO.custom("时间格式错误", 500); } //查询挂起订单 - List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startTime, endTime); - Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i->{ + List hangUpOrderList = equipmentChargeOrderDOMapper.queryHangUpOrder(startTime, endTime); + Stream.iterate(0, i -> i + 1).limit(hangUpOrderList.size()).forEach(i -> { asyncTaskService.completeUnReportOrder(hangUpOrderList.get(i)); }); return ResultVO.success(); } + //【2024-08-13 Modify by HuangHai】 @ApiOperation("批量处理挂起反向订单,进行补单") @PostMapping("/completeUnReportReverseOrder") - public ResultVO completeUnReportReverseOrder(){ - handleOrderTarckService.completeUnReportReverseOrder(); + public ResultVO completeUnReportReverseOrder(String startDate, String endDate) { + Date startTime = ToolDateTime.startDateByDay(new Date(), -60); + Date endTime = ToolDateTime.startDateByDay(new Date(), 0); + DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + if (StringUtils.isNotEmpty(startDate)) { + startTime = format.parse(startDate); + } + if (StringUtils.isNotEmpty(endDate)) { + endTime = format.parse(endDate); + } + } catch (ParseException e) { + return ResultVO.custom("时间格式错误", 500); + } + handleOrderTarckService.completeUnReportReverseOrder(startTime,endTime); return ResultVO.success(); } +// @ApiOperation("批量处理挂起反向订单,进行补单") +// @PostMapping("/completeUnReportReverseOrder") +// public ResultVO completeUnReportReverseOrder(){ +// handleOrderTarckService.completeUnReportReverseOrder(); +// return ResultVO.success(); +// } + @ApiOperation("启明:批量处理结算中正向订单,进行结算、扣费") @PostMapping("/handleInSettlementOrder") - public ResultVO handleInSettlementOrder(String time){ + public ResultVO handleInSettlementOrder(String time) { Date endTime = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { - if (StringUtils.isNotEmpty(time)){ + if (StringUtils.isNotEmpty(time)) { endTime = format.parse(time); } } catch (ParseException e) { - return ResultVO.custom("时间格式错误",500); + return ResultVO.custom("时间格式错误", 500); } - List inSettlementOrderList = equipmentChargeOrderDOMapper.queryInSettlementOrder(endTime); - inSettlementOrderList.forEach(p->{asyncTaskService.handleInSettlementOrder(p.getPlatformOrderNo(),p.getPayStatus().intValue());}); + List inSettlementOrderList = equipmentChargeOrderDOMapper.queryInSettlementOrder(endTime); + inSettlementOrderList.forEach(p -> { + asyncTaskService.handleInSettlementOrder(p.getPlatformOrderNo(), p.getPayStatus().intValue()); + }); return ResultVO.success(); } diff --git a/Ylt/ms-task/src/main/java/com/charge/task/service/AsyncTaskService.java b/Ylt/ms-task/src/main/java/com/charge/task/service/AsyncTaskService.java index b00912c..9582d1d 100644 --- a/Ylt/ms-task/src/main/java/com/charge/task/service/AsyncTaskService.java +++ b/Ylt/ms-task/src/main/java/com/charge/task/service/AsyncTaskService.java @@ -103,56 +103,70 @@ public class AsyncTaskService { .setWorkQueue(new LinkedBlockingQueue<>(100)) .build(); -// @Async(value = "asyncTaskExecutor") - public void completeUnReportOrderOld(EquipmentChargeOrderDO hangUpOrderList) { - try { - EquipmentOrder equipmentOrder = equipmentOrderDao.findOne(hangUpOrderList.getOrderNo());//查询订单下发结束命令前的最新一笔订单信息 - if (equipmentOrder == null) { - log.info("completeUnReportOrder补单,订单号:{},mongo未查询到信息", hangUpOrderList.getOrderNo()); - equipmentChargeOrderDOMapper.setPatchStateByOrderNo(hangUpOrderList.getOrderNo()); - return; - } - if (!"0".equals(hangUpOrderList.getPayStatus().toString())) { - log.info("completeUnReportOrder补单,订单号:{},已经支付", hangUpOrderList.getOrderNo()); - return; - } - log.info("订单号{},补单开始", hangUpOrderList.getOrderNo()); - EquipmentChargeOrderDO lastOrderInfo = beforeStopLastOrderInfo(equipmentOrder, hangUpOrderList); - addSettle(lastOrderInfo, equipmentOrder, equipmentOrder.getEquipmentSn()); //补单 - log.info("订单号{},补单结束", hangUpOrderList.getOrderNo()); - } catch (Exception e) { - log.error("订单号" + hangUpOrderList.getOrderNo() + ",补单异常,异常信息:", e); - } - } - + /** + * 功能:处理正向补单 + * + * @param hangUpOrderList + */ @Async(value = "asyncTaskExecutor") public void completeUnReportOrder(EquipmentChargeOrderDO hangUpOrderList) { + //EquipmentChargeOrderDO :订单表 t_equipment_charge_order + // hangUpOrderList :似乎是挂起的订单列表,为什么是列表呢?不是一条记录,一个订单吗? try { + //通过t_equipment_charge_order表中,查找order_no=2020092315154430479 + //在后到MongoDb中去查找订单信息 EquipmentOrder equipmentOrder = equipmentOrderDao.findOne(hangUpOrderList.getOrderNo());//查询订单下发结束命令前的最新一笔订单信息 if (equipmentOrder == null) { log.info("completeUnReportOrder补单失败,订单号:{},mongo未查询到信息", hangUpOrderList.getOrderNo()); + //把mongo无记录的订单的状态置为需要手动补单的订单 + //mysql数据表t_equipment_charge_order修改 + /** + -- 订单状态 0 创建中 1准备充电中 2 充电中 3完成 4 取消 5挂起 6需要手动补单 7结算中 + UPDATE t_equipment_charge_order SET state = 6 WHERE order_no = #{orderNo} + */ equipmentChargeOrderDOMapper.setPatchStateByOrderNo(hangUpOrderList.getOrderNo()); return; } + /** + 挂起的订单处于已支付状态,无需再处理 + t_equipment_charge_order + pay_status 支付状态 0未支付 1待支付 2已支付 3支付失败 + */ if ("2".equals(hangUpOrderList.getPayStatus().toString())) { log.info("completeUnReportOrder补单失败,订单号:{},已经支付", hangUpOrderList.getOrderNo()); + //记录日志 : t_equipment_charge_order_track + //order_no:订单号 + //user_id:用户ID + //connector_sn:枪号 + //state:状态 0创建中 1启动中 2充电中 3充电完成 4充电异常 5订单挂起 7结算中 101扫码启动(设备认证) 102用户启动充电 103用户主动停止 + //succ_stat 操作结果 0 成功 1失败 addOrderTrack(hangUpOrderList.getOrderNo(), hangUpOrderList.getUserId(), hangUpOrderList.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,订单已经支付,无法进行二次结算"); return; } - - //查询流水,若是已有流水,则不进行二次结算 + // t_equipment_charge_order + // select count(*) from t_account_water where order_id = #{orderNo} and type = 1 + // type=1 类型 0充值 1充电扣款 2充值赠送 3后台充值 4退款 5后台转出 6后台转入 7账户清零 8用户申请退款 9退款驳回 + // 查询流水,若是已有流水,则不进行二次结算 Integer count = equipmentChargeOrderDOMapper.getWaterCountByOrderNo(hangUpOrderList.getOrderNo()); - if(count > 0) { + if (count > 0) { log.info("completeUnReportOrder补单失败,订单号:{},订单已有流水,无法进行二次结算", hangUpOrderList.getOrderNo()); + //记录日志 addOrderTrack(hangUpOrderList.getOrderNo(), hangUpOrderList.getUserId(), hangUpOrderList.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,订单已有流水,无法进行二次结算"); - return ; + return; } log.info("订单号{},补单开始", hangUpOrderList.getOrderNo()); + + //补全停止前最新一次的订单信息 + //equipmentOrder : 来自MongoDb + //hangUpOrderList: 来自Mysql中需要补单的订单 EquipmentChargeOrderDO lastOrderInfo = beforeStopLastOrderInfo(equipmentOrder, hangUpOrderList); + //执行新版本的补单操作 addSettleV2(lastOrderInfo, equipmentOrder, equipmentOrder.getEquipmentSn()); //补单 + log.info("订单号{},补单结束", hangUpOrderList.getOrderNo()); } catch (Exception e) { + //记录日志 addOrderTrack(hangUpOrderList.getOrderNo(), hangUpOrderList.getUserId(), hangUpOrderList.getConnectorId().toString(), (byte) 3, (byte) 0, "补单失败,补单异常,异常信息"); log.error("订单号" + hangUpOrderList.getOrderNo() + ",补单异常,异常信息:", e); } @@ -165,14 +179,14 @@ public class AsyncTaskService { try { //从mongo上获取最后一次推送的账单数据 NotificationChargeOrderInfoReqMongoDO notificationChargeOrderInfoReqMongoDO = notificationChargeOrderInfoReqDao.findOne(orderDO.getOrderNo()); - if(notificationChargeOrderInfoReqMongoDO != null) { + if (notificationChargeOrderInfoReqMongoDO != null) { completeWithPushedOrder(orderDO, notificationChargeOrderInfoReqMongoDO); return; } //若是没有,则从mongo中获取最后一次充电中推送的数据 进行结算 ReverseOrderInfo reverseOrderInfo = reverseOrderInfoDao.findOne(orderDO.getOrderNo()); - if(reverseOrderInfo != null) { + if (reverseOrderInfo != null) { completeWithLastPushedOrder(orderDO, reverseOrderInfo); } @@ -182,13 +196,16 @@ public class AsyncTaskService { } } + @Async(value = "asyncTaskExecutor") - public void handleInSettlementOrder(String startChargeSeq,Integer payStatus){ - openApiServiceApi.handleInSettlementOrder(startChargeSeq,payStatus); + public void handleInSettlementOrder(String startChargeSeq, Integer payStatus) { + openApiServiceApi.handleInSettlementOrder(startChargeSeq, payStatus); } + /** * 根据最后一次充电中的订单数据进行结算 - * @param orderDO 订单信息 + * + * @param orderDO 订单信息 * @param reverseOrderInfo 推送的最后一次充电中的数据 */ private void completeWithLastPushedOrder(EquipmentChargeOrderDO orderDO, ReverseOrderInfo reverseOrderInfo) { @@ -220,7 +237,8 @@ public class AsyncTaskService { /** * 根据最新推送的账单数据进行结算 - * @param orderDO 订单信息 + * + * @param orderDO 订单信息 * @param pushedOrderDO 推送的账单信息 */ private void completeWithPushedOrder(EquipmentChargeOrderDO orderDO, NotificationChargeOrderInfoReqMongoDO pushedOrderDO) { @@ -285,7 +303,7 @@ public class AsyncTaskService { joinActivityRebate(orderDTO.getUserId().toString(), orderDO.getOrderNo(), "0", "0", "", "1"); //推送碳大脑 - if (flag){ + if (flag) { openApiServiceApi.pushOrderCarbonCrain(orderDO.getOrderNo()); } @@ -301,6 +319,7 @@ public class AsyncTaskService { /** * 扣费完成,进行订单数据的更新 + * * @return */ private EquipmentChargeOrderDO updateOrderOutlayInfoReverseV2(NotifyChargeOrderInfoBO notifyChargeOrderInfoBO, EquipmentChargeOrderDTO orderDTO, EquipmentChargeOrderDO orderInfo) { @@ -364,7 +383,8 @@ public class AsyncTaskService { /** * 插入订单分时段信息 - 反向 - * @param orderNo 订单编号 + * + * @param orderNo 订单编号 * @param chargeDetail 详单数据 */ private void insertOrderDetailReverse(String orderNo, List chargeDetail) { @@ -406,8 +426,8 @@ public class AsyncTaskService { long chargeStartTime = getCurrentMinute(chargeDetail.get(i).getDetailStartTime()); //查询当前的detail的开始时间的所属计费时段 - for(PriceRule priceRule : lpr) { - if(priceRule.getStartTime().longValue() <= chargeStartTime && priceRule.getEndTime().longValue() > chargeStartTime) { + for (PriceRule priceRule : lpr) { + if (priceRule.getStartTime().longValue() <= chargeStartTime && priceRule.getEndTime().longValue() > chargeStartTime) { timeFlag = priceRule.getTimeFlag(); } } @@ -431,6 +451,7 @@ public class AsyncTaskService { /** * 获取当前时间的分钟数 + * * @param detailStartTime 当面的充电开始时间 * @return */ @@ -528,37 +549,59 @@ public class AsyncTaskService { * 补全停止前最新一次的订单信息 */ public EquipmentChargeOrderDO beforeStopLastOrderInfo(EquipmentOrder equipmentOrder, EquipmentChargeOrderDO orderInfo) { + //处理分时段电量, 通俗点说就是把一个Double[]转化为一个以逗号分隔开的字符串 String timeShare = timeShareComputeStr(equipmentOrder.getMultiChargeDegree()); - orderInfo.setChargeBeginTime(Optional.ofNullable(equipmentOrder.getChargeBeginTime()).orElse(orderInfo.getChargeBeginTime())); + //充电分时度数 orderInfo.setChargeTimesDegree(timeShare); + + //充电开始时间 + orderInfo.setChargeBeginTime(Optional.ofNullable(equipmentOrder.getChargeBeginTime()).orElse(orderInfo.getChargeBeginTime())); + //充电结束时间 orderInfo.setChargeEndTime(equipmentOrder.getChargeEndTime()); + //充电时长 orderInfo.setChargeDuration(equipmentOrder.getChargeDuration()); + //充电开始度数 orderInfo.setChargeBeginDegree(equipmentOrder.getChargeBeginDegree()); + //充电结束度数 orderInfo.setChargeEndDegree(equipmentOrder.getChargeEndDegree()); + //充电度数 orderInfo.setChargeDegree(equipmentOrder.getChargeDegree()); + //充电开始soc orderInfo.setChargeBeginSoc(Double.valueOf(equipmentOrder.getChargeBeginSoc()).intValue()); + //充电结束soc orderInfo.setChargeEndSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue()); + //充电当前soc orderInfo.setChargeCurSoc(Double.valueOf(equipmentOrder.getChargeEndSoc()).intValue()); + //充电策略 orderInfo.setChargeStrategy(equipmentOrder.getChargeStrategy()); + //充电策略参数 orderInfo.setChargeStrategyParam(equipmentOrder.getChargeStrategyParam()); + //启动方式 0本地刷卡启动 1后台启动 2本地管理员启动 orderInfo.setBootMode(equipmentOrder.getBootMode()); + //车辆vin码 orderInfo.setChargeVin(equipmentOrder.getChargeVin()); + //充电电量 orderInfo.setChargeAh(equipmentOrder.getChargeDegree() * 100); + //结束编码 orderInfo.setFinishCode(44); + //结束类型 orderInfo.setFinishType(2); + //结束原因 orderInfo.setFinishMsg("补单结束"); + //订单结束时间 orderInfo.setFinishTime(ToolDateTime.getDate()); return orderInfo; } /** * 添加一条订单轨迹 - * @param orderNo 订单编号 - * @param userId 用户id + * + * @param orderNo 订单编号 + * @param userId 用户id * @param connectorSn 枪编号 - * @param state 订单状态 状态 0创建中 1启动中 2充电中 3充电完成 4充电异常 5订单挂起 101扫码启动(设备认证) 102用户启动充电 103用户主动停止 - * @param succStat 操作结果 0 成功 1失败 - * @param failReason 失败理由 + * @param state 订单状态 状态 0创建中 1启动中 2充电中 3充电完成 4充电异常 5订单挂起 101扫码启动(设备认证) 102用户启动充电 103用户主动停止 + * @param succStat 操作结果 0 成功 1失败 + * @param failReason 失败理由 */ public void addOrderTrack(String orderNo, Long userId, String connectorSn, Byte state, Byte succStat, String failReason) { EquipmentChargeOrderTrackDO trackDO = new EquipmentChargeOrderTrackDO(); @@ -605,8 +648,8 @@ public class AsyncTaskService { if (settle.getCode() != 1000 || settle.getData() == null) { // hangOrder(orderInfo.getOrderNo(), "补单结算失败,计费失败,原因:" + settle.getMsg(), settle.getCode()); log.error("补单结算订单:{}计费失败,原因:{}", orderInfo.getOrderNo(), settle.getMsg()); - addOrderTrack(orderInfo.getOrderNo(), orderInfo.getUserId(), orderInfo.getConnectorId().toString(), (byte)3, (byte) 0, "补单结算失败,计费失败,原因:" + settle.getMsg()); - return ; + addOrderTrack(orderInfo.getOrderNo(), orderInfo.getUserId(), orderInfo.getConnectorId().toString(), (byte) 3, (byte) 0, "补单结算失败,计费失败,原因:" + settle.getMsg()); + return; } //获取订单返回的计费信息 @@ -650,7 +693,7 @@ public class AsyncTaskService { joinActivityRebate(orderInfo.getUserId().toString(), orderInfo.getOrderNo(), "0", "0", "", "1"); //推送碳大脑 - if (flag){ + if (flag) { openApiServiceApi.pushOrderCarbonCrain(orderInfo.getOrderNo()); } } @@ -667,6 +710,7 @@ public class AsyncTaskService { /** * 获取返回的orderDTO数据 + * * @param settle 订单计费返回信息 * @return */ @@ -679,6 +723,7 @@ public class AsyncTaskService { /** * 扣费成功后,进行订单数据的更新 + * * @param orderDTO * @param orderInfo * @return @@ -718,11 +763,11 @@ public class AsyncTaskService { orderInfo.setUpdateTime(now); //若是有使用优惠券,则进行优惠券的处理 - if(orderDTO.getUserCouponId() != null && orderDTO.getUserCouponId() != 0) { + if (orderDTO.getUserCouponId() != null && orderDTO.getUserCouponId() != 0) { UserCouponDO userCouponDO = userCouponDOMapper.selectByPrimaryKey(orderDTO.getUserCouponId()); //无限制优惠券不更新状态 //非无限制的优惠券才进行优惠券状态的更新 - if(userCouponDO.getIsLimitNum() != 1) { + if (userCouponDO.getIsLimitNum() != 1) { userCouponDO.setState("1"); userCouponDO.setUtilityTime(DateUtil.formatDateTime(now)); userCouponDO.setUpdateTime(now); @@ -733,7 +778,7 @@ public class AsyncTaskService { equipmentChargeOrderDOMapper.updateByPrimaryKeySelective(orderInfo); //插入详单数据 - if(orderDTO.getChargeSettleType() == 2 && orderDTO.getDetailDOList().size() > 0) { + if (orderDTO.getChargeSettleType() == 2 && orderDTO.getDetailDOList().size() > 0) { equipmentChargeOrderDetailDOMapper.insertList(orderDTO.getDetailDOList()); } @@ -742,7 +787,8 @@ public class AsyncTaskService { /** * 计费后进行订单状态的更新 - * @param orderDTO 计费返回数据 + * + * @param orderDTO 计费返回数据 * @param orderInfo 订单信息 */ private EquipmentChargeOrderDO updateOrderSettleInfoV2(EquipmentChargeOrderDTO orderDTO, EquipmentChargeOrderDO orderInfo) { @@ -773,12 +819,13 @@ public class AsyncTaskService { /** * 转类型 + * * @param chargeTimesDegree * @return */ private Double[] getFinalChargeTimesDegree(double[] chargeTimesDegree) { Double[] timeShare = new Double[chargeTimesDegree.length]; - for (int i = 0; i < chargeTimesDegree.length; i++){ + for (int i = 0; i < chargeTimesDegree.length; i++) { timeShare[i] = chargeTimesDegree[i]; } return timeShare; @@ -786,8 +833,9 @@ public class AsyncTaskService { /** * 将订单置为挂起状态 + * * @param orderNo 订单编号 - * @param msg 描述 + * @param msg 描述 * @param code */ private void hangOrder(String orderNo, String msg, Integer code) { @@ -1005,6 +1053,7 @@ public class AsyncTaskService { /** * 更新启明特殊订单结算中状态 + * * @param orderDTO * @param orderInfo */ diff --git a/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java b/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java index ccb4be6..14e1308 100644 --- a/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java +++ b/Ylt/ms-task/src/main/java/com/charge/task/service/HandleOrderTarckService.java @@ -171,10 +171,16 @@ public class HandleOrderTarckService { }); } + //【2024-08-13 Modify by HuangHai】 /** * 批量处理挂起反向订单,进行补单 */ - public void completeUnReportReverseOrder() { + public void completeUnReportReverseOrder(){ + Date startDate = ToolDateTime.startDateByDay(new Date(), -60); + Date endDate = ToolDateTime.startDateByDay(new Date(), 0); + completeUnReportReverseOrder(startDate,endDate); + } + public void completeUnReportReverseOrder(Date startDate,Date endDate) { //处理指定 ~ 指定时间三天前 时间内的反向挂起的订单 // #{code} = push_reverse_orders.duration // select value from t_biz_parameter where state = 1 and code = #{code} order by id desc limit 1 @@ -182,8 +188,8 @@ public class HandleOrderTarckService { // 返回值 : 72 小时 String time = equipmentChargeOrderDOMapper.getReverseFinishTime(Constant.REVERSE_ORDER_TIME); int hour = new BigDecimal(time).intValue(); - Date startDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -(hour + 720));//33天之内的 - Date endDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -hour);//72小时前,也就是3天前 + //Date startDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -(hour + 720));//33天之内的 + //Date endDate = DateUtil.offset(new Date(), DateField.HOUR_OF_DAY, -hour);//72小时前,也就是3天前 //查询这段时间内挂起的工单 /**