gqx 2 vuotta sitten
vanhempi
commit
f288d6599a

+ 59 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/finance/controller/SummaryController.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.finance.controller;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,17 +11,27 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.dto.MobileDto;
+import org.jeecg.modules.business.entity.BusOrderFee;
+import org.jeecg.modules.business.entity.BusRoomBookingOrders;
+import org.jeecg.modules.business.entity.BusRoomsLivingOrder;
 import org.jeecg.modules.business.entity.BusWaiter;
+import org.jeecg.modules.business.enums.FeeSubjectType;
+import org.jeecg.modules.business.service.IBusOrderFeeService;
+import org.jeecg.modules.business.service.IBusRoomsLivingOrderService;
 import org.jeecg.modules.business.service.IBusWaiterService;
 import org.jeecg.modules.finance.service.ISummaryService;
+import org.jeecg.modules.finance.vo.OrderFeeVo;
 import org.jeecg.modules.fw.dto.RoomCleanDto;
 import org.jeecg.modules.fw.entity.FwRoomClean;
 import org.jeecg.modules.fw.service.IFwRoomCleanService;
+import org.jeecg.modules.kc.enums.StorageEnum;
 import org.jeecg.modules.pos.entity.PosOrderGoodsPayment;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
 import org.jeecg.modules.rooms.entity.CesRoomLayoutPriceDate;
@@ -31,11 +42,15 @@ import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
+import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 收款统计
@@ -48,9 +63,10 @@ import java.util.HashMap;
 @RequestMapping("/finance/summary")
 @Slf4j
 public class SummaryController {
-	@Autowired
+	@Resource
 	private ISummaryService summaryService;
-
+	@Resource
+	private IBusOrderFeeService busOrderFeeService;
 	/**
 	 * 收款汇总统计
 	 *
@@ -100,4 +116,42 @@ public class SummaryController {
 		IPage<HashMap<String, Object>> pageList = summaryService.financePageList(page, posOrderGoodsPayment.getHotelId(), startTime, endTime, departmentId);
 		return Result.OK(pageList);
 	}
+
+	@ApiOperation(value = "当天收入统计", notes = "当天收入统计")
+	@GetMapping(value = "/currentDayFinanceSummary")
+	public Result getCurrentDayFinanceSummary(@RequestParam String hotelId) {
+		if (StringUtils.isBlank(hotelId)) {
+			return Result.error("请传入酒店id");
+		}
+		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+		Calendar calendar = new GregorianCalendar();
+		calendar.setTime(DateTime.now());
+		calendar.add(Calendar.DATE, 1);
+		String dateString = formatter.format(calendar.getTime());
+
+		LambdaQueryWrapper<BusOrderFee> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper2.eq(BusOrderFee::getHotelId, hotelId);
+		lambdaQueryWrapper2.eq(BusOrderFee::getFeeType, 2);
+		lambdaQueryWrapper2.ge(BusOrderFee::getCreateTime, LocalDate.now());
+		lambdaQueryWrapper2.le(BusOrderFee::getCreateTime, DateUtil.parseDate(dateString));
+		List<BusOrderFee> busOrderFees = busOrderFeeService.list(lambdaQueryWrapper2);
+		Map<Integer, List<BusOrderFee>> map = busOrderFees.stream().collect(Collectors.groupingBy(t -> t.getSubjectType()));
+
+		List<OrderFeeVo> data = new ArrayList<>();
+		BigDecimal sum = BigDecimal.ZERO;
+		for (Integer key : map.keySet()) {
+			OrderFeeVo vo = new OrderFeeVo();
+			FeeSubjectType feeSubjectType = FeeSubjectType.val(key);
+			if (feeSubjectType != null) {
+				vo.setName(feeSubjectType.getTitle());
+			}
+			List<BusOrderFee> busOrderFees1 = map.get(key);
+			for (BusOrderFee busOrderFee : busOrderFees1) {
+				sum = sum.add(busOrderFee.getMoney());
+			}
+			vo.setAmount(sum);
+			data.add(vo);
+		}
+		return Result.OK(data);
+	}
 }

+ 12 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/finance/vo/OrderFeeVo.java

@@ -0,0 +1,12 @@
+package org.jeecg.modules.finance.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class OrderFeeVo {
+    private String name;
+    private BigDecimal amount;
+}

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/controller/KcStockDetailController.java

@@ -93,7 +93,7 @@ public class KcStockDetailController extends JeecgController<KcStockDetail, IKcS
 		}
 		for (KcStockDetail record : pageList.getRecords()) {
 			if (kcStock != null) {
-				if (kcStock.getType().equals(1)) {
+				if (kcStock.getType().equals(1)||kcStock.getType().equals(3)) {
 					KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getById(record.getSupplierInGoodsId());
 					if (kcDepositoryInGoods != null) {
 						record.setStockNum(kcDepositoryInGoods.getNum());

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

@@ -10,4 +10,6 @@ public class CesGoodsVo extends CesGoods {
     private String typeName;
 
     private String unitName;
+
+    private String stockGoodsName;
 }

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

@@ -0,0 +1,9 @@
+package org.jeecg.modules.rooms.Vo;
+
+import lombok.Data;
+
+@Data
+public class LivingSourceStatVo {
+    private String name;
+    private Integer count;
+}

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

@@ -2,9 +2,14 @@ package org.jeecg.modules.rooms.controller;
 
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.EnumUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Data;
@@ -16,12 +21,17 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.business.entity.BusOrderFee;
 import org.jeecg.modules.business.entity.BusRoomBookingOrders;
 import org.jeecg.modules.business.entity.BusRoomsLivingOrder;
 import org.jeecg.modules.business.entity.BusTeam;
+import org.jeecg.modules.business.enums.FeeSubjectType;
+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.FwRoomLock;
+import org.jeecg.modules.pos.entity.PosOrderGoodsPayment;
 import org.jeecg.modules.rooms.DTO.*;
 import org.jeecg.modules.rooms.Enum.CouponEnums;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
@@ -31,14 +41,22 @@ import org.jeecg.modules.rooms.Vo.FloorWithBuildingVo;
 import org.jeecg.modules.rooms.entity.CesRoomLayout;
 import org.jeecg.modules.rooms.entity.CesRooms;
 import org.jeecg.modules.rooms.service.CesRoomBuildingFloorServiceImpl;
+import org.jeecg.modules.rooms.service.CesRoomLayoutPriceServiceImpl;
 import org.jeecg.modules.rooms.service.CesRoomLayoutServiceImpl;
 import org.jeecg.modules.rooms.service.CesRoomsServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 
 import org.springframework.stereotype.Controller;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -70,6 +88,13 @@ public class CesRoomsController {
     @Resource
     private IBusTeamService teamService;
 
+    @Resource
+   private IBusOrderFeeService busOrderFeeService;
+    @Resource
+    private IBusRoomsLivingOrderService busRoomsLivingOrderService;
+    @Resource
+    private IBusRoomBookingOrdersService busRoomBookingOrdersService;
+
 
     @ApiOperation(value="房间分页列表查询", notes="房间分页列表查询")
     @GetMapping(value = "/list")
@@ -378,5 +403,103 @@ public class CesRoomsController {
         }
         return Result.OK("房间置脏成功!");
     }
+
+    @ApiOperation(value = "房间统计", notes = "房间统计")
+    @GetMapping(value = "/roomSummary")
+    public Result getRoomSummary(@RequestParam String hotelId) {
+        if (StringUtils.isBlank(hotelId)) {
+            return Result.error("请传入酒店id");
+        }
+        LambdaQueryWrapper<CesRooms> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(CesRooms::getHotelId, hotelId);
+        lambdaQueryWrapper.eq(CesRooms::getInvalid, false);
+        lambdaQueryWrapper.and(j -> {
+            j.or().eq(CesRooms::getRoomStatus, RoomStatusEnum.LIVE_DIRTY.getKey());
+            j.or().eq(CesRooms::getRoomStatus, RoomStatusEnum.LIVE_CLEAR.getKey());
+        });
+        Long liveCount = roomsService.count(lambdaQueryWrapper);
+
+        lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(CesRooms::getHotelId, hotelId);
+        lambdaQueryWrapper.eq(CesRooms::getInvalid, false);
+        Long count = roomsService.count(lambdaQueryWrapper);
+        List<Long> counts = new ArrayList<>();
+        counts.add(count);//房间总数
+        counts.add(liveCount);//在住总数
+
+        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(DateTime.now());
+        calendar.add(Calendar.DATE, 1);
+        String dateString = formatter.format(calendar.getTime());
+
+        LambdaQueryWrapper<BusOrderFee> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper2.eq(BusOrderFee::getHotelId, hotelId);
+        lambdaQueryWrapper2.eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey());
+        lambdaQueryWrapper2.ge(BusOrderFee::getCreateTime, LocalDate.now());
+        lambdaQueryWrapper2.le(BusOrderFee::getCreateTime, DateUtil.parseDate(dateString));
+        List<BusOrderFee> busOrderFees = busOrderFeeService.list(lambdaQueryWrapper2);
+        BigDecimal sum = BigDecimal.ZERO;
+        for (BusOrderFee busOrderFee : busOrderFees) {
+            sum = sum.add(busOrderFee.getMoney());
+        }
+        if(busOrderFees.size()>0) {
+            Long divide = sum.divide(new BigDecimal(busOrderFees.size()), 6, RoundingMode.HALF_UP).longValue();
+            counts.add(divide);//今日平均房价
+        }
+        else{
+            counts.add(Long.valueOf(0));//今日平均房价
+        }
+        LambdaQueryWrapper<BusRoomsLivingOrder> lambdaQueryWrapper3 = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper3.ge(BusRoomsLivingOrder::getDueOutTime, LocalDate.now());
+        lambdaQueryWrapper3.le(BusRoomsLivingOrder::getDueOutTime, DateUtil.parseDate(dateString));
+        Long ylCount = busRoomsLivingOrderService.count(lambdaQueryWrapper3);
+        counts.add(ylCount);//今日预离
+
+        LambdaQueryWrapper<BusRoomBookingOrders> lambdaQueryWrapper4 = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper4.ge(BusRoomBookingOrders::getArrivalTime, LocalDate.now());
+        lambdaQueryWrapper4.le(BusRoomBookingOrders::getArrivalTime, DateUtil.parseDate(dateString));
+        Long ydCount = busRoomBookingOrdersService.count(lambdaQueryWrapper4);
+        counts.add(ydCount);//今日预抵
+
+        LambdaQueryWrapper<BusRoomsLivingOrder> lambdaQueryWrapper5 = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper5.and(j->{
+            j.or().eq(BusRoomsLivingOrder::getSettleType,-1);
+            j.or().eq(BusRoomsLivingOrder::getSettleType,2);
+        });
+        lambdaQueryWrapper5.ge(BusRoomsLivingOrder::getDueOutTime, LocalDate.now());
+        lambdaQueryWrapper5.le(BusRoomsLivingOrder::getDueOutTime, DateUtil.parseDate(dateString));
+        Long qfCount = busRoomsLivingOrderService.count(lambdaQueryWrapper5);
+        counts.add(qfCount);//今日欠费
+
+        LambdaQueryWrapper<CesRooms> lambdaQueryWrapper6 = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper6.eq(CesRooms::getHotelId, hotelId);
+        lambdaQueryWrapper6.eq(CesRooms::getInvalid, false);
+        lambdaQueryWrapper.and(j -> {
+            j.or().eq(CesRooms::getRoomStatus, RoomStatusEnum.LIVE_DIRTY.getKey());
+            j.or().eq(CesRooms::getRoomStatus, RoomStatusEnum.EMPTY_DIRTY.getKey());
+        });
+        Long zfCount = roomsService.count(lambdaQueryWrapper6);
+        counts.add(zfCount);//脏房
+        return Result.OK(counts);
+    }
+
+    @ApiOperation(value = "在住来源统计", notes = "在住来源统计")
+    @GetMapping(value = "/livingSourceStat")
+    public Result getLivingSourceStat(@RequestParam String hotelId) {
+        if (StringUtils.isBlank(hotelId)) {
+            return Result.error("请传入酒店id");
+        }
+        return Result.ok(roomsService.livingSourceStat(hotelId));
+    }
+
+    @ApiOperation(value = "房态统计", notes = "房态统计")
+    @GetMapping(value = "/roomLiveStat")
+    public Result getRoomLiveStat(@RequestParam String hotelId) {
+        if (StringUtils.isBlank(hotelId)) {
+            return Result.error("请传入酒店id");
+        }
+        return Result.ok(roomsService.roomLiveStat(hotelId));
+    }
 }
 

+ 9 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoods.java

@@ -157,6 +157,15 @@ public class CesGoods extends Model<CesGoods> {
 
     private Boolean isTemp;
 
+    /**
+     * 仓库商品id
+     */
+    private String depositoryInGoodsId;
+    /**
+     * 启用库存模块
+     */
+    private Boolean isStock;
+
     public static final String ID = "id";
 
     public static final String HOTEL_ID = "hotel_id";

+ 44 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesRoomsMapper.java

@@ -1,11 +1,16 @@
 package org.jeecg.modules.rooms.mapper;
 
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.rooms.Vo.AlreadyUseLayoutNumberVo;
+import org.jeecg.modules.rooms.Vo.LivingSourceStatVo;
 import org.jeecg.modules.rooms.entity.CesRooms;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -20,4 +25,43 @@ public interface CesRoomsMapper extends BaseMapper<CesRooms> {
 
     List<CesRooms> canUseRooms(String hotelId, Date startOf, Date endOf);
     List<AlreadyUseLayoutNumberVo> alreadyUseLayoutNumber(String hotelId, Date startOf, Date endOf);
+
+    /**
+     * 在住来源分组统计
+     * @param hotelId
+     * @return
+     */
+    @Select("<script>select max(source.item_text) as name ,count(0) as count\n" +
+            "from bus_dict_item_info source\n" +
+            "left join\n" +
+            "(SELECT * FROM\n" +
+            "(\n" +
+            "select x.*,@rownum:=@rownum+1,if(@part=x.room_id,@r:=@r+1,@r:=1) as rank,@part:=x.room_id from (\n" +
+            "select e.id,e.create_time,e.booking_order_id,broom.room_id,e.customer_source from bus_rooms_living_order e\n" +
+            "inner join bus_booking_rooms broom on broom.booking_orders_id=e.booking_order_id\n" +
+            "order by broom.room_id desc,e.create_time desc\n" +
+            ") x,(select @rownum:=0,@part:=null,@r:=0) rt\n" +
+            ") tmp\n" +
+            "where tmp.rank=1) rlo on rlo.customer_source=source.id\n" +
+            "left join bus_booking_rooms broom on broom.booking_orders_id=rlo.booking_order_id\n" +
+            "left join ces_rooms room on room.id=broom.room_id\n" +
+            "where source.dict_id='1639538915239743490'\n" +
+            "<if test='hotelId != null and hotelId !=\"\"'> and room.hotel_id = #{hotelId} </if>"+
+            "and (room.room_status=3 or room.room_status=4)\n" +
+            "group by source.id</script>")
+    public List<LivingSourceStatVo> livingSourceStat(@Param("hotelId") String hotelId);
+
+
+    /**
+     * 房态统计
+     * @param hotelId
+     * @return
+     */
+    @Select("<script>select\n" +
+            "(case room_status when 1 then '空净' when 2 then '空脏' when 3 then '住净' when 4 then '住脏' when 5 then '维修' when 6  then '锁房' else '' end) as name,\n" +
+            "count(0) as count\n" +
+            "from ces_rooms where 1=1\n" +
+            "<if test='hotelId != null and hotelId !=\"\"'> and hotel_id = #{hotelId} </if>"+
+            "group by room_status</script>")
+    public List<LivingSourceStatVo> roomLiveStat(@Param("hotelId") String hotelId);
 }

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

@@ -16,6 +16,10 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.CommonUtils;
 import org.jeecg.modules.business.entity.BusHotel;
 import org.jeecg.modules.business.service.impl.BusHotelServiceImpl;
+import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
+import org.jeecg.modules.kc.entity.KcGoods;
+import org.jeecg.modules.kc.service.impl.KcDepositoryInGoodsServiceImpl;
+import org.jeecg.modules.kc.service.impl.KcGoodsServiceImpl;
 import org.jeecg.modules.rooms.DTO.CesGoodsDelDto;
 import org.jeecg.modules.rooms.DTO.CesGoodsDto;
 import org.jeecg.modules.rooms.DTO.CesGoodsSearchDto;
@@ -60,53 +64,65 @@ public class CesGoodsServiceImpl extends ServiceImpl<CesGoodsMapper, CesGoods> i
 
     @Resource
     private CesGoodsSpecsServiceImpl specsService;
-
+@Resource
+private KcDepositoryInGoodsServiceImpl kcDepositoryInGoodsService;
+@Resource
+private KcGoodsServiceImpl kcGoodsService;
 
     /**
      * 查询商品库存
      * @param dto
      * @return
      */
-    public Result fetchList(CesGoodsSearchDto dto){
+    public Result fetchList(CesGoodsSearchDto dto) {
         QueryWrapper<CesGoods> queryWrapper = new QueryWrapper<>();
-        if(!StringUtils.isBlank(dto.getSearch())){
+        if (!StringUtils.isBlank(dto.getSearch())) {
             String search = CommonUtils.escapeChar(dto.getSearch());
             queryWrapper.like(CesGoods.BAR_CODE, search);
-            queryWrapper.like(CesGoods.NAME,search);
+            queryWrapper.like(CesGoods.NAME, search);
         }
-        queryWrapper.eq(CesGoods.HOTEL_ID,dto.getHotelId());
-        queryWrapper.eq(CesGoods.INVALID,false);
+        queryWrapper.eq(CesGoods.HOTEL_ID, dto.getHotelId());
+        queryWrapper.eq(CesGoods.INVALID, false);
         queryWrapper.orderByDesc(CesGoods.CREATAT);
 
-        IPage<CesGoods> dataPage = goodsMapper.selectPage(new Page<>(dto.getPageNo().intValue(),dto .getPageSize().intValue()),queryWrapper);
+        IPage<CesGoods> dataPage = goodsMapper.selectPage(new Page<>(dto.getPageNo().intValue(), dto.getPageSize().intValue()), queryWrapper);
         List<CesGoods> result = dataPage.getRecords();
         List<String> hotelIds = result.stream().map(v -> v.getHotelId()).collect(Collectors.toList());
         List<BusHotel> hotels = busHotelService.findHotelsByIds(hotelIds);
         List<String> typeIds = result.stream().map(v -> v.getGoodType()).collect(Collectors.toList());
         List<CesStockType> typeList = stockTypeService.fetchByIds(typeIds);
         List<String> unitIds = result.stream().map(v -> v.getGoodUnit()).collect(Collectors.toList());
-        List<CesGoodsUnit> unitList =  goodsUnitService.fetchByIds(unitIds);
+        List<CesGoodsUnit> unitList = goodsUnitService.fetchByIds(unitIds);
         List<CesGoodsVo> voList = new ArrayList<>();
-        result.forEach( v -> {
+        result.forEach(v -> {
             CesGoodsVo vo = new CesGoodsVo();
-            BeanUtil.copyProperties(v,vo);
+            BeanUtil.copyProperties(v, vo);
             Optional<BusHotel> busHotelOptional = hotels.stream().filter(c -> c.getId().equals(v.getHotelId())).findFirst();
-            if(busHotelOptional.isPresent()){
+            if (busHotelOptional.isPresent()) {
                 vo.setHotelName(busHotelOptional.get().getName());
             }
             Optional<CesStockType> typeOptional = typeList.stream().filter(c -> c.getId().equals(v.getGoodType())).findFirst();
-            if(typeOptional.isPresent()){
+            if (typeOptional.isPresent()) {
                 vo.setTypeName(typeOptional.get().getName());
             }
             Optional<CesGoodsUnit> unitOptional = unitList.stream().filter(c -> c.getId().equals(v.getGoodUnit())).findFirst();
-            if(unitOptional.isPresent()){
+            if (unitOptional.isPresent()) {
                 vo.setUnitName(unitOptional.get().getName());
             }
+            if (v.getIsStock() && ObjectUtils.isNotEmpty(v.getDepositoryInGoodsId())) {
+                KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getById(v.getDepositoryInGoodsId());
+                if (kcDepositoryInGoods != null) {
+                    KcGoods kcGoods = kcGoodsService.getById(kcDepositoryInGoods.getGoodsId());
+                    if (kcGoods != null) {
+                        vo.setStockGoodsName(kcGoods.getName());
+                    }
+                }
+            }
             voList.add(vo);
         });
-        Map<String,Object> map = new HashedMap();
-        map.put("records",voList);
-        map.put("total",dataPage.getTotal());
+        Map<String, Object> map = new HashedMap();
+        map.put("records", voList);
+        map.put("total", dataPage.getTotal());
         return Result.OK(map);
     }
 

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

@@ -4,9 +4,11 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.lang.tree.TreeNode;
 import cn.hutool.core.lang.tree.TreeUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -16,10 +18,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.collections.map.HashedMap;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.Param;
 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.BusRoomPayType;
 import org.jeecg.modules.business.enums.BookingOrdersType;
 import org.jeecg.modules.business.enums.CheckInTypeEnum;
 import org.jeecg.modules.business.service.IBusBookingRoomsService;
@@ -27,10 +31,7 @@ import org.jeecg.modules.business.service.impl.BusHotelServiceImpl;
 import org.jeecg.modules.rooms.DTO.*;
 import org.jeecg.modules.rooms.Enum.CouponEnums;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
-import org.jeecg.modules.rooms.Vo.AlreadyUseLayoutNumberVo;
-import org.jeecg.modules.rooms.Vo.CanUseBuildingRoomsVo;
-import org.jeecg.modules.rooms.Vo.CanUseResultVo;
-import org.jeecg.modules.rooms.Vo.CesRoomsVo;
+import org.jeecg.modules.rooms.Vo.*;
 import org.jeecg.modules.rooms.entity.*;
 import org.jeecg.modules.rooms.mapper.CesRoomsMapper;
 import org.springframework.stereotype.Service;
@@ -54,13 +55,13 @@ import java.util.stream.Collectors;
 public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> implements IService<CesRooms> {
 
     @Resource
-    private  CesRoomsMapper roomsMapper;
+    private CesRoomsMapper roomsMapper;
 
     @Resource
     private BusHotelServiceImpl busHotelService;
 
     @Resource
-    private  CesRoomBuildingFloorServiceImpl buildingFloorService;
+    private CesRoomBuildingFloorServiceImpl buildingFloorService;
 
     @Resource
     private CesRoomLayoutServiceImpl layoutService;
@@ -76,69 +77,71 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
 
     /**
      * 查询房间
+     *
      * @param dto
      * @return
      */
-    public Result list(CesRoomSearchDto dto){
+    public Result list(CesRoomSearchDto dto) {
 
         QueryWrapper<CesRooms> queryWrapper = new QueryWrapper<>();
-        if(!StringUtils.isBlank(dto.getBuildId())){
-            queryWrapper.eq(CesRooms.BUILD_ID,dto.getBuildId());
+        if (!StringUtils.isBlank(dto.getBuildId())) {
+            queryWrapper.eq(CesRooms.BUILD_ID, dto.getBuildId());
         }
-        if(!StringUtils.isBlank(dto.getFloorId())){
-            queryWrapper.eq(CesRooms.FLOOR_ID,dto.getFloorId());
+        if (!StringUtils.isBlank(dto.getFloorId())) {
+            queryWrapper.eq(CesRooms.FLOOR_ID, dto.getFloorId());
         }
-        if(!StringUtils.isBlank(dto.getHotelId())){
+        if (!StringUtils.isBlank(dto.getHotelId())) {
 //           List<String> hotelIds = Arrays.stream(dto.getHotelId().split(",")).collect(Collectors.toList());
-           queryWrapper.eq(CesRooms.HOTEL_ID, dto.getHotelId());
+            queryWrapper.eq(CesRooms.HOTEL_ID, dto.getHotelId());
         }
-        queryWrapper.eq(CesRooms.INVALID,false);
+        queryWrapper.eq(CesRooms.INVALID, false);
         queryWrapper.orderByDesc(CesRooms.SORT, CesRooms.CREATEAT);
-        IPage<CesRooms> dataPage = roomsMapper.selectPage(new Page<>(dto.getPageNo().intValue(),dto.getPageSize().intValue()),queryWrapper);
+        IPage<CesRooms> dataPage = roomsMapper.selectPage(new Page<>(dto.getPageNo().intValue(), dto.getPageSize().intValue()), queryWrapper);
         List<CesRooms> records = dataPage.getRecords();
-        Map<String,Object> map = new HashedMap();
+        Map<String, Object> map = new HashedMap();
 
-        if(!CollectionUtil.isEmpty(records)){
+        if (!CollectionUtil.isEmpty(records)) {
 
-          List<String>  hotelIds = records.stream().map(v -> v.getHotelId()).collect(Collectors.toList());
-          List<String>  buildIds = records.stream().map(v -> v.getBuildId()).collect(Collectors.toList());
-          List<String>  floorIds = records.stream().map(v -> v.getFloorId()).collect(Collectors.toList());
+            List<String> hotelIds = records.stream().map(v -> v.getHotelId()).collect(Collectors.toList());
+            List<String> buildIds = records.stream().map(v -> v.getBuildId()).collect(Collectors.toList());
+            List<String> floorIds = records.stream().map(v -> v.getFloorId()).collect(Collectors.toList());
 
-          List<BusHotel> busHotels = busHotelService.findHotelsByIds(hotelIds);
-          buildIds.addAll(floorIds);
-          List<CesRoomBuildingFloor> buildingFloors = buildingFloorService.getBuildFloorsByIds(buildIds);
+            List<BusHotel> busHotels = busHotelService.findHotelsByIds(hotelIds);
+            buildIds.addAll(floorIds);
+            List<CesRoomBuildingFloor> buildingFloors = buildingFloorService.getBuildFloorsByIds(buildIds);
 
-          List<CesRoomsVo> result = new ArrayList<>();
+            List<CesRoomsVo> result = new ArrayList<>();
 
-          records.forEach(v -> {
-              CesRoomsVo vo = new CesRoomsVo();
-              BeanUtil.copyProperties(v,vo);
+            records.forEach(v -> {
+                CesRoomsVo vo = new CesRoomsVo();
+                BeanUtil.copyProperties(v, vo);
 
-              Optional<BusHotel> hotelOptional = busHotels.stream().filter(h -> h.getId().equals(v.getHotelId())).findFirst();
-              if (hotelOptional.isPresent()) vo.setHotelName(hotelOptional.get().getName());
+                Optional<BusHotel> hotelOptional = busHotels.stream().filter(h -> h.getId().equals(v.getHotelId())).findFirst();
+                if (hotelOptional.isPresent()) vo.setHotelName(hotelOptional.get().getName());
 
-              Optional<CesRoomBuildingFloor> buildingOptional = buildingFloors.stream().filter(b -> b.getId().equals(v.getBuildId())).findFirst();
-              if (buildingOptional.isPresent()) vo.setBuildName(buildingOptional.get().getName());
+                Optional<CesRoomBuildingFloor> buildingOptional = buildingFloors.stream().filter(b -> b.getId().equals(v.getBuildId())).findFirst();
+                if (buildingOptional.isPresent()) vo.setBuildName(buildingOptional.get().getName());
 
-              Optional<CesRoomBuildingFloor> floorOptional = buildingFloors.stream().filter(b -> b.getId().equals(v.getFloorId())).findFirst();
-              if (floorOptional.isPresent()) vo.setFloorName(floorOptional.get().getName());
+                Optional<CesRoomBuildingFloor> floorOptional = buildingFloors.stream().filter(b -> b.getId().equals(v.getFloorId())).findFirst();
+                if (floorOptional.isPresent()) vo.setFloorName(floorOptional.get().getName());
 
-              result.add(vo);
-          });
-           map.put("records",result);
-       }else{
-           map.put("records",records);
-       }
-        map.put("total",dataPage.getTotal());
+                result.add(vo);
+            });
+            map.put("records", result);
+        } else {
+            map.put("records", records);
+        }
+        map.put("total", dataPage.getTotal());
         return Result.OK(map);
     }
 
     /**
      * 创建房间
+     *
      * @param roomsDto
      * @return
      */
-    public Result create(CesRoomsDto roomsDto){
+    public Result create(CesRoomsDto roomsDto) {
         roomsDto.setCreateAt(LocalDateTime.now());
         roomsDto.setSort(99);
         roomsDto.setInvalid(false);
@@ -148,10 +151,10 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
     }
 
 
-    public Result modify(CesRoomsDto roomsDto){
-        CesRooms room = baseMapper.selectOne(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getId, roomsDto.getId()).eq(CesRooms::getInvalid,false));
-        if(ObjectUtils.isEmpty(room)) return Result.ok("数据未找到!");
-        BeanUtil.copyProperties(roomsDto,room, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
+    public Result modify(CesRoomsDto roomsDto) {
+        CesRooms room = baseMapper.selectOne(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getId, roomsDto.getId()).eq(CesRooms::getInvalid, false));
+        if (ObjectUtils.isEmpty(room)) return Result.ok("数据未找到!");
+        BeanUtil.copyProperties(roomsDto, room, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
         room.setUpdateAt(LocalDateTime.now());
         roomsMapper.updateById(room);
         return Result.ok("修改成功!");
@@ -159,21 +162,22 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
 
     /**
      * 前端删除一个
+     *
      * @param id
      * @return
      */
-    public Result deleteOne(String id){
-       CesRooms rooms = roomsMapper.selectOne(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getId,id).eq(CesRooms::getInvalid,false));
-       if(ObjectUtils.isEmpty(rooms)) return Result.ok("删除成功!");
-       rooms.setInvalid(true);
-       rooms.setUpdateAt(LocalDateTime.now());
-       roomsMapper.updateById(rooms);
-       return  Result.ok("删除成功!");
+    public Result deleteOne(String id) {
+        CesRooms rooms = roomsMapper.selectOne(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getId, id).eq(CesRooms::getInvalid, false));
+        if (ObjectUtils.isEmpty(rooms)) return Result.ok("删除成功!");
+        rooms.setInvalid(true);
+        rooms.setUpdateAt(LocalDateTime.now());
+        roomsMapper.updateById(rooms);
+        return Result.ok("删除成功!");
     }
 
-    public Result delete(List<String> ids){
+    public Result delete(List<String> ids) {
         List<CesRooms> rooms = roomsMapper.selectBatchIds(ids);
-        if(CollectionUtil.isEmpty(rooms)) return Result.ok("删除成功!");
+        if (CollectionUtil.isEmpty(rooms)) return Result.ok("删除成功!");
         rooms.forEach(v -> {
             v.setUpdateAt(LocalDateTime.now());
             v.setInvalid(true);
@@ -183,9 +187,9 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
     }
 
 
-    public Result removeAll(String hotelId){
-        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId).eq(CesRooms::getInvalid,false));
-        if(CollectionUtil.isEmpty(rooms)) return Result.ok("删除成功!");
+    public Result removeAll(String hotelId) {
+        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId).eq(CesRooms::getInvalid, false));
+        if (CollectionUtil.isEmpty(rooms)) return Result.ok("删除成功!");
         rooms.forEach(v -> {
             v.setUpdateAt(LocalDateTime.now());
             v.setInvalid(true);
@@ -197,13 +201,14 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
 
     /**
      * 批量新增楼层房间
+     *
      * @param batchRoomsDto
      * @return
      */
     @Transactional(rollbackOn = Exception.class)
-    public Result saveBatchRoom(BatchRoomsDto batchRoomsDto){
+    public Result saveBatchRoom(BatchRoomsDto batchRoomsDto) {
         CesRoomBuildingFloor buildingFloor = buildingFloorService.getBuildFloorById(batchRoomsDto.getBuildId());
-        if(ObjectUtils.isEmpty(buildingFloor)) return Result.error("楼栋不正确,请重新选择!");
+        if (ObjectUtils.isEmpty(buildingFloor)) return Result.error("楼栋不正确,请重新选择!");
         List<BatchBuildFloorRoomDto> floorRoomsList = batchRoomsDto.getChildren();
         List<CesRooms> rooms = new ArrayList<>();
         floorRoomsList.forEach(v -> {
@@ -234,78 +239,81 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
 
     /**
      * 根据楼层获取房间数据
+     *
      * @param floorId
      * @return
      */
-    public Result queryByFloorId(String floorId){
-        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getFloorId, floorId).eq(CesRooms::getInvalid,false));
+    public Result queryByFloorId(String floorId) {
+        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getFloorId, floorId).eq(CesRooms::getInvalid, false));
         return Result.OK(rooms);
     }
 
     /**
      * 根据hotelId获取房间数据
+     *
      * @param hotelId
      * @return
      */
-    public Result queryByHotelId(String hotelId){
-        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId).eq(CesRooms::getInvalid,false));
+    public Result queryByHotelId(String hotelId) {
+        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId).eq(CesRooms::getInvalid, false));
         return Result.OK(rooms);
     }
 
-    public List<CesRooms> getByHotelId(String hotelId){
-        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId).eq(CesRooms::getInvalid,false));
+    public List<CesRooms> getByHotelId(String hotelId) {
+        List<CesRooms> rooms = roomsMapper.selectList(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId, hotelId).eq(CesRooms::getInvalid, false));
         return rooms;
     }
 
     /**
      * 获取能使用的房间
+     *
      * @param param
      * @return
      */
     public List<CanUseResultVo> getCanUseRooms(CanUseRequestParamDto param) {
         // 获取房型
-        QueryWrapper<CesRoomLayout> wrappers = Wrappers.<CesRoomLayout>query().eq("hotel_id",param.getHotelId())
-                .eq("invalid",false);
-        if((param.getCancelLayout() == null || !param.getCancelLayout()) && param.getLayoutId() != null && !param.getLayoutId().isEmpty()) {
-            wrappers.eq("id",param.getLayoutId());
+        QueryWrapper<CesRoomLayout> wrappers = Wrappers.<CesRoomLayout>query().eq("hotel_id", param.getHotelId())
+                .eq("invalid", false);
+        if ((param.getCancelLayout() == null || !param.getCancelLayout()) && param.getLayoutId() != null && !param.getLayoutId().isEmpty()) {
+            wrappers.eq("id", param.getLayoutId());
         }
-       List<CesRoomLayout> layouts = layoutService.list(wrappers);
-       List<CesRooms> allRooms = baseMapper.canUseRooms(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());
+        List<CesRoomLayout> layouts = layoutService.list(wrappers);
+        List<CesRooms> allRooms = baseMapper.canUseRooms(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());
 
         BigDecimal hourPrice = null;
         List<String> relationHourRoomLayoutIds = new ArrayList<>();
-      if(param.getBookingType().equals(CheckInTypeEnum.HOUR_TIME.getKey())) {
-           if(param.getHourRoomRuleId()==null)
-               throw new JeecgBootException("参数错误");
-           CesHourRoomRule hourRoomRule = hourRoomRuleService.getById(param.getHourRoomRuleId());
-           if(hourRoomRule == null) throw new JeecgBootException("钟点房计费规则未找到");
-           if(hourRoomRule.getLayoutIds()!=null && !hourRoomRule.getLayoutIds().isEmpty()){
-               relationHourRoomLayoutIds.addAll(Arrays.stream(hourRoomRule.getLayoutIds().split(",")).collect(Collectors.toList()));
-           }
-
-           hourPrice = hourRoomRule.getAfterOpenRoomPay();
+        if (param.getBookingType().equals(CheckInTypeEnum.HOUR_TIME.getKey())) {
+            if (param.getHourRoomRuleId() == null)
+                throw new JeecgBootException("参数错误");
+            CesHourRoomRule hourRoomRule = hourRoomRuleService.getById(param.getHourRoomRuleId());
+            if (hourRoomRule == null) throw new JeecgBootException("钟点房计费规则未找到");
+            if (hourRoomRule.getLayoutIds() != null && !hourRoomRule.getLayoutIds().isEmpty()) {
+                relationHourRoomLayoutIds.addAll(Arrays.stream(hourRoomRule.getLayoutIds().split(",")).collect(Collectors.toList()));
+            }
+
+            hourPrice = hourRoomRule.getAfterOpenRoomPay();
         }
         BigDecimal finalHourPrice = hourPrice;
         List<CesRooms> choiceRooms = new ArrayList<>();
-        if(param.getOrderId() != null && !param.getOrderId().isEmpty()) {
-            List<BusBookingRooms> bookingRooms = bookingRoomsService.list(Wrappers.<BusBookingRooms>query().eq("booking_orders_id",param.getOrderId()));
-            List<String> choiceRoomIds = bookingRooms.stream().map(w->w.getRoomId()).collect(Collectors.toList());
-            choiceRooms = list(Wrappers.<CesRooms>query().in("id",choiceRoomIds));
+        if (param.getOrderId() != null && !param.getOrderId().isEmpty()) {
+            List<BusBookingRooms> bookingRooms = bookingRoomsService.list(Wrappers.<BusBookingRooms>query().eq("booking_orders_id", param.getOrderId()));
+            List<String> choiceRoomIds = bookingRooms.stream().map(w -> w.getRoomId()).collect(Collectors.toList());
+            choiceRooms = list(Wrappers.<CesRooms>query().in("id", choiceRoomIds));
         }
         List<CesRooms> finalChoiceRooms = choiceRooms;
-        if(param.getCancelLayout() != null && param.getCancelLayout()) {
+        if (param.getCancelLayout() != null && param.getCancelLayout()) {
             CanUseResultVo item = new CanUseResultVo();
             final Integer[] canUseRoomCount = {0};
             List<CanUseBuildingRoomsVo> floorVos = new ArrayList<>();
-            floors.forEach(c->{
-                CanUseBuildingRoomsVo floorRoomsVo  = new CanUseBuildingRoomsVo();
-                List<CesRooms> floorRooms = allRooms.stream().filter(e->e.getFloorId().equals(c.getId())).collect(Collectors.toList());
-                Optional<CesRoomBuildingFloor> opBuilding = allBuildingFloors.stream().filter(q->q.getId().equals(c.getParentId())).findFirst();
-                if(!opBuilding.isPresent()) return;
+            floors.forEach(c -> {
+                CanUseBuildingRoomsVo floorRoomsVo = new CanUseBuildingRoomsVo();
+                List<CesRooms> floorRooms = allRooms.stream().filter(e -> e.getFloorId().equals(c.getId())).collect(Collectors.toList());
+                Optional<CesRoomBuildingFloor> opBuilding = allBuildingFloors.stream().filter(q -> q.getId().equals(c.getParentId())).findFirst();
+                if (!opBuilding.isPresent()) return;
 
                 floorRoomsVo.setFloorName(c.getName());
                 floorRoomsVo.setFloorId(c.getId());
@@ -313,11 +321,11 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
                 floorRoomsVo.setBuildingId(opBuilding.get().getId());
                 canUseRoomCount[0] += floorRooms.size();
                 // 设置完size之后添加已用房间 不影响数量
-                List<String> currentFloorRoomIds = floorRooms.stream().map(r->r.getId()).collect(Collectors.toList());
-                List<CesRooms> orderRooms = finalChoiceRooms.stream().filter(y->y.getFloorId().equals(c.getId()) && !currentFloorRoomIds.contains(y.getId())).collect(Collectors.toList());
-                floorRooms.forEach(p->{
-                    Optional<CesRoomLayout> opLayout = layouts.stream().filter(i->i.getId().equals(p.getLayoutId())).findFirst();
-                    if(opLayout.isPresent()) {
+                List<String> currentFloorRoomIds = floorRooms.stream().map(r -> r.getId()).collect(Collectors.toList());
+                List<CesRooms> orderRooms = finalChoiceRooms.stream().filter(y -> y.getFloorId().equals(c.getId()) && !currentFloorRoomIds.contains(y.getId())).collect(Collectors.toList());
+                floorRooms.forEach(p -> {
+                    Optional<CesRoomLayout> opLayout = layouts.stream().filter(i -> i.getId().equals(p.getLayoutId())).findFirst();
+                    if (opLayout.isPresent()) {
                         CesRoomLayout roomLayout = opLayout.get();
                         p.setMarketPrice(roomLayout.getMarketPrice());
                     }
@@ -329,53 +337,72 @@ public class CesRoomsServiceImpl extends ServiceImpl<CesRoomsMapper, CesRooms> i
             item.setLayout(null);
             item.setBuildingRooms(floorVos);
             results.add(item);
-            return  results;
+            return results;
         }
-        layouts.forEach(s-> {
-           CanUseResultVo item = new CanUseResultVo();
-           List<CanUseBuildingRoomsVo> floorVos = new ArrayList<>();
-           final Integer[] canUseRoomCount = {0};
-           // 钟点房和全天房计费方案取到对应的价格
-           if(param.getBookingType().equals(CheckInTypeEnum.ALL_DAYS.getKey())) {
-              s.setFavPrice(s.getMarketPrice());
-           } else if(param.getBookingType().equals(CheckInTypeEnum.HOUR_TIME.getKey())) {
-               // 判定是否支持房价方案
-               s.setIsSupportHourRule(relationHourRoomLayoutIds.stream().anyMatch(p->p.equals(s.getId())));
-               s.setFavPrice(finalHourPrice);
-           } else
-               s.setFavPrice(null);
-
-           floors.forEach(c->{
-               CanUseBuildingRoomsVo floorRoomsVo  = new CanUseBuildingRoomsVo();
-               List<CesRooms> floorRooms = allRooms.stream().filter(e->e.getFloorId().equals(c.getId()) && e.getLayoutId().equals(s.getId())).collect(Collectors.toList());
-               Optional<CesRoomBuildingFloor> opBuilding = allBuildingFloors.stream().filter(q->q.getId().equals(c.getParentId())).findFirst();
-               if(!opBuilding.isPresent()) return;
-
-               floorRoomsVo.setFloorName(c.getName());
-               floorRoomsVo.setFloorId(c.getId());
-               floorRoomsVo.setBuildingName(opBuilding.get().getName());
-               floorRoomsVo.setBuildingId(opBuilding.get().getId());
-               canUseRoomCount[0] += floorRooms.size();
-               // 设置完size之后添加已用房间 不影响数量
-               List<String> currentFloorRoomIds = floorRooms.stream().map(r->r.getId()).collect(Collectors.toList());
-               List<CesRooms> orderRooms = finalChoiceRooms.stream().filter(y->y.getFloorId().equals(c.getId()) && !currentFloorRoomIds.contains(y.getId()) && y.getLayoutId().equals(s.getId())).collect(Collectors.toList());
-               floorRooms.addAll(orderRooms);
-               floorRoomsVo.setFloorRooms(floorRooms);
-               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;
-           }
-           s.setCanUseCount(canUseRoomCount[0]); //设置可用房间数
-           item.setLayout(s);
-           item.setBuildingRooms(floorVos);
-           results.add(item);
-       });
-       return  results;
+        layouts.forEach(s -> {
+            CanUseResultVo item = new CanUseResultVo();
+            List<CanUseBuildingRoomsVo> floorVos = new ArrayList<>();
+            final Integer[] canUseRoomCount = {0};
+            // 钟点房和全天房计费方案取到对应的价格
+            if (param.getBookingType().equals(CheckInTypeEnum.ALL_DAYS.getKey())) {
+                s.setFavPrice(s.getMarketPrice());
+            } else if (param.getBookingType().equals(CheckInTypeEnum.HOUR_TIME.getKey())) {
+                // 判定是否支持房价方案
+                s.setIsSupportHourRule(relationHourRoomLayoutIds.stream().anyMatch(p -> p.equals(s.getId())));
+                s.setFavPrice(finalHourPrice);
+            } else
+                s.setFavPrice(null);
+
+            floors.forEach(c -> {
+                CanUseBuildingRoomsVo floorRoomsVo = new CanUseBuildingRoomsVo();
+                List<CesRooms> floorRooms = allRooms.stream().filter(e -> e.getFloorId().equals(c.getId()) && e.getLayoutId().equals(s.getId())).collect(Collectors.toList());
+                Optional<CesRoomBuildingFloor> opBuilding = allBuildingFloors.stream().filter(q -> q.getId().equals(c.getParentId())).findFirst();
+                if (!opBuilding.isPresent()) return;
+
+                floorRoomsVo.setFloorName(c.getName());
+                floorRoomsVo.setFloorId(c.getId());
+                floorRoomsVo.setBuildingName(opBuilding.get().getName());
+                floorRoomsVo.setBuildingId(opBuilding.get().getId());
+                canUseRoomCount[0] += floorRooms.size();
+                // 设置完size之后添加已用房间 不影响数量
+                List<String> currentFloorRoomIds = floorRooms.stream().map(r -> r.getId()).collect(Collectors.toList());
+                List<CesRooms> orderRooms = finalChoiceRooms.stream().filter(y -> y.getFloorId().equals(c.getId()) && !currentFloorRoomIds.contains(y.getId()) && y.getLayoutId().equals(s.getId())).collect(Collectors.toList());
+                floorRooms.addAll(orderRooms);
+                floorRoomsVo.setFloorRooms(floorRooms);
+                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;
+            }
+            s.setCanUseCount(canUseRoomCount[0]); //设置可用房间数
+            item.setLayout(s);
+            item.setBuildingRooms(floorVos);
+            results.add(item);
+        });
+        return results;
+
+    }
+
+    /**
+     * 在住来源分组统计
+     *
+     * @param hotelId
+     * @return
+     */
+    public List<LivingSourceStatVo> livingSourceStat(String hotelId) {
+        return roomsMapper.livingSourceStat(hotelId);
+    }
 
+    /**
+     * 房态统计
+     * @param hotelId
+     * @return
+     */
+    public List<LivingSourceStatVo> roomLiveStat(String hotelId){
+        return roomsMapper.roomLiveStat(hotelId);
     }
 }

+ 38 - 30
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.exceptions.ClientException;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -74,11 +75,13 @@ public class LoginController {
 	private  final  String TENANT_KEY = "XPLSOspYuisBnjKcYQZmGpq";
 	// 平台端header key
 	private  final  String PLATFORM_KEY = "XPLSOspYuisBnjKcYQZmGpq=====";
+	// app租户端header key
+	private  final  String APP_TENANT_KEY = "APPXPLSOspYuisBnjKcYQZmGpq";
 	@ApiOperation("登录接口")
 	@RequestMapping(value = "/login", method = RequestMethod.POST)
-	public Result<JSONObject> login(@RequestHeader(value = "Auth") String auth, @RequestBody SysLoginModel sysLoginModel){
+	public Result<JSONObject> login(@RequestHeader(value = "Auth") String auth, @RequestBody SysLoginModel sysLoginModel) {
 		Result<JSONObject> result = new Result<JSONObject>();
-		if(auth == null || (!auth.equals(TENANT_KEY) && !auth.equals(PLATFORM_KEY))) {
+		if (auth == null || (!auth.equals(TENANT_KEY) && !auth.equals(PLATFORM_KEY) && !auth.equals(APP_TENANT_KEY))) {
 			result.error500("未知的请求来源");
 			return result;
 		}
@@ -91,49 +94,52 @@ public class LoginController {
 		//update-begin--Author:scott  Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
 
 		//update-begin-author:taoyan date:20190828 for:校验验证码
-        String captcha = sysLoginModel.getCaptcha();
-        if(captcha==null){
-            result.error500("验证码无效");
-            return result;
-        }
-        String lowerCaseCaptcha = captcha.toLowerCase();
-        //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
-        String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret();
-		String realKey = Md5Util.md5Encode(origin, "utf-8");
-		//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		Object checkCode = redisUtil.get(realKey);
-		//当进入登录页时,有一定几率出现验证码错误 #1714
-		if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) {
-            log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode);
-			result.error500("验证码错误");
-			// 改成特殊的code 便于前端判断
-			result.setCode(HttpStatus.PRECONDITION_FAILED.value());
-			return result;
+		String realKey = "";
+		if (!auth.equals(APP_TENANT_KEY)) {
+			String captcha = sysLoginModel.getCaptcha();
+			if (captcha == null) {
+				result.error500("验证码无效");
+				return result;
+			}
+			String lowerCaseCaptcha = captcha.toLowerCase();
+			//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+			// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
+			String origin = lowerCaseCaptcha + sysLoginModel.getCheckKey() + jeecgBaseConfig.getSignatureSecret();
+			realKey = Md5Util.md5Encode(origin, "utf-8");
+			//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+			Object checkCode = redisUtil.get(realKey);
+			//当进入登录页时,有一定几率出现验证码错误 #1714
+			if (checkCode == null || !checkCode.toString().equals(lowerCaseCaptcha)) {
+				log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode);
+				result.error500("验证码错误");
+				// 改成特殊的code 便于前端判断
+				result.setCode(HttpStatus.PRECONDITION_FAILED.value());
+				return result;
+			}
 		}
 		//update-end-author:taoyan date:20190828 for:校验验证码
 
 		//1. 校验用户是否有效
 		//update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
 		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.eq(SysUser::getUsername,username);
+		queryWrapper.eq(SysUser::getUsername, username);
 		SysUser sysUser = sysUserService.getOne(queryWrapper);
 		// 标记租户端用户登录
-		if(auth.equals(TENANT_KEY)){
-			if(sysUser.getRelTenantIds() == null || sysUser.getRelTenantIds().isEmpty()){
+		if (auth.equals(TENANT_KEY) || auth.equals(APP_TENANT_KEY)) {
+			if (sysUser.getRelTenantIds() == null || sysUser.getRelTenantIds().isEmpty()) {
 				result.error500("用户名或密码错误");
 				return result;
 			}
 			// 标记平台端登录
-		} else if(auth.equals(PLATFORM_KEY)) {
-			if(sysUser.getRelTenantIds() != null && !sysUser.getRelTenantIds().isEmpty()){
+		} else if (auth.equals(PLATFORM_KEY)) {
+			if (sysUser.getRelTenantIds() != null && !sysUser.getRelTenantIds().isEmpty()) {
 				result.error500("用户名或密码错误");
 				return result;
 			}
 		}
 		//update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
 		result = sysUserService.checkUserIsEffective(sysUser);
-		if(!result.isSuccess()) {
+		if (!result.isSuccess()) {
 			return result;
 		}
 
@@ -148,12 +154,14 @@ public class LoginController {
 		//用户登录信息
 		userInfo(sysUser, result);
 		//update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
-		redisUtil.del(realKey);
+		if (ObjectUtils.isNotEmpty(realKey)) {
+			redisUtil.del(realKey);
+		}
 		//update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
 		LoginUser loginUser = new LoginUser();
 		BeanUtils.copyProperties(sysUser, loginUser);
-		baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser);
-        //update-end--Author:wangshuai  Date:20200714  for:登录日志没有记录人员
+		baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser);
+		//update-end--Author:wangshuai  Date:20200714  for:登录日志没有记录人员
 		return result;
 	}