浏览代码

全部结账退房,单个结账退房,部分结账,拆分房间

qh 2 年之前
父节点
当前提交
1d0ea02c1d

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

@@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.business.service.impl.BusRoomBookingOrdersServiceImpl;
 import org.jeecg.modules.business.vo.BatchOrderEditVo;
 import org.jeecg.modules.business.vo.BookingOrderEditVo;
+import org.jeecg.modules.business.vo.PartialSettleVo;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -299,17 +300,41 @@ public class BusRoomBookingOrdersController extends JeecgController<BusRoomBooki
 	 	return Result.OK(isOk);
 	 }
 
-//	 /**
-//	  * 单房结账
-//	  * @param bookingOrderId
-//	  * @return
-//	  */
-//	 @ApiOperation(value="酒店预定订单-单房结账", notes="酒店预定订单-单房结账")
-//	 @RequestMapping(value = "/settle-checkout",method = RequestMethod.POST)
-//	 public Result<Boolean> settleCheckout(@RequestBody List<BusOrderFee> fees, String bookingOrderId) {
-//		 Boolean isOk = service.settleBillCheckOut(fees,bookingOrderId);
-//		 return Result.OK(isOk);
-//	 }
+	 /**
+	  * 单房结账
+	  * @param livingOrderId
+	  * @return
+	  */
+	 @ApiOperation(value="酒店预定订单-单房结账", notes="酒店预定订单-单房结账")
+	 @RequestMapping(value = "/living-settle-checkout",method = RequestMethod.POST)
+	 public Result<Boolean> livingSettleBillCheckOut(@RequestBody List<BusOrderFee> fees, String livingOrderId) {
+		 Boolean isOk = service.livingSettleBillCheckOut(fees,livingOrderId);
+		 return Result.OK(isOk);
+	 }
+
+
+	 /**
+	  * 部分结账
+	  * @param param
+	  * @return
+	  */
+	 @ApiOperation(value="酒店预定订单-部分结账", notes="酒店预定订单-部分结账")
+	 @RequestMapping(value = "/partial-settle",method = RequestMethod.POST)
+	 public Result<Boolean> partialSettle (@RequestBody PartialSettleVo param) {
+	 	return Result.OK(service.partialSettle(param));
+	 }
+
+	 /**
+	  * 拆分房间
+	  * @param livingOrderId
+	  * @return
+	  */
+	 @ApiOperation(value="酒店预定订单-拆分房间", notes="酒店预定订单-拆分房间")
+	 @RequestMapping(value = "/split-living",method = RequestMethod.POST)
+	 public Result<Boolean> splitLiving(String livingOrderId) {
+		 Boolean isOk = service.splitLiving(livingOrderId);
+		 return Result.OK(isOk);
+	 }
 
 
  }

+ 2 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/enums/FeeSubjectType.java

@@ -9,9 +9,9 @@ public enum FeeSubjectType {
 
     YA_JIN(1,"押金"),
     YU_SHOU(2,"预收房费"),
+    MEI_RI_FANG_FEI(3,"每日房费"),
     YOU_HUI(4,"优惠金额"),
-    JIE_ZHANG(5,"结账收款"),
-    MEI_RI_FANG_FEI(3,"每日房费");
+    JIE_ZHANG(5,"结账收款");
 
     Integer key;
 

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

@@ -9,6 +9,7 @@ import org.jeecg.modules.business.entity.BusRoomBookingOrders;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.business.vo.BatchOrderEditVo;
 import org.jeecg.modules.business.vo.BookingOrderEditVo;
+import org.jeecg.modules.business.vo.PartialSettleVo;
 import org.jeecg.modules.rooms.Vo.FloorBuildingRoomVo;
 import org.jeecg.modules.rooms.entity.CesRooms;
 
@@ -51,4 +52,8 @@ public interface IBusRoomBookingOrdersService extends IService<BusRoomBookingOrd
 
     BigDecimal getOrderFeeTotal(String livingOrderId,String bookingOrderId);
     Boolean settleBillCheckOut(List<BusOrderFee> settleFees, String bookingOrderId);
+    Boolean livingSettleBillCheckOut(List<BusOrderFee> settleFees, String livingOrderId);
+    Boolean partialSettle(PartialSettleVo param);
+    Boolean splitLiving(String livingOrderId);
+
 }

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

@@ -14,10 +14,7 @@ import org.jeecg.modules.business.entity.*;
 import org.jeecg.modules.business.enums.*;
 import org.jeecg.modules.business.mapper.BusRoomBookingOrdersMapper;
 import org.jeecg.modules.business.service.*;
-import org.jeecg.modules.business.vo.BatchOrderEditVo;
-import org.jeecg.modules.business.vo.BookingBatchRoomsVo;
-import org.jeecg.modules.business.vo.BookingOrderEditVo;
-import org.jeecg.modules.business.vo.ExtendBusBookingRoomsVo;
+import org.jeecg.modules.business.vo.*;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
 import org.jeecg.modules.rooms.Vo.BookingRealtimeVo;
 import org.jeecg.modules.rooms.Vo.FloorBuildingRoomVo;
@@ -1052,45 +1049,11 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                List<BusOrderFee> feeItems = getLivingOrderFee(bookingOrderId).stream().filter(
                        s->s.getPreferentialStatus().equals(1)// 找到未结账的
                 ).collect(Collectors.toList());
-               // 消费账单
-                List<BusOrderFee> xiaoFeiFees = feeItems.stream().filter(s->s.getFeeType().equals(1)).collect(Collectors.toList());
-                // 收款
-                List<BusOrderFee> shouKuanFees = feeItems.stream().filter(s->s.getFeeType().equals(2)).collect(Collectors.toList());
-                if(settleFees.size() == 0) throw new JeecgBootException("参数错误");
-                BusOrderFee preferFeeItem = null;
-                if(settleFees.stream().anyMatch(s->s.getIsPreferential().equals(true))){
-                    preferFeeItem = settleFees.stream().filter(s->s.getIsPreferential().equals(true)).findFirst().get();
-                    if(preferFeeItem.getMoney()==null || preferFeeItem.getMoney().compareTo(BigDecimal.valueOf(0)) <= 0) throw new JeecgBootException("优惠价不能小于或等于0");
-                    preferFeeItem.setCreateTime(new Date());
-                    preferFeeItem.setSubjectType(FeeSubjectType.YOU_HUI.getKey());
-                    preferFeeItem.setFeeType(1);
-                    preferFeeItem.setRoomId(mainRoom.getRoomId());
-                    preferFeeItem.setPayType(null);
-                    preferFeeItem.setMoney(preferFeeItem.getMoney().multiply(BigDecimal.valueOf(-1)));// 消费为负数 就是优惠
-                    preferFeeItem.setLivingOrderId(mainRoomOrder.getId());
-                    preferFeeItem.setPreferentialStatus(2);
-                    feeService.save(preferFeeItem);
-                }
-
-                settleFees.forEach(s->{
-                    if(s.getIsPreferential().equals(true)) return;
-                    s.setCreateTime(new Date());
-                    s.setPreferentialStatus(2);
-                    s.setFeeType(2);
-                    s.setContactId(mainRoomOrder.getContactId());
-                    s.setLivingOrderId(mainRoomOrder.getId());
-                    s.setRoomId(mainRoom.getRoomId());
-                    s.setSubjectType(FeeSubjectType.JIE_ZHANG.getKey());
-                });
-
-                List<BusOrderFee> jiezhangFees = settleFees.stream().filter(s->s.getIsPreferential() == null || s.getIsPreferential().equals(false)).collect(Collectors.toList());
-                if(jiezhangFees.size() > 0) {
-                    feeService.saveBatch(jiezhangFees);
-                } else throw new JeecgBootException("参数没有结账收费项目");
-                feeItems.forEach(s->{
-                    s.setPreferentialStatus(2);
-                });
-                feeService.updateBatchById(feeItems);
+//               // 消费账单
+//                List<BusOrderFee> xiaoFeiFees = feeItems.stream().filter(s->s.getFeeType().equals(1)).collect(Collectors.toList());
+//                // 收款
+//                List<BusOrderFee> shouKuanFees = feeItems.stream().filter(s->s.getFeeType().equals(2)).collect(Collectors.toList());
+                settleFee(mainRoom, mainRoomOrder, feeItems, settleFees);
                 List<CesRooms> baseRooms = roomsService.list(Wrappers.<CesRooms>query()
                 .in("living_order_id",livingOrders.stream().map(s->s.getId()).collect(Collectors.toList()))
                 );
@@ -1101,14 +1064,127 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     });
                     roomsService.updateBatchById(baseRooms);
                 }
+                return true;
                 // todo 对账
             } else throw new JeecgBootException("未找到任何入住订单");
-        } else {
+        } throw new JeecgBootException("参数错误");
+
+    }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean livingSettleBillCheckOut(List<BusOrderFee> settleFees, String livingOrderId) {
+        if(livingOrderId == null || livingOrderId.isEmpty()) throw new JeecgBootException("参数错误");
+        BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getOne(Wrappers.<BusRoomsLivingOrder>query()
+                .eq("id",livingOrderId));
+        if(livingOrder == null) throw new JeecgBootException("未找到任何入住订单");
+        BusBookingRooms mainRoom = bookingRoomsService.getOne(Wrappers.<BusBookingRooms>query()
+                .eq("id",livingOrder.getBookingRoomId()));
+        if(mainRoom.getIsMain().equals(true)) throw new JeecgBootException("主房不能单独结账退房");
+        if(mainRoom == null) throw new JeecgBootException("没有找到主房");
+
+        BusRoomsLivingOrder mainRoomOrder = livingOrder;
+
+
+        List<BusOrderFee> feeItems = getLivingOrderFees(livingOrderId).stream().filter(
+                s->s.getPreferentialStatus().equals(1)// 找到未结账的
+        ).collect(Collectors.toList());
+//        // 消费账单
+//        List<BusOrderFee> xiaoFeiFees = feeItems.stream().filter(s->s.getFeeType().equals(1)).collect(Collectors.toList());
+//        // 收款
+//        List<BusOrderFee> shouKuanFees = feeItems.stream().filter(s->s.getFeeType().equals(2)).collect(Collectors.toList());
+        settleFee(mainRoom, mainRoomOrder, feeItems, settleFees);
+        List<CesRooms> baseRooms = roomsService.list(Wrappers.<CesRooms>query()
+                .eq("living_order_id",livingOrderId)
+        );
+        if(baseRooms.size() > 0) {
+            baseRooms.forEach(s->{
+                s.setRoomStatus(RoomStatusEnum.EMPTY_DIRTY.getKey());
+                s.setLivingOrderId(null);
+            });
+            roomsService.updateBatchById(baseRooms);
         }
         return true;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean partialSettle(PartialSettleVo param){
+        BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(param.getLivingOrderId());
+        if(livingOrder == null) throw new JeecgBootException("未找到任何入住订单");
+        BusBookingRooms mainRoom = bookingRoomsService.getOne(Wrappers.<BusBookingRooms>query()
+                .eq("id",livingOrder.getBookingRoomId()));
+        if(mainRoom == null) throw new JeecgBootException("没有找到主房");
+
+        BusRoomsLivingOrder mainRoomOrder = livingOrder;
+        List<BusOrderFee> feeItems = getLivingOrderFees(param.getLivingOrderId()).stream().filter(
+                s->s.getPreferentialStatus().equals(1) // 找到未结账的
+                && param.getSelectedFeeIds().contains(s.getId()) // 找到要结账的项目
+        ).collect(Collectors.toList());
+        List<BusOrderFee> settleFees = param.getFees();
+        settleFee(mainRoom, mainRoomOrder, feeItems, settleFees);
+        return  true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean splitLiving(String livingOrderId) {
+        BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(livingOrderId);
+        if(livingOrder == null) throw new JeecgBootException("订单不存在");
+        BusBookingRooms bookingRoom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
+        if(bookingRoom == null) throw new JeecgBootException("订单房间不存在");
+        BusRoomBookingOrders newBookingOrder = copyBookingToAcceptOrder(livingOrder);
+        save(newBookingOrder);
+        livingOrder.setBookingOrderId(newBookingOrder.getId());
+        roomsLivingOrderService.updateById(livingOrder);
+        bookingRoom.setBookingOrdersId(newBookingOrder.getId());
+        bookingRoomsService.updateById(bookingRoom);
+        return true;
+    }
+
+    private void settleFee(BusBookingRooms mainRoom, BusRoomsLivingOrder mainRoomOrder, List<BusOrderFee> feeItems, List<BusOrderFee> settleFees) {
+        if(settleFees.size() == 0) throw new JeecgBootException("参数错误");
+        BusOrderFee preferFeeItem = null;
+        if(settleFees.stream().anyMatch(s->s.getIsPreferential().equals(true))){
+            preferFeeItem = settleFees.stream().filter(s->s.getIsPreferential().equals(true)).findFirst().get();
+            if(preferFeeItem.getMoney()==null || preferFeeItem.getMoney().compareTo(BigDecimal.valueOf(0)) <= 0) throw new JeecgBootException("优惠价不能小于或等于0");
+            preferFeeItem.setCreateTime(new Date());
+            preferFeeItem.setSubjectType(FeeSubjectType.YOU_HUI.getKey());
+            preferFeeItem.setFeeType(1);
+            preferFeeItem.setRoomId(mainRoom.getRoomId());
+            preferFeeItem.setPayType(null);
+            preferFeeItem.setMoney(preferFeeItem.getMoney().multiply(BigDecimal.valueOf(-1)));// 消费为负数 就是优惠
+            preferFeeItem.setLivingOrderId(mainRoomOrder.getId());
+            preferFeeItem.setPreferentialStatus(2);
+            feeService.save(preferFeeItem);
+        }
+
+        settleFees.forEach(s->{
+            if(s.getIsPreferential().equals(true)) return;
+            s.setCreateTime(new Date());
+            s.setPreferentialStatus(2);
+            s.setFeeType(2);
+            s.setContactId(mainRoomOrder.getContactId());
+            s.setLivingOrderId(mainRoomOrder.getId());
+            s.setRoomId(mainRoom.getRoomId());
+            s.setSubjectType(FeeSubjectType.JIE_ZHANG.getKey());
+        });
+
+        List<BusOrderFee> jiezhangFees = settleFees.stream().filter(s->s.getIsPreferential() == null || s.getIsPreferential().equals(false)).collect(Collectors.toList());
+        if(jiezhangFees.size() > 0) {
+            feeService.saveBatch(jiezhangFees);
+        } else throw new JeecgBootException("参数没有结账收费项目");
+        feeItems.forEach(s->{
+            s.setPreferentialStatus(2);
+        });
+        feeService.updateBatchById(feeItems);
+    }
+
+    private List<BusOrderFee> getLivingOrderFees(String livingOrderId) {
+        return feeService.list(Wrappers.<BusOrderFee>query()
+        .eq("living_order_id",livingOrderId));
+    }
+
     private Map<String,String> bookingRoomToLiving(BookingOrderSaveDto livingData, List<ExtendBusBookingRoomsVo> roomIds, BookingOrderEditVo bookingOrderVo) {
         Map<String,String> results = new HashMap<>();
 
@@ -1201,6 +1277,41 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         return livingOrder;
     }
 
+    private BusRoomBookingOrders  copyBookingToAcceptOrder(BusRoomsLivingOrder  bkOrder) {
+        BusRoomBookingOrders livingOrder = new BusRoomBookingOrders();
+        livingOrder.setAgencyName(bkOrder.getAgencyName());
+        livingOrder.setArrivalTime(bkOrder.getArrivalTime());
+        livingOrder.setBreakfastNum(bkOrder.getBreakfastNum());
+        livingOrder.setContactId(bkOrder.getContactId());
+        livingOrder.setCreateTime(new Date());
+        livingOrder.setCreateUser("");
+        livingOrder.setCustomerSource(bkOrder.getCustomerSource());
+        livingOrder.setBookingOrdersType(bkOrder.getLivingOrdersType());
+        livingOrder.setBookingType(bkOrder.getLivingType());
+        livingOrder.setOuterOrdersNo(bkOrder.getOuterOrdersNo());
+        livingOrder.setContractTeamId(bkOrder.getContractTeamId());
+        livingOrder.setContractTeamProtocolId(bkOrder.getContractTeamProtocolId());
+        livingOrder.setDayCount(bkOrder.getDayCount());
+        livingOrder.setCustomerType(bkOrder.getCustomerType());
+        livingOrder.setDinnerNum(bkOrder.getDinnerNum());
+        livingOrder.setLunchNum(bkOrder.getLunchNum());
+        livingOrder.setDueOutTime(bkOrder.getDueOutTime());
+        livingOrder.setHourRoomId(bkOrder.getHourRoomId());
+        livingOrder.setWarranter(bkOrder.getWarranter());
+        livingOrder.setWarrantType(bkOrder.getWarrantType());
+        livingOrder.setVipCustomerId(bkOrder.getVipCustomerId());
+        livingOrder.setTeamName(bkOrder.getTeamName());
+        livingOrder.setTeamTypeDicId(bkOrder.getTeamTypeDicId());
+        livingOrder.setRoomPriceSlnId(bkOrder.getRoomPriceSlnId());
+        livingOrder.setLeaderName(bkOrder.getLeaderName());
+        livingOrder.setPublicConsumeFee(bkOrder.getPublicConsumeFee());
+        livingOrder.setPublicMeetingFee(bkOrder.getPublicMeetingFee());
+        livingOrder.setPublicVipFee(bkOrder.getPublicVipFee());
+        livingOrder.setPublicRoomFee(bkOrder.getPublicRoomFee());
+        livingOrder.setTeamPeopleNumber(bkOrder.getTeamPeopleNumber());
+        return livingOrder;
+    }
+
     private BusRoomsLivingOrder copyBookingToAcceptOrder(BusBookingBatch bkOrder, BusRoomBookingOrders bookingOrder) {
         BusRoomsLivingOrder livingOrder = new BusRoomsLivingOrder();
         livingOrder.setAgencyName(bkOrder.getAgencyName());

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

@@ -0,0 +1,13 @@
+package org.jeecg.modules.business.vo;
+
+import lombok.Data;
+import org.jeecg.modules.business.entity.BusOrderFee;
+
+import java.util.List;
+
+@Data
+public class PartialSettleVo {
+    private List<BusOrderFee> fees;
+    private List<String> selectedFeeIds;
+    private String livingOrderId;
+}