Commit 9837e388 by xuwenhao

新增钉钉api

parent 77d756c5
...@@ -18,12 +18,13 @@ import com.ruoyi.common.utils.SecurityUtils; ...@@ -18,12 +18,13 @@ import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService; import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
import yangtz.cs.liu.campus.service.teacher.ISchoolTeacherService;
import static com.ruoyi.common.utils.SecurityUtils.getUserId; import static com.ruoyi.common.utils.SecurityUtils.getUserId;
/** /**
* 登录验证 * 登录验证
* *
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
...@@ -38,9 +39,12 @@ public class SysLoginController ...@@ -38,9 +39,12 @@ public class SysLoginController
@Autowired @Autowired
private SysPermissionService permissionService; private SysPermissionService permissionService;
@Autowired
private ISchoolTeacherService schoolTeacherService;
/** /**
* 登录方法 * 登录方法
* *
* @param loginBody 登录信息 * @param loginBody 登录信息
* @return 结果 * @return 结果
*/ */
...@@ -59,7 +63,7 @@ public class SysLoginController ...@@ -59,7 +63,7 @@ public class SysLoginController
/** /**
* 获取用户信息 * 获取用户信息
* *
* @return 用户信息 * @return 用户信息
*/ */
@GetMapping("getInfo") @GetMapping("getInfo")
...@@ -67,7 +71,9 @@ public class SysLoginController ...@@ -67,7 +71,9 @@ public class SysLoginController
{ {
getUserId(); getUserId();
SysUser user = SecurityUtils.getLoginUser().getUser(); SysUser user = SecurityUtils.getLoginUser().getUser();
SchoolTeacher teacher = SecurityUtils.getLoginUser().getSchoolTeacher(); // SchoolTeacher teacher = SecurityUtils.getLoginUser().getSchoolTeacher();
//教师信息
SchoolTeacher teacher = schoolTeacherService.getById(user.getUserId());
// 角色集合 // 角色集合
Set<String> roles = permissionService.getRolePermission(user); Set<String> roles = permissionService.getRolePermission(user);
// 权限集合 // 权限集合
...@@ -82,7 +88,7 @@ public class SysLoginController ...@@ -82,7 +88,7 @@ public class SysLoginController
/** /**
* 获取路由信息 * 获取路由信息
* *
* @return 路由信息 * @return 路由信息
*/ */
@GetMapping("getRouters") @GetMapping("getRouters")
......
...@@ -98,6 +98,16 @@ public class SchoolTeacher extends BaseEntity{ ...@@ -98,6 +98,16 @@ public class SchoolTeacher extends BaseEntity{
* */ * */
private String openId; private String openId;
/*
* 钉钉用户unionId
* */
private String unionId;
/*
* 钉钉用户id
* */
private String ddUserId;
//设备工号 //设备工号
private String deviceNum; private String deviceNum;
......
...@@ -92,6 +92,12 @@ public class SysUser extends BaseEntity ...@@ -92,6 +92,12 @@ public class SysUser extends BaseEntity
/** 微信openId */ /** 微信openId */
private String openId; private String openId;
/** 钉钉用户unionId */
private String unionId;
/** 钉钉用户id */
private String ddUserId;
/** 部门对象 */ /** 部门对象 */
@Excels({ @Excels({
@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
...@@ -128,6 +134,22 @@ public class SysUser extends BaseEntity ...@@ -128,6 +134,22 @@ public class SysUser extends BaseEntity
} }
public String getUnionId() {
return unionId;
}
public void setUnionId(String unionId) {
this.unionId = unionId;
}
public String getDdUserId() {
return ddUserId;
}
public void setDdUserId(String ddUserId) {
this.ddUserId = ddUserId;
}
public SysUser(Long userId) public SysUser(Long userId)
{ {
this.userId = userId; this.userId = userId;
......
...@@ -113,7 +113,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter ...@@ -113,7 +113,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
.antMatchers( "/webSocket/**").anonymous() .antMatchers( "/webSocket/**").anonymous()
.antMatchers("/login", "/register", "/captchaImage").anonymous() .antMatchers("/login", "/register", "/captchaImage").anonymous()
.antMatchers("/wx/user/login").permitAll() .antMatchers("/wx/user/login").permitAll()
.antMatchers("/dd/user/login").permitAll()
.antMatchers( "/common/**").permitAll() .antMatchers( "/common/**").permitAll()
.antMatchers( "/dd/school/**").permitAll()
//网页注册登录接口放行 //网页注册登录接口放行
.antMatchers( "/web/artStudent/register","/web/artStudent/login").permitAll() .antMatchers( "/web/artStudent/register","/web/artStudent/login").permitAll()
// 静态资源,可匿名访问 // 静态资源,可匿名访问
......
...@@ -6,6 +6,9 @@ import org.springframework.security.authentication.AuthenticationManager; ...@@ -6,6 +6,9 @@ import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
...@@ -49,6 +52,8 @@ public class SysLoginService ...@@ -49,6 +52,8 @@ public class SysLoginService
@Autowired @Autowired
private ISysConfigService configService; private ISysConfigService configService;
@Autowired
private SysPermissionService permissionService;
/** /**
* 登录验证 * 登录验证
...@@ -70,7 +75,7 @@ public class SysLoginService ...@@ -70,7 +75,7 @@ public class SysLoginService
Authentication authentication = null; Authentication authentication = null;
try try
{ {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(phonenumber, password); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(phonenumber,password);
AuthenticationContextHolder.setContext(authenticationToken); AuthenticationContextHolder.setContext(authenticationToken);
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager.authenticate(authenticationToken); authentication = authenticationManager.authenticate(authenticationToken);
...@@ -101,6 +106,53 @@ public class SysLoginService ...@@ -101,6 +106,53 @@ public class SysLoginService
/** /**
* 登录验证 * 登录验证
*
* @return 结果
*/
public String loginNew(SysUser sysUser)
{
// boolean captchaEnabled = configService.selectCaptchaEnabled();
// // 验证码开关
// if (captchaEnabled)
// {
// validateCaptcha(username, code, uuid);
// }
// 用户验证
Authentication authentication = null;
try
{
//直接不用springsecurity 认证、自己构造出数据
UserDetails userDetails=new LoginUser(sysUser.getUserId(), sysUser.getDeptId(), sysUser, permissionService.getMenuPermission(sysUser));
authentication = new UsernamePasswordAuthenticationToken(userDetails, null,
AuthorityUtils.createAuthorityList("ROLE_USER"));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
catch (Exception e)
{
if (e instanceof BadCredentialsException)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getPhonenumber(), Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException();
}
else
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getPhonenumber(), Constants.LOGIN_FAIL, e.getMessage()));
throw new ServiceException(e.getMessage());
}
}
finally
{
AuthenticationContextHolder.clearContext();
}
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginUser.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
recordLoginInfo(loginUser.getUserId());
// 生成token
return tokenService.createToken(loginUser);
}
/**
* 登录验证
* *
* @param username 用户名 * @param username 用户名
* @param password 密码 * @param password 密码
......
...@@ -21,6 +21,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -21,6 +21,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="loginIp" column="login_ip" /> <result property="loginIp" column="login_ip" />
<result property="loginDate" column="login_date" /> <result property="loginDate" column="login_date" />
<result property="pwdUpdateDate" column="pwd_update_date" /> <result property="pwdUpdateDate" column="pwd_update_date" />
<result property="openId" column="open_id" />
<result property="ddUserId" column="dd_user_id" />
<result property="unionId" column="union_id" />
<result property="createBy" column="create_by" /> <result property="createBy" column="create_by" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
...@@ -216,6 +219,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -216,6 +219,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="employeeType != null and employeeType != ''">employee_type = #{employeeType},</if> <if test="employeeType != null and employeeType != ''">employee_type = #{employeeType},</if>
<if test="studentId != null and studentId != 0">student_id = #{studentId},</if> <if test="studentId != null and studentId != 0">student_id = #{studentId},</if>
<if test="sign != null and sign != ''">sign = #{sign},</if> <if test="sign != null and sign != ''">sign = #{sign},</if>
<if test="openId != null and openId != ''">open_id = #{openId},</if>
<if test="ddUserId != null and ddUserId != ''">dd_user_id = #{ddUserId},</if>
<if test="unionId != null and unionId != ''">union_id = #{unionId},</if>
update_time = sysdate() update_time = sysdate()
</set> </set>
where user_id = #{userId} where user_id = #{userId}
......
...@@ -12,6 +12,19 @@ ...@@ -12,6 +12,19 @@
<artifactId>smart-campus</artifactId> <artifactId>smart-campus</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dingtalk</artifactId>
<version>2.0.14</version>
</dependency>
<dependency> <dependency>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>core-common</artifactId> <artifactId>core-common</artifactId>
...@@ -87,6 +100,11 @@ ...@@ -87,6 +100,11 @@
<groupId>org.quartz-scheduler</groupId> <groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId> <artifactId>quartz</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies> </dependencies>
</project> </project>
package yangtz.cs.liu.campus.controller.auditorium; package yangtz.cs.liu.campus.controller.auditorium;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
...@@ -47,6 +45,8 @@ import yangtz.cs.liu.campus.service.teacher.ISchoolTeacherService; ...@@ -47,6 +45,8 @@ import yangtz.cs.liu.campus.service.teacher.ISchoolTeacherService;
import yangtz.cs.liu.campus.util.VxTemlateSendApi; import yangtz.cs.liu.campus.util.VxTemlateSendApi;
import yangtz.cs.liu.campus.vo.auditorium.SchoolAuditoriumVo; import yangtz.cs.liu.campus.vo.auditorium.SchoolAuditoriumVo;
import yangtz.cs.liu.campus.vo.teacher.TeacherLeaveVO; import yangtz.cs.liu.campus.vo.teacher.TeacherLeaveVO;
import yangtz.cs.liu.dingding.utils.DingMessageUtils;
import yangtz.cs.liu.dingding.vo.DingMessageVo;
import yangtz.cs.liu.wechat.service.api.IWxApiService; import yangtz.cs.liu.wechat.service.api.IWxApiService;
import static com.core.constant.ProcessDefinition.*; import static com.core.constant.ProcessDefinition.*;
...@@ -73,6 +73,8 @@ public class SchoolAuditoriumController extends BaseController ...@@ -73,6 +73,8 @@ public class SchoolAuditoriumController extends BaseController
private ISchoolTeacherService teacherService; private ISchoolTeacherService teacherService;
@Autowired @Autowired
private IWxApiService wxApiService; private IWxApiService wxApiService;
@Autowired
private DingMessageUtils dingMessageUtils;
/** /**
* 查询全部学校礼堂预约列表 * 查询全部学校礼堂预约列表
...@@ -170,22 +172,60 @@ public class SchoolAuditoriumController extends BaseController ...@@ -170,22 +172,60 @@ public class SchoolAuditoriumController extends BaseController
schoolAuditorium.setApplyTime(DateUtils.getNowDate()); schoolAuditorium.setApplyTime(DateUtils.getNowDate());
schoolAuditoriumService.submitApply(schoolAuditorium, userName, AUDITORIUMAPPLY, new HashMap<>()); schoolAuditoriumService.submitApply(schoolAuditorium, userName, AUDITORIUMAPPLY, new HashMap<>());
/** 发送发送钉钉审批实例 */
String ddInstanceId = schoolAuditoriumService.sendDdInstance(schoolAuditorium);
//转换时间 //转换时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date time = schoolAuditorium.getApplyTime(); Date time = schoolAuditorium.getApplyTime();
String applyTime = format.format(time); String applyTime = format.format(time);
//发送钉钉消息到分管领导
//获取钉钉用户id
String ddUserId = teacherService.getDdUserIdByUserId(schoolAuditorium.getLeadershipId());
//发送钉钉消息给分管领导
DingMessageVo messageVo = new DingMessageVo();
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
msg.getOa().getHead().setText("二中校园测试");
msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
msg.getOa().getBody().setAuthor(schoolAuditorium.getApplyName());
msg.getOa().getBody().setContent("申请内容:" + schoolAuditorium.getActivityName());
msg.getOa().getBody().setTitle("您好,您有礼堂预约申请等待审批!");
OapiMessageCorpconversationAsyncsendV2Request.Form form1 = new OapiMessageCorpconversationAsyncsendV2Request.Form();
form1.setKey("申请时间:");
form1.setValue(applyTime);
msg.getOa().getBody().setForm(Arrays.asList(form1));
msg.getOa().setPcMessageUrl("https://open.dingtalk.com/");
msg.getOa().setMessageUrl("https://open.dingtalk.com/");
msg.setMsgtype("oa");
OapiMessageCorpconversationAsyncsendV2Request.StatusBar statusBar = new OapiMessageCorpconversationAsyncsendV2Request.StatusBar();
statusBar.setStatusBg("0xFFF65E5E");
statusBar.setStatusValue("进行中");
msg.getOa().setStatusBar(statusBar);
messageVo.setMsg(msg);
messageVo.setToAllUser(false);
messageVo.setUseridList(ddUserId);
Long ddTaskId = dingMessageUtils.sendMessage(messageVo);
//更新消息任务id、钉钉流程实例id
SchoolAuditorium auditorium = new SchoolAuditorium();
auditorium.setId(id);
auditorium.setDdTaskId(ddTaskId);
auditorium.setDdInstanceId(ddInstanceId);
schoolAuditoriumService.updateById(auditorium);
/**发送模板消息到分管领导*/ /**发送模板消息到分管领导*/
//获取用户openid //获取用户openid
String openId = teacherService.getOpenIdByUserId(schoolAuditorium.getLeadershipId()); // String openId = teacherService.getOpenIdByUserId(schoolAuditorium.getLeadershipId());
Map<String,Object> map = new HashMap<>(); // Map<String,Object> map = new HashMap<>();
map.put("toUserOpenId",openId); // map.put("toUserOpenId",openId);
map.put("applyTime",applyTime); // map.put("applyTime",applyTime);
map.put("remark","请您尽快处理。"); // map.put("remark","请您尽快处理。");
map.put("applyUser",schoolAuditorium.getApplyName()); // map.put("applyUser",schoolAuditorium.getApplyName());
map.put("content",schoolAuditorium.getActivityName()); // map.put("content",schoolAuditorium.getActivityName());
map.put("first","您好,您有礼堂预约申请等待审批!"); // map.put("first","您好,您有礼堂预约申请等待审批!");
VxTemlateSendApi.sendVxTemlate(map); // VxTemlateSendApi.sendVxTemlate(map);
// AuditoriumTemplate template = new AuditoriumTemplate(); // AuditoriumTemplate template = new AuditoriumTemplate();
// template.setToUserOpenId(openId); // template.setToUserOpenId(openId);
// template.setFirst("您好,您有礼堂预约申请等待审批。"); // template.setFirst("您好,您有礼堂预约申请等待审批。");
...@@ -244,6 +284,30 @@ public class SchoolAuditoriumController extends BaseController ...@@ -244,6 +284,30 @@ public class SchoolAuditoriumController extends BaseController
/** 修改任务结果 */ /** 修改任务结果 */
schoolAuditoriumService.updateById(leave); schoolAuditoriumService.updateById(leave);
/** 发送消息通知到申请人,审批结果 */
//获取钉钉用户id
String ddUserId = teacherService.getDdUserIdByUserId(leave.getApplyId());
//发送钉钉消息给分管领导
DingMessageVo messageVo = new DingMessageVo();
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
msg.getOa().getHead().setText("二中校园测试");
msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
msg.getOa().getBody().setAuthor(leave.getLeadershipName());
msg.getOa().getBody().setContent(flag ? "已通过" : "已驳回");
msg.getOa().getBody().setTitle("您好,您的礼堂预约申请已回复。");
msg.getOa().setPcMessageUrl("https://open.dingtalk.com/");
msg.getOa().setMessageUrl("https://open.dingtalk.com/");
msg.setMsgtype("oa");
messageVo.setMsg(msg);
messageVo.setToAllUser(false);
messageVo.setUseridList(ddUserId);
dingMessageUtils.sendMessage(messageVo);
//修改消息任务状态为已完成
dingMessageUtils.updateStatusBar(leave.getDdTaskId(), "已完成", "0xFF78C06E");
/**发送模板消息到申请人,审批结果*/ /**发送模板消息到申请人,审批结果*/
//获取申请人openId //获取申请人openId
String openId = teacherService.getOpenIdByUserId(leave.getApplyId()); String openId = teacherService.getOpenIdByUserId(leave.getApplyId());
...@@ -268,4 +332,4 @@ public class SchoolAuditoriumController extends BaseController ...@@ -268,4 +332,4 @@ public class SchoolAuditoriumController extends BaseController
} }
return AjaxResult.success("审批完成"); return AjaxResult.success("审批完成");
} }
} }
\ No newline at end of file
...@@ -29,6 +29,9 @@ public class SchoolAuditorium extends OurBaseEntity ...@@ -29,6 +29,9 @@ public class SchoolAuditorium extends OurBaseEntity
/** 流程实例id */ /** 流程实例id */
private String instanceId; private String instanceId;
/** 流程实例id */
private String ddInstanceId;
/** 活动名称 */ /** 活动名称 */
private String activityName; private String activityName;
...@@ -103,6 +106,9 @@ public class SchoolAuditorium extends OurBaseEntity ...@@ -103,6 +106,9 @@ public class SchoolAuditorium extends OurBaseEntity
/** 附件名称 */ /** 附件名称 */
private String fjmc; private String fjmc;
/** 消息任务id */
private Long ddTaskId;
/** 创建人id */ /** 创建人id */
private Long createById; private Long createById;
......
...@@ -103,4 +103,16 @@ public interface SchoolTeacherMapper extends BaseMapper<SchoolTeacher>{ ...@@ -103,4 +103,16 @@ public interface SchoolTeacherMapper extends BaseMapper<SchoolTeacher>{
* 根据userId 查询 openId * 根据userId 查询 openId
*/ */
String getOpenIdByUserId(Long userId); String getOpenIdByUserId(Long userId);
/**
*
* 根据userId 查询 ddUserId
*/
String getDdUserIdByUserId(Long userId);
/**
*
* 根据userId 查询 unionId
*/
String getUnionIdByUserId(Long userId);
} }
...@@ -96,4 +96,10 @@ public interface ISchoolAuditoriumService extends IService<SchoolAuditorium> ...@@ -96,4 +96,10 @@ public interface ISchoolAuditoriumService extends IService<SchoolAuditorium>
* @return * @return
*/ */
List<SchoolAuditoriumVo> findDoneTasks(String key, SchoolAuditorium entity, String userId); List<SchoolAuditoriumVo> findDoneTasks(String key, SchoolAuditorium entity, String userId);
/**
* 发送钉钉审批实例
* @param schoolAuditorium
*/
String sendDdInstance(SchoolAuditorium schoolAuditorium);
} }
package yangtz.cs.liu.campus.service.impl.auditorium; package yangtz.cs.liu.campus.service.impl.auditorium;
import com.aliyun.dingtalkworkflow_1_0.models.StartProcessInstanceRequest;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
...@@ -20,14 +21,15 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -20,14 +21,15 @@ import org.springframework.transaction.annotation.Transactional;
import yangtz.cs.liu.activiti.service.IProcessService; import yangtz.cs.liu.activiti.service.IProcessService;
import yangtz.cs.liu.campus.domain.auditorium.SchoolAuditorium; import yangtz.cs.liu.campus.domain.auditorium.SchoolAuditorium;
import yangtz.cs.liu.campus.mapper.auditorium.SchoolAuditoriumMapper; import yangtz.cs.liu.campus.mapper.auditorium.SchoolAuditoriumMapper;
import yangtz.cs.liu.campus.mapper.teacher.SchoolTeacherMapper;
import yangtz.cs.liu.campus.service.auditorium.ISchoolAuditoriumService; import yangtz.cs.liu.campus.service.auditorium.ISchoolAuditoriumService;
import yangtz.cs.liu.campus.vo.auditorium.SchoolAuditoriumVo; import yangtz.cs.liu.campus.vo.auditorium.SchoolAuditoriumVo;
import yangtz.cs.liu.dingding.utils.DingProcessInstanceUtils;
import yangtz.cs.liu.dingding.vo.DingProcessInstanceVo;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.text.SimpleDateFormat;
import java.util.Comparator; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.core.constant.ProcessCommon.PENDING; import static com.core.constant.ProcessCommon.PENDING;
...@@ -53,6 +55,10 @@ public class SchoolAuditoriumServiceImpl extends ServiceImpl<SchoolAuditoriumMap ...@@ -53,6 +55,10 @@ public class SchoolAuditoriumServiceImpl extends ServiceImpl<SchoolAuditoriumMap
private IProcessService processService; private IProcessService processService;
@Autowired @Autowired
private HistoryService historyService; private HistoryService historyService;
@Autowired
private DingProcessInstanceUtils instanceUtils;
@Autowired
private SchoolTeacherMapper schoolTeacherMapper;
/** /**
* 查询学校礼堂预约 * 查询学校礼堂预约
...@@ -271,6 +277,95 @@ public class SchoolAuditoriumServiceImpl extends ServiceImpl<SchoolAuditoriumMap ...@@ -271,6 +277,95 @@ public class SchoolAuditoriumServiceImpl extends ServiceImpl<SchoolAuditoriumMap
List<SchoolAuditoriumVo> resList = list.stream().sorted(Comparator.comparing(SchoolAuditoriumVo::getApplyTime).reversed()).collect(Collectors.toList()); List<SchoolAuditoriumVo> resList = list.stream().sorted(Comparator.comparing(SchoolAuditoriumVo::getApplyTime).reversed()).collect(Collectors.toList());
return resList; return resList;
} }
/**
* 发送钉钉审批实例
* @param schoolAuditorium
* @return
*/
@Override
public String sendDdInstance(SchoolAuditorium schoolAuditorium) {
//转换时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date time = schoolAuditorium.getActivityTime();
String activityTime = format.format(time);
//获取钉钉用户id
String ddUserIdByUserId = schoolTeacherMapper.getDdUserIdByUserId(schoolAuditorium.getApplyId());
DingProcessInstanceVo dingProcessInstanceVo = new DingProcessInstanceVo();
dingProcessInstanceVo.setOriginatorUserId(ddUserIdByUserId);
dingProcessInstanceVo.setDeptId(896846044L);
dingProcessInstanceVo.setProcessCode("PROC-DB0E3FEC-562B-4023-AA4A-CC33963D3537");
dingProcessInstanceVo.setCcList(Arrays.asList(ddUserIdByUserId));
dingProcessInstanceVo.setCcPosition("START");
StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners targetSelectActioners = new StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners();
targetSelectActioners.setActionerKey("manual_1918_5cd3_6444_06af");
targetSelectActioners.setActionerUserIds(Arrays.asList(ddUserIdByUserId));
dingProcessInstanceVo.setTargetSelectActioners(Arrays.asList(targetSelectActioners));
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues1 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues1.setName("活动名称");
componentValues1.setValue(schoolAuditorium.getActivityName());
componentValues1.setComponentType("TextField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues2 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues2.setName("活动场地");
componentValues2.setValue(schoolAuditorium.getActivityArea());
componentValues2.setComponentType("TextField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues3 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues3.setName("活动时间");
componentValues3.setValue(activityTime);
componentValues3.setComponentType("DDDateField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues4 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues4.setName("具体负责人");
componentValues4.setValue(schoolAuditorium.getSpecificUserName());
componentValues4.setComponentType("TextField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues5 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues5.setName("活动人数");
componentValues5.setValue(schoolAuditorium.getActivityNumber().toString());
componentValues5.setComponentType("NumberField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues6 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues6.setName("预计时长");
componentValues6.setValue(schoolAuditorium.getDuration());
componentValues6.setComponentType("TextField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues7 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues7.setName("是否彩排");
if(schoolAuditorium.getIsRehearsal().equals("1")){
componentValues7.setValue("是");
}else {
componentValues7.setValue("否");
}
componentValues7.setComponentType("DDSelectField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues8 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues8.setName("是否录像");
if(schoolAuditorium.getIsVideo().equals("1")){
componentValues8.setValue("是");
}else {
componentValues8.setValue("否");
}
componentValues8.setComponentType("DDSelectField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues9 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues9.setName("是否直播");
if(schoolAuditorium.getIsLive().equals("1")){
componentValues9.setValue("是");
}else {
componentValues9.setValue("否");
}
componentValues9.setComponentType("DDSelectField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues10 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues10.setName("是否需要大屏");
if(schoolAuditorium.getIsBigScreen().equals("1")){
componentValues10.setValue("是");
}else {
componentValues10.setValue("否");
}
componentValues10.setComponentType("DDSelectField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues11 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues11.setName("其他要求");
componentValues11.setValue(schoolAuditorium.getOtherRequirements());
componentValues11.setComponentType("TextField");
dingProcessInstanceVo.setFormComponentValues(Arrays.asList(componentValues1,componentValues2,componentValues3,componentValues4,componentValues5,componentValues6,componentValues7,componentValues8,componentValues9,componentValues10,componentValues11));
return instanceUtils.sendProcessInstance(dingProcessInstanceVo);
}
} }
......
...@@ -635,4 +635,30 @@ public class SchoolTeacherServiceImpl extends ServiceImpl<SchoolTeacherMapper, S ...@@ -635,4 +635,30 @@ public class SchoolTeacherServiceImpl extends ServiceImpl<SchoolTeacherMapper, S
public String getOpenIdByUserId(Long userId) { public String getOpenIdByUserId(Long userId) {
return schoolTeacherMapper.getOpenIdByUserId(userId); return schoolTeacherMapper.getOpenIdByUserId(userId);
} }
@Override
public String getDdUserIdByUserId(Long userId) {
return schoolTeacherMapper.getDdUserIdByUserId(userId);
}
@Override
public String getUnionIdByUserId(Long userId) {
return schoolTeacherMapper.getUnionIdByUserId(userId);
}
public void updateDdUserId(SysUser sysUser,String ddUserId) {
//更新教师表钉钉用户id
SchoolTeacher schoolTeacher = new SchoolTeacher();
schoolTeacher.setId(sysUser.getUserId());
schoolTeacher.setDdUserId(ddUserId);
schoolTeacher.setUnionId(sysUser.getUnionId());
schoolTeacherMapper.updateById(schoolTeacher);
//更新用户表钉钉用户id
SysUser user = new SysUser();
user.setUserId(sysUser.getUserId());
user.setDdUserId(ddUserId);
user.setUnionId(sysUser.getUnionId());
sysUserMapper.updateUser(user);
}
} }
...@@ -145,5 +145,17 @@ public interface ISchoolTeacherService extends IService<SchoolTeacher> { ...@@ -145,5 +145,17 @@ public interface ISchoolTeacherService extends IService<SchoolTeacher> {
*/ */
String getOpenIdByUserId(Long userId); String getOpenIdByUserId(Long userId);
/**
* 根据userId 查询 ddUserId
* @param userId
* @return
*/
String getDdUserIdByUserId(Long userId);
/**
* 根据userId 查询 unionId
* @param userId
* @return
*/
String getUnionIdByUserId(Long userId);
} }
...@@ -17,6 +17,9 @@ public class SchoolAuditoriumVo extends ProcessBaseEntity { ...@@ -17,6 +17,9 @@ public class SchoolAuditoriumVo extends ProcessBaseEntity {
/** 流程实例id */ /** 流程实例id */
private String instanceId; private String instanceId;
/** 流程实例id */
private String ddInstanceId;
/** 活动名称 */ /** 活动名称 */
@Excel(name = "活动名称") @Excel(name = "活动名称")
private String activityName; private String activityName;
...@@ -117,6 +120,9 @@ public class SchoolAuditoriumVo extends ProcessBaseEntity { ...@@ -117,6 +120,9 @@ public class SchoolAuditoriumVo extends ProcessBaseEntity {
/** 附件下载路径 */ /** 附件下载路径 */
private String fjxzlj; private String fjxzlj;
/** 消息任务id */
private Long ddTaskId;
/** 创建人id */ /** 创建人id */
private Long createById; private Long createById;
/** 创建人 */ /** 创建人 */
......
package yangtz.cs.liu.dingding.config;
/**
* 项目中的常量定义类
*/
public class Constant {
public static final String AES_TOKEN="jGt2S7Kqh475czbgxtr7j1cQsXHWYia";
public static final String AES_KEY="hz6q2qTgLGD5SHWLvVddOm9HfvrKgKBcDCCf145egyi";
public static final String OWNER_KEY = "dingclpf8qoxvinhksyh";
}
package yangtz.cs.liu.dingding.controller;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiUserGetuserinfoRequest;
import com.dingtalk.api.request.OapiV2UserGetRequest;
import com.dingtalk.api.response.OapiUserGetuserinfoResponse;
import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.impl.SysUserServiceImpl;
import com.taobao.api.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import yangtz.cs.liu.campus.service.impl.teacher.SchoolTeacherServiceImpl;
import yangtz.cs.liu.dingding.utils.AccessTokenUtils;
import java.util.HashMap;
import java.util.Map;
/**
*
* 企业内部应用免登
* @author openapi@dingtalk
* 2020-11-3
*/
@RestController
@RequestMapping("/dd/user")
public class DdLoginController {
@Autowired
private AccessTokenUtils accessTokenUtils;
@Autowired
private SysUserServiceImpl sysUserService;
@Autowired
private SysLoginService loginService;
@Autowired
private SchoolTeacherServiceImpl schoolTeacherService;
/**
*
* @param code
* @return
* ServiceResult
* 2020-11-3
*/
@RequestMapping(value = "/login", method = RequestMethod.GET)
public AjaxResult login (@RequestParam("code") String code) {
AjaxResult ajaxResult = new AjaxResult();
// // 获取access_token,注意正式代码要有异常流处理
// String access_token= accessTokenUtils.getToken();
// // 获取用户信息
// DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
// OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
// request.setCode(code);
// request.setHttpMethod("GET");
// OapiUserGetuserinfoResponse response;
// try {
// response = client.execute(request, access_token);
// } catch (ApiException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// return null;
// }
// // 查询得到当前用户的userId
// // 获得到userId之后应用应该处理应用自身的登录会话管理(session),避免后续的业务交互(前端到应用服务端)每次都要重新获取用户身份,提升用户体验
// String userId = response.getUserid();
// if (StringUtils.isEmpty(userId)){
// throw new ServiceException("免登码已失效,请重新获取");
// }
// //获取用户详细信息
// Map<String, Object> userInfo = getUserInfo(userId, access_token);
// String phone = (String) userInfo.get("phone");
// String unionId = (String) userInfo.get("unionId");
SysUser sysUser = sysUserService.selectUserByPhonenumber("15888888888");
if (StringUtils.isNull(sysUser)){
throw new ServiceException("未查询到该用户信息");
}
//更新钉钉用户iid和unionId
// sysUser.setUnionId(unionId);
// schoolTeacherService.updateDdUserId(sysUser, userId);
String token = loginService.loginNew(sysUser);
ajaxResult.put(Constants.TOKEN, token);
return ajaxResult;
}
public Map<String,Object> getUserInfo(String userId,String token){
Map<String,Object> map = new HashMap<>();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userId);
OapiV2UserGetResponse rsp = client.execute(req, token);
OapiV2UserGetResponse.UserGetResponse result = rsp.getResult();
String name = result.getName();
String phone = result.getMobile();
String unionId = result.getUnionid();
map.put("userName",name);
map.put("phone",phone);
map.put("unionId",unionId);
} catch (ApiException e) {
e.printStackTrace();
}
return map;
}
}
package yangtz.cs.liu.dingding.controller;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/dd/school/dept")
public class DdSchoolDeptController {
@GetMapping("/getDeptList")
public TableDataInfo getDeptList(){
return null;
}
}
package yangtz.cs.liu.dingding.controller.dingEvent;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import yangtz.cs.liu.dingding.config.Constant;
import yangtz.cs.liu.dingding.utils.AccessTokenUtils;
import yangtz.cs.liu.dingding.utils.DingCallbackCrypto;
import java.util.Map;
/**
* 钉钉事件与回调
*/
@RestController
@RequestMapping("/dd/school/event")
public class DingEventController {
private static Logger log = LoggerFactory.getLogger(DingEventController.class);
@PostMapping("/callBack")
public Map<String, String> callBack(
@RequestParam(value = "msg_signature", required = false) String msg_signature,
@RequestParam(value = "timestamp", required = false) String timeStamp,
@RequestParam(value = "nonce", required = false) String nonce,
@RequestBody(required = false) JSONObject json) {
try {
// 1. 从http请求中获取加解密参数
// 2. 使用加解密类型
// Constant.OWNER_KEY 说明:
// 1、开发者后台配置的订阅事件为应用级事件推送,此时OWNER_KEY为应用的APP_KEY。
// 2、调用订阅事件接口订阅的事件为企业级事件推送,
// 此时OWNER_KEY为:企业的appkey(企业内部应用)或SUITE_KEY(三方应用)
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(Constant.AES_TOKEN, Constant.AES_KEY, Constant.OWNER_KEY);
String encryptMsg = json.getString("encrypt");
String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encryptMsg);
// 3. 反序列化回调事件json数据
JSONObject eventJson = JSON.parseObject(decryptMsg);
String eventType = eventJson.getString("EventType");
// 4. 根据EventType分类处理
if ("check_url".equals(eventType)) {
// 测试回调url的正确性
log.info("测试回调url的正确性");
} else if ("user_add_org".equals(eventType)) {
// 处理通讯录用户增加事件
log.info("发生了:" + eventType + "事件");
} else if ("bpms_instance_change".equals(eventType)){
// 处理审批实例事件
processInstance(eventJson);
} else if ("bpms_task_change".equals(eventType)){
// 处理审批任务事件
eventJson.get("");
} else {
// 添加其他已注册的
log.info("发生了:" + eventType + "事件");
}
// 5. 返回success的加密数据
Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
return successMap;
} catch (DingCallbackCrypto.DingTalkEncryptException e) {
e.printStackTrace();
}
return null;
}
/**
* 处理审批实例事件
*/
public void processInstance(JSONObject eventJson){
//获取审批类型
String type = eventJson.getString("type");
//判断审批实例是否正常结束
if ("finish".equals(type)){
}
}
}
package yangtz.cs.liu.dingding.controller.dingMessage;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.response.OapiMessageCorpconversationGetsendprogressResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationGetsendresultResponse;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import yangtz.cs.liu.dingding.utils.DingMessageUtils;
import yangtz.cs.liu.dingding.vo.DingMessageVo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 消息通知
*/
@RestController
@RequestMapping("/dd/school/message")
public class DingMessageController {
@Autowired
private DingMessageUtils dingMessageUtils;
/**
* 发送消息通知
*/
@PostMapping("/sendMessage")
public AjaxResult sendMessage(@RequestBody DingMessageVo messageVo){
AjaxResult ajaxResult = AjaxResult.success();
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
msg.getOa().getHead().setText("text");
msg.getOa().getHead().setBgcolor("FFBBBBBB");
msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
msg.getOa().getBody().setAuthor("");
msg.getOa().getBody().setContent("");
msg.getOa().getBody().setTitle("测试请假审批消息通知");
OapiMessageCorpconversationAsyncsendV2Request.Form form1 = new OapiMessageCorpconversationAsyncsendV2Request.Form();
form1.setKey("开始时间");
form1.setValue("2023-09-23 08:00");
OapiMessageCorpconversationAsyncsendV2Request.Form form2 = new OapiMessageCorpconversationAsyncsendV2Request.Form();
form2.setKey("结束时间");
form2.setValue("2023-09-24 18:00");
msg.getOa().getBody().setForm(Arrays.asList(form1,form2));
msg.getOa().setPcMessageUrl("https://open.dingtalk.com/");
msg.getOa().setMessageUrl("https://open.dingtalk.com/");
msg.setMsgtype("oa");
OapiMessageCorpconversationAsyncsendV2Request.StatusBar statusBar = new OapiMessageCorpconversationAsyncsendV2Request.StatusBar();
statusBar.setStatusBg("0xFFF65E5E");
statusBar.setStatusValue("进行中");
msg.getOa().setStatusBar(statusBar);
messageVo.setMsg(msg);
messageVo.setToAllUser(false);
messageVo.setUseridList("02144054095224351571");
Long taskId = dingMessageUtils.sendMessage(messageVo);
ajaxResult.put("taskId",taskId);
return ajaxResult;
}
/**
* 撤回工作通知消息
*/
@GetMapping("/recallMessage")
public AjaxResult recallMessage(Long taskId){
String message = dingMessageUtils.recallMessage(taskId);
return AjaxResult.success(message);
}
/**
* 更新工作通知状态栏
*/
@GetMapping("/updateStatusBar")
public AjaxResult updateStatusBar(Long taskId, String statusValue, String statusBg){
String message = dingMessageUtils.updateStatusBar(taskId, statusValue, statusBg);
return AjaxResult.success(message);
}
/**
* 获取工作通知消息的发送进度
*/
@GetMapping("/getSendProgress")
public AjaxResult getSendProgress(Long taskId){
OapiMessageCorpconversationGetsendprogressResponse.AsyncSendProgress sendProgress = dingMessageUtils.getSendProgress(taskId);
return AjaxResult.success(sendProgress);
}
/**
* 获取工作通知消息的发送结果
*/
@GetMapping("/getSendResult")
public AjaxResult getSendResult(Long taskId){
OapiMessageCorpconversationGetsendresultResponse.AsyncSendResult sendResult = dingMessageUtils.getSendResult(taskId);
return AjaxResult.success(sendResult);
}
}
package yangtz.cs.liu.dingding.controller.dingProcess;
import com.aliyun.dingtalkworkflow_1_0.models.ProcessForecastResponseBody;
import com.aliyun.dingtalkworkflow_1_0.models.QuerySchemaByProcessCodeResponseBody;
import com.aliyun.dingtalkworkflow_1_0.models.StartProcessInstanceRequest;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import yangtz.cs.liu.dingding.utils.DingProcessInstanceUtils;
import yangtz.cs.liu.dingding.vo.DingHandleVo;
import yangtz.cs.liu.dingding.vo.DingProcessInstanceVo;
import yangtz.cs.liu.dingding.vo.DingTransferVo;
import java.util.Arrays;
import java.util.Map;
/**
* 审批实例
*/
@RestController
@RequestMapping("/dd/school/instance")
public class DingProcessController {
@Autowired
private DingProcessInstanceUtils instanceUtils;
/**
* 发送审批实例
*/
@PostMapping("/createInstance")
public AjaxResult createInstance(@RequestBody DingProcessInstanceVo instanceVo){
AjaxResult ajaxResult = AjaxResult.success();
DingProcessInstanceVo dingProcessInstanceVo = new DingProcessInstanceVo();
// StartProcessInstanceRequest.StartProcessInstanceRequestApprovers approvers = new StartProcessInstanceRequest.StartProcessInstanceRequestApprovers();
// approvers.setActionType("NONE");
// approvers.setUserIds(Arrays.asList("02144054095224351571"));
// dingProcessInstanceVo.setApprovers(Arrays.asList(approvers));
dingProcessInstanceVo.setOriginatorUserId("02144054095224351571");
dingProcessInstanceVo.setDeptId(896846044L);
dingProcessInstanceVo.setProcessCode("PROC-D907CDA3-F8C7-4E4F-8A8B-6A9E71287295");
dingProcessInstanceVo.setCcList(Arrays.asList("02144054095224351571"));
dingProcessInstanceVo.setCcPosition("START");
StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners targetSelectActioners = new StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners();
targetSelectActioners.setActionerKey("manual_1918_5cd3_de98_c68d");
targetSelectActioners.setActionerUserIds(Arrays.asList("02144054095224351571"));
dingProcessInstanceVo.setTargetSelectActioners(Arrays.asList(targetSelectActioners));
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues1 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues1.setName("请假类型");
componentValues1.setValue("事假");
componentValues1.setComponentType("DDSelectField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues2 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues2.setName("[\"开始时间\",\"结束时间\"]");
componentValues2.setValue("[\"2023-09-20 08:00\",\"2019-09-20 18:00\"]");
componentValues2.setComponentType("DDDateRangeField");
StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues componentValues3 = new StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues();
componentValues3.setName("请假事由");
componentValues3.setValue("有事");
componentValues3.setComponentType("TextField");
dingProcessInstanceVo.setFormComponentValues(Arrays.asList(componentValues1,componentValues2,componentValues3));
String instanceId = instanceUtils.sendProcessInstance(dingProcessInstanceVo);
ajaxResult.put("instanceId",instanceId);
return ajaxResult;
}
/**
* 获取表单schema
*/
@GetMapping("/getSchema")
public AjaxResult getSchema(String processCode){
QuerySchemaByProcessCodeResponseBody.QuerySchemaByProcessCodeResponseBodyResult schema = instanceUtils.getSchema(processCode);
return AjaxResult.success(schema);
}
/**
* 获取审批单流程中的节点信息
*/
@PostMapping("/getForecast")
public AjaxResult getForecast(@RequestBody DingProcessInstanceVo instanceVo){
ProcessForecastResponseBody.ProcessForecastResponseBodyResult forecast = instanceUtils.getForecast(instanceVo);
return AjaxResult.success(forecast);
}
/**
* 获取指定用户可见的审批表单列表
*/
@GetMapping("/getTemplates")
public AjaxResult getTemplates(String userId, Long maxResults, Long nextToken){
return AjaxResult.success(instanceUtils.getTemplates(userId,maxResults,nextToken));
}
/**
* 获取当前企业所有可管理的表单
*/
@GetMapping("/getManageTemplates")
public AjaxResult getManageTemplates(String userId){
return AjaxResult.success(instanceUtils.getManageTemplates(userId));
}
/**
* 获取单个审批实例详情
*/
@GetMapping("/getProcessInstance")
public AjaxResult getProcessInstance(String processInstanceId){
return AjaxResult.success(instanceUtils.getProcessInstance(processInstanceId));
}
/**
* 撤销审批实例
*/
@GetMapping("/terminate")
public AjaxResult terminate(String processInstanceId, Boolean isSystem, String remark, String operatingUserId){
return AjaxResult.success(instanceUtils.terminate(processInstanceId, isSystem, remark, operatingUserId));
}
/**
* 同意或拒绝审批任务
*/
@PostMapping("/handleProcessInstance")
public AjaxResult handleProcessInstance(DingHandleVo handleVo){
Map<String, Boolean> map = instanceUtils.handleProcessInstance(handleVo);
return AjaxResult.success(map);
}
/**
* 转交审批任务
*/
@PostMapping("/transferInstance")
public AjaxResult transferInstance(DingTransferVo transferVo){
Boolean result = instanceUtils.transferInstance(transferVo);
return AjaxResult.success(result);
}
/**
* 获取用户待审批数量
*/
@GetMapping("/getUserTodoTasksNumbers")
public AjaxResult getUserTodoTasksNumbers(String userId){
Integer userTodoTasksNumbers = instanceUtils.getUserTodoTasksNumbers(userId);
return AjaxResult.success(userTodoTasksNumbers);
}
}
package yangtz.cs.liu.dingding.controller.dingRole;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/dd/school/role")
public class DingRoleController {
}
package yangtz.cs.liu.dingding.controller.dingUser;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import yangtz.cs.liu.dingding.utils.DingUserUtils;
/**
* 钉钉用户管理
*/
@RestController
@RequestMapping("/dd/school/user")
public class DingUserController extends BaseController {
@Autowired
private DingUserUtils dingUserUtils;
/**
* 获取部门用户基础信息
*/
@GetMapping("/getUserByDeptId")
public TableDataInfo getUserByDeptId(@RequestParam("deptId") Long deptId,
@RequestParam("cursor") Long cursor,
@RequestParam("size") Long size,
@RequestParam("orderField") String orderField,
@RequestParam("containAccessLimit") String containAccessLimit,
@RequestParam("language") String language)
{
return getDataTable(dingUserUtils.getUserByDeptId(deptId, cursor, size, orderField, containAccessLimit, language));
}
/**
* 获取部门用户完整信息
*/
@GetMapping("/getUserInfoByDeptId")
public TableDataInfo getUserInfoByDeptId(@RequestParam("deptId") Long deptId,
@RequestParam("cursor") Long cursor,
@RequestParam("size") Long size,
@RequestParam("orderField") String orderField,
@RequestParam("containAccessLimit") String containAccessLimit,
@RequestParam("language") String language)
{
return getDataTable(dingUserUtils.getUserInfoByDeptId(deptId, cursor, size, orderField, containAccessLimit, language));
}
/**
* 获取用户详情
*/
@GetMapping("/getUser")
public AjaxResult getUser(@RequestParam("userId") String userId){
return AjaxResult.success(dingUserUtils.getUser(userId));
}
}
package yangtz.cs.liu.dingding.utils;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class AccessTokenUtils {
@Value("${dd.access-token-uri}")
private String accessTokenUri;
private static Logger log = LoggerFactory.getLogger(AccessTokenUtils.class);
@Autowired
public RedisCache redisCache;
/**
* 获取token
* @return
* @throws Exception
*/
public String getToken(){
String token = redisCache.getCacheObject("dd_access_token");
if (StringUtils.isEmpty(token)){
try {
String url = accessTokenUri;
// 利用hutool的http工具类请求获取access_token
String result = HttpUtil.get(url);
// 将结果解析为json
JSONObject jsonObject = JSONUtil.parseObj(result);
// 获取access_token
String accessToken = (String) jsonObject.get("access_token");
if (!StringUtils.isEmpty(accessToken)) {
token = accessToken;
log.info(accessToken);
// 将access_token存入redis
redisCache.setCacheObject("dd_access_token", accessToken, 7200, TimeUnit.MILLISECONDS);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
return token;
}
}
package yangtz.cs.liu.dingding.utils;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.ruoyi.common.utils.StringUtils;
import com.taobao.api.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import yangtz.cs.liu.dingding.vo.DingMessageVo;
/**
* 消息通知
*/
@Component
public class DingMessageUtils {
@Value("${dd.agentId}")
private Long agentId;
@Autowired
private AccessTokenUtils accessTokenUtils;
/**
* 发送消息通知
* @param messageVo
* @return
*/
public Long sendMessage(DingMessageVo messageVo){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
req.setAgentId(agentId);
if (StringUtils.isNotEmpty(messageVo.getUseridList())){
req.setUseridList(messageVo.getUseridList());
}
if (StringUtils.isNotEmpty(messageVo.getDeptIdList())){
req.setDeptIdList(messageVo.getDeptIdList());
}
if (StringUtils.isNotNull(messageVo.getToAllUser())){
req.setToAllUser(messageVo.getToAllUser());
}
if (StringUtils.isNotNull(messageVo.getMsg())){
req.setMsg(messageVo.getMsg());
}
OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, token);
return rsp.getTaskId();
} catch (ApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 撤回工作通知消息
*/
public String recallMessage(Long taskId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/recall");
OapiMessageCorpconversationRecallRequest req = new OapiMessageCorpconversationRecallRequest();
req.setAgentId(agentId);
req.setMsgTaskId(taskId);
OapiMessageCorpconversationRecallResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 更新工作通知状态栏
*/
public String updateStatusBar(Long taskId, String statusValue, String statusBg){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/status_bar/update");
OapiMessageCorpconversationStatusBarUpdateRequest req = new OapiMessageCorpconversationStatusBarUpdateRequest();
req.setAgentId(agentId);
req.setTaskId(taskId);
req.setStatusValue(statusValue);
req.setStatusBg(statusBg);
OapiMessageCorpconversationStatusBarUpdateResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 获取工作通知消息的发送进度
*/
public OapiMessageCorpconversationGetsendprogressResponse.AsyncSendProgress getSendProgress(Long taskId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/getsendprogress");
OapiMessageCorpconversationGetsendprogressRequest req = new OapiMessageCorpconversationGetsendprogressRequest();
req.setAgentId(agentId);
req.setTaskId(taskId);
OapiMessageCorpconversationGetsendprogressResponse rsp = client.execute(req, token);
return rsp.getProgress();
} catch (ApiException e) {
e.printStackTrace();
}
return new OapiMessageCorpconversationGetsendprogressResponse.AsyncSendProgress();
}
/**
* 获取工作通知消息的发送结果
*/
public OapiMessageCorpconversationGetsendresultResponse.AsyncSendResult getSendResult(Long taskId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/getsendresult");
OapiMessageCorpconversationGetsendresultRequest req = new OapiMessageCorpconversationGetsendresultRequest();
req.setAgentId(agentId);
req.setTaskId(taskId);
OapiMessageCorpconversationGetsendresultResponse rsp = client.execute(req, token);
return rsp.getSendResult();
} catch (ApiException e) {
e.printStackTrace();
}
return new OapiMessageCorpconversationGetsendresultResponse.AsyncSendResult();
}
}
package yangtz.cs.liu.dingding.utils;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.ruoyi.common.utils.StringUtils;
import com.taobao.api.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import yangtz.cs.liu.dingding.vo.DingSchoolRoleVo;
/**
* 角色管理
*/
@Component
public class DingRoleUtils {
@Autowired
private AccessTokenUtils accessTokenUtils;
/**
* 创建角色
*/
public String createRole(DingSchoolRoleVo roleVo){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/add_role");
OapiRoleAddRoleRequest req = new OapiRoleAddRoleRequest();
req.setRoleName(roleVo.getRoleName());
req.setGroupId(roleVo.getGroupId());
OapiRoleAddRoleResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 创建角色组
*/
public String createRoleGroup(String name){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/add_role_group");
OapiRoleAddrolegroupRequest req = new OapiRoleAddrolegroupRequest();
req.setName(name);
OapiRoleAddrolegroupResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 更新角色名称
* @param roleId 角色id
* @param roleName 角色名称
* @return
*/
public String updateRoleName(Long roleId, String roleName){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/role/update_role");
OapiRoleUpdateRoleRequest req = new OapiRoleUpdateRoleRequest();
req.setRoleId(roleId);
req.setRoleName(roleName);
OapiRoleUpdateRoleResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 批量增加员工角色
*/
public String createRolesForemps(String roleIds, String userIds){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/addrolesforemps");
OapiRoleAddrolesforempsRequest req = new OapiRoleAddrolesforempsRequest();
req.setRoleIds(roleIds);
req.setUserIds(userIds);
OapiRoleAddrolesforempsResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 删除角色
*/
public String deleteRole(Long roleId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/deleterole");
OapiRoleDeleteroleRequest req = new OapiRoleDeleteroleRequest();
req.setRoleId(roleId);
OapiRoleDeleteroleResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 批量删除员工角色
*/
public String deleteRolesForemps(String roleIds, String userIds){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/removerolesforemps");
OapiRoleRemoverolesforempsRequest req = new OapiRoleRemoverolesforempsRequest();
req.setRoleIds(roleIds);
req.setUserIds(userIds);
OapiRoleRemoverolesforempsResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 设定角色成员管理范围
* @param deptIds 部门ID列表,多个部门id之间使用逗号分隔。最多支持50个部门ID,不传则设置范围为所有人。
* @param roleId 角色ID
* @param userId 员工在企业中的userId
*/
public String updateRoleScope(String deptIds, Long roleId, String userId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/scope/update");
OapiRoleScopeUpdateRequest req = new OapiRoleScopeUpdateRequest();
req.setUserid(userId);
req.setRoleId(roleId);
if (StringUtils.isNotEmpty(deptIds)){
req.setDeptIds(deptIds);
}
OapiRoleScopeUpdateResponse rsp = client.execute(req, token);
return rsp.getErrmsg();
} catch (ApiException e) {
e.printStackTrace();
}
return "";
}
/**
* 获取角色组列表
*/
public OapiRoleGetrolegroupResponse.OpenRoleGroup getRoleGroupList(Long groupId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/getrolegroup");
OapiRoleGetrolegroupRequest req = new OapiRoleGetrolegroupRequest();
req.setGroupId(groupId);
OapiRoleGetrolegroupResponse rsp = client.execute(req, token);
return rsp.getRoleGroup();
} catch (ApiException e) {
e.printStackTrace();
}
return new OapiRoleGetrolegroupResponse.OpenRoleGroup();
}
/**
* 获取角色列表
*/
public OapiRoleListResponse.PageVo getRoleList(Long size, Long offset){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/list");
OapiRoleListRequest req = new OapiRoleListRequest();
if (StringUtils.isNotNull(size)){
req.setSize(size);
}
if (StringUtils.isNotNull(offset)){
req.setOffset(offset);
}
OapiRoleListResponse rsp = client.execute(req, token);
return rsp.getResult();
} catch (ApiException e) {
e.printStackTrace();
}
return new OapiRoleListResponse.PageVo();
}
/**
* 获取角色详情
*/
public OapiRoleGetroleResponse.OpenRole getRole(Long roleId){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/getrole");
OapiRoleGetroleRequest req = new OapiRoleGetroleRequest();
req.setRoleId(roleId);
OapiRoleGetroleResponse rsp = client.execute(req, token);
return rsp.getRole();
} catch (ApiException e) {
e.printStackTrace();
}
return new OapiRoleGetroleResponse.OpenRole();
}
/**
* 获取指定角色的员工列表
*/
public OapiRoleSimplelistResponse.PageVo getRoleSimpleList(Long roleId,Long offset, Long size){
//获取access_token
String token = accessTokenUtils.getToken();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/role/simplelist");
OapiRoleSimplelistRequest req = new OapiRoleSimplelistRequest();
req.setRoleId(roleId);
if (StringUtils.isNotNull(size)){
req.setSize(size);
}
if (StringUtils.isNotNull(offset)){
req.setOffset(offset);
}
OapiRoleSimplelistResponse rsp = client.execute(req, token);
return rsp.getResult();
} catch (ApiException e) {
e.printStackTrace();
}
return new OapiRoleSimplelistResponse.PageVo();
}
}
package yangtz.cs.liu.dingding.utils;
import com.aliyun.tea.TeaException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import yangtz.cs.liu.dingding.vo.DingSchoolTaskVo;
/**
* 待办已办任务
*/
@Component
public class DingTaskUtils {
@Autowired
private AccessTokenUtils accessTokenUtils;
private static Logger log = LoggerFactory.getLogger(DingTaskUtils.class);
/**
* 使用 Token 初始化账号Client
* @return Client
* @throws Exception
*/
public com.aliyun.dingtalktodo_1_0.Client createClient() {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.protocol = "https";
config.regionId = "central";
try {
return new com.aliyun.dingtalktodo_1_0.Client(config);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 创建待办任务
*/
public void createTask(DingSchoolTaskVo taskVo) {
//获取access_token
String token = accessTokenUtils.getToken();
com.aliyun.dingtalktodo_1_0.Client client = createClient();
com.aliyun.dingtalktodo_1_0.models.CreateTodoTaskHeaders createTodoTaskHeaders = new com.aliyun.dingtalktodo_1_0.models.CreateTodoTaskHeaders();
createTodoTaskHeaders.xAcsDingtalkAccessToken = token;
com.aliyun.dingtalktodo_1_0.models.CreateTodoTaskRequest createTodoTaskRequest = new com.aliyun.dingtalktodo_1_0.models.CreateTodoTaskRequest()
.setSourceId(taskVo.getSourceId())
.setSubject(taskVo.getSubject())
.setCreatorId(taskVo.getCreatorId())
.setDescription(taskVo.getDescription())
.setDueTime(taskVo.getDueTime())
.setExecutorIds(taskVo.getExecutorIds())
.setParticipantIds(taskVo.getParticipantIds())
.setDetailUrl(taskVo.getDetailUrl())
.setIsOnlyShowExecutor(taskVo.getIsOnlyShowExecutor())
.setPriority(taskVo.getPriority())
.setNotifyConfigs(taskVo.getNotifyConfigs())
.setOperatorId(taskVo.getOperatorId());
try {
client.createTodoTaskWithOptions(taskVo.getCreatorId(), createTodoTaskRequest, createTodoTaskHeaders, new com.aliyun.teautil.models.RuntimeOptions());
} catch (TeaException err) {
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
log.info(err.code);
log.info(err.message);
}
} catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err);
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
log.info(err.code);
log.info(err.message);
}
}
}
}
package yangtz.cs.liu.dingding.vo;
import com.aliyun.dingtalkworkflow_1_0.models.ExecuteProcessInstanceRequest;
import com.aliyun.tea.NameInMap;
import lombok.Data;
/**
* 审批处理vo
*/
@Data
public class DingHandleVo {
/** 审批实例ID */
@NameInMap("processInstanceId")
public String processInstanceId;
/** 审批意见 */
@NameInMap("remark")
public String remark;
/** 审批操作: 取值:agree 同意 refuse 拒绝 */
@NameInMap("result")
public String result;
/** 操作人的userId */
@NameInMap("actionerUserId")
public String actionerUserId;
/** 任务id */
@NameInMap("taskId")
public Long taskId;
/** 文件 */
@NameInMap("file")
public ExecuteProcessInstanceRequest.ExecuteProcessInstanceRequestFile file;
}
package yangtz.cs.liu.dingding.vo;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.taobao.api.internal.util.json.JSONWriter;
import lombok.Data;
/**
* 消息通知
*/
@Data
public class DingMessageVo {
/** 发送消息时使用的微应用的AgentID */
private Long agentId;
/** 接收者的部门id列表,最大列表长度20 接收者是部门ID时,包括子部门下的所有用户 */
private String deptIdList;
/** 消息内容,最长不超过2048个字节 支持以下工作通知类型(文本消息,图片消息,语音消息,文件消息,链接消息,OA消息,Markdown消息,卡片消息) */
private String msg;
/** 是否发送给企业全部用户 */
private Boolean toAllUser;
/** 接收者的userid列表,最大用户列表长度100 */
private String useridList;
public void setMsg(String msg) {
this.msg = msg;
}
public void setMsg(OapiMessageCorpconversationAsyncsendV2Request.Msg msg) {
this.msg = (new JSONWriter(false, false, true)).write(msg);
}
public String getMsg() {
return this.msg;
}
}
package yangtz.cs.liu.dingding.vo;
import com.aliyun.dingtalkworkflow_1_0.models.ProcessForecastRequest;
import com.aliyun.dingtalkworkflow_1_0.models.StartProcessInstanceRequest;
import com.aliyun.tea.NameInMap;
import lombok.Data;
import java.util.List;
/**
* 审批实例
*/
@Data
public class DingProcessInstanceVo {
/** 不使用审批流模板时,直接指定的审批人列表,最大列表长度:20 */
@NameInMap("approvers")
public List<StartProcessInstanceRequest.StartProcessInstanceRequestApprovers> approvers;
/** 抄送人 userId */
@NameInMap("ccList")
public List<String> ccList;
/** 抄送时间点,取值 START:开始时抄送 FINISH:结束时抄送 START_FINISH:开始和结束时都抄送 */
@NameInMap("ccPosition")
public String ccPosition;
/** 审批发起人所在的部门ID */
@NameInMap("deptId")
public Long deptId;
/** 创建审批实例 : 表单数据内容,控件列表,最大列表长度:150 */
@NameInMap("formComponentValues")
public List<StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues> formComponentValues;
/** 获取审批单流程中的节点信息 : 表单数据内容,控件列表,最大列表长度:150 */
public List<ProcessForecastRequest.ProcessForecastRequestFormComponentValues> formComponentValues1;
/** 应用标识AgentId */
@NameInMap("microappAgentId")
public Long microappAgentId;
/** 审批发起人的userId */
@NameInMap("originatorUserId")
public String originatorUserId;
/** 即将发起审批单的员工userId值 */
public String userId;
/** 审批流的唯一码 */
@NameInMap("processCode")
public String processCode;
/** 使用审批流模板时,流程预测结果中节点规则上必填的自选操作人列表,最大列表长度:20 */
@NameInMap("targetSelectActioners")
public List<StartProcessInstanceRequest.StartProcessInstanceRequestTargetSelectActioners> targetSelectActioners;
}
package yangtz.cs.liu.dingding.vo;
import lombok.Data;
/**
* 部门管理
*/
@Data
public class DingSchoolDeptVo {
/** 部门id */
private Long deptId;
/** 部门名称 长度限制为1~64个字符,不允许包含字符"-"","以及"," */
private String name;
/** 父部门ID,根部门ID为1 */
private Long parentId;
/** 是否隐藏部门 */
private Boolean hideDept;
/** 指定可以查看本部门的其他部门列表,总数不能超过50 当hide_dept为true时,则此值生效 */
private String deptPermits;
/** 指定可以查看本部门的人员userId列表,总数不能超过50 当hide_dept为true时,则此值生效 */
private String userPermits;
/** 是否限制本部门成员查看通讯录 */
private Boolean outerDept;
/** 本部门成员是否只能看到所在部门及下级部门通讯录 当outer_dept为true时,此参数生效 */
private Boolean outerDeptOnlySelf;
/** 指定本部门成员可查看的通讯录用户userId列表,总数不能超过50 当outer_dept为true时,此参数生效 */
private String outerPermitUsers;
/** 指定本部门成员可查看的通讯录部门ID列表,总数不能超过50 当outer_dept为true时,此参数生效 */
private String outerPermitDepts;
/** 是否创建一个关联此部门的企业群,默认为false即不创建 */
private Boolean createDeptGroup;
/** 是否默认同意加入该部门的申请 */
private Boolean autoApproveApply;
/** 在父部门中的排序值,order值小的排序靠前 */
private Long order;
/** 通讯录语言 zh_CN:中文 en_US:英文 */
private String language;
/** 当部门群已经创建后,有新人加入部门时是否会自动加入该群 */
private Boolean autoAddUser;
/** 部门的主管userId列表,多个userid之间使用英文逗号分隔 */
private String deptManagerUseridList;
/** 部门群是否包含子部门 */
private Boolean groupContainSubDept;
/** 部门群是否包含外包部门 */
private Boolean groupContainOuterDept;
/** 部门群是否包含隐藏部门 */
private Boolean groupContainHiddenDept;
/** 企业群群主的userId */
private String orgDeptOwner;
/** 强制更新的字段,支持清空指定的字段,多个字段之间使用英文逗号分隔。目前支持字段: dept_manager_userid_list */
private String forceUpdateFields;
/** 部门标识字段 */
private String sourceIdentifier;
/** 部门简介 */
private String brief;
/** 部门联系方式 */
private String telephone;
/** 扩展字段,JSON格式 */
private String extension;
}
package yangtz.cs.liu.dingding.vo;
import lombok.Data;
/**
* 角色管理
*/
@Data
public class DingSchoolRoleVo {
/** 角色组id */
private Long groupId;
/** 角色名称 */
private String roleName;
}
package yangtz.cs.liu.dingding.vo;
import com.aliyun.dingtalktodo_1_0.models.CreateTodoTaskRequest;
import com.aliyun.tea.NameInMap;
import lombok.Data;
import java.util.List;
/**
* 任务管理
*/
@Data
public class DingSchoolTaskVo {
/** 当前操作者用户的unionId */
@NameInMap("operatorId")
public String operatorId;
/** 业务系统侧的唯一标识ID,即业务ID */
@NameInMap("sourceId")
public String sourceId;
/** 待办标题,最大长度1024 */
@NameInMap("subject")
public String subject;
/** 创建者的unionId */
@NameInMap("creatorId")
public String creatorId;
/** 待办备注描述,最大长度4096 */
@NameInMap("description")
public String description;
/** 截止时间,Unix时间戳,单位毫秒 */
@NameInMap("dueTime")
public Long dueTime;
/** 执行者的unionId,最大数量1000 */
@NameInMap("executorIds")
public List<String> executorIds;
/** 参与者的unionId,最大数量1000 */
@NameInMap("participantIds")
public List<String> participantIds;
/** 详情页url跳转地址 */
@NameInMap("detailUrl")
public CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl detailUrl;
/** 生成的待办是否仅展示在执行者的待办列表中 */
@NameInMap("isOnlyShowExecutor")
public Boolean isOnlyShowExecutor;
/** 优先级,取值: 10:较低 20:普通 30:紧急 40:非常紧急 */
@NameInMap("priority")
public Integer priority;
/** 待办通知配置 */
@NameInMap("notifyConfigs")
public CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs notifyConfigs;
@NameInMap("actionList")
public List<CreateTodoTaskRequest.CreateTodoTaskRequestActionList> actionList;
@NameInMap("bizCategoryId")
public String bizCategoryId;
@NameInMap("contentFieldList")
public List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> contentFieldList;
}
package yangtz.cs.liu.dingding.vo;
import lombok.Data;
/**
* 用户管理
*/
@Data
public class DingSchoolUserVo {
/** 员工唯一标识ID(不可修改),企业内必须唯一 */
private String userid;
/** 员工在当前开发者企业账号范围内的唯一标识 */
private String unionid;
/** 头像 */
private String avatar;
/** 员工名称,长度最大80个字符 */
private String name;
/** 手机号码,企业内必须唯一,不可重复 */
private String mobile;
/** 是否号码隐藏 */
private Boolean hideMobile;
/** 分机号,长度最大50个字符 */
private String telephone;
/** 员工工号,长度最大为50个字符 */
private String jobNumber;
/** 职位,长度最大为200个字符 */
private String title;
/** 员工个人邮箱,长度最大50个字符 */
private String email;
/** 员工的企业邮箱,长度最大100个字符 */
private String orgEmail;
/** 员工的企业邮箱类型 profession: 标准版 base:基础版 */
private String orgEmailType;
/** 办公地点,长度最大100个字符 */
private String workPlace;
/** 备注,长度最大2000个字符 */
private String remark;
/** 所属部门id列表,每次调用最多传100个部门ID */
private String deptIdList;
/** 员工在对应的部门中的排序 */
private String deptOrderList;
/** 员工在对应的部门中的职位 */
private String deptTitleList;
/** 扩展属性,可以设置多种属性,最大长度2000个字符 */
private String extension;
/** 是否开启高管模式,默认值false */
private Boolean seniorMode;
/** 入职时间,Unix时间戳,单位毫秒 */
private Long hiredDate;
/** 直属主管的userId */
private String managerUserid;
/** 登录邮箱 */
private String loginEmail;
/** 是否为企业账号 */
private Boolean exclusiveAccount;
/** 是否激活了钉钉 */
private Boolean active;
/** 部门内任职 */
private String deptPositionList;
/** 专属账号类型 sso:企业自建专属账号 dingtalk:钉钉自建专属账号 */
private String exclusiveAccountType;
/** 专属账号手机号 */
private String exclusiveMobile;
/** 手机号验证状态 */
private String exclusiveMobileVerifyStatus;
/** 强制更新的字段,支持清空指定的字段,多个字段之间使用逗号分隔。目前支持字段: manager_userid */
private String forceUpdateFields;
/** 重置专属账号密码 */
private String initPassword;
/** 语言 */
private String language;
/** 修改专属账号登录名 */
private String loginId;
/** 需要添加的专属账号所属corpid */
private String outerExclusiveCorpid;
/** 需要添加的专属账号所属userid */
private String outerExclusiveUserid;
}
package yangtz.cs.liu.dingding.vo;
import com.aliyun.dingtalkworkflow_1_0.models.RedirectWorkflowTaskRequest;
import com.aliyun.tea.NameInMap;
import lombok.Data;
/**
* 转交审批任务
*/
@Data
public class DingTransferVo {
/** 操作节点名 */
@NameInMap("actionName")
public String actionName;
/** 文件 */
@NameInMap("file")
public RedirectWorkflowTaskRequest.RedirectWorkflowTaskRequestFile file;
/** 操作人userId,需要跟任务的当前执行人保持一致,否则无法通过校验 */
@NameInMap("operateUserId")
public String operateUserId;
/** 转交备注信息 */
@NameInMap("remark")
public String remark;
/** OA审批任务ID */
@NameInMap("taskId")
public Long taskId;
/** OA审批任务被转交对象的用户userId */
@NameInMap("toUserId")
public String toUserId;
}
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
<resultMap type="SchoolAuditoriumVo" id="SchoolAuditoriumResult"> <resultMap type="SchoolAuditoriumVo" id="SchoolAuditoriumResult">
<result property="id" column="id" /> <result property="id" column="id" />
<result property="instanceId" column="instance_id" /> <result property="instanceId" column="instance_id" />
<result property="ddInstanceId" column="dd_instance_id" />
<result property="activityName" column="activity_name" /> <result property="activityName" column="activity_name" />
<result property="activityArea" column="activity_area" /> <result property="activityArea" column="activity_area" />
<result property="activityTime" column="activity_time" /> <result property="activityTime" column="activity_time" />
...@@ -31,6 +32,7 @@ ...@@ -31,6 +32,7 @@
<result property="applyDept" column="apply_dept" /> <result property="applyDept" column="apply_dept" />
<result property="fjlj" column="fjlj" /> <result property="fjlj" column="fjlj" />
<result property="fjmc" column="fjmc" /> <result property="fjmc" column="fjmc" />
<result property="ddTaskId" column="dd_task_id" />
<result property="createById" column="create_by_id" /> <result property="createById" column="create_by_id" />
<result property="createBy" column="create_by" /> <result property="createBy" column="create_by" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
...@@ -40,7 +42,7 @@ ...@@ -40,7 +42,7 @@
</resultMap> </resultMap>
<sql id="selectSchoolAuditoriumVo"> <sql id="selectSchoolAuditoriumVo">
select id, instance_id, activity_name, activity_area, activity_time, ht_number, specific_user_id, specific_user_name, activity_number, duration, is_rehearsal, is_video, is_live, is_big_screen, other_requirements, leadership_id, leadership_name, state, opinion, apply_id, apply_name, apply_time, apply_dept, apply_dept_id, fjlj, fjmc, create_by_id, create_by, create_time, update_by_id, update_by, update_time from school_auditorium select id, instance_id, dd_instance_id, activity_name, activity_area, activity_time, ht_number, specific_user_id, specific_user_name, activity_number, duration, is_rehearsal, is_video, is_live, is_big_screen, other_requirements, leadership_id, leadership_name, state, opinion, apply_id, apply_name, apply_time, apply_dept, apply_dept_id, fjlj, fjmc, dd_task_id, create_by_id, create_by, create_time, update_by_id, update_by, update_time from school_auditorium
</sql> </sql>
<select id="selectSchoolAuditoriumList" parameterType="SchoolAuditoriumVo" resultMap="SchoolAuditoriumResult"> <select id="selectSchoolAuditoriumList" parameterType="SchoolAuditoriumVo" resultMap="SchoolAuditoriumResult">
...@@ -125,6 +127,7 @@ ...@@ -125,6 +127,7 @@
insert into school_auditorium insert into school_auditorium
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">
<if test="instanceId != null and instanceId != ''">instance_id,</if> <if test="instanceId != null and instanceId != ''">instance_id,</if>
<if test="ddInstanceId != null and ddInstanceId != ''">dd_instance_id,</if>
<if test="activityName != null and activityName != ''">activity_name,</if> <if test="activityName != null and activityName != ''">activity_name,</if>
<if test="activityArea != null and activityArea != ''">activity_area,</if> <if test="activityArea != null and activityArea != ''">activity_area,</if>
<if test="activityTime != null">activity_time,</if> <if test="activityTime != null">activity_time,</if>
...@@ -146,6 +149,7 @@ ...@@ -146,6 +149,7 @@
<if test="applyDeptId != null">apply_dept_id,apply_dept,</if> <if test="applyDeptId != null">apply_dept_id,apply_dept,</if>
<if test="fjlj != null">fjlj,</if> <if test="fjlj != null">fjlj,</if>
<if test="fjmc != null">fjmc,</if> <if test="fjmc != null">fjmc,</if>
<if test="ddTaskId != null">dd_task_id,</if>
<if test="createById != null">create_by_id,create_by,</if> <if test="createById != null">create_by_id,create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
<if test="updateById != null">update_by_id,update_by,</if> <if test="updateById != null">update_by_id,update_by,</if>
...@@ -153,6 +157,7 @@ ...@@ -153,6 +157,7 @@
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="instanceId != null and instanceId != ''">#{instanceId},</if> <if test="instanceId != null and instanceId != ''">#{instanceId},</if>
<if test="ddInstanceId != null and ddInstanceId != ''">#{ddInstanceId},</if>
<if test="activityName != null and activityName != ''">#{activityName},</if> <if test="activityName != null and activityName != ''">#{activityName},</if>
<if test="activityArea != null and activityArea != ''">#{activityArea},</if> <if test="activityArea != null and activityArea != ''">#{activityArea},</if>
<if test="activityTime != null">#{activityTime},</if> <if test="activityTime != null">#{activityTime},</if>
...@@ -174,6 +179,7 @@ ...@@ -174,6 +179,7 @@
<if test="applyDeptId != null">#{applyDeptId},(select dept_name from sys_dept where dept_id = #{applyDeptId}),</if> <if test="applyDeptId != null">#{applyDeptId},(select dept_name from sys_dept where dept_id = #{applyDeptId}),</if>
<if test="fjlj != null">#{fjlj},</if> <if test="fjlj != null">#{fjlj},</if>
<if test="fjmc != null">#{fjmc},</if> <if test="fjmc != null">#{fjmc},</if>
<if test="ddTaskId != null">#{ddTaskId},</if>
<if test="createById != null">#{createById},(select user_name from sys_user where user_id = #{createById}),</if> <if test="createById != null">#{createById},(select user_name from sys_user where user_id = #{createById}),</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="updateById != null">#{updateById},(select user_name from sys_user where user_id = #{updateById}),</if> <if test="updateById != null">#{updateById},(select user_name from sys_user where user_id = #{updateById}),</if>
...@@ -185,6 +191,7 @@ ...@@ -185,6 +191,7 @@
update school_auditorium update school_auditorium
<trim prefix="SET" suffixOverrides=","> <trim prefix="SET" suffixOverrides=",">
<if test="instanceId != null and instanceId != ''">instance_id = #{instanceId},</if> <if test="instanceId != null and instanceId != ''">instance_id = #{instanceId},</if>
<if test="ddInstanceId != null and ddInstanceId != ''">dd_instance_id = #{ddInstanceId},</if>
<if test="activityName != null and activityName != ''">activity_name = #{activityName},</if> <if test="activityName != null and activityName != ''">activity_name = #{activityName},</if>
<if test="activityArea != null and activityArea != ''">activity_area = #{activityArea},</if> <if test="activityArea != null and activityArea != ''">activity_area = #{activityArea},</if>
<if test="activityTime != null">activity_time = #{activityTime},</if> <if test="activityTime != null">activity_time = #{activityTime},</if>
...@@ -206,6 +213,7 @@ ...@@ -206,6 +213,7 @@
<if test="applyDeptId != null">apply_dept_id = #{applyDeptId},apply_dept = (select dept_name from sys_dept where dept_id = #{applyDeptId}),</if> <if test="applyDeptId != null">apply_dept_id = #{applyDeptId},apply_dept = (select dept_name from sys_dept where dept_id = #{applyDeptId}),</if>
<if test="fjlj != null">fjlj = #{fjlj},</if> <if test="fjlj != null">fjlj = #{fjlj},</if>
<if test="fjmc != null">fjmc = #{fjmc},</if> <if test="fjmc != null">fjmc = #{fjmc},</if>
<if test="ddTaskId != null">dd_task_id = #{ddTaskId},</if>
<if test="createById != null">create_by_id = #{createById},create_by = (select user_name from sys_user where user_id = #{createById}),</if> <if test="createById != null">create_by_id = #{createById},create_by = (select user_name from sys_user where user_id = #{createById}),</if>
<if test="createTime != null">create_time = #{createTime},</if> <if test="createTime != null">create_time = #{createTime},</if>
<if test="updateById != null">update_by_id = #{updateById},update_by = (select user_name from sys_user where user_id = #{updateById}),</if> <if test="updateById != null">update_by_id = #{updateById},update_by = (select user_name from sys_user where user_id = #{updateById}),</if>
...@@ -224,4 +232,4 @@ ...@@ -224,4 +232,4 @@
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
</mapper> </mapper>
\ No newline at end of file
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
<result property="updateBy" column="update_by"/> <result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
<result property="openId" column="open_id"/> <result property="openId" column="open_id"/>
<result property="ddUserId" column="dd_user_id"/>
<result property="unionId" column="union_id"/>
<result property="delFlag" column="del_flag"/> <result property="delFlag" column="del_flag"/>
</resultMap> </resultMap>
...@@ -39,7 +41,9 @@ ...@@ -39,7 +41,9 @@
create_time, create_time,
update_by, update_by,
update_time, update_time,
open_id open_id,
dd_user_id,
union_id
from school_teacher from school_teacher
</sql> </sql>
...@@ -99,6 +103,8 @@ ...@@ -99,6 +103,8 @@
<if test="updateBy != null">update_by,</if> <if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if> <if test="updateTime != null">update_time,</if>
<if test="openId != null">open_id,</if> <if test="openId != null">open_id,</if>
<if test="ddUserId != null">dd_user_id,</if>
<if test="unionId != null">union_id,</if>
<if test="delFlag != null and delFlag != ''">del_flag,</if> <if test="delFlag != null and delFlag != ''">del_flag,</if>
<if test="deviceNum != null">device_num,</if> <if test="deviceNum != null">device_num,</if>
</trim> </trim>
...@@ -118,6 +124,8 @@ ...@@ -118,6 +124,8 @@
<if test="updateBy != null">#{updateBy},</if> <if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if> <if test="updateTime != null">#{updateTime},</if>
<if test="openId != null">#{openId},</if> <if test="openId != null">#{openId},</if>
<if test="ddUserId != null">#{ddUserId},</if>
<if test="unionId != null">#{unionId},</if>
<if test="delFlag != null and delFlag != ''">#{delFlag},</if> <if test="delFlag != null and delFlag != ''">#{delFlag},</if>
<if test="deviceNum != null">#{deviceNum},</if> <if test="deviceNum != null">#{deviceNum},</if>
</trim> </trim>
...@@ -139,6 +147,8 @@ ...@@ -139,6 +147,8 @@
<if test="education != null">education,</if> <if test="education != null">education,</if>
<if test="sex != null and sex != ''">sex,</if> <if test="sex != null and sex != ''">sex,</if>
<if test="openId != null">open_id,</if> <if test="openId != null">open_id,</if>
<if test="ddUserId != null">dd_user_id,</if>
<if test="unionId != null">union_id,</if>
<if test="createBy != null">create_by,</if> <if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if> <if test="updateBy != null">update_by,</if>
...@@ -159,6 +169,8 @@ ...@@ -159,6 +169,8 @@
<if test="education != null">#{education},</if> <if test="education != null">#{education},</if>
<if test="sex != null and sex != ''">#{sex},</if> <if test="sex != null and sex != ''">#{sex},</if>
<if test="openId != null">#{openId},</if> <if test="openId != null">#{openId},</if>
<if test="ddUserId != null">#{ddUserId},</if>
<if test="unionId != null">#{unionId},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if> <if test="updateBy != null">#{updateBy},</if>
...@@ -202,6 +214,8 @@ ...@@ -202,6 +214,8 @@
<if test="updateBy != null">update_by = #{updateBy},</if> <if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateTime != null">update_time = #{updateTime},</if>
<if test="openId != null">open_id = #{openId}</if> <if test="openId != null">open_id = #{openId}</if>
<if test="ddUserId != null">dd_user_id = #{ddUserId}</if>
<if test="unionId != null">union_id = #{unionId}</if>
</trim> </trim>
where id = #{id} where id = #{id}
</update> </update>
...@@ -221,6 +235,8 @@ ...@@ -221,6 +235,8 @@
<if test="education != null">education = #{education},</if> <if test="education != null">education = #{education},</if>
<if test="sex != null and sex != ''">sex = #{sex},</if> <if test="sex != null and sex != ''">sex = #{sex},</if>
<if test="openId != null">open_id = #{openId},</if> <if test="openId != null">open_id = #{openId},</if>
<if test="ddUserId != null">dd_user_id = #{ddUserId},</if>
<if test="unionId != null">union_id = #{unionId},</if>
<if test="createBy != null">create_by = #{createBy},</if> <if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if> <if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if> <if test="updateBy != null">update_by = #{updateBy},</if>
...@@ -414,5 +430,13 @@ ...@@ -414,5 +430,13 @@
select open_id from school_teacher where id = #{userId} and del_flag = '0' select open_id from school_teacher where id = #{userId} and del_flag = '0'
</select> </select>
<select id="getDdUserIdByUserId" resultType="java.lang.String">
select dd_user_id from school_teacher where id = #{userId} and del_flag = '0'
</select>
<select id="getUnionIdByUserId" resultType="java.lang.String">
select union_id from school_teacher where id = #{userId} and del_flag = '0'
</select>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment