Kaynağa Gözat

修改文档中的问题。添加房间超时收费

许智捷 2 yıl önce
ebeveyn
işleme
a4d093f560
27 değiştirilmiş dosya ile 633 ekleme ve 162 silme
  1. 26 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusOrderFeeController.java
  2. 21 9
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusRoomBookingOrdersController.java
  3. 30 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusWaiterController.java
  4. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/BookingLayoutRoomsDto.java
  5. 3 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusBookingRooms.java
  6. 6 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusLivingCustomer.java
  7. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusOrderFee.java
  8. 7 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusWaiter.java
  9. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusBookingRoomsMapper.java
  10. 16 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusRoomBookingOrdersMapper.java
  11. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusRoomBookingOrdersMapper.xml
  12. 2 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusOrderFeeService.java
  13. 8 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusRoomBookingOrdersService.java
  14. 19 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusOrderFeeServiceImpl.java
  15. 300 120
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusRoomBookingOrdersServiceImpl.java
  16. 0 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/BusLivingCustomerVo.java
  17. 41 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/controller/FwRoomCleanController.java
  18. 3 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/mapper/FwRoomCleanMapper.java
  19. 2 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/service/IFwRoomCleanService.java
  20. 6 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/service/impl/FwRoomCleanServiceImpl.java
  21. 18 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/order/controller/CesOrderLeaseGoodsController.java
  22. 3 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/LivingRoomOrderFeeJob.java
  23. 29 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/NightAuditJob.java
  24. 35 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Vo/LivingContinueVo.java
  25. 16 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesRoomsController.java
  26. 32 8
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesRoomsServiceImpl.java
  27. 2 0
      jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java

+ 26 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusOrderFeeController.java

@@ -8,7 +8,10 @@ import javax.servlet.http.HttpServletResponse;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
@@ -93,6 +96,29 @@ public class BusOrderFeeController extends JeecgController<BusOrderFee, IBusOrde
 		 return Result.OK(busOrderFeeService.collectionBatch(busOrderFeeList, hotelId));
 	 }
 
+	 @AutoLog(value = "bus_order_fee-预约单添加押金")
+	 @ApiOperation(value="bus_order_fee-预约单添加押金", notes="bus_order_fee-预约单添加押金")
+	 //@RequiresPermissions("business:bus_order_fee:add")
+	 @PostMapping(value = "/saveBookingDeposit")
+	 @Transactional(rollbackFor = Exception.class)
+	 public Result<Boolean> saveBookingDeposit(@RequestBody List<BusOrderFee> busOrderFeeList, String hotelId) {
+		 String bookingOrderId = String.valueOf(IdWorker.getId());
+		 busOrderFeeList.forEach(e -> {
+			 e.setBookingOrderId(bookingOrderId);
+		 });
+		 Boolean success = busOrderFeeService.collectionBatch(busOrderFeeList, hotelId);
+		 return success ? Result.OK(bookingOrderId) : Result.error("押金收取失败");
+	 }
+
+	 @AutoLog(value = "bus_order_fee-预约单添加押金")
+	 @ApiOperation(value="bus_order_fee-预约单添加押金", notes="bus_order_fee-预约单添加押金")
+	 //@RequiresPermissions("business:bus_order_fee:add")
+	 @GetMapping(value = "/getBookingDeposit")
+	 public Result<List<BusOrderFee>> getBookingDeposit(String bookingOrderId, String hotelId) {
+		 List<BusOrderFee> busOrderFees = service.list(Wrappers.<BusOrderFee>lambdaQuery().eq(BusOrderFee::getBookingOrderId, bookingOrderId).eq(BusOrderFee::getBookingYj, true));
+		 return Result.OK(busOrderFees);
+	 }
+
 	 @AutoLog(value = "bus_order_fee-退款")
 	 @ApiOperation(value="bus_order_fee-退款", notes="bus_order_fee-退款")
 	 //@RequiresPermissions("business:bus_order_fee:add")

+ 21 - 9
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusRoomBookingOrdersController.java

@@ -32,6 +32,7 @@ import org.jeecg.modules.business.service.IBusRoomsLivingOrderService;
 import org.jeecg.modules.business.service.impl.BusBookingRoomsServiceImpl;
 import org.jeecg.modules.business.service.impl.BusOrderFeeServiceImpl;
 import org.jeecg.modules.business.vo.*;
+import org.jeecg.modules.rooms.Vo.LivingContinueVo;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -307,13 +308,24 @@ public class BusRoomBookingOrdersController extends JeecgController<BusRoomBooki
 	 }
 
 	 /**
+	  * 续住/提前
+	  * @return
+	  */
+	 @ApiOperation(value="酒店预定订单-续住/提前", notes="酒店预定订单-续住/提前")
+	 @GetMapping(value = "/get-continue-order")
+	 public Result<List<LivingContinueVo>> getContinueOrder(String bookingOrderId , String hotelId) {
+		 List<LivingContinueVo> livingContinueList = service.getContinueOrder(bookingOrderId, hotelId);
+		 return Result.OK(livingContinueList);
+	 }
+
+	 /**
 	  * 续住前判断是否被预约
 	  */
 	 @ApiOperation(value="续住前判断是否被预约", notes="续住前判断是否被预约")
 	 @RequestMapping(value = "/isBooked",method = RequestMethod.POST)
-	 public Result isBooked(String livingOrderId,@RequestParam(name = "dueOutTime") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm") Date dueOutTime){
-		 BookingOrderEditVo bookingOrderVo = service.roomIdBooked(livingOrderId, dueOutTime);
-		 return Result.ok(bookingOrderVo);
+	 public Result isBooked(@RequestBody List<LivingContinueVo> livingContinueList){
+		 List<LivingContinueVo> returnLivingContinues = service.roomIdBooked(livingContinueList);
+		 return returnLivingContinues == null ? Result.error("未找到订单") : Result.ok(returnLivingContinues);
 	 }
 
 	 /**
@@ -322,8 +334,8 @@ public class BusRoomBookingOrdersController extends JeecgController<BusRoomBooki
 	  */
 	 @ApiOperation(value="酒店预定订单-续住/提前", notes="酒店预定订单-续住/提前")
 	 @RequestMapping(value = "/continue-living",method = RequestMethod.POST)
-	 public Result<Boolean> continueLiving(@RequestBody BusOrderFee fees,@RequestParam(name = "dueOutTime") @JsonFormat(pattern = "yyyy-MM-dd HH:mm")  @DateTimeFormat(pattern="yyyy-MM-dd HH:mm") Date dueOutTime,String livingOrderId , String hotelId) {
-		 Boolean isOk = service.continueLiving(fees,dueOutTime,livingOrderId,hotelId);
+	 public Result<Boolean> continueLiving(@RequestBody List<LivingContinueVo> livingContinueList,String hotelId) {
+		 Boolean isOk = service.continueLiving2(livingContinueList, hotelId);
 		 return Result.OK(isOk);
 	 }
 
@@ -552,8 +564,8 @@ public class BusRoomBookingOrdersController extends JeecgController<BusRoomBooki
 
 	 @ApiOperation(value="根据手机号查询入住历史列表", notes="根据手机号查询入住历史列表")
 	 @RequestMapping(value = "/ruzhu-history-list",method = RequestMethod.GET)
-	 public Result<IPage<HashMap<String, Object>>> ruZhuHistoryList(			  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
-																				 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,@RequestParam(name = "hotelId") String hotelId,@RequestParam(name = "phone") String phone) {
+	 public Result<IPage<HashMap<String, Object>>> ruZhuHistoryList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+																	@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,@RequestParam(name = "hotelId") String hotelId,@RequestParam(name = "phone") String phone) {
 		 Page<HashMap<String, Object>> page = new Page<HashMap<String, Object>>(pageNo, pageSize);
 		 return Result.OK(service.ruZhuHistoryList(page, hotelId, phone));
 	 }
@@ -567,8 +579,8 @@ public class BusRoomBookingOrdersController extends JeecgController<BusRoomBooki
 
 	 @ApiOperation(value="换房", notes="换房")
 	 @RequestMapping(value = "/change-living-room",method = RequestMethod.POST)
-	 public  Result<Boolean> changeRoom(@RequestBody List<BusLivingLayoutDayPrice> prices, String livingOrderId,String changeRoomId) {
-		 return Result.OK(service.changeLivingRoom(prices, livingOrderId, changeRoomId));
+	 public  Result<Boolean> changeRoom(@RequestBody LivingContinueVo param) {
+		 return Result.OK(service.changeLivingRoom(param));
 	 }
 	 @ApiOperation(value="撤销", notes="撤销")
 	 @RequestMapping(value = "/reverse-living",method = RequestMethod.GET)

+ 30 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusWaiterController.java

@@ -7,8 +7,12 @@ import java.util.stream.Collectors;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
@@ -25,6 +29,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.business.entity.BusAdvert;
 import org.jeecg.modules.business.entity.BusWaiter;
 import org.jeecg.modules.business.service.IBusWaiterService;
+import org.jeecg.modules.fw.entity.FwRoomClean;
+import org.jeecg.modules.fw.service.IFwRoomCleanService;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
@@ -57,7 +63,10 @@ public class BusWaiterController extends JeecgController<BusWaiter, IBusWaiterSe
 	@Autowired
 	private IBusWaiterService busWaiterService;
 
-	/**
+	@Resource
+	private IFwRoomCleanService fwRoomCleanService;
+
+	 /**
 	 * 分页列表查询
 	 *
 	 * @param busWaiter
@@ -108,6 +117,26 @@ public class BusWaiterController extends JeecgController<BusWaiter, IBusWaiterSe
 		return Result.OK(pageList);
 	}
 
+	 /**
+	  * 分页列表查询
+	  * @return
+	  */
+	 //@AutoLog(value = "服务员配置-分页列表查询")
+	 @ApiOperation(value="服务员-分配到的房间", notes="服务员-分配到的房间")
+	 @GetMapping(value = "/getRoomClean")
+	 public Result<List<BusWaiter>> queryList(String hotelId) {
+		 List<BusWaiter> waiterList = busWaiterService.list();
+		 List<String> waiterIds = waiterList.stream().map(BusWaiter::getId).collect(Collectors.toList());
+		 List<FwRoomClean> roomCleanList = fwRoomCleanService.list(Wrappers.<FwRoomClean>lambdaQuery()
+				 .eq(FwRoomClean::getState, 0).in(FwRoomClean::getWaiterId, waiterIds).eq(FwRoomClean::getHotelId, hotelId));
+		 waiterList.forEach(waiter ->{
+			 List<FwRoomClean> roomCleans = roomCleanList.stream().filter(roomClean -> waiter.getId()
+					 .equals(roomClean.getWaiterId())).collect(Collectors.toList());
+			 waiter.setRoomCleanList(roomCleans);
+		 });
+		 return Result.ok(waiterList);
+	 }
+
 	/**
 	 *   添加
 	 *

+ 1 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/BookingLayoutRoomsDto.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.jeecg.modules.business.entity.BusLivingCustomer;
 import org.jeecg.modules.business.entity.BusRoomBookingOrders;
+import org.jeecg.modules.business.vo.BusLivingCustomerVo;
 
 import java.util.List;
 

+ 3 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusBookingRooms.java

@@ -69,4 +69,7 @@ public class BusBookingRooms implements Serializable {
     @TableField(exist = false)
     private String roomsName;
 
+    @TableField(exist = false)
+    private String livingOrderId;
+
 }

+ 6 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusLivingCustomer.java

@@ -4,10 +4,8 @@ import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -81,4 +79,8 @@ public class BusLivingCustomer implements Serializable {
 	@Excel(name = "操作人", width = 15)
     @ApiModelProperty(value = "操作人")
     private String createUser;
+
+    @ApiModelProperty(value = "地址")
+    @TableField(exist = false)
+    private String address;
 }

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusOrderFee.java

@@ -140,6 +140,11 @@ public class BusOrderFee implements Serializable {
 
     private String returnFeeId;
     private Boolean returnItem;
+    @ApiModelProperty(value = "预定id")
+    private String bookingOrderId;
+    @ApiModelProperty(value = "预定押金")
+    private Boolean bookingYj;
+
 
     @ApiModelProperty(value = "每天价格")
     @TableField(exist = false)

+ 7 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusWaiter.java

@@ -4,12 +4,12 @@ import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.modules.fw.entity.FwRoomClean;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecg.common.aspect.annotation.Dict;
@@ -94,4 +94,7 @@ public class BusWaiter implements Serializable {
     @DateTimeFormat(pattern="yyyy-MM-dd")
     @ApiModelProperty(value = "更新时间")
     private Date updateTime;
+
+    @TableField(exist = false)
+    private List<FwRoomClean> roomCleanList;
 }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusBookingRoomsMapper.java

@@ -32,7 +32,7 @@ public interface BusBookingRoomsMapper extends BaseMapper<BusBookingRooms> {
     @Update("update bus_booking_rooms set is_main = 0 where booking_orders_id = #{orderId}")
     Boolean setNotMain(String orderId);
 
-    @Select("<script>select bbr.*, cr.name as rooms_name from bus_booking_rooms bbr " +
+    @Select("<script>select bbr.*, cr.name as rooms_name ,cr.living_order_id from bus_booking_rooms bbr " +
             "left join ces_rooms cr on bbr.room_id = cr.id " +
             "where bbr.booking_orders_id in" +
             "<foreach item='id' collection='booingIds' open='(' separator=',' close=')'> " +

+ 16 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusRoomBookingOrdersMapper.java

@@ -14,7 +14,9 @@ import org.jeecg.modules.business.entity.BusBookingRooms;
 import org.jeecg.modules.business.entity.BusRoomBookingOrders;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.jeecg.modules.business.entity.BusRoomPayType;
+import org.jeecg.modules.business.entity.BusRoomsLivingOrder;
 import org.jeecg.modules.business.vo.*;
+import org.jeecg.modules.rooms.Vo.LivingContinueVo;
 import org.jeecg.modules.rooms.entity.CesRooms;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -71,15 +73,19 @@ public interface BusRoomBookingOrdersMapper extends BaseMapper<BusRoomBookingOrd
             "</script>")
     public List<HashMap<String, Object>> ruZhuHistoryList(Page<HashMap<String, Object>> page, @Param("hotelId") String hotelId, @Param("phone") String phone);
 
-    @Select("select brbo.* from bus_room_booking_orders brbo " +
+    @Select("select brbo.id as booking_order_id, brbo.arrival_time,cr.name as room_name,cr.id as room_id, " +
+            "bc.id as customer_id, bc.name as customer_name, bc.phone " +
+            "from bus_room_booking_orders brbo " +
             "inner join bus_booking_rooms bbr on bbr.booking_orders_id = brbo.id " +
-            "where brbo.arrival_time > #{arrivalTimeStr} " +
+            "left join bus_customer bc on bc.id = brbo.contact_id " +
+            "inner join ces_rooms cr on cr.id = bbr.room_id " +
+            "where brbo.arrival_time > #{nowDate} && brbo.arrival_time < #{dueOutTime} " +
             "and brbo.booking_status = 1 "+
             "and bbr.room_id in " +
             "(select cr.id from bus_booking_rooms bbr " +
             "inner join ces_rooms cr on cr.id = bbr.room_id " +
             "where bbr.id = #{bookingRoomId}) ")
-    List<BusRoomBookingOrders> findBookingOrderByRoom(String bookingRoomId, String arrivalTimeStr);
+    List<LivingContinueVo> findBookingOrderByRoom(String bookingRoomId, Date nowDate, Date dueOutTime);
 
     @Select("<script>SELECT brbo.id,cr.name from bus_booking_rooms bbr \n" +
             "left join ces_rooms cr on cr.id = bbr.room_id \n" +
@@ -94,4 +100,11 @@ public interface BusRoomBookingOrdersMapper extends BaseMapper<BusRoomBookingOrd
             "</foreach> " +
             "</script>")
     List<BusRoomBookingOrders> findBookingOrder(List<String> roomIds, Date startOf, Date endOf);
+
+    @Select("select brlo.*, cr.name as room_name,cr.id as room_id, bc.name as customer_name, cr.layout_id \n" +
+            "from bus_rooms_living_order brlo \n" +
+            "inner join ces_rooms cr on cr.living_order_id = brlo.id \n" +
+            "inner join bus_customer bc on brlo.contact_id = bc.id " +
+            "where brlo.booking_order_id = #{ bookingOrderId } and brlo.hotel_id = #{ hotelId }")
+    List<LivingContinueVo> getContinueOrder(String bookingOrderId, String hotelId);
 }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusRoomBookingOrdersMapper.xml

@@ -187,7 +187,7 @@ lo.booking_order_id
             on br.id = lo.booking_room_id
             inner join bus_order_fee fee
             on fee.living_order_id = lo.id
-            inner join bus_customer cus
+            left join bus_customer cus
             on cus.id = lo.contact_id
             where
             r.hotel_id = #{hotelId}

+ 2 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusOrderFeeService.java

@@ -24,4 +24,6 @@ public interface IBusOrderFeeService extends IService<BusOrderFee> {
     Boolean collectionBatch(List<BusOrderFee> busOrderFeeList, String hotelId);
 
     IPage<RoomOrderFeeVo> strikeBalancePage(Page<RoomOrderFeeVo> page, String roomName, Integer preferentialStatus,String bookingOrderId, DateTime startTime, DateTime endTime);
+
+
 }

+ 8 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusRoomBookingOrdersService.java

@@ -11,6 +11,7 @@ import org.jeecg.modules.business.entity.*;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.business.vo.*;
 import org.jeecg.modules.rooms.Vo.FloorBuildingRoomVo;
+import org.jeecg.modules.rooms.Vo.LivingContinueVo;
 import org.jeecg.modules.rooms.entity.CesAllDayPriceRule;
 import org.jeecg.modules.rooms.entity.CesRooms;
 
@@ -51,10 +52,12 @@ public interface IBusRoomBookingOrdersService extends IService<BusRoomBookingOrd
 
     List<BusOrderFee> getLivingOrderFee(String orderId, Boolean isAllFee);
 
+    Boolean syncDayRoomFee(String hotelId);
     Boolean syncDayRoomOrder(String hotelId);
-
+    Boolean syncRoomOverTimeOrder(String hotelId);
     BigDecimal getOrderFeeTotal(String livingOrderId,String bookingOrderId);
     Boolean settleBillCheckOut(List<BusOrderFee> settleFees, String bookingOrderId);
+    Boolean continueLiving2(List<LivingContinueVo> livingContinueList, String hotelId);
     Boolean continueLiving(BusOrderFee settleFee, Date dueOutTime,String livingOrderId,String hotelId);
     Boolean livingSettleBillCheckOut(List<BusOrderFee> settleFees, String livingOrderId);
     Boolean partialSettle(PartialSettleVo param);
@@ -78,7 +81,7 @@ public interface IBusRoomBookingOrdersService extends IService<BusRoomBookingOrd
     void syncDayOrderFeeItem(BusRoomsLivingOrder order, CesAllDayPriceRule allDayRule);
     List<BusRoomBookingOrders> countTodayYD(String hotelId);
 
-    Boolean changeLivingRoom(List<BusLivingLayoutDayPrice> prices,String livingOrderId, String roomId);
+    Boolean changeLivingRoom(LivingContinueVo param);
 
     /**
      * 根据手机号查询入住历史列表
@@ -95,7 +98,9 @@ public interface IBusRoomBookingOrdersService extends IService<BusRoomBookingOrd
 
     Boolean canOnlyPaySelf(String bookingOrderId,String hotelId,String roomId);
 
-    BookingOrderEditVo roomIdBooked(String livingOrderId, Date newDueOutTime);
+    List<LivingContinueVo> roomIdBooked(List<LivingContinueVo> livingContinueList);
 
     Boolean payPortionFee(List<String> feeIds);
+
+    List<LivingContinueVo> getContinueOrder(String livingOrderId, String hotelId);
 }

+ 19 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusOrderFeeServiceImpl.java

@@ -15,6 +15,7 @@ import org.jeecg.common.util.TokenUtils;
 import org.jeecg.modules.business.entity.*;
 import org.jeecg.modules.business.enums.AgreementOrderStatusEnum;
 import org.jeecg.modules.business.enums.FeeSubjectType;
+import org.jeecg.modules.business.enums.FeeType;
 import org.jeecg.modules.business.mapper.BusOrderFeeMapper;
 import org.jeecg.modules.business.service.*;
 import org.jeecg.modules.business.vo.BusOrderFeeGoodsVo;
@@ -65,16 +66,34 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
         busOrderFeeList.forEach(orderFee ->{
             Optional<BusOrderFee> findFee = findBusOrderFees.stream().filter(fee -> fee.getId().equals(orderFee.getId())).findFirst();
             findFee.ifPresent(e -> {
+                // 冲账单
                 BusOrderFee newOrderFee = BeanUtil.copyProperties(e, BusOrderFee.class);
                 newOrderFee.setReturnFeeId(e.getId());
                 newOrderFee.setReturnItem(true);
                 newOrderFee.setId(null);
                 newOrderFee.setCreateTime(new Date());
+                newOrderFee.setSubjectType(FeeSubjectType.TUI_DAN_JIE_ZHANG_SHOU_KUAN.getKey());
                 newOrderFee.setPayTime(new Date());
                 newOrderFee.setDayTime(new Date());
                 newOrderFee.setRemark(orderFee.getRemark());
                 // orderFee.getMoney()前端需要传入为负数的差价
                 newOrderFee.setMoney(orderFee.getMoney());
+                // 冲账时如果勾选退款,将冲账单设置为已结算,生成未结算且为负的收款单
+                if (orderFee.getFeeType().equals(FeeType.CONSUME.getKey()) && orderFee.getReturnItem()){
+                    if (orderFee.getPreferentialStatus() == 1){
+                        throw new JeecgBootException("未结账的订单不能退款");
+                    }
+                    newOrderFee.setPreferentialStatus(2);
+                    // TODO: 2023/10/12 负金额的收款单
+                    BusOrderFee retrunOrderFee = BeanUtil.copyProperties(newOrderFee, BusOrderFee.class);;
+                    retrunOrderFee.setConsumeFeeId(orderFee.getId());
+                    retrunOrderFee.setRemark("冲账产生退款单");
+                    retrunOrderFee.setPreferentialStatus(2);
+                    retrunOrderFee.setFeeType(2);
+                    retrunOrderFee.setReturnItem(null);
+                    retrunOrderFee.setReturnFeeId(null);
+                    orderFeeList.add(retrunOrderFee);
+                }
                 orderFeeList.add(newOrderFee);
             });
 

+ 300 - 120
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusRoomBookingOrdersServiceImpl.java

@@ -40,6 +40,7 @@ import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
 import org.jeecg.modules.rooms.Enum.TimeOutRuleEnum;
 import org.jeecg.modules.rooms.Vo.BookingRealtimeVo;
 import org.jeecg.modules.rooms.Vo.FloorBuildingRoomVo;
+import org.jeecg.modules.rooms.Vo.LivingContinueVo;
 import org.jeecg.modules.rooms.Vo.LivingRealtimeVo;
 import org.jeecg.modules.rooms.entity.*;
 import org.jeecg.modules.rooms.service.*;
@@ -76,9 +77,6 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     private BusBookingBatchServiceImpl bookingBatchService;
 
     @Resource
-    private IBusBookingLayoutDayPriceService dayPriceService;
-
-    @Resource
     private IBusCustomerService customerService;
 
     @Resource
@@ -88,6 +86,9 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     private IBusLivingCustomerService livingCustomerService;
 
     @Resource
+    private IBusBookingLayoutDayPriceService dayPriceService;
+
+    @Resource
     private IBusLivingLayoutDayPriceService livingLayoutDayPriceService;
 
     @Resource
@@ -1069,33 +1070,36 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
 
         //<editor-fold desc="同住人相关">
 
-            BusRoomsLivingOrder finalLivingOrder = livingOrder;
-            customers.forEach(s->{
-                // 【添加客人信息 Start】
-                if(s.getCustomerName() != null && !s.getCustomerName().isEmpty() && s.getPhone() != null && !s.getPhone().isEmpty()){
-                    BusCustomer customer = customerService.getOne(Wrappers.<BusCustomer>query().eq("name",s.getCustomerName())
-                            .eq("phone",s.getPhone()));
-                    if(customer == null) {
-                        // save customer
-                        BusCustomer newCustomer = new BusCustomer();
-                        newCustomer.setCreateTime(new Date());
-                        newCustomer.setCreateUser("");
-                        newCustomer.setTenantId(user.getRelTenantIds());
-                        newCustomer.setName(s.getCustomerName());
-                        newCustomer.setGender(s.getGender());
-                        newCustomer.setPhone(s.getPhone());
-                        newCustomer.setCertType(1); // 身份证
-                        newCustomer.setCertNo(s.getCertNo()); // 身份证
-                        customerService.save(newCustomer);
-                        s.setCustomerId(newCustomer.getId());
-                    } else {
-                        s.setCustomerId(customer.getId());
-                    }
-                } else throw new JeecgBootException("客人信息不能为空");
-                s.setLivingOrderId(finalLivingOrder.getId());
-                livingCustomerService.save(s);
-                // 【添加客人信息 end】
-            });
+        BusRoomsLivingOrder finalLivingOrder = livingOrder;
+        customers.forEach(s->{
+            // 【添加客人信息 Start】
+            if(s.getCustomerName() != null && !s.getCustomerName().isEmpty() && s.getPhone() != null && !s.getPhone().isEmpty()){
+                BusCustomer customer = customerService.getOne(Wrappers.<BusCustomer>query().eq("name",s.getCustomerName())
+                        .eq("phone",s.getPhone()));
+                if(customer == null) {
+                    // save customer
+                    BusCustomer newCustomer = new BusCustomer();
+                    // 新顾客第一个会先自定义一个id,因为上面livingOrder要关联顾客id
+                    newCustomer.setId(s.getCustomerId());
+                    newCustomer.setCreateTime(new Date());
+                    newCustomer.setCreateUser("");
+                    newCustomer.setTenantId(user.getRelTenantIds());
+                    newCustomer.setName(s.getCustomerName());
+                    newCustomer.setGender(s.getGender());
+                    newCustomer.setAddress(s.getAddress());
+                    newCustomer.setPhone(s.getPhone());
+                    newCustomer.setCertType(1); // 身份证
+                    newCustomer.setCertNo(s.getCertNo()); // 身份证
+                    customerService.save(newCustomer);
+                    s.setCustomerId(newCustomer.getId());
+                } else {
+                    s.setCustomerId(customer.getId());
+                }
+            } else throw new JeecgBootException("客人信息不能为空");
+            s.setLivingOrderId(finalLivingOrder.getId());
+            livingCustomerService.save(s);
+            // 【添加客人信息 end】
+        });
 
         //</editor-fold>
 
@@ -1147,12 +1151,18 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String customerLiving(BookingOrderSaveDto livingData, Boolean isTeam, String hotelId) {
+        // 查看房间入住情况
         List<String> roomIds = livingData.getRoomIds().stream().map(BookingLayoutRoomsDto::getRoomId).collect(Collectors.toList());
         List<CesRooms> rooms = roomsService.listByIds(roomIds);
         Optional<CesRooms> optional = rooms.stream().filter(e -> StrUtil.isNotEmpty(e.getLivingOrderId())).findFirst();
         if (optional.isPresent()){
             throw new JeecgBootException("房间已被入住");
         }
+        // 查看房间预约情况
+        List<BusRoomBookingOrders> clashOrder = baseMapper.findBookingOrder(roomIds, livingData.getOrderInfo().getArrivalTime(), livingData.getOrderInfo().getDueOutTime());
+        if (!clashOrder.isEmpty()){
+            throw new JeecgBootException("房间已被预约");
+        }
         // 是预约单先将预约单与房间关联删掉。因为原来这个接口是自己入住的接口,后来预定也要调这个接口,只能先将预定时添加的BusRoomBookingOrders关联表删掉,重新进行关联
         if(StrUtil.isNotEmpty(livingData.getOrderInfo().getId())){
             BusRoomBookingOrders bookingOrders = getById(livingData.getOrderInfo().getId());
@@ -1359,6 +1369,92 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         return new ArrayList<>();
     }
 
+    public Boolean syncDayRoomFee(String hotelId){
+        List<CesRooms> hotelRooms = roomsService.list(Wrappers.<CesRooms>query().eq("hotel_id",hotelId).eq("invalid",false));
+        List<CesRooms> inLiveRooms = hotelRooms.stream().filter(s->s.getLivingOrderId() != null && !s.getLivingOrderId().isEmpty()
+                && (s.getRoomStatus().equals(RoomStatusEnum.LIVE_DIRTY.getKey()) || s.getRoomStatus().equals(RoomStatusEnum.LIVE_CLEAR.getKey()))).collect(Collectors.toList());
+        List<String> livingOrderIds = inLiveRooms.stream().map(CesRooms::getLivingOrderId).collect(Collectors.toList());
+        List<BusRoomsLivingOrder> livingOrders = roomsLivingOrderService.list(Wrappers.<BusRoomsLivingOrder>query()
+                .in("id",livingOrderIds));
+        List<CesAllDayPriceRule> allDayPriceRules = allDayPriceRuleService.list();
+        Optional<CesAllDayPriceRule> opAllPrice = allDayPriceRules.stream().filter(a->a.getHotelId().equals(hotelId)).findFirst();
+//        CesAllDayPriceRule allPrice;
+//        if(!opAllPrice.isPresent()) {
+//            allPrice = new CesAllDayPriceRule();
+//            allPrice.setEndTime("16:00");
+//        } else {
+//            allPrice = opAllPrice.get();
+//        }
+        livingOrders.forEach(s->{
+            try {
+                Date dueDate = DateUtils.parseDate(DateUtils.formatDate(s.getDueOutTime()),"yyyy-MM-dd");
+                Date currDate = DateUtils.parseDate(DateUtils.formatDate(new Date()),"yyyy-MM-dd");
+                List<BusOrderFee> hasFeeList = feeService.list(Wrappers.<BusOrderFee>lambdaQuery().eq(BusOrderFee::getFeeType, 1)
+                        .eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey()).ge(BusOrderFee::getCreateTime, currDate));
+                if (!hasFeeList.isEmpty()){
+                    return;
+                }
+                List<BusLivingLayoutDayPrice> dayPrices = livingLayoutDayPriceService.list(Wrappers.<BusLivingLayoutDayPrice>query()
+                        .eq("living_order_id",s.getId()));
+                Optional<BusLivingLayoutDayPrice> opPrice = dayPrices.stream().filter(a-> a.getDayTime().compareTo(currDate) == 0).findFirst();
+                BigDecimal money = new BigDecimal(0);
+                if(!opPrice.isPresent()){
+                    BusBookingRooms br = bookingRoomsService.getOne(Wrappers.<BusBookingRooms>query()
+                            .eq("id",s.getBookingRoomId()));
+                    if(br == null) return;
+                    CesRooms room =  roomsService.getById(br.getRoomId());
+                    if(room == null) return;
+                    CesRoomLayout layout = layoutService.getById(room.getLayoutId());
+                    if(layout == null) return;
+                    BusLivingLayoutDayPrice nPrice = new BusLivingLayoutDayPrice();
+                    nPrice.setBookingRoomId(s.getBookingRoomId());
+                    try {
+                        nPrice.setDayTime(DateUtils.parseDate(DateUtils.formatDate(new Date()),"yyyy-MM-dd"));
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                    nPrice.setRoomId(br.getRoomId());
+                    nPrice.setRoomLayoutId(room.getLayoutId());
+                    nPrice.setPrice(layout.getMarketPrice());
+                    nPrice.setLivingOrderId(s.getId());
+                    nPrice.setLivingType(s.getLivingType());
+                    livingLayoutDayPriceService.save(nPrice);
+                    // 更新订单日期
+                    if(dueDate.getTime() < currDate.getTime()){
+                        Date date = s.getDueOutTime();
+                        Calendar calendar = new GregorianCalendar();
+                        calendar.setTime(date);
+                        calendar.add(Calendar.DATE,1);
+                        s.setDueOutTime(calendar.getTime());
+                        roomsLivingOrderService.updateById(s);
+                    }
+                    money = layout.getMarketPrice();
+                } else {
+                    money = opPrice.get().getPrice();
+                }
+
+                BusOrderFee dayOrderFee = new BusOrderFee();
+                dayOrderFee.setDayTime(new Date());
+                dayOrderFee.setCreateTime(new Date());
+
+                dayOrderFee.setFeeType(1);
+                dayOrderFee.setSubjectType(FeeSubjectType.MEI_RI_FANG_FEI.getKey());
+
+                CesRooms orderRoom = inLiveRooms.stream().filter(a->a.getLivingOrderId().equals(s.getId())).findFirst().get();
+                dayOrderFee.setMoney(money);
+                dayOrderFee.setRoomId(orderRoom.getId());
+                String roomName = orderRoom.getPrefix() != null?orderRoom.getPrefix():"";
+                roomName += roomName + orderRoom.getName();
+                dayOrderFee.setRemark("【"+roomName + "】 "+ DateUtils.formatDate(new Date()) + " 当日房费");
+                dayOrderFee.setLivingOrderId(s.getId());
+                dayOrderFee.setHotelId(hotelId);
+                feeService.save(dayOrderFee);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        });
+        return null;
+    }
 
 
     @Override
@@ -1449,7 +1545,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     }
 
 
-    public Boolean syncRoomOrder(String hotelId) {
+    public Boolean syncRoomOverTimeOrder(String hotelId) {
         // 查询出当前时间内需要处理的超时订单
         Set<Object> set = redisTemplate.opsForZSet().rangeByScore("overTimerOrder", 0, Calendar.getInstance().getTimeInMillis());
         CesAllDayPriceRule cesAllDayPriceRule =  allDayPriceRuleService.getOne(Wrappers.<CesAllDayPriceRule>lambdaQuery().eq(CesAllDayPriceRule::getHotelId,hotelId).eq(CesAllDayPriceRule::getInvalid,false));
@@ -1502,6 +1598,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     // 如果满足全天收费要求,预离时间增加1天
                     CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
                     fee.setMoney(layout.getMarketPrice());
+                    fee.setDayTime(date);
                     nextCalendar.setTime(livingOrder.getDueOutTime());
                     nextCalendar.add(Calendar.DAY_OF_YEAR,1);
                     livingOrder.setDueOutTime(nextCalendar.getTime());
@@ -1509,19 +1606,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     // 下一次收费时间戳
                     nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
                     // 添加每日房费
-                    BusLivingLayoutDayPrice nPrice = new BusLivingLayoutDayPrice();
-                    nPrice.setBookingRoomId(livingOrder.getBookingRoomId());
-                    try {
-                        nPrice.setDayTime(DateUtils.parseDate(DateUtils.formatDate(new Date()),"yyyy-MM-dd"));
-                    } catch (ParseException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                    nPrice.setRoomId(bookingroom.getRoomId());
-                    nPrice.setRoomLayoutId(bookingroom.getRoomLayoutId());
-                    nPrice.setPrice(layout.getMarketPrice());
-                    nPrice.setLivingOrderId(livingOrder.getId());
-                    nPrice.setLivingType(livingOrder.getLivingType());
-                    livingLayoutDayPriceService.save(nPrice);
+                    addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
                 }
                 // 移除处理过的时间订单,添加订单下一次超时的时间戳
                 redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
@@ -1559,19 +1644,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     // 下一次收费时间戳
                     nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
                     // 添加每日房费
-                    BusLivingLayoutDayPrice nPrice = new BusLivingLayoutDayPrice();
-                    nPrice.setBookingRoomId(livingOrder.getBookingRoomId());
-                    try {
-                        nPrice.setDayTime(DateUtils.parseDate(DateUtils.formatDate(new Date()),"yyyy-MM-dd"));
-                    } catch (ParseException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                    nPrice.setRoomId(bookingroom.getRoomId());
-                    nPrice.setRoomLayoutId(bookingroom.getRoomLayoutId());
-                    nPrice.setPrice(layout.getMarketPrice());
-                    nPrice.setLivingOrderId(livingOrder.getId());
-                    nPrice.setLivingType(livingOrder.getLivingType());
-                    livingLayoutDayPriceService.save(nPrice);
+                    addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
                 }
                 // 移除处理过的时间订单,添加订单下一次超时的时间戳
                 redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
@@ -1605,19 +1678,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     // 下一次收费时间戳
                     nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
                     // 添加每日房费
-                    BusLivingLayoutDayPrice nPrice = new BusLivingLayoutDayPrice();
-                    nPrice.setBookingRoomId(livingOrder.getBookingRoomId());
-                    try {
-                        nPrice.setDayTime(DateUtils.parseDate(DateUtils.formatDate(new Date()),"yyyy-MM-dd"));
-                    } catch (ParseException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                    nPrice.setRoomId(bookingroom.getRoomId());
-                    nPrice.setRoomLayoutId(bookingroom.getRoomLayoutId());
-                    nPrice.setPrice(layout.getMarketPrice());
-                    nPrice.setLivingOrderId(livingOrder.getId());
-                    nPrice.setLivingType(livingOrder.getLivingType());
-                    livingLayoutDayPriceService.save(nPrice);
+                    addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
                 }
                 // 移除处理过的时间订单,添加订单下一次超时的时间戳
                 redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
@@ -1627,21 +1688,43 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         });
     }
 
+    public void addDayPrice(BusRoomsLivingOrder livingOrder, BusBookingRooms bookingroom, BigDecimal money){
+        List<BusLivingLayoutDayPrice> dayPrices = livingLayoutDayPriceService.list(Wrappers.<BusLivingLayoutDayPrice>query()
+                .eq("living_order_id",livingOrder.getId()));
+        Optional<BusLivingLayoutDayPrice> opPrice = dayPrices.stream().filter(a-> DateUtils.formatDate(a.getDayTime()).equals(DateUtils.formatDate(livingOrder.getDueOutTime()))).findFirst();
+        if(!opPrice.isPresent()){
+            BusLivingLayoutDayPrice nPrice = new BusLivingLayoutDayPrice();
+            nPrice.setBookingRoomId(livingOrder.getBookingRoomId());
+            try {
+                nPrice.setDayTime(DateUtils.parseDate(DateUtils.formatDate(new Date()),"yyyy-MM-dd"));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            nPrice.setRoomId(bookingroom.getRoomId());
+            nPrice.setRoomLayoutId(bookingroom.getRoomLayoutId());
+            nPrice.setPrice(money);
+            nPrice.setLivingOrderId(livingOrder.getId());
+            nPrice.setLivingType(livingOrder.getLivingType());
+            livingLayoutDayPriceService.save(nPrice);
+        }
+    }
+
     public BusOrderFee getOverTimeFee(BusRoomsLivingOrder livingOrder, BusBookingRooms bookingroom){
-        BusOrderFee fee = feeService.getOne(Wrappers.<BusOrderFee>lambdaQuery()
-                .eq(BusOrderFee::getLivingOrderId, livingOrder.getId()).eq(BusOrderFee::getPreferentialStatus, "1")
+        List<BusOrderFee> feeList = feeService.list(Wrappers.<BusOrderFee>lambdaQuery()
+                .eq(BusOrderFee::getLivingOrderId, livingOrder.getId()).eq(BusOrderFee::getPreferentialStatus, 1)
                 .eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey()).gt(BusOrderFee::getCreateTime, livingOrder.getDueOutTime()));
-        if (ObjectUtil.isEmpty(fee)){
-            fee = new BusOrderFee();
-            fee.setMoney(new BigDecimal(0));
-            fee.setCreateTime(new Date());
-            fee.setSubjectType(FeeSubjectType.MEI_RI_FANG_FEI.getKey());
-            fee.setLivingOrderId(livingOrder.getId());
-            fee.setHotelId(livingOrder.getHotelId());
-            fee.setFeeType(FeeType.CONSUME.getKey());
-            fee.setRoomId(bookingroom.getRoomId());
-            fee.setRemark("超时房费");
+        if (CollUtil.isNotEmpty(feeList)) {
+            return feeList.get(0);
         }
+        BusOrderFee fee = new BusOrderFee();
+        fee.setMoney(new BigDecimal(0));
+        fee.setCreateTime(new Date());
+        fee.setSubjectType(FeeSubjectType.MEI_RI_FANG_FEI.getKey());
+        fee.setLivingOrderId(livingOrder.getId());
+        fee.setHotelId(livingOrder.getHotelId());
+        fee.setFeeType(FeeType.CONSUME.getKey());
+        fee.setRoomId(bookingroom.getRoomId());
+        fee.setRemark("超时房费");
         return fee;
     }
 
@@ -1670,6 +1753,59 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public Boolean continueLiving2(List<LivingContinueVo> continueLiving, String hotelId) {
+        List<String> livingIds = continueLiving.stream().map(LivingContinueVo::getId).collect(Collectors.toList());
+        if (CollUtil.isEmpty(livingIds)){
+            return null;
+        }
+        List<BusRoomsLivingOrder> livingOrderList = roomsLivingOrderService.listByIds(livingIds);
+        if (livingIds.size() != livingOrderList.size()){
+            return null;
+        }
+        List<BusOrderFee> orderFeeList = new ArrayList<>();
+        List<BusLivingLayoutDayPrice> dayPrices = new ArrayList<>();
+        continueLiving.forEach(living ->{
+            Optional<BusRoomsLivingOrder> orderOptional = livingOrderList.stream().filter(order -> order.getId().equals(living.getId())).findFirst();
+            orderOptional.ifPresent(e -> {
+                // 修改订单预离时间
+                e.setDueOutTime(living.getDueOutTime());
+                e.setBreakfastNum(living.getBreakfastNum());
+                // 添加收款单
+                if (ObjectUtil.isNotEmpty(living.getDayNum()) && living.getDayNum() > 0
+                        && ObjectUtil.isNotEmpty(living.getPayMoney()) && living.getPayMoney().compareTo(new BigDecimal(0)) > 0){
+                    if (StrUtil.isEmpty(living.getPayType())){
+                        throw new JeecgBootException("未找到付款方式");
+                    }
+                    BusOrderFee orderFee = new BusOrderFee();
+                    orderFee.setMoney(living.getPayMoney());
+                    orderFee.setPayType(living.getPayType());
+                    orderFee.setFeeType(2);
+                    orderFee.setSubjectType(2);
+                    orderFee.setRemark("预收房费");
+                    orderFee.setLivingOrderId(e.getId());
+                    orderFee.setPreferentialStatus(1);
+                    orderFee.setRoomId(living.getRoomId());
+                    orderFee.setHotelId(hotelId);
+                    orderFeeList.add(orderFee);
+                }
+                // 
+                if (living.getDayNum() < 0){
+                    // TODO: 2023/10/19 删除预约每日房价,还不确定要不要删
+                } else {
+                    dayPrices.addAll(living.getLayoutDayPriceList());
+                }
+                
+            });
+        });
+        feeService.collectionBatch(orderFeeList, hotelId);
+        roomsLivingOrderService.updateBatchById(livingOrderList);
+        livingLayoutDayPriceService.saveBatch(dayPrices);
+        return true;
+//        throw new JeecgBootException("设置失败");
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean continueLiving(BusOrderFee settleFee, Date dueOutTime,String livingOrderId,String hotelId) {
         BusRoomsLivingOrder order = roomsLivingOrderService.getById(livingOrderId);
         if (order == null) throw new JeecgBootException("订单错误");
@@ -1704,26 +1840,28 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
 //        throw new JeecgBootException("设置失败");
     }
 
+
     /**
      * 判断续租是否跟预约订单冲突
      */
     @Override
-    public BookingOrderEditVo roomIdBooked(String livingOrderId, Date newDueOutTime) {
-        BusRoomsLivingOrder order = roomsLivingOrderService.getById(livingOrderId);
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String arrivalTimeStr = sdf.format(order.getArrivalTime());
-        List<BusRoomBookingOrders> bookingOrdersByRooms = baseMapper.findBookingOrderByRoom(order.getBookingRoomId(), arrivalTimeStr);
-        for (BusRoomBookingOrders bookingOrder: bookingOrdersByRooms) {
-            if (bookingOrder.getArrivalTime().getTime() <= newDueOutTime.getTime()){
-                BusCustomer busCustomer = customerService.getById(bookingOrder.getContactId());
-                BookingOrderEditVo bookingOrderVo = new BookingOrderEditVo();
-                bookingOrderVo.setOrderInfo(bookingOrder);
-                bookingOrderVo.setContactName(busCustomer.getName());
-                bookingOrderVo.setPhone(busCustomer.getPhone());
-                return bookingOrderVo;
-            };
+    public List<LivingContinueVo> roomIdBooked(List<LivingContinueVo> livingContinueList) {
+        List<String> livingIds = livingContinueList.stream().map(LivingContinueVo::getId).collect(Collectors.toList());
+        if (CollUtil.isEmpty(livingIds)) {
+            return null;
         }
-        return null;
+        List<BusRoomsLivingOrder> orders = roomsLivingOrderService.listByIds(livingIds);
+        if (livingIds.size() != orders.size()) {
+            return null;
+        }
+        List<LivingContinueVo> returnLivingContinueVos = new ArrayList<>();
+        orders.forEach(e ->{
+            Optional<LivingContinueVo> continueOptional = livingContinueList.stream().filter(ele -> e.getId().equals(ele.getId())).findFirst();
+            List<LivingContinueVo> livingContinueVos =
+                    baseMapper.findBookingOrderByRoom(e.getBookingRoomId(), new Date(), continueOptional.get().getDueOutTime());
+            returnLivingContinueVos.addAll(livingContinueVos);
+        });
+        return returnLivingContinueVos;
     }
 
     @Override
@@ -1888,7 +2026,12 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(livingOrderId);
         if(livingOrder == null) throw new JeecgBootException("订单不存在");
         BusBookingRooms bookingRoom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
-        if(bookingRoom == null) throw new JeecgBootException("订单房间不存在");
+        if (bookingRoom == null){
+            throw new JeecgBootException("房间订单不存在");
+        }
+        if (SettleTypeEnum.UN_SETTLE_LEAVE.getKey().equals(livingOrder.getSettleType())){
+            throw new JeecgBootException("未结退房的房间不能拆房");
+        }
         long count = roomsLivingOrderService.count(Wrappers.<BusRoomsLivingOrder>query().eq("booking_order_id", livingOrder.getBookingOrderId()));
         if (count == 2){
             UpdateWrapper<BusTeam> uw = new UpdateWrapper<>();
@@ -2450,9 +2593,10 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                 order.setVipCustomerId(vipCustomerId);
                 order.setContractTeamId(contractTeamId);
                 order.setContractTeamProtocolId(marketAgreementCustomerId);
-                // 找出房费订单和每日价格,按会员价算
+                // 找出未结算的房费订单,且不是冲账单 和每日价格,按会员价算
                 List<BusOrderFee> orderFeeList = feeService.list(Wrappers.<BusOrderFee>lambdaQuery()
-                        .eq(BusOrderFee::getLivingOrderId, order.getId()).eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey()));
+                        .eq(BusOrderFee::getLivingOrderId, order.getId()).eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey())
+                        .eq(BusOrderFee::getPreferentialStatus, 1).gt(BusOrderFee::getMoney,0));
                 // 原始则扣和改变后的折扣
                 BigDecimal finalOriginalDiscount = originalDiscount;
                 BigDecimal finalChangeDiscount = changeDiscount;
@@ -2789,6 +2933,13 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
 //        if(user == null) throw new JeecgBootException("请登录");
         if(hotelId == null) throw  new JeecgBootException("未找到酒店");
         List<BusRoomPayType> payTypes = payTypeService.list();
+        // 如果未结算的只有一条,且是消费单(部分结账的时候)。收款单中关联这条消费单
+        String consumeFeeId;
+        if (feeItems != null && feeItems.size() == 1 && feeItems.get(0).getFeeType().equals(1)){
+            consumeFeeId = feeItems.get(0).getId();
+        } else {
+            consumeFeeId = null;
+        }
         settleFees.forEach(s->{
             if(BooleanUtil.isTrue(s.getIsPreferential())) {
                 if(s.getCouponscashId() != null && !s.getCouponscashId().isEmpty()) {
@@ -2848,17 +2999,19 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                 s.setFeeType(2);
                 s.setSubjectType(FeeSubjectType.JIE_ZHANG.getKey());
                 s.setContactId(mainRoomOrder.getContactId());
+                s.setConsumeFeeId(consumeFeeId);
             }
             s.setPreferentialStatus(2);
             s.setCreateTime(new Date());
             s.setRoomId(mainRoom.getRoomId());
             s.setLivingOrderId(mainRoomOrder.getId());
             s.setHotelId(hotelId);
-
         });
         if(settleFees.size() > 0) {
+            // 保存收款单
             feeService.saveBatch(settleFees);
         } else throw new JeecgBootException("参数没有结账收费项目");
+        // 全部结账时是所有未结算的账单 ,部分结账时是勾选的消费账单
         feeItems.forEach(s->{
             s.setPreferentialStatus(2);
         });
@@ -2877,14 +3030,23 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                 throw new JeecgBootException("房间信息未找到");
             BookingLayoutRoomsDto bkRoomItem = livingData.getRoomIds().stream().filter(s->s.getRoomId().equals(bkRoom.getRoomId())).findFirst().get();
             List<BusLivingCustomer> customers = bkRoomItem.getLivingCustomers();
-            if(customers == null || customers.size() == 0) throw new JeecgBootException("请添加客户信息");
+            if(customers == null || customers.isEmpty()) throw new JeecgBootException("请添加客户信息");
             // 保存入住单,修改房间状态
             String livingOrderId = bookingToLive(bkRoom.getId(), customers,hotelId,null, bkRoomItem.getRoomOrderInfo());
+            // 将预约时交的押金,放到主房
+            if (bkRoom.getIsMain()){
+                LambdaUpdateWrapper<BusOrderFee> updateWrapper = new LambdaUpdateWrapper<>();
+                updateWrapper.set(BusOrderFee::getLivingOrderId, livingOrderId);
+                updateWrapper.set(BusOrderFee::getRoomId, bkRoom.getRoomId());
+                updateWrapper.eq(BusOrderFee::getBookingOrderId, bkRoom.getBookingOrdersId());
+                updateWrapper.eq(BusOrderFee::getBookingYj, true);
+                updateWrapper.isNull(BusOrderFee::getLivingOrderId);
+                feeService.update(updateWrapper);
+            }
             // 费用关联到主房
-            if(livingData.getOrderFees()!=null && livingData.getOrderFees().size() > 0 ) {
+            if(livingData.getOrderFees()!=null && !livingData.getOrderFees().isEmpty()) {
                 List<BusOrderFee> findRoomFees = livingData.getOrderFees().stream().filter(t->t.getRoomId().equals(bkRoom.getRoomId())).collect(Collectors.toList());
                 findRoomFees.forEach(s->{
-
                     s.setRoomId(bkRoom.getRoomId());
                     s.setLivingOrderId(livingOrderId);
                     s.setCreateTime(new Date());
@@ -2899,7 +3061,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     }
                     if("会员卡".equals(payType.getName())){
                         BusMemberBalanceLog memberBalanceLog = new BusMemberBalanceLog();
-                        if (user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")) {
+                        if (user.getRelTenantIds() != null && !user.getRelTenantIds().isEmpty()) {
                             memberBalanceLog.setTenantId(user.getRelTenantIds());
                         } else {
                             throw new JeecgBootException("当前登录人租户信息错误");
@@ -2913,7 +3075,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                         memberBalanceLogService.saveBalance(memberBalanceLog);
                     }
                 });
-                if(findRoomFees.size() > 0) feeService.saveBatch(findRoomFees);
+                if(!findRoomFees.isEmpty()) feeService.saveBatch(findRoomFees);
                 // 处理协议单位记账
                 findRoomFees.forEach(s->{
                     if(payTypes.stream().anyMatch(k->k.getId().equals(s.getPayType()) && k.getName().equals("单位记账")) ) {
@@ -3213,15 +3375,15 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     // 换房
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean changeLivingRoom(List<BusLivingLayoutDayPrice> prices,String livingOrderId, String roomId) {
-        if(prices == null || prices.size() == 0) throw new JeecgBootException("请传入房价");
-        BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(livingOrderId);
+    public Boolean changeLivingRoom(LivingContinueVo param) {
+        if(CollUtil.isEmpty(param.getLayoutDayPriceList())) throw new JeecgBootException("请传入房价");
+        BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(param.getId());
         if(livingOrder == null) throw  new JeecgBootException("入住记录不存在");
         BusBookingRooms bkRoom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
         if(bkRoom == null) throw new JeecgBootException("入住房间记录不存在");
         CesRooms origLivingRoom = roomsService.getById(bkRoom.getRoomId());
         if(origLivingRoom == null) throw new JeecgBootException("原房间不存在");
-        CesRooms changeRoom = roomsService.getById(roomId);
+        CesRooms changeRoom = roomsService.getById(param.getRoomId());
         if(changeRoom == null) throw new JeecgBootException("更换房间不存在");
         bkRoom.setRoomId(changeRoom.getId());
         bkRoom.setLayoutId(changeRoom.getLayoutId());
@@ -3230,27 +3392,28 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         origLivingRoom.setRoomStatus(RoomStatusEnum.EMPTY_DIRTY.getKey());
         roomsService.updateById(origLivingRoom);
         changeRoom.setRoomStatus(RoomStatusEnum.LIVE_CLEAR.getKey());
-        changeRoom.setLivingOrderId(livingOrderId);
+        changeRoom.setLivingOrderId(param.getId());
         roomsService.updateById(changeRoom);
         feeService.update(Wrappers.<BusOrderFee>lambdaUpdate().set(BusOrderFee::getRoomId, changeRoom.getId())
-                .eq(BusOrderFee::getLivingOrderId, livingOrderId));
-        livingLayoutDayPriceService.remove(Wrappers.<BusLivingLayoutDayPrice>query().eq("living_order_id",livingOrderId));
-        prices.forEach(s->{
+                .eq(BusOrderFee::getLivingOrderId, param.getId()));
+        livingLayoutDayPriceService.remove(Wrappers.<BusLivingLayoutDayPrice>query().eq("living_order_id",param.getId()));
+        param.getLayoutDayPriceList().forEach(s->{
             s.setRoomLayoutId(changeRoom.getLayoutId());
             s.setRoomId(changeRoom.getId());
             s.setLivingType(1);
-            s.setLivingOrderId(livingOrderId);
+            s.setLivingOrderId(param.getId());
             if(DateUtils.formatDate(new Date()).equals(DateUtils.formatDate(s.getDayTime()))){
                 // 修改当日房价 产生的当日房费账单也要改
-                BusOrderFee fee = feeService.getOne(Wrappers.<BusOrderFee>query()
+                List<BusOrderFee> fees = feeService.list(Wrappers.<BusOrderFee>query()
                         .eq("DATE_FORMAT(day_time,'%Y-%m-%d')",DateUtils.formatDate(new Date())).eq("living_order_id",s.getLivingOrderId()));
-                if(fee != null) {
-                    fee.setMoney(s.getPrice());
-                    feeService.updateById(fee);
+                if(CollUtil.isNotEmpty(fees)) {
+                    fees.get(0).setMoney(s.getPrice());
+                    feeService.updateById(fees.get(0));
                 }
             }
         });
-        livingLayoutDayPriceService.saveBatch(prices);
+        feeService.collectionBatch(param.getOrderFeeList(),livingOrder.getHotelId());
+        livingLayoutDayPriceService.saveBatch(param.getLayoutDayPriceList());
         return true;
     }
 
@@ -3346,5 +3509,22 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         return isUpdate;
     }
 
+    @Override
+    public List<LivingContinueVo> getContinueOrder(String bookingOrderId, String hotelId) {
+        List<LivingContinueVo> livingContinueList = baseMapper.getContinueOrder(bookingOrderId, hotelId);
+        if (CollUtil.isEmpty(livingContinueList)){
+            throw new JeecgBootException("订单未找到");
+        }
+        List<CesRoomLayout> layoutList = layoutService.list();
+        livingContinueList.forEach(e -> {
+            Optional<CesRoomLayout> layoutOptional = layoutList.stream().filter(layout -> layout.getId().equals(e.getLayoutId())).findFirst();
+            layoutOptional.ifPresent(ele -> {
+                    e.setRoomLayout(layoutOptional.get());
+            });
+        });
+        return livingContinueList;
+
+    }
+
 
 }

+ 0 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/BusLivingCustomerVo.java

@@ -7,8 +7,6 @@ import org.jeecg.modules.business.entity.BusLivingCustomer;
 @Data
 public class BusLivingCustomerVo extends BusLivingCustomer {
 
-    @ApiModelProperty(value = "地址")
-    private String address;
     @ApiModelProperty(value = "民族")
     private String nation;
 

+ 41 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/controller/FwRoomCleanController.java

@@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.apache.commons.lang3.ObjectUtils;
 import org.jeecg.common.api.vo.Result;
@@ -121,6 +122,14 @@ public class FwRoomCleanController extends JeecgController<FwRoomClean, IFwRoomC
 		return Result.OK(pageList);
 	}
 
+	@GetMapping("/needCleanRoom")
+	public List<FwRoomClean> needCleanRoom(FwRoomClean fwRoomClean, String hotelId){
+		List<FwRoomClean> roomCleanList = fwRoomCleanService.needCleanRoom(hotelId);
+//		List<FwRoomClean> roomCleanList = fwRoomCleanService.list(Wrappers.<FwRoomClean>lambdaQuery()
+//				.eq(FwRoomClean::getState, 0).eq(FwRoomClean::getHotelId, hotelId));
+		return roomCleanList;
+	}
+
 	/**
 	 * 房间消耗品汇总统计
 	 * @param startTime 开始日期
@@ -163,6 +172,38 @@ public class FwRoomCleanController extends JeecgController<FwRoomClean, IFwRoomC
 	@AutoLog(value = "fw_room_clean-添加")
 	@ApiOperation(value="fw_room_clean-添加", notes="fw_room_clean-添加")
 	//@RequiresPermissions("fw:fw_room_clean:add")
+	@PostMapping(value = "/allotRoomClean")
+	public Result<String> allotRoom(@RequestBody RoomCleanDto dto) {
+		if (ObjectUtils.isEmpty(dto.getRoomCleanList())) {
+			return Result.error("请先选择房间");
+		}
+		for (FwRoomClean fwRoomClean : dto.getRoomCleanList()) {
+			CesRooms cesRooms = cesRoomsService.getById(fwRoomClean.getRoomId());
+			if (ObjectUtils.isEmpty(cesRooms)) {
+				return Result.error("房间不存在");
+			}
+			if (!cesRooms.getRoomStatus().equals(RoomStatusEnum.EMPTY_DIRTY.getKey()) && !cesRooms.getRoomStatus().equals(RoomStatusEnum.LIVE_DIRTY.getKey())) {
+				return Result.error("房间不是脏房状态不可以置干净");
+			}
+			fwRoomClean.setHotelId(dto.getHotelId());
+			fwRoomClean.setState(0);
+			fwRoomClean.setTenantId(TokenUtils.currentTenantId());
+			fwRoomClean.setRemark(dto.getRemark());
+			fwRoomClean.setWaiterId(dto.getWaiterId());
+		}
+		fwRoomCleanService.saveBatch(dto.getRoomCleanList());
+		return Result.OK("添加成功!");
+	}
+
+	/**
+	 *   添加
+	 *
+	 * @param dto
+	 * @return
+	 */
+	@AutoLog(value = "fw_room_clean-添加")
+	@ApiOperation(value="fw_room_clean-添加", notes="fw_room_clean-添加")
+	//@RequiresPermissions("fw:fw_room_clean:add")
 	@PostMapping(value = "/add")
 	public Result<String> add(@RequestBody RoomCleanDto dto) {
 		if (ObjectUtils.isEmpty(dto.getRoomCleanList())) {

+ 3 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/mapper/FwRoomCleanMapper.java

@@ -50,4 +50,7 @@ public interface FwRoomCleanMapper extends BaseMapper<FwRoomClean> {
             "<if test='endTime != null'> and cl.create_time &lt;= #{endTime} </if>" +
             "group by cl.waiter_id</script>")
     public List<HashMap<String, Object>> roomCleanSummary(@Param("hotelId") String hotelId, @Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);
+
+    @Select("")
+    List<FwRoomClean> needCleanRoom(String hotelId);
 }

+ 2 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/service/IFwRoomCleanService.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface IFwRoomCleanService extends IService<FwRoomClean> {
     List<HashMap<String, Object>> roomUseConsumableSummary(Integer type, String hotelId, DateTime startTime, DateTime endTime);
     List<HashMap<String, Object>> roomCleanSummary(String hotelId, DateTime startTime, DateTime endTime);
+
+    List<FwRoomClean> needCleanRoom(String hotelId);
 }

+ 6 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/service/impl/FwRoomCleanServiceImpl.java

@@ -34,4 +34,10 @@ public class FwRoomCleanServiceImpl extends ServiceImpl<FwRoomCleanMapper, FwRoo
     public List<HashMap<String, Object>> roomCleanSummary(String hotelId, DateTime startTime, DateTime endTime) {
         return fwRoomCleanMapper.roomCleanSummary(hotelId, startTime, endTime);
     }
+
+    @Override
+    public List<FwRoomClean> needCleanRoom(String hotelId) {
+        return fwRoomCleanMapper.needCleanRoom(hotelId);
+
+    }
 }

+ 18 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/order/controller/CesOrderLeaseGoodsController.java

@@ -10,6 +10,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -37,6 +38,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.business.dto.PostDataDto;
 import org.jeecg.modules.business.entity.*;
 import org.jeecg.modules.business.enums.CouponsStatusEnum;
+import org.jeecg.modules.business.enums.FeeSubjectType;
 import org.jeecg.modules.business.enums.FeeType;
 import org.jeecg.modules.business.service.IBusDictItemService;
 import org.jeecg.modules.business.service.IBusHotelService;
@@ -179,10 +181,21 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 		 orderLeaseGood.setRevertDate(new Date());
 		 boolean isSuccess = cesOrderLeaseGoodsService.updateById(orderLeaseGood);
 		 if (isSuccess && returnDeposit && StrUtil.isNotEmpty(orderLeaseGood.getOrderFeeId())){
-			 LambdaUpdateWrapper<BusOrderFee> wrapper = new LambdaUpdateWrapper<>();
-			 wrapper.eq(BusOrderFee::getId,orderLeaseGood.getOrderFeeId());
-			 wrapper.set(BusOrderFee::getPreferentialStatus,2);
-			 busOrderFeeService.update(wrapper);
+			 BusOrderFee leaseGoodFee = busOrderFeeService.getById(orderLeaseGood.getOrderFeeId());
+			 if (leaseGoodFee != null){
+				 leaseGoodFee.setPreferentialStatus(2);
+				 BusOrderFee returnFee = BeanUtil.copyProperties(leaseGoodFee, BusOrderFee.class);
+				 returnFee.setId(null);
+				 returnFee.setRemark("退还物品押金");
+				 returnFee.setCreateTime(new Date());
+				 returnFee.setReturnItem(true);
+				 returnFee.setReturnFeeId(leaseGoodFee.getId());
+				 returnFee.setMoney(leaseGoodFee.getMoney().multiply(BigDecimal.valueOf(-1)));
+				 ArrayList<BusOrderFee> orderFeeList = new ArrayList<>();
+				 orderFeeList.add(leaseGoodFee);
+				 orderFeeList.add(returnFee);
+				 busOrderFeeService.saveOrUpdateBatch(orderFeeList);
+			 }
 		 }
 		 return Result.OK("编辑成功!");
 	 }
@@ -227,6 +240,7 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 		busOrderFee.setMoney(cesOrderLeaseGoods.getDeposit());
 		busOrderFee.setFeeType(FeeType.COLLECTION.getKey());
 		busOrderFee.setSubjectType(1);
+		busOrderFee.setRemark("物品押金");
 		busOrderFee.setPayType(cesOrderLeaseGoods.getPayType());
 		busOrderFee.setVipCardId(cesOrderLeaseGoods.getVipCardId());
 		busOrderFee.setAgreementUnitId(cesOrderLeaseGoods.getAgreementUnitId());

+ 3 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/LivingRoomOrderFeeJob.java

@@ -14,7 +14,7 @@ import javax.annotation.Resource;
  * todo : 基本逻辑fix 待优化处理
  */
 @Slf4j
-public class LivingRoomOrderFeeJob implements Job {
+class LivingRoomOrderFeeJob implements Job {
 
     private String parameter;
 
@@ -27,6 +27,7 @@ public class LivingRoomOrderFeeJob implements Job {
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         log.info("改房间费用订单");
-        bookingOrdersService.syncDayRoomOrder(parameter);
+//        bookingOrdersService.syncDayRoomOrder(parameter);
+        bookingOrdersService.syncRoomOverTimeOrder(parameter);
     }
 }

+ 29 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/NightAuditJob.java

@@ -0,0 +1,29 @@
+package org.jeecg.modules.quartz.job;
+
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.business.service.IBusRoomBookingOrdersService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+@Slf4j
+public class NightAuditJob implements Job {
+
+
+    private String parameter;
+
+    public void setParameter(String parameter) {
+        this.parameter = parameter;
+    }
+    @Resource
+    private IBusRoomBookingOrdersService bookingOrdersService;
+
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        log.info("时间{},酒店id:{},修改房费",new Date(),parameter);
+        bookingOrdersService.syncDayRoomFee(parameter);
+    }
+}

+ 35 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Vo/LivingContinueVo.java

@@ -0,0 +1,35 @@
+package org.jeecg.modules.rooms.Vo;
+
+import lombok.Data;
+import org.jeecg.modules.business.entity.BusBookingLayoutDayPrice;
+import org.jeecg.modules.business.entity.BusLivingLayoutDayPrice;
+import org.jeecg.modules.business.entity.BusOrderFee;
+import org.jeecg.modules.business.entity.BusRoomsLivingOrder;
+import org.jeecg.modules.rooms.entity.CesRoomLayout;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 续住接收和返回实体类,换房接收参数实体类
+ */
+@Data
+public class LivingContinueVo extends BusRoomsLivingOrder {
+    private String layoutId;
+    private String roomId;
+    private String roomName;
+    private String customerId;
+    private String customerName;
+    private String phone;
+    private List<BusLivingLayoutDayPrice> layoutDayPriceList;
+    private CesRoomLayout roomLayout;
+    //支付方式
+    private String payType;
+    //收款金额
+    private BigDecimal payMoney;
+    //续住天数
+    private Integer dayNum;
+
+    // 换房接收收款项
+    private List<BusOrderFee> orderFeeList;
+}

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesRoomsController.java

@@ -34,8 +34,10 @@ import org.jeecg.modules.business.service.IBusOrderFeeService;
 import org.jeecg.modules.business.service.IBusRoomBookingOrdersService;
 import org.jeecg.modules.business.service.IBusRoomsLivingOrderService;
 import org.jeecg.modules.business.service.IBusTeamService;
+import org.jeecg.modules.fw.entity.FwRoomClean;
 import org.jeecg.modules.fw.entity.FwRoomLock;
 import org.jeecg.modules.fw.entity.FwRoomRepair;
+import org.jeecg.modules.fw.service.IFwRoomCleanService;
 import org.jeecg.modules.fw.service.IFwRoomLockService;
 import org.jeecg.modules.fw.service.IFwRoomRepairService;
 import org.jeecg.modules.pos.entity.PosOrderGoodsPayment;
@@ -108,6 +110,9 @@ public class CesRoomsController {
     @Resource
     private IFwRoomLockService fwRoomLockService;
 
+    @Resource
+    private IFwRoomCleanService fwRoomCleanService;
+
     @ApiOperation(value="房间分页列表查询", notes="房间分页列表查询")
     @GetMapping(value = "/list")
     public Result list(CesRoomSearchDto dto){
@@ -580,5 +585,16 @@ public class CesRoomsController {
     public Result<BigDecimal> getRoomMktPrice(String roomId) {
         return Result.ok(roomsService.getRoomMktPrice(roomId));
     }
+
+    @GetMapping("/needCleanRoom")
+    public Result<List<CesRooms>> needCleanRoom(String hotelId){
+        List<CesRooms> cesRoomsList = roomsService.list(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId)
+                .eq(CesRooms::getInvalid, 0).and(e -> e.eq(CesRooms::getRoomStatus, 2).or().eq(CesRooms::getRoomStatus, 4)));
+        List<FwRoomClean> roomCleanList = fwRoomCleanService.list(Wrappers.<FwRoomClean>lambdaQuery()
+                .eq(FwRoomClean::getState, 0).eq(FwRoomClean::getHotelId, hotelId).select(FwRoomClean::getRoomId));
+        Set<String> roomIds = roomCleanList.stream().map(FwRoomClean::getRoomId).collect(Collectors.toSet());
+        List<CesRooms> cesRooms = cesRoomsList.stream().filter(e -> !roomIds.contains(e.getId())).collect(Collectors.toList());
+        return Result.ok(cesRooms);
+    }
 }
 

+ 32 - 8
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesRoomsServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,7 +17,9 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.modules.business.entity.BusBookingRooms;
 import org.jeecg.modules.business.entity.BusHotel;
+import org.jeecg.modules.business.entity.BusRoomBookingOrders;
 import org.jeecg.modules.business.enums.CheckInTypeEnum;
+import org.jeecg.modules.business.mapper.BusRoomBookingOrdersMapper;
 import org.jeecg.modules.business.service.IBusBookingRoomsService;
 import org.jeecg.modules.business.service.impl.BusHotelServiceImpl;
 import org.jeecg.modules.rooms.DTO.*;
@@ -70,6 +73,9 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
     @Resource
     private IBusBookingRoomsService bookingRoomsService;
 
+    @Resource
+    private BusRoomBookingOrdersMapper roomBookingOrdersMapper;
+
     /**
      * 查询房间
      *
@@ -306,7 +312,8 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
 
         List<CesRooms> allRooms = baseMapper.canUseRooms(param.getHotelId(), formatter.format(param.getStartOf()), formatter.format(param.getEndOf()));
-        List<AlreadyUseLayoutNumberVo> useLayoutNumbers = baseMapper.alreadyUseLayoutNumber(param.getHotelId(), param.getStartOf(), param.getEndOf());
+        // 预定未排房订单
+        //        List<AlreadyUseLayoutNumberVo> useLayoutNumbers = baseMapper.alreadyUseLayoutNumber(param.getHotelId(), param.getStartOf(), param.getEndOf());
         List<CesRoomBuildingFloor> allBuildingFloors = buildingFloorService.list(Wrappers.<CesRoomBuildingFloor>query().eq("hotelId", param.getHotelId()).eq("invalid", false));
         List<CanUseResultVo> results = new ArrayList<>();
         List<CesRoomBuildingFloor> floors = allBuildingFloors.stream().filter(s -> !s.getParentId().equals("0")).collect(Collectors.toList());
@@ -399,12 +406,12 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
                 floorVos.add(floorRoomsVo);
             });
             // 主要为了排除掉未排房数量
-            Optional<AlreadyUseLayoutNumberVo> alreadyUseLayoutNumberVo = useLayoutNumbers.stream().filter(k -> k.getLayoutId().equals(s.getId())).findAny();
-            if (alreadyUseLayoutNumberVo.isPresent()) {
-                canUseRoomCount[0] = canUseRoomCount[0] - alreadyUseLayoutNumberVo.get().getUseCount();
-                // 算法如果正确 就不需要下面这步,待检验之前步骤正确性
-                if (canUseRoomCount[0] < 0) canUseRoomCount[0] = 0;
-            }
+//            Optional<AlreadyUseLayoutNumberVo> alreadyUseLayoutNumberVo = useLayoutNumbers.stream().filter(k -> k.getLayoutId().equals(s.getId())).findAny();
+//            if (alreadyUseLayoutNumberVo.isPresent()) {
+//                canUseRoomCount[0] = canUseRoomCount[0] - alreadyUseLayoutNumberVo.get().getUseCount();
+//                // 算法如果正确 就不需要下面这步,待检验之前步骤正确性
+//                if (canUseRoomCount[0] < 0) canUseRoomCount[0] = 0;
+//            }
             s.setCanUseCount(canUseRoomCount[0]); //设置可用房间数
             item.setLayout(s);
             item.setBuildingRooms(floorVos);
@@ -446,7 +453,6 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
 
     // 如果是空间,且为今天预约,将房间状态改为预约态
     public Boolean getReserveRoom() {
-
         // 将Calendar设置为当前日期
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         Calendar calendar = Calendar.getInstance();
@@ -468,4 +474,22 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
         return updateBatchById(newCesRooms);
     }
 
+    public Boolean returnReserveRoom() {
+        List<CesRooms> roomList = list(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getRoomStatus, RoomStatusEnum.RESERVE.getKey()));
+        List<String> ids = roomList.stream().map(CesRooms::getId).collect(Collectors.toList());
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.DAY_OF_YEAR, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        List<BusRoomBookingOrders> bookingOrderList = roomBookingOrdersMapper.findBookingOrder(ids, new Date(), calendar.getTime());
+        List<String> orderIds = bookingOrderList.stream().map(BusRoomBookingOrders::getId).collect(Collectors.toList());
+        List<BusBookingRooms> bookingRoomsList = bookingRoomsService.list(Wrappers.<BusBookingRooms>lambdaQuery().in(BusBookingRooms::getBookingOrdersId, orderIds));
+        Set<String> bookingRoomIds = bookingRoomsList.stream().map(BusBookingRooms::getRoomId).collect(Collectors.toSet());
+        List<String> idList = ids.stream().filter(e -> !bookingRoomIds.contains(e)).collect(Collectors.toList());
+        UpdateWrapper<CesRooms> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.setSql("room_status = last_room_status").in("id",idList);
+        return update(updateWrapper);
+    }
+
 }

+ 2 - 0
jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/JeecgSystemApplication.java

@@ -8,6 +8,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -18,6 +19,7 @@ import java.net.UnknownHostException;
 */
 @Slf4j
 @SpringBootApplication
+@EnableScheduling
 //@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class})
 public class JeecgSystemApplication extends SpringBootServletInitializer {