RoomCreatePayFeeAdapt.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package com.java110.job.adapt.fee;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.java110.core.context.ICmdDataFlowContext;
  5. import com.java110.core.factory.GenerateCodeFactory;
  6. import com.java110.dto.fee.FeeAttrDto;
  7. import com.java110.dto.fee.FeeConfigDto;
  8. import com.java110.dto.fee.FeeDetailDto;
  9. import com.java110.dto.fee.FeeDto;
  10. import com.java110.dto.oweFeeCallable.OweFeeCallableDto;
  11. import com.java110.dto.owner.OwnerAppUserDto;
  12. import com.java110.dto.owner.OwnerDto;
  13. import com.java110.dto.payFee.PayFeeDetailRefreshFeeMonthDto;
  14. import com.java110.dto.reportFee.ReportOweFeeDto;
  15. import com.java110.dto.room.RoomDto;
  16. import com.java110.dto.system.Business;
  17. import com.java110.dto.user.UserDto;
  18. import com.java110.intf.community.IRoomInnerServiceSMO;
  19. import com.java110.intf.community.IRoomV1InnerServiceSMO;
  20. import com.java110.intf.fee.*;
  21. import com.java110.intf.report.IReportOweFeeInnerServiceSMO;
  22. import com.java110.intf.user.*;
  23. import com.java110.job.adapt.DatabusAdaptImpl;
  24. import com.java110.job.msgNotify.MsgNotifyFactory;
  25. import com.java110.po.fee.FeeAttrPo;
  26. import com.java110.po.fee.PayFeePo;
  27. import com.java110.po.oweFeeCallable.OweFeeCallablePo;
  28. import com.java110.utils.cache.MappingCache;
  29. import com.java110.utils.cache.UrlCache;
  30. import com.java110.utils.constant.CommonConstant;
  31. import com.java110.utils.constant.WechatConstant;
  32. import com.java110.utils.util.Assert;
  33. import com.java110.utils.util.BeanConvertUtil;
  34. import com.java110.utils.util.DateUtil;
  35. import com.java110.utils.util.StringUtil;
  36. import com.java110.vo.ResultVo;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.http.ResponseEntity;
  39. import org.springframework.stereotype.Component;
  40. import java.text.ParseException;
  41. import java.util.ArrayList;
  42. import java.util.List;
  43. /**
  44. * 欠费催缴databus
  45. */
  46. @Component(value = "roomCreatePayFeeAdapt")
  47. public class RoomCreatePayFeeAdapt extends DatabusAdaptImpl {
  48. private static final int DEFAULT_ADD_FEE_COUNT = 200;
  49. @Autowired
  50. private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
  51. @Autowired
  52. private IOwnerRoomRelV1InnerServiceSMO ownerRoomRelV1InnerServiceSMOImpl;
  53. @Autowired
  54. private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
  55. @Autowired
  56. private IOweFeeCallableV1InnerServiceSMO oweFeeCallableV1InnerServiceSMOImpl;
  57. @Autowired
  58. private IReportOweFeeInnerServiceSMO reportOweFeeInnerServiceSMOImpl;
  59. @Autowired
  60. private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
  61. @Autowired
  62. private IOwnerAppUserInnerServiceSMO ownerAppUserInnerServiceSMOImpl;
  63. @Autowired
  64. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  65. @Autowired
  66. private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
  67. @Autowired
  68. private IPayFeeMonthInnerServiceSMO payFeeMonthInnerServiceSMOImpl;
  69. @Autowired
  70. private IRuleGeneratorPayFeeBillV1InnerServiceSMO ruleGeneratorPayFeeBillV1InnerServiceSMOImpl;
  71. @Override
  72. public void execute(Business business, List<Business> businesses) throws ParseException {
  73. JSONObject data = business.getData();
  74. JSONArray roomIds = data.getJSONArray("roomIds");
  75. List<String> tmpRoomIds = new ArrayList<>();
  76. for (int roomIndex = 0; roomIndex < roomIds.size(); roomIndex++) {
  77. tmpRoomIds.add(roomIds.getString(roomIndex));
  78. if (tmpRoomIds.size() == DEFAULT_ADD_FEE_COUNT) {
  79. doCreateRoomPayFee(data, tmpRoomIds);
  80. tmpRoomIds = new ArrayList<>();
  81. }
  82. }
  83. if (!tmpRoomIds.isEmpty()) {
  84. doCreateRoomPayFee(data, tmpRoomIds);
  85. }
  86. }
  87. private void doCreateRoomPayFee(JSONObject data, List<String> roomIds) {
  88. RoomDto roomDto = new RoomDto();
  89. roomDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
  90. roomDto.setCommunityId(data.getString("communityId"));
  91. List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
  92. //todo 房屋不存在,这种场景一般执行不到
  93. if (roomDtos == null || roomDtos.isEmpty()) {
  94. throw new IllegalArgumentException("房屋不存在");
  95. }
  96. //todo 查询业主信息
  97. OwnerDto ownerDto = new OwnerDto();
  98. ownerDto.setCommunityId(data.getString("communityId"));
  99. ownerDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
  100. List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwnersByRoom(ownerDto);
  101. for (RoomDto tmpRoomDto : roomDtos) {
  102. for (OwnerDto tmpOwnerDto : ownerDtos) {
  103. if (tmpRoomDto.getRoomId().equals(tmpOwnerDto.getRoomId())) {
  104. tmpRoomDto.setOwnerId(tmpOwnerDto.getOwnerId());
  105. tmpRoomDto.setOwnerName(tmpOwnerDto.getName());
  106. tmpRoomDto.setLink(tmpOwnerDto.getLink());
  107. }
  108. }
  109. }
  110. // todo 封装 payFeePo 和 attrs
  111. List<PayFeePo> feePos = new ArrayList<>();
  112. List<FeeAttrPo> feeAttrsPos = new ArrayList<>();
  113. int saveFlag = 0;
  114. for (int roomIndex = 0; roomIndex < roomDtos.size(); roomIndex++) {
  115. //todo 加入 房屋费用
  116. feePos.add(addRoomFee(roomDtos.get(roomIndex), data));
  117. if (!StringUtil.isEmpty(roomDtos.get(roomIndex).getOwnerId())) {
  118. if (!FeeDto.FEE_FLAG_CYCLE.equals(data.getString("feeFlag"))) {
  119. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME, data.containsKey("endTime") ? data.getString("endTime") : data.getString("configEndTime")));
  120. }
  121. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_OWNER_ID, roomDtos.get(roomIndex).getOwnerId()));
  122. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_OWNER_LINK, roomDtos.get(roomIndex).getLink()));
  123. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_OWNER_NAME, roomDtos.get(roomIndex).getOwnerName()));
  124. }
  125. //todo 定制开发 加入
  126. //1、对合同约定的租金递增比例、递增年限各不相同的问题,支持按合同到期日期设租金递增比例。
  127. //2、能自动设置递增的租金实行自动计算当月的租金。
  128. if (data.containsKey("configComputingFormula") && FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(data.getString("configComputingFormula"))) {
  129. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_RATE_CYCLE, data.getString("rateCycle")));
  130. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_RATE, data.getString("rate")));
  131. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_RATE_START_TIME, data.getString("rateStartTime")));
  132. }
  133. //todo 付费对象名称
  134. feeAttrsPos.add(addFeeAttr(data, FeeAttrDto.SPEC_CD_PAY_OBJECT_NAME, roomDtos.get(roomIndex).getFloorNum() + "-" + roomDtos.get(roomIndex).getUnitNum() + "-" + roomDtos.get(roomIndex).getRoomNum()));
  135. if (feePos.size() == DEFAULT_ADD_FEE_COUNT) {
  136. saveFlag = saveFeeAndAttrs(feePos, feeAttrsPos);
  137. feePos = new ArrayList<>();
  138. feeAttrsPos = new ArrayList<>();
  139. }
  140. }
  141. if (!feePos.isEmpty()) {
  142. saveFlag = saveFeeAndAttrs(feePos, feeAttrsPos);
  143. }
  144. }
  145. private PayFeePo addRoomFee(RoomDto roomDto, JSONObject paramInJson) {
  146. String time = DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A);
  147. if (paramInJson.containsKey("feeEndDate")) {
  148. time = paramInJson.getString("feeEndDate");
  149. } else if (paramInJson.containsKey("startTime")) {
  150. time = paramInJson.getString("startTime");
  151. }
  152. //查询费用项
  153. JSONObject businessUnit = new JSONObject();
  154. businessUnit.put("feeId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
  155. businessUnit.put("configId", paramInJson.getString("configId"));
  156. businessUnit.put("feeTypeCd", paramInJson.getString("feeTypeCd"));
  157. businessUnit.put("incomeObjId", paramInJson.getString("storeId"));
  158. businessUnit.put("amount", "-1.00");
  159. if (paramInJson.containsKey("amount") && !StringUtil.isEmpty(paramInJson.getString("amount"))) {
  160. businessUnit.put("amount", paramInJson.getString("amount"));
  161. }
  162. businessUnit.put("startTime", time);
  163. businessUnit.put("endTime", time);
  164. businessUnit.put("communityId", paramInJson.getString("communityId"));
  165. businessUnit.put("payerObjId", roomDto.getRoomId());
  166. businessUnit.put("payerObjType", FeeDto.PAYER_OBJ_TYPE_ROOM);
  167. businessUnit.put("feeFlag", paramInJson.getString("feeFlag"));
  168. businessUnit.put("state", "2008001");
  169. businessUnit.put("batchId", paramInJson.getString("batchId"));
  170. businessUnit.put("userId", paramInJson.getString("userId"));
  171. paramInJson.put("feeId", businessUnit.getString("feeId"));
  172. return BeanConvertUtil.covertBean(businessUnit, PayFeePo.class);
  173. }
  174. private FeeAttrPo addFeeAttr(JSONObject paramInJson, String specCd, String value) {
  175. FeeAttrPo feeAttrPo = new FeeAttrPo();
  176. feeAttrPo.setCommunityId(paramInJson.getString("communityId"));
  177. feeAttrPo.setSpecCd(specCd);
  178. feeAttrPo.setValue(value);
  179. feeAttrPo.setFeeId(paramInJson.getString("feeId"));
  180. feeAttrPo.setAttrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_attrId, true));
  181. return feeAttrPo;
  182. }
  183. private int saveFeeAndAttrs(List<PayFeePo> feePos, List<FeeAttrPo> feeAttrsPos) {
  184. if (feePos == null || feePos.isEmpty()) {
  185. return 1;
  186. }
  187. //todo 账单模式
  188. String billModal = ruleGeneratorPayFeeBillV1InnerServiceSMOImpl.needGeneratorBillData(feePos);
  189. if ("Y".equals(billModal)) {
  190. return 1;
  191. }
  192. int flag = feeInnerServiceSMOImpl.saveFee(feePos);
  193. if (flag < 1) {
  194. return flag;
  195. }
  196. flag = feeAttrInnerServiceSMOImpl.saveFeeAttrs(feeAttrsPos);
  197. // todo 这里异步的方式计算 月数据 和欠费数据
  198. List<String> feeIds = new ArrayList<>();
  199. for (PayFeePo feePo : feePos) {
  200. feeIds.add(feePo.getFeeId());
  201. }
  202. PayFeeDetailRefreshFeeMonthDto payFeeDetailRefreshFeeMonthDto = new PayFeeDetailRefreshFeeMonthDto();
  203. payFeeDetailRefreshFeeMonthDto.setCommunityId(feePos.get(0).getCommunityId());
  204. payFeeDetailRefreshFeeMonthDto.setFeeIds(feeIds);
  205. payFeeMonthInnerServiceSMOImpl.doGeneratorFeeMonths(payFeeDetailRefreshFeeMonthDto);
  206. payFeeMonthInnerServiceSMOImpl.doGeneratorOweFees(payFeeDetailRefreshFeeMonthDto);
  207. return flag;
  208. }
  209. }