瀏覽代碼

Merge branch 'dev' of http://192.168.1.220:10080/Amoy2/wlyy2.0 into dev

zdm 6 年之前
父節點
當前提交
87450ee9c5
共有 38 個文件被更改,包括 597 次插入104 次删除
  1. 11 0
      common/common-entity/src/main/java/com/yihu/jw/entity/base/role/MenuDO.java
  2. 10 0
      common/common-entity/src/main/java/com/yihu/jw/entity/base/saas/SaasDO.java
  3. 10 0
      common/common-entity/src/main/java/com/yihu/jw/entity/base/wx/WxReplySceneDO.java
  4. 10 0
      common/common-entity/src/main/java/com/yihu/jw/entity/base/wx/WxTemplateConfigDO.java
  5. 2 10
      common/common-entity/src/main/java/com/yihu/jw/entity/base/wx/WxTemplateDO.java
  6. 7 1
      common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseRequestMapping.java
  7. 9 0
      common/common-rest-model/pom.xml
  8. 13 3
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/module/ModuleVO.java
  9. 10 0
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/role/MenuVO.java
  10. 1 1
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/saas/SaasVO.java
  11. 21 0
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/web/endpoint/EnvelopRestEndpoint.java
  12. 4 0
      common/common-util/src/main/java/com/yihu/jw/util/wechat/WeiXinMessageUtils.java
  13. 4 0
      server/svr-authentication/pom.xml
  14. 1 0
      server/svr-authentication/src/main/java/com/yihu/jw/security/model/PublicKey.java
  15. 16 0
      server/svr-authentication/src/main/java/com/yihu/jw/security/model/PublickeyVO.java
  16. 33 8
      server/svr-authentication/src/main/java/com/yihu/jw/security/oauth2/provider/endpoint/WlyyLoginEndpoint.java
  17. 71 0
      server/svr-authentication/src/main/java/com/yihu/jw/security/utils/RSAUtils.java
  18. 4 0
      svr/svr-base/src/main/java/com/yihu/jw/base/contant/CommonContant.java
  19. 6 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/saas/SaasDao.java
  20. 2 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/saas/SaasTypeDictDao.java
  21. 2 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxReplySceneDao.java
  22. 4 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxTemplateConfigDao.java
  23. 5 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxTemplateDao.java
  24. 27 8
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/module/ModuleEndpoint.java
  25. 53 8
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/role/MenuEndpoint.java
  26. 10 6
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/saas/SaasEndpoint.java
  27. 3 1
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/system/SystemDictEndpoint.java
  28. 7 1
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/system/SystemDictEntryEndpoint.java
  29. 57 3
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/wx/WechatController.java
  30. 2 1
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/wx/WxTemplateController.java
  31. 15 12
      svr/svr-base/src/main/java/com/yihu/jw/base/service/module/ModuleService.java
  32. 6 13
      svr/svr-base/src/main/java/com/yihu/jw/base/service/org/BaseOrgService.java
  33. 4 0
      svr/svr-base/src/main/java/com/yihu/jw/base/service/role/MenuService.java
  34. 1 1
      svr/svr-base/src/main/java/com/yihu/jw/base/service/system/SystemDictService.java
  35. 5 0
      svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WechatCoreService.java
  36. 65 4
      svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WechatService.java
  37. 56 3
      svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WxTemplateService.java
  38. 30 20
      svr/svr-iot/src/main/java/com/yihu/iot/controller/analyzer/IotAnalyzerController.java

+ 11 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/base/role/MenuDO.java

@ -5,6 +5,7 @@ import com.yihu.jw.entity.UuidIdentityEntityWithOperator;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
/**
 * @author progr1mmer
@ -39,6 +40,7 @@ public class MenuDO extends UuidIdentityEntityWithOperator {
	 * 父级ID
	 */
	private String parentId;
	private String parentName;
	/**
	 * 状态
	 */
@ -142,4 +144,13 @@ public class MenuDO extends UuidIdentityEntityWithOperator {
	public void setShow(Integer show) {
		this.show = show;
	}
	@Transient
	public String getParentName() {
		return parentName;
	}
	public void setParentName(String parentName) {
		this.parentName = parentName;
	}
}

+ 10 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/base/saas/SaasDO.java

@ -36,6 +36,7 @@ public class SaasDO extends UuidIdentityEntityWithOperator {
	private String remark; //备注
	private String logo; //远程fastDFS文件地址
    private String type; //类型
    private String typeName; //租户类型名称
	private String manager; //管理员 - 关联user表id字段
	private String email; //管理员邮箱
	private String mobile; //管理员手机号码
@ -238,4 +239,13 @@ public class SaasDO extends UuidIdentityEntityWithOperator {
    public void setAppSecret(String appSecret) {
        this.appSecret = appSecret;
    }
    @Transient
    public String getTypeName() {
        return typeName;
    }
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
}

+ 10 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/base/wx/WxReplySceneDO.java

@ -20,6 +20,7 @@ public class WxReplySceneDO extends UuidIdentityEntityWithOperator implements ja
    private String event;//微信事件类型:SCAN,LOCATION,CLICK,subscribe,unsubscribe
    private String scene;//图文消息/自定义消息,分组场景,微信的eventKey
    private String content;//居民回复内容,消息字段
    private String defaultReply;//如果值为:default, 则是微信默认回复配置发送的图文
    private Integer status;//状态(-1删除 0 冻结 1可用
    @Column(name = "wechat_id")
@ -76,6 +77,15 @@ public class WxReplySceneDO extends UuidIdentityEntityWithOperator implements ja
        this.content = content;
    }
    @Column(name = "default_reply")
    public String getDefaultReply() {
        return defaultReply;
    }
    public void setDefaultReply(String defaultReply) {
        this.defaultReply = defaultReply;
    }
    @Column(name = "status")
    public Integer getStatus() {
        return status;

+ 10 - 0
common/common-entity/src/main/java/com/yihu/jw/entity/base/wx/WxTemplateConfigDO.java

@ -30,6 +30,7 @@ public class WxTemplateConfigDO extends UuidIdentityEntityWithOperator implement
    private String keyword7;//项目
    private String appid;//跳转小程序的appid
    private String pagepath;//跳转小程序路径
    private Integer status;//状态 1:正常 -1:删除
    @Column(name = "wechat_id")
    public String getWechatId() {
@ -185,4 +186,13 @@ public class WxTemplateConfigDO extends UuidIdentityEntityWithOperator implement
    public void setPagepath(String pagepath) {
        this.pagepath = pagepath;
    }
    @Column(name = "status")
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
}

+ 2 - 10
common/common-entity/src/main/java/com/yihu/jw/entity/base/wx/WxTemplateDO.java

@ -17,8 +17,6 @@ public class WxTemplateDO extends UuidIdentityEntityWithOperator implements java
    // Fields
    private String title;//模板标题
    private String wechatId;//关联的微信code 关联表 Wx_Wechat
    @Transient
    private String wechatName;
    private String templateId;//微信模板id
    private String templateName;//模板名称(模板检索名称)
    private String content;//模板内容
@ -76,10 +74,11 @@ public class WxTemplateDO extends UuidIdentityEntityWithOperator implements java
        this.content = content;
    }
    @Column(name = "status", length = 2)
    public Integer getStatus() {
        return status;
    }
    // Constructors
    public void setStatus(Integer status) {
        this.status = status;
@ -94,11 +93,4 @@ public class WxTemplateDO extends UuidIdentityEntityWithOperator implements java
        this.remark = remark;
    }
    public String getWechatName() {
        return wechatName;
    }
    public void setWechatName(String wechatName) {
        this.wechatName = wechatName;
    }
}

+ 7 - 1
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseRequestMapping.java

@ -86,6 +86,7 @@ public class BaseRequestMapping {
        public static final String STATUS  = "/status";
        public static final String IS_NAME_EXIST  = "/isNameExist";
        public static final String FIND_ALL  = "/findAll";
        public static final String GET_TREE  = "/getTree";
    }
@ -188,6 +189,7 @@ public class BaseRequestMapping {
        public static final String IS_NAME_EXIST  = "/isNameExist";
        public static final String MOVE_UP  = "/moveUp";
        public static final String MOVE_DOWN  = "/moveDown";
        public static final String GET_TREE  = "/getTree";
        public static final String FIND_ALL  = "/findAll";
    }
@ -259,14 +261,18 @@ public class BaseRequestMapping {
        public static final String deleteImgGroupRelation ="/deleteImgGroupRelation";
        public static final String saveWxReplyScene ="/saveWxReplyScene";
        public static final String findDefaultReply ="/findDefaultReply";
        public static final String findWxReplySceneExist ="/findWxReplySceneExist";
        public static final String findWxReplyScene ="/findWxReplyScene";
        public static final String saveWxTemp ="/saveWxTemp";
        public static final String findWxTempExist ="/findWxTempExist";
        public static final String findWxTempNameExist ="/findWxTempNameExist";
        public static final String findWxtemp ="/findWxtemp";
        public static final String saveWxTempConfig ="/saveWxTempConfig";
        public static final String findWxTempConfigList ="/findWxTempConfigList";
        public static final String findWxTemplateConfig ="/findWxTemplateConfig";
        public static final String findWxTemplateConfigExist ="/findWxTemplateConfigExist";
        public static final String getAllTemp ="/getAllTemp";
        public static final String getusersummary ="/getusersummary";
        public static final String getusercumulate ="/getusercumulate";

+ 9 - 0
common/common-rest-model/pom.xml

@ -51,5 +51,14 @@
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>
</project>

+ 13 - 3
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/module/ModuleVO.java

@ -18,10 +18,12 @@ public class ModuleVO extends UuidIdentityVOWithOperator {
    private String name;
    @ApiModelProperty(value = "父ID", example = "402803ee656498890165649ad2da0000")
    private String parentId;
    @ApiModelProperty(value = "父name", example = "无")
    private String parentName;
    @ApiModelProperty(value = "url", example = "/doctor/*")
    private String url;
    @ApiModelProperty(value = "类型", example = "0通用,1医生端你,2居民端")
    private String type;
    private Integer type;
    @ApiModelProperty(value = "状态", example = "1有效,0失效")
    private Integer status;
    @ApiModelProperty(value = "备注", example = "我是备注")
@ -83,11 +85,11 @@ public class ModuleVO extends UuidIdentityVOWithOperator {
        this.isEnd = isEnd;
    }
    public String getType() {
    public Integer getType() {
        return type;
    }
    public void setType(String type) {
    public void setType(Integer type) {
        this.type = type;
    }
@ -114,4 +116,12 @@ public class ModuleVO extends UuidIdentityVOWithOperator {
    public void setIsCheck(Integer isCheck) {
        this.isCheck = isCheck;
    }
    public String getParentName() {
        return parentName;
    }
    public void setParentName(String parentName) {
        this.parentName = parentName;
    }
}

+ 10 - 0
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/role/MenuVO.java

@ -25,6 +25,8 @@ public class MenuVO extends UuidIdentityVOWithOperator {
    private Integer sort;
    @ApiModelProperty(value = "父级ID", example = "父级ID")
    private String parentId;
    @ApiModelProperty(value = "父级名称", example = "父级名称")
    private String parentName;
    @ApiModelProperty(value = "状态", example = "1生效,0失效")
    private Integer status;
    @ApiModelProperty(value = "备注", example = "说明")
@ -105,4 +107,12 @@ public class MenuVO extends UuidIdentityVOWithOperator {
    public void setChildren(List<MenuVO> children) {
        this.children = children;
    }
    public String getParentName() {
        return parentName;
    }
    public void setParentName(String parentName) {
        this.parentName = parentName;
    }
}

+ 1 - 1
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/saas/SaasVO.java

@ -19,7 +19,7 @@ public class SaasVO extends UuidIdentityVOWithOperator {
	@ApiModelProperty(value = "机构编码", example = "495323X")
	private String orgCode;
	@ApiModelProperty(value = "系统名称", example = "厦门医疗服务")
	@ApiModelProperty(value = "租户名称", example = "厦门医疗服务")
	private String name;
	@ApiModelProperty(value = "状态", example = "auditPassed")
	private SaasDO.Status status;

+ 21 - 0
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/web/endpoint/EnvelopRestEndpoint.java

@ -1,11 +1,16 @@
package com.yihu.jw.restmodel.web.endpoint;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.jw.entity.base.doctor.BaseDoctorDO;
import com.yihu.jw.restmodel.web.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -332,4 +337,20 @@ public abstract class EnvelopRestEndpoint {
        return links.toString();
    }
    public String getUID() {
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String userAgent = request.getHeader("userAgent");
            if (StringUtils.isEmpty(userAgent)) {
                userAgent = request.getHeader("User-Agent");
            }
            JSONObject json = JSON.parseObject(userAgent);
            return json.getString("uid");
        } catch (Exception e) {
            return null;
        }
    }
}

+ 4 - 0
common/common-util/src/main/java/com/yihu/jw/util/wechat/WeiXinMessageUtils.java

@ -46,6 +46,10 @@ public class WeiXinMessageUtils {
    // 响应消息类型:图文
    public static final String RESP_MESSAGE_TYPE_NEWS = "news";
    //默认值
    public static final String RESP_MESSAGE_DEFAULT = "default";
//    public static BaseMessage messageProcess(){
//        BaseMessage message = null;
//

+ 4 - 0
server/svr-authentication/pom.xml

@ -105,6 +105,10 @@
            <artifactId>utils</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-rest-model</artifactId>
        </dependency>
    </dependencies>

+ 1 - 0
server/svr-authentication/src/main/java/com/yihu/jw/security/model/PublicKey.java

@ -1,6 +1,7 @@
package com.yihu.jw.security.model;
import java.io.Serializable;
import java.math.BigInteger;
/**
 * Model 公钥

+ 16 - 0
server/svr-authentication/src/main/java/com/yihu/jw/security/model/PublickeyVO.java

@ -0,0 +1,16 @@
package com.yihu.jw.security.model;
/**
 * Created by Trick on 2018/10/22.
 */
public class PublickeyVO {
    private String publicKey;
    public String getPublicKey() {
        return publicKey;
    }
    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }
}

+ 33 - 8
server/svr-authentication/src/main/java/com/yihu/jw/security/oauth2/provider/endpoint/WlyyLoginEndpoint.java

@ -1,15 +1,17 @@
package com.yihu.jw.security.oauth2.provider.endpoint;
import com.yihu.jw.restmodel.base.wx.WxTemplateConfigVO;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.security.core.userdetails.jdbc.WlyyUserDetailsService;
import com.yihu.jw.security.model.Captcha;
import com.yihu.jw.security.model.Oauth2Envelop;
import com.yihu.jw.security.model.PublicKey;
import com.yihu.jw.security.model.WlyyUserSimple;
import com.yihu.jw.security.model.*;
import com.yihu.jw.security.oauth2.core.redis.WlyyRedisVerifyCodeService;
import com.yihu.jw.security.oauth2.provider.WlyyTokenGranter;
import com.yihu.jw.security.oauth2.provider.error.WlyyOAuth2ExceptionTranslator;
import com.yihu.utils.security.RSAUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.collections.map.HashedMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -38,11 +40,14 @@ import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.text.SimpleDateFormat;
@ -119,8 +124,12 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
            parameters.put("grant_type", "password");
            //解密密码
            if (parameters.get("password") != null) {
                RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)httpSession.getAttribute("privateKey");
                parameters.put("password", RSAUtils.decryptByPrivateKey(new String(Base64.decodeBase64(parameters.get("password"))), rsaPrivateKey));
//                RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)httpSession.getAttribute("privateKey");
                KeyPair keyPair = (KeyPair)httpSession.getAttribute("privateKey");
//                parameters.put("password", RSAUtils.decryptByPrivateKey(parameters.get("password"), rsaPrivateKey));
                String password = com.yihu.jw.security.utils.RSAUtils.decryptBase64(parameters.get("password"),keyPair);
                parameters.put("password",password);
//                parameters.put("password", RSAUtils.decryptByPrivateKey(parameters.get("password"), rsaPrivateKey));
            }
        } else {
            parameters.put("grant_type", "captcha");
@ -244,8 +253,14 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
        RSAPublicKey rsaPublicKey = (RSAPublicKey) map.get("public");
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) map.get("private");
        PublicKey publicKey = new PublicKey();
        publicKey.setModulus(Base64.encodeBase64String(rsaPublicKey.getModulus().toByteArray()));
        publicKey.setExponent(Base64.encodeBase64String(rsaPublicKey.getPublicExponent().toByteArray()));
        publicKey.setModulus(rsaPublicKey.getModulus().toString(16));
        publicKey.setExponent(rsaPublicKey.getPublicExponent().toString(16));
//        publicKey.setModulus(Base64.encodeBase64String(rsaPublicKey.getModulus().toByteArray()));
//        publicKey.setExponent(Base64.encodeBase64String(rsaPublicKey.getPublicExponent().toByteArray()));
//        publicKey.setModulus(new String(Hex.encodeHex(rsaPublicKey.getModulus().toByteArray())));
//        publicKey.setExponent(new String(Hex.encodeHex(rsaPublicKey.getPublicExponent().toByteArray())));
        httpSession.setAttribute("privateKey", rsaPrivateKey);
        //生成Cookie
        Cookie cookie = new Cookie("oauth2", UUID.randomUUID().toString());
@ -259,6 +274,15 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
        return new ResponseEntity<>(oauth2Envelop, headers, HttpStatus.OK);
    }
    @RequestMapping(value = "/oauth/getPublicKey", method = RequestMethod.GET)
    public ObjEnvelop<PublickeyVO> getPublicKey(HttpSession httpSession, HttpServletResponse httpServletResponse){
        KeyPair keyPair =  com.yihu.jw.security.utils.RSAUtils.getKey();
        httpSession.setAttribute("privateKey", keyPair);
        PublickeyVO pk = new PublickeyVO();
        pk.setPublicKey(com.yihu.jw.security.utils.RSAUtils.generateBase64PublicKey(keyPair));
        return ObjEnvelop.getSuccess("success",pk);
    }
    /**
     * 获取验证码
     * @param parameters
@ -415,4 +439,5 @@ public class WlyyLoginEndpoint extends AbstractEndpoint {
        ResponseEntity<Oauth2Envelop> response = new ResponseEntity<>(authenticationFailed, headers, HttpStatus.OK);
        return response;
    }
}

+ 71 - 0
server/svr-authentication/src/main/java/com/yihu/jw/security/utils/RSAUtils.java

@ -0,0 +1,71 @@
package com.yihu.jw.security.utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
public class RSAUtils {
//    private static final KeyPair keyPair = initKey();
    public static KeyPair getKey(){
        try {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            SecureRandom random = new SecureRandom();
            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
            generator.initialize(1024, random);
            return generator.generateKeyPair();
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 生成public key
     * @return
     */
    public static String generateBase64PublicKey(KeyPair keyPair){
        RSAPublicKey key = (RSAPublicKey)keyPair.getPublic();
        return new String(Base64.encodeBase64(key.getEncoded()));
    }
    /**
     * 解密
     * @param string
     * @return
     */
    public static String decryptBase64(String string,KeyPair keyPair) {
        return new String(decrypt(Base64.decodeBase64(string),keyPair));
    }
    private static byte[] decrypt(byte[] string,KeyPair keyPair) {
        try {
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
            RSAPrivateKey pbk = (RSAPrivateKey)keyPair.getPrivate();
            cipher.init(Cipher.DECRYPT_MODE, pbk);
            byte[] plainText = cipher.doFinal(string);
            return plainText;
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
//    public static void main(String[] args) {
//
//        KeyPair keyPair =  initKey();
//        // 生成public key
//        System.out.println(generateBase64PublicKey(keyPair));
//
//        // 解密
//        System.out.println(decryptBase64("wAfY9JkoKay9SxcPIs1FcG+t6sR+wYwAs/mh9DpfcBraxzqoZdb9LyaAigzFQ0EKck9OyHL0dhv+Uxuw5hHw6CPT0B2Z0i1gwrjDUNaL1gWvqt1pDJVGrIYPLJSjs9xktFhY1jbxQgXGjyCt06Rwid5sJknw90AUO0CyQulfipg=",keyPair));
//    }
}

+ 4 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/contant/CommonContant.java

@ -10,6 +10,10 @@ public class CommonContant {
     * 默认父类id 0
     */
    public static final String DEFAULT_PARENTID = "0";
    /**
     * 默认父类无
     */
    public static final String DEFAULT_PARENTNAME = "无";
    //是否必选0-表示非必选,1-表示必选
    public static final String IS_MUST = "1";
}

+ 6 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/saas/SaasDao.java

@ -1,8 +1,11 @@
package com.yihu.jw.base.dao.saas;
import com.yihu.jw.entity.base.saas.SaasDO;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Dao - SAAS
 * Created by progr1mmer on 2018/8/14.
@ -14,4 +17,7 @@ public interface SaasDao extends PagingAndSortingRepository<SaasDO, String> {
    SaasDO findById(String id);
    SaasDO findByCreateUser(String createUser);
    @Query("from SaasDO  ")
    List<SaasDO> findList();
}

+ 2 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/saas/SaasTypeDictDao.java

@ -19,6 +19,8 @@ public interface SaasTypeDictDao extends PagingAndSortingRepository<SaasTypeDict
    SaasTypeDictDO findByCode(Integer code);
    List<SaasTypeDictDO> findListByStatus(SaasTypeDictDO.Status status);
    @Query("select Max(code) from SaasTypeDictDO ")
    Integer findTopCode();

+ 2 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxReplySceneDao.java

@ -25,5 +25,7 @@ public interface WxReplySceneDao extends PagingAndSortingRepository<WxReplyScene
    //点击事件,扫码事件,是否存在相同场景值
    List<WxReplySceneDO> findByWechatIdAndMsgTypeAndEventAndSceneAndStatus(String wechatId,String msgType,String event,String scene,Integer status);
    List<WxReplySceneDO> findByWechatIdAndDefaultReply(String wechatId,String defaultReply);
    List<WxReplySceneDO> findByAppOriginIdAndAndDefaultReply(String appOriginId,String defaultReply);
}

+ 4 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxTemplateConfigDao.java

@ -5,11 +5,15 @@ import com.yihu.jw.entity.base.wx.WxTemplateConfigDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Created by Trick on 2018/8/21.
 */
public interface WxTemplateConfigDao extends PagingAndSortingRepository<WxTemplateConfigDO, String>, JpaSpecificationExecutor<WxTemplateConfigDO> {
    WxTemplateConfigDO findByWechatIdAndTemplateNameAndSceneAndStatus(String wechatId, String templateName, String scene,Integer status);
    WxTemplateConfigDO findByWechatIdAndTemplateNameAndScene(String wechatId, String templateName, String scene);
    List<WxTemplateConfigDO> findByWechatIdAndScene(String wechatId,String scene);
}

+ 5 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/wx/WxTemplateDao.java

@ -18,4 +18,9 @@ public interface WxTemplateDao extends PagingAndSortingRepository<WxTemplateDO,
    @Query("from WxTemplateDO w where w.wechatId = ?1 and w.status =1")
    List<WxTemplateDO> findByWxId(String wechatId);
    List<WxTemplateDO> findByTemplateIdAndWechatIdAndStatus(String templateId,String wechatId,Integer status);
    List<WxTemplateDO> findByTemplateNameAndWechatIdAndStatus(String templateId,String wechatId,Integer status);
}

+ 27 - 8
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/module/ModuleEndpoint.java

@ -132,22 +132,41 @@ public class ModuleEndpoint extends EnvelopRestEndpoint {
    @ApiOperation(value = "获取列表")
    public ListEnvelop<ModuleVO> findAll (
            @ApiParam(name = "status", value = "状态")
            @RequestParam(value = "status", required = false) String status) throws Exception {
        String filters = null;
            @RequestParam(value = "status", required = false) String status,
            @ApiParam(name = "type", value = "类型")
            @RequestParam(value = "type", required = false) String type,
            @ApiParam(name = "name", value = "名称")
            @RequestParam(value = "name", required = false) String name) throws Exception {
        String filters = "";
        if(StringUtils.isNotBlank(status)){
            filters = "status="+status;
            filters = "status="+status+";";
        }
        List<ModuleDO> modules = moduleService.search(null, filters, null);
        if(StringUtils.isNotBlank(name)){
            filters += "name?"+name+";";
        }
        if(StringUtils.isNotBlank(type)){
            filters += "type="+type+";";
        }
        List<ModuleDO> modules = moduleService.search(null, filters, "-createTime");
        List<ModuleVO> moduleVOs = convertToModels(modules,new ArrayList<>(modules.size()),ModuleVO.class);
        moduleVOs.forEach(moduleVO -> {
            if(CommonContant.DEFAULT_PARENTID.equals(moduleVO.getParentId())){
                moduleVO.setParentName(CommonContant.DEFAULT_PARENTNAME);
            }else {
                ModuleDO moduleDO = moduleService.findOne(moduleVO.getParentId());
                moduleVO.setParentName(moduleDO.getName());
            }
        });
        Map<String,List<ModuleVO>> map = moduleVOs.stream().collect(Collectors.groupingBy(ModuleVO::getParentId));
        moduleVOs.forEach(module->{
            List<ModuleVO> tmp = map.get(module.getId());
            module.setChildren(tmp);
        });
        moduleVOs = moduleVOs.stream()
                .filter(module -> CommonContant.DEFAULT_PARENTID.equals(module.getParentId()))
                .collect(Collectors.toList());
        if(StringUtils.isBlank(name)) {
            moduleVOs = moduleVOs.stream()
                    .filter(module -> CommonContant.DEFAULT_PARENTID.equals(module.getParentId()))
                    .collect(Collectors.toList());
        }
        return success(moduleVOs);
    }

+ 53 - 8
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/role/MenuEndpoint.java

@ -127,19 +127,64 @@ public class MenuEndpoint extends EnvelopRestEndpoint {
    @GetMapping(value = BaseRequestMapping.Menu.LIST)
    @ApiOperation(value = "获取列表")
    public ListEnvelop<MenuVO> list (
            @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段")
            @RequestParam(value = "fields", required = false) String fields,
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档")
            @RequestParam(value = "sorts", required = false) String sorts) throws Exception {
        List<MenuDO> menuDOS = menuService.search(fields, filters, sorts);
            @ApiParam(name = "id", value = "id")
            @RequestParam(value = "id", required = false) String id) throws Exception {
        String filters = "";
        if(StringUtils.isNotBlank(id)){
            filters = "parentId="+id+";";
        }
        List<MenuDO> menuDOS = menuService.search(null, filters, "+sort");
        MenuDO menuDO = menuService.findOne(id);
        menuDOS.forEach(menu -> {
            if(CommonContant.DEFAULT_PARENTID.equals(menu.getParentId())){
                menu.setParentName(CommonContant.DEFAULT_PARENTNAME);
            }else {
                menu.setParentName(menuDO.getName());
            }
        });
        return success(menuDOS, MenuVO.class);
    }
    @GetMapping(value = BaseRequestMapping.Module.FIND_ALL)
    @GetMapping(value = BaseRequestMapping.Menu.FIND_ALL)
    @ApiOperation(value = "获取列表")
    public ListEnvelop<MenuVO> findAll (
            @ApiParam(name = "status", value = "状态")
            @RequestParam(value = "status", required = false) String status,
            @ApiParam(name = "name", value = "名称")
            @RequestParam(value = "name", required = false) String name) throws Exception {
        String filters = "";
        if(StringUtils.isNotBlank(status)){
            filters = "status="+status+";";
        }
        if(StringUtils.isNotBlank(name)){
            filters += "name?"+name+";";
        }
        List<MenuDO> menuDOs = menuService.search(null, filters, "+sort");
        List<MenuVO> menuVOs = convertToModels(menuDOs,new ArrayList<>(menuDOs.size()), MenuVO.class);
        menuVOs.forEach(menuVO -> {
            if(CommonContant.DEFAULT_PARENTID.equals(menuVO.getParentId())){
                menuVO.setParentName(CommonContant.DEFAULT_PARENTNAME);
            }else {
                MenuDO menuDO = menuService.findOne(menuVO.getParentId());
                menuVO.setParentName(menuDO.getName());
            }
        });
        Map<String,List<MenuVO>> map = menuVOs.stream().collect(Collectors.groupingBy(MenuVO::getParentId));
        menuVOs.forEach(menu->{
            List<MenuVO> tmp = map.get(menu.getId());
            menu.setChildren(tmp);
        });
        if(StringUtils.isBlank(name)){
            menuVOs = menuVOs.stream()
                    .filter(menu -> CommonContant.DEFAULT_PARENTID.equals(menu.getParentId()))
                    .collect(Collectors.toList());
        }
        return success(menuVOs);
    }
    @GetMapping(value = BaseRequestMapping.Menu.GET_TREE)
    @ApiOperation(value = "获取列表")
    public ListEnvelop<MenuVO> getTree (
            @ApiParam(name = "status", value = "状态")
            @RequestParam(value = "status", required = false) String status) throws Exception {
        String filters = null;

+ 10 - 6
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/saas/SaasEndpoint.java

@ -95,9 +95,9 @@ public class SaasEndpoint extends EnvelopRestEndpoint {
    @PostMapping(value = BaseRequestMapping.Saas.SYSTEM_CONFIGURATION)
    @ApiOperation(value = "创建-系统配置")
    public Envelop createSystemConfig (
            @ApiParam(name = "saasDO", value = "Json数据", required = true)
            @RequestParam(value = "saasDO") SaasDO saasDO) throws Exception {
            @ApiParam(name = "jsonSaas", value = "租户数据", required = true)
            @RequestParam String jsonSaas) throws Exception {
        SaasDO saasDO = toEntity(jsonSaas, SaasDO.class);
        saasService.saveSystemConfig(saasDO);
        return success("创建成功",saasDO);
    }
@ -105,9 +105,9 @@ public class SaasEndpoint extends EnvelopRestEndpoint {
    @PostMapping(value = BaseRequestMapping.Saas.THEME_STYLE)
    @ApiOperation(value = "创建-主题风格")
    public Envelop createThemeConfig (
            @ApiParam(name = "saasDO", value = "Json数据", required = true)
            @RequestParam(value = "saasDO") SaasDO saasDO) throws Exception {
            @ApiParam(name = "jsonSaas", value = "租户数据", required = true)
            @RequestParam String jsonSaas) throws Exception {
        SaasDO saasDO = toEntity(jsonSaas, SaasDO.class);
        saasService.createThemeConfig(saasDO);
        return success("创建成功");
    }
@ -184,6 +184,10 @@ public class SaasEndpoint extends EnvelopRestEndpoint {
            @ApiParam(name = "size", value = "页码", required = true, defaultValue = "15")
            @RequestParam(value = "size") int size) throws Exception {
        List<SaasDO> saasDOS = saasService.search(fields, filters, sorts, page, size);
        saasDOS.forEach(saas->{
            SaasTypeDictDO saasTypeDictDO = saasTypeDictService.findById(saas.getType());
            saas.setTypeName(saasTypeDictDO.getName());
        });
        int count = (int)saasService.getCount(filters);
        return success(saasDOS, count, page, size, SaasVO.class);
    }

+ 3 - 1
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/system/SystemDictEndpoint.java

@ -101,6 +101,8 @@ public class SystemDictEndpoint extends EnvelopRestEndpoint {
    public ListEnvelop queryDictBySaasId(
            @ApiParam(name = "saasId", value = "saasId")
            @RequestParam(value = "saasId", required = true) String saasId,
            @ApiParam(name = "name", value = "字典名称")
            @RequestParam(value = "name", required = false) String name,
            @ApiParam(name = "type", value = "字典类型")
            @RequestParam(value = "type", required = true) String type,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档")
@ -110,7 +112,7 @@ public class SystemDictEndpoint extends EnvelopRestEndpoint {
            @ApiParam(name = "size", value = "页码", required = true, defaultValue = "15")
            @RequestParam(value = "size") int size
    ) throws Exception {
        JSONArray list = systemDictService.getDistListBySaasId(type,saasId,sorts,page,size);
        JSONArray list = systemDictService.getDistListBySaasId(type,saasId,name,sorts,page,size);
        return success(list);
    }

+ 7 - 1
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/system/SystemDictEntryEndpoint.java

@ -12,6 +12,7 @@ import com.yihu.jw.rm.base.BaseRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@ -65,8 +66,10 @@ public class SystemDictEntryEndpoint extends EnvelopRestEndpoint {
    @GetMapping(value = BaseRequestMapping.SystemDictEntry.PAGE_SAASID)
    @ApiOperation(value = "获取分页")
    public PageEnvelop<SystemDictEntryVO> pageSaasId (
            @ApiParam(name = "saasId", value = "true")
            @ApiParam(name = "saasId", value = "saasId")
            @RequestParam(value = "saasId", required = true) String saasId,
            @ApiParam(name = "value", value = "请输入字典代码或值查询")
            @RequestParam(value = "value", required = false) String value,
            @ApiParam(name = "dictCode", value = "字典code")
            @RequestParam(value = "dictCode", required = true) String dictCode,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档")
@ -78,6 +81,9 @@ public class SystemDictEntryEndpoint extends EnvelopRestEndpoint {
        StringBuilder filters = new StringBuilder();
        filters.append("saasId=").append(saasId).append(";")
                .append("dictCode=").append(dictCode).append(";");
        if(StringUtils.isNotBlank(value)){
            filters.append("code?").append(value).append(" g1;").append("value?").append(value).append(" g1;");
        }
        List<SystemDictEntryDO> systemDictEntryDOS = systemDictEntryService.search(null, filters.toString(), sorts, page, size);
        int count = (int)systemDictEntryService.getCount(filters.toString());
        return success(systemDictEntryDOS, count, page, size, SystemDictEntryVO.class);

+ 57 - 3
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/wx/WechatController.java

@ -2,6 +2,7 @@ package com.yihu.jw.base.endpoint.wx;
import com.alibaba.fastjson.JSONArray;
import com.yihu.jw.base.service.wx.WechatService;
import com.yihu.jw.base.service.wx.WxTemplateService;
import com.yihu.jw.entity.base.wx.*;
import com.yihu.jw.restmodel.base.wx.*;
import com.yihu.jw.restmodel.web.Envelop;
@ -9,10 +10,12 @@ import com.yihu.jw.restmodel.web.MixEnvelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.rm.base.WechatRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -27,6 +30,8 @@ public class WechatController extends EnvelopRestEndpoint {
    @Autowired
    private WechatService wechatService;
    @Autowired
    private WxTemplateService wxTemplateService;
    //====================微信与租户管理=======================
@ -199,6 +204,13 @@ public class WechatController extends EnvelopRestEndpoint {
    }
    @PostMapping(value = BaseRequestMapping.WeChat.findDefaultReply)
    @ApiOperation(value = "获取默认事件配置", notes = "获取默认事件配置")
    public ObjEnvelop<WxReplySceneVO> findDefaultReply(@ApiParam(name = "wechatId", value = "事件配置json")
                                                       @RequestParam(value = "wechatId", required = true)String wechatId) {
        return success(wechatService.findDefaultReply(wechatId),WxReplySceneVO.class);
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxReplySceneExist)
    @ApiOperation(value = "验证事件配置是否存在", notes = "验证事件配置是否存在")
    public Envelop findWxReplySceneExist(@ApiParam(name = "wechatId", value = "微信id")
@ -224,11 +236,13 @@ public class WechatController extends EnvelopRestEndpoint {
                                                                      @RequestParam(value = "event", required = false)String event,
                                                                      @ApiParam(name = "content", value = "回复内容")
                                                                      @RequestParam(value = "content", required = false)String content,
                                                                      @ApiParam(name = "status", value = "删除状态")
                                                                      @RequestParam(value = "status", required = true)Integer status,
                                                                      @ApiParam(name = "page", value = "页数")
                                                                      @RequestParam(value = "page", required = true)Integer page,
                                                                      @ApiParam(name = "size", value = "每页大小")
                                                                      @RequestParam(value = "size", required = true)Integer size) {
        return wechatService.findWxReplyScene(wechatId, msgType, event, content, page, size);
        return wechatService.findWxReplyScene(wechatId, msgType, event, content,status, page, size);
    }
    //====================图文素材管理end============================
@ -242,6 +256,27 @@ public class WechatController extends EnvelopRestEndpoint {
        return wechatService.saveWxTemp(wxTemplate);
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxTempExist)
    @ApiOperation(value = "判断微信模板(模板id且模板名称)是否存在", notes = "判断微信模板(模板id且模板名称)是否存在")
    public Envelop findWxTempExist(@ApiParam(name = "wechatId", value = "微信id")
                                   @RequestParam(value = "wechatId", required = true)String wechatId,
                                   @ApiParam(name = "templateName", value = "微信模板名称")
                                   @RequestParam(value = "templateName", required = true)String templateName,
                                   @ApiParam(name = "templateId", value = "微信模板id(微信的同步的id)")
                                   @RequestParam(value = "templateId", required = true)String templateId) {
       return success(BaseRequestMapping.WeChat.api_success,wechatService.findWxTempExist(wechatId,templateId,templateName));
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxTempNameExist)
    @ApiOperation(value = "判断微信模板(模板名称)是否存在", notes = "判断微信模板(模板名称)是否存在")
    public Envelop findWxTempNameExist(@ApiParam(name = "wechatId", value = "微信id")
                                       @RequestParam(value = "wechatId", required = true)String wechatId,
                                       @ApiParam(name = "templateName", value = "微信模板名称")
                                       @RequestParam(value = "templateName", required = true)String templateName) {
        return success(BaseRequestMapping.WeChat.api_success,wechatService.findWxTempNameExist(wechatId,templateName));
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxtemp)
    @ApiOperation(value = "获取微信模板消息基础信息(列表)", notes = "获取微信模板消息基础信息(列表)")
    public MixEnvelop<WxTemplateVO,WxTemplateVO> findWxtemp(@ApiParam(name = "wechatId", value = "微信id")
@ -272,14 +307,18 @@ public class WechatController extends EnvelopRestEndpoint {
    public MixEnvelop<WxTemplateConfigVO,WxTemplateConfigVO> findWxTempConfigList(@ApiParam(name = "wechatId", value = "微信id")
                                                                                  @RequestParam(value = "wechatId", required = true)String wechatId,
                                                                                  @ApiParam(name = "scene", value = "微信场景值")
                                                                                  @RequestParam(value = "scene", required = true)String scene,
                                                                                  @RequestParam(value = "scene", required = false)String scene,
                                                                                  @ApiParam(name = "templateId", value = "微信公众号模板id")
                                                                                  @RequestParam(value = "templateId", required = false)String templateId,
                                                                                  @ApiParam(name = "page", value = "第几页")
                                                                                  @RequestParam(value = "page", required = true)Integer page,
                                                                                  @ApiParam(name = "size", value = "分页大小")
                                                                                  @RequestParam(value = "size", required = true)Integer size) {
        return wechatService.findWxTempConfigList(wechatId, scene, page, size);
        return wechatService.findWxTempConfigList(wechatId,templateId,scene, page, size);
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxTemplateConfig)
    @ApiOperation(value = "获取微信模板列表(单条)", notes = "获取微信模板列表(单条)")
    public ObjEnvelop<WxTemplateConfigVO>  findWxTemplateConfig(@ApiParam(name = "wechatId", value = "微信id")
@ -289,7 +328,22 @@ public class WechatController extends EnvelopRestEndpoint {
                                                                @ApiParam(name = "scene", value = "场景值")
                                                                @RequestParam(value = "scene", required = true)String scene) {
        return success(wechatService.findWxTemplateConfig(wechatId,name,scene), WxTemplateConfigVO.class);
    }
    @GetMapping(value = BaseRequestMapping.WeChat.findWxTemplateConfigExist)
    @ApiOperation(value = "判断微信配置模板场景值是否存在", notes = "判断微信配置模板场景值是否存在(单条)")
    public Envelop findWxTemplateConfigExist(@ApiParam(name = "wechatId", value = "微信id")
                                             @RequestParam(value = "wechatId", required = true)String wechatId,
                                             @ApiParam(name = "scene", value = "场景值")
                                             @RequestParam(value = "scene", required = true)String scene) {
        return success(BaseRequestMapping.WeChat.api_success,wechatService.findWxTemplateConfigExist(wechatId,scene));
    }
    @PostMapping(value = BaseRequestMapping.WeChat.getAllTemp)
    @ApiOperation(value = "获取所有微信模板(微信拉取)", notes = "获取所有微信模板(微信拉取)")
    public Envelop getAllTemp(@ApiParam(name = "wechatId", value = "微信id")
                              @RequestParam(value = "wechatId", required = true)String wechatId) {
        return wxTemplateService.getAllTemp(wechatId);
    }
    //===================模板消息end==========================================

+ 2 - 1
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/wx/WxTemplateController.java

@ -1,6 +1,7 @@
package com.yihu.jw.base.endpoint.wx;
import com.yihu.jw.base.service.wx.WxTemplateService;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.base.WechatRequestMapping;
import io.swagger.annotations.Api;
@ -30,7 +31,7 @@ public class WxTemplateController extends EnvelopRestEndpoint {
    @PostMapping(value = WechatRequestMapping.WxTemplate.api_getAllTemplate, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "获取所有微信模板", notes = "获取所有微信模板")
    public String  getAllTemp(String wechatId) {
    public Envelop getAllTemp(String wechatId) {
        return wxTemplateService.getAllTemp(wechatId);
    }

+ 15 - 12
svr/svr-base/src/main/java/com/yihu/jw/base/service/module/ModuleService.java

@ -84,10 +84,9 @@ public class ModuleService extends BaseJpaService<ModuleDO, ModuleDao> {
            }
            //租户类型
            Iterable<SaasTypeDictDO> saasTypeDictDOs = saasTypeDictDao.findAll();
            List<SaasTypeDictDO> saasTypeDictDOs = saasTypeDictDao.findListByStatus(SaasTypeDictDO.Status.effective);
            List<SaasTypeModuleDO> saasTypeModuleDOList = new ArrayList<>(16);
            while (saasTypeDictDOs.iterator().hasNext()){
                SaasTypeDictDO saasTypeDictDO = saasTypeDictDOs.iterator().next();
            for (SaasTypeDictDO saasTypeDictDO : saasTypeDictDOs) {
                SaasTypeModuleDO saasTypeModuleDO = new SaasTypeModuleDO();
                saasTypeModuleDO.setCreateTime(new Date());
                saasTypeModuleDO.setDel(moduleDO.getDel());
@ -128,10 +127,9 @@ public class ModuleService extends BaseJpaService<ModuleDO, ModuleDao> {
            saasTypeModuleDao.save(saasTypeModuleDOList);
            //租户
            Iterable<SaasDO> saasDOs = saasDao.findAll();
            Iterable<SaasDO> saasDOs = saasDao.findList();
            List<SaasModuleDO> saasModuleDOList = new ArrayList<>(16);
            while (saasDOs.iterator().hasNext()){
                SaasDO saasDO = saasDOs.iterator().next();
            for (SaasDO saasDO : saasDOs) {
                SaasModuleDO saasModuleDO = new SaasModuleDO();
                saasModuleDO.setCreateTime(new Date());
                saasModuleDO.setDel(moduleDO.getDel());
@ -197,14 +195,16 @@ public class ModuleService extends BaseJpaService<ModuleDO, ModuleDao> {
     * @param moduleDO
     */
    public void available(ModuleDO moduleDO){
        moduleDO.setStatus(ModuleDO.Status.unAvailable.getValue());
        moduleDO.setStatus(ModuleDO.Status.available.getValue());
        moduleDao.save(moduleDO);
        addSubModule(moduleDO);
        ModuleDO parentModule = moduleDao.findOne(moduleDO.getParentId());
        if(ModuleDO.Status.unAvailable.getValue().equals(parentModule.getStatus())){
            available(moduleDO);
        if(!CommonContant.DEFAULT_PARENTID.equals(moduleDO.getParentId())){
            ModuleDO parentModule = moduleDao.findOne(moduleDO.getParentId());
            if(ModuleDO.Status.available.getValue().equals(parentModule.getStatus())){
                available(parentModule);
            }
        }
    }
@ -224,8 +224,8 @@ public class ModuleService extends BaseJpaService<ModuleDO, ModuleDao> {
        //把子类失效
        List<ModuleDO> moduleDOList = moduleDao.findByParentId(moduleDO.getId());
        moduleDOList.forEach(module->{
            if(ModuleDO.Status.available.getValue().equals(module.getStatus())){
                unavailable(moduleDO);
            if(ModuleDO.Status.unAvailable.getValue().equals(module.getStatus())){
                unavailable(module);
            }
        });
    }
@ -239,4 +239,7 @@ public class ModuleService extends BaseJpaService<ModuleDO, ModuleDao> {
        return moduleDao.isExistName(name);
    }
    public ModuleDO findOne(String id){
        return moduleDao.findOne(id);
    }
}

+ 6 - 13
svr/svr-base/src/main/java/com/yihu/jw/base/service/org/BaseOrgService.java

@ -1,34 +1,27 @@
package com.yihu.jw.base.service.org;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;
import com.google.gson.JsonObject;
import com.yihu.jw.base.dao.org.BaseOrgDao;
import com.yihu.jw.base.dao.org.OrgTreeDao;
import com.yihu.jw.base.dao.user.UserDao;
import com.yihu.jw.base.dao.user.UserRoleDao;
import com.yihu.jw.base.service.org.tree.SimpleTree;
import com.yihu.jw.base.service.org.tree.SimpleTreeNode;
import com.yihu.jw.base.service.org.tree.Tree;
import com.yihu.jw.base.service.org.tree.TreeNode;
import com.yihu.jw.base.service.user.UserRoleService;
import com.yihu.jw.base.service.user.UserService;
import com.yihu.jw.base.util.ConstantUtils;
import com.yihu.jw.entity.base.org.BaseOrgDO;
import com.yihu.jw.entity.base.user.UserDO;
import com.yihu.jw.entity.base.user.UserRoleDO;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.mysql.query.BaseJpaService;
import com.yihu.utils.security.MD5;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import com.yihu.jw.entity.base.org.BaseOrgDO;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * 
@ -173,7 +166,7 @@ public class BaseOrgService extends BaseJpaService<BaseOrgDO, BaseOrgDao> {
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
        filter.getExcludes().add("parent");
        filter.getExcludes().add("allChildren");
        filter.getExcludes().add("parentNodeId");
//        filter.getExcludes().add("parentNodeId");
        filter.getExcludes().add("orderNum");
        filter.getExcludes().add("level");
@ -192,7 +185,7 @@ public class BaseOrgService extends BaseJpaService<BaseOrgDO, BaseOrgDao> {
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
        filter.getExcludes().add("parent");
        filter.getExcludes().add("allChildren");
        filter.getExcludes().add("parentNodeId");
//        filter.getExcludes().add("parentNodeId");
        filter.getExcludes().add("orderNum");
        filter.getExcludes().add("level");

+ 4 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/service/role/MenuService.java

@ -87,4 +87,8 @@ public class MenuService extends BaseJpaService<MenuDO, MenuDao> {
    public int isExistName(String name){
        return menuDao.isExistName(name);
    }
    public MenuDO findOne(String id){
        return menuDao.findOne(id);
    }
}

+ 1 - 1
svr/svr-base/src/main/java/com/yihu/jw/base/service/system/SystemDictService.java

@ -60,7 +60,7 @@ public class SystemDictService extends BaseJpaService<SystemDictDO, SystemDictDa
     * @param saasId
     * @return
     */
    public JSONArray getDistListBySaasId(String type, String saasId, String sorts, int page, int size) throws Exception {
    public JSONArray getDistListBySaasId(String type, String saasId,String name, String sorts, int page, int size) throws Exception {
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        if (SystemDictEnum.Icd10Dict == SystemDictEnum.valueOf(type)) {

+ 5 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WechatCoreService.java

@ -267,6 +267,11 @@ public class WechatCoreService {
                    return getGraphicXMl(scene.getScene(),scene.getWechatId(),message);
                }
            }
            //如果都没有发送默认消息
            List<WxReplySceneDO> list = wxReplySceneDao.findByAppOriginIdAndAndDefaultReply(toUserName,WeiXinMessageUtils.RESP_MESSAGE_DEFAULT);
            WxReplySceneDO wxReplySceneDO = list.get(0);
            return getGraphicXMl(wxReplySceneDO.getScene(),wxReplySceneDO.getWechatId(),message);
        }
        return null;

+ 65 - 4
svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WechatService.java

@ -7,6 +7,8 @@ import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.MixEnvelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.util.wechat.WeiXinMessageReplyUtils;
import com.yihu.jw.util.wechat.WeiXinMessageUtils;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -331,10 +333,25 @@ public class WechatService {
    }
    public Envelop saveWxReplyScene(WxReplySceneDO wxReplySceneDO){
        if(StringUtils.isNotBlank(wxReplySceneDO.getDefaultReply())){
           List<WxReplySceneDO> list = wxReplySceneDao.findByWechatIdAndDefaultReply(wxReplySceneDO.getWechatId(),wxReplySceneDO.getDefaultReply());
            if(list!=null&&list.size()>0){
                wxReplySceneDao.delete(list);
            }
        }
        wxReplySceneDao.save(wxReplySceneDO);
        return Envelop.getSuccess(BaseRequestMapping.WeChat.api_success);
    }
    public WxReplySceneDO findDefaultReply(String wechatId){
        List<WxReplySceneDO> list = wxReplySceneDao.findByWechatIdAndDefaultReply(wechatId, WeiXinMessageUtils.RESP_MESSAGE_DEFAULT);
        if(list!=null&&list.size()>0){
            return list.get(0);
        }
       return null;
    }
    public Map<String,Object> findWxReplySceneExist(String wechatId,String msgType,String event,String content,String scene){
        Map<String,Object> map = new HashedMap();
@ -374,13 +391,14 @@ public class WechatService {
        return map;
    }
    public MixEnvelop findWxReplyScene(String wechatId,String msgType,String event,String content,Integer page,Integer size){
    public MixEnvelop findWxReplyScene(String wechatId,String msgType,String event,String content,Integer status,Integer page,Integer size){
        String totalSql = "SELECT " +
                " COUNT(1) AS total " +
                " FROM " +
                " wx_reply_scene s " +
                " WHERE " +
                " s.wechat_id = '"+wechatId+"'";
                " s.wechat_id = '"+wechatId+"' " +
                " AND s.default_Reply is null ";
        if(StringUtils.isNotBlank(msgType)){
            totalSql += " AND s.msg_type ='"+msgType+"'";
        }
@ -390,6 +408,9 @@ public class WechatService {
        if(StringUtils.isNotBlank(content)){
            totalSql += " AND s.content like '%"+content+"%'";
        }
        if(status!=null){
            totalSql += " AND s.status = "+status;
        }
        List<Map<String, Object>> rstotal = jdbcTemplate.queryForList(totalSql);
        Long count = 0L;
        if (rstotal != null && rstotal.size() > 0) {
@ -409,7 +430,8 @@ public class WechatService {
                " FROM " +
                " wx_reply_scene s " +
                " WHERE " +
                " s.wechat_id = '"+wechatId+"'";
                " s.wechat_id = '"+wechatId+"'" +
                " AND s.default_Reply is null ";
        if(StringUtils.isNotBlank(msgType)){
            sql += " AND s.msg_type ='"+msgType+"'";
        }
@ -419,12 +441,16 @@ public class WechatService {
        if(StringUtils.isNotBlank(content)){
            sql += " AND s.content like '%"+content+"%'";
        }
        if(status!=null){
            sql += " AND s.status = "+status;
        }
        sql+=" LIMIT  " + (page - 1) * size + "," + size + "";
        List<WxReplySceneVO> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper(WxReplySceneVO.class));
        return MixEnvelop.getSuccessListWithPage(BaseRequestMapping.WeChat.api_success, list, page, size, count);
    }
    //===================图文素材管理end====================================
    //===================模板消息==========================================
@ -434,6 +460,26 @@ public class WechatService {
        return Envelop.getSuccess(BaseRequestMapping.WeChat.api_success);
    }
    public Boolean findWxTempExist(String wechatId,String templateId,String templateName){
        List<WxTemplateDO> list = wxTemplateDao.findByTemplateIdAndWechatIdAndStatus(templateId,wechatId,1);
        if(list!=null&&list.size()>0){
            return true;
        }
        List<WxTemplateDO> list2 = wxTemplateDao.findByTemplateNameAndWechatIdAndStatus(templateName,wechatId,1);
        if(list2!=null&&list2.size()>0){
            return true;
        }
        return false;
    }
    public Boolean findWxTempNameExist(String wechatId,String templateName){
        List<WxTemplateDO> list2 = wxTemplateDao.findByTemplateNameAndWechatIdAndStatus(templateName,wechatId,1);
        if(list2!=null&&list2.size()>0){
            return true;
        }
        return false;
    }
    public MixEnvelop findWxtemp(String wechatId,Integer status,String name,String key,Integer page,Integer size){
        String totalSql = "SELECT " +
                " COUNT(1) AS total " +
@ -485,7 +531,7 @@ public class WechatService {
        return Envelop.getSuccess(BaseRequestMapping.WeChat.api_success);
    }
    public MixEnvelop findWxTempConfigList(String wechatId,String scene,Integer page,Integer size){
    public MixEnvelop findWxTempConfigList(String wechatId,String templateId,String scene,Integer page,Integer size){
        String totalSql ="SELECT " +
                " COUNT(1) AS total " +
                " FROM " +
@ -495,6 +541,9 @@ public class WechatService {
        if(StringUtils.isNotBlank(scene)){
            totalSql += " AND g.scene = '"+scene+"'";
        }
        if(StringUtils.isNotBlank(templateId)){
            totalSql += " AND g.template_id = '"+templateId+"'";
        }
        List<Map<String, Object>> rstotal = jdbcTemplate.queryForList(totalSql);
        Long count = 0L;
        if (rstotal != null && rstotal.size() > 0) {
@ -531,6 +580,9 @@ public class WechatService {
        if(StringUtils.isNotBlank(scene)){
            sql += " AND g.scene = '"+scene+"'";
        }
        if(StringUtils.isNotBlank(templateId)){
            sql += " AND g.template_id = '"+templateId+"'";
        }
        sql+=" LIMIT  " + (page - 1) * size + "," + size + "";
        List<WxTemplateConfigVO> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper(WxTemplateConfigVO.class));
        return MixEnvelop.getSuccessListWithPage(BaseRequestMapping.WeChat.api_success, list, page, size, count);
@ -540,6 +592,15 @@ public class WechatService {
        WxTemplateConfigDO wxTemplateConfigDO =  wxTemplateConfigDao.findByWechatIdAndTemplateNameAndScene(wechatId,name,scene);
        return wxTemplateConfigDO;
    }
    public Boolean findWxTemplateConfigExist(String wechatId,String scene){
        List<WxTemplateConfigDO> list =  wxTemplateConfigDao.findByWechatIdAndScene(wechatId,scene);
        if(list!=null&&list.size()>0){
            return true;
        }
        return false;
    }
    //===================模板消息end=======================================
    //===================微信统计==========================================

+ 56 - 3
svr/svr-base/src/main/java/com/yihu/jw/base/service/wx/WxTemplateService.java

@ -1,8 +1,15 @@
package com.yihu.jw.base.service.wx;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.jw.base.dao.wx.WxTemplateConfigDao;
import com.yihu.jw.base.dao.wx.WxTemplateDao;
import com.yihu.jw.entity.base.wx.WxTemplateConfigDO;
import com.yihu.jw.entity.base.wx.WxTemplateDO;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.rm.base.WechatRequestMapping;
import com.yihu.jw.util.wechat.WeixinMessagePushUtils;
import com.yihu.jw.util.wechat.wxhttp.HttpUtil;
import org.slf4j.Logger;
@ -10,6 +17,10 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * Created by Administrator on 2017/5/19 0019.
 */
@ -20,6 +31,8 @@ public class WxTemplateService {
    @Autowired
    private WxTemplateConfigDao wxTemplateConfigDao;
    @Autowired
    private WxTemplateDao wxTemplateDao;
    @Autowired
    private WxAccessTokenService wxAccessTokenService;
@ -28,20 +41,60 @@ public class WxTemplateService {
    private WeixinMessagePushUtils weixinMessagePushUtils;
    public String sendWeTempMesTest(String wechatId,String openid)throws Exception{
        WxTemplateConfigDO config = wxTemplateConfigDao.findByWechatIdAndTemplateNameAndScene(wechatId,"template_survey","test");
        WxTemplateConfigDO config = wxTemplateConfigDao.findByWechatIdAndTemplateNameAndSceneAndStatus(wechatId,"template_survey","test",1);
        config.setFirst(config.getFirst().replace("key1","小明"));
        config.setKeyword2("2018-08-21");
        weixinMessagePushUtils.putWxMsg(wxAccessTokenService.getWxAccessTokenById(wechatId).getAccessToken(),openid,config);
        return "success";
    }
    public String  getAllTemp(String wechatId){
    public Envelop getAllTemp(String wechatId){
        String url ="https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token="+wxAccessTokenService.getWxAccessTokenById(wechatId).getAccessToken();
        String result = HttpUtil.sendGet(url);
        return result;
        JSONObject tempJsons = JSON.parseObject(result);
        //获取所有本地模板
        List<String> localTemps = findAllTempDos(wechatId);
        //解析公众号模板
        JSONArray temps = tempJsons.getJSONArray("template_list");
        List<WxTemplateDO> savelist = new ArrayList<>();
        if(temps!=null&&!temps.isEmpty()){
            for(int i=0;i<temps.size();i++){
                JSONObject tp = (JSONObject) temps.get(i);
                String tpid = tp.getString("template_id");
                if(!localTemps.contains(tpid)){
                    WxTemplateDO wxTemplateDO = new WxTemplateDO();
                    wxTemplateDO.setWechatId(wechatId);
                    wxTemplateDO.setTemplateId(tpid);
                    wxTemplateDO.setTitle(tp.getString("title"));
                    wxTemplateDO.setContent(tp.getString("content"));
                    wxTemplateDO.setStatus(1);
                    wxTemplateDO.setCreateTime(new Date());
                    savelist.add(wxTemplateDO);
                }
            }
            wxTemplateDao.save(savelist);
        }
        return Envelop.getSuccess(BaseRequestMapping.WeChat.api_success);
    }
    public List<String> findAllTempDos(String wechatId){
        List<WxTemplateDO> list =  wxTemplateDao.findByWxId(wechatId);
        List<String> rs = new ArrayList<>();
        if(list!=null&&list.size()>0){
            for(WxTemplateDO wxTemplateDO:list){
                rs.add(wxTemplateDO.getTemplateId());
            }
        }
        return rs;
    }
//    public WxTemplateDO createWxTemplate(WxTemplateDO wxTemplate) {
//        if (StringUtils.isEmpty(wxTemplate.getTemplateId())) {

+ 30 - 20
svr/svr-iot/src/main/java/com/yihu/iot/controller/analyzer/IotAnalyzerController.java

@ -3,26 +3,23 @@ package com.yihu.iot.controller.analyzer;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.fastdfs.FastDFSUtil;
import com.yihu.iot.datainput.service.DataInputService;
import com.yihu.iot.datainput.util.ConstantUtils;
import com.yihu.iot.service.company.IotCompanyCertificateService;
import com.yihu.iot.service.company.IotCompanyService;
import com.yihu.jw.exception.ApiException;
import com.yihu.jw.restmodel.iot.company.IotCompanyVO;
import com.yihu.jw.restmodel.iot.device.IotOrderVO;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.MixEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.iot.DataRequestMapping;
import com.yihu.jw.rm.iot.IotRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
@ -43,27 +40,33 @@ public class IotAnalyzerController extends EnvelopRestEndpoint {
    @Autowired
    ObjectMapper objectMapper;
    @Autowired
    private FastDFSUtil fastDFSHelper;
    @Value("${fastDFS.fastdfs_file_url}")
    private String fastDfsPublicServers;
    /**
     * 基于奕拓小屋上传的体征数据,进行解析入库
     * @param dataJson
     * @param jsonData
     * @return
     */
    @GetMapping(value = "/yitouxiaowu")
    @ApiOperation(value = "基于传入的JSON串采集数据,进行解析并入库", notes = "JSON串采集数据解析入库")
    public String findCompanyPage(
            @ApiParam(name = "dataJson", value = "采集数据JSON串", defaultValue = "")
            @RequestParam(value = "dataJson", required = false) String dataJson){
    @PostMapping(value = "/yitouxiaowu" ,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "奕拓体征数据解析入库", notes = "奕拓体征数据解析入库")
    public String updateDeviceDataTest(
            @ApiParam(name = "json_data", value = "Json数据", required = true)
            @RequestBody String jsonData){
        Envelop envelop = new Envelop();
        String str = "";
        String strResult = "";
        //1. 基础数据初始化
        String accessToken  = "yitouxiaowu";  // 奕拓小屋
        try {
            //JSON数据解析
            Map dataDetail = objectMapper.readValue(dataJson, HashMap.class);
            Map dataDetail = objectMapper.readValue(jsonData, HashMap.class);
            // 用户信息
            LinkedHashMap memberMap = (LinkedHashMap)dataDetail.get("Member");
            // 身高体重
@ -188,6 +191,13 @@ public class IotAnalyzerController extends EnvelopRestEndpoint {
            if (ecgMap != null) {
                data.put("ecg",ecgMap.get("Hr") == null? "": ecgMap.get("Hr").toString());
                data.put("ecg_unit","次/分");
                if(!(ecgMap.get("EcgImg") == null)){
                    String ecgData = ecgMap.get("EcgImg").toString();
                    byte[] imgByte = Base64.decodeBase64(ecgData);
                    ObjectNode objectNode = fastDFSHelper.upload(imgByte,"png","");
                    String resPath = fastDfsPublicServers + objectNode.get("fileId").toString().replaceAll("\"", "");
                    data.put("filepath",resPath);
                }
            }
            data.put("hbalc","");
            data.put("hbalc_unit","");