|
|
@@ -10,13 +10,16 @@ import com.izouma.zhumj.exception.BusinessException;
|
|
|
import com.izouma.zhumj.repo.*;
|
|
|
import com.izouma.zhumj.repo.sale.ContractStoreRepo;
|
|
|
import com.izouma.zhumj.repo.sale.ContractRepo;
|
|
|
+import com.izouma.zhumj.utils.ObjUtils;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
|
|
import javax.persistence.criteria.CriteriaBuilder;
|
|
|
+import javax.persistence.criteria.CriteriaQuery;
|
|
|
import javax.persistence.criteria.Predicate;
|
|
|
import javax.persistence.criteria.Root;
|
|
|
import java.math.BigDecimal;
|
|
|
@@ -40,7 +43,19 @@ public class RoomInfoService {
|
|
|
private RoomFeeRepo roomFeeRepo;
|
|
|
private UserRepo userRepo;
|
|
|
private MemberRepo memberRepo;
|
|
|
-
|
|
|
+ private RoomTypeInfoRepo roomTypeInfoRepo;
|
|
|
+
|
|
|
+ public RoomInfo save(RoomInfo record) {
|
|
|
+ record.setSingle(roomTypeInfoRepo.findById(record.getRoomTypeId())
|
|
|
+ .map(RoomTypeInfo::getBedCount)
|
|
|
+ .orElse(0L) == 1);
|
|
|
+ if (record.getId() != null) {
|
|
|
+ RoomInfo orig = roomInfoRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
|
|
|
+ ObjUtils.merge(orig, record);
|
|
|
+ return roomInfoRepo.save(orig);
|
|
|
+ }
|
|
|
+ return roomInfoRepo.save(record);
|
|
|
+ }
|
|
|
|
|
|
public HomeRoomDTO getHomeInfo(RoomInfoQueryDTO baseDto) throws CloneNotSupportedException {
|
|
|
RoomInfoQueryDTO totalRoomCountDTO = (RoomInfoQueryDTO) baseDto.clone();
|
|
|
@@ -129,71 +144,88 @@ public class RoomInfoService {
|
|
|
StoreStat lanling = new StoreStat();
|
|
|
StoreStat bailing = new StoreStat();
|
|
|
|
|
|
+ List<RoomInfo> roomInfos = roomInfoRepo.findAll((Specification<RoomInfo>) (root, criteriaQuery, criteriaBuilder) ->
|
|
|
+ {
|
|
|
+ List<Predicate> predicates = new ArrayList<>();
|
|
|
+ predicates.add(criteriaBuilder.equal(root.get("storeId"), storeId));
|
|
|
+ predicates.add(criteriaBuilder.equal(root.get("enabled"), true));
|
|
|
+ predicates.add(criteriaBuilder.equal(root.get("virtual"), false));
|
|
|
+ if (buildingId != null) {
|
|
|
+ predicates.add(criteriaBuilder.equal(root.get("buildingId"), buildingId));
|
|
|
+ }
|
|
|
+ if (floorId != null) {
|
|
|
+ predicates.add(criteriaBuilder.equal(root.get("floorId"), floorId));
|
|
|
+ }
|
|
|
+ if (roomTypeId != null) {
|
|
|
+ predicates.add(criteriaBuilder.equal(root.get("roomTypeId"), roomTypeId));
|
|
|
+ }
|
|
|
+ return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
|
|
|
+ });
|
|
|
+
|
|
|
List<CheckinInfoDTO> checkinInfoList = checkinInfoRepo.storeCheckinDTO(storeId);
|
|
|
- checkinInfoList.sort(Comparator.comparingLong(CheckinInfoDTO::getBedCount));
|
|
|
|
|
|
- lanling.setTotal((int) bedInfoRepo.count((Specification<BedInfo>) (root, criteriaQuery, criteriaBuilder) ->
|
|
|
- criteriaBuilder.and(criteriaBuilder.equal(root.get("storeId"), storeId),
|
|
|
- criteriaBuilder.equal(root.get("enabled"), true),
|
|
|
- criteriaBuilder.equal(root.join("roomInfo").get("virtual"), false),
|
|
|
- criteriaBuilder.notEqual(root.join("roomInfo")
|
|
|
- .join("roomTypeInfo")
|
|
|
- .get("bedCount"), 1))
|
|
|
- ));
|
|
|
- lanling.setTotalSec((int) roomInfoRepo.count((Specification<RoomInfo>) (root, criteriaQuery, criteriaBuilder) ->
|
|
|
+ Set<Long> lanlingRoomIds = roomInfos.stream()
|
|
|
+ .filter(roomInfo -> !roomInfo.isSingle())
|
|
|
+ .map(BaseEntity::getId)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ List<CheckinInfoDTO> lanlingCheckinInfoList = checkinInfoList.stream()
|
|
|
+ .filter(c -> lanlingRoomIds.contains(c.getRoomId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ lanling.setTotalBed(lanlingRoomIds.isEmpty() ? 0 : (int) bedInfoRepo.count((Specification<BedInfo>) (root, criteriaQuery, criteriaBuilder) ->
|
|
|
criteriaBuilder.and(criteriaBuilder.equal(root.get("storeId"), storeId),
|
|
|
criteriaBuilder.equal(root.get("enabled"), true),
|
|
|
criteriaBuilder.equal(root.get("virtual"), false),
|
|
|
- criteriaBuilder.notEqual(root.join("roomTypeInfo").get("bedCount"), 1))
|
|
|
- ));
|
|
|
+ root.get("roomId").in(lanlingRoomIds)
|
|
|
+ )));
|
|
|
+ lanling.setTotalRoom(lanlingRoomIds.size());
|
|
|
|
|
|
- lanling.setCheckin((int) checkinInfoList.stream().filter(c -> c.getBedCount() != 1).count());
|
|
|
+ lanling.setCheckin(lanlingCheckinInfoList.size());
|
|
|
|
|
|
- lanling.setActual((int) checkinInfoList.stream()
|
|
|
- .filter(c -> c.getBedCount() != 1 && StringUtils.isNotBlank(c.getIdNo()))
|
|
|
+ lanling.setActual((int) lanlingCheckinInfoList.stream()
|
|
|
+ .filter(c -> StringUtils.isNotBlank(c.getIdNo()))
|
|
|
.count());
|
|
|
|
|
|
- lanling.setAvgPrice(BigDecimal.valueOf(checkinInfoList.stream()
|
|
|
- .filter(c -> c.getBedCount() != 1)
|
|
|
+ lanling.setAvgPrice(BigDecimal.valueOf(lanlingCheckinInfoList.stream()
|
|
|
.mapToDouble(c -> Optional.ofNullable(c.getMonthRate()).orElse(BigDecimal.ZERO).doubleValue())
|
|
|
.average()
|
|
|
.orElse(0)).setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
|
- if (lanling.getTotal() == 0) {
|
|
|
+ if (lanling.getTotalBed() == 0) {
|
|
|
lanling.setPercent("0%");
|
|
|
} else {
|
|
|
lanling.setPercent(BigDecimal.valueOf(lanling.getCheckin())
|
|
|
- .divide(BigDecimal.valueOf(lanling.getTotal()), 4, RoundingMode.HALF_UP)
|
|
|
+ .divide(BigDecimal.valueOf(lanling.getTotalBed()), 4, RoundingMode.HALF_UP)
|
|
|
.multiply(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP))
|
|
|
.stripTrailingZeros()
|
|
|
.toPlainString() + "%");
|
|
|
}
|
|
|
|
|
|
|
|
|
- bailing.setTotal((int) roomInfoRepo.count((Specification<RoomInfo>) (root, criteriaQuery, criteriaBuilder) ->
|
|
|
- criteriaBuilder.and(criteriaBuilder.equal(root.get("storeId"), storeId),
|
|
|
- criteriaBuilder.equal(root.get("enabled"), true),
|
|
|
- criteriaBuilder.equal(root.get("virtual"), false),
|
|
|
- criteriaBuilder.and(criteriaBuilder.equal(root.join("roomTypeInfo").get("bedCount"), 1)))
|
|
|
- ));
|
|
|
+ Set<Long> bailingRoomIds = roomInfos.stream()
|
|
|
+ .filter(RoomInfo::isSingle)
|
|
|
+ .map(BaseEntity::getId)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ List<CheckinInfoDTO> bailingCheckinInfoList = checkinInfoList.stream()
|
|
|
+ .filter(c -> bailingRoomIds.contains(c.getRoomId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ bailing.setTotalRoom(bailingRoomIds.size());
|
|
|
|
|
|
- bailing.setCheckin((int) checkinInfoList.stream().filter(c -> c.getBedCount() == 1).count());
|
|
|
+ bailing.setCheckin(bailingCheckinInfoList.size());
|
|
|
|
|
|
- bailing.setActual((int) checkinInfoList.stream()
|
|
|
- .filter(c -> c.getBedCount() == 1 && StringUtils.isNotBlank(c.getIdNo()))
|
|
|
+ bailing.setActual((int) bailingCheckinInfoList.stream()
|
|
|
+ .filter(c -> StringUtils.isNotBlank(c.getIdNo()))
|
|
|
.count());
|
|
|
|
|
|
- bailing.setAvgPrice(BigDecimal.valueOf(checkinInfoList.stream()
|
|
|
- .filter(c -> c.getBedCount() == 1)
|
|
|
+ bailing.setAvgPrice(BigDecimal.valueOf(bailingCheckinInfoList.stream()
|
|
|
.mapToDouble(c -> Optional.ofNullable(c.getMonthRate()).orElse(BigDecimal.ZERO).doubleValue())
|
|
|
.average()
|
|
|
.orElse(0)).setScale(2, RoundingMode.HALF_UP));
|
|
|
|
|
|
- if (bailing.getTotal() == 0) {
|
|
|
+ if (bailing.getTotalRoom() == 0) {
|
|
|
bailing.setPercent("0%");
|
|
|
} else {
|
|
|
bailing.setPercent(BigDecimal.valueOf(bailing.getCheckin())
|
|
|
- .divide(BigDecimal.valueOf(bailing.getTotal()), 4, RoundingMode.HALF_UP)
|
|
|
+ .divide(BigDecimal.valueOf(bailing.getTotalRoom()), 4, RoundingMode.HALF_UP)
|
|
|
.multiply(BigDecimal.valueOf(100).setScale(2, RoundingMode.HALF_UP))
|
|
|
.stripTrailingZeros()
|
|
|
.toPlainString() + "%");
|