OweFeeCallableAdapt.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. package com.java110.job.adapt.fee;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.java110.core.factory.GenerateCodeFactory;
  5. import com.java110.dto.fee.FeeDto;
  6. import com.java110.dto.oweFeeCallable.OweFeeCallableDto;
  7. import com.java110.dto.owner.OwnerAppUserDto;
  8. import com.java110.dto.owner.OwnerDto;
  9. import com.java110.dto.owner.OwnerRoomRelDto;
  10. import com.java110.dto.reportFee.ReportOweFeeDto;
  11. import com.java110.dto.room.RoomDto;
  12. import com.java110.dto.system.Business;
  13. import com.java110.dto.user.UserDto;
  14. import com.java110.intf.community.IRoomV1InnerServiceSMO;
  15. import com.java110.intf.fee.IOweFeeCallableV1InnerServiceSMO;
  16. import com.java110.intf.report.IReportOweFeeInnerServiceSMO;
  17. import com.java110.intf.user.IOwnerAppUserInnerServiceSMO;
  18. import com.java110.intf.user.IOwnerRoomRelV1InnerServiceSMO;
  19. import com.java110.intf.user.IOwnerV1InnerServiceSMO;
  20. import com.java110.intf.user.IUserV1InnerServiceSMO;
  21. import com.java110.job.adapt.DatabusAdaptImpl;
  22. import com.java110.job.msgNotify.MsgNotifyFactory;
  23. import com.java110.po.oweFeeCallable.OweFeeCallablePo;
  24. import com.java110.utils.cache.MappingCache;
  25. import com.java110.utils.cache.UrlCache;
  26. import com.java110.utils.constant.WechatConstant;
  27. import com.java110.utils.util.Assert;
  28. import com.java110.utils.util.DateUtil;
  29. import com.java110.utils.util.ListUtil;
  30. import com.java110.utils.util.StringUtil;
  31. import com.java110.vo.ResultVo;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.stereotype.Component;
  34. import java.text.ParseException;
  35. import java.util.ArrayList;
  36. import java.util.List;
  37. /**
  38. * 欠费催缴databus
  39. */
  40. @Component(value = "oweFeeCallableAdapt")
  41. public class OweFeeCallableAdapt extends DatabusAdaptImpl {
  42. @Autowired
  43. private IRoomV1InnerServiceSMO roomV1InnerServiceSMOImpl;
  44. @Autowired
  45. private IOwnerRoomRelV1InnerServiceSMO ownerRoomRelV1InnerServiceSMOImpl;
  46. @Autowired
  47. private IOwnerV1InnerServiceSMO ownerV1InnerServiceSMOImpl;
  48. @Autowired
  49. private IOweFeeCallableV1InnerServiceSMO oweFeeCallableV1InnerServiceSMOImpl;
  50. @Autowired
  51. private IReportOweFeeInnerServiceSMO reportOweFeeInnerServiceSMOImpl;
  52. @Autowired
  53. private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
  54. @Autowired
  55. private IOwnerAppUserInnerServiceSMO ownerAppUserInnerServiceSMOImpl;
  56. @Override
  57. public void execute(Business business, List<Business> businesses) throws ParseException {
  58. JSONObject data = business.getData();
  59. JSONArray roomIds = data.getJSONArray("roomIds");
  60. List<OweFeeCallablePo> oweFeeCallablePos = new ArrayList<>();
  61. for (int roomIndex = 0; roomIndex < roomIds.size(); roomIndex++) {
  62. try {
  63. doDealRoomId(data, roomIds.getString(roomIndex), oweFeeCallablePos);
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. if (oweFeeCallablePos.isEmpty()) {
  69. return;
  70. }
  71. int flag = oweFeeCallableV1InnerServiceSMOImpl.saveOweFeeCallables(oweFeeCallablePos);
  72. if (flag < 1) {
  73. throw new IllegalArgumentException("保存催缴记录失败");
  74. }
  75. JSONObject content = null;
  76. String oweRoomUrl = UrlCache.getOwnerUrl() + MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.OWE_FEE_PAGE);
  77. String oweCarUrl = UrlCache.getOwnerUrl() + MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.OWE_CAR_FEE_PAGE);
  78. String oweUrl = "";
  79. OweFeeCallablePo updateOweFeeCallablePo = null;
  80. OwnerAppUserDto ownerAppUserDto = null;
  81. String userId = "";
  82. List<JSONObject> contents = null;
  83. List<OweFeeCallablePo> sendOweFeeCallablePos = null;
  84. //todo 按房屋发送
  85. for (int roomIndex = 0; roomIndex < roomIds.size(); roomIndex++) {
  86. contents = new ArrayList<>();
  87. String notifyWay = MsgNotifyFactory.NOTIFY_WAY_WECHAT;
  88. userId = "";
  89. String ofcId = "";
  90. String ownerId = "";
  91. try {
  92. sendOweFeeCallablePos = new ArrayList<>();
  93. for (OweFeeCallablePo oweFeeCallablePo : oweFeeCallablePos) {
  94. if (!oweFeeCallablePo.getPayerObjId().equals(roomIds.getString(roomIndex))) {
  95. continue;
  96. }
  97. ofcId = oweFeeCallablePo.getOfcId();
  98. ownerId = oweFeeCallablePo.getOwnerId();
  99. //todo 业主不存在
  100. if (StringUtil.isEmpty(oweFeeCallablePo.getOwnerId()) || oweFeeCallablePo.getOwnerId().startsWith("-")) {
  101. updateOweFeeCallablePo = new OweFeeCallablePo();
  102. updateOweFeeCallablePo.setOfcId(oweFeeCallablePo.getOfcId());
  103. updateOweFeeCallablePo.setCommunityId(oweFeeCallablePo.getCommunityId());
  104. updateOweFeeCallablePo.setState(OweFeeCallableDto.STATE_FAIL);
  105. updateOweFeeCallablePo.setRemark(oweFeeCallablePo.getRemark() + "-业主不存在");
  106. oweFeeCallableV1InnerServiceSMOImpl.updateOweFeeCallable(updateOweFeeCallablePo);
  107. continue;
  108. }
  109. ownerAppUserDto = new OwnerAppUserDto();
  110. ownerAppUserDto.setMemberId(oweFeeCallablePo.getOwnerId());
  111. ownerAppUserDto.setCommunityId(oweFeeCallablePo.getCommunityId());
  112. ownerAppUserDto.setAppType(OwnerAppUserDto.APP_TYPE_WECHAT);
  113. List<OwnerAppUserDto> ownerAppUserDtos = ownerAppUserInnerServiceSMOImpl.queryOwnerAppUsers(ownerAppUserDto);
  114. if (!ListUtil.isNull(ownerAppUserDtos)) {
  115. userId = ownerAppUserDtos.get(0).getUserId();
  116. }
  117. oweUrl = FeeDto.PAYER_OBJ_TYPE_ROOM.equals(oweFeeCallablePo.getPayerObjType()) ? oweRoomUrl : oweCarUrl;
  118. content = new JSONObject();
  119. content.put("feeTypeName", oweFeeCallablePo.getFeeName());
  120. content.put("payerObjName", oweFeeCallablePo.getPayerObjName());
  121. content.put("billAmountOwed", oweFeeCallablePo.getAmountdOwed());
  122. content.put("date", DateUtil.dateTimeToDate(oweFeeCallablePo.getStartTime()) + "~" + DateUtil.dateTimeToDate(oweFeeCallablePo.getEndTime()));
  123. content.put("url", oweUrl + oweFeeCallablePo.getPayerObjId());
  124. if (OweFeeCallableDto.CALLABLE_WAY_SMS.equals(oweFeeCallablePo.getCallableWay())) {
  125. notifyWay = MsgNotifyFactory.NOTIFY_WAY_ALI;
  126. }
  127. contents.add(content);
  128. sendOweFeeCallablePos.add(oweFeeCallablePo);
  129. }
  130. if (contents.isEmpty()) {
  131. continue;
  132. }
  133. //todo 催缴
  134. ResultVo resultVo = MsgNotifyFactory.sendOweFeeMsg(data.getString("communityId"), userId, ownerId, contents, notifyWay);
  135. for (OweFeeCallablePo oweFeeCallablePo : sendOweFeeCallablePos) {
  136. if (StringUtil.isEmpty(oweFeeCallablePo.getOwnerId()) || oweFeeCallablePo.getOwnerId().startsWith("-")) {
  137. continue;
  138. }
  139. ofcId = oweFeeCallablePo.getOfcId();
  140. updateOweFeeCallablePo = new OweFeeCallablePo();
  141. updateOweFeeCallablePo.setOfcId(oweFeeCallablePo.getOfcId());
  142. updateOweFeeCallablePo.setCommunityId(oweFeeCallablePo.getCommunityId());
  143. if (resultVo.getCode() != ResultVo.CODE_OK) {
  144. updateOweFeeCallablePo.setState(OweFeeCallableDto.STATE_FAIL);
  145. updateOweFeeCallablePo.setRemark(oweFeeCallablePo.getRemark() + "-" + resultVo.getMsg());
  146. } else {
  147. updateOweFeeCallablePo.setState(OweFeeCallableDto.STATE_COMPLETE);
  148. }
  149. oweFeeCallableV1InnerServiceSMOImpl.updateOweFeeCallable(updateOweFeeCallablePo);
  150. }
  151. }catch (Exception e){
  152. e.printStackTrace();
  153. if(!StringUtil.isEmpty(ofcId)){
  154. updateOweFeeCallablePo = new OweFeeCallablePo();
  155. updateOweFeeCallablePo.setOfcId(ofcId);
  156. updateOweFeeCallablePo.setCommunityId(data.getString("communityId"));
  157. updateOweFeeCallablePo.setState(OweFeeCallableDto.STATE_FAIL);
  158. updateOweFeeCallablePo.setRemark(e.getMessage());
  159. oweFeeCallableV1InnerServiceSMOImpl.updateOweFeeCallable(updateOweFeeCallablePo);
  160. }
  161. }
  162. }
  163. }
  164. /**
  165. * 单个房屋处理
  166. *
  167. * @param data
  168. * @param roomId
  169. */
  170. private void doDealRoomId(JSONObject data, String roomId, List<OweFeeCallablePo> oweFeeCallablePos) {
  171. String communityId = data.getString("communityId");
  172. String staffId = data.getString("staffId");
  173. //todo 3.0 查询费用信息
  174. List<ReportOweFeeDto> feeDtos = getRoomFees(data, roomId);
  175. if (feeDtos == null || feeDtos.size() < 1) {
  176. return;
  177. }
  178. //todo 4.0 查询人员信息
  179. UserDto userDto = getStaffInfo(staffId);
  180. OweFeeCallablePo oweFeeCallablePo = null;
  181. for (ReportOweFeeDto reportOweFeeDto : feeDtos) {
  182. // todo 校验 时间范围
  183. if (!hasInTime(reportOweFeeDto, data)) {
  184. continue;
  185. }
  186. oweFeeCallablePo = new OweFeeCallablePo();
  187. oweFeeCallablePo.setAmountdOwed(reportOweFeeDto.getAmountOwed());
  188. oweFeeCallablePo.setCallableWay(data.getString("callableWay"));
  189. oweFeeCallablePo.setOfcId(GenerateCodeFactory.getGeneratorId("11"));
  190. oweFeeCallablePo.setFeeId(reportOweFeeDto.getFeeId());
  191. oweFeeCallablePo.setFeeName(reportOweFeeDto.getFeeName());
  192. oweFeeCallablePo.setCommunityId(communityId);
  193. oweFeeCallablePo.setConfigId(reportOweFeeDto.getConfigId());
  194. oweFeeCallablePo.setOwnerId(reportOweFeeDto.getOwnerId());
  195. oweFeeCallablePo.setOwnerName(reportOweFeeDto.getOwnerName());
  196. oweFeeCallablePo.setPayerObjId(roomId);
  197. oweFeeCallablePo.setPayerObjName(reportOweFeeDto.getPayerObjName());
  198. oweFeeCallablePo.setPayerObjType(reportOweFeeDto.getPayerObjType());
  199. oweFeeCallablePo.setRemark(data.getString("remark"));
  200. oweFeeCallablePo.setStaffId(userDto.getUserId());
  201. oweFeeCallablePo.setStaffName(userDto.getName());
  202. oweFeeCallablePo.setState(OweFeeCallableDto.STATE_WAIT);
  203. oweFeeCallablePo.setStartTime(reportOweFeeDto.getEndTime());
  204. oweFeeCallablePo.setEndTime(reportOweFeeDto.getDeadlineTime());
  205. oweFeeCallablePos.add(oweFeeCallablePo);
  206. }
  207. }
  208. private UserDto getStaffInfo(String staffId) {
  209. UserDto userDto = new UserDto();
  210. userDto.setUserId(staffId);
  211. List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
  212. if (userDtos == null || userDtos.size() < 1) {
  213. userDto.setUserId("-1");
  214. userDto.setName("系统");
  215. return userDto;
  216. }
  217. return userDtos.get(0);
  218. }
  219. /**
  220. * 查询房屋费用
  221. *
  222. * @return
  223. */
  224. private List<ReportOweFeeDto> getRoomFees(JSONObject data, String roomId) {
  225. ReportOweFeeDto reportOweFeeDto = new ReportOweFeeDto();
  226. reportOweFeeDto.setPayerObjId(roomId);
  227. reportOweFeeDto.setHasOweFee("Y");
  228. if (data.containsKey("feeId")) {
  229. reportOweFeeDto.setFeeId(data.getString("feeId"));
  230. }
  231. List<String> feeIds = new ArrayList<>();
  232. if (data.containsKey("feeIds")) {
  233. JSONArray feeIdAs = data.getJSONArray("feeIds");
  234. for (int feeIndex = 0; feeIndex < feeIdAs.size(); feeIndex++) {
  235. feeIds.add(feeIdAs.getString(feeIndex));
  236. }
  237. if (feeIds.size() > 0) {
  238. reportOweFeeDto.setFeeIds(feeIds.toArray(new String[feeIds.size()]));
  239. }
  240. }
  241. List<String> configIdss = new ArrayList<>();
  242. if (data.containsKey("configIds")) {
  243. JSONArray configIds = data.getJSONArray("configIds");
  244. for (int configIndex = 0; configIndex < configIds.size(); configIndex++) {
  245. configIdss.add(configIds.getString(configIndex));
  246. }
  247. if (configIdss.size() > 0) {
  248. reportOweFeeDto.setConfigIds(configIdss.toArray(new String[configIdss.size()]));
  249. }
  250. }
  251. List<ReportOweFeeDto> reportOweFeeDtos = reportOweFeeInnerServiceSMOImpl.queryReportAllOweFees(reportOweFeeDto);
  252. return reportOweFeeDtos;
  253. }
  254. private boolean hasInTime(ReportOweFeeDto tempFeeDto, JSONObject reqJson) {
  255. if (!reqJson.containsKey("startTime") || !reqJson.containsKey("endTime")) {
  256. return true;
  257. }
  258. String startTime = reqJson.getString("startTime");
  259. String endTime = reqJson.getString("endTime");
  260. if (StringUtil.isEmpty(startTime) || StringUtil.isEmpty(endTime)) {
  261. return true;
  262. }
  263. if (StringUtil.isEmpty(tempFeeDto.getDeadlineTime())) {
  264. return true;
  265. }
  266. if (StringUtil.isEmpty(tempFeeDto.getEndTime())) {
  267. return true;
  268. }
  269. if (DateUtil.getDateFromStringB(tempFeeDto.getEndTime()).before(DateUtil.getDateFromStringB(startTime)) && DateUtil.getDateFromStringB(tempFeeDto.getDeadlineTime()).after(DateUtil.getDateFromStringB(endTime))) {
  270. return true;
  271. }
  272. return false;
  273. }
  274. }