提交 b06a1a36 编写于 作者: X xinlaa

Merge branch 'master' of https://gitee.com/LinkWeChat/link-wechat into master

package com.linkwechat.web.controller.system;
import java.util.List;
import java.util.Set;
import com.linkwechat.wecom.client.WeAccessTokenClient;
import com.linkwechat.wecom.domain.WeCorpAccount;
import com.linkwechat.wecom.domain.dto.WeLoginUserInfoDto;
import com.linkwechat.wecom.service.IWeAccessTokenService;
import com.linkwechat.wecom.service.IWeCorpAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.linkwechat.common.constant.Constants;
import com.linkwechat.common.core.domain.AjaxResult;
import com.linkwechat.common.core.domain.entity.SysMenu;
......@@ -24,6 +11,18 @@ import com.linkwechat.framework.web.service.SysLoginService;
import com.linkwechat.framework.web.service.SysPermissionService;
import com.linkwechat.framework.web.service.TokenService;
import com.linkwechat.system.service.ISysMenuService;
import com.linkwechat.wecom.client.WeAccessTokenClient;
import com.linkwechat.wecom.domain.WeCorpAccount;
import com.linkwechat.wecom.domain.dto.WeLoginUserInfoDto;
import com.linkwechat.wecom.service.IWeCorpAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Set;
/**
* 登录验证
......@@ -53,6 +52,8 @@ public class SysLoginController
@Autowired
private WeAccessTokenClient weAccessTokenClient;
/**
* 登录方法
*
......@@ -118,7 +119,7 @@ public class SysLoginController
* 获取企业扫码登录相关参数
* @return
*/
@GetMapping("/findQrLoginParm")
@GetMapping("/findWxQrLoginInfo")
public AjaxResult findQrLoginParm(){
WeCorpAccount validWeCorpAccount
......@@ -142,10 +143,19 @@ public class SysLoginController
@GetMapping("/wxQrLogin")
public AjaxResult wxQrLogin(String auth_code){
AjaxResult ajax = AjaxResult.success();
WeLoginUserInfoDto loginInfo = weAccessTokenClient.getLoginInfo(auth_code);
if( null != loginInfo.getUser_info()){
String token = loginService.noPwdLogin(loginInfo.getUser_info().getUserid());
ajax.put(Constants.TOKEN, token);
}
System.out.println(auth_code);
return ajax;
return AjaxResult.success();
}
}
package com.linkwechat.web.controller.wecom;
import com.linkwechat.common.annotation.Log;
import com.linkwechat.common.core.controller.BaseController;
import com.linkwechat.common.core.domain.AjaxResult;
import com.linkwechat.common.core.page.TableDataInfo;
import com.linkwechat.common.enums.BusinessType;
import com.linkwechat.common.utils.poi.ExcelUtil;
import com.linkwechat.wecom.domain.WeMessagePush;
import com.linkwechat.wecom.service.IWeMessagePushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 消息发送的Controller
*
* @author ruoyi
* @date 2020-10-28
*/
@RestController
@RequestMapping("/system/push")
public class WeMessagePushController extends BaseController {
@Autowired
private IWeMessagePushService weMessagePushService;
/**
* 查询消息发送的列表
*/
@PreAuthorize("@ss.hasPermi('system:push:list')")
@GetMapping("/list")
public TableDataInfo list(WeMessagePush weMessagePush) {
startPage();
List<WeMessagePush> list = weMessagePushService.selectWeMessagePushList(weMessagePush);
return getDataTable(list);
}
/**
* 导出消息发送的列表
*/
@PreAuthorize("@ss.hasPermi('system:push:export')")
@Log(title = "消息发送的", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(WeMessagePush weMessagePush) {
List<WeMessagePush> list = weMessagePushService.selectWeMessagePushList(weMessagePush);
ExcelUtil<WeMessagePush> util = new ExcelUtil<WeMessagePush>(WeMessagePush.class);
return util.exportExcel(list, "push");
}
/**
* 获取消息发送的详细信息
*/
@PreAuthorize("@ss.hasPermi('system:push:query')")
@GetMapping(value = "/{messagePushId}")
public AjaxResult getInfo(@PathVariable("messagePushId") Long messagePushId) {
return AjaxResult.success(weMessagePushService.selectWeMessagePushById(messagePushId));
}
/**
* 新增消息发送的
*/
@PreAuthorize("@ss.hasPermi('system:push:add')")
@Log(title = "消息发送的", businessType = BusinessType.INSERT)
@PostMapping(value = "add")
public AjaxResult add(@RequestBody WeMessagePush weMessagePush) {
return toAjax(weMessagePushService.insertWeMessagePush(weMessagePush));
}
/**
* 删除消息发送的
*/
@PreAuthorize("@ss.hasPermi('system:push:remove')")
@Log(title = "消息发送的", businessType = BusinessType.DELETE)
@DeleteMapping("/{messagePushIds}")
public AjaxResult remove(@PathVariable Long[] messagePushIds) {
return toAjax(weMessagePushService.deleteWeMessagePushByIds(messagePushIds));
}
}
......@@ -58,7 +58,7 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- JSON工具类 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
......@@ -178,11 +178,21 @@
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--动态添加属性和方法开始-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.2.4</version>
</dependency>
<!--动态添加属性和方法结束-->
</dependencies>
......
......@@ -61,8 +61,6 @@ public class WeConstans {
public static final Integer LEAVE_NO_ALLOCATE_STATE = 0;
/**
* 离职已分配分配
*/
......@@ -72,28 +70,25 @@ public class WeConstans {
/**
* 已激活
*/
public static final Integer WE_USER_IS_ACTIVATE=1;
public static final Integer WE_USER_IS_ACTIVATE = 1;
/**
* 已禁用
*/
public static final Integer WE_USER_IS_FORBIDDEN=2;
public static final Integer WE_USER_IS_FORBIDDEN = 2;
/**
* 已离职
*/
public static final Integer WE_USER_IS_LEAVE=6;
public static final Integer WE_USER_IS_LEAVE = 6;
/**
* 未激活
*/
public static final Integer WE_USER_IS_NO_ACTIVATE=4;
public static final Integer WE_USER_IS_NO_ACTIVATE = 4;
/**
......@@ -123,57 +118,57 @@ public class WeConstans {
/**
* 在小程序中联系场景
*/
public static final Integer SMALL_ROUTINE_EMPLE_CODE_SCENE=1;
public static final Integer SMALL_ROUTINE_EMPLE_CODE_SCENE = 1;
/**
* 通过二维码联系场景
*/
public static final Integer QR_CODE_EMPLE_CODE_SCENE=2;
public static final Integer QR_CODE_EMPLE_CODE_SCENE = 2;
/**
* 微信接口相应端错误字段
*/
public static final String WE_ERROR_FIELD="errcode";
public static final String WE_ERROR_FIELD = "errcode";
/**
* 递归
*/
public static final Integer YES_IS_RECURSION=0;
public static final Integer YES_IS_RECURSION = 0;
/**
* 获取所有子部门数据
*/
public static final Integer DEPARTMENT_SUB_WEUSER=1;
public static final Integer DEPARTMENT_SUB_WEUSER = 1;
/**
* 获取当前部门
*/
public static final Integer DEPARTMENT_CURRENT_WEUSER=0;
public static final Integer DEPARTMENT_CURRENT_WEUSER = 0;
/**
* 通讯录用户激活
*/
public static final Integer YES_IS_ACTIVATE=1;
public static final Integer YES_IS_ACTIVATE = 1;
/**
* 通讯录用户未激活
*/
public static final Integer NO_IS_ACTIVATE=2;
public static final Integer NO_IS_ACTIVATE = 2;
/**
* 不存在外部联系人的关系
* 不存在外部联系人的关系
*/
public static final Integer NOT_EXIST_CONTACT=84061;
public static final Integer NOT_EXIST_CONTACT = 84061;
public static final String COMMA = ",";
}
......@@ -32,7 +32,7 @@ public enum MediaType {
this.mediaType = mediaType;
}
public static Optional<MediaType> of(String type){
return Stream.of(values()).filter(s->s.type.equals(type)).findFirst();
public static Optional<MediaType> of(String type) {
return Stream.of(values()).filter(s -> s.type.equals(type)).findFirst();
}
}
package com.linkwechat.common.enums;
import lombok.Getter;
import java.util.Optional;
import java.util.stream.Stream;
/**
* 应用支持推送文本、图片、视频、文件、图文等类型
*/
@SuppressWarnings("all")
@Getter
public enum MessageType {
/**
* 文本消息
*/
TEXT("0", "text"),
/**
* 图片消息
*/
IMAGE("1", "image"),
/**
* 语音消息
*/
VOICE("2", "voice"),
/**
* 视频消息
*/
VIDEO("3", "video"),
/**
* 文件消息
*/
FILE("4", "file"),
/**
* 文本卡片消息
*/
TEXTCARD("5", "textcard"),
/**
* 图文消息
*/
NEWS("6", "news"),
/**
* 图文消息(mpnews)
*/
MPNEWS("7", "mpnews"),
/**
* markdown消息
*/
MARKDOWN("8", "markdown"),
/**
* 小程序通知消息
*/
MINIPROGRAM_NOTICE("9", "miniprogram_notice"),
/**
* 任务卡片消息
*/
TASKCARD("10", "taskcard"),
;
/**
* 媒体类型
*/
String messageType;
/**
* 数据值
*/
String type;
MessageType(String type, String messageType) {
this.type = type;
this.messageType = messageType;
}
public static Optional<MessageType> of(String type) {
return Stream.of(values()).filter(s -> s.type.equals(type)).findFirst();
}
}
package com.linkwechat.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 群发类型 0 发给客户 1 发给客户群
*/
@NoArgsConstructor
@Getter
public enum PushType {
/**
* 发给客户
*/
SEND_TO_USER(0, "发给客户"),
/**
* 发给客户群
*/
SENT_TO_USER_GROUP(1, "发给客户群");
private String name;
private Integer type;
PushType(Integer type, String name) {
this.name = name;
this.type = type;
}
}
package com.linkwechat.common.utils;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.springframework.cglib.beans.BeanGenerator;
import org.springframework.cglib.beans.BeanMap;
import java.beans.PropertyDescriptor;
import java.util.Map;
/**
* 动态添加属性和属性值
*/
@Slf4j
public class ReflectUtil {
/**
* 动态添加属性
*
* @param dest 原对象
* @param addProperties 新加属性的信息
* @return {@link Object} 新增属性和属性值之后的对象
*/
public static Object getTarget(Object dest, Map<String, Object> addProperties) {
// get property map
PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
Map<String, Class> propertyMap = Maps.newHashMap();
for (PropertyDescriptor d : descriptors) {
if (!"class".equalsIgnoreCase(d.getName())) {
propertyMap.put(d.getName(), d.getPropertyType());
}
}
// add extra properties
addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
// new dynamic bean
DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);
// add old value
propertyMap.forEach((k, v) -> {
try {
// filter extra properties
if (!addProperties.containsKey(k)) {
dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k));
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
});
// add extra value
addProperties.forEach((k, v) -> {
try {
dynamicBean.setValue(k, v);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
});
Object target = dynamicBean.getTarget();
return target;
}
public static class DynamicBean {
/**
* 目标对象
*/
private Object target;
/**
* 属性集合
*/
private BeanMap beanMap;
public DynamicBean(Class superclass, Map<String, Class> propertyMap) {
this.target = generateBean(superclass, propertyMap);
this.beanMap = BeanMap.create(this.target);
}
/**
* bean 添加属性和值
*
* @param property
* @param value
*/
public void setValue(String property, Object value) {
beanMap.put(property, value);
}
/**
* 获取属性值
*
* @param property
* @return
*/
public Object getValue(String property) {
return beanMap.get(property);
}
/**
* 获取对象
*
* @return
*/
public Object getTarget() {
return this.target;
}
/**
* 根据属性生成对象
*
* @param superclass
* @param propertyMap
* @return
*/
private Object generateBean(Class superclass, Map<String, Class> propertyMap) {
BeanGenerator generator = new BeanGenerator();
if (null != superclass) {
generator.setSuperclass(superclass);
}
BeanGenerator.addProperties(generator, propertyMap);
return generator.create();
}
}
}
......@@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/captchaImage","/findQrLoginParm","/wxQrLogin").anonymous()
.antMatchers("/login", "/captchaImage","/findWxQrLoginInfo","/wxQrLogin").anonymous()
.antMatchers(
HttpMethod.GET,
"/*.html",
......
......@@ -6,6 +6,8 @@ import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
import com.linkwechat.common.constant.Constants;
import com.linkwechat.common.core.domain.model.LoginUser;
......@@ -35,6 +37,9 @@ public class SysLoginService
@Autowired
private RedisCache redisCache;
@Autowired
private UserDetailsService userDetailsService;
/**
* 登录验证
*
......@@ -46,6 +51,7 @@ public class SysLoginService
*/
public String login(String username, String password, String code, String uuid)
{
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String captcha = redisCache.getCacheObject(verifyKey);
redisCache.deleteObject(verifyKey);
......@@ -59,6 +65,7 @@ public class SysLoginService
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
throw new CaptchaException();
}
// 用户验证
Authentication authentication = null;
try
......@@ -85,4 +92,20 @@ public class SysLoginService
// 生成token
return tokenService.createToken(loginUser);
}
/**
* 无密码登录
* @param userName
* @return
*/
public String noPwdLogin(String userName){
LoginUser loginUser
= (LoginUser)userDetailsService.loadUserByUsername(userName);
return tokenService.createToken(loginUser);
}
}
......@@ -4,12 +4,15 @@ import cn.hutool.core.util.ArrayUtil;
import com.linkwechat.common.config.RuoYiConfig;
import com.linkwechat.common.constant.Constants;
import com.linkwechat.common.core.domain.entity.SysRole;
import com.linkwechat.common.core.domain.entity.SysUser;
import com.linkwechat.common.core.domain.model.LoginUser;
import com.linkwechat.common.enums.UserStatus;
import com.linkwechat.common.exception.BaseException;
import com.linkwechat.common.utils.SecurityUtils;
import com.linkwechat.common.utils.StringUtils;
import com.linkwechat.system.mapper.SysRoleMapper;
import com.linkwechat.system.service.ISysRoleService;
import com.linkwechat.wecom.domain.WeCorpAccount;
import com.linkwechat.system.service.ISysUserService;
import com.linkwechat.wecom.domain.WeUser;
import com.linkwechat.wecom.service.IWeCorpAccountService;
import com.linkwechat.wecom.service.IWeUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -18,14 +21,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.linkwechat.common.core.domain.entity.SysUser;
import com.linkwechat.common.core.domain.model.LoginUser;
import com.linkwechat.common.enums.UserStatus;
import com.linkwechat.common.exception.BaseException;
import com.linkwechat.common.utils.StringUtils;
import com.linkwechat.system.service.ISysUserService;
import java.util.List;
import java.util.stream.Collectors;
/**
......@@ -70,7 +66,7 @@ public class UserDetailsServiceImpl implements UserDetailsService
}
//注册到we_user表中
user=SysUser.builder()
user=SysUser.builder()
.userName(weUser.getUserId())
.nickName(weUser.getName())
.userType(Constants.USER_TYPE_WECOME)
......@@ -78,15 +74,15 @@ public class UserDetailsServiceImpl implements UserDetailsService
.phonenumber(weUser.getMobile())
.sex(weUser.getGender().toString())
.avatar(weUser.getAvatarMediaid())
.roleIds(ArrayUtil.toArray(roleMapper.selectRoleList(SysRole.builder()
.roleKey(Constants.DEFAULT_WECOME_ROLE_KEY)
.build()).stream().map(SysRole::getRoleId).collect(Collectors.toList()), Long.class))
.roleIds(ArrayUtil.toArray(roleMapper.selectRoleList(SysRole.builder()
.roleKey(Constants.DEFAULT_WECOME_ROLE_KEY)
.build()).stream().map(SysRole::getRoleId).collect(Collectors.toList()), Long.class))
.password(SecurityUtils.encryptPassword(ruoYiConfig.getWeUserDefaultPwd()))
.build();
userService.insertUser(
user
);
userService.insertUser(
user
);
}
else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
{
......@@ -100,11 +96,12 @@ public class UserDetailsServiceImpl implements UserDetailsService
}
return createLoginUser(user);
}
public UserDetails createLoginUser(SysUser user)
{
return new LoginUser(user, permissionService.getMenuPermission(user));
......
package com.linkwechat.wecom.client;
import com.dtflys.forest.annotation.DataObject;
import com.dtflys.forest.annotation.Request;
import com.linkwechat.wecom.domain.dto.WeMessagePushDto;
import com.linkwechat.wecom.domain.dto.WeMessagePushGroupDto;
import com.linkwechat.wecom.domain.dto.WeMessagePushResultDto;
/**
* @description: 消息推送
* @author: KeWen
* @create: 2020-10-17 22:41
**/
@SuppressWarnings("all")
public interface WeMessagePushClient {
/**
* 发送应用消息
*/
@Request(url = "/message/send",
type = "POST"
)
WeMessagePushResultDto sendMessageToUser(@DataObject WeMessagePushDto weMessagePushDto);
/**
* 应用推送消息
*/
@Request(url = "/appchat/send",
type = "POST"
)
WeMessagePushResultDto sendMessageToUserGroup(@DataObject WeMessagePushGroupDto weMessagePushGroupDto);
}
......@@ -66,4 +66,8 @@ public class WeCorpAccount extends BaseEntity
private String providerSecret;
@ApiModelProperty("企业微信扫码登陆回调地址")
private String wxQrLoginRedirectUri;
}
package com.linkwechat.wecom.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.linkwechat.common.core.domain.BaseEntity;
import lombok.Data;
/**
* 消息发送的对象 we_message_push
*
* @author KeWen
* @date 2020-10-28
*/
@Data
public class WeMessagePush extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
private Long messagePushId;
/**
* 群发类型 0 发给客户 1 发给客户群
*/
private Integer pushType;
/**
* 消息类型 0 文本消息 1 图片消息 2 语音消息 3 视频消息 4 文件消息 5 文本卡片消息 6 图文消息
* 7 图文消息(mpnews) 8 markdown消息 9 小程序通知消息 10 任务卡片消息
*/
private String messageType;
/**
* 消息体
*/
private String messageJson;
/**
* 消息范围 0 全部客户 1 指定客户
*/
private String pushRange;
/**
* 0 未删除 1 已删除
*/
private Integer delFlag;
/**
* 无效用户
*/
private String invaliduser;
/**
* 无效单位
*/
private String invalidparty;
/**
* 无效标签
*/
private String invalidtag;
/**
* 指定接收消息的成员
*/
private String toUser;
/**
* 指定接收消息的部门
*/
private String toParty;
/**
* 指定接收消息的标签
*/
private String toTag;
/**
* 群聊id
*/
private String chatId;
}
package com.linkwechat.wecom.domain.dto;
import lombok.Data;
@SuppressWarnings("all")
@Data
public class WeMessagePushDto {
/**
* 指定接收消息的成员,成员ID列表(多个接收者用‘|’分隔,最多支持1000个)。
* 特殊情况:指定为”@all”,则向该企业应用的全部成员发送
*/
private String touser;
/**
* 指定接收消息的部门,部门ID列表,多个接收者用‘|’分隔,最多支持100个。
* 当touser为”@all”时忽略本参数
*/
private String toparty;
/**
* 指定接收消息的标签,标签ID列表,多个接收者用‘|’分隔,最多支持100个。
* 当touser为”@all”时忽略本参数
*/
private String totag;
/**
* 消息类型,此时固定为:text
*/
private String msgtype;
/**
* 企业应用的id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口
* <a href="https://work.weixin.qq.com/api/doc/10975#%E8%8E%B7%E5%8F%96%E4%BC%81%E4%B8%9A%E6%8E%88%E6%9D%83%E4%BF%A1%E6%81%AF">获取企业授权信息</a> 获取该参数值
*/
private Integer agentid;
/**
* 表示是否是保密消息,0表示否,1表示是,默认0
*/
private Integer safe;
/**
* 表示是否开启id转译,0表示否,1表示是,默认0
*/
private Integer enable_id_trans;
/**
* 表示是否开启重复消息检查,0表示否,1表示是,默认0
*/
private Integer enable_duplicate_check;
/**
* 表示是否重复消息检查的时间间隔,默认1800s,最大不超过4小时
*/
private Long duplicate_check_interval;
/**
* 根据msgtype的值不同添加一个属性和对应的属性值
*/
}
package com.linkwechat.wecom.domain.dto;
import lombok.Data;
@SuppressWarnings("all")
@Data
public class WeMessagePushGroupDto {
/**
* 群聊id
*/
private String chatid;
/**
* 消息类型
*/
private String msgtype;
/**
* 表示是否是保密消息,0表示否,1表示是,默认0
*/
private Integer safe;
/**
* 根据msgtype的值不同添加一个属性和对应的属性值
*/
}
package com.linkwechat.wecom.domain.dto;
import cn.hutool.json.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import com.linkwechat.common.enums.MessageType;
import com.linkwechat.common.utils.ReflectUtil;
import lombok.Data;
import java.util.HashMap;
import java.util.Optional;
/**
* @description: 发送应用消息响应应用结果
* @author: KeWen
* @create: 2020-10-27 22:46
**/
@Data
public class WeMessagePushResultDto extends WeResultDto {
/**
* 无效用户
*/
private String invaliduser;
/**
* 无效单位
*/
private String invalidparty;
/**
* 无效标签
*/
private String invalidtag;
}
package com.linkwechat.wecom.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.linkwechat.wecom.domain.WeMessagePush;
/**
* 消息发送的对象 we_message_push
*
* @author KeWen
* @date 2020-10-28
*/
public interface WeMessagePushMapper extends BaseMapper<WeMessagePush> {
}
package com.linkwechat.wecom.service;
import com.linkwechat.wecom.domain.WeMessagePush;
import java.util.List;
/**
* 消息发送的Service接口
*
* @author KeWen
* @date 2020-10-28
*/
public interface IWeMessagePushService {
/**
* 查询消息发送的
*
* @param messagePushId 消息发送的ID
* @return 消息发送的
*/
public WeMessagePush selectWeMessagePushById(Long messagePushId);
/**
* 查询消息发送的列表
*
* @param weMessagePush 消息发送的
* @return 消息发送的集合
*/
public List<WeMessagePush> selectWeMessagePushList(WeMessagePush weMessagePush);
/**
* 新增消息发送的
*
* @param weMessagePush 消息发送的
* @return 结果
*/
public int insertWeMessagePush(WeMessagePush weMessagePush);
/**
* 批量删除消息发送的
*
* @param messagePushIds 需要删除的消息发送的ID
* @return 结果
*/
public int deleteWeMessagePushByIds(Long[] messagePushIds);
/**
* 删除消息发送的信息
*
* @param messagePushId 消息发送的ID
* @return 结果
*/
public int deleteWeMessagePushById(Long messagePushId);
}
package com.linkwechat.wecom.service.impl;
import cn.hutool.core.date.DateUtil;
import com.linkwechat.common.core.domain.Tree;
import com.linkwechat.common.exception.wecom.WeComException;
import com.linkwechat.common.utils.SnowFlakeUtil;
import com.linkwechat.common.utils.TreeUtil;
import com.linkwechat.wecom.domain.WeCategory;
import com.linkwechat.wecom.domain.vo.WeCategoryVo;
......@@ -28,6 +30,8 @@ public class WeCategoryServiceImpl implements IWeCategoryService {
if (null != weCategory) {
throw new WeComException("名称已存在!");
}
category.setCreateTime(DateUtil.date());
category.setId(SnowFlakeUtil.nextId());
return weCategoryMapper.insertWeCategory(category);
}
......@@ -38,6 +42,7 @@ public class WeCategoryServiceImpl implements IWeCategoryService {
if (null != weCategory) {
throw new WeComException("名称已存在!");
}
category.setUpdateTime(DateUtil.date());
return weCategoryMapper.updateWeCategory(category);
}
......
package com.linkwechat.wecom.service.impl;
import cn.hutool.core.date.DateUtil;
import com.linkwechat.common.config.RuoYiConfig;
import com.linkwechat.common.config.ServerConfig;
import com.linkwechat.common.enums.MediaType;
import com.linkwechat.common.exception.wecom.WeComException;
import com.linkwechat.common.utils.SnowFlakeUtil;
import com.linkwechat.common.utils.file.FileUploadUtils;
import com.linkwechat.wecom.domain.WeMaterial;
import com.linkwechat.wecom.domain.vo.WeMaterialFileVO;
......@@ -60,6 +62,8 @@ public class WeMaterialServiceImpl implements IWeMaterialService {
@Override
public int insertWeMaterial(WeMaterial weMaterial) {
weMaterial.setCreateTime(DateUtil.date());
weMaterial.setId(SnowFlakeUtil.nextId());
return weMaterialMapper.insertWeMaterial(weMaterial);
}
......@@ -75,6 +79,7 @@ public class WeMaterialServiceImpl implements IWeMaterialService {
@Override
public int updateWeMaterial(WeMaterial weMaterial) {
weMaterial.setCreateTime(DateUtil.date());
return weMaterialMapper.updateWeMaterial(weMaterial);
}
......
package com.linkwechat.wecom.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.linkwechat.common.constant.WeConstans;
import com.linkwechat.common.enums.MessageType;
import com.linkwechat.common.enums.PushType;
import com.linkwechat.common.utils.DateUtils;
import com.linkwechat.common.utils.ReflectUtil;
import com.linkwechat.common.utils.SnowFlakeUtil;
import com.linkwechat.common.utils.StringUtils;
import com.linkwechat.wecom.client.WeMessagePushClient;
import com.linkwechat.wecom.domain.WeGroup;
import com.linkwechat.wecom.domain.WeMessagePush;
import com.linkwechat.wecom.domain.dto.WeMessagePushDto;
import com.linkwechat.wecom.domain.dto.WeMessagePushGroupDto;
import com.linkwechat.wecom.domain.dto.WeMessagePushResultDto;
import com.linkwechat.wecom.mapper.WeMessagePushMapper;
import com.linkwechat.wecom.service.IWeGroupService;
import com.linkwechat.wecom.service.IWeMessagePushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 消息发送的Service接口
*
* @author KeWen
* @date 2020-10-28
*/
@Service
public class WeMessagePushServiceImpl implements IWeMessagePushService {
@Autowired
private WeMessagePushMapper weMessagePushMapper;
@Autowired
private WeMessagePushClient weMessagePushClient;
@Autowired
private IWeGroupService weGroupService;
@Override
public WeMessagePush selectWeMessagePushById(Long messagePushId) {
return weMessagePushMapper.selectById(messagePushId);
}
@Override
public List<WeMessagePush> selectWeMessagePushList(WeMessagePush weMessagePush) {
return weMessagePushMapper.selectList(new QueryWrapper<>());
}
@Override
public int insertWeMessagePush(WeMessagePush weMessagePush) {
HashMap<String, Object> map = Maps.newHashMap();
JSONObject jsonObject = new JSONObject(weMessagePush.getMessageJson());
Optional<MessageType> of = MessageType.of(weMessagePush.getMessageType());
of.ifPresent(messageType -> map.put(messageType.getMessageType(), jsonObject));
if (weMessagePush.getPushType() != null && weMessagePush.getPushType().equals(PushType.SEND_TO_USER.getType())) {
//发送消息
WeMessagePushDto weMessagePushDto = new WeMessagePushDto();
weMessagePushDto.setTouser(weMessagePush.getToUser());
weMessagePushDto.setToparty(weMessagePush.getToParty());
weMessagePushDto.setTotag(weMessagePush.getToTag());
weMessagePushDto.setMsgtype(weMessagePush.getMessageType());
//这个先写在配置文件中
weMessagePushDto.setAgentid(1000003);
weMessagePushDto.setSafe(0);
weMessagePushDto.setEnable_id_trans(0);
weMessagePushDto.setEnable_duplicate_check(0);
weMessagePushDto.setDuplicate_check_interval(1800L);
//动态添加微信消息体属性和属性值信息
WeMessagePushDto target = (WeMessagePushDto) ReflectUtil.getTarget(weMessagePushDto, map);
WeMessagePushResultDto weMessagePushResultDto = weMessagePushClient.sendMessageToUser(target);
if (weMessagePushResultDto.getErrcode().equals(WeConstans.WE_SUCCESS_CODE)) {
weMessagePush.setCreateTime(DateUtils.getNowDate());
weMessagePush.setDelFlag(0);
weMessagePush.setMessagePushId(SnowFlakeUtil.nextId());
//存储返回结果信息
weMessagePush.setInvaliduser(weMessagePushResultDto.getInvaliduser());
weMessagePush.setInvalidparty(weMessagePushResultDto.getInvalidparty());
weMessagePush.setInvalidtag(weMessagePushResultDto.getInvalidtag());
}
}
if (weMessagePush.getPushType() != null
&& weMessagePush.getPushType().equals(PushType.SENT_TO_USER_GROUP.getType())) {
//根据员工id列表查询所有的群信息
List<String> strings = Arrays.asList(StringUtils.splitByWholeSeparatorPreserveAllTokens(weMessagePush.getToUser(), WeConstans.COMMA));
List<String> chatIds = Lists.newArrayList();
strings.forEach(s -> {
List<WeGroup> groups = weGroupService
.list(new LambdaQueryWrapper<WeGroup>().eq(WeGroup::getOwner, s));
//发送消息到群聊
if (CollectionUtil.isNotEmpty(groups)) {
groups.forEach(d -> {
WeMessagePushGroupDto weMessagePushGroupDto = new WeMessagePushGroupDto();
weMessagePushGroupDto.setChatid(d.getChatId());
weMessagePushGroupDto.setMsgtype(weMessagePush.getMessageType());
weMessagePushGroupDto.setSafe(0);
//动态添加微信消息体属性和属性值信息
WeMessagePushGroupDto target = (WeMessagePushGroupDto) ReflectUtil.getTarget(weMessagePushGroupDto, map);
WeMessagePushResultDto weMessagePushResultDto = weMessagePushClient.sendMessageToUserGroup(target);
if (weMessagePushResultDto.getErrcode().equals(WeConstans.WE_SUCCESS_CODE)) {
//保存发送的群消息
chatIds.add(d.getChatId());
}
});
}
});
weMessagePush.setCreateTime(DateUtils.getNowDate());
weMessagePush.setDelFlag(0);
weMessagePush.setMessagePushId(SnowFlakeUtil.nextId());
weMessagePush.setChatId(CollectionUtil.isNotEmpty(chatIds) ? String.join(",", chatIds) : null);
}
return weMessagePushMapper.insert(weMessagePush);
}
@Override
public int deleteWeMessagePushByIds(Long[] messagePushIds) {
return weMessagePushMapper.deleteBatchIds(Arrays.asList(messagePushIds));
}
@Override
public int deleteWeMessagePushById(Long messagePushId) {
return weMessagePushMapper.deleteById(messagePushId);
}
}
<?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">
<mapper namespace="com.ruoyi.system.mapper.WeMessagePushMapper">
</mapper>
\ No newline at end of file
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册