QueryOweFeeImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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.parking.ParkingSpaceDto;
  8. import com.java110.fee.bmo.IQueryOweFee;
  9. import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
  10. import com.java110.intf.community.IRoomInnerServiceSMO;
  11. import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
  12. import com.java110.intf.fee.IFeeInnerServiceSMO;
  13. import com.java110.intf.user.IOwnerInnerServiceSMO;
  14. import com.java110.utils.util.DateUtil;
  15. import com.java110.vo.ResultVo;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.http.ResponseEntity;
  18. import org.springframework.stereotype.Service;
  19. import java.math.BigDecimal;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. @Service
  23. public class QueryOweFeeImpl implements IQueryOweFee {
  24. @Autowired
  25. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  26. @Autowired
  27. private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
  28. @Autowired
  29. private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
  30. @Autowired
  31. private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
  32. @Autowired
  33. private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
  34. @Override
  35. public ResponseEntity<String> query(FeeDto feeDto) {
  36. //查询费用信息arrearsEndTime
  37. feeDto.setArrearsEndTime(DateUtil.getCurrentDate());
  38. feeDto.setState(FeeDto.STATE_DOING);
  39. List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
  40. if (feeDtos == null || feeDtos.size() < 1) {
  41. feeDtos = new ArrayList<>();
  42. return ResultVo.createResponseEntity(feeDtos);
  43. }
  44. List<FeeDto> tmpFeeDtos = new ArrayList<>();
  45. for (FeeDto tmpFeeDto : feeDtos) {
  46. computeOweFee(tmpFeeDto);//计算欠费金额
  47. //如果金额为0 就排除
  48. if (tmpFeeDto.getFeePrice() > 0) {
  49. tmpFeeDtos.add(tmpFeeDto);
  50. }
  51. }
  52. return ResultVo.createResponseEntity(tmpFeeDtos);
  53. }
  54. @Override
  55. public ResponseEntity<String> queryAllOwneFee(FeeDto feeDto) {
  56. ResponseEntity<String> responseEntity = null;
  57. if (FeeConfigDto.BILL_TYPE_EVERY.equals(feeDto.getBillType())) {
  58. responseEntity = computeEveryOweFee(feeDto);
  59. } else {
  60. responseEntity = computeBillOweFee(feeDto);
  61. }
  62. return responseEntity;
  63. }
  64. /**
  65. * 账单费用
  66. *
  67. * @param feeDto
  68. * @return
  69. */
  70. private ResponseEntity<String> computeBillOweFee(FeeDto feeDto) {
  71. int count = feeInnerServiceSMOImpl.computeBillOweFeeCount(feeDto);
  72. List<FeeDto> feeDtos = null;
  73. if (count > 0) {
  74. feeDtos = feeInnerServiceSMOImpl.computeBillOweFee(feeDto);
  75. } else {
  76. feeDtos = new ArrayList<>();
  77. }
  78. return ResultVo.createResponseEntity((int) Math.ceil((double) count / (double) feeDto.getRow()), count, feeDtos);
  79. }
  80. /**
  81. * 实时费用
  82. *
  83. * @param feeDto
  84. * @return
  85. */
  86. private ResponseEntity<String> computeEveryOweFee(FeeDto feeDto) {
  87. int count = feeInnerServiceSMOImpl.computeEveryOweFeeCount(feeDto);
  88. List<FeeDto> feeDtos = null;
  89. if (count > 0) {
  90. feeDtos = feeInnerServiceSMOImpl.computeEveryOweFee(feeDto);
  91. computeFeePrices(feeDtos);
  92. } else {
  93. feeDtos = new ArrayList<>();
  94. }
  95. return ResultVo.createResponseEntity((int) Math.ceil((double) count / (double) feeDto.getRow()), count, feeDtos);
  96. }
  97. private void computeFeePrices(List<FeeDto> feeDtos) {
  98. List<FeeDto> roomFees = new ArrayList<>();
  99. List<FeeDto> psFees = new ArrayList<>();
  100. List<String> roomIds = new ArrayList<>();
  101. List<String> psIds = new ArrayList<>();
  102. for (FeeDto fee : feeDtos) {
  103. if ("3333".equals(fee.getPayerObjType())) { //房屋相关
  104. roomFees.add(fee);
  105. roomIds.add(fee.getPayerObjId());
  106. } else if ("6666".equals(fee.getPayerObjType())) {//车位相关
  107. psFees.add(fee);
  108. psIds.add(fee.getPayerObjId());
  109. }
  110. }
  111. if (roomFees.size() > 0) {
  112. computeRoomFee(roomFees, roomIds);
  113. }
  114. if (roomFees.size() > 0) {
  115. computePsFee(psFees, psIds);
  116. }
  117. }
  118. /**
  119. * 计算停车费
  120. *
  121. * @param psFees
  122. */
  123. private void computePsFee(List<FeeDto> psFees, List<String> psIds) {
  124. }
  125. /**
  126. * 计算房屋费
  127. *
  128. * @param roomFees
  129. */
  130. private void computeRoomFee(List<FeeDto> roomFees, List<String> roomIds) {
  131. RoomDto roomDto = new RoomDto();
  132. roomDto.setCommunityId(roomFees.get(0).getCommunityId());
  133. roomDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
  134. List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
  135. if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
  136. return;
  137. }
  138. for (RoomDto tmpRoomDto : roomDtos) {
  139. for (FeeDto feeDto : roomFees) {
  140. dealFeeRoom(tmpRoomDto, feeDto);
  141. }
  142. }
  143. }
  144. private void dealFeeRoom(RoomDto tmpRoomDto, FeeDto feeDto) {
  145. if (!tmpRoomDto.getRoomId().equals(feeDto.getPayerObjId())) {
  146. return;
  147. }
  148. feeDto.setRoomName(tmpRoomDto.getFloorNum() + "栋" + tmpRoomDto.getUnitNum() + "单元" + tmpRoomDto.getRoomNum() + "室");
  149. String computingFormula = feeDto.getComputingFormula();
  150. double feePrice = 0.00;
  151. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  152. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  153. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(tmpRoomDto.getBuiltUpArea()));
  154. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  155. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  156. } else if ("2002".equals(computingFormula)) { // 固定费用
  157. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  158. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  159. } else if ("4004".equals(computingFormula)) {
  160. feePrice = Double.parseDouble(feeDto.getAmount());
  161. } else {
  162. feePrice = 0.00;
  163. }
  164. feeDto.setFeePrice(feePrice);
  165. }
  166. /**
  167. * 计算欠费金额
  168. *
  169. * @param tmpFeeDto
  170. */
  171. private void computeOweFee(FeeDto tmpFeeDto) {
  172. String billType = tmpFeeDto.getBillType();
  173. if (FeeConfigDto.BILL_TYPE_EVERY.equals(billType)) {
  174. computeFeePrice(tmpFeeDto);
  175. return;
  176. }
  177. BillDto billDto = new BillDto();
  178. billDto.setCommunityId(tmpFeeDto.getCommunityId());
  179. billDto.setConfigId(tmpFeeDto.getConfigId());
  180. billDto.setCurBill("T");
  181. List<BillDto> billDtos = feeInnerServiceSMOImpl.queryBills(billDto);
  182. if (billDtos == null || billDtos.size() < 1) {
  183. tmpFeeDto.setFeePrice(0.00);
  184. return;
  185. }
  186. BillOweFeeDto billOweFeeDto = new BillOweFeeDto();
  187. billOweFeeDto.setCommunityId(tmpFeeDto.getCommunityId());
  188. billOweFeeDto.setFeeId(tmpFeeDto.getFeeId());
  189. billOweFeeDto.setState(BillOweFeeDto.STATE_WILL_FEE);
  190. billOweFeeDto.setBillId(billDtos.get(0).getBillId());
  191. List<BillOweFeeDto> billOweFeeDtos = feeInnerServiceSMOImpl.queryBillOweFees(billOweFeeDto);
  192. if (billOweFeeDtos == null || billOweFeeDtos.size() < 1) {
  193. tmpFeeDto.setFeePrice(0.00);
  194. return;
  195. }
  196. tmpFeeDto.setFeePrice(Double.parseDouble(billOweFeeDtos.get(0).getAmountOwed()));
  197. }
  198. private void computeFeePrice(FeeDto feeDto) {
  199. if ("3333".equals(feeDto.getPayerObjType())) { //房屋相关
  200. computeFeePriceByRoom(feeDto);
  201. } else if ("6666".equals(feeDto.getPayerObjType())) {//车位相关
  202. computeFeePriceByParkingSpace(feeDto);
  203. }
  204. }
  205. private void computeFeePriceByParkingSpace(FeeDto feeDto) {
  206. ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
  207. parkingSpaceDto.setCommunityId(feeDto.getCommunityId());
  208. parkingSpaceDto.setPsId(feeDto.getPayerObjId());
  209. List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
  210. if (parkingSpaceDtos == null || parkingSpaceDtos.size() < 1) { //数据有问题
  211. return;
  212. }
  213. String computingFormula = feeDto.getComputingFormula();
  214. double feePrice = 0.00;
  215. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  216. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  217. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(parkingSpaceDtos.get(0).getArea()));
  218. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  219. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  220. } else if ("2002".equals(computingFormula)) { // 固定费用
  221. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  222. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  223. } else if ("4004".equals(computingFormula)) {
  224. feePrice = Double.parseDouble(feeDto.getAmount());
  225. } else {
  226. feePrice = 0.00;
  227. }
  228. feeDto.setFeePrice(feePrice);
  229. }
  230. /**
  231. * 根据房屋来算单价
  232. *
  233. * @param feeDto
  234. */
  235. private void computeFeePriceByRoom(FeeDto feeDto) {
  236. RoomDto roomDto = new RoomDto();
  237. roomDto.setCommunityId(feeDto.getCommunityId());
  238. roomDto.setRoomId(feeDto.getPayerObjId());
  239. List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
  240. if (roomDtos == null || roomDtos.size() < 1) { //数据有问题
  241. return;
  242. }
  243. String computingFormula = feeDto.getComputingFormula();
  244. double feePrice = 0.00;
  245. if ("1001".equals(computingFormula)) { //面积*单价+附加费
  246. BigDecimal squarePrice = new BigDecimal(Double.parseDouble(feeDto.getSquarePrice()));
  247. BigDecimal builtUpArea = new BigDecimal(Double.parseDouble(roomDtos.get(0).getBuiltUpArea()));
  248. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  249. feePrice = squarePrice.multiply(builtUpArea).add(additionalAmount).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  250. } else if ("2002".equals(computingFormula)) { // 固定费用
  251. BigDecimal additionalAmount = new BigDecimal(Double.parseDouble(feeDto.getAdditionalAmount()));
  252. feePrice = additionalAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
  253. } else if ("4004".equals(computingFormula)) {
  254. feePrice = Double.parseDouble(feeDto.getAmount());
  255. } else {
  256. feePrice = 0.00;
  257. }
  258. feeDto.setFeePrice(feePrice);
  259. }
  260. }