Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

yanliming 5 gadi atpakaļ
vecāks
revīzija
c3d2fb5f84
36 mainītis faili ar 1109 papildinājumiem un 175 dzēšanām
  1. 7 4
      picc-admin-server/pom.xml
  2. 2 1
      picc-admin-server/src/main/java/com/jpsoft/picc/modules/base/controller/InsuranceJobsController.java
  3. 16 28
      picc-admin-server/src/main/resources/application-production.yml
  4. 5 2
      picc-admin-server/src/main/resources/logback-spring.xml
  5. 80 6
      picc-common/pom.xml
  6. 0 3
      picc-common/src/main/java/com/jpsoft/picc/modules/base/entity/InsuranceAgent.java
  7. 32 0
      picc-common/src/main/java/com/jpsoft/picc/modules/common/utils/SignUtil.java
  8. 10 6
      picc-enterprise-server/pom.xml
  9. 19 0
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/CompanyController.java
  10. 9 2
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/CompanyMemberController.java
  11. 31 5
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsuranceApplicationController.java
  12. 18 3
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsurancePolicyController.java
  13. 14 13
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pub/controller/PayController.java
  14. 53 0
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pub/controller/UserController.java
  15. 4 4
      picc-enterprise-server/src/main/resources/application-dev.yml
  16. 48 0
      picc-enterprise-server/src/main/resources/application-production.yml
  17. 15 2
      picc-enterprise-server/src/main/resources/logback-spring.xml
  18. 0 69
      pom.xml
  19. 35 4
      weixin-middleware/pom.xml
  20. 6 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/WeixinMiddlewareApplication.java
  21. 10 7
      weixin-middleware/src/main/java/com/jpsoft/weixin/callback/EventCallback.java
  22. 138 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/controller/ReplyMessageController.java
  23. 25 6
      weixin-middleware/src/main/java/com/jpsoft/weixin/controller/WeixinController.java
  24. 20 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/dao/ReplyMessageDAO.java
  25. 50 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/dto/MessageResult.java
  26. 32 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/dto/Sort.java
  27. 97 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/entity/ReplyMessage.java
  28. 19 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/service/ReplyMessageService.java
  29. 76 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/service/impl/ReplyMessageServiceImpl.java
  30. 73 0
      weixin-middleware/src/main/java/com/jpsoft/weixin/utils/PojoUtil.java
  31. 1 1
      weixin-middleware/src/main/java/com/jpsoft/weixin/utils/WeixinUtil.java
  32. 4 0
      weixin-middleware/src/main/resources/application-dev.yml
  33. 13 7
      weixin-middleware/src/main/resources/application-production.yml
  34. 5 1
      weixin-middleware/src/main/resources/application-test.yml
  35. 64 1
      weixin-middleware/src/main/resources/application.yml
  36. 78 0
      weixin-middleware/src/main/resources/mapper/ReplyMessage.xml

+ 7 - 4
picc-admin-server/pom.xml

@@ -165,8 +165,9 @@
             <id>test</id>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
                     <scope>provided</scope>
                 </dependency>
             </dependencies>
@@ -181,8 +182,10 @@
             </properties>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
+                    <scope>provided</scope>
                 </dependency>
             </dependencies>
         </profile>

+ 2 - 1
picc-admin-server/src/main/java/com/jpsoft/picc/modules/base/controller/InsuranceJobsController.java

@@ -213,7 +213,8 @@ public class InsuranceJobsController {
         Map<String,Object> searchParams = new HashMap<>();
 
         List<Sort> sortList = new ArrayList<>();
-        sortList.add(new Sort("id_","asc"));
+        sortList.add(new Sort("definition_id","asc"));
+        sortList.add(new Sort("create_time","asc"));
 
         if (StringUtils.isNotEmpty(jobsId)) {
             searchParams.put("jobsId",jobsId);

+ 16 - 28
picc-admin-server/src/main/resources/application-production.yml

@@ -1,50 +1,38 @@
 spring:
   datasource:
-    url: jdbc:log4jdbc:mysql://10.10.0.2:3306/electricity-payment?autoReconnect=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    url: jdbc:log4jdbc:mysql://hbjpsoft.mysql.rds.aliyuncs.com:3306/picc?autoReconnect=true&characterEncoding=utf8&serverTimezone=GMT%2B8
     username: picc
-    password: picc
+    password: picc@8121234
   devtools:
     restart:
       enabled: true
   redis:
     # Redis数据库索引(默认为0)
-    database: 5
+    database: 3
     # Redis服务器地址
     host: 127.0.0.1
     # Redis服务器连接端口
     port: 6379
+    # 密码
+    password: jp123456
 
 logger:
   level: WARN
-  dir: E:\\picc\\logs
-
-netty:
-  port: 9966    #监听端口
+  dir: /opt/picc/logs/picc-admin-server
 
 springfox:
   documentation:
     swagger:
       v2:
-        host: www.wzgh.org
+        host: picc.jzrccs.com
 
-wx:
-  pay:
-    appId: wxe598c699aa68cffe
-    appSecret: ea20d2e9a36aace26b4f7654218129af
-    mchId: 1500160622
-    subMchId: 1505070291
-    mchKey: jpsoft11111111111111111111111111
-    notifyUrl: http://www.wzgh.org/picc-server/wxPay/payNotify
-    ip: 122.228.31.242
+pdf:
+  logoUrl: /opt/picc/images/logo.png
+  outputPath: /opt/picc/files
 
-alipay:
-  serviceUrl: https://openapi.alipaydev.com/gateway.do
-  appId: 2016080600180410
-  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzMBfmTqqpt4dMcuz8DpyrEtruu/G7+Gvkd0j99QX4mzcRLx4Wg9IicOIiZGSdgzLMKIxBmk0eKiqqbuBjOsrS/XU+SvsTNlT1O/ZY0w30HEWrb/pvmo58HSY76cevWqLqW19+fUax7HG811mF4lq4YkHNAWArqByEjoFYbKHbtqS0ReXFJ9SE5TaqZSVOieiu3bYPkw5HEGmnYZMhWH3Gvt6tK2peLSM8mEMY5qp3zlGew3sq1KtcDkvO2UCuAmEkAnCDZ1zoYYt45cvcmwaHozGKHGOtOe0EAitpZyLZW3dP5/yBFfWk+MdaA1kZe5gNr8ePY5ht+Sd+DizMEINiQIDAQAB
-  privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMwF+ZOqqm3h0xy7PwOnKsS2u678bv4a+R3SP31BfibNxEvHhaD0iJw4iJkZJ2DMswojEGaTR4qKqpu4GM6ytL9dT5K+xM2VPU79ljTDfQcRatv+m+ajnwdJjvpx69aoupbX359RrHscbzXWYXiWrhiQc0BYCuoHISOgVhsodu2pLRF5cUn1ITlNqplJU6J6K7dtg+TDkcQaadhkyFYfca+3q0ral4tIzyYQxjmqnfOUZ7DeyrUq1wOS87ZQK4CYSQCcINnXOhhi3jly9ybBoejMYocY6057QQCK2lnItlbd0/n/IEV9aT4x1oDWRl7mA2vx49jmG35J34OLMwQg2JAgMBAAECggEBALpSXSxdPKn4+ew0iJwVNAEh6PkF9ayZXWGJMY/2y31avt81+vdJbSMgcoFtnTAb2FN7ZM2Gsx8RrawjW3LXFmFbZeERXUlZg3YEhXhdBXWDU7XtLFIA7JSqJfn/xHNuH4Wgg8EQkLwkRP11gs/sVvzB63Ilh8Jhcyyu6/LJuYDfeXu/50sgkQn0xXjjJdwiez9iX//wraYYcWsSCCbwM3QZ0MRc3TCP04QfZsF+fnPM83/g2yzun8fmvB5zDtYhlHwau52CiZpTHOxCCkZx0tubVyPG9jmLJ8eg+/hIfOKzHi2HiNsOQlOgLj8inUkM2qW3JlU7VcHduB7MWjkDIAECgYEA6HLVEDDT61xQNIUbnBWQ0FpHBQjsG/388Uy/xKfchUkOfzA0kNId+Nrd3hhLtl3i7ta6KNu2vDNS5iEbg7SCVsgqBZ0enLLIrymyJ94pHbUeFTAqgP4pnoWglx3ttMsERCKcqt55NJY3gfLtVjBTgGgY1Kfxh9SYFC6CQ4v4V4kCgYEA4X8kv8vVg4ivoXk/gEsKXPYdXG6O3sClq7pf/kaecV0caV89rARXkDP324nLUMxvGKY0sNa373VhAFav4Hv3kGqrJ0NfEd/XiXXT3Zq3njN5V5xqjZZRsySimyFoBetYMTjN2dtPxTC/65OvQPC8BdHaSZDMQQQSFznKG9y4hgECgYEAieTFXIt6zB7BPcbQ8DEi7VcA1o3Kc3ii+wqKoMDr4u3J+c3BAUCEo0JDaCOFlrPvkbw0R1S//Ll9riNpzSHiSFUKCLaCmHa+8pqLo3b5cTQmmm8uZ8NfMTkYYU1R3HSrHThjNEIyKO4ME7zm6sBUaNJYGJ9gezG03hQRFr0MH/ECgYAKAXZD/Gtw9rO0WojyzGGdVl5fJ5i3UZ0ITbDMu510Mkl8c3ltFJQ+FdA9sZOP9kJHubhE0IJA4dh4B2CueVG22sTVbSvewyvxMYVBJAhZwLb1qD8iITVm2Y1NjOHswVCcfoTD0fNsMImTjm4MV6JAL9ubwA0QJXoYBbxuGBEoAQKBgDj0LpamjOv/gRDo96C8AKqACqWoHtVWvYaOrgsFVJWRsmkcrQu2nMHNyFlyJ1DcXbVkulILrUDth8+2jmbxrkmW+9Y8aX5vaKEmrNOOWiSgau3VxeJU+VedDYJl1IVpfs4k4ymMkkAGa1ZlMYHgeP20krHMzAn/NNeVvHUEXcR4
-  zfbPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlU5CIAwwMmDnDPUHQaxiqZh2y6VE11DFTYVZygLEUbZuSCATO2fGkY8hv3fhLj8Wj+QT4kRfJrK+/v1QKcZ7a5UaoaASOPOGEf8X9p+lfuA863luUPiD+k4W6QMjOXoPdY4G4JC9lFe5FT05NqVYHXGIIqXTWSIqLyWDlv7elj8D1HS06H+ArzAjbSyR47IaKJCMnpqLGHJ6ZQGM+6DEcOpdZAULjhguZ891eTtawVndDOaYToCDK4MpW9mEifpKRB8JZptqr2zQhFBm7iADyMsIM1xwko2N6mKJYyYZJ9QzhTindSQBGw0Pbt1480iqeoQOHo+z0HPmikIsuiu65QIDAQAB
-  inputCharset: UTF-8
-  mchId: 2088102170202580
-  # appAuthToken: 201906BBbc7d6558596f4bbc9f056c01b8aebX48
-  signType: RSA2
-  notifyUrl: http://www.wzgh.org/picc-server/aliPay/payNotify
+weixin:
+  appId: wxf6af207d9143d1de
+  appSecret: c86c042923e72c61c76a3a8658349312
+  tokenUrl: "http://picc.jzrccs.com/weixin-middleware/token"
+  createQrCodeUrl: "http://picc.jzrccs.com/weixin-middleware/qrcode/create"
+  sendTmplMsgUrl: "https://api.weixin.qq.com/cgi-bin/message/template/send"

+ 5 - 2
picc-admin-server/src/main/resources/logback-spring.xml

@@ -15,7 +15,7 @@
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${loggerPath}/logfile.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${loggerPath}/logfile.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${loggerPath}/common/logfile.%d{yyyy-MM-dd}.log</fileNamePattern>
             <MaxHistory>30</MaxHistory>
         </rollingPolicy>
         <encoder>
@@ -59,8 +59,11 @@
     </springProfile>
     <springProfile name="production">
         <root level="WARN">
-            <appender-ref ref="STDOUT" />
+<!--            <appender-ref ref="STDOUT" />-->
             <appender-ref ref="FILE" />
         </root>
+        <logger name="com.jpsoft.picc.advice.PermissionAdvice" additivity="false" level="WARN">
+            <appender-ref ref="ACCESS" />
+        </logger>
     </springProfile>
 </configuration>

+ 80 - 6
picc-common/pom.xml

@@ -8,23 +8,97 @@
         <version>1.0.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-
     <artifactId>picc-common</artifactId>
+    <properties>
+        <poi.version>4.1.0</poi.version>
+    </properties>
+
     <dependencies>
+        <!-- apache poi -->
         <dependency>
-            <groupId>com.github.pagehelper</groupId>
-            <artifactId>pagehelper-spring-boot-starter</artifactId>
-            <version>LATEST</version>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>${poi.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi.version}</version>
+            <scope>compile</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.tomcat.embed</groupId>
-            <artifactId>tomcat-embed-core</artifactId>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>${poi.version}</version>
+            <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>fr.opensagres.xdocreport</groupId>
+            <artifactId>xdocreport</artifactId>
+            <version>1.0.6</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>ooxml-schemas</artifactId>
+            <version>1.3</version>
+            <scope>compile</scope>
+        </dependency>
+        <!-- apache poi end -->
+
+        <!-- aliyun oss start -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <!-- aliyun oss end -->
+
+        <!-- 阿里大鱼短信jar包 start-->
+        <dependency>
+            <groupId>com.taobao</groupId>
+            <artifactId>taobao-sdk-java</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!-- 阿里大鱼短信jar包 end-->
+
+        <!--html转pdf start-->
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
+
         <!-- veloctiy -->
         <dependency>
             <groupId>org.apache.velocity</groupId>
             <artifactId>velocity</artifactId>
             <version>1.7</version>
         </dependency>
+        <!--service中用到-->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>LATEST</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.1.0</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>

+ 0 - 3
picc-common/src/main/java/com/jpsoft/picc/modules/base/entity/InsuranceAgent.java

@@ -6,9 +6,6 @@ import java.text.SimpleDateFormat;
 import java.math.BigDecimal;
 
 import com.jpsoft.picc.modules.sys.dao.DataDictionaryDAO;
-import com.jpsoft.picc.modules.sys.entity.DataDictionary;
-import com.jpsoft.picc.modules.sys.service.DataDictionaryService;
-import org.apache.ibatis.annotations.Select;
 import org.springframework.format.annotation.DateTimeFormat;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;

+ 32 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/common/utils/SignUtil.java

@@ -84,4 +84,36 @@ public class SignUtil {
             return false;
         }
     }
+
+    public static void main(String[] args){
+        HashMap<String,Object> signMap = new HashMap<String,Object>();
+
+        signMap.put("orderNo","20200305192042359");
+        signMap.put("payType","1");
+        signMap.put("code","008");
+        signMap.put("payTime","1583407242");
+        signMap.put("userMoney","1000");
+
+        String md5_sign = "";
+
+        SortedMap<String,Object> sortMap = new TreeMap<String,Object>(signMap);
+
+        String validate_sign = "";
+
+        for (Map.Entry<String, Object> entry : sortMap.entrySet()) {
+            validate_sign += entry.getKey() + "=" + entry.getValue() + "|";
+        }
+
+        validate_sign += "1234567890";
+
+        try {
+            md5_sign = MD5Util.getMD5(validate_sign.getBytes("utf-8"));
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        System.out.println(md5_sign);
+    }
+
 }

+ 10 - 6
picc-enterprise-server/pom.xml

@@ -172,8 +172,9 @@
             <id>remote</id>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
                     <scope>provided</scope>
                 </dependency>
             </dependencies>
@@ -185,8 +186,9 @@
             <id>test</id>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
                     <scope>provided</scope>
                 </dependency>
             </dependencies>
@@ -201,8 +203,10 @@
             </properties>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
+                    <scope>provided</scope>
                 </dependency>
             </dependencies>
         </profile>

+ 19 - 0
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/CompanyController.java

@@ -5,10 +5,12 @@ import com.jpsoft.picc.modules.base.entity.CompanyUser;
 import com.jpsoft.picc.modules.base.service.CompanyService;
 import com.jpsoft.picc.modules.base.service.CompanyUserService;
 import com.jpsoft.picc.modules.common.dto.MessageResult;
+import com.jpsoft.picc.modules.common.utils.DES3;
 import com.jpsoft.picc.modules.common.utils.PojoUtils;
 import com.jpsoft.picc.modules.pub.dto.CompanyInfoDTO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.jasig.cas.client.authentication.AttributePrincipal;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,6 +20,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
 import java.util.UUID;
 
+@Slf4j
 @CrossOrigin
 @Api(description="企业信息管理")
 @RestController
@@ -116,6 +119,20 @@ public class CompanyController {
             }
 
             CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
+
+            if(companyUser==null){
+                //可能直接通过cas统一登录页面登录,所以没有记录用户信息
+                companyUser = new CompanyUser();
+                companyUser.setId(UUID.randomUUID().toString());
+                companyUser.setUserName(principal.getName());
+                DES3 des3 = new DES3();
+                companyUser.setPassword(des3.encrypt(DES3.DEFAULT_KEY, "123456"));
+                companyUser.setDelFlag(false);
+                companyUser.setCreateTime(new Date());
+
+                companyUserService.insert(companyUser);
+            }
+
             companyUser.setCompanyId(company.getId());
             companyUser.setUpdateTime(new Date());
             companyUserService.update(companyUser);
@@ -123,6 +140,8 @@ public class CompanyController {
             messageResult.setResult(true);
         }
         catch (Exception ex){
+            log.error(ex.getMessage(),ex);
+
             messageResult.setResult(false);
             messageResult.setMessage(ex.getMessage());
         }

+ 9 - 2
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/CompanyMemberController.java

@@ -361,6 +361,7 @@ public class CompanyMemberController {
 
             int affectCount = 0;
             int existCount = 0;
+            List<String> existName = new ArrayList<>();
             for(Object[] array : list){
                 String name = array[1].toString();
                 String cardType = array[2].toString();
@@ -378,6 +379,7 @@ public class CompanyMemberController {
 
                 if(page.size() > 0) {
                     existCount++;
+                    existName.add(page.get(0).getName());
                 }else {
                     companyMember.setId(UUID.randomUUID().toString());
                     if (StringUtils.isNotEmpty(company.getId())) companyMember.setCompanyId(company.getId());
@@ -407,10 +409,15 @@ public class CompanyMemberController {
 
             if (affectCount > 0) {
                 msgResult.setResult(true);
-                msgResult.setData("有" + existCount + "条记录已存在,成功导入" + affectCount + "条记录。");
+                if(existCount > 0) {
+                    msgResult.setData("您有<" + existCount + ">条数据未导入成功,错误数据姓名为<" + String.join(",", existName) + ">,失败原因为<数据重复>。");
+                    msgResult.setMessage("您有<" + existCount + ">条数据未导入成功,错误数据姓名为<" + String.join(",", existName) + ">,失败原因为<数据重复>。");
+                }else{
+                    msgResult.setMessage("数据导入成功。");
+                }
             } else {
                 msgResult.setResult(false);
-                msgResult.setMessage("数据库添加失败");
+                msgResult.setMessage("数据导入失败。");
             }
         }
         catch(Exception ex){

+ 31 - 5
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsuranceApplicationController.java

@@ -104,12 +104,21 @@ public class InsuranceApplicationController {
             @RequestParam(value="pageSize",defaultValue="20") int pageSize,
             HttpServletRequest request){
         AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
-        CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
-        Company company = companyService.get(companyUser.getCompanyId());
 
         MessageResult<Map> msgResult = new MessageResult<>();
 
         try {
+            CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
+            Company company = null;
+
+            if (companyUser!=null && StringUtils.isNotEmpty(companyUser.getCompanyId())) {
+                company = companyService.get(companyUser.getCompanyId());
+            }
+
+            if (company==null){
+                throw new Exception("请先填写企业信息!");
+            }
+
             Map<String, Object> searchParams = new HashMap<>();
 
             List<Sort> sortList = new ArrayList<>();
@@ -580,14 +589,23 @@ public class InsuranceApplicationController {
             }
 
             AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
-            Company company = companyService.findByCreateBy(principal.getName());
+            CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
+            Company company = null;
+
+            if(companyUser!=null && StringUtils.isNotEmpty(companyUser.getCompanyId())) {
+                company = companyService.get(companyUser.getCompanyId());
+            }
 
             String serialNumber = (String)principal.getAttributes().get("serialNumber");
 
             TransactionRecord transactionRecord = new TransactionRecord();
             transactionRecord.setId(UUID.randomUUID().toString());
             transactionRecord.setApplicationId(applicationId);
-            transactionRecord.setCompanyId(company.getId());
+
+            if(company!=null) {
+                transactionRecord.setCompanyId(company.getId());
+            }
+
             transactionRecord.setAmount(insuranceApplication.getInsuranceFee());
             transactionRecord.setPaymentStatus("0");
             transactionRecord.setOrderNo(DateTime.now().toString("yyyyMMddHHmmssSSS"));
@@ -655,8 +673,13 @@ public class InsuranceApplicationController {
                                           @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime,
                                           HttpServletRequest request){
         AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
+
         CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
-        Company company = companyService.get(companyUser.getCompanyId());
+        Company company = null;
+
+        if(companyUser!=null && StringUtils.isNotEmpty(companyUser.getCompanyId())) {
+            company = companyService.get(companyUser.getCompanyId());
+        }
 
         MessageResult<Map> msgResult = new MessageResult<>();
         Map<String, Object> dataMap = new HashMap<>();
@@ -670,6 +693,9 @@ public class InsuranceApplicationController {
             if (company!=null && StringUtils.isNotEmpty(company.getId())) {
                 searchParams.put("companyId", company.getId());
             }
+            else{
+                searchParams.put("companyId", "");
+            }
 
             if (StringUtils.isNotEmpty(definitionId)) {
                 searchParams.put("definitionId", definitionId);

+ 18 - 3
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsurancePolicyController.java

@@ -256,7 +256,15 @@ public class InsurancePolicyController {
         try {
             AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
             CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
-            Company company = companyService.get(companyUser.getCompanyId());
+            Company company = null;
+
+            if (companyUser!=null && StringUtils.isNotEmpty(companyUser.getCompanyId())) {
+                company = companyService.get(companyUser.getCompanyId());
+            }
+
+            if (company==null){
+                throw new Exception("请先填写企业信息!");
+            }
 
             Map<String, Object> searchParams = new HashMap<>();
 
@@ -574,16 +582,23 @@ public class InsurancePolicyController {
         try {
             AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
             CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
-            Company company = companyService.get(companyUser.getCompanyId());
+            Company company = null;
+
+            if(companyUser!=null && StringUtils.isNotEmpty(companyUser.getCompanyId())) {
+                company = companyService.get(companyUser.getCompanyId());
+            }
 
             Map<String, Object> searchParams = new HashMap<>();
 
             List<Sort> sortList = new ArrayList<>();
             sortList.add(new Sort("create_time", "desc"));
 
-            if (StringUtils.isNotEmpty(company.getId())) {
+            if (company!=null && StringUtils.isNotEmpty(company.getId())) {
                 searchParams.put("companyId", company.getId());
             }
+            else{
+                searchParams.put("companyId", "");
+            }
 
             if (StringUtils.isNotEmpty(definitionId)) {
                 searchParams.put("definitionId", definitionId);

+ 14 - 13
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pub/controller/PayController.java

@@ -59,7 +59,9 @@ public class PayController {
 
     @PostMapping(value = "/orderNotifyBack")
     @ResponseBody
-    public Map orderNotifyBack(HttpServletRequest req,String payTime,String payType,String orderNo,String sign) {
+    public Map orderNotifyBack(String orderNo,String payType,
+                               String code,String payTime,
+                               String sign,String userMoney) {
         HashMap<String, Object> retMap = new HashMap<String, Object>();
 
         String status = "success";
@@ -70,14 +72,12 @@ public class PayController {
 
             HashMap<String,Object> signMap = new HashMap<String,Object>();
 
-            Map<String,String[]> paramMap = req.getParameterMap();
+            signMap.put("orderNo",orderNo);
+            signMap.put("payType",payType);
+            signMap.put("code",code);
+            signMap.put("payTime",payTime);
+            signMap.put("userMoney",userMoney);
 
-            for (Map.Entry<String, String[]> map : paramMap.entrySet()) {
-                if(!"sign".equals(map.getKey())){
-                    signMap.put(map.getKey(), map.getValue()[0]);
-                }
-            }
-      //      String signKey = ReadPropertiesUtils.getProperty("thirdInfo", "signKey");
             boolean result = SignUtil.validateSign(signMap,"1234567890",sign);
 
             if(result){
@@ -110,15 +110,16 @@ public class PayController {
                         insurancePolicyService.update(insurancePolicy);
                     }
 
-                    body.put("orderNo", orderNo);
-                    body.put("backStatus", "回调成功");
-                    body.put("backTime", new Date().getTime()/1000);
+//                    body.put("orderNo", orderNo);
+//                    body.put("backStatus", "回调成功");
+//                    body.put("backTime", new Date().getTime()/1000);
+                    status="success";
                 }else if(transactionRecord == null){
                     message = "订单不存在";
                     status = "fail";
                 }else if("20".equals(transactionRecord.getPaymentStatus())){
                     message = "订单已支付";
-                    status = "fail";
+                    status = "success";
                 }
             }else{
                 message = "签名不正确";
@@ -132,7 +133,7 @@ public class PayController {
 
         retMap.put("status", status);
         retMap.put("message", message);
-        retMap.put("body", body);
+//      retMap.put("body", body);
 
         return retMap;
     }

+ 53 - 0
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pub/controller/UserController.java

@@ -407,6 +407,59 @@ public class UserController {
         return msgResult;
     }
 
+    @PostMapping(value="/auth/whetherOpenid")
+    @ApiOperation(value = "是否绑定了微信")
+    @ResponseBody
+    public MessageResult<Boolean> whetherOpenid(HttpServletRequest request){
+        MessageResult<Boolean> messageResult = new MessageResult<>();
+
+        try {
+            Boolean bl = false;
+            AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
+            CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
+            if(StringUtils.isNotEmpty(companyUser.getOpenId())){
+                bl = true;
+            }
+
+            messageResult.setResult(true);
+            messageResult.setData(bl);
+        }
+        catch (Exception ex){
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
+    @PostMapping(value="/auth/clearOpenid")
+    @ApiOperation(value = "解绑微信")
+    @ResponseBody
+    public MessageResult<CompanyUser> clearOpenid(HttpServletRequest request){
+        MessageResult<CompanyUser> messageResult = new MessageResult<>();
+
+        try {
+            AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
+            CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
+            companyUser.setOpenId(null);
+            int affectCount = companyUserService.update(companyUser);
+
+            if(affectCount > 0) {
+                messageResult.setResult(true);
+                messageResult.setMessage("微信解绑成功");
+            }else{
+                messageResult.setResult(false);
+                messageResult.setMessage("微信解绑失败");
+            }
+        }
+        catch (Exception ex){
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
     private String getTGT(String casServerTicketUrl,String username,String password,String service){
         String url = "";
 

+ 4 - 4
picc-enterprise-server/src/main/resources/application-dev.yml

@@ -9,6 +9,7 @@ spring:
       enabled: true
 
 cas:
+#  server-url-prefix: http://localhost:8080/cas-server
   server-url-prefix: http://gyxm.jing-zhou.gov.cn/jp-cloud-cas
   server-login-url: ${cas.server-url-prefix}/login
   client-host-url: http://localhost:7070
@@ -31,7 +32,6 @@ weixin:
   appSecret: 042fe6c9c970c1d9fe585dccfca89221
 #  appId: wxf6af207d9143d1de
 #  appSecret: c86c042923e72c61c76a3a8658349312
-  tokenUrl: "http://www.jzrccs.com/weixin-middleware/token"
-  createQrCodeUrl: "http://www.jzrccs.com/weixin-middleware/qrcode/create"
-  sendTmplMsgUrl: "https://api.weixin.qq.com/cgi-bin/message/template/send"
-  sendTmplId: "6CMGIpbgZLtqdr9xOdyEAlrCWXh8nJ260jRdktnv7vE"
+  tokenUrl: "http://picc.jzrccs.com/weixin-middleware/token"
+  createQrCodeUrl: "http://picc.jzrccs.com/weixin-middleware/qrcode/create"
+  sendTmplMsgUrl: "https://api.weixin.qq.com/cgi-bin/message/template/send"

+ 48 - 0
picc-enterprise-server/src/main/resources/application-production.yml

@@ -0,0 +1,48 @@
+spring:
+  datasource:
+    url: jdbc:log4jdbc:mysql://hbjpsoft.mysql.rds.aliyuncs.com:3306/picc?autoReconnect=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    username: picc
+    password: picc@8121234
+  devtools:
+    restart:
+      enabled: true
+  redis:
+    # Redis数据库索引(默认为0)
+    database: 3
+    # Redis服务器地址
+    host: 127.0.0.1
+    # Redis服务器连接端口
+    port: 6379
+    # 密码
+    password: jp123456
+
+logger:
+  level: WARN
+  dir: /opt/picc/logs/picc-enterprise-server
+
+cas:
+  server-url-prefix: http://pay.huishouyou.com.cn/jp-cloud-cas
+  server-login-url: ${cas.server-url-prefix}/login
+  client-host-url: http://picc.jzrccs.com
+  # 如果不设则无法获取用户扩展信息
+  validation-type: cas
+
+jpcloud:
+  notifyBackUrl: http://picc.jzrccs.com/enterprise/pay/orderNotifyBack
+  synchroBackUrl: http://picc.jzrccs.com/enterprise/pay/paySuccess
+  jpcloudUrl: http://pay.huishouyou.com.cn/payment/tradingOrderPayPc
+  sellerSerialNumber: '000001000020'
+  platformCode: '0008'
+
+weixin:
+  appId: wxf6af207d9143d1de
+  appSecret: c86c042923e72c61c76a3a8658349312
+  tokenUrl: "http://picc.jzrccs.com/weixin-middleware/token"
+  createQrCodeUrl: "http://picc.jzrccs.com/weixin-middleware/qrcode/create"
+  sendTmplMsgUrl: "https://api.weixin.qq.com/cgi-bin/message/template/send"
+
+springfox:
+  documentation:
+    swagger:
+      v2:
+        host: picc.jzrccs.com

+ 15 - 2
picc-enterprise-server/src/main/resources/logback-spring.xml

@@ -15,13 +15,23 @@
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${loggerPath}/logfile.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${loggerPath}/logfile.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <fileNamePattern>${loggerPath}/common/logfile.%d{yyyy-MM-dd}.log</fileNamePattern>
             <MaxHistory>30</MaxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${pattern}</pattern>
         </encoder>
     </appender>
+    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${loggerPath}/access/access.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${loggerPath}/access/access.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%date [%file : %line] %msg%n</pattern>
+        </encoder>
+    </appender>
     <!--
     直接用maven的变量是@...@,用spring的变量是${...}
     -->
@@ -48,8 +58,11 @@
     </springProfile>
     <springProfile name="production">
         <root level="WARN">
-            <appender-ref ref="STDOUT" />
+<!--            <appender-ref ref="STDOUT" />-->
             <appender-ref ref="FILE" />
         </root>
+        <logger name="com.jpsoft.picc.advice.PermissionAdvice" additivity="false" level="WARN">
+            <appender-ref ref="ACCESS" />
+        </logger>
     </springProfile>
 </configuration>

+ 0 - 69
pom.xml

@@ -26,7 +26,6 @@
         <lombok.version>1.16.12</lombok.version>
         <hutool.version>5.0.6</hutool.version>
         <swagger2.version>2.7.0</swagger2.version>
-        <poi.version>4.1.0</poi.version>
     </properties>
 
     <dependencies>
@@ -69,74 +68,6 @@
         </dependency>
         <!-- swagger ui end-->
 
-        <!-- apache poi -->
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>${poi.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-scratchpad</artifactId>
-            <version>${poi.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>${poi.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml-schemas</artifactId>
-            <version>${poi.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>fr.opensagres.xdocreport</groupId>
-            <artifactId>xdocreport</artifactId>
-            <version>1.0.6</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>ooxml-schemas</artifactId>
-            <version>1.3</version>
-            <scope>compile</scope>
-        </dependency>
-        <!-- apache poi end -->
-
-        <!-- aliyun oss start -->
-        <dependency>
-            <groupId>com.aliyun.oss</groupId>
-            <artifactId>aliyun-sdk-oss</artifactId>
-            <version>3.1.0</version>
-        </dependency>
-        <!-- aliyun oss end -->
-
-        <!-- 阿里大鱼短信jar包 start-->
-        <dependency>
-            <groupId>com.taobao</groupId>
-            <artifactId>taobao-sdk-java</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-        <!-- 阿里大鱼短信jar包 end-->
-
-
-        <!--html转pdf start-->
-        <dependency>
-            <groupId>com.itextpdf</groupId>
-            <artifactId>itextpdf</artifactId>
-            <version>5.5.13</version>
-        </dependency>
-        <dependency>
-            <groupId>com.itextpdf</groupId>
-            <artifactId>itext-asian</artifactId>
-            <version>5.2.0</version>
-        </dependency>
-
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>

+ 35 - 4
weixin-middleware/pom.xml

@@ -67,6 +67,33 @@
             <version>0.2.7</version>
         </dependency>
         <!--logging end-->
+
+<!--        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>-->
+        <!-- 数据库相关 start-->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>LATEST</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.10</version>
+        </dependency>
+        <!-- 数据库相关 end-->
     </dependencies>
 
 
@@ -120,8 +147,10 @@
             <id>test</id>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
+                    <scope>provided</scope>
                 </dependency>
             </dependencies>
             <properties>
@@ -135,8 +164,10 @@
             </properties>
             <dependencies>
                 <dependency>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>javax.servlet-api</artifactId>
+                    <version>3.1.0</version>
+                    <scope>provided</scope>
                 </dependency>
             </dependencies>
         </profile>

+ 6 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/WeixinMiddlewareApplication.java

@@ -1,11 +1,17 @@
 package com.jpsoft.weixin;
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication
+@EnableTransactionManagement
+@EnableScheduling
+@MapperScan("com.jpsoft.weixin.**.dao")
 public class WeixinMiddlewareApplication extends SpringBootServletInitializer {
     public static void main(String[] args) {
         SpringApplication.run(WeixinMiddlewareApplication.class, args);

+ 10 - 7
weixin-middleware/src/main/java/com/jpsoft/weixin/callback/EventCallback.java

@@ -1,22 +1,17 @@
 package com.jpsoft.weixin.callback;
 
-import cn.hutool.json.JSONObject;
-import com.jpsoft.weixin.util.WeixinUtil;
 import lombok.Data;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
 import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 
-import javax.servlet.http.HttpServletResponse;
-import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -46,7 +41,15 @@ public class EventCallback {
 
             HttpPost httpPost = new HttpPost(urlBuilder.toString());
 
-            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+            RequestConfig requestConfig = RequestConfig.custom()
+                    .setSocketTimeout(5000)
+                    .setConnectTimeout(5000)
+                    .setConnectionRequestTimeout(5000)
+                    .build();
+
+            CloseableHttpClient httpClient = HttpClientBuilder.create()
+                    .setDefaultRequestConfig(requestConfig)
+                    .build();
 
             List<NameValuePair> list = new ArrayList<NameValuePair>();
             list.add(new BasicNameValuePair("eventKey", eventKey));

+ 138 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/controller/ReplyMessageController.java

@@ -0,0 +1,138 @@
+package com.jpsoft.weixin.controller;
+
+import com.github.pagehelper.Page;
+import com.jpsoft.weixin.dto.MessageResult;
+import com.jpsoft.weixin.dto.Sort;
+import com.jpsoft.weixin.entity.ReplyMessage;
+import com.jpsoft.weixin.service.ReplyMessageService;
+import com.jpsoft.weixin.utils.PojoUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.*;
+
+@RestController
+@RequestMapping("/replyMessage")
+@Api(description = "微信自动回复消息配置")
+public class ReplyMessageController {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private ReplyMessageService replyMessageService;
+
+    @ApiOperation(value="添加信息")
+    @PostMapping("add")
+    public MessageResult<ReplyMessage> add(ReplyMessage replyMessage){
+        MessageResult<ReplyMessage> msgResult = new MessageResult<>();
+
+        try {
+            replyMessage.setCreateTime(new Date());
+
+            int affectCount = replyMessageService.insert(replyMessage);
+
+            if (affectCount > 0) {
+                msgResult.setResult(true);
+                msgResult.setData(replyMessage);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("数据库添加失败");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+    @ApiOperation(value="获取信息")
+    @GetMapping("edit/{id}")
+    public MessageResult<ReplyMessage> edit(@PathVariable("id") String id){
+        MessageResult<ReplyMessage> msgResult = new MessageResult<>();
+
+        try {
+            ReplyMessage replyMessage = replyMessageService.get(id);
+
+            if (replyMessage != null) {
+                msgResult.setResult(true);
+                msgResult.setData(replyMessage);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("数据库不存在该记录!");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+    @ApiOperation(value="更新用户")
+    @PostMapping("update")
+    public MessageResult<ReplyMessage> update(ReplyMessage replyMessage){
+        MessageResult<ReplyMessage> msgResult = new MessageResult<>();
+
+        try {
+            replyMessage.setUpdateTime(new Date());
+            
+            int affectCount = replyMessageService.update(replyMessage);
+
+            if (affectCount > 0) {
+                msgResult.setResult(true);
+                msgResult.setData(replyMessage);
+            } else {
+                msgResult.setResult(false);
+                msgResult.setMessage("数据库更新失败");
+            }
+        }
+        catch(Exception ex){
+            logger.error(ex.getMessage(),ex);
+
+            msgResult.setResult(false);
+            msgResult.setMessage(ex.getMessage());
+        }
+
+        return msgResult;
+    }
+
+    @ApiOperation(value="列表")
+    @RequestMapping(value = "pageList",method = RequestMethod.POST)
+    public MessageResult<Map> pageList(
+            String id,
+            @RequestParam(value="pageIndex",defaultValue="1") int pageIndex,
+            @RequestParam(value="pageSize",defaultValue="20") int pageSize,
+            @RequestAttribute String subject){
+
+        //当前用户ID
+        System.out.println(subject);
+
+        MessageResult<Map> msgResult = new MessageResult<>();
+
+        Map<String,Object> searchParams = new HashMap<>();
+
+        List<Sort> sortList = new ArrayList<>();
+        sortList.add(new Sort("create_time","asc"));
+
+        if (StringUtils.isNotEmpty(id)) {
+            searchParams.put("id","%" + id + "%");
+        }
+
+        Page<ReplyMessage> page = replyMessageService.pageSearch(searchParams,pageIndex,pageSize,sortList);
+
+        msgResult.setResult(true);
+        msgResult.setData(PojoUtil.pageWrapper(page));
+
+        return msgResult;
+    }
+}

+ 25 - 6
weixin-middleware/src/main/java/com/jpsoft/weixin/controller/WeixinController.java

@@ -1,15 +1,14 @@
 package com.jpsoft.weixin.controller;
 
-import cn.hutool.core.date.DateTime;
 import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import com.itextpdf.text.io.StreamUtil;
 import com.jpsoft.weixin.callback.EventCallback;
 import com.jpsoft.weixin.callback.PromotionCallback;
 import com.jpsoft.weixin.config.PICCAdminScanConfig;
 import com.jpsoft.weixin.config.PICCEntScanConfig;
 import com.jpsoft.weixin.config.WeixinConfig;
-import com.jpsoft.weixin.util.WeixinUtil;
+import com.jpsoft.weixin.entity.ReplyMessage;
+import com.jpsoft.weixin.service.ReplyMessageService;
+import com.jpsoft.weixin.utils.WeixinUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -27,10 +26,10 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Controller;
-import org.springframework.util.StreamUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -62,6 +61,9 @@ public class WeixinController {
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
+    @Autowired
+    private ReplyMessageService replyMessageService;
+
     @ApiOperation(value="验证服务器地址的有效性")
     @GetMapping("/")
     @ResponseBody
@@ -160,8 +162,11 @@ public class WeixinController {
             response.setContentType("text/html; charset=UTF-8");
             response.setCharacterEncoding("UTF-8");
 
+            String event = requestJson.getStr("Event");
             String eventKey = requestJson.getStr("EventKey");
+            //微信公众号编号
             String toUserName = requestJson.getStr("ToUserName");
+            //扫码用户openID
             String fromUserName = requestJson.getStr("FromUserName");
 
             List<EventCallback> callbackList = registerCallbackList();
@@ -185,7 +190,21 @@ public class WeixinController {
 
             if(!processed) {
                 String responseText = "success";
-                response.getWriter().print(responseText);
+
+                if(event.equals("subscribe")){
+                    ReplyMessage replyMessage = replyMessageService.findByEvent(toUserName,event);
+
+                    if(replyMessage!=null) {
+                        WeixinUtil.replyTextMessage(response, toUserName, fromUserName, replyMessage.getMessage());
+                    }
+                    else{
+                        log.warn(fromUserName + ",事件:" + event + "未设置自动回复!");
+                        response.getWriter().print(responseText);
+                    }
+                }
+                else {
+                    response.getWriter().print(responseText);
+                }
             }
         }
         catch (Exception ex){

+ 20 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/dao/ReplyMessageDAO.java

@@ -0,0 +1,20 @@
+package com.jpsoft.weixin.dao;
+
+import java.util.List;
+
+import com.jpsoft.weixin.dto.Sort;
+import org.springframework.stereotype.Repository;
+import com.jpsoft.weixin.entity.ReplyMessage;
+import java.util.Map;
+
+@Repository
+public interface ReplyMessageDAO {
+	int insert(ReplyMessage entity);
+	int update(ReplyMessage entity);
+	int exist(String id);
+	ReplyMessage get(String id);
+	int delete(String id);
+	List<ReplyMessage> list();
+	List<ReplyMessage> search(Map<String,Object> searchParams,List<Sort> sortList);
+	ReplyMessage findByEvent(String id, String event);
+}

+ 50 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/dto/MessageResult.java

@@ -0,0 +1,50 @@
+package com.jpsoft.weixin.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.ToString;
+
+@ApiModel(value = "返回消息体")
+@ToString
+public class MessageResult<T> {
+    private boolean result;
+    private String message;
+    private T data;
+    private int code = 200;
+
+    @ApiModelProperty(value = "返回调用结果")
+    public boolean isResult() {
+        return result;
+    }
+
+    public void setResult(boolean result) {
+        this.result = result;
+    }
+
+    @ApiModelProperty(value = "返回消息")
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @ApiModelProperty(value = "返回数据")
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    @ApiModelProperty(value = "返回代码")
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+}

+ 32 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/dto/Sort.java

@@ -0,0 +1,32 @@
+package com.jpsoft.weixin.dto;
+
+import java.io.Serializable;
+
+public class Sort implements Serializable {
+    private String name;
+    private String order;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getOrder() {
+        return order;
+    }
+
+    public void setOrder(String order) {
+        this.order = order;
+    }
+
+    public Sort() {
+    }
+
+    public Sort(String name, String order) {
+        this.name = name;
+        this.order = order;
+    }
+}

+ 97 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/entity/ReplyMessage.java

@@ -0,0 +1,97 @@
+package com.jpsoft.weixin.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiModel;
+
+/**
+  描述:wechat_reply_message的实体类
+ */
+@ApiModel(value = "自动回复消息设置")
+public class ReplyMessage {
+    @ApiModelProperty(value = "微信号")
+	private String id;
+    @ApiModelProperty(value = "事件")
+	private String event;
+    @ApiModelProperty(value = "回复消息")
+	private String message;
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+    @ApiModelProperty(value = "更新时间")
+	private Date updateTime;
+
+	/**
+	 *获取微信号
+	 */
+    	public String getId(){
+		return id;
+	}
+	
+	/**
+	 *设置微信号
+	 */
+	public void setId(String id){
+		this.id = id;
+	}
+	/**
+	 *获取事件
+	 */
+    	public String getEvent(){
+		return event;
+	}
+	
+	/**
+	 *设置事件
+	 */
+	public void setEvent(String event){
+		this.event = event;
+	}
+	/**
+	 *获取回复消息
+	 */
+    	public String getMessage(){
+		return message;
+	}
+	
+	/**
+	 *设置回复消息
+	 */
+	public void setMessage(String message){
+		this.message = message;
+	}
+	/**
+	 *获取创建时间
+	 */
+    	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone ="GMT+8")
+		public Date getCreateTime(){
+		return createTime;
+	}
+	
+	/**
+	 *设置创建时间
+	 */
+	public void setCreateTime(Date createTime){
+		this.createTime = createTime;
+	}
+	/**
+	 *获取更新时间
+	 */
+    	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone ="GMT+8")
+		public Date getUpdateTime(){
+		return updateTime;
+	}
+	
+	/**
+	 *设置更新时间
+	 */
+	public void setUpdateTime(Date updateTime){
+		this.updateTime = updateTime;
+	}
+}

+ 19 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/service/ReplyMessageService.java

@@ -0,0 +1,19 @@
+package com.jpsoft.weixin.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.jpsoft.weixin.dto.Sort;
+import com.jpsoft.weixin.entity.ReplyMessage;
+import com.github.pagehelper.Page;
+
+public interface ReplyMessageService {
+	ReplyMessage get(String id);
+	boolean exist(String id);
+	int insert(ReplyMessage model);
+	int update(ReplyMessage model);
+	int delete(String id);
+	List<ReplyMessage> list();
+	Page<ReplyMessage> pageSearch(Map<String, Object> searchParams,int pageNum,int pageSize,List<Sort> sortList);
+	ReplyMessage findByEvent(String fromUserName, String event);
+}

+ 76 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/service/impl/ReplyMessageServiceImpl.java

@@ -0,0 +1,76 @@
+package com.jpsoft.weixin.service.impl;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.annotation.Resource;
+
+import com.jpsoft.weixin.dto.Sort;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import com.jpsoft.weixin.dao.ReplyMessageDAO;
+import com.jpsoft.weixin.entity.ReplyMessage;
+import com.jpsoft.weixin.service.ReplyMessageService;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+
+@Transactional
+@Component(value="replyMessageService")
+public class ReplyMessageServiceImpl implements ReplyMessageService {
+	@Resource(name="replyMessageDAO")
+	private ReplyMessageDAO replyMessageDAO;
+
+	@Override
+	public ReplyMessage get(String id) {
+		// TODO Auto-generated method stub
+		return replyMessageDAO.get(id);
+	}
+
+	@Override
+	public int insert(ReplyMessage model) {
+		// TODO Auto-generated method stub
+		//model.set${PkFieldName}(UUID.randomUUID().toString());
+		
+		return replyMessageDAO.insert(model);
+	}
+
+	@Override
+	public int update(ReplyMessage model) {
+		// TODO Auto-generated method stub
+		return replyMessageDAO.update(model);		
+	}
+
+	@Override
+	public int delete(String id) {
+		// TODO Auto-generated method stub
+		return replyMessageDAO.delete(id);
+	}
+
+	@Override
+	public boolean exist(String id) {
+		// TODO Auto-generated method stub
+		int count = replyMessageDAO.exist(id);
+		
+		return count > 0 ? true : false;
+	}
+	
+	@Override
+	public List<ReplyMessage> list() {
+		// TODO Auto-generated method stub
+		return replyMessageDAO.list();
+	}
+		
+	@Override
+	public Page<ReplyMessage> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,List<Sort> sortList) {
+        Page<ReplyMessage> page = PageHelper.startPage(pageNumber,pageSize).doSelectPage(()->{
+            replyMessageDAO.search(searchParams,sortList);
+        });
+        
+        return page;
+	}
+
+	@Override
+	public ReplyMessage findByEvent(String id, String event) {
+		return replyMessageDAO.findByEvent(id,event);
+	}
+}

+ 73 - 0
weixin-middleware/src/main/java/com/jpsoft/weixin/utils/PojoUtil.java

@@ -0,0 +1,73 @@
+package com.jpsoft.weixin.utils;
+
+import com.github.dozermapper.core.DozerBeanMapperBuilder;
+import com.github.dozermapper.core.Mapper;
+import com.github.pagehelper.Page;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.util.HashMap;
+import java.util.Map;
+
+public class PojoUtil {
+    private static Logger logger = LoggerFactory.getLogger("root");
+    private static Mapper MAPPER = DozerBeanMapperBuilder.buildDefault();
+
+    public static <T> T map(Object source, Class<T> destinationClass) {
+        if (source == null) {
+            return null;
+        }
+        return MAPPER.map(source, destinationClass);
+    }
+
+    public static void map(Object source, Object destination) {
+        MAPPER.map(source, destination);
+    }
+
+    public static <T> Map<String, Object> pojo2map(T t) {
+        // TODO Auto-generated method stub
+        Map<String, Object> map = new HashMap<String, Object>();
+
+        try {
+            BeanInfo beanInfo = Introspector.getBeanInfo(t.getClass());
+            PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
+
+            for (PropertyDescriptor pd : props) {
+                if (pd.getReadMethod() != null) {
+                    try {
+                        Object srcValue = pd.getReadMethod().invoke(t);
+                        map.put(pd.getName(), srcValue);
+                    } catch (Exception ex) {
+                        logger.error(ex.getMessage(), ex);
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        return map;
+    }
+
+
+    public static Map pageWrapper(Page page) {
+        Map<String, Object> pageMap = new HashMap<>();
+
+        //记录总数
+        pageMap.put("recordsTotal", page.getTotal());
+        pageMap.put("recordsFiltered", page.getTotal());
+        //总页数
+        pageMap.put("totalPage", page.getPages());
+        //当前页
+        pageMap.put("pageNumber", page.getPageNum());
+        //每页条数
+        pageMap.put("pageSize", page.getPageSize());
+        //本页数据
+        pageMap.put("data", page.getResult());
+
+        return pageMap;
+    }
+}

+ 1 - 1
weixin-middleware/src/main/java/com/jpsoft/weixin/util/WeixinUtil.java → weixin-middleware/src/main/java/com/jpsoft/weixin/utils/WeixinUtil.java

@@ -1,4 +1,4 @@
-package com.jpsoft.weixin.util;
+package com.jpsoft.weixin.utils;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.json.JSONObject;

+ 4 - 0
weixin-middleware/src/main/resources/application-dev.yml

@@ -1,4 +1,8 @@
 spring:
+  datasource:
+    url: jdbc:log4jdbc:mysql://127.0.0.1:3306/picc?autoReconnect=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    username: root
+    password: root
   devtools:
     add-properties: false
     restart:

+ 13 - 7
weixin-middleware/src/main/resources/application-production.yml

@@ -1,13 +1,17 @@
 spring:
+  datasource:
+    url: jdbc:log4jdbc:mysql://hbjpsoft.mysql.rds.aliyuncs.com:3306/picc?autoReconnect=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    username: picc
+    password: picc@8121234
   devtools:
     add-properties: false
     restart:
       enabled: true
-
+  redis:
+    password: jp123456
 logger:
   level: WARN
-  dir: /opt/logs/weixin-middleware/
-
+  dir: /opt/picc/logs/weixin-middleware/
 
 weixin:
   token: weixin
@@ -21,12 +25,14 @@ qrcode:
     enterprise:
       scan:
         loginCode: "5000"
-        loginCallbackUrl: "http://gyxm.jing-zhou.gov.cn/picc-enterprise-test/qrcode/login/scan"
+        loginCallbackUrl: "http://picc.jzrccs.com/enterprise/qrcode/login/scan"
         bindingCode: "5001"
-        bindingCallbackUrl: "http://gyxm.jing-zhou.gov.cn/picc-enterprise-test/qrcode/binding/scan"
+        bindingCallbackUrl: "http://picc.jzrccs.com/enterprise/qrcode/binding/scan"
     admin:
       scan:
         loginCode: "6000"
-        loginCallbackUrl: "http://gyxm.jing-zhou.gov.cn/picc-admin-server/pub/qrcode/login/scan"
+        loginCallbackUrl: "http://picc.jzrccs.com/picc-admin-server/pub/qrcode/login/scan"
         bindingCode: "6001"
-        bindingCallbackUrl: "http://gyxm.jing-zhou.gov.cn/picc-admin-server/pub/qrcode/binding/scan"
+        bindingCallbackUrl: "http://picc.jzrccs.com/picc-admin-server/pub/qrcode/binding/scan"
+        promotionCode: "7000"
+        promotionCallbackUrl: " http://picc.jzrccs.com/picctg/customReg.html"

+ 5 - 1
weixin-middleware/src/main/resources/application-test.yml

@@ -1,4 +1,8 @@
 spring:
+  datasource:
+    url: jdbc:log4jdbc:mysql://10.100.145.22:3307/picc?autoReconnect=true&characterEncoding=utf8&serverTimezone=GMT%2B8
+    username: root
+    password: jpsoft
   devtools:
     add-properties: false
     restart:
@@ -31,4 +35,4 @@ qrcode:
         bindingCode: "6001"
         bindingCallbackUrl: "http://gyxm.jing-zhou.gov.cn/picc-admin-server/pub/qrcode/binding/scan"
         promotionCode: "7000"
-        promotionCallbackUrl: " http://vbvczi.natappfree.cc/weixin-middleware/demo"
+        promotionCallbackUrl: "http://www.jzrccs.com/picctg/customReg.html"

+ 64 - 1
weixin-middleware/src/main/resources/application.yml

@@ -32,4 +32,67 @@ spring:
       # 连接池中的最小空闲连接
       min-idle: 0
       # 连接超时时间(毫秒)
-      timeout: 0
+      timeout: 0
+  datasource:
+    driver-class-name: net.sf.log4jdbc.DriverSpy
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      # 连接池的配置信息
+      # 初始化大小,最小,最大
+      initial-size: 5
+      min-idle: 5
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      validationQuery: SELECT 1
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      # 打开PSCache,并且指定每个连接上PSCache的大小
+      poolPreparedStatements: true
+      maxPoolPreparedStatementPerConnectionSize: 20
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+      filters: stat,wall
+      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
+      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      # 配置DruidStatFilter
+      web-stat-filter:
+        enabled: false
+        url-pattern: "/*"
+        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
+      # 配置DruidStatViewServlet
+      stat-view-servlet:
+        url-pattern: "/druid/*"
+        # IP白名单(没有配置或者为空,则允许所有访问)
+        allow:
+        # IP黑名单 (存在共同时,deny优先于allow)
+        deny:
+        #  禁用HTML页面上的“Reset All”功能
+        reset-enable: false
+        # 登录名
+        login-username: admin
+        # 登录密码
+        login-password: jpsoft
+
+management:
+  endpoints:
+    enabled: true
+    web:
+      base-path: /actuator2020  # 访问根路径
+      exposure:
+        include: "*"
+  endpoint:
+    shutdown:
+      enabled: true
+    refresh:
+      enabled: true
+
+mybatis:
+  typeAliasesPackage: com.jpsoft.weixin.**.entity
+  mapperLocations: classpath*:mapper/**/*.xml
+  configuration:
+    default-statement-timeout: 60

+ 78 - 0
weixin-middleware/src/main/resources/mapper/ReplyMessage.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!-- namespace必须指向DAO接口 -->
+<mapper namespace="com.jpsoft.weixin.dao.ReplyMessageDAO">
+	<resultMap id="ReplyMessageMap" type="com.jpsoft.weixin.entity.ReplyMessage">
+		<id property="id" column="id_" />
+			<result property="event" column="event_" />
+			<result property="message" column="message_" />
+			<result property="createTime" column="create_time" />
+			<result property="updateTime" column="update_time" />
+			</resultMap>
+	<insert id="insert" parameterType="com.jpsoft.weixin.entity.ReplyMessage">
+	<!--
+	<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
+		select sys_guid() from dual
+	</selectKey>
+	-->
+	<![CDATA[
+		insert into wechat_reply_message
+	    (id_,event_,message_,create_time,update_time)
+		values
+		(
+			#{id,jdbcType=VARCHAR}
+			,#{event,jdbcType=VARCHAR}
+			,#{message,jdbcType=VARCHAR}
+			,#{createTime,jdbcType= TIMESTAMP }
+			,#{updateTime,jdbcType= TIMESTAMP }
+		)
+	]]>
+	</insert>
+	<delete id="delete" parameterType="string">
+		delete from wechat_reply_message where id_=#{id,jdbcType=VARCHAR}
+	</delete>
+	<update id="update" parameterType="com.jpsoft.weixin.entity.ReplyMessage">
+		update wechat_reply_message
+		<set>
+				<if test="event!=null">
+		event_=#{event,jdbcType=VARCHAR},
+		</if>
+				<if test="message!=null">
+		message_=#{message,jdbcType=VARCHAR},
+		</if>
+				<if test="createTime!=null">
+		create_time=#{createTime,jdbcType= TIMESTAMP },
+		</if>
+				<if test="updateTime!=null">
+		update_time=#{updateTime,jdbcType= TIMESTAMP },
+		</if>
+		</set>
+	where id_=#{id}
+	</update>
+	<select id="get" parameterType="string" resultMap="ReplyMessageMap">
+		select * from wechat_reply_message where id_=#{0}
+	</select>
+	<select id="exist" parameterType="string" resultType="int">
+		select count(*) from wechat_reply_message where id_=#{0}
+	</select>
+	<select id="list" resultMap="ReplyMessageMap">
+		select * from wechat_reply_message
+	</select>
+	<select id="search" parameterType="hashmap" resultMap="ReplyMessageMap">
+		<![CDATA[
+			select * from wechat_reply_message
+		]]>
+		<where>
+			<if test="searchParams.id != null">
+				and ID_ like #{searchParams.id}
+			</if>
+		</where>
+		<foreach item="sort" collection="sortList"  open="order by" separator=",">
+	        ${sort.name} ${sort.order}
+	 	</foreach>
+	</select>
+	<select id="findByEvent" resultMap="ReplyMessageMap">
+		select * from wechat_reply_message where id_=#{id} and event_=#{event} limit 1
+	</select>
+</mapper>