QueryOweFeeImpl.java 20 KB

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