From c6aad7efceb46db4243de25696cca8bb61a7fa90 Mon Sep 17 00:00:00 2001 From: xiezhiwen Date: Wed, 13 Nov 2019 10:57:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E5=89=8D=E7=BB=93=E6=B8=85=E5=87=AD?= =?UTF-8?q?=E8=AF=81=E7=94=9F=E6=88=90=E9=87=8D=E5=A4=8D=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=8F=8A=E5=BE=AE=E4=BF=A1=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/Wechat.properties | 2 + src_core/com/tenwa/util/SerialNumberUtil.java | 3 + .../CreateVoucherContractTerminate.java | 18 +- .../resources/WechatPropertiesUtil.java | 49 +++ .../app/quartzmession/WechatMessagePush.java | 298 ++++++++++++++++++ 5 files changed, 361 insertions(+), 9 deletions(-) create mode 100644 config/Wechat.properties create mode 100644 src_tenwa/com/tenwa/httpclient/resources/WechatPropertiesUtil.java create mode 100644 src_tenwa/com/tenwa/lease/app/quartzmession/WechatMessagePush.java diff --git a/config/Wechat.properties b/config/Wechat.properties new file mode 100644 index 000000000..4a0022b22 --- /dev/null +++ b/config/Wechat.properties @@ -0,0 +1,2 @@ +# 微信推送消息接口路径 +WechatURL=http://wx.tenwa.com.cn/wxapi/template/send \ No newline at end of file diff --git a/src_core/com/tenwa/util/SerialNumberUtil.java b/src_core/com/tenwa/util/SerialNumberUtil.java index 3f0c52fb6..7b38f2e51 100644 --- a/src_core/com/tenwa/util/SerialNumberUtil.java +++ b/src_core/com/tenwa/util/SerialNumberUtil.java @@ -57,6 +57,9 @@ public class SerialNumberUtil { public static synchronized String getVoucherPCNumber(JBOTransaction tx) throws Exception{ return SerialNumberUtil.getSerialNumber("AP{year}{month}{day}-{maxOrderNumber}",3,null, "凭证接口批次", null, tx); } + public static synchronized String getWechatBatchNumber(JBOTransaction tx) throws Exception{ + return SerialNumberUtil.getSerialNumber("AP{year}{month}{day}-{maxOrderNumber}",3,null, "微信接口批次", null, tx); + } //鹏元apply_id public static synchronized String getPengyuanNumber(JBOTransaction tx) throws Exception{ return SerialNumberUtil.getSerialNumber("{year}{month}{day}{maxOrderNumber}",9,null, "鹏元apply_id", null, tx); diff --git a/src_core/com/tenwa/voucher/CreateVoucherProcess/CreateVoucherContractTerminate.java b/src_core/com/tenwa/voucher/CreateVoucherProcess/CreateVoucherContractTerminate.java index d8ad3c937..6ccab92fe 100644 --- a/src_core/com/tenwa/voucher/CreateVoucherProcess/CreateVoucherContractTerminate.java +++ b/src_core/com/tenwa/voucher/CreateVoucherProcess/CreateVoucherContractTerminate.java @@ -71,31 +71,31 @@ public class CreateVoucherContractTerminate { // 调整未实现利息收入 if("PZ2018072100000045".equals(VOUCHERNO)){ - //sql="SELECT IFNULL(LRPT.INTEREST, 0) AS MONEY,ROUND(IFNULL(LRPT.INTEREST, 0) / getTax (LCI.LEAS_FORM,'租息',LCCT.START_DATE),2) AS MONEYNOTAX,(IFNULL(LRPT.INTEREST, 0) - ROUND(IFNULL(LRPT.INTEREST, 0) / getTax (LCI.LEAS_FORM,'租息',LCCT.START_DATE),2)) AS MONEYTAX,DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') AS ACCOUNT_DATE,DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') AS FACT_DATE,LCCT.CONTRACT_ID,LCI.CONTRACT_NUMBER,LCI.PROJECT_NAME,LCI.LEAS_FORM,DI.DISTRIBUTOR_CODING DISTRIBUTOR_ID,DI.DISTRIBUTOR_NAME,DI.F_I_TYPE,CIF.CUSTOMER_NUM AS CUSTOMERID,CIF.CUSTOMERNAME,CIF.CUSTOMERTYPE,LPI.BUSINESSTYPE FROM LC_FUND_RENT_ADJUST_TEMP LCRAT LEFT JOIN (SELECT LRPT.CONTRACT_ID,LRPT.FLOWUNID FROM LC_RENT_PLAN_TEMP LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LRPT.FLOWUNID = LCRAT.FLOWUNID AND LRPT.PAYMENT_NUMBER = LCRAT.PAYMENT_NUMBER GROUP BY LRPT.FLOWUNID,LRPT.CONTRACT_ID) LRP ON LRP.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,SUM(LRPT.INTEREST) AS INTEREST FROM LC_RENT_PLAN LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LCRAT.PAYMENT_NUMBER = LRPT.PAYMENT_NUMBER WHERE DATE_FORMAT(LRPT.PLAN_DATE,'%Y/%m/%d') >= DATE_FORMAT(LCRAT.PAYDAY_ADJUST,'%Y/%m/%d')GROUP BY LRPT.CONTRACT_ID) LRPT ON LRPT.CONTRACT_ID = LRP.CONTRACT_ID LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LRPT.CONTRACT_ID LEFT JOIN LC_CALC_CONDITION LCCT ON LCCT.CONTRACT_ID = LCI.ID LEFT JOIN DISTRIBUTOR_INFO DI ON DI.DISTRIBUTOR_NO = LCI.DISTRIBUTOR_ID LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CONTRACT_ID = LCI.ID LEFT JOIN CUSTOMER_INFO CIF ON CIF.CUSTOMERID = LUL.CUSTOMER_ID LEFT JOIN LB_PROJECT_INFO LPI ON LPI.ID = LUL.PROJECT_ID WHERE LPI.BUSINESSTYPE = '1' AND lul.IS_MAIN='Y' AND LCRAT.FLOWUNID = :FLOWUNID "; - sql="SELECT IFNULL(LRPT.INTEREST, 0) AS MONEY,ROUND(IFNULL(LRPT.INTEREST, 0) / getTax(LCI.LEAS_FORM,'租息',LCCT.START_DATE),2) AS MONEYNOTAX,(IFNULL(LRPT.INTEREST, 0) - ROUND(IFNULL(LRPT.INTEREST, 0) / getTax(LCI.LEAS_FORM,'租息',LCCT.START_DATE),2)) AS MONEYTAX,DATE_FORMAT(NOW(), '%Y/%m/%d') AS ACCOUNT_DATE,DATE_FORMAT(LE.FACT_DATE, '%Y/%m/%d') AS FACT_DATE,LCCT.CONTRACT_ID,LCI.CONTRACT_NUMBER,LCI.PROJECT_NAME,LCI.LEAS_FORM,DI.DISTRIBUTOR_CODING DISTRIBUTOR_ID,DI.DISTRIBUTOR_NAME,DI.F_I_TYPE,CIF.CUSTOMER_NUM AS CUSTOMERID,CIF.CUSTOMERNAME,CIF.CUSTOMERTYPE,LPI.BUSINESSTYPE FROM LC_FUND_RENT_ADJUST_TEMP LCRAT LEFT JOIN LC_EBANK_TEMP LE ON LE.FLOWUNID=LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,LRPT.FLOWUNID FROM LC_RENT_PLAN_TEMP LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LRPT.FLOWUNID = LCRAT.FLOWUNID AND LRPT.PAYMENT_NUMBER = LCRAT.PAYMENT_NUMBER GROUP BY LRPT.FLOWUNID,LRPT.CONTRACT_ID) LRP ON LRP.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,SUM(LRPT.INTEREST) AS INTEREST FROM LC_RENT_PLAN LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LCRAT.PAYMENT_NUMBER = LRPT.PAYMENT_NUMBER WHERE DATE_FORMAT(LRPT.PLAN_DATE, '%Y/%m/%d') >= DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') GROUP BY LRPT.CONTRACT_ID) LRPT ON LRPT.CONTRACT_ID = LRP.CONTRACT_ID LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LRPT.CONTRACT_ID LEFT JOIN LC_CALC_CONDITION LCCT ON LCCT.CONTRACT_ID = LCI.ID LEFT JOIN DISTRIBUTOR_INFO DI ON DI.DISTRIBUTOR_NO = LCI.DISTRIBUTOR_ID LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CONTRACT_ID = LCI.ID LEFT JOIN CUSTOMER_INFO CIF ON CIF.CUSTOMERID = LUL.CUSTOMER_ID LEFT JOIN LB_PROJECT_INFO LPI ON LPI.ID = LUL.PROJECT_ID WHERE LPI.BUSINESSTYPE = '1' AND lul.IS_MAIN = 'Y' AND IFNULL(LRPT.INTEREST, 0)>0 AND LCRAT.FLOWUNID = :FLOWUNID "; + //sql="SELECT IFNULL(LRPT.INTEREST, 0) AS MONEY,ROUND(IFNULL(LRPT.INTEREST, 0) / getTax(LCI.LEAS_FORM,'租息',LCCT.START_DATE),2) AS MONEYNOTAX,(IFNULL(LRPT.INTEREST, 0) - ROUND(IFNULL(LRPT.INTEREST, 0) / getTax(LCI.LEAS_FORM,'租息',LCCT.START_DATE),2)) AS MONEYTAX,DATE_FORMAT(NOW(), '%Y/%m/%d') AS ACCOUNT_DATE,DATE_FORMAT(LE.FACT_DATE, '%Y/%m/%d') AS FACT_DATE,LCCT.CONTRACT_ID,LCI.CONTRACT_NUMBER,LCI.PROJECT_NAME,LCI.LEAS_FORM,DI.DISTRIBUTOR_CODING DISTRIBUTOR_ID,DI.DISTRIBUTOR_NAME,DI.F_I_TYPE,CIF.CUSTOMER_NUM AS CUSTOMERID,CIF.CUSTOMERNAME,CIF.CUSTOMERTYPE,LPI.BUSINESSTYPE FROM LC_FUND_RENT_ADJUST_TEMP LCRAT LEFT JOIN LC_EBANK_TEMP LE ON LE.FLOWUNID=LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,LRPT.FLOWUNID FROM LC_RENT_PLAN_TEMP LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LRPT.FLOWUNID = LCRAT.FLOWUNID AND LRPT.PAYMENT_NUMBER = LCRAT.PAYMENT_NUMBER GROUP BY LRPT.FLOWUNID,LRPT.CONTRACT_ID) LRP ON LRP.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,SUM(LRPT.INTEREST) AS INTEREST FROM LC_RENT_PLAN LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LCRAT.PAYMENT_NUMBER = LRPT.PAYMENT_NUMBER WHERE DATE_FORMAT(LRPT.PLAN_DATE, '%Y/%m/%d') >= DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') GROUP BY LRPT.CONTRACT_ID) LRPT ON LRPT.CONTRACT_ID = LRP.CONTRACT_ID LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LRPT.CONTRACT_ID LEFT JOIN LC_CALC_CONDITION LCCT ON LCCT.CONTRACT_ID = LCI.ID LEFT JOIN DISTRIBUTOR_INFO DI ON DI.DISTRIBUTOR_NO = LCI.DISTRIBUTOR_ID LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CONTRACT_ID = LCI.ID LEFT JOIN CUSTOMER_INFO CIF ON CIF.CUSTOMERID = LUL.CUSTOMER_ID LEFT JOIN LB_PROJECT_INFO LPI ON LPI.ID = LUL.PROJECT_ID WHERE LPI.BUSINESSTYPE = '1' AND lul.IS_MAIN = 'Y' AND IFNULL(LRPT.INTEREST, 0)>0 AND LCRAT.FLOWUNID = :FLOWUNID "; + sql="SELECT IFNULL(LRPT.INTEREST, 0) AS MONEY,ROUND(IFNULL(LRPT.INTEREST, 0) / getTax (LCI.LEAS_FORM,'租息',LCCT.START_DATE),2) AS MONEYNOTAX,(IFNULL(LRPT.INTEREST, 0) - ROUND(IFNULL(LRPT.INTEREST, 0) / getTax (LCI.LEAS_FORM,'租息',LCCT.START_DATE),2)) AS MONEYTAX,DATE_FORMAT(NOW(), '%Y/%m/%d') AS ACCOUNT_DATE,DATE_FORMAT(LE.FACT_DATE, '%Y/%m/%d') AS FACT_DATE,LCCT.CONTRACT_ID,LCI.CONTRACT_NUMBER,LCI.PROJECT_NAME,LCI.LEAS_FORM,DI.DISTRIBUTOR_CODING DISTRIBUTOR_ID,DI.DISTRIBUTOR_NAME,DI.F_I_TYPE,CIF.CUSTOMER_NUM AS CUSTOMERID,CIF.CUSTOMERNAME,CIF.CUSTOMERTYPE,LPI.BUSINESSTYPE FROM LC_FUND_RENT_ADJUST_TEMP LCRAT LEFT JOIN (SELECT FLOWUNID,MAX(FACT_DATE) AS FACT_DATE FROM LC_EBANK_TEMP GROUP BY FLOWUNID) LE ON LE.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,LRPT.FLOWUNID FROM LC_RENT_PLAN_TEMP LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LRPT.FLOWUNID = LCRAT.FLOWUNID AND LRPT.PAYMENT_NUMBER = LCRAT.PAYMENT_NUMBER GROUP BY LRPT.FLOWUNID,LRPT.CONTRACT_ID) LRP ON LRP.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,SUM(LRPT.INTEREST) AS INTEREST FROM LC_RENT_PLAN LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LCRAT.PAYMENT_NUMBER = LRPT.PAYMENT_NUMBER WHERE DATE_FORMAT(LRPT.PLAN_DATE, '%Y/%m/%d') >= DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') GROUP BY LRPT.CONTRACT_ID) LRPT ON LRPT.CONTRACT_ID = LRP.CONTRACT_ID LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LRPT.CONTRACT_ID LEFT JOIN LC_CALC_CONDITION LCCT ON LCCT.CONTRACT_ID = LCI.ID LEFT JOIN DISTRIBUTOR_INFO DI ON DI.DISTRIBUTOR_NO = LCI.DISTRIBUTOR_ID LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CONTRACT_ID = LCI.ID LEFT JOIN CUSTOMER_INFO CIF ON CIF.CUSTOMERID = LUL.CUSTOMER_ID LEFT JOIN LB_PROJECT_INFO LPI ON LPI.ID = LUL.PROJECT_ID WHERE LPI.BUSINESSTYPE = '1' AND lul.IS_MAIN = 'Y' AND IFNULL(LRPT.INTEREST, 0) > 0 AND LCRAT.FLOWUNID = :FLOWUNID"; // 收到的逾期租金 }else if("PZ2018081700000127".equals(VOUCHERNO)) { - //sql="SELECT IFNULL(LRPT.RENT, 0)-IFNULL(LRI.RENT,0) AS MONEY,IFNULL(LRPT.CORPUS, 0)-IFNULL(LRI.CORPUS,0) AS MONEYNOTAX,IFNULL(LRPT.INTEREST, 0)-IFNULL(LRI.INTEREST,0) AS MONEYTAX,DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') AS ACCOUNT_DATE,DATE_FORMAT(LCRAT.PAYDAY_ADJUST, '%Y/%m/%d') AS FACT_DATE,LCCT.CONTRACT_ID,LCI.CONTRACT_NUMBER,LCI.PROJECT_NAME,LCI.LEAS_FORM,DI.DISTRIBUTOR_CODING DISTRIBUTOR_ID,DI.DISTRIBUTOR_NAME,DI.F_I_TYPE,CIF.CUSTOMER_NUM AS CUSTOMERID,CIF.CUSTOMERNAME,CIF.CUSTOMERTYPE,LPI.BUSINESSTYPE FROM LC_FUND_RENT_ADJUST_TEMP LCRAT LEFT JOIN (SELECT LRPT.CONTRACT_ID,LRPT.FLOWUNID FROM LC_RENT_PLAN_TEMP LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LRPT.FLOWUNID = LCRAT.FLOWUNID AND LRPT.PAYMENT_NUMBER = LCRAT.PAYMENT_NUMBER GROUP BY LRPT.FLOWUNID,LRPT.CONTRACT_ID) LRP ON LRP.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.FLOWUNID,LRPT.CONTRACT_ID,SUM(LRPT.RENT) RENT,SUM(LRPT.CORPUS) CORPUS,SUM(LRPT.INTEREST) AS INTEREST FROM LC_RENT_PLAN LRPT LEFT JOIN LC_FUND_RENT_ADJUST_TEMP LCRAT ON LCRAT.PAYMENT_NUMBER = LRPT.PAYMENT_NUMBER WHERE DATE_FORMAT(LRPT.PLAN_DATE,'%Y/%m/%d') 0 AND LCRAT.FLOWUNID = :FLOWUNID "; + sql="SELECT ROUND((getTax(lci.LEAS_FORM,'"+taxType+"',LCCT.START_DATE) - 1) * 100,0) AS TAX_NUM,"+date1+" AS MONEY,ROUND("+date1+" / getTax(LCI.LEAS_FORM,'"+taxType+"',LCCT.START_DATE),2) AS MONEYNOTAX,("+date1+" - ROUND("+date1+" / getTax(LCI.LEAS_FORM,'"+taxType+"',LCCT.START_DATE),2)) AS MONEYTAX,DATE_FORMAT(NOW(), '%Y/%m/%d') AS ACCOUNT_DATE,DATE_FORMAT(LE.FACT_DATE, '%Y/%m/%d') AS FACT_DATE,LCCT.CONTRACT_ID,LCI.CONTRACT_NUMBER,LCI.PROJECT_NAME,LCI.LEAS_FORM,DI.DISTRIBUTOR_CODING DISTRIBUTOR_ID,DI.DISTRIBUTOR_NAME,DI.F_I_TYPE,CIF.CUSTOMER_NUM AS CUSTOMERID,CIF.CUSTOMERNAME,CIF.CUSTOMERTYPE,LPI.BUSINESSTYPE FROM LC_FUND_RENT_ADJUST_TEMP LCRAT LEFT JOIN (SELECT FLOWUNID,MAX(FACT_DATE) AS FACT_DATE FROM LC_EBANK_TEMP GROUP BY FLOWUNID) LE ON LE.FLOWUNID=LCRAT.FLOWUNID LEFT JOIN (SELECT LRPT.CONTRACT_ID,LRPT.FLOWUNID FROM LC_RENT_PLAN_TEMP LRPT GROUP BY LRPT.FLOWUNID,LRPT.CONTRACT_ID) LRPT ON LRPT.FLOWUNID = LCRAT.FLOWUNID LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LRPT.CONTRACT_ID LEFT JOIN LC_CALC_CONDITION LCCT ON LCCT.CONTRACT_ID = LCI.ID LEFT JOIN DISTRIBUTOR_INFO DI ON DI.DISTRIBUTOR_NO = LCI.DISTRIBUTOR_ID LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CONTRACT_ID = LCI.ID LEFT JOIN CUSTOMER_INFO CIF ON CIF.CUSTOMERID = LUL.CUSTOMER_ID LEFT JOIN LB_PROJECT_INFO LPI ON LPI.ID = LUL.PROJECT_ID WHERE LPI.BUSINESSTYPE = '1' AND lul.IS_MAIN = 'Y' AND "+date1+">0 AND LCRAT.FLOWUNID = :FLOWUNID "; } // 执行SQL, 获取结果集 diff --git a/src_tenwa/com/tenwa/httpclient/resources/WechatPropertiesUtil.java b/src_tenwa/com/tenwa/httpclient/resources/WechatPropertiesUtil.java new file mode 100644 index 000000000..352878476 --- /dev/null +++ b/src_tenwa/com/tenwa/httpclient/resources/WechatPropertiesUtil.java @@ -0,0 +1,49 @@ +package com.tenwa.httpclient.resources; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +/** + * 1: 微信推送消息配置 + */ +public class WechatPropertiesUtil { + private static String CONFIG_FILE_NAME = "/Wechat.properties"; + private static final Map configMap = new HashMap(); + public static String getConfigValue(String propertyName) { + if (0 == configMap.size()) { + FileInputStream fis = null; + try { + fis = new FileInputStream(URLDecoder.decode(Thread.currentThread().getContextClassLoader().getResource(CONFIG_FILE_NAME).getFile(),"UTF-8")); + Properties pro = new Properties(); + pro.load(fis); + for (Object key : pro.keySet()) { + String valString = pro.get(key).toString().trim(); + String keyString = key.toString(); + configMap.put(keyString, valString); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (null != fis) { + fis.close(); + fis = null; + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return configMap.get(propertyName); + } + public static void main(String[] args) { + System.out.println(WechatPropertiesUtil.getConfigValue("WechatMenuURL")); + } +} diff --git a/src_tenwa/com/tenwa/lease/app/quartzmession/WechatMessagePush.java b/src_tenwa/com/tenwa/lease/app/quartzmession/WechatMessagePush.java new file mode 100644 index 000000000..377399bf8 --- /dev/null +++ b/src_tenwa/com/tenwa/lease/app/quartzmession/WechatMessagePush.java @@ -0,0 +1,298 @@ +package com.tenwa.lease.app.quartzmession; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import com.alibaba.fastjson.JSONObject; +import com.amarsoft.are.jbo.JBOException; +import com.amarsoft.awe.dw.ui.page.body.imp.Integer; +import com.amarsoft.awe.util.ASResultSet; +import com.amarsoft.awe.util.SqlObject; +import com.amarsoft.awe.util.Transaction; +import com.amarsoft.dict.als.cache.CacheLoaderFactory; +import com.tenwa.httpclient.resources.WechatPropertiesUtil; +import com.tenwa.util.SerialNumberUtil; + + +/** + * 1:微信公众号信息推送 + * @author xiezhiwen + */ +public class WechatMessagePush implements Job{ + private static final Logger logger = LogManager.getLogger(WechatMessagePush.class);// 引入logger日志 + + public void execute(JobExecutionContext arg0) throws JobExecutionException { + Transaction Sqlca=null; + try{ + Sqlca = Transaction.createTransaction(CacheLoaderFactory.getDataSource()); + // 执行还款消息推送 + String result1 = RefundRemindPush(Sqlca); + String result2 = OverdueRefundRemindPush(Sqlca); + Sqlca.commit(); + + logger.info("还款提醒发送状态<<<<<<<<<<<<<: "+result1); + logger.info("逾期还款提醒发送状态<<<<<<<<<<: "+result2); + }catch(Exception e){ + logger.info("<<<<<<<<<<<<<<<<<<<<<<微信推送定时任务执行异常>>>>>>>>>>>>>>>>>>>>>>>"); + logger.info("<<<<<<<<<<<<<<<<<<<<<<微信推送定时任务执行异常>>>>>>>>>>>>>>>>>>>>>>>"); + logger.info("<<<<<<<<<<<<<<<<<<<<<<微信推送定时任务执行异常>>>>>>>>>>>>>>>>>>>>>>>"); + try { + Sqlca.rollback(); + } catch (JBOException e1) { + e1.printStackTrace(); + } + e.printStackTrace(); + }finally { + if(Sqlca!=null) { + try { + Sqlca.commit(); + Sqlca.disConnect(); + } catch (JBOException e) { + e.printStackTrace(); + } + } + } + } + + + /** + * 1: 还款提醒发送 + * @return + * @throws Exception + */ + public String RefundRemindPush(Transaction Sqlca) throws Exception { + // 定义全局对象 + String contract_number=null;// 合同名称 + String customer_num=null; // 客户编码 + String cust_name=null; // 客户名称 + String plan_list=null; // 客户名称 + String mobile=null; // 手机号 + String contract_id=null; // 合同id + String customer_id=null; // 客户id + String openid=null; // 微信标识 + String link=null; // 详情链接 + String type="1"; // 类型 + String keyword1=null;// 还款日期 + String keyword2=null;// 还款期次 + String keyword3=null;// 还款金额 + String uuid=null; // 记录表id + String first="尊敬的用户您好,您的本期还款信息如下:";// 内容头 + String remark="祝您工作顺利。"; // 备注 + String updSql=""; + String insertSql=""; + String msgid =null; + String result="推送成功"; + String batch=SerialNumberUtil.getWechatBatchNumber(Sqlca); + int con=0; + + // 查询所有需要发送还款提醒的数据 + String selSql="SELECT CI.CUSTOMERNAME AS CUST_NAME,WUI.MOBILE_,WUI.CERTID_,LCI.CONTRACT_NUMBER,CI.CUSTOMER_NUM,LRP.PLAN_LIST,LCI.ID AS CONTRACT_ID,CI.CUSTOMERID,WUI.OPENID,CONCAT('/wechat/menu?type=payments&id=',LCI.CONTRACT_NUMBER) AS LINK,CONCAT(CONVERT(YEAR(LRP.PLAN_DATE), CHAR),'年',CONVERT(MONTH(LRP.PLAN_DATE), CHAR),'月',CONVERT(DAY(LRP.PLAN_DATE), CHAR),'日') AS KEYWORD1,CONCAT('第',LRP.PLAN_LIST,'期') KEYWORD2,CONCAT(LRP.RENT,'元') KEYWORD3 FROM WECHAT_USER_INFO WUI LEFT JOIN CUSTOMER_INFO CI ON CI.CERTID = WUI.CERTID_ LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CUSTOMER_ID = CI.CUSTOMERID AND LUL.IS_MAIN = 'Y' LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LUL.CONTRACT_ID AND LCI.CONTRACT_STATUS = '31' LEFT JOIN LC_RENT_PLAN LRP ON LRP.CONTRACT_ID = LCI.ID WHERE WUI.BINDING_STATUS='Y' AND TIMESTAMPDIFF(DAY,DATE_FORMAT(NOW(), '%Y-%m-%d'),DATE_FORMAT(LRP.PLAN_DATE, '%Y-%m-%d')) = 3 AND NOT EXISTS (SELECT 1 FROM WECHAT_MESSAGE_RECORD WHERE OPENID = WUI.OPENID AND SEND_TYPE='1' AND CONTRACT_NUMBER=LCI.CONTRACT_NUMBER AND PLAN_LIST=LRP.PLAN_LIST AND SEND_STATUS = 'Y') LIMIT 0,50000 "; + ASResultSet rs = Sqlca.getASResultSet(new SqlObject(selSql)); + // 循环, 逐条发送---如果数据量过大, 超出微信限制, 用此优化 + //new Thread(new Runnable() { + // public void run() { + // try { + // Thread.sleep(500); + // } catch (Exception e) { + // e.printStackTrace(); + // } + // } + //}).start(); + + while(rs.next()) { + // 获取接口推送所需数据 + con++; + uuid = UUID.randomUUID().toString().replace("-", ""); + openid=rs.getString("openid"); + link=rs.getString("link"); + keyword1=rs.getString("keyword1"); + keyword2=rs.getString("keyword2"); + keyword3=rs.getString("keyword3"); + contract_number=rs.getString("contract_number"); + customer_num=rs.getString("customer_num"); + cust_name=rs.getString("cust_name"); + mobile=rs.getString("mobile_"); + plan_list=rs.getString("plan_list"); + contract_id=rs.getString("contract_id"); + customer_id=rs.getString("customerid"); + + // 查寻当条是否是历史失败的 + selSql="SELECT openid FROM wechat_message_record WHERE OPENID='"+openid+"' AND CONTRACT_NUMBER='"+contract_number+"' AND PLAN_LIST='"+plan_list+"' AND SEND_TYPE='1'"; + ASResultSet rs1 = Sqlca.getASResultSet(new SqlObject(selSql)); + + if(!rs1.next()) { + insertSql="INSERT INTO WECHAT_MESSAGE_RECORD(ID,BATCH,OPENID,CONTRACT_NUMBER,CUSTOMER_NUM,CUST_NAME,PLAN_LIST,MODILE,SEND_DATE,SEND_TYPE,SEND_CONTENT,SEND_STATUS,CONTRACT_ID,CUSTOMER_ID) VALUES('"+uuid+"',CONCAT('"+batch+"','-','"+con+"'),'"+openid+"','"+contract_number+"','"+customer_num+"','"+cust_name+"','"+plan_list+"','"+mobile+"',DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'),'1',CONCAT('"+first+"','还款日期: ','"+keyword1+"',',还款期数: ','"+keyword2+"',',还款金额: ','"+keyword3+"',', ','"+remark+"'),'N','"+contract_id+"','"+customer_id+"')"; + Sqlca.executeSQL(new SqlObject(insertSql)); + } + try { + msgid = WechatMessagePush.WechatPush(openid,link,type,first,keyword1,keyword2,keyword3,remark); + System.out.println(con); + } catch (Exception e) { + result="推送失败"; + e.printStackTrace(); + } + // 成功改状态, 失败改时间 + if(msgid!=null) { + updSql="UPDATE wechat_message_record SET MSGID='"+msgid+"',SEND_DATE=DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'),SEND_STATUS='Y' WHERE OPENID='"+openid+"' AND CONTRACT_NUMBER='"+contract_number+"' AND PLAN_LIST='"+plan_list+"' AND SEND_TYPE='1'"; + Sqlca.executeSQL(new SqlObject(updSql)); + }else { + result="推送失败"; + updSql="UPDATE wechat_message_record SET SEND_DATE=DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'),SEND_STATUS='N' WHERE OPENID='"+openid+"' AND CONTRACT_NUMBER='"+contract_number+"' AND PLAN_LIST='"+plan_list+"' AND SEND_TYPE='1'"; + Sqlca.executeSQL(new SqlObject(updSql)); + } + } + return result+String.valueOf(con); + } + + /** + * 2: 逾期 还款提醒发送 + * @return + * @throws Exception + */ + public String OverdueRefundRemindPush(Transaction Sqlca) throws Exception { + // 定义全局对象 + String contract_number=null;// 合同名称 + String customer_num=null; // 客户编码 + String cust_name=null; // 客户名称 + String plan_list=null; // 客户名称 + String mobile=null; // 手机号 + String contract_id=null; // 合同id + String customer_id=null; // 客户id + String openid=null; // 微信标识 + String link=null; // 详情链接 + String type="1"; // 类型 + String keyword1=null; // 还款日期 + String keyword2=null; // 应还金额 + String keyword3=null; // 逾期金额 + String keyword4=null; // 罚息金额 + String uuid=null; // 记录表id + String first="亲爱的用户您好,您本期应还金额尚未归还,以下是您的账单信息:"; // 内容头 + String remark="XX提醒您,逾期会产生逾期费用,请尽快还款,如需帮助请您致电客服123456."; // 备注 + String updSql=""; + String insertSql=""; + String msgid =null; + String result="推送成功"; + String batch=SerialNumberUtil.getWechatBatchNumber(Sqlca); + int con=0; + + // 查询所有需要发送还款提醒的数据 + String selSql="SELECT CI.CUSTOMERNAME AS CUST_NAME,WUI.MOBILE_,WUI.CERTID_,LCI.CONTRACT_NUMBER,CI.CUSTOMER_NUM,LRP.PLAN_LIST,LCI.ID AS CONTRACT_ID,CI.CUSTOMERID,WUI.OPENID,CONCAT('/wechat/menu?type=payments&id=',LCI.CONTRACT_NUMBER) AS LINK,CONCAT(CONVERT(YEAR(LRP.PLAN_DATE), CHAR),'年',CONVERT(MONTH(LRP.PLAN_DATE), CHAR),'月',CONVERT(DAY(LRP.PLAN_DATE), CHAR),'日') AS KEYWORD1,CONCAT(ROUND((LRP.RENT + IFNULL(getRentPenalty (LRP.PAYMENT_NUMBER,LRP.PLAN_LIST,DATE_FORMAT(NOW(), '%y/%m/%d')),0) - IFNULL(LRI.RENT, 0) - IFNULL(LRI.PENALTY, 0)),2),'元') AS KEYWORD2,CONCAT((LRP.RENT-IFNULL(LRI.RENT,0)), '元') AS KEYWORD3,CONCAT(ROUND(IFNULL(getRentPenalty (LRP.PAYMENT_NUMBER,LRP.PLAN_LIST,DATE_FORMAT(NOW(), '%y/%m/%d')),0),2),'元') AS KEYWORD4 FROM WECHAT_USER_INFO WUI LEFT JOIN CUSTOMER_INFO CI ON CI.CERTID = WUI.CERTID_ LEFT JOIN LB_UNION_LESSEE LUL ON LUL.CUSTOMER_ID = CI.CUSTOMERID AND LUL.IS_MAIN = 'Y' LEFT JOIN LB_CONTRACT_INFO LCI ON LCI.ID = LUL.CONTRACT_ID AND LCI.CONTRACT_STATUS = '31' LEFT JOIN (SELECT CONTRACT_ID,PLAN_LIST,MAX(PLAN_DATE) AS PLAN_DATE,MAX(PAYMENT_NUMBER) AS PAYMENT_NUMBER,SUM(RENT) AS RENT,SUM(IFNULL(PENALTY,0)) AS PENALTY FROM LC_RENT_PLAN WHERE TIMESTAMPDIFF(DAY,DATE_FORMAT(PLAN_DATE, '%Y-%m-%d'),DATE_FORMAT(NOW(), '%Y-%m-%d')) >= 3 GROUP BY CONTRACT_ID,PLAN_LIST)LRP ON LRP.CONTRACT_ID=LCI.ID LEFT JOIN (SELECT CONTRACT_ID,PLAN_LIST,SUM(RENT) AS RENT,SUM(IFNULL(PENALTY,0)) AS PENALTY FROM LC_RENT_INCOME GROUP BY CONTRACT_ID,PLAN_LIST)LRI ON LRI.CONTRACT_ID=LRP.CONTRACT_ID AND LRI.PLAN_LIST=LRP.PLAN_LIST WHERE WUI.BINDING_STATUS='Y' AND (IFNULL(LRP.RENT,0)+IFNULL(LRP.PENALTY,0)-IFNULL(LRI.RENT,0)-IFNULL(LRI.PENALTY,0))<>0 AND NOT EXISTS (SELECT 1 FROM WECHAT_MESSAGE_RECORD WHERE OPENID = WUI.OPENID AND SEND_TYPE='2' AND CONTRACT_NUMBER = LCI.CONTRACT_NUMBER AND PLAN_LIST = LRP.PLAN_LIST AND SEND_STATUS = 'Y') LIMIT 0,50000 "; + ASResultSet rs = Sqlca.getASResultSet(new SqlObject(selSql)); + // 循环, 逐条发送 + while(rs.next()) { + con++; + // 获取接口推送所需数据 + uuid = UUID.randomUUID().toString().replace("-", ""); + openid=rs.getString("openid"); + link=rs.getString("link"); + keyword1=rs.getString("keyword1"); + keyword2=rs.getString("keyword2"); + keyword3=rs.getString("keyword3"); + keyword4=rs.getString("keyword4"); + contract_number=rs.getString("contract_number"); + customer_num=rs.getString("customer_num"); + cust_name=rs.getString("cust_name"); + mobile=rs.getString("mobile_"); + plan_list=rs.getString("plan_list"); + contract_id=rs.getString("contract_id"); + customer_id=rs.getString("customerid"); + + // 查寻当条是否是历史失败的 + selSql="SELECT openid FROM wechat_message_record WHERE OPENID='"+openid+"' AND CONTRACT_NUMBER='"+contract_number+"' AND PLAN_LIST='"+plan_list+"' AND SEND_TYPE='1'"; + ASResultSet rs1 = Sqlca.getASResultSet(new SqlObject(selSql)); + + if(!rs1.next()) { + insertSql="INSERT INTO WECHAT_MESSAGE_RECORD(ID,BATCH,OPENID,CONTRACT_NUMBER,CUSTOMER_NUM,CUST_NAME,PLAN_LIST,MODILE,SEND_DATE,SEND_TYPE,SEND_CONTENT,SEND_STATUS,CONTRACT_ID,CUSTOMER_ID) VALUES('"+uuid+"',CONCAT('"+batch+"','-','"+con+"'),'"+openid+"','"+contract_number+"','"+customer_num+"','"+cust_name+"','"+plan_list+"','"+mobile+"',DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'),'2',CONCAT('"+first+"','还款日期: ','"+keyword1+"',',还款金额: ','"+keyword2+"',',逾期金额: ','"+keyword3+"',',罚息金额: ','"+keyword4+"',',','"+remark+"'),'N','"+contract_id+"','"+customer_id+"')"; + Sqlca.executeSQL(new SqlObject(insertSql)); + } + try { + msgid = WechatMessagePush.WechatPush(openid,link,type,first,keyword1,keyword2,keyword3,remark); + System.out.println(con); + } catch (Exception e) { + result="推送失败"; + e.printStackTrace(); + } + // 成功改状态, 失败改时间 + if(msgid!=null) { + updSql="UPDATE wechat_message_record SET MSGID='"+msgid+"',SEND_DATE=DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'),SEND_STATUS='Y' WHERE OPENID='"+openid+"' AND CONTRACT_NUMBER='"+contract_number+"' AND PLAN_LIST='"+plan_list+"' AND SEND_TYPE='2'"; + Sqlca.executeSQL(new SqlObject(updSql)); + }else { + result="推送失败"; + updSql="UPDATE wechat_message_record SET SEND_DATE=DATE_FORMAT(NOW(),'%Y/%m/%d %H:%i:%s'),SEND_STATUS='N' WHERE OPENID='"+openid+"' AND CONTRACT_NUMBER='"+contract_number+"' AND PLAN_LIST='"+plan_list+"' AND SEND_TYPE='2'"; + Sqlca.executeSQL(new SqlObject(updSql)); + } + } + return result+String.valueOf(con); + } + + /** + * 3: 调用消息推送接口 + */ + public synchronized static String WechatPush(String openid,String link,String type,String first,String keyword1,String keyword2,String keyword3,String remark) throws Exception { + String strURL = WechatPropertiesUtil.getConfigValue("WechatURL"); + URL url = new URL(strURL); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + httpConn.setDoOutput(true); + httpConn.setDoInput(true); + httpConn.setRequestProperty("Content-Type", "application/json"); + httpConn.setRequestMethod("POST"); + httpConn.connect(); + OutputStreamWriter out = new OutputStreamWriter(httpConn.getOutputStream(), "UTF-8"); + + // 发送请求参数 + JSONObject json = new JSONObject(); + json.put("openid", openid);// 微信的uuid + json.put("type", type);// 推送类型 + json.put("link", link);// 推送详情的连接,绑定成功的推送参数为空 + JSONObject data = new JSONObject(); + data.put("first", first);// 推送的头部 + data.put("keyword1", keyword1);// 关键字1 + data.put("keyword2", keyword2);// 关键字2 + data.put("remark", remark);// 备注 + json.put("data", data); + + out.write(json.toString()); + out.flush(); + out.close(); + + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); + } catch (Exception e) { + e.printStackTrace(); + logger.info("<<<<<<<<<<<<<<<获取回执信息失败>>>>>>>>>>>>>>>>>>>"); + logger.info("<<<<<<<<<<<<<<<获取回执信息失败>>>>>>>>>>>>>>>>>>>"); + logger.info("<<<<<<<<<<<<<<<获取回执信息失败>>>>>>>>>>>>>>>>>>>"); + throw new Exception("推送失败!"); + } + String line; + StringBuffer buffer = new StringBuffer(); + while ((line = reader.readLine()) != null) { + buffer.append(line); + } + reader.close(); + httpConn.disconnect(); + + logger.info("微信接口返回信息" + buffer.toString()); + JSONObject resultjson = JSONObject.parseObject(buffer.toString()); + String msgid = null; + if (resultjson.get("errcode").toString().equals("0")) {// 推送成功 + msgid = resultjson.get("msgid").toString(); + } else {// 推送失败 + throw new Exception("推送失败"); + } + return msgid; + } +}