HouseNumberStatusImplService.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. package com.happy.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.happy.Model.Holiday;
  4. import com.happy.Model.House;
  5. import com.happy.Model.HouseNumber;
  6. import com.happy.Model.HouseNumberStatus;
  7. import com.happy.Until.DateUtil;
  8. import com.happy.Until.Func;
  9. import com.happy.Until.TimeExchange;
  10. import com.happy.dao.HouseNumberDao;
  11. import com.happy.dao.HouseNumberStatusDao;
  12. import com.happy.dao.HousePriceDao;
  13. import com.happy.dto.HouseNumberDto;
  14. import com.happy.dto.HouseNumberStatusDto;
  15. import com.happy.dto.HousePriceDto;
  16. import com.happy.service.HouseNumberStatusService;
  17. import com.happy.service.HousePriceService;
  18. import lombok.SneakyThrows;
  19. import org.apache.commons.lang.StringUtils;
  20. import org.springframework.beans.BeanUtils;
  21. import org.springframework.beans.BeanWrapper;
  22. import org.springframework.beans.BeanWrapperImpl;
  23. import org.springframework.stereotype.Service;
  24. import javax.annotation.Resource;
  25. import java.beans.PropertyDescriptor;
  26. import java.text.ParseException;
  27. import java.time.LocalDate;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. @Service("HouseNumberStatusService")
  31. public class HouseNumberStatusImplService implements HouseNumberStatusService {
  32. @Resource(name = "HouseNumberStatusDao")
  33. public HouseNumberStatusDao houseNumberStatusDao;
  34. @Resource(name = "housePriceService")
  35. private HousePriceService housePriceService;
  36. @Resource(name = "HouseNumberDao")
  37. public HouseNumberDao houseNumberDao;
  38. @Resource(name = "housePriceDao")
  39. public HousePriceDao housePriceDao;
  40. @Override
  41. public int deleteHolidayByYear(String year) {
  42. return houseNumberStatusDao.deleteHolidayByYear(year);
  43. }
  44. @Override
  45. public int saveHolidayBatch(List<Holiday> list) {
  46. return houseNumberStatusDao.saveHolidayBatch(list);
  47. }
  48. @Override
  49. public List<Holiday> queryHolidays(String year, String startDate, String endDates) {
  50. List<Holiday> list = houseNumberStatusDao.queryHolidays(year, startDate, endDates);
  51. return list;
  52. }
  53. @Override
  54. public int saveBatch(List<HouseNumberStatus> list) {
  55. return houseNumberStatusDao.saveBatch(list);
  56. }
  57. @Override
  58. public int updateHouseNumberStatus(String bookId) {
  59. return houseNumberStatusDao.updateHouseNumberStatus(bookId);
  60. }
  61. @Override
  62. public List<HouseNumberStatus> getList(String sqlx) {
  63. return houseNumberStatusDao.getList(sqlx);
  64. }
  65. @Override
  66. public JSONObject queryData(HouseNumberStatusDto houseNumberStatusDto) {
  67. String managerId = houseNumberStatusDto.getManagerId();
  68. Integer showType = houseNumberStatusDto.getShowType();
  69. if (StringUtils.isBlank(managerId) || showType == null) return null;
  70. List<House> houseList = housePriceService.queryHouseListByManagerId(houseNumberStatusDto.getManagerId());
  71. if (houseList == null || houseList.isEmpty()) return null;
  72. HouseNumberDto houseNumberDto = new HouseNumberDto();
  73. houseNumberDto.setHouseIdList(houseList.stream().map(House::getId).collect(Collectors.toList()));
  74. List<HouseNumberDto> houseNumberList = houseNumberDao.queryListOne(houseNumberDto);
  75. if (houseNumberList == null || houseNumberList.isEmpty()) return null;
  76. String setDate = houseNumberStatusDto.getSetDate();
  77. Date startDate = DateUtil.parseDateOnly(setDate);
  78. Date endDate = DateUtil.addDate(startDate, Calendar.DATE, 28);
  79. String setDateWithEndDate = String.format("%s,%s", setDate, DateUtil.parseDateToStr(endDate, DateUtil.Time_Formatter_Day));
  80. //region 房间状态信息
  81. houseNumberStatusDto.setStatuses(Arrays.asList(2, 5, 6));
  82. List<String> houseNumberIdList = houseNumberList.stream().map(HouseNumber::getId).collect(Collectors.toList());
  83. houseNumberStatusDto.setHouseNumberIds(houseNumberIdList);
  84. List<HouseNumberStatusDto> houseNumberStatusDtoList;
  85. if (showType == 1) {
  86. houseNumberStatusDto.setSetDate(setDateWithEndDate);
  87. // 周日内的房间状态信息
  88. houseNumberStatusDtoList = houseNumberStatusDao.queryList(houseNumberStatusDto);
  89. } else if (showType == 2) {
  90. // 当日的房间状态信息
  91. houseNumberStatusDtoList = houseNumberStatusDao.queryList(houseNumberStatusDto);
  92. } else {
  93. houseNumberStatusDtoList = Collections.emptyList();
  94. }
  95. //endregion
  96. if (!houseNumberStatusDtoList.isEmpty()) {
  97. //region 预定/入住的订单信息
  98. Map<String, HouseNumberStatusDto> orderInfoMap;
  99. List<String> bookingId = houseNumberStatusDtoList.stream()
  100. .filter(item -> item.getStatus() == 5 || item.getStatus() == 6)
  101. .map(HouseNumberStatusDto::getBookingId).collect(Collectors.toList());
  102. if (bookingId.isEmpty()) {
  103. orderInfoMap = Collections.emptyMap();
  104. } else {
  105. orderInfoMap = houseNumberStatusDao.queryOrderSomeColumnListByIds(bookingId)
  106. .stream().collect(Collectors.toMap(HouseNumberStatusDto::getBookingId, item -> item, (bookingIdOne, bookingIdTow) -> bookingIdOne));
  107. }
  108. //endregion
  109. houseNumberList.forEach(houseNumber -> {
  110. List<HouseNumberStatusDto> houseNumberStatuses = new ArrayList<>();
  111. for (HouseNumberStatusDto numberStatusDto : houseNumberStatusDtoList) {
  112. // 填充预定/入住的一些订单信息
  113. if (numberStatusDto.getStatus() == 5 || numberStatusDto.getStatus() == 6) {
  114. HouseNumberStatusDto score = orderInfoMap.getOrDefault(numberStatusDto.getBookingId(), new HouseNumberStatusDto());
  115. BeanUtils.copyProperties(score, numberStatusDto, getNullPropertyNames(score));
  116. }
  117. // 填充房间状态信息
  118. if (Objects.equals(houseNumber.getId(), numberStatusDto.getNumberId())) {
  119. houseNumberStatuses.add(numberStatusDto);
  120. houseNumber.setHouseNumberStatuses(houseNumberStatuses);
  121. }
  122. }
  123. });
  124. }
  125. JSONObject result = new JSONObject();
  126. if (houseNumberStatusDto.getShowType() == 1) {
  127. List<String> dateListBetween = DateUtil.getDateStrListBetween(startDate, endDate);
  128. //region 周期内的改价记录
  129. HousePriceDto housePriceDto = new HousePriceDto();
  130. List<String> houseIdList = houseList.stream().map(House::getId).collect(Collectors.toList());
  131. housePriceDto.setHouseIdList(houseIdList);
  132. housePriceDto.setSetDate(setDateWithEndDate);
  133. List<HousePriceDto> housePriceDtoList = housePriceDao.queryListTwo(housePriceDto);
  134. //endregion
  135. List<JSONObject> datas = new ArrayList<>();
  136. houseList.forEach(house -> houseNumberList.forEach(houseNumber -> {
  137. if (houseNumber.getHouseId().equals(house.getId())) {
  138. JSONObject houseJsonObject = new JSONObject(new LinkedHashMap<>());
  139. houseJsonObject.put("id", house.getId());
  140. houseJsonObject.put("houseName", house.gethName());
  141. String numberName = houseNumber.getNumberName();
  142. houseJsonObject.put("numberName", numberName);
  143. houseJsonObject.put("numberStatus", houseNumber.getHouseStatus());
  144. houseJsonObject.put("numberId", houseNumber.getId());
  145. dateListBetween.forEach(date -> {
  146. JSONObject dateJsonObject = new JSONObject();
  147. dateJsonObject.put("numberId", houseNumber.getId());
  148. dateJsonObject.put("houseName", house.gethName());
  149. dateJsonObject.put("numberName", numberName);
  150. dateJsonObject.put("housePrice", getPrice(DateUtil.parseDateOnly(date), house, housePriceDtoList));
  151. List<HouseNumberStatusDto> houseNumberStatuses = houseNumber.getHouseNumberStatuses();
  152. if (houseNumberStatuses != null && !houseNumberStatuses.isEmpty()) {
  153. houseNumberStatuses.forEach(houseNumberStatus -> {
  154. if (date.equals(houseNumberStatus.getSetDate())) {
  155. dateJsonObject.put("closeType", houseNumberStatus.getCloseType());
  156. dateJsonObject.put("remark", houseNumberStatus.getRemark());
  157. dateJsonObject.put("setDate", houseNumberStatus.getSetDate());
  158. dateJsonObject.put("status", houseNumberStatus.getStatus());
  159. if (houseNumberStatus.getStatus() == 5 || houseNumberStatus.getStatus() == 6) {
  160. dateJsonObject.put("orderNum", houseNumberStatus.getOrderNum());
  161. dateJsonObject.put("orderUserName", houseNumberStatus.getOrderUserName());
  162. dateJsonObject.put("orderUserPhone", houseNumberStatus.getOrderUserPhone());
  163. dateJsonObject.put("orderPayAccount", houseNumberStatus.getOrderPayAccount());
  164. dateJsonObject.put("orderStartTime", houseNumberStatus.getOrderStartTime());
  165. dateJsonObject.put("orderEndTime", houseNumberStatus.getOrderEndTime());
  166. }
  167. }
  168. });
  169. }
  170. houseJsonObject.put(date, dateJsonObject);
  171. });
  172. datas.add(houseJsonObject);
  173. }
  174. }));
  175. List<Holiday> holidays = houseNumberStatusDao.queryHolidays( String.valueOf(LocalDate.now().getYear()),TimeExchange.DateToString(startDate,"yyyy-MM-dd"),TimeExchange.DateToString(endDate,"yyyy-MM-dd"));
  176. ArrayList<JSONObject> dataTimes = new ArrayList<>();
  177. dateListBetween.forEach(date -> {
  178. JSONObject dataTime = new JSONObject();
  179. dataTime.put("dateStr", date);
  180. dataTime.put("roomSum", getSum(date, houseNumberList));
  181. //2023-09-20 A-jax 添加 星期 节假日 是否休息
  182. try {
  183. dataTime.put("weekStr", TimeExchange.getWeek(date));//星期
  184. } catch (ParseException e) {
  185. e.printStackTrace();
  186. }
  187. Optional<Holiday> holiday = holidays.stream().filter(e -> e.getDate().equals(date)).findFirst();
  188. String holidayStr = null;
  189. if(holiday != null && holiday.isPresent()){
  190. Holiday data = holiday.get();
  191. holidayStr = data.getIsRest().intValue() == 1 ? data.getName() : "班";
  192. }
  193. dataTime.put("holiday",holidayStr);//节假日
  194. dataTimes.add(dataTime);
  195. });
  196. result.put("dateTimes", dataTimes);
  197. result.put("datas", datas);
  198. return result;
  199. }
  200. if (houseNumberStatusDto.getShowType() == 2) {
  201. result.put("data", buildResultOne(houseList, houseNumberList));
  202. return result;
  203. }
  204. return null;
  205. }
  206. @Override
  207. public List<?> queryListWithHouse(HouseNumberStatusDto houseNumberStatusDto) {
  208. String managerId = houseNumberStatusDto.getManagerId();
  209. if (StringUtils.isBlank(managerId)) return Collections.emptyList();
  210. List<House> houseList = housePriceService.queryHouseListByManagerId(houseNumberStatusDto.getManagerId());
  211. if (houseList == null || houseList.isEmpty()) return houseList;
  212. HouseNumberDto houseNumberDto = new HouseNumberDto();
  213. houseNumberDto.setHouseIdList(houseList.stream().map(House::getId).collect(Collectors.toList()));
  214. houseNumberDto.setHouseStatus(houseNumberStatusDto.getStatus());
  215. List<HouseNumberDto> houseNumberList = houseNumberDao.queryListOne(houseNumberDto);
  216. if (houseNumberList == null || houseNumberList.isEmpty()) return houseList;
  217. return buildResultOne(houseList, houseNumberList);
  218. }
  219. @SneakyThrows
  220. @Override
  221. public void modifyStatusBatch(HouseNumberStatusDto houseNumberStatusDto) {
  222. Integer status = houseNumberStatusDto.getStatus();
  223. String createId = houseNumberStatusDto.getCreateId();
  224. Date dataTime = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second);
  225. if (status == 2) {
  226. // 关房
  227. String[] setDateStr = houseNumberStatusDto.getSetDate().split(",");
  228. List<String> dateStrListBetween = DateUtil.getDateStrListBetween(DateUtil.parseDateOnly(setDateStr[0]), DateUtil.parseDateOnly(setDateStr[1]));
  229. List<String> houseNumberIds = houseNumberStatusDto.getHouseNumberIds();
  230. List<HouseNumberStatus> houseNumberStatusList = new ArrayList<>();
  231. houseNumberIds.forEach(houseNumberId -> {
  232. HouseNumberStatus houseNumberStatus = new HouseNumberStatus();
  233. houseNumberStatus.setNumberId(houseNumberId);
  234. houseNumberStatus.setStatus(status);
  235. houseNumberStatus.setCreateId(createId);
  236. houseNumberStatus.setCreateDate(dataTime);
  237. dateStrListBetween.forEach(dateStr -> {
  238. HouseNumberStatus houseNumberStatusNew = new HouseNumberStatus();
  239. BeanUtils.copyProperties(houseNumberStatus, houseNumberStatusNew);
  240. houseNumberStatusNew.setId(Func.newGuid());
  241. houseNumberStatusNew.setCloseType(houseNumberStatusDto.getCloseType());
  242. houseNumberStatusNew.setSetDate(dateStr);
  243. houseNumberStatusNew.setRemark(houseNumberStatusDto.getRemark());
  244. houseNumberStatusList.add(houseNumberStatusNew);
  245. });
  246. });
  247. houseNumberStatusDao.saveBatch(houseNumberStatusList);
  248. } else if (status == 0) {
  249. // 开房
  250. houseNumberStatusDto.setModifyDate(dataTime);
  251. houseNumberStatusDao.updateStatus(houseNumberStatusDto);
  252. }
  253. }
  254. @SneakyThrows
  255. @Override
  256. public void modifyStatus(HouseNumberStatusDto houseNumberStatusDto) {
  257. Integer status = houseNumberStatusDto.getStatus();
  258. String createId = houseNumberStatusDto.getCreateId();
  259. Date dataTime = DateUtil.formateDate(DateUtil.getCurrentDate(), DateUtil.Time_Formatter_Second);
  260. if (status == 2) {
  261. // 关房
  262. HouseNumberStatus houseNumberStatus = new HouseNumberStatus();
  263. BeanUtils.copyProperties(houseNumberStatusDto, houseNumberStatus);
  264. houseNumberStatus.setId(Func.newGuid());
  265. houseNumberStatus.setCreateDate(dataTime);
  266. houseNumberStatus.setCreateId(createId);
  267. houseNumberStatusDao.saveBatch(Collections.singletonList(houseNumberStatus));
  268. } else if (status == 0) {
  269. // 开房
  270. houseNumberStatusDto.setModifyDate(dataTime);
  271. houseNumberStatusDao.updateStatus(houseNumberStatusDto);
  272. }
  273. }
  274. private List<JSONObject> buildResultOne(List<House> houseList, List<HouseNumberDto> houseNumberList) {
  275. List<JSONObject> result = new ArrayList<>();
  276. Map<String, List<HouseNumber>> houseNumberMap = houseNumberList.stream().collect(Collectors.groupingBy(HouseNumber::getHouseId));
  277. houseList.forEach(house -> {
  278. JSONObject houseJosoObj = (JSONObject) JSONObject.toJSON(house);
  279. houseJosoObj.put("houseNumberList", houseNumberMap.getOrDefault(house.getId(), Collections.emptyList()));
  280. result.add(houseJosoObj);
  281. });
  282. return result;
  283. }
  284. /**
  285. * 获取对象null值属性名称,用于BeanUtils.copyProperties忽略字段
  286. */
  287. private String[] getNullPropertyNames(Object source) {
  288. final BeanWrapper src = new BeanWrapperImpl(source);
  289. PropertyDescriptor[] pds = src.getPropertyDescriptors();
  290. Set<String> emptyNames = new HashSet<String>();
  291. for (PropertyDescriptor pd : pds) {
  292. Object srcValue = src.getPropertyValue(pd.getName());
  293. if (srcValue == null) {
  294. emptyNames.add(pd.getName());
  295. }
  296. }
  297. String[] result = new String[emptyNames.size()];
  298. return emptyNames.toArray(result);
  299. }
  300. /**
  301. * 获取房型指定日期的价格
  302. *
  303. * @return 原价 or 周日内最新一条改价记录的价格
  304. */
  305. private Double getPrice(Date dateIn, House house, List<HousePriceDto> housePriceDtoList) {
  306. Double price = house.getPrice();
  307. if (housePriceDtoList == null || housePriceDtoList.isEmpty()) return price;
  308. for (HousePriceDto priceDto : housePriceDtoList) {
  309. String[] date = priceDto.getSetDate().split(",");
  310. Date startDate = DateUtil.parseDateOnly(date[0]);
  311. Date endDate = DateUtil.parseDateOnly(date[1]);
  312. assert startDate != null;
  313. boolean flag = DateUtil.isEffectiveDate(dateIn, startDate, endDate) && house.getId().equals(priceDto.getHouseId());
  314. if (flag) {
  315. price = priceDto.getPrice();
  316. break;
  317. }
  318. }
  319. return price;
  320. }
  321. /**
  322. * 获取当日房型剩余房间号
  323. *
  324. * @return 当天剩余房间数量
  325. */
  326. private int getSum(String dateIn, List<HouseNumberDto> houseNumberList) {
  327. int total = houseNumberList.size();
  328. int used = 0;
  329. for (HouseNumberDto houseNumber : houseNumberList) {
  330. List<HouseNumberStatusDto> houseNumberStatuses = houseNumber.getHouseNumberStatuses();
  331. if (houseNumberStatuses != null && !houseNumberStatuses.isEmpty()) {
  332. boolean flag = houseNumberStatuses.stream().anyMatch(item -> dateIn.equals(item.getSetDate()));
  333. if (flag) {
  334. used++;
  335. }
  336. }
  337. }
  338. return total - used;
  339. }
  340. }