FeeDiscountInnerServiceSMOImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package com.java110.fee.smo.impl;
  2. import com.java110.core.base.smo.BaseServiceSMO;
  3. import com.java110.dto.PageDto;
  4. import com.java110.dto.applyRoomDiscount.ApplyRoomDiscountDto;
  5. import com.java110.dto.fee.FeeDetailDto;
  6. import com.java110.dto.fee.FeeDto;
  7. import com.java110.dto.feeDiscount.ComputeDiscountDto;
  8. import com.java110.dto.feeDiscount.FeeDiscountDto;
  9. import com.java110.dto.feeDiscount.FeeDiscountRuleDto;
  10. import com.java110.dto.feeDiscount.FeeDiscountSpecDto;
  11. import com.java110.dto.payFeeConfigDiscount.PayFeeConfigDiscountDto;
  12. import com.java110.fee.dao.IFeeDiscountServiceDao;
  13. import com.java110.fee.discount.IComputeDiscount;
  14. import com.java110.intf.fee.*;
  15. import com.java110.po.feeDiscount.FeeDiscountPo;
  16. import com.java110.utils.cache.MappingCache;
  17. import com.java110.utils.factory.ApplicationContextFactory;
  18. import com.java110.utils.util.Assert;
  19. import com.java110.utils.util.BeanConvertUtil;
  20. import com.java110.utils.util.StringUtil;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.web.bind.annotation.RequestBody;
  23. import org.springframework.web.bind.annotation.RestController;
  24. import java.text.SimpleDateFormat;
  25. import java.util.*;
  26. /**
  27. * @ClassName FloorInnerServiceSMOImpl
  28. * @Description 费用折扣内部服务实现类
  29. * @Author wuxw
  30. * @Date 2019/4/24 9:20
  31. * @Version 1.0
  32. * add by wuxw 2019/4/24
  33. **/
  34. @RestController
  35. public class FeeDiscountInnerServiceSMOImpl extends BaseServiceSMO implements IFeeDiscountInnerServiceSMO {
  36. @Autowired
  37. private IFeeDiscountServiceDao feeDiscountServiceDaoImpl;
  38. @Autowired
  39. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  40. @Autowired
  41. private IPayFeeConfigDiscountInnerServiceSMO payFeeConfigDiscountInnerServiceSMOImpl;
  42. @Autowired
  43. private IFeeDiscountSpecInnerServiceSMO feeDiscountSpecInnerServiceSMOImpl;
  44. @Autowired
  45. private IApplyRoomDiscountInnerServiceSMO applyRoomDiscountInnerServiceSMOImpl;
  46. @Autowired
  47. private IFeeDiscountRuleInnerServiceSMO feeDiscountRuleInnerServiceSMOImpl;
  48. //域
  49. public static final String DOMAIN_COMMON = "DOMAIN.COMMON";
  50. //键
  51. public static final String DISCOUNT_MODE = "DISCOUNT_MODE";
  52. private static final String SPEC_RATE = "89002020980015"; // 赠送月份
  53. @Override
  54. public int saveFeeDiscount(@RequestBody FeeDiscountPo feeDiscountPo) {
  55. int saveFlag = 1;
  56. feeDiscountServiceDaoImpl.saveFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountPo));
  57. return saveFlag;
  58. }
  59. @Override
  60. public int updateFeeDiscount(@RequestBody FeeDiscountPo feeDiscountPo) {
  61. int saveFlag = 1;
  62. feeDiscountServiceDaoImpl.updateFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountPo));
  63. return saveFlag;
  64. }
  65. @Override
  66. public int deleteFeeDiscount(@RequestBody FeeDiscountPo feeDiscountPo) {
  67. int saveFlag = 1;
  68. feeDiscountPo.setStatusCd("1");
  69. feeDiscountServiceDaoImpl.updateFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountPo));
  70. return saveFlag;
  71. }
  72. @Override
  73. public List<FeeDiscountDto> queryFeeDiscounts(@RequestBody FeeDiscountDto feeDiscountDto) {
  74. //校验是否传了 分页信息
  75. int page = feeDiscountDto.getPage();
  76. if (page != PageDto.DEFAULT_PAGE) {
  77. feeDiscountDto.setPage((page - 1) * feeDiscountDto.getRow());
  78. }
  79. List<FeeDiscountDto> feeDiscounts = BeanConvertUtil.covertBeanList(feeDiscountServiceDaoImpl.getFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountDto)), FeeDiscountDto.class);
  80. freshDiscountSpec(feeDiscounts);
  81. return feeDiscounts;
  82. }
  83. private void freshDiscountSpec(List<FeeDiscountDto> feeDiscounts) {
  84. if (feeDiscounts == null || feeDiscounts.size() < 1) {
  85. return;
  86. }
  87. List<String> discountIds = new ArrayList<>();
  88. for (FeeDiscountDto feeDiscount : feeDiscounts) {
  89. discountIds.add(feeDiscount.getDiscountId());
  90. }
  91. FeeDiscountSpecDto tmpFeeDiscountSpecDto = new FeeDiscountSpecDto();
  92. tmpFeeDiscountSpecDto.setDiscountIds(discountIds.toArray(new String[discountIds.size()]));
  93. tmpFeeDiscountSpecDto.setCommunityId(feeDiscounts.get(0).getCommunityId());
  94. List<FeeDiscountSpecDto> feeDiscountSpecDtos = feeDiscountSpecInnerServiceSMOImpl.queryFeeDiscountSpecs(tmpFeeDiscountSpecDto);
  95. if (feeDiscountSpecDtos == null || feeDiscountSpecDtos.size() < 1) {
  96. return;
  97. }
  98. List<FeeDiscountSpecDto> tmpSpecs = null;
  99. for (FeeDiscountDto feeDiscount : feeDiscounts) {
  100. tmpSpecs = new ArrayList<>();
  101. for (FeeDiscountSpecDto feeDiscountSpecDto : feeDiscountSpecDtos) {
  102. if (feeDiscount.getDiscountId().equals(feeDiscountSpecDto.getDiscountId())) {
  103. tmpSpecs.add(feeDiscountSpecDto);
  104. }
  105. }
  106. feeDiscount.setFeeDiscountSpecs(tmpSpecs);
  107. }
  108. }
  109. /**
  110. * 计算折扣
  111. *
  112. * @param feeDetailDto
  113. * @return
  114. */
  115. public List<ComputeDiscountDto> computeDiscount(@RequestBody FeeDetailDto feeDetailDto) {
  116. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  117. Calendar c = Calendar.getInstance();
  118. List<ComputeDiscountDto> computeDiscountDtos = new ArrayList<>();
  119. FeeDto feeDto = new FeeDto();
  120. feeDto.setFeeId(feeDetailDto.getFeeId());
  121. feeDto.setCommunityId(feeDetailDto.getCommunityId());
  122. feeDto.setState(FeeDto.STATE_DOING);
  123. List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
  124. Assert.listOnlyOne(feeDtos, "费用不存在");
  125. PayFeeConfigDiscountDto payFeeConfigDiscountDto = new PayFeeConfigDiscountDto();
  126. payFeeConfigDiscountDto.setConfigId(feeDtos.get(0).getConfigId());
  127. payFeeConfigDiscountDto.setRow(feeDetailDto.getRow());
  128. payFeeConfigDiscountDto.setPage(feeDetailDto.getPage());
  129. payFeeConfigDiscountDto.setCommunityId(feeDetailDto.getCommunityId());
  130. payFeeConfigDiscountDto.setStatusCd("0");
  131. Date currentTime = new Date();
  132. payFeeConfigDiscountDto.setCurrentTime(currentTime);
  133. //根据费用查询折扣
  134. List<PayFeeConfigDiscountDto> payFeeConfigDiscountDtos =
  135. payFeeConfigDiscountInnerServiceSMOImpl.queryPayFeeConfigDiscounts(payFeeConfigDiscountDto);
  136. if (payFeeConfigDiscountDtos == null || payFeeConfigDiscountDtos.size() < 1) {
  137. computeApplyRoomDiscount(feeDetailDto, simpleDateFormat, c, computeDiscountDtos);
  138. //取出开关映射的值
  139. String value = MappingCache.getValue(DOMAIN_COMMON, DISCOUNT_MODE);
  140. List<ComputeDiscountDto> computeDiscountDtoList = new ArrayList<>();
  141. for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) {
  142. computeDiscountDto.setValue(value);
  143. if (!StringUtil.isEmpty(computeDiscountDto.getDiscountType()) && "3003".equals(computeDiscountDto.getDiscountType())) {
  144. computeDiscountDto.setArdId(feeDetailDto.getArdId());
  145. }
  146. computeDiscountDtoList.add(computeDiscountDto);
  147. }
  148. return computeDiscountDtos;
  149. }
  150. c.setTime(feeDetailDto.getStartTime());
  151. double mon = Double.parseDouble(feeDetailDto.getCycles());
  152. c.add(Calendar.MONTH, (int) mon);
  153. //获取缴费结束时间
  154. Date finishTime = c.getTime();
  155. for (PayFeeConfigDiscountDto tmpPayFeeConfigDiscountDto : payFeeConfigDiscountDtos) {
  156. //获取缴费最大截止时间
  157. Date payMaxEndTime = tmpPayFeeConfigDiscountDto.getPayMaxEndTime();
  158. FeeDiscountDto feeDiscountDto = new FeeDiscountDto();
  159. feeDiscountDto.setDiscountId(tmpPayFeeConfigDiscountDto.getDiscountId());
  160. //查询打折表
  161. List<FeeDiscountDto> feeDiscountInfo = BeanConvertUtil.covertBeanList(feeDiscountServiceDaoImpl.getFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountDto)), FeeDiscountDto.class);
  162. Assert.listOnlyOne(feeDiscountInfo, "查询打折表错误!");
  163. FeeDiscountRuleDto feeDiscountRuleDto = new FeeDiscountRuleDto();
  164. feeDiscountRuleDto.setRuleId(feeDiscountInfo.get(0).getRuleId());
  165. //查询打折规则表
  166. List<FeeDiscountRuleDto> feeDiscountRuleDtos = feeDiscountRuleInnerServiceSMOImpl.queryFeeDiscountRules(feeDiscountRuleDto);
  167. Assert.listOnlyOne(feeDiscountRuleDtos, "查询打折规则表错误!");
  168. if (!StringUtil.isEmpty(feeDiscountRuleDtos.get(0).getBeanImpl()) && feeDiscountRuleDtos.get(0).getBeanImpl().equals("reductionMonthFeeRule")) { //赠送规则
  169. FeeDiscountSpecDto feeDiscountSpecDto = new FeeDiscountSpecDto();
  170. feeDiscountSpecDto.setDiscountId(tmpPayFeeConfigDiscountDto.getDiscountId());
  171. feeDiscountSpecDto.setSpecId(SPEC_RATE);
  172. //查询打折规格
  173. List<FeeDiscountSpecDto> feeDiscountSpecDtos = feeDiscountSpecInnerServiceSMOImpl.queryFeeDiscountSpecs(feeDiscountSpecDto);
  174. Assert.listOnlyOne(feeDiscountSpecDtos, "查询打折规格表错误!");
  175. //获取赠送月份
  176. String specValue = feeDiscountSpecDtos.get(0).getSpecValue();
  177. Calendar cal = Calendar.getInstance();
  178. cal.setTime(finishTime);
  179. cal.add(Calendar.MONTH, Integer.parseInt(specValue));
  180. finishTime = cal.getTime();
  181. }
  182. if (payMaxEndTime == null) {
  183. doCompute(tmpPayFeeConfigDiscountDto, Double.parseDouble(feeDetailDto.getCycles()), computeDiscountDtos, feeDetailDto.getFeeId());
  184. } else if (payMaxEndTime.getTime() >= finishTime.getTime()) {
  185. doCompute(tmpPayFeeConfigDiscountDto, Double.parseDouble(feeDetailDto.getCycles()), computeDiscountDtos, feeDetailDto.getFeeId());
  186. } else {
  187. continue;
  188. }
  189. finishTime = c.getTime();
  190. }
  191. computeApplyRoomDiscount(feeDetailDto, simpleDateFormat, c, computeDiscountDtos);
  192. //取出开关映射的值
  193. String value = MappingCache.getValue(DOMAIN_COMMON, DISCOUNT_MODE);
  194. List<ComputeDiscountDto> computeDiscountDtoList = new ArrayList<>();
  195. for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) {
  196. computeDiscountDto.setValue(value);
  197. if (!StringUtil.isEmpty(computeDiscountDto.getDiscountType()) && "3003".equals(computeDiscountDto.getDiscountType())) {
  198. computeDiscountDto.setArdId(feeDetailDto.getArdId());
  199. }
  200. computeDiscountDtoList.add(computeDiscountDto);
  201. }
  202. return computeDiscountDtoList;
  203. }
  204. private void computeApplyRoomDiscount(@RequestBody FeeDetailDto feeDetailDto, SimpleDateFormat simpleDateFormat, Calendar c, List<ComputeDiscountDto> computeDiscountDtos) {
  205. if (!StringUtil.isEmpty(feeDetailDto.getPayerObjType()) && FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDetailDto.getPayerObjType())) {
  206. //根据房屋ID,去折扣申请表查询是否有折扣
  207. ApplyRoomDiscountDto applyRoomDiscountDto = new ApplyRoomDiscountDto();
  208. //审核已通过
  209. applyRoomDiscountDto.setState("4");
  210. //是否可用状态标识(0表示在用;1表示不可用)
  211. applyRoomDiscountDto.setInUse("0");
  212. //小区ID
  213. applyRoomDiscountDto.setCommunityId(feeDetailDto.getCommunityId());
  214. //房屋id
  215. applyRoomDiscountDto.setRoomId(feeDetailDto.getPayerObjId());
  216. //开始时间
  217. applyRoomDiscountDto.setStartTime(simpleDateFormat.format(feeDetailDto.getStartTime()));
  218. //结束时间
  219. c.setTime(feeDetailDto.getStartTime());
  220. c.add(Calendar.DAY_OF_MONTH, 2);//开始时间,添加1,2天的冗余,只要比5小即可
  221. applyRoomDiscountDto.setStartTime(simpleDateFormat.format(c.getTime()));//重新设置开始时间
  222. double month = Double.parseDouble(feeDetailDto.getCycles());
  223. c.add(Calendar.MONTH, (int) month);
  224. c.add(Calendar.DAY_OF_MONTH, -5);//这里根据设置时间荣誉5天
  225. Date endTime = c.getTime();
  226. applyRoomDiscountDto.setEndTime(simpleDateFormat.format(endTime));
  227. applyRoomDiscountDto.setFeeId(feeDetailDto.getFeeId());
  228. //查询折扣申请表
  229. List<ApplyRoomDiscountDto> applyRoomDiscountDtos = applyRoomDiscountInnerServiceSMOImpl.queryApplyRoomDiscounts(applyRoomDiscountDto);
  230. //判断查询的折扣申请表是否有数据
  231. if (applyRoomDiscountDtos != null && applyRoomDiscountDtos.size() > 0) {
  232. //获取优惠id
  233. String discountId = applyRoomDiscountDtos.get(0).getDiscountId();
  234. String ardId = applyRoomDiscountDtos.get(0).getArdId();
  235. feeDetailDto.setArdId(ardId);
  236. PayFeeConfigDiscountDto payFeeConfigDiscount = new PayFeeConfigDiscountDto();
  237. payFeeConfigDiscount.setCommunityId(applyRoomDiscountDtos.get(0).getCommunityId());
  238. payFeeConfigDiscount.setDiscountId(discountId);
  239. doCompute(payFeeConfigDiscount, Double.parseDouble(feeDetailDto.getCycles()), computeDiscountDtos, feeDetailDto.getFeeId());
  240. }
  241. }
  242. }
  243. private void doCompute(PayFeeConfigDiscountDto tmpPayFeeConfigDiscountDto, double cycles, List<ComputeDiscountDto> computeDiscountDtos, String feeId) {
  244. FeeDiscountDto feeDiscountDto = new FeeDiscountDto();
  245. feeDiscountDto.setCommunityId(tmpPayFeeConfigDiscountDto.getCommunityId());
  246. feeDiscountDto.setDiscountId(tmpPayFeeConfigDiscountDto.getDiscountId());
  247. List<FeeDiscountDto> feeDiscountDtos = queryFeeDiscounts(feeDiscountDto);
  248. if (feeDiscountDtos == null || feeDiscountDtos.size() < 1) {
  249. return;
  250. }
  251. for (FeeDiscountDto tmpFeeDiscountDto : feeDiscountDtos) {
  252. tmpFeeDiscountDto.setFeeId(feeId);
  253. tmpFeeDiscountDto.setCycles(cycles);
  254. }
  255. IComputeDiscount computeDiscount = (IComputeDiscount) ApplicationContextFactory.getBean(feeDiscountDtos.get(0).getBeanImpl());
  256. ComputeDiscountDto computeDiscountDto = computeDiscount.compute(feeDiscountDtos.get(0));
  257. if (computeDiscountDto == null) {
  258. return;
  259. }
  260. computeDiscountDtos.add(computeDiscountDto);
  261. }
  262. @Override
  263. public int queryFeeDiscountsCount(@RequestBody FeeDiscountDto feeDiscountDto) {
  264. return feeDiscountServiceDaoImpl.queryFeeDiscountsCount(BeanConvertUtil.beanCovertMap(feeDiscountDto));
  265. }
  266. public IFeeDiscountServiceDao getFeeDiscountServiceDaoImpl() {
  267. return feeDiscountServiceDaoImpl;
  268. }
  269. public void setFeeDiscountServiceDaoImpl(IFeeDiscountServiceDao feeDiscountServiceDaoImpl) {
  270. this.feeDiscountServiceDaoImpl = feeDiscountServiceDaoImpl;
  271. }
  272. }