Explorar o código

系统自动退房开发

wangzhengliang %!s(int64=3) %!d(string=hai) anos
pai
achega
5461024a68

+ 14 - 0
src/main/java/com/chuanghai/ihotel/config/ScheduledConfig.java

@@ -0,0 +1,14 @@
+package com.chuanghai.ihotel.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * 异步任务配置
+ */
+@EnableAsync
+@EnableScheduling
+@Configuration
+public class ScheduledConfig {
+}

+ 15 - 2
src/main/java/com/chuanghai/ihotel/controller/HotelOrderController.java

@@ -177,6 +177,20 @@ public class HotelOrderController {
     }
 
     /**
+     * 获取订单结账信息
+     * @param userToken 用户token
+     * @param orderId 订单id
+     * @return
+     */
+    @UserLoginCheck
+    @GetMapping("/user/order/bill/{orderId}")
+    public CommonResult<OrderBillHandleVO> getOrderBillInfo(@RequestHeader("user_token") String userToken,
+                                                        @PathVariable("orderId") Long orderId) {
+        OrderBillHandleVO vo = hotelOrderService.getOrderBillInfo(orderId);
+        return CommonResult.ok().setResult(vo);
+    }
+
+    /**
      * 删除订单【用户端】
      * @param userToken 用户token
      * @param orderId 订单id
@@ -222,14 +236,13 @@ public class HotelOrderController {
 
     /**
      * 办理退房
-     * TODO 每天12天系统会自动退房,房态由入住改为脏房
      * @param userToken 用户token
      * @param orderId 订单id
      * @return
      */
     @UserLoginCheck
     @PutMapping("user/order/return/{orderId}")
-    public CommonResult<String> userReturnOrder(@RequestHeader("user_token") String userToken,
+    public CommonResult<OrderBillHandleVO> userReturnOrder(@RequestHeader("user_token") String userToken,
                                               @PathVariable("orderId") Long orderId) {
         OrderBillHandleVO orderBillHandleVO = hotelOrderService.userReturnOrder(orderId);
         return CommonResult.ok().setResult(orderBillHandleVO);

+ 30 - 0
src/main/java/com/chuanghai/ihotel/scheduled/SystemScheduled.java

@@ -0,0 +1,30 @@
+package com.chuanghai.ihotel.scheduled;
+
+import com.chuanghai.ihotel.service.HotelOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 系统定时任务
+ */
+@Slf4j
+@Component
+public class SystemScheduled {
+
+    @Autowired
+    private HotelOrderService orderService;
+
+    /**
+     * 自动退房
+     *
+     * 每天12:00、12:10、12:20分别执行一次
+     */
+    @Async
+    @Scheduled(cron = "0 0,10,20 12 * * ? ")
+    public void autoReturnOrder() {
+        orderService.autoReturnOrder();
+    }
+}

+ 7 - 0
src/main/java/com/chuanghai/ihotel/service/HotelOrderBillService.java

@@ -32,5 +32,12 @@ public interface HotelOrderBillService extends IService<HotelOrderBillEntity> {
      * @return
      */
     BillHandleResultDTO calcBill(Long orderId);
+
+    /**
+     * 获取结账信息
+     * @param orderId
+     * @return
+     */
+    BillHandleResultDTO getBill(Long orderId);
 }
 

+ 12 - 0
src/main/java/com/chuanghai/ihotel/service/HotelOrderService.java

@@ -96,6 +96,13 @@ public interface HotelOrderService extends IService<HotelOrderEntity> {
     OrderSubmitVO getOrderPayParam(Long orderId);
 
     /**
+     * 获取订单结账信息
+     * @param orderId
+     * @return
+     */
+    OrderBillHandleVO getOrderBillInfo(Long orderId);
+
+    /**
      * 用户删除订单
      * @param orderId
      */
@@ -126,5 +133,10 @@ public interface HotelOrderService extends IService<HotelOrderEntity> {
      * @return
      */
     List<RoomRealDataStatuVO.RoomUseInfo> getRoomUseInfoByOrderIds(Set<Long> orderIds);
+
+    /**
+     * 自动退房
+     */
+    void autoReturnOrder();
 }
 

+ 25 - 0
src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderBillServiceImpl.java

@@ -147,6 +147,31 @@ public class HotelOrderBillServiceImpl extends ServiceImpl<HotelOrderBillDao, Ho
         return dto;
     }
 
+    @Override
+    public BillHandleResultDTO getBill(Long orderId) {
+        // 获取结账单
+        HotelOrderBillEntity orderBill = findByOrderId(orderId);
+        if (orderBill == null) {
+            throw new RRException(BizCodeEnume.UNKNOW_EXCEPTION, "订单账单信息不存在");
+        }
+
+        // 系统设置
+        SystemSettingEntity systemSetting = systemSettingService.get();
+
+        // 构建账单处理结果信息
+        BillHandleResultDTO dto = new BillHandleResultDTO();
+        dto.setBillId(orderBill.getId());
+        if (orderBill.getRealFree().doubleValue() <= 0) {
+            dto.setResultFlag("1");
+            dto.setReturnFee(systemSetting.getDeposit().subtract(orderBill.getShouldFree()));
+        } else {
+            // 发起缴费
+            dto.setResultFlag("2");
+            dto.setRealFee(orderBill.getRealFree());
+        }
+        return dto;
+    }
+
     /**
      * 读取水电表数据
      * @param roomId 房间号

+ 79 - 3
src/main/java/com/chuanghai/ihotel/service/impl/HotelOrderServiceImpl.java

@@ -32,6 +32,7 @@ import com.chuanghai.ihotel.entity.SystemSettingEntity;
 import com.chuanghai.ihotel.enums.EventMessageTypeEnum;
 import com.chuanghai.ihotel.enums.OrderBillStatuEnum;
 import com.chuanghai.ihotel.enums.OrderStatuEnum;
+import com.chuanghai.ihotel.enums.RoomStatuEnum;
 import com.chuanghai.ihotel.enums.UserIdentityTypeEnum;
 import com.chuanghai.ihotel.service.HotelOrderBillService;
 import com.chuanghai.ihotel.service.HotelOrderService;
@@ -61,6 +62,7 @@ import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -441,6 +443,25 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
     }
 
     @Override
+    public OrderBillHandleVO getOrderBillInfo(Long orderId) {
+        HotelOrderEntity order = userGetOrderById(orderId);
+
+        if (!OrderStatuEnum.WAIT_BILL.getCode().equals(order.getOrderStatu())) {
+            throw new RRException(BizCodeEnume.PARAMETER_ERROR, "当前订单不是带结账状态");
+        }
+
+        BillHandleResultDTO dto = orderBillService.getBill(orderId);
+        OrderBillHandleVO vo = new OrderBillHandleVO();
+        vo.setOrderId(orderId);
+        vo.setBillId(dto.getBillId());
+        vo.setFlag(dto.getResultFlag());
+        vo.setSupperFee(dto.getRealFee());
+        vo.setRefundFee(dto.getReturnFee());
+
+        return vo;
+    }
+
+    @Override
     public void userDeleteOrder(Long orderId) {
         HotelOrderEntity order = userGetOrderById(orderId);
 
@@ -469,6 +490,10 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         if (!OrderStatuEnum.WAIT_PAY.getCode().equalsIgnoreCase(order.getOrderStatu())) {
             throw new RRException(BizCodeEnume.PERMISSION_DENIED, "当前订单不可取消");
         }
+
+        // 释放房间锁定
+        roomRealtimeStatuService.releaseByBizId(orderId);
+
         UpdateWrapper<HotelOrderEntity> updateWrapper = new UpdateWrapper<>();
         updateWrapper.eq("id", orderId);
         updateWrapper.set("order_statu", OrderStatuEnum.CANCEL.getCode());
@@ -519,10 +544,17 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
 
         // 结算订单
         BillHandleResultDTO billHandleResult = orderBillService.calcBill(orderId);
-        if ("1".equals(billHandleResult.getResultFlag()) && billHandleResult.getReturnFee().doubleValue() > 0) {
-            // TODO 发起退款
+        String orderStatu = OrderStatuEnum.WAIT_BILL.getCode();
+        if ("1".equals(billHandleResult.getResultFlag())) { // 待退款
+            if (billHandleResult.getReturnFee().doubleValue() > 0) {
+                // TODO 发起退款
+            } else {
+                // 自动完结订单
+                orderStatu = OrderStatuEnum.FINISH.getCode();
+            }
         }
 
+
         // 密码锁密码删除
         roomDoorLockDataService.deleteByOrderId(orderId);
 
@@ -532,7 +564,7 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         // 更新订单状态
         UpdateWrapper<HotelOrderEntity> updateWrapper = new UpdateWrapper<>();
         updateWrapper.eq("id", orderId);
-        updateWrapper.set("order_statu", OrderStatuEnum.WAIT_BILL.getCode());
+        updateWrapper.set("order_statu", orderStatu);
         updateWrapper.last("limit 1");
         this.update(null, updateWrapper);
 
@@ -554,6 +586,50 @@ public class HotelOrderServiceImpl extends ServiceImpl<HotelOrderDao, HotelOrder
         return this.baseMapper.getRoomUseInfoByOrderIds(orderIds);
     }
 
+    @Override
+    public void autoReturnOrder() {
+        // 查询都有已经到退房时间但是未退房订单
+        QueryWrapper<HotelOrderEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("order_statu", OrderStatuEnum.HOLD_ON.getCode());
+        queryWrapper.le("enable_end_time", CommonUtil.localDateToTime(LocalDate.now(), TimeConstant.OUT_TIME));
+
+        List<HotelOrderEntity> orderEntityList = this.list(queryWrapper);
+
+
+        if (orderEntityList.size() > 0) {
+            List<Long> waitBillOrderIdList = new ArrayList<>();
+            List<Long> finishOrderIdList = new ArrayList<>();
+
+            orderEntityList.forEach(order -> {
+                Long orderId = order.getId();
+                // 结算订单
+                BillHandleResultDTO billHandleResult = orderBillService.calcBill(orderId);
+                if ("1".equals(billHandleResult.getResultFlag()) && billHandleResult.getReturnFee().doubleValue() == 0) { // 待退款
+                    finishOrderIdList.add(orderId);
+                } else {
+                    waitBillOrderIdList.add(orderId);
+                }
+                // 密码锁密码删除
+                roomDoorLockDataService.deleteByOrderId(orderId);
+                // 更新房态状态
+                roomRealtimeStatuService.userReturnOrder(orderId);
+            });
+
+            if (waitBillOrderIdList.size() > 0) {
+                UpdateWrapper<HotelOrderEntity> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", orderEntityList.stream().map(e -> e.getId()).collect(Collectors.toList()));
+                updateWrapper.set("order_statu", OrderStatuEnum.WAIT_BILL.getCode());
+                this.update(null, updateWrapper);
+            }
+            if (finishOrderIdList.size() > 0) {
+                UpdateWrapper<HotelOrderEntity> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", orderEntityList.stream().map(e -> e.getId()).collect(Collectors.toList()));
+                updateWrapper.set("order_statu", OrderStatuEnum.FINISH.getCode());
+                this.update(null, updateWrapper);
+            }
+        }
+    }
+
     /**
      * 用户根据订单id获取订单
      * @param orderId