PayOweFeeImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.java110.fee.bmo.impl;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.java110.core.annotation.Java110Transactional;
  5. import com.java110.core.factory.GenerateCodeFactory;
  6. import com.java110.core.smo.IComputeFeeSMO;
  7. import com.java110.dto.fee.*;
  8. import com.java110.dto.owner.OwnerDto;
  9. import com.java110.dto.repair.RepairDto;
  10. import com.java110.fee.bmo.IPayOweFee;
  11. import com.java110.fee.listener.fee.UpdateFeeInfoListener;
  12. import com.java110.intf.fee.IFeeReceiptDetailInnerServiceSMO;
  13. import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
  14. import com.java110.intf.community.IRepairInnerServiceSMO;
  15. import com.java110.intf.community.IRoomInnerServiceSMO;
  16. import com.java110.intf.fee.*;
  17. import com.java110.intf.user.IOwnerCarInnerServiceSMO;
  18. import com.java110.po.fee.PayFeeDetailPo;
  19. import com.java110.po.fee.PayFeePo;
  20. import com.java110.po.feeReceipt.FeeReceiptPo;
  21. import com.java110.po.feeReceiptDetail.FeeReceiptDetailPo;
  22. import com.java110.po.owner.RepairPoolPo;
  23. import com.java110.utils.constant.ResponseConstant;
  24. import com.java110.utils.exception.ListenerExecuteException;
  25. import com.java110.utils.lock.DistributedLock;
  26. import com.java110.utils.util.Assert;
  27. import com.java110.utils.util.DateUtil;
  28. import com.java110.utils.util.StringUtil;
  29. import com.java110.vo.ResultVo;
  30. import org.slf4j.Logger;
  31. import org.slf4j.LoggerFactory;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.http.ResponseEntity;
  34. import org.springframework.stereotype.Service;
  35. import java.math.BigDecimal;
  36. import java.text.ParseException;
  37. import java.util.Date;
  38. import java.util.List;
  39. /**
  40. * 欠费缴费实现类
  41. */
  42. @Service
  43. public class PayOweFeeImpl implements IPayOweFee {
  44. private static Logger logger = LoggerFactory.getLogger(UpdateFeeInfoListener.class);
  45. @Autowired
  46. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  47. @Autowired
  48. private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
  49. @Autowired
  50. private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
  51. @Autowired
  52. private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
  53. @Autowired
  54. private IRepairInnerServiceSMO repairInnerServiceSMOImpl;
  55. @Autowired
  56. private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
  57. @Autowired
  58. private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
  59. @Autowired
  60. private IFeeReceiptDetailInnerServiceSMO feeReceiptDetailInnerServiceSMOImpl;
  61. @Autowired
  62. private IFeeReceiptInnerServiceSMO feeReceiptInnerServiceSMOImpl;
  63. @Autowired
  64. private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
  65. @Autowired
  66. private IComputeFeeSMO computeFeeSMOImpl;
  67. /**
  68. * 欠费缴费
  69. *
  70. * @param reqJson 缴费报文 {"communityId":"7020181217000001","fees":[{"feeId":"902020073149140091","feePrice":90},{"feeId":"902020072844020741","feePrice":1500}]}
  71. * @return
  72. */
  73. @Override
  74. @Java110Transactional
  75. public ResponseEntity<String> pay(JSONObject reqJson) {
  76. //小区ID
  77. String communityId = reqJson.getString("communityId");
  78. JSONArray fees = reqJson.getJSONArray("fees");
  79. JSONObject feeObj = null;
  80. FeeReceiptPo feeReceiptPo = new FeeReceiptPo();
  81. feeReceiptPo.setReceiptId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_receiptId));
  82. feeReceiptPo.setAmount("0.0");
  83. feeReceiptPo.setPayObjId("-1");
  84. feeReceiptPo.setPayObjName("未知");
  85. for (int feeIndex = 0; feeIndex < fees.size(); feeIndex++) {
  86. feeObj = fees.getJSONObject(feeIndex);
  87. Assert.hasKeyAndValue(feeObj, "feeId", "未包含费用项ID");
  88. Assert.hasKeyAndValue(feeObj, "feePrice", "未包含缴费金额");
  89. feeObj.put("communityId", communityId);
  90. doPayOweFee(feeObj, feeReceiptPo);
  91. }
  92. if (fees.size() > 0) {
  93. feeReceiptInnerServiceSMOImpl.saveFeeReceipt(feeReceiptPo);
  94. }
  95. return ResultVo.createResponseEntity(feeReceiptPo);
  96. }
  97. private void doPayOweFee(JSONObject feeObj, FeeReceiptPo feeReceiptPo) {
  98. //开启全局锁
  99. String requestId = DistributedLock.getLockUUID();
  100. String key = this.getClass().getSimpleName() + feeObj.get("feeId");
  101. try {
  102. DistributedLock.waitGetDistributedLock(key, requestId);
  103. addFeeDetail(feeObj, feeReceiptPo);
  104. modifyFee(feeObj);
  105. //将有账单下的 状态改为已经缴费
  106. modifyFeeBill(feeObj);
  107. //判断是否有派单属性ID
  108. FeeAttrDto feeAttrDto = new FeeAttrDto();
  109. feeAttrDto.setCommunityId(feeObj.getString("communityId"));
  110. feeAttrDto.setFeeId(feeObj.getString("feeId"));
  111. feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_REPAIR);
  112. List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
  113. //修改 派单状态
  114. if (feeAttrDtos != null && feeAttrDtos.size() > 0) {
  115. RepairPoolPo repairPoolPo = new RepairPoolPo();
  116. repairPoolPo.setRepairId(feeAttrDtos.get(0).getValue());
  117. repairPoolPo.setCommunityId(feeObj.getString("communityId"));
  118. repairPoolPo.setState(RepairDto.STATE_APPRAISE);
  119. int saved = repairInnerServiceSMOImpl.updateRepair(repairPoolPo);
  120. if (saved < 1) {
  121. throw new IllegalArgumentException("缴费后修改报修单失败");
  122. }
  123. }
  124. } catch (Exception e) {
  125. logger.error("缴费失败", e);
  126. throw new IllegalArgumentException("缴费失败" + e);
  127. } finally {
  128. DistributedLock.releaseDistributedLock(requestId, key);
  129. }
  130. }
  131. /**
  132. * @param feeObj
  133. */
  134. private void modifyFeeBill(JSONObject feeObj) {
  135. if (FeeConfigDto.BILL_TYPE_EVERY.equals(feeObj.getString("billType"))) {
  136. return;
  137. }
  138. BillDto billDto = new BillDto();
  139. billDto.setCommunityId(feeObj.getString("communityId"));
  140. billDto.setConfigId(feeObj.getString("configId"));
  141. billDto.setCurBill("T");
  142. List<BillDto> billDtos = feeInnerServiceSMOImpl.queryBills(billDto);
  143. if (billDtos == null || billDtos.size() < 1) {
  144. return;
  145. }
  146. BillOweFeeDto billOweFeeDto = new BillOweFeeDto();
  147. billOweFeeDto.setCommunityId(feeObj.getString("communityId"));
  148. billOweFeeDto.setFeeId(feeObj.getString("feeId"));
  149. billOweFeeDto.setState(BillOweFeeDto.STATE_FINISH_FEE);
  150. billOweFeeDto.setBillId(billDtos.get(0).getBillId());
  151. feeInnerServiceSMOImpl.updateBillOweFees(billOweFeeDto);
  152. }
  153. /**
  154. * @param feeObj
  155. */
  156. private void modifyFee(JSONObject feeObj) throws ParseException {
  157. PayFeePo payFeePo = new PayFeePo();
  158. FeeDto feeInfo = (FeeDto) feeObj.get("feeInfo");
  159. FeeConfigDto feeConfigDto = new FeeConfigDto();
  160. feeConfigDto.setConfigId(feeInfo.getConfigId());
  161. feeConfigDto.setCommunityId(feeInfo.getCommunityId());
  162. List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
  163. Assert.listOnlyOne(feeConfigDtos, "未找到费用配置");
  164. feeObj.put("billType", feeConfigDtos.get(0).getBillType());
  165. feeObj.put("configId", feeConfigDtos.get(0).getConfigId());
  166. Date targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(feeInfo, feeObj.getString("tmpCycles"));
  167. String state = computeFeeSMOImpl.getFeeStateByCycles(feeInfo, feeObj.getString("tmpCycles"));
  168. payFeePo.setFeeId(feeObj.getString("feeId"));
  169. payFeePo.setEndTime(DateUtil.getFormatTimeString(targetEndTime, DateUtil.DATE_FORMATE_STRING_A));
  170. payFeePo.setState(state);
  171. payFeePo.setCommunityId(feeObj.getString("communityId"));
  172. payFeePo.setStatusCd("0");
  173. int saveFlag = feeInnerServiceSMOImpl.updateFee(payFeePo);
  174. if (saveFlag < 1) {
  175. throw new IllegalArgumentException("缴费失败" + payFeePo.toString());
  176. }
  177. }
  178. /**
  179. * 添加 费用缴费明细
  180. *
  181. * @param paramInJson
  182. */
  183. private void addFeeDetail(JSONObject paramInJson, FeeReceiptPo feeReceiptPo) {
  184. PayFeeDetailPo payFeeDetailPo = new PayFeeDetailPo();
  185. payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
  186. payFeeDetailPo.setPrimeRate("1.00");
  187. //计算 应收金额
  188. FeeDto feeDto = new FeeDto();
  189. feeDto.setFeeId(paramInJson.getString("feeId"));
  190. feeDto.setCommunityId(paramInJson.getString("communityId"));
  191. List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
  192. if (feeDtos == null || feeDtos.size() != 1) {
  193. throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "查询费用信息失败,未查到数据或查到多条数据");
  194. }
  195. feeDto = feeDtos.get(0);
  196. paramInJson.put("feeInfo", feeDto);
  197. payFeeDetailPo.setStartTime(DateUtil.getFormatTimeString(feeDto.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
  198. BigDecimal feePrice = new BigDecimal(computeFeeSMOImpl.getFeePrice(feeDto));
  199. BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(paramInJson.getString("feePrice")));
  200. BigDecimal cycles = receivedAmount.divide(feePrice, 2, BigDecimal.ROUND_HALF_EVEN);
  201. paramInJson.put("tmpCycles", cycles);
  202. payFeeDetailPo.setEndTime(DateUtil.getFormatTimeString(computeFeeSMOImpl.getFeeEndTimeByCycles(feeDto, cycles.doubleValue() + ""), DateUtil.DATE_FORMATE_STRING_A));
  203. payFeeDetailPo.setCommunityId(paramInJson.getString("communityId"));
  204. payFeeDetailPo.setCycles(cycles.doubleValue() + "");
  205. payFeeDetailPo.setReceivableAmount(receivedAmount.doubleValue() + "");
  206. payFeeDetailPo.setReceivedAmount(receivedAmount.doubleValue() + "");
  207. payFeeDetailPo.setFeeId(feeDto.getFeeId());
  208. int saveFeeDetail = feeDetailInnerServiceSMOImpl.saveFeeDetail(payFeeDetailPo);
  209. if (saveFeeDetail < 1) {
  210. throw new IllegalArgumentException("保存费用详情失败" + payFeeDetailPo.toString());
  211. }
  212. FeeReceiptDetailPo feeReceiptDetailPo = new FeeReceiptDetailPo();
  213. feeReceiptDetailPo.setAmount(payFeeDetailPo.getReceivableAmount());
  214. feeReceiptDetailPo.setCommunityId(feeDto.getCommunityId());
  215. feeReceiptDetailPo.setCycle(payFeeDetailPo.getCycles());
  216. feeReceiptDetailPo.setDetailId(payFeeDetailPo.getDetailId());
  217. feeReceiptDetailPo.setEndTime(payFeeDetailPo.getEndTime());
  218. feeReceiptDetailPo.setFeeId(feeDto.getFeeId());
  219. feeReceiptDetailPo.setFeeName(StringUtil.isEmpty(feeDto.getImportFeeName()) ? feeDto.getFeeName() : feeDto.getImportFeeName());
  220. feeReceiptDetailPo.setStartTime(payFeeDetailPo.getStartTime());
  221. feeReceiptDetailPo.setReceiptId(feeReceiptPo.getReceiptId());
  222. computeFeeSMOImpl.freshFeeReceiptDetail(feeDto, feeReceiptDetailPo);
  223. feeReceiptDetailInnerServiceSMOImpl.saveFeeReceiptDetail(feeReceiptDetailPo);
  224. BigDecimal amount = new BigDecimal(Double.parseDouble(feeReceiptPo.getAmount()));
  225. amount = amount.add(receivedAmount);
  226. feeReceiptPo.setAmount(amount.setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + "");
  227. feeReceiptPo.setCommunityId(feeReceiptDetailPo.getCommunityId());
  228. feeReceiptPo.setObjType(feeDto.getPayerObjType());
  229. feeReceiptPo.setObjId(feeDto.getPayerObjId());
  230. if (StringUtil.isEmpty(feeReceiptPo.getObjName())) {
  231. feeReceiptPo.setObjName(computeFeeSMOImpl.getFeeObjName(feeDto));
  232. }
  233. OwnerDto ownerDto = computeFeeSMOImpl.getFeeOwnerDto(feeDto);
  234. feeReceiptPo.setPayObjId(ownerDto.getOwnerId());
  235. feeReceiptPo.setPayObjName(ownerDto.getName());
  236. }
  237. }