FeeCollectionPushMessageTemplate.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. package com.java110.job.task.wechat;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.java110.core.factory.GenerateCodeFactory;
  5. import com.java110.core.factory.SendSmsFactory;
  6. import com.java110.core.factory.WechatFactory;
  7. import com.java110.dto.community.CommunityDto;
  8. import com.java110.dto.fee.FeeDto;
  9. import com.java110.dto.fee.FeeCollectionOrderDto;
  10. import com.java110.dto.log.LogSystemErrorDto;
  11. import com.java110.dto.owner.OwnerAppUserDto;
  12. import com.java110.dto.owner.OwnerDto;
  13. import com.java110.dto.reportFee.ReportOweFeeDto;
  14. import com.java110.dto.reportFee.ReportOweFeeItemDto;
  15. import com.java110.dto.wechat.SmallWeChatDto;
  16. import com.java110.dto.wechat.SmallWechatAttrDto;
  17. import com.java110.dto.sms.SmsConfigDto;
  18. import com.java110.dto.task.TaskDto;
  19. import com.java110.dto.wechat.Content;
  20. import com.java110.dto.wechat.Data;
  21. import com.java110.dto.wechat.Miniprogram;
  22. import com.java110.dto.wechat.PropertyFeeTemplateMessage;
  23. import com.java110.intf.common.ISmsConfigInnerServiceSMO;
  24. import com.java110.intf.fee.IFeeCollectionDetailInnerServiceSMO;
  25. import com.java110.intf.fee.IFeeCollectionOrderInnerServiceSMO;
  26. import com.java110.intf.fee.IFeeInnerServiceSMO;
  27. import com.java110.intf.report.IReportOweFeeInnerServiceSMO;
  28. import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
  29. import com.java110.intf.store.ISmallWechatAttrInnerServiceSMO;
  30. import com.java110.intf.user.IOwnerAppUserInnerServiceSMO;
  31. import com.java110.intf.user.IOwnerInnerServiceSMO;
  32. import com.java110.job.quartz.TaskSystemQuartz;
  33. import com.java110.po.fee.FeeCollectionDetailPo;
  34. import com.java110.po.fee.FeeCollectionOrderPo;
  35. import com.java110.po.log.LogSystemErrorPo;
  36. import com.java110.service.smo.ISaveSystemErrorSMO;
  37. import com.java110.utils.cache.MappingCache;
  38. import com.java110.utils.cache.UrlCache;
  39. import com.java110.utils.constant.WechatConstant;
  40. import com.java110.utils.util.BeanConvertUtil;
  41. import com.java110.utils.util.DateUtil;
  42. import com.java110.utils.util.ExceptionUtil;
  43. import com.java110.utils.util.StringUtil;
  44. import com.java110.vo.ResultVo;
  45. import org.slf4j.Logger;
  46. import com.java110.core.log.LoggerFactory;
  47. import org.springframework.beans.factory.annotation.Autowired;
  48. import org.springframework.http.ResponseEntity;
  49. import org.springframework.stereotype.Component;
  50. import org.springframework.web.client.RestTemplate;
  51. import java.math.BigDecimal;
  52. import java.text.DecimalFormat;
  53. import java.text.ParseException;
  54. import java.util.*;
  55. /**
  56. * @program: MicroCommunity
  57. * @description: 费用催缴信息模板
  58. * @author: zcc
  59. * @create: 2020-06-15 13:35
  60. **/
  61. @Component
  62. public class FeeCollectionPushMessageTemplate extends TaskSystemQuartz {
  63. private static Logger logger = LoggerFactory.getLogger(FeeCollectionPushMessageTemplate.class);
  64. @Autowired
  65. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  66. @Autowired
  67. private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
  68. @Autowired
  69. private ISmallWechatAttrInnerServiceSMO smallWechatAttrInnerServiceSMOImpl;
  70. @Autowired
  71. private IOwnerAppUserInnerServiceSMO ownerAppUserInnerServiceSMOImpl;
  72. @Autowired
  73. private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
  74. @Autowired
  75. private IFeeCollectionOrderInnerServiceSMO feeCollectionOrderInnerServiceSMOImpl;
  76. @Autowired
  77. private IFeeCollectionDetailInnerServiceSMO feeCollectionDetailInnerServiceSMOImpl;
  78. @Autowired
  79. private IReportOweFeeInnerServiceSMO reportOweFeeInnerServiceSMOImpl;
  80. @Autowired
  81. private ISmsConfigInnerServiceSMO smsConfigInnerServiceSMOImpl;
  82. @Autowired
  83. private RestTemplate outRestTemplate;
  84. @Autowired
  85. private ISaveSystemErrorSMO saveSystemErrorSMOImpl;
  86. //模板信息推送地址
  87. private static String sendMsgUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
  88. //模板id
  89. private static String DEFAULT_TEMPLATE_ID = "ZF4j_ug2XW-UGwW1F-Gi4M1-51lpiu-PM89Oa6oZv6w";
  90. private static final int DEFAULT_FEE_COUNT = 200;
  91. @Override
  92. protected void process(TaskDto taskDto) {
  93. logger.debug("开始执行微信模板信息推送" + taskDto.toString());
  94. // 获取小区
  95. List<CommunityDto> communityDtos = getAllCommunity();
  96. for (CommunityDto communityDto : communityDtos) {
  97. try {
  98. publishMsg(taskDto, communityDto);
  99. } catch (Exception e) {
  100. logger.error("推送消息失败", e);
  101. }
  102. }
  103. }
  104. private void publishMsg(TaskDto taskDto, CommunityDto communityDto) throws Exception {
  105. FeeCollectionOrderDto feeCollectionOrderDto = new FeeCollectionOrderDto();
  106. feeCollectionOrderDto.setCommunityId(communityDto.getCommunityId());
  107. feeCollectionOrderDto.setState(FeeCollectionOrderDto.STATE_WAIT);
  108. List<FeeCollectionOrderDto> feeCollectionOrderDtos = feeCollectionOrderInnerServiceSMOImpl.queryFeeCollectionOrders(feeCollectionOrderDto);
  109. if (feeCollectionOrderDtos == null || feeCollectionOrderDtos.size() < 1) {
  110. return;
  111. }
  112. ReportOweFeeDto reportOweFeeDto = new ReportOweFeeDto();
  113. reportOweFeeDto.setCommunityId(communityDto.getCommunityId());
  114. reportOweFeeDto.setHasOweFee("Y");
  115. int oweCount = reportOweFeeInnerServiceSMOImpl.queryReportOweFeesCount(reportOweFeeDto);
  116. if (oweCount == 0) {
  117. return;
  118. }
  119. int maxPage = (int) Math.ceil(oweCount * 1.0 / DEFAULT_FEE_COUNT);
  120. for (int roomIndex = 1; roomIndex <= maxPage; roomIndex++) {
  121. try {
  122. doReportOweFeePushMessage(roomIndex, DEFAULT_FEE_COUNT, communityDto, feeCollectionOrderDtos.get(0));
  123. FeeCollectionOrderPo feeCollectionOrderPo = BeanConvertUtil.covertBean(feeCollectionOrderDtos.get(0), FeeCollectionOrderPo.class);
  124. feeCollectionOrderPo.setState("F");
  125. feeCollectionOrderInnerServiceSMOImpl.updateFeeCollectionOrder(feeCollectionOrderPo);
  126. } catch (Exception e) {
  127. LogSystemErrorPo logSystemErrorPo = new LogSystemErrorPo();
  128. logSystemErrorPo.setErrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_errId));
  129. logSystemErrorPo.setErrType(LogSystemErrorDto.ERR_TYPE_OWE_FEE);
  130. logSystemErrorPo.setMsg(ExceptionUtil.getStackTrace(e));
  131. saveSystemErrorSMOImpl.saveLog(logSystemErrorPo);
  132. logger.error("欠费推送失败" + communityDto.getCommunityId(), e);
  133. }
  134. }
  135. }
  136. private void doReportOweFeePushMessage(int page, int row, CommunityDto communityDto, FeeCollectionOrderDto feeCollectionOrderDto) {
  137. ReportOweFeeDto reportOweFeeDto = new ReportOweFeeDto();
  138. reportOweFeeDto.setCommunityId(communityDto.getCommunityId());
  139. reportOweFeeDto.setHasOweFee("Y");
  140. reportOweFeeDto.setPage(page);
  141. reportOweFeeDto.setRow(row);
  142. List<ReportOweFeeDto> reportOweFeeDtos = reportOweFeeInnerServiceSMOImpl.queryReportOweFees(reportOweFeeDto);
  143. refreshReportOwe(reportOweFeeDtos);
  144. if (reportOweFeeDtos.size() > 0) {
  145. pushMessage(reportOweFeeDtos, feeCollectionOrderDto);
  146. } else {
  147. logger.error("当前没有欠费信息" + communityDto.getCommunityId());
  148. }
  149. }
  150. private void pushMessage(List<ReportOweFeeDto> reportOweFeeDtos, FeeCollectionOrderDto feeCollectionOrderDto) {
  151. for (ReportOweFeeDto reportOweFeeDo : reportOweFeeDtos) {
  152. try {
  153. doPushMessage(reportOweFeeDo, feeCollectionOrderDto);
  154. } catch (Exception e) {
  155. LogSystemErrorPo logSystemErrorPo = new LogSystemErrorPo();
  156. logSystemErrorPo.setErrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_errId));
  157. logSystemErrorPo.setErrType(LogSystemErrorDto.ERR_TYPE_OWE_FEE);
  158. logSystemErrorPo.setMsg(ExceptionUtil.getStackTrace(e));
  159. saveSystemErrorSMOImpl.saveLog(logSystemErrorPo);
  160. logger.error("欠费推送失败" + feeCollectionOrderDto.getCollectionName(), e);
  161. }
  162. }
  163. }
  164. /**
  165. * 推送消息
  166. *
  167. * @param reportOweFeeDo
  168. * @param feeCollectionOrderDto
  169. */
  170. private void doPushMessage(ReportOweFeeDto reportOweFeeDo, FeeCollectionOrderDto feeCollectionOrderDto) {
  171. FeeCollectionDetailPo feeCollectionDetailPo = new FeeCollectionDetailPo();
  172. ResultVo resultVo = null;
  173. switch (feeCollectionOrderDto.getCollectionWay()) {
  174. case FeeCollectionOrderDto.COLLECTION_WAY_SMS:
  175. resultVo = doSendSms(reportOweFeeDo, feeCollectionOrderDto);//短信
  176. feeCollectionDetailPo.setCollectionWay(FeeCollectionOrderDto.COLLECTION_WAY_SMS);
  177. break;
  178. case FeeCollectionOrderDto.COLLECTION_WAY_WECHAT:
  179. if(StringUtil.isEmpty(reportOweFeeDo.getOwnerId()) || "-1".equals(reportOweFeeDo.getOwnerId())){
  180. return;
  181. }
  182. if (!StringUtil.isEmpty(reportOweFeeDo.getOwnerId())) {
  183. Map paramInfo = getOwnerAppUserDto(feeCollectionOrderDto.getCommunityId(), reportOweFeeDo.getOwnerId());
  184. resultVo = doSendWechat(reportOweFeeDo, feeCollectionOrderDto, paramInfo);//微信
  185. feeCollectionDetailPo.setCollectionWay(FeeCollectionOrderDto.COLLECTION_WAY_WECHAT);
  186. }
  187. break;
  188. case FeeCollectionOrderDto.COLLECTION_WAY_WECHAT_SMS:
  189. resultVo = doSendWechatOrSms(reportOweFeeDo, feeCollectionOrderDto, feeCollectionDetailPo);//短信或者微信
  190. break;
  191. }
  192. logger.info("微信模板返回内容:{}", resultVo);
  193. if (resultVo != null) {
  194. feeCollectionDetailPo.setCollectionName(feeCollectionOrderDto.getCollectionName());
  195. feeCollectionDetailPo.setCommunityId(feeCollectionOrderDto.getCommunityId());
  196. feeCollectionDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
  197. feeCollectionDetailPo.setFeeName(feeCollectionOrderDto.getCollectionName() + "欠费");
  198. feeCollectionDetailPo.setOrderId(feeCollectionOrderDto.getOrderId());
  199. feeCollectionDetailPo.setOweAmount(reportOweFeeDo.getAmountOwed());
  200. feeCollectionDetailPo.setOwnerId(reportOweFeeDo.getOwnerId());
  201. feeCollectionDetailPo.setOwnerName(reportOweFeeDo.getOwnerName());
  202. feeCollectionDetailPo.setPayerObjId(reportOweFeeDo.getPayerObjId());
  203. feeCollectionDetailPo.setPayerObjName(reportOweFeeDo.getPayerObjName());
  204. feeCollectionDetailPo.setPayerObjType(reportOweFeeDo.getPayerObjType());
  205. feeCollectionDetailPo.setState(resultVo.getCode() == ResultVo.CODE_OK ? FeeCollectionOrderDto.STATE_FINISH : FeeCollectionOrderDto.STATE_ERROR);
  206. feeCollectionDetailPo.setRemarks(resultVo.getMsg().length() > 512 ? resultVo.getMsg().substring(0, 450) : resultVo.getMsg());
  207. feeCollectionDetailInnerServiceSMOImpl.saveFeeCollectionDetail(feeCollectionDetailPo);
  208. }
  209. }
  210. /**
  211. * 微信或者 短信推送
  212. *
  213. * @param reportOweFeeDo
  214. * @param feeCollectionOrderDto
  215. */
  216. private ResultVo doSendWechatOrSms(ReportOweFeeDto reportOweFeeDo, FeeCollectionOrderDto feeCollectionOrderDto, FeeCollectionDetailPo feeCollectionDetailPo) {
  217. Map paramInfo = getOwnerAppUserDto(feeCollectionOrderDto.getCommunityId(), reportOweFeeDo.getOweId());
  218. if (paramInfo == null) {
  219. feeCollectionDetailPo.setCollectionWay(FeeCollectionOrderDto.COLLECTION_WAY_SMS);
  220. return doSendSms(reportOweFeeDo, feeCollectionOrderDto);//短信推送
  221. }
  222. feeCollectionDetailPo.setCollectionWay(FeeCollectionOrderDto.COLLECTION_WAY_WECHAT);
  223. return doSendWechat(reportOweFeeDo, feeCollectionOrderDto, paramInfo);//微信推送
  224. }
  225. /**
  226. * 微信方式推送
  227. *
  228. * @param reportOweFeeDo
  229. * @param feeCollectionOrderDto
  230. */
  231. private ResultVo doSendWechat(ReportOweFeeDto reportOweFeeDo, FeeCollectionOrderDto feeCollectionOrderDto) {
  232. Map paramInfo = getOwnerAppUserDto(feeCollectionOrderDto.getCommunityId(), reportOweFeeDo.getOwnerId());
  233. if (paramInfo == null) {
  234. return new ResultVo(ResultVo.CODE_ERROR, "业主未绑定");
  235. }
  236. return doSendWechat(reportOweFeeDo, feeCollectionOrderDto, paramInfo);
  237. }
  238. /**
  239. * 微信方式推送
  240. *
  241. * @param reportOweFeeDo
  242. * @param feeCollectionOrderDto
  243. */
  244. private ResultVo doSendWechat(ReportOweFeeDto reportOweFeeDo, FeeCollectionOrderDto feeCollectionOrderDto, Map paramInfo) {
  245. if (paramInfo == null) {
  246. return new ResultVo(ResultVo.CODE_ERROR, "业主未绑定");
  247. }
  248. String templateId = paramInfo.get("templateId").toString();
  249. String url = paramInfo.get("url").toString();
  250. String oweRoomUrl = paramInfo.get("oweRoomUrl").toString();
  251. String oweCarUrl = paramInfo.get("oweCarUrl").toString();
  252. SmallWeChatDto weChatDto = (SmallWeChatDto) paramInfo.get("weChatDto");
  253. Miniprogram miniprogram = paramInfo.get("miniprogram") == null ? null : (Miniprogram) paramInfo.get("miniprogram");
  254. List<OwnerAppUserDto> ownerAppUserDtos = (List<OwnerAppUserDto>) paramInfo.get("ownerAppUserDtos");
  255. List<ReportOweFeeItemDto> itemDtos = reportOweFeeDo.getItems();
  256. String oweUrl = "";
  257. for (ReportOweFeeItemDto itemDto : itemDtos) {
  258. BigDecimal amountOwed = new BigDecimal(itemDto.getAmountOwed());
  259. oweUrl = FeeDto.PAYER_OBJ_TYPE_ROOM.equals(reportOweFeeDo.getPayerObjType()) ? oweRoomUrl : oweCarUrl;
  260. String[] roomName = new String[]{};
  261. if ("3333".equals(reportOweFeeDo.getPayerObjType())) {
  262. roomName = itemDto.getPayerObjName().split("-",3);
  263. }
  264. for (OwnerAppUserDto appUserDto : ownerAppUserDtos) {
  265. try {
  266. //获取用户缴费到期时间
  267. Date endTime = itemDto.getEndTime();
  268. Calendar calendar = Calendar.getInstance();
  269. calendar.setTime(endTime);
  270. calendar.add(Calendar.DATE, -1);
  271. endTime = calendar.getTime();
  272. Data data = new Data();
  273. PropertyFeeTemplateMessage templateMessage = new PropertyFeeTemplateMessage();
  274. templateMessage.setTemplate_id(templateId);
  275. templateMessage.setTouser(appUserDto.getOpenId());
  276. data.setFirst(new Content(itemDto.getFeeName() + "提醒"));
  277. if ("3333".equals(reportOweFeeDo.getPayerObjType())) {
  278. data.setKeyword1(new Content(roomName[0] + "栋" + roomName[1] + "单元" + roomName[2] + "室"));
  279. } else {
  280. data.setKeyword1(new Content(itemDto.getPayerObjName()));
  281. }
  282. DecimalFormat df = new DecimalFormat("0.00");
  283. data.setKeyword2(new Content(df.format(amountOwed) + "元"));
  284. data.setKeyword3(new Content(
  285. DateUtil.getFormatTimeString(itemDto.getStartTime(), DateUtil.DATE_FORMATE_STRING_B)
  286. + "至"
  287. + DateUtil.getFormatTimeString(endTime, DateUtil.DATE_FORMATE_STRING_B)));
  288. data.setRemark(new Content("请您及时缴费,如有疑问请联系相关物业人员!"));
  289. if (!StringUtil.isEmpty(oweUrl)) {
  290. if (miniprogram == null) {
  291. templateMessage.setUrl(oweUrl + itemDto.getPayerObjId() + "&wAppId=" + weChatDto.getAppId());
  292. } else {
  293. miniprogram.setPagepath(oweUrl.split("@@")[1] + itemDto.getPayerObjId() + "&wAppId=" + weChatDto.getAppId());
  294. templateMessage.setMiniprogram(miniprogram);
  295. }
  296. }
  297. templateMessage.setData(BeanConvertUtil.beanCovertJson(data));
  298. logger.info("发送模板消息内容:{}", JSON.toJSONString(templateMessage));
  299. ResponseEntity<String> responseEntity = outRestTemplate.postForEntity(url, JSON.toJSONString(templateMessage), String.class);
  300. logger.info("微信模板返回内容:{}", responseEntity);
  301. } catch (Exception e) {
  302. LogSystemErrorPo logSystemErrorPo = new LogSystemErrorPo();
  303. logSystemErrorPo.setErrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_errId));
  304. logSystemErrorPo.setErrType(LogSystemErrorDto.ERR_TYPE_OWE_FEE);
  305. logSystemErrorPo.setMsg(ExceptionUtil.getStackTrace(e));
  306. saveSystemErrorSMOImpl.saveLog(logSystemErrorPo);
  307. logger.error("欠费推送失败" + feeCollectionOrderDto.getCollectionName(), e);
  308. }
  309. }
  310. }
  311. return new ResultVo(ResultVo.CODE_OK, ResultVo.MSG_OK);
  312. }
  313. /**
  314. * 短信方式推送
  315. *
  316. * @param reportOweFeeDo
  317. * @param feeCollectionOrderDto
  318. */
  319. private ResultVo doSendSms(ReportOweFeeDto reportOweFeeDo, FeeCollectionOrderDto feeCollectionOrderDto) {
  320. SmsConfigDto smsConfigDto = new SmsConfigDto();
  321. smsConfigDto.setObjId(feeCollectionOrderDto.getCommunityId());
  322. smsConfigDto.setSmsBusi(SmsConfigDto.SMS_BUSI_OWE);
  323. List<SmsConfigDto> smsConfigDtos = smsConfigInnerServiceSMOImpl.querySmsConfigs(smsConfigDto);
  324. if (smsConfigDtos == null || smsConfigDtos.size() < 1) {
  325. return new ResultVo(ResultVo.CODE_ERROR, "未配置短信信息");
  326. }
  327. Object paramIn = null;
  328. List<ReportOweFeeItemDto> itemDtos = reportOweFeeDo.getItems();
  329. //获取用户缴费到期时间
  330. Date endTime = itemDtos.get(0).getEndTime();
  331. Calendar calendar = Calendar.getInstance();
  332. calendar.setTime(endTime);
  333. calendar.add(Calendar.DATE, -1);
  334. endTime = calendar.getTime();
  335. SmsConfigDto smsConfigDto1 = BeanConvertUtil.covertBean(smsConfigDtos.get(0), SmsConfigDto.class);
  336. // 尊敬的业主${user},您${house}的${feeType},账单日期${date}至${date2},缴费金额:${mount}元,请及时缴费
  337. if ("ALI".equals(smsConfigDto1.getSmsType())) {
  338. JSONObject param = new JSONObject();
  339. param.put("user", reportOweFeeDo.getOwnerName());
  340. param.put("house", reportOweFeeDo.getPayerObjName());
  341. param.put("feeType", itemDtos.get(0).getFeeName());
  342. param.put("date", DateUtil.getFormatTimeString(itemDtos.get(0).getStartTime(), DateUtil.DATE_FORMATE_STRING_B));
  343. param.put("date2", DateUtil.getFormatTimeString(endTime, DateUtil.DATE_FORMATE_STRING_B));
  344. param.put("mount", reportOweFeeDo.getAmountOwed());
  345. paramIn = param;
  346. }else if(SendSmsFactory.SMS_COMPANY_YIDONG.equals(smsConfigDto1.getSmsType())){
  347. paramIn = "尊敬的业主"+ reportOweFeeDo.getOwnerName()+",您"+reportOweFeeDo.getPayerObjName()+"的"+itemDtos.get(0).getFeeName()
  348. +",账单日期"+DateUtil.getFormatTimeString(itemDtos.get(0).getStartTime(), DateUtil.DATE_FORMATE_STRING_B)
  349. +"至"+DateUtil.getFormatTimeString(endTime, DateUtil.DATE_FORMATE_STRING_B)
  350. +",缴费金额:"+reportOweFeeDo.getAmountOwed()+"元,请及时缴费";
  351. } else {
  352. paramIn = new String[]{
  353. reportOweFeeDo.getOwnerName(),
  354. reportOweFeeDo.getPayerObjName(),
  355. reportOweFeeDo.getAmountOwed()
  356. };
  357. }
  358. OwnerDto ownerDto = new OwnerDto();
  359. ownerDto.setCommunityId(feeCollectionOrderDto.getCommunityId());
  360. ownerDto.setOwnerId(reportOweFeeDo.getOwnerId());
  361. List<OwnerDto> ownerDtos = ownerInnerServiceSMOImpl.queryOwners(ownerDto);
  362. if (ownerDtos == null || ownerDtos.size() < 1) {
  363. return new ResultVo(ResultVo.CODE_ERROR, "业主不存在");
  364. }
  365. ResultVo resultVo = null;
  366. for (OwnerDto ownerDto1 : ownerDtos) {
  367. resultVo = SendSmsFactory.sendOweFeeSms(ownerDto1.getLink(), smsConfigDto1, paramIn);
  368. }
  369. return resultVo;
  370. }
  371. private Map getOwnerAppUserDto(String communityId, String memberId) {
  372. SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
  373. smallWeChatDto.setWeChatType("1100");
  374. smallWeChatDto.setObjType(SmallWeChatDto.OBJ_TYPE_COMMUNITY);
  375. smallWeChatDto.setObjId(communityId);
  376. List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
  377. if (smallWeChatDto == null || smallWeChatDtos.size() <= 0) {
  378. logger.info("未配置微信公众号信息,定时任务执行结束");
  379. return null;
  380. }
  381. SmallWeChatDto weChatDto = smallWeChatDtos.get(0);
  382. SmallWechatAttrDto smallWechatAttrDto = new SmallWechatAttrDto();
  383. smallWechatAttrDto.setCommunityId(communityId);
  384. smallWechatAttrDto.setWechatId(weChatDto.getWeChatId());
  385. smallWechatAttrDto.setSpecCd(SmallWechatAttrDto.SPEC_CD_OWE_FEE_TEMPLATE);
  386. List<SmallWechatAttrDto> smallWechatAttrDtos = smallWechatAttrInnerServiceSMOImpl.querySmallWechatAttrs(smallWechatAttrDto);
  387. if (smallWechatAttrDtos == null || smallWechatAttrDtos.size() <= 0) {
  388. logger.info("未配置微信公众号消息模板");
  389. return null;
  390. }
  391. String templateId = smallWechatAttrDtos.get(0).getValue();
  392. String accessToken = WechatFactory.getAccessToken(weChatDto.getAppId(), weChatDto.getAppSecret());
  393. if (StringUtil.isEmpty(accessToken)) {
  394. logger.info("推送微信模板,获取accessToken失败:{}", accessToken);
  395. return null;
  396. }
  397. //根据小区id查询业主与公众号绑定信息
  398. OwnerAppUserDto ownerAppUserDto = new OwnerAppUserDto();
  399. ownerAppUserDto.setCommunityId(weChatDto.getObjId());
  400. ownerAppUserDto.setAppType(OwnerAppUserDto.APP_TYPE_WECHAT);
  401. ownerAppUserDto.setMemberId(memberId);
  402. List<OwnerAppUserDto> ownerAppUserDtos = ownerAppUserInnerServiceSMOImpl.queryOwnerAppUsers(ownerAppUserDto);
  403. if (ownerAppUserDtos == null || ownerAppUserDtos.size() < 1) {
  404. return null;
  405. }
  406. String sendTemplate = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.SEND_TEMPLATE_URL);
  407. if (StringUtil.isEmpty(sendTemplate)) {
  408. sendTemplate = sendMsgUrl;
  409. }
  410. String url = sendTemplate + accessToken;
  411. String oweRoomUrl = UrlCache.getOwnerUrl()+MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.OWE_FEE_PAGE);
  412. String oweCarUrl = UrlCache.getOwnerUrl()+MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.OWE_CAR_FEE_PAGE);
  413. Miniprogram miniprogram = null;
  414. if (oweRoomUrl.contains("@@")) {
  415. miniprogram = new Miniprogram();
  416. miniprogram.setAppid(oweRoomUrl.split("@@")[0]);
  417. }
  418. //车辆费用
  419. if (oweCarUrl.contains("@@")) {
  420. miniprogram = new Miniprogram();
  421. miniprogram.setAppid(oweCarUrl.split("@@")[0]);
  422. }
  423. Map paramInfo = new HashMap();
  424. paramInfo.put("templateId", templateId);
  425. paramInfo.put("url", url);
  426. paramInfo.put("miniprogram", miniprogram);
  427. paramInfo.put("oweCarUrl", oweCarUrl);
  428. paramInfo.put("oweRoomUrl", oweRoomUrl);
  429. paramInfo.put("ownerAppUserDtos", ownerAppUserDtos);
  430. paramInfo.put("weChatDto", weChatDto);
  431. return paramInfo;
  432. }
  433. private void refreshReportOwe(List<ReportOweFeeDto> oldReportOweFeeDtos) {
  434. List<String> payObjIds = new ArrayList<>();
  435. if (oldReportOweFeeDtos == null || oldReportOweFeeDtos.size() < 1) {
  436. return;
  437. }
  438. for (ReportOweFeeDto reportOweFeeDto : oldReportOweFeeDtos) {
  439. payObjIds.add(reportOweFeeDto.getPayerObjId());
  440. }
  441. ReportOweFeeDto reportOweFeeDto = new ReportOweFeeDto();
  442. reportOweFeeDto.setPayerObjIds(payObjIds.toArray(new String[payObjIds.size()]));
  443. reportOweFeeDto.setHasOweFee("Y");
  444. List<ReportOweFeeDto> allReportOweFeeDtos = reportOweFeeInnerServiceSMOImpl.queryReportAllOweFees(reportOweFeeDto);
  445. List<ReportOweFeeDto> reportOweFeeDtos = new ArrayList<>();
  446. for (ReportOweFeeDto reportOweFee : allReportOweFeeDtos) {
  447. ReportOweFeeDto reportOwe = new ReportOweFeeDto();
  448. reportOwe.setOweId(reportOweFee.getOweId());
  449. reportOwe.setHasOweFee("Y");
  450. reportOweFee.setPayerObjType(reportOweFee.getPayerObjType());
  451. if (reportOweFee.getPayerObjType().equals("3333")) {
  452. List<ReportOweFeeDto> reportOweFees = reportOweFeeInnerServiceSMOImpl.queryReportAllOweFeesByRoom(reportOwe);
  453. reportOweFee.setOweId(reportOweFees.get(0).getOweId());
  454. reportOweFee.setOwnerId(reportOweFees.get(0).getOwnerId());
  455. reportOweFee.setOwnerName(reportOweFees.get(0).getOwnerName());
  456. } else if (reportOweFee.getPayerObjType().equals("6666")) {
  457. List<ReportOweFeeDto> reportOweFees = reportOweFeeInnerServiceSMOImpl.queryReportAllOweFeesByCar(reportOwe);
  458. reportOweFee.setOweId(reportOweFees.get(0).getOweId());
  459. reportOweFee.setOwnerId(reportOweFees.get(0).getOwnerId());
  460. reportOweFee.setOwnerName(reportOweFees.get(0).getOwnerName());
  461. }
  462. reportOweFeeDtos.add(reportOweFee);
  463. }
  464. for (ReportOweFeeDto tmpReportOweFeeDto : oldReportOweFeeDtos) {
  465. dealItem(tmpReportOweFeeDto, reportOweFeeDtos);
  466. }
  467. }
  468. private void dealItem(ReportOweFeeDto oldReportOweFeeDto, List<ReportOweFeeDto> allReportOweFeeDtos) {
  469. List<ReportOweFeeItemDto> items = new ArrayList<>();
  470. if (allReportOweFeeDtos == null || allReportOweFeeDtos.size() < 1) {
  471. return;
  472. }
  473. ReportOweFeeItemDto reportOweFeeItemDto = null;
  474. for (ReportOweFeeDto reportOweFeeDto : allReportOweFeeDtos) {
  475. if (!oldReportOweFeeDto.getPayerObjId().equals(reportOweFeeDto.getPayerObjId())) {
  476. continue;
  477. }
  478. reportOweFeeItemDto = hasItem(items, reportOweFeeDto.getConfigId());
  479. if (reportOweFeeItemDto == null) {
  480. reportOweFeeItemDto = new ReportOweFeeItemDto();
  481. reportOweFeeItemDto.setConfigId(reportOweFeeDto.getConfigId());
  482. reportOweFeeItemDto.setFeeName(reportOweFeeDto.getFeeName());
  483. reportOweFeeItemDto.setAmountOwed(reportOweFeeDto.getAmountOwed());
  484. reportOweFeeItemDto.setPayerObjId(reportOweFeeDto.getPayerObjId());
  485. reportOweFeeItemDto.setPayerObjName(reportOweFeeDto.getPayerObjName());
  486. reportOweFeeItemDto.setConfigName(reportOweFeeDto.getConfigName());
  487. try {
  488. reportOweFeeItemDto.setStartTime(DateUtil.getDateFromString(reportOweFeeDto.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
  489. reportOweFeeItemDto.setEndTime(DateUtil.getDateFromString(reportOweFeeDto.getDeadlineTime(), DateUtil.DATE_FORMATE_STRING_A));
  490. } catch (ParseException e) {
  491. e.printStackTrace();
  492. }
  493. items.add(reportOweFeeItemDto);
  494. } else {
  495. BigDecimal oldAmount = new BigDecimal(Double.parseDouble(reportOweFeeItemDto.getAmountOwed()));
  496. oldAmount = oldAmount.add(new BigDecimal(Double.parseDouble(reportOweFeeDto.getAmountOwed()))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
  497. reportOweFeeItemDto.setAmountOwed(oldAmount.doubleValue() + "");
  498. }
  499. if (!StringUtil.isEmpty(reportOweFeeDto.getOwnerName()) && StringUtil.isEmpty(oldReportOweFeeDto.getOwnerName())) {
  500. oldReportOweFeeDto.setOwnerName(reportOweFeeDto.getOwnerName());
  501. }
  502. if (!StringUtil.isEmpty(reportOweFeeDto.getOwnerId()) && StringUtil.isEmpty(oldReportOweFeeDto.getOwnerId())) {
  503. oldReportOweFeeDto.setOwnerId(reportOweFeeDto.getOwnerId());
  504. }
  505. if (!StringUtil.isEmpty(reportOweFeeDto.getPayerObjType()) && StringUtil.isEmpty(oldReportOweFeeDto.getPayerObjType())) {
  506. oldReportOweFeeDto.setPayerObjType(reportOweFeeDto.getPayerObjType());
  507. }
  508. oldReportOweFeeDto.setUpdateTime(reportOweFeeDto.getUpdateTime());
  509. oldReportOweFeeDto.setConfigName(reportOweFeeDto.getConfigName());
  510. }
  511. //计算总金额
  512. BigDecimal totalAmount = new BigDecimal(0);
  513. Date startTime = null;
  514. Date endTime = null;
  515. for (ReportOweFeeItemDto tempReportOweFeeItemDto : items) {
  516. if (startTime == null) {
  517. startTime = tempReportOweFeeItemDto.getStartTime();
  518. }
  519. if (startTime.getTime() > tempReportOweFeeItemDto.getStartTime().getTime()) {
  520. startTime = tempReportOweFeeItemDto.getStartTime();
  521. }
  522. if (endTime == null) {
  523. endTime = tempReportOweFeeItemDto.getEndTime();
  524. }
  525. if (endTime.getTime() < tempReportOweFeeItemDto.getEndTime().getTime()) {
  526. endTime = tempReportOweFeeItemDto.getEndTime();
  527. }
  528. totalAmount = totalAmount.add(new BigDecimal(Double.parseDouble(tempReportOweFeeItemDto.getAmountOwed()))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
  529. }
  530. oldReportOweFeeDto.setEndTime(DateUtil.getFormatTimeString(startTime, DateUtil.DATE_FORMATE_STRING_A));
  531. oldReportOweFeeDto.setDeadlineTime(DateUtil.getFormatTimeString(endTime, DateUtil.DATE_FORMATE_STRING_A));
  532. oldReportOweFeeDto.setItems(items);
  533. oldReportOweFeeDto.setPayerObjName(items.get(0).getPayerObjName());
  534. oldReportOweFeeDto.setAmountOwed(totalAmount.doubleValue() + "");
  535. }
  536. private ReportOweFeeItemDto hasItem(List<ReportOweFeeItemDto> reportOweFeeItemDtos, String configId) {
  537. if (reportOweFeeItemDtos == null || reportOweFeeItemDtos.size() < 1) {
  538. return null;
  539. }
  540. for (ReportOweFeeItemDto reportOweFeeItemDto : reportOweFeeItemDtos) {
  541. if (reportOweFeeItemDto.getConfigId().equals(configId)) {
  542. return reportOweFeeItemDto;
  543. }
  544. }
  545. return null;
  546. }
  547. }