QueryOweFeeImpl.java 16 KB

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