QueryOweFeeImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. package com.java110.fee.bmo.impl;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.java110.dto.RoomDto;
  4. import com.java110.dto.fee.BillDto;
  5. import com.java110.dto.fee.BillOweFeeDto;
  6. import com.java110.dto.fee.FeeConfigDto;
  7. import com.java110.dto.fee.FeeDto;
  8. import com.java110.dto.owner.OwnerDto;
  9. import com.java110.dto.parking.ParkingSpaceDto;
  10. import com.java110.fee.bmo.IQueryOweFee;
  11. import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
  12. import com.java110.intf.community.IRoomInnerServiceSMO;
  13. import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
  14. import com.java110.intf.fee.IFeeInnerServiceSMO;
  15. import com.java110.intf.user.IOwnerInnerServiceSMO;
  16. import com.java110.utils.util.DateUtil;
  17. import com.java110.utils.util.StringUtil;
  18. import com.java110.vo.ResultVo;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.http.ResponseEntity;
  21. import org.springframework.stereotype.Service;
  22. import java.math.BigDecimal;
  23. import java.math.RoundingMode;
  24. import java.util.ArrayList;
  25. import java.util.Calendar;
  26. import java.util.Date;
  27. import java.util.List;
  28. @Service
  29. public class QueryOweFeeImpl implements IQueryOweFee {
  30. @Autowired
  31. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  32. @Autowired
  33. private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
  34. @Autowired
  35. private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
  36. @Autowired
  37. private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
  38. @Autowired
  39. private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
  40. @Override
  41. public ResponseEntity<String> query(FeeDto feeDto) {
  42. //查询费用信息arrearsEndTime
  43. feeDto.setArrearsEndTime(DateUtil.getCurrentDate());
  44. feeDto.setState(FeeDto.STATE_DOING);
  45. List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
  46. if (feeDtos == null || feeDtos.size() < 1) {
  47. feeDtos = new ArrayList<>();
  48. return ResultVo.createResponseEntity(feeDtos);
  49. }
  50. List<FeeDto> tmpFeeDtos = new ArrayList<>();
  51. for (FeeDto tmpFeeDto : feeDtos) {
  52. computeOweFee(tmpFeeDto);//计算欠费金额
  53. //如果金额为0 就排除
  54. if (tmpFeeDto.getFeePrice() > 0) {
  55. tmpFeeDtos.add(tmpFeeDto);
  56. }
  57. }
  58. return ResultVo.createResponseEntity(tmpFeeDtos);
  59. }
  60. @Override
  61. public ResponseEntity<String> queryAllOwneFee(FeeDto feeDto) {
  62. ResponseEntity<String> responseEntity = null;
  63. if (!freshFeeDtoParam(feeDto)) {
  64. return ResultVo.createResponseEntity(1, 0, new JSONArray());
  65. }
  66. if (FeeConfigDto.BILL_TYPE_EVERY.equals(feeDto.getBillType())) {
  67. responseEntity = computeEveryOweFee(feeDto);
  68. } else {
  69. responseEntity = computeBillOweFee(feeDto);
  70. }
  71. return responseEntity;
  72. }
  73. private boolean freshFeeDtoParam(FeeDto feeDto) {
  74. if (StringUtil.isEmpty(feeDto.getPayerObjId())) {
  75. return true;
  76. }
  77. if (!feeDto.getPayerObjId().contains("#")) {
  78. return false;
  79. }
  80. if (FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDto.getPayerObjType())) {
  81. String[] nums = feeDto.getPayerObjId().split("#");
  82. if (nums.length != 3) {
  83. return false;
  84. }
  85. RoomDto roomDto = new RoomDto();
  86. roomDto.setFloorId(nums[0]);
  87. roomDto.setUnitNum(nums[1]);
  88. roomDto.setRoomNum(nums[2]);
  89. roomDto.setCommunityId(feeDto.getCommunityId());
  90. List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
  91. if (roomDtos == null || roomDtos.size() < 1) {
  92. return false;
  93. }
  94. feeDto.setPayerObjId(roomDtos.get(0).getRoomId());
  95. } else {
  96. String[] nums = feeDto.getPayerObjId().split("#");
  97. if (nums.length != 2) {
  98. return false;
  99. }
  100. ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
  101. parkingSpaceDto.setAreaNum(nums[0]);
  102. parkingSpaceDto.setNum(nums[1]);
  103. parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
  104. List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
  105. if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) {
  106. return false;
  107. }
  108. feeDto.setPayerObjId(parkingSpaceDtos.get(0).getPsId());
  109. }
  110. return true;
  111. }
  112. /**
  113. * 账单费用
  114. *
  115. * @param feeDto
  116. * @return
  117. */
  118. private ResponseEntity<String> computeBillOweFee(FeeDto feeDto) {
  119. int count = feeInnerServiceSMOImpl.computeBillOweFeeCount(feeDto);
  120. List<FeeDto> feeDtos = null;
  121. if (count > 0) {
  122. feeDtos = feeInnerServiceSMOImpl.computeBillOweFee(feeDto);
  123. } else {
  124. feeDtos = new ArrayList<>();
  125. }
  126. return ResultVo.createResponseEntity((int) Math.ceil((double) count / (double) feeDto.getRow()), count, feeDtos);
  127. }
  128. /**
  129. * 实时费用
  130. *
  131. * @param feeDto
  132. * @return
  133. */
  134. private ResponseEntity<String> computeEveryOweFee(FeeDto feeDto) {
  135. int count = feeInnerServiceSMOImpl.computeEveryOweFeeCount(feeDto);
  136. List<FeeDto> feeDtos = null;
  137. if (count > 0) {
  138. feeDtos = feeInnerServiceSMOImpl.computeEveryOweFee(feeDto);
  139. computeFeePrices(feeDtos);
  140. } else {
  141. feeDtos = new ArrayList<>();
  142. }
  143. return ResultVo.createResponseEntity((int) Math.ceil((double) count / (double) feeDto.getRow()), count, feeDtos);
  144. }
  145. private void computeFeePrices(List<FeeDto> feeDtos) {
  146. List<FeeDto> roomFees = new ArrayList<>();
  147. List<FeeDto> psFees = new ArrayList<>();
  148. List<String> roomIds = new ArrayList<>();
  149. List<String> psIds = new ArrayList<>();
  150. for (FeeDto fee : feeDtos) {
  151. if ("3333".equals(fee.getPayerObjType())) { //房屋相关
  152. roomFees.add(fee);
  153. roomIds.add(fee.getPayerObjId());
  154. } else if ("6666".equals(fee.getPayerObjType())) {//车位相关
  155. psFees.add(fee);
  156. psIds.add(fee.getPayerObjId());
  157. }
  158. }
  159. if (roomFees.size() > 0) {
  160. computeRoomFee(roomFees, roomIds);
  161. }
  162. if (roomFees.size() > 0) {
  163. computePsFee(psFees, psIds);
  164. }
  165. }
  166. /**
  167. * 计算停车费
  168. *
  169. * @param psFees
  170. */
  171. private void computePsFee(List<FeeDto> psFees, List<String> psIds) {
  172. ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
  173. parkingSpaceDto.setCommunityId(psFees.get(0).getCommunityId());
  174. parkingSpaceDto.setPsIds(psIds.toArray(new String[psIds.size()]));
  175. List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
  176. if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
  177. return;
  178. }
  179. List<String> ownerIds = new ArrayList<>();
  180. for (ParkingSpaceDto tmpParkingSpaceDto : parkingSpaceDtos) {
  181. for (FeeDto feeDto : psFees) {
  182. dealFeePs(tmpParkingSpaceDto, feeDto);
  183. }
  184. ownerIds.add(tmpParkingSpaceDto.getOwnerId());
  185. }
  186. if (ownerIds.size() < 1) {
  187. return;
  188. }
  189. OwnerDto ownerDto = new OwnerDto();
  190. ownerDto.setOwnerIds(ownerIds.toArray(new String[ownerIds.size()]));
  191. ownerDto.setCommunityId(psFees.get(0).getCommunityId());
  192. List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(ownerDto);
  193. for (OwnerDto tmpOwnerDto : ownerDtos) {
  194. for (FeeDto feeDto : psFees) {
  195. dealFeeOwner(tmpOwnerDto, feeDto);
  196. }
  197. }
  198. }
  199. private void dealFeePs(ParkingSpaceDto tmpParkingSpaceDto, FeeDto feeDto) {
  200. if (!tmpParkingSpaceDto.getPsId().equals(feeDto.getPayerObjId())) {
  201. return;
  202. }
  203. feeDto.setRoomName(tmpParkingSpaceDto.getAreaNum() + "停车场" + tmpParkingSpaceDto.getNum() + "车位");
  204. String computingFormula = feeDto.getComputingFormula();
  205. double feePrice = 0.00;
  206. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  207. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  208. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(tmpParkingSpaceDto.getArea()));
  209. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  210. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  211. } else if ("2002".equals(computingFormula)) { // 固定费用
  212. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  213. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  214. } else if ("4004".equals(computingFormula)) {
  215. feePrice = Double.parseDouble(feeDto.getAmount());
  216. } else {
  217. feePrice = 0.00;
  218. }
  219. feeDto.setFeePrice(feePrice);
  220. double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
  221. BigDecimal price = new BigDecimal(feeDto.getFeePrice());
  222. price = price.multiply(new BigDecimal(month));
  223. feeDto.setAmountOwed(price.doubleValue() + "");
  224. }
  225. /**
  226. * 计算房屋费
  227. *
  228. * @param roomFees
  229. */
  230. private void computeRoomFee(List<FeeDto> roomFees, List<String> roomIds) {
  231. RoomDto roomDto = new RoomDto();
  232. roomDto.setCommunityId(roomFees.get(0).getCommunityId());
  233. roomDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
  234. List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
  235. if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
  236. return;
  237. }
  238. for (RoomDto tmpRoomDto : roomDtos) {
  239. for (FeeDto feeDto : roomFees) {
  240. dealFeeRoom(tmpRoomDto, feeDto);
  241. }
  242. }
  243. OwnerDto ownerDto = new OwnerDto();
  244. ownerDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
  245. ownerDto.setCommunityId(roomFees.get(0).getCommunityId());
  246. List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(ownerDto);
  247. for (OwnerDto tmpOwnerDto : ownerDtos) {
  248. for (FeeDto feeDto : roomFees) {
  249. dealFeeOwner(tmpOwnerDto, feeDto);
  250. }
  251. }
  252. }
  253. private void dealFeeOwner(OwnerDto tmpOwnerDto, FeeDto feeDto) {
  254. if (!tmpOwnerDto.getRoomId().equals(feeDto.getPayerObjId())) {
  255. return;
  256. }
  257. feeDto.setOwnerName(tmpOwnerDto.getName());
  258. feeDto.setOwnerTel(feeDto.getOwnerTel());
  259. }
  260. private void dealFeeRoom(RoomDto tmpRoomDto, FeeDto feeDto) {
  261. if (!tmpRoomDto.getRoomId().equals(feeDto.getPayerObjId())) {
  262. return;
  263. }
  264. feeDto.setRoomName(tmpRoomDto.getFloorNum() + "栋" + tmpRoomDto.getUnitNum() + "单元" + tmpRoomDto.getRoomNum() + "室");
  265. String computingFormula = feeDto.getComputingFormula();
  266. double feePrice = 0.00;
  267. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  268. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  269. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(tmpRoomDto.getBuiltUpArea()));
  270. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  271. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  272. } else if ("2002".equals(computingFormula)) { // 固定费用
  273. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  274. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  275. } else if ("4004".equals(computingFormula)) {
  276. feePrice = Double.parseDouble(feeDto.getAmount());
  277. } else {
  278. feePrice = 0.00;
  279. }
  280. feeDto.setFeePrice(feePrice);
  281. double month = dayCompare(feeDto.getEndTime(), DateUtil.getCurrentDate());
  282. BigDecimal price = new BigDecimal(feeDto.getFeePrice());
  283. price = price.multiply(new BigDecimal(month));
  284. feeDto.setAmountOwed(price.doubleValue() + "");
  285. }
  286. /**
  287. * 计算欠费金额
  288. *
  289. * @param tmpFeeDto
  290. */
  291. private void computeOweFee(FeeDto tmpFeeDto) {
  292. String billType = tmpFeeDto.getBillType();
  293. if (FeeConfigDto.BILL_TYPE_EVERY.equals(billType)) {
  294. computeFeePrice(tmpFeeDto);
  295. return;
  296. }
  297. BillDto billDto = new BillDto();
  298. billDto.setCommunityId(tmpFeeDto.getCommunityId());
  299. billDto.setConfigId(tmpFeeDto.getConfigId());
  300. billDto.setCurBill("T");
  301. List<BillDto> billDtos = feeInnerServiceSMOImpl.queryBills(billDto);
  302. if (billDtos == null || billDtos.size() < 1) {
  303. tmpFeeDto.setFeePrice(0.00);
  304. return;
  305. }
  306. BillOweFeeDto billOweFeeDto = new BillOweFeeDto();
  307. billOweFeeDto.setCommunityId(tmpFeeDto.getCommunityId());
  308. billOweFeeDto.setFeeId(tmpFeeDto.getFeeId());
  309. billOweFeeDto.setState(BillOweFeeDto.STATE_WILL_FEE);
  310. billOweFeeDto.setBillId(billDtos.get(0).getBillId());
  311. List<BillOweFeeDto> billOweFeeDtos = feeInnerServiceSMOImpl.queryBillOweFees(billOweFeeDto);
  312. if (billOweFeeDtos == null || billOweFeeDtos.size() < 1) {
  313. tmpFeeDto.setFeePrice(0.00);
  314. return;
  315. }
  316. tmpFeeDto.setFeePrice(Double.parseDouble(billOweFeeDtos.get(0).getAmountOwed()));
  317. }
  318. private void computeFeePrice(FeeDto feeDto) {
  319. if ("3333".equals(feeDto.getPayerObjType())) { //房屋相关
  320. computeFeePriceByRoom(feeDto);
  321. } else if ("6666".equals(feeDto.getPayerObjType())) {//车位相关
  322. computeFeePriceByParkingSpace(feeDto);
  323. }
  324. }
  325. private void computeFeePriceByParkingSpace(FeeDto feeDto) {
  326. ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
  327. parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
  328. parkingSpaceDto.setPsId(feeDto.getPayerObjId());
  329. List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
  330. if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
  331. return;
  332. }
  333. String computingFormula = feeDto.getComputingFormula();
  334. double feePrice = 0.00;
  335. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  336. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  337. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
  338. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  339. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  340. } else if ("2002".equals(computingFormula)) { // 固定费用
  341. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  342. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  343. } else if ("4004".equals(computingFormula)) {
  344. feePrice = Double.parseDouble(feeDto.getAmount());
  345. } else {
  346. feePrice = 0.00;
  347. }
  348. feeDto.setFeePrice(feePrice);
  349. }
  350. /**
  351. * 根据房屋来算单价
  352. *
  353. * @param feeDto
  354. */
  355. private void computeFeePriceByRoom(FeeDto feeDto) {
  356. RoomDto roomDto = new RoomDto();
  357. roomDto.setCommunityId(feeDto.getCommunityId());
  358. roomDto.setRoomId(feeDto.getPayerObjId());
  359. List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
  360. if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
  361. return;
  362. }
  363. String computingFormula = feeDto.getComputingFormula();
  364. double feePrice = 0.00;
  365. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  366. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  367. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
  368. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  369. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  370. } else if ("2002".equals(computingFormula)) { // 固定费用
  371. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  372. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  373. } else if ("4004".equals(computingFormula)) {
  374. feePrice = Double.parseDouble(feeDto.getAmount());
  375. } else {
  376. feePrice = 0.00;
  377. }
  378. feeDto.setFeePrice(feePrice);
  379. }
  380. /**
  381. * 计算2个日期之间相差的 以年、月、日为单位,各自计算结果是多少
  382. * 比如:2011-02-02 到 2017-03-02
  383. * 以年为单位相差为:6年
  384. * 以月为单位相差为:73个月
  385. * 以日为单位相差为:2220天
  386. *
  387. * @param fromDate
  388. * @param toDate
  389. * @return
  390. */
  391. public static double dayCompare(Date fromDate, Date toDate) {
  392. Calendar from = Calendar.getInstance();
  393. from.setTime(fromDate);
  394. Calendar to = Calendar.getInstance();
  395. to.setTime(toDate);
  396. long t1 = from.getTimeInMillis();
  397. long t2 = to.getTimeInMillis();
  398. long days = (t2 - t1) / (24 * 60 * 60 * 1000);
  399. BigDecimal tmpDays = new BigDecimal(days);
  400. BigDecimal monthDay = new BigDecimal(30);
  401. return tmpDays.divide(monthDay, 2, RoundingMode.HALF_UP).doubleValue();
  402. }
  403. }