BuildingService.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. package platform.modules.carrier.service;
  2. import com.github.pagehelper.PageHelper;
  3. import com.github.pagehelper.PageInfo;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import org.springframework.transaction.annotation.Transactional;
  8. import platform.common.Constant;
  9. import platform.common.base.model.DictionaryItem;
  10. import platform.common.base.service.BaseService;
  11. import platform.common.base.service.DictionaryItemService;
  12. import platform.modules.api.dto.SkyImageCount;
  13. import platform.modules.build.entity.BuildFloor;
  14. import platform.modules.build.service.FloorService;
  15. import platform.modules.carrier.dao.BuildingDao;
  16. import platform.modules.carrier.dto.*;
  17. import platform.modules.carrier.entity.*;
  18. import platform.modules.government.entity.Street;
  19. import platform.modules.government.service.StreetService;
  20. import tk.mybatis.mapper.entity.Example;
  21. import java.time.LocalDate;
  22. import java.time.format.DateTimeFormatter;
  23. import java.time.temporal.ChronoUnit;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. /**
  27. * @author kevin
  28. * @since 2019/3/31 2:48 PM
  29. */
  30. @Service
  31. @Transactional
  32. public class BuildingService extends BaseService<Building> {
  33. @Autowired
  34. private BuildingDao buildingDao;
  35. @Autowired
  36. private FloorService floorService;
  37. @Autowired
  38. private ParkService parkService;
  39. @Autowired
  40. private IcContractService icContractService;
  41. @Autowired
  42. private DictionaryItemService dictionaryItemService;
  43. @Autowired
  44. private StreetService streetService;
  45. @Autowired
  46. private BuildingService buildingService;
  47. /**
  48. * 获取园区所有载体
  49. *
  50. * @param pageNum
  51. * @param pageSize
  52. * @param condition
  53. * @return
  54. */
  55. public PageInfo<Building> getParkBuildings(Integer pageNum, Integer pageSize, SearchCondition condition) {
  56. PageHelper.startPage(pageNum, pageSize);
  57. List<Building> buildingList = buildingDao.getParkBuildings(condition);
  58. for (Building building : buildingList) {
  59. building.setCarrier_attriute_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.FACTORY_TYPE, building.getCarrier_attriute() + ""));
  60. building.setBuild_use_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.BUILDING_USES, building.getBuild_use() + ""));
  61. building.setCarrier_structure_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.CARRIER_STRUCTURE, building.getCarrier_structure() + ""));
  62. building.setRemain_area(floorService.getReaminAreaByBuildId(building.getId()));
  63. if (building.getArea() != null){
  64. building.setSumBuildArea(building.getArea());
  65. }
  66. else {
  67. //楼栋没有建筑面积获取楼层建筑面积
  68. double totalFloorArea = floorService.getSumFloorArea(building.getId());
  69. building.setSumBuildArea(totalFloorArea);
  70. }
  71. CarrierLibraryResult areaStatistic = buildingService.getBuildAreaStatistic(building.getId());
  72. if (areaStatistic != null){
  73. building.setSumRestArea(areaStatistic.getSumRestArea());
  74. }
  75. building.setSumRentArea(buildingService.getBuildRentAreaStatistic(building.getId()));
  76. }
  77. return new PageInfo<>(buildingList);
  78. }
  79. /**
  80. * 获取园区所有载体
  81. *
  82. * @param condition
  83. * @return
  84. */
  85. public List<Building> getBuildings(SearchCondition condition) {
  86. List<Building> buildingList = buildingDao.getParkBuildings(condition);
  87. for (Building building : buildingList) {
  88. DictionaryItem attItem = dictionaryItemService.
  89. findByTypeAndValue(Constant.DictionaryType.FACTORY_TYPE, building.getCarrier_attriute());
  90. DictionaryItem natureItem = dictionaryItemService.
  91. findByTypeAndValue(Constant.DictionaryType.FACTORY_NATURE, building.getCarrier_nature().toString());
  92. building.setCarrier_attriute_desc(attItem.getName());
  93. building.setCarrier_nature_desc(natureItem.getName());
  94. }
  95. return buildingList;
  96. }
  97. /**
  98. * 新增载体
  99. *
  100. * @param building
  101. */
  102. public void addCarrier(Building building) {
  103. if (building.getFloorList() != null && building.getFloorList().size() > 0) {
  104. building.setFloor_count(building.getFloorList().size());
  105. }
  106. if (building.getPark_id() != null){
  107. building.setNo(createBuildingNo(building.getPark_id()));
  108. }
  109. int buildId = this.insertAndGetId(building);
  110. if (building.getFloorList() != null && building.getFloorList().size() > 0) {
  111. int floorIndex = 0;
  112. for (BuildFloor floor : building.getFloorList()) {
  113. floor.setBuild_number(building.getBuild_name());
  114. floor.setBuild_id(building.getPark_id());
  115. floor.setBuilding_id(buildId);
  116. floor.setRemain_area(floor.getArea());
  117. floor.setNo(createFloorNo(buildId, floorIndex));
  118. floorService.insertAndGetId(floor);
  119. floorIndex ++;
  120. }
  121. }
  122. }
  123. /**
  124. * 生成楼栋楼层编号
  125. *
  126. * @param buildId
  127. */
  128. private String createFloorNo(int buildId, Integer floorIndex) {
  129. String buildNo = findById(buildId).getNo();
  130. String floorNo;
  131. if (floorIndex < 10){
  132. floorNo = buildNo + "F0" + floorIndex;
  133. }
  134. else {
  135. floorNo = buildNo + "F" +floorIndex;
  136. }
  137. return floorNo;
  138. }
  139. /**
  140. * 生成园区楼栋编号
  141. *
  142. * @param park_id
  143. */
  144. private String createBuildingNo(Integer park_id) {
  145. String parkNo = parkService.findById(park_id).getNo();
  146. //获取园区载体数
  147. int buildNum = buildingDao.findBuildingNumByParkId(park_id) + 1;
  148. String buildNo;
  149. if (buildNum < 10) {
  150. buildNo = parkNo + "FB0" + buildNum;
  151. }
  152. else {
  153. buildNo = parkNo + "FB" + buildNum;
  154. }
  155. return buildNo;
  156. }
  157. /**
  158. * 载体详情
  159. *
  160. * @param id
  161. * @return
  162. */
  163. public Building findBuildingById(Integer id) {
  164. Building building = this.findById(id);
  165. if (building != null) {
  166. if (building.getArea() == null){
  167. building.setSumBuildArea(building.getArea());
  168. //楼栋没有建筑面积获取楼层建筑面积
  169. double totalFloorArea = floorService.getSumFloorArea(building.getId());
  170. building.setArea(totalFloorArea);
  171. }
  172. building.setRemain_area(floorService.getReaminAreaByBuildId(building.getId()));
  173. building.setRent_area(buildingService.getBuildRentAreaStatistic(building.getId()));
  174. Park park = parkService.findById(building.getPark_id());
  175. if (park != null) {
  176. building.setPark_name(park.getName());
  177. }
  178. //获取楼层
  179. building.setFloorList(floorList(building.getId()));
  180. building.setCarrier_attriute_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.FACTORY_TYPE, building.getCarrier_attriute() + ""));
  181. building.setBuild_use_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.BUILDING_USES, building.getBuild_use() + ""));
  182. building.setCarrier_structure_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.CARRIER_STRUCTURE, building.getCarrier_structure() + ""));
  183. building.setDriving_type_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.DRIVING_TYPE, building.getDriving_type() + ""));
  184. building.setDriving_load_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.DRIVING_LOAD, building.getDriving_load() + ""));
  185. building.setDriving_spqn_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.DRIVING_SPQN, building.getDriving_spqn() + ""));
  186. building.setFire_rating_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.FIRE_RATING, building.getFire_rating() + ""));
  187. // building.setBase_setting_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.BASE_SETTING, building.getBase_setting() + ""));
  188. building.setSpqn_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.SPQN, building.getSpqn() + ""));
  189. }
  190. return building;
  191. }
  192. /**
  193. * 编辑载体
  194. *
  195. * @param building
  196. */
  197. public void editCarrier(Building building) {
  198. if (building.getFloorList() != null && building.getFloorList().size() > 0) {
  199. building.setFloor_count(building.getFloorList().size());
  200. }
  201. this.updateSelective(building);
  202. if (building.getFloorList() != null && building.getFloorList().size() > 0) {
  203. //已有的楼层
  204. List<BuildFloor> floors = floorList(building.getId());
  205. List<Integer> oldList = new ArrayList<>();
  206. for (BuildFloor oldf : floors) {
  207. oldList.add(oldf.getId());
  208. }
  209. List<Integer> diffList = new ArrayList<>(oldList);
  210. List<Integer> newList = new ArrayList<>();
  211. List<BuildFloor> floorList = floorService.findFloorsByBuildingId(building.getId());
  212. int floorIndex = floorList.size() + 1;
  213. for (BuildFloor newf : building.getFloorList()) {
  214. if (newf.getId() != null){
  215. newList.add(newf.getId());
  216. BuildFloor floor = floorService.findById(newf.getId());
  217. floor.setArea(newf.getArea());
  218. floor.setFloor(newf.getFloor());
  219. floor.setCapacity(newf.getCapacity());
  220. floor.setFloor_height(newf.getFloor_height());
  221. floor.setReason(newf.getReason());
  222. floor.setIs_use(newf.getIs_use());
  223. floorService.updateFloor(floor);
  224. }else {
  225. newf.setBuilding_id(building.getId());
  226. newf.setNo(createFloorNo(building.getId(), floorIndex));
  227. newf.setBuild_number(building.getBuild_name());
  228. newf.setBuild_id(building.getPark_id());
  229. newf.setRemain_area(newf.getArea());
  230. floorService.insertAndGetId(newf);
  231. }
  232. }
  233. //差集删除
  234. diffList.removeAll(newList);
  235. for (Integer id : diffList) {
  236. BuildFloor floor = new BuildFloor();
  237. floor.setDel_flag(true);
  238. floor.setId(id);
  239. floorService.updateSelective(floor);
  240. }
  241. }
  242. }
  243. /**
  244. * 获取楼层最大下标
  245. *
  246. * @param id
  247. */
  248. private void getFloorLastIndex(Integer id) {
  249. }
  250. /**
  251. * 获取载体所有楼层
  252. *
  253. * @param id
  254. * @return
  255. */
  256. public List<BuildFloor> floorList(Integer id) {
  257. BuildFloor floor = new BuildFloor();
  258. floor.setBuilding_id(id);
  259. floor.setDel_flag(false);
  260. return floorService.findListByWhere(floor);
  261. }
  262. /**
  263. * 载体查询
  264. *
  265. * @param query
  266. * @return
  267. */
  268. public PageInfo<Building> getBuildingsByQuery(CarrierQueryDto query) {
  269. if (StringUtils.isNotEmpty(query.getDemandTime())){
  270. LocalDate localDate = LocalDate.now().plusMonths(Integer.parseInt(query.getDemandTime()));
  271. query.setDemandDate(localDate.toString());
  272. }
  273. PageHelper.startPage(query.getPageNum(), query.getPageSize());
  274. List<Building> buildingList = buildingDao.getBuildingsByQuery(query);
  275. PageInfo<Building> pageInfo = new PageInfo<>(buildingList);
  276. if (buildingList != null && buildingList.size() > 0) {
  277. //符合条件的载体集合
  278. List<Building> conformList = getComformData(query, buildingList);
  279. //返回符合条件的结果
  280. PageInfo comform = new PageInfo<>(conformList);
  281. comform.setPageNum(query.getPageNum());
  282. comform.setTotal(pageInfo.getTotal());
  283. return comform;
  284. }
  285. return pageInfo;
  286. }
  287. /**
  288. * 获取符合条件的集合(代码层面)
  289. *
  290. * @param query
  291. * @param buildingList
  292. */
  293. public List<Building> getComformData(CarrierQueryDto query, List<Building> buildingList) {
  294. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  295. //符合条件的载体集合
  296. List<Building> conformList = new ArrayList<>();
  297. String demandTime = query.getDemandTime();
  298. //入住时长
  299. int checkinTIme = 0;
  300. if (query.getCheckinTime() != null){
  301. checkinTIme = query.getCheckinTime() * 12;
  302. }
  303. //最大入住时长
  304. LocalDate maxCheckin = LocalDate.now();
  305. if (demandTime != null && !demandTime.equals("")) {
  306. maxCheckin = LocalDate.now().plusMonths(Integer.parseInt(demandTime));
  307. }
  308. //获取已签订但是还没有入住的合同
  309. for (Building building : buildingList) {
  310. building.setCarrier_attriute_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.FACTORY_TYPE, building.getCarrier_attriute() + ""));
  311. building.setBuild_use_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.BUILDING_USES, building.getBuild_use() + ""));
  312. building.setCarrier_structure_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.CARRIER_STRUCTURE, building.getCarrier_structure() + ""));
  313. //楼栋符合标记
  314. Boolean is_conform = true;
  315. long monthDiff = 0;
  316. LocalDate earliestCheckinTime = LocalDate.now();
  317. String maxCheckinTime = "";
  318. building.setEarliest_checkin_date(earliestCheckinTime.toString());
  319. //获取楼栋剩余面积
  320. query.setBuilding_id(building.getId());
  321. Double remianArea = buildingDao.findBuildingRemainArea(query);
  322. building.setRemain_area(remianArea);
  323. //单层
  324. if (query.getCount() != null && query.getCount() == 1) {
  325. //楼层信息
  326. List<BuildFloor> floorList = floorService.findByQuery(building.getId(),query);
  327. if (floorList != null && floorList.size() > 0) {
  328. for (BuildFloor floor : floorList) {
  329. Double calArea = 0d;
  330. Double reaminArea = floor.getRemain_area();
  331. //最小面积
  332. if (query.getMinArea() != null && query.getMinArea() > 0) {
  333. if (floor.getRemain_area() < query.getMinArea()) {
  334. //获取最早入住时间
  335. if (StringUtils.isNotEmpty(query.getDemandTime())){
  336. List<ContractFloor> endContractList = icContractService.findEndContractList(query.getDemandDate(), building.getId());
  337. if (endContractList != null && endContractList.size() > 0) {
  338. for (ContractFloor contract : endContractList) {
  339. calArea = reaminArea + contract.getFloor_area();
  340. if (calArea >= query.getMinArea()) {
  341. earliestCheckinTime = LocalDate.parse(contract.getContract_end(), formatter);
  342. break;
  343. }
  344. }
  345. }
  346. }
  347. //满足面积要求,获取已签订但是还没有入住的合同
  348. List<ContractFloor> contractList =
  349. icContractService.findNotStayYet(floor.getId(), building.getId(), query.getDemandDate(), null);
  350. if (contractList != null && contractList.size() > 0) {
  351. LocalDate lastCheckoutTime = LocalDate.now();
  352. for (ContractFloor contract : contractList) {
  353. calArea = 0d;
  354. //每次获取合同面积的获取当前时间到期的面积
  355. List<ContractFloor> freedList = icContractService.findEndContractList(contract.getContract_start(), building.getId());
  356. if (freedList != null && freedList.size() > 0){
  357. for (ContractFloor contractFloor : freedList) {
  358. calArea += contractFloor.getFloor_area();
  359. }
  360. }
  361. calArea = calArea - contract.getArea();
  362. //不满足最低需求面积条件
  363. if (calArea <= query.getMinArea()) {
  364. //最晚搬离日期
  365. LocalDate checkoutTime =
  366. LocalDate.parse(contract.getContract_start(), formatter);
  367. if (lastCheckoutTime.isBefore(checkoutTime)) {
  368. lastCheckoutTime = checkoutTime;
  369. }
  370. maxCheckinTime = lastCheckoutTime.toString();
  371. long monthsDiff = ChronoUnit.MONTHS.between(checkoutTime, maxCheckin);
  372. //获取最大的月数差
  373. if (monthDiff < ChronoUnit.MONTHS.between(maxCheckin, checkoutTime)) {
  374. monthDiff = ChronoUnit.MONTHS.between(maxCheckin, checkoutTime);
  375. }
  376. }
  377. }
  378. }
  379. }
  380. }
  381. }
  382. if ((int) monthDiff < checkinTIme) {
  383. is_conform = false;
  384. }
  385. }
  386. else {
  387. is_conform = false;
  388. }
  389. } else {//多层
  390. List<ContractFloor> contractList =
  391. icContractService.findNotStayYet(null, building.getId(), query.getDemandDate(), null);
  392. if (contractList != null && contractList.size() > 0) {
  393. Double calArea = 0d;
  394. Double reaminArea = buildingDao.findBuildingRemainArea(query);
  395. LocalDate lastCheckoutTime = LocalDate.now();
  396. for (ContractFloor contract : contractList) {
  397. //每次获取合同面积的获取当前时间到期的面积
  398. List<ContractFloor> freedList = icContractService.findEndContractList(contract.getContract_start(), building.getId());
  399. if (freedList != null && freedList.size() > 0){
  400. for (ContractFloor contractFloor : freedList) {
  401. calArea += contractFloor.getFloor_area();
  402. }
  403. }
  404. calArea = calArea - contract.getArea();
  405. //不满足最低需求面积条件
  406. if (query.getMinArea() != null && calArea < query.getMinArea()) {
  407. //最晚搬离日期
  408. LocalDate checkoutTime = LocalDate.parse(contract.getContract_start(), formatter);
  409. if (lastCheckoutTime.isBefore(checkoutTime)) {
  410. lastCheckoutTime = checkoutTime;
  411. }
  412. maxCheckinTime = lastCheckoutTime.toString();
  413. long monthsDiff = ChronoUnit.MONTHS.between(checkoutTime, maxCheckin);
  414. System.out.println(monthsDiff);
  415. //获取最晚搬离日和最晚入住日最大的月数差
  416. if (monthDiff < ChronoUnit.MONTHS.between(maxCheckin, checkoutTime)) {
  417. monthDiff = ChronoUnit.MONTHS.between(maxCheckin, checkoutTime);
  418. }
  419. }
  420. }
  421. //获取最早入住时间
  422. if (StringUtils.isNotEmpty(query.getDemandTime())){
  423. List<ContractFloor> endContractList = icContractService.findEndContractList(query.getDemandDate(), building.getId());
  424. if (endContractList != null && endContractList.size() > 0) {
  425. calArea = 0d;
  426. for (ContractFloor contract : endContractList) {
  427. calArea = reaminArea + contract.getFloor_area();
  428. if (calArea >= query.getMinArea()) {
  429. earliestCheckinTime = LocalDate.parse(contract.getContract_end(), formatter);
  430. break;
  431. }
  432. }
  433. }
  434. }
  435. if ((int) monthDiff < checkinTIme) {
  436. is_conform = false;
  437. }
  438. }
  439. }
  440. if (is_conform) {
  441. //最多入住时长
  442. if (!"".equals(maxCheckinTime)) {
  443. building.setMax_checkin_date(dateTimeDiff(earliestCheckinTime.toString(), maxCheckinTime));
  444. building.setLatest_departure_date(maxCheckinTime);
  445. }
  446. building.setEarliest_checkin_date(earliestCheckinTime.toString());
  447. conformList.add(building);
  448. }
  449. }
  450. return conformList;
  451. }
  452. private void getBuildingsByMoreFloors(
  453. Building building, CarrierQueryDto query, long monthDiff, String maxCheckinTime,
  454. LocalDate maxCheckin, Double calArea, LocalDate earliestCheckinTime) {
  455. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  456. List<ContractFloor> contractList =
  457. icContractService.findNotStayYet(null, building.getId(), query.getDemandDate(), null);
  458. if (contractList != null && contractList.size() > 0) {
  459. Double reaminArea = building.getRemain_area();
  460. LocalDate lastCheckoutTime = LocalDate.now();
  461. for (ContractFloor contract : contractList) {
  462. reaminArea = reaminArea - contract.getFloor_area();
  463. //不满足最低需求面积条件
  464. if (reaminArea <= query.getMinArea()) {
  465. //最晚搬离日期
  466. LocalDate checkoutTime =
  467. LocalDate.parse(contract.getContract_start(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  468. if (lastCheckoutTime.isBefore(checkoutTime)) {
  469. lastCheckoutTime = checkoutTime;
  470. }
  471. maxCheckinTime = lastCheckoutTime.toString();
  472. //获取最大的月数差
  473. monthDiff = ChronoUnit.MONTHS.between(checkoutTime, maxCheckin);
  474. }
  475. }
  476. for (ContractFloor contract : contractList) {
  477. calArea = reaminArea + contract.getFloor_area();
  478. if (calArea >= query.getMinArea()) {
  479. earliestCheckinTime = LocalDate.parse(contract.getContract_end(), formatter);
  480. break;
  481. }
  482. }
  483. }
  484. }
  485. /**
  486. * 获取去时间差
  487. *
  488. * @param startDate
  489. * @param endDate
  490. * @return
  491. */
  492. private String dateTimeDiff(String startDate, String endDate) {
  493. // LocalDate now = LocalDate.now();
  494. LocalDate start = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  495. LocalDate end = LocalDate.parse(endDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  496. long monthDiff = ChronoUnit.MONTHS.between(start, end);
  497. LocalDate pulsTime = LocalDate.now().plusMonths(monthDiff);
  498. // long dayDiff = ChronoUnit.DAYS.between(start, pulsTime);
  499. return monthDiff + "月";
  500. }
  501. /**
  502. * 根据园区id 载体名称查询载体
  503. */
  504. public PageInfo<BuildingFloorVo> getBuildingsPage(Integer pageNum, Integer pageSize, CustomSearchCondition condition) {
  505. PageHelper.startPage(pageNum, pageSize);
  506. List<BuildingFloorVo> buildingList = buildingDao.findBuildingList(condition);
  507. return new PageInfo<>(buildingList);
  508. }
  509. /**
  510. * 获取方案详情
  511. *
  512. * @param id
  513. * @return
  514. */
  515. public Building findCheckinDetail(Integer id, CarrierQueryDto query) {
  516. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  517. LocalDate earliestCheckinTime = LocalDate.now();
  518. String maxCheckinTime = null;
  519. String demandTime = query.getDemandTime();
  520. Building building = this.findById(id);
  521. if (building != null) {
  522. building.setCarrier_attriute_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.FACTORY_TYPE, building.getCarrier_attriute() + ""));
  523. building.setBuild_use_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.BUILDING_USES, building.getBuild_use() + ""));
  524. building.setCarrier_structure_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.CARRIER_STRUCTURE, building.getCarrier_structure() + ""));
  525. building.setDriving_type_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.DRIVING_TYPE, building.getDriving_type() + ""));
  526. building.setDriving_load_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.DRIVING_LOAD, building.getDriving_load() + ""));
  527. building.setDriving_spqn_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.DRIVING_SPQN, building.getDriving_spqn() + ""));
  528. building.setFire_rating_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.FIRE_RATING, building.getFire_rating() + ""));
  529. // building.setBase_setting_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.BASE_SETTING, building.getBase_setting() + ""));
  530. building.setSpqn_desc(dictionaryItemService.findNameByTypeAndValue(Constant.DictionaryType.SPQN, building.getSpqn() + ""));
  531. //获取楼层
  532. BuildFloor buildFloor = new BuildFloor();
  533. buildFloor.setBuilding_id(id);
  534. buildFloor.setIs_use(true);
  535. List<BuildFloor> floorList = floorService.findListByWhere(buildFloor);
  536. if (query.getMinArea() != null || query.getMaxArea() != null) {
  537. Double calArea;
  538. if (query.getCount() == 1) {
  539. for (BuildFloor floor : floorList) {
  540. Double reaminArea = floor.getRemain_area();
  541. //最早入住日期
  542. List<ContractFloor> endContractList = icContractService.findEndContractList(demandTime, building.getId());
  543. if (endContractList != null && endContractList.size() > 0) {
  544. for (ContractFloor contract : endContractList) {
  545. calArea = reaminArea + contract.getFloor_area();
  546. if (calArea >= query.getMinArea()) {
  547. earliestCheckinTime = LocalDate.parse(contract.getContract_end(), formatter);
  548. break;
  549. }
  550. }
  551. }
  552. floor.setEarliest_checkin_date(earliestCheckinTime.toString());
  553. //最晚搬离日期
  554. List<ContractFloor> contractList =
  555. icContractService.findNotStayYet(floor.getId(), building.getId(), query.getDemandDate(), null);
  556. if (contractList != null && contractList.size() > 0) {
  557. for (ContractFloor contract : contractList) {
  558. reaminArea = reaminArea - contract.getFloor_area();
  559. //不满足最低需求面积条件
  560. if (reaminArea <= query.getMinArea()) {
  561. //最晚搬离日期
  562. LocalDate checkoutTime =
  563. LocalDate.parse(contract.getContract_start(), formatter);
  564. maxCheckinTime = checkoutTime.toString();
  565. }
  566. }
  567. }
  568. floor.setLatest_departure_date(maxCheckinTime);
  569. }
  570. } else {
  571. List<ContractFloor> contractList =
  572. icContractService.findNotStayYet(null, building.getId(), query.getDemandDate(), null);
  573. if (contractList != null && contractList.size() > 0) {
  574. Double reaminArea = building.getRemain_area();
  575. LocalDate lastCheckoutTime = LocalDate.now();
  576. for (ContractFloor contract : contractList) {
  577. reaminArea = reaminArea - contract.getFloor_area();
  578. //不满足最低需求面积条件
  579. if (reaminArea <= query.getMinArea()) {
  580. //最晚搬离日期
  581. LocalDate checkoutTime =
  582. LocalDate.parse(contract.getContract_start(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  583. if (lastCheckoutTime.isBefore(checkoutTime)) {
  584. lastCheckoutTime = checkoutTime;
  585. }
  586. maxCheckinTime = lastCheckoutTime.toString();
  587. }
  588. }
  589. for (ContractFloor contract : contractList) {
  590. calArea = reaminArea + contract.getFloor_area();
  591. if (calArea >= query.getMinArea()) {
  592. earliestCheckinTime = LocalDate.parse(contract.getContract_end(), formatter);
  593. break;
  594. }
  595. }
  596. }
  597. }
  598. }
  599. for (BuildFloor floor : floorList) {
  600. floor.setLatest_departure_date(maxCheckinTime);
  601. floor.setEarliest_checkin_date(earliestCheckinTime.toString());
  602. }
  603. building.setFloorList(floorList);
  604. //获取园区基本信息
  605. Park park = parkService.findById(building.getPark_id());
  606. Street street = streetService.findById(park.getStreet_id());
  607. park.setStreetName(street.getName());
  608. building.setPark(park);
  609. //合同到期企业
  610. List<ContractFloor> contractList = icContractService.findEndContractList(demandTime, id);
  611. building.setContractList(contractList);
  612. }
  613. return building;
  614. }
  615. public static void main(String[] args) {
  616. LocalDate maxCheckin = LocalDate.now().plusMonths(24);
  617. LocalDate now = LocalDate.now();
  618. System.out.printf(maxCheckin.toString());
  619. System.out.printf(String.valueOf(ChronoUnit.MONTHS.between(now, maxCheckin)));
  620. }
  621. /**
  622. * 批量修改
  623. *
  624. * @param buildingBatchDto
  625. */
  626. public Boolean batchUpdate(BuildingBatchDto buildingBatchDto) {
  627. List<String> ids = buildingBatchDto.getIds();
  628. if (ids != null && ids.size() > 0) {
  629. for (String id : ids) {
  630. //是否有合同
  631. List<ContractFloor> contracts = icContractService.findByBuildingId(Integer.parseInt(id));
  632. if (contracts.size() > 0){
  633. return false;
  634. }
  635. Building building = new Building();
  636. building.setId(Integer.parseInt(id));
  637. building.setIs_use(buildingBatchDto.getIsUse());
  638. building.setReason(buildingBatchDto.getReason());
  639. updateSelective(building);
  640. }
  641. }
  642. return true;
  643. }
  644. /**
  645. * 批量删除
  646. *
  647. * @param ids
  648. */
  649. public Boolean batchDelete(List<Integer> ids) {
  650. if (ids != null && ids.size() > 0) {
  651. for (Integer id : ids) {
  652. List<ContractFloor> contracts = icContractService.findByBuildingId(id);
  653. if (contracts.size() > 0){
  654. return false;
  655. }
  656. Building building = new Building();
  657. building.setId(id);
  658. building.setDel_flag(true);
  659. updateSelective(building);
  660. }
  661. }
  662. return true;
  663. }
  664. /**
  665. * 根据条件查询载体
  666. *
  667. * @param condition
  668. * @return
  669. */
  670. public List<Building> findBuildingByCondition(SearchCondition condition) {
  671. return buildingDao.findBuildingByCondition(condition);
  672. }
  673. /**
  674. * 地图预警
  675. *
  676. * @return
  677. */
  678. public List<WarningDto> findUnuseBuilding() {
  679. Building where = new Building();
  680. // where.setIs_use(false);
  681. List<Building> buildingList = findListByWhere(where);
  682. List<WarningDto> warningDtos = new ArrayList<>();
  683. if (buildingList.size() > 0) {
  684. for (Building building : buildingList) {
  685. WarningDto warning = new WarningDto();
  686. warning.setId(building.getId());
  687. warning.setName(building.getBuild_name());
  688. if (building.getIs_use()) {
  689. warning.setState("used");
  690. } else {
  691. warning.setState("unused");
  692. }
  693. warningDtos.add(warning);
  694. }
  695. }
  696. return warningDtos;
  697. }
  698. @Transactional(readOnly = true)
  699. public List<Building> findList() {
  700. Example example = new Example(Building.class);
  701. Example.Criteria criteria = example.createCriteria();
  702. criteria.andEqualTo("del_flag", 0);
  703. //倒序
  704. //example.orderBy("create_time").desc();
  705. example.setOrderByClause("id");
  706. List<Building> buildings = this.selectByExample(example);
  707. return buildings;
  708. }
  709. public int updateNoBatch(List<Building> buildings) {
  710. return buildingDao.updateNoBatch(buildings);
  711. }
  712. /**
  713. * 载体库楼栋列表
  714. *
  715. * @param condition
  716. * @return
  717. */
  718. public List<Building> getBuildingStatistic(SearchCondition condition) {
  719. return buildingDao.getBuildingStatistic(condition);
  720. }
  721. public CarrierLibraryResult getBuildAreaStatistic(Integer id) {
  722. return buildingDao.getBuildAreaStatistic(id);
  723. }
  724. public Integer getBuildingCount(Integer id) {
  725. return buildingDao.getBuildingCount(id);
  726. }
  727. public Double getBuildRentAreaStatistic(Integer id) {
  728. return buildingDao.getBuildRentAreaStatistic(id);
  729. }
  730. /**
  731. * 根据园区和楼栋名称获取楼栋
  732. *
  733. * @param id
  734. * @param build_number
  735. * @return
  736. */
  737. public Building findByParkIdAndName(Integer id, String build_number) {
  738. Example example = new Example(Building.class);
  739. Example.Criteria criteria = example.createCriteria();
  740. criteria.andEqualTo("del_flag", 0);
  741. criteria.andEqualTo("build_name", build_number);
  742. criteria.andEqualTo("park_id", id);
  743. List<Building> buildings = this.selectByExample(example);
  744. if (buildings.size() > 0){
  745. return buildings.get(0);
  746. }
  747. return null;
  748. }
  749. /**
  750. * 获取街道所有楼栋
  751. *
  752. * @param id
  753. * @return
  754. */
  755. public List<Building> findBySteetId(Integer id) {
  756. return buildingDao.findBySteetId(id);
  757. }
  758. /**
  759. * 获取街道建筑面积
  760. *
  761. * @param id
  762. * @return
  763. */
  764. public Double findStreetTotalArea(Integer id) {
  765. return buildingDao.findStreetTotalArea(id);
  766. }
  767. /**
  768. * 获取街道建筑面积
  769. *
  770. * @param id
  771. * @return
  772. */
  773. public Double findParkTotalArea(Integer id) {
  774. return buildingDao.findParkTotalArea(id);
  775. }
  776. /**
  777. * 获取载体建筑面积
  778. *
  779. * @param id
  780. * @return
  781. */
  782. public Double findBuildingTotalArea(Integer id) {
  783. return buildingDao.findBuildingTotalArea(id);
  784. }
  785. /**
  786. * 获取园区所有楼栋
  787. *
  788. * @param id
  789. * @return
  790. */
  791. public List<Building> findByParkId(Integer id) {
  792. Building building = new Building();
  793. building.setIs_use(true);
  794. building.setPark_id(id);
  795. return this.findListByWhere(building);
  796. }
  797. /**
  798. * 载体录入面积
  799. *
  800. * @param startTime
  801. * @param endTime
  802. * @return
  803. */
  804. public Double findCarrierEntryArea(String startTime, String endTime) {
  805. return buildingDao.findCarrierEntryArea(startTime, endTime);
  806. }
  807. /**
  808. * 载体分布(按街道)
  809. *
  810. * @param condition
  811. */
  812. public List<CarrierDistribution> getStreetBuildingDistribution(SearchCondition condition) {
  813. return buildingDao.getStreetBuildingDistribution(condition);
  814. }
  815. /**
  816. * 获取厂房面积统计
  817. *
  818. * @return
  819. */
  820. public List<SkyImageCount> factoryBuildingCount() {
  821. List<SkyImageCount> list = buildingDao.factoryBuildingCount();
  822. for (SkyImageCount skyImageCount : list) {
  823. if (skyImageCount.getBuildingArea() <= 0){
  824. //按楼层建筑面积和算
  825. }
  826. }
  827. return list;
  828. }
  829. /**
  830. * 相应时间内合同到期的企业
  831. *
  832. * @param startTime
  833. * @param endTime
  834. * @return
  835. */
  836. public List<SkyImageCount> findEndContractByTime(String startTime, String endTime) {
  837. return buildingDao.findEndContractByTime(startTime, endTime);
  838. }
  839. public Building findByNo(String no) {
  840. return buildingDao.findByNo(no);
  841. }
  842. }