skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/node/DeptUserTreeNode.java
New file @@ -0,0 +1,17 @@ package cn.gistack.common.node; import lombok.Data; /** * 部门用户树node * @author zhongrj * @date 2023-04-23 */ @Data public class DeptUserTreeNode extends TreeNode{ /** * 手机号 */ private String phone; } skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java
@@ -1,7 +1,9 @@ package cn.gistack.common.utils; import cn.gistack.common.node.DeptUserTreeNode; import cn.gistack.common.node.TreeNode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -32,6 +34,45 @@ } /** * map 转 tree 组织机构(父子id不会重复的情况,数据查询来自同一个表) * @param treeMap * @return */ public static List<TreeNode> getDeptAndUserNodeTree(Map<String, DeptUserTreeNode> treeMap){ List<TreeNode> tree = new ArrayList<>(); if (treeMap.size() > 1) { treeMap.forEach((id, treeNode) -> { if (!treeNode.getHasChildren()){ // 判断是否有绑定多个部门 List<String> asList = Arrays.asList(treeNode.getParentId().split(",")); if (asList.size()>1){ for (String parentId : asList) { if (treeMap.containsKey(parentId)) { treeMap.get(parentId).getChildren().add(treeNode); } else { tree.add(treeNode); } } }else { if (treeMap.containsKey(treeNode.getParentId())) { treeMap.get(treeNode.getParentId()).getChildren().add(treeNode); } else { tree.add(treeNode); } } }else { if (treeMap.containsKey(treeNode.getParentId())) { treeMap.get(treeNode.getParentId()).getChildren().add(treeNode); } else { tree.add(treeNode); } } }); } return tree; } /** * list 转 tree 组织机构 * @param parentList * @param childrenList skjcmanager/skjcmanager-service-api/skjcmanager-system-api/src/main/java/cn/gistack/system/entity/Menu.java
@@ -16,10 +16,8 @@ */ package cn.gistack.system.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.annotations.ApiModel; @@ -109,6 +107,7 @@ * 组件路径 */ @ApiModelProperty(value = "组件路径") @TableField(value = "COMPONENT_PATH",updateStrategy = FieldStrategy.IGNORED) private String componentPath; /** skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java
@@ -2,6 +2,8 @@ import cn.com.flaginfo.sdk.cmc.api.sms.dynsend.DynSMSSendRequest; import cn.com.flaginfo.sdk.cmc.api.sms.send.SMSSendRequest; import cn.gistack.sm.sms.entity.SmsRecord; import cn.gistack.sm.sms.service.ISmsRecordService; import cn.gistack.sm.sms.util.SmsUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,9 +21,42 @@ @AllArgsConstructor public class SmsController { @GetMapping("/test") public R test(SMSSendRequest request){ return R.data(SmsUtils.sendMsg(request)); private final ISmsRecordService smsRecordService; /** * 发送登录验证码 * request 必须包含手机号(多个手机号以英文逗号分隔) * @param request * @return */ @PostMapping("/sendCode") public R test(@RequestBody SMSSendRequest request){ //设置模板相关信息 String templateId = "2431012205498"; String content = "您的登录验证码是" + SmsUtils.getRandNumber() + ",5分钟内有效,请勿泄漏,如非本人操作,请忽略此信息"; request.setMessageContent(content); request.setTemplateId(templateId); // 发送操作 String sendMsg = SmsUtils.sendMsg(request); // 记录发送记录操作 saveSendRecord(request,sendMsg); // 返回发送信息 return R.data(sendMsg); } /** * 发送记录保存 * @param request 发送信息 * @param sendMsg 响应数据 */ private void saveSendRecord(SMSSendRequest request, String sendMsg) { SmsRecord smsRecord = new SmsRecord(); smsRecord.setPhone(request.getUserNumber()); smsRecord.setContent(request.getMessageContent()); smsRecord.setTemplateId(request.getTemplateId()); smsRecord.setResContent(sendMsg); //插入记录 smsRecordService.save(smsRecord); } @PostMapping("/test1") skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsRecordController.java
New file @@ -0,0 +1,98 @@ package cn.gistack.sm.sms.controller; import cn.gistack.sm.sms.entity.SmsRecord; import cn.gistack.sm.sms.service.ISmsRecordService; import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; import org.springframework.web.bind.annotation.*; import java.util.Arrays; /** * 短信发送记录控制层 * @author zhongrj * @date 2023-04-23 */ @Slf4j @Api(tags="短信发送记录") @RestController @RequestMapping("/smsRecord/smsRecord") @AllArgsConstructor public class SmsRecordController extends BladeController { private ISmsRecordService smsRecordService; /** * 分页列表查询 * @return */ @ApiOperation(value="短信发送记录-分页列表查询", notes="短信发送记录-分页列表查询") @GetMapping(value = "/list") public R queryPageList(SmsRecord smsRecord, Query query) { IPage<SmsRecord> pageList = smsRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(smsRecord)); return R.data(pageList); } /** * 添加 */ @ApiOperation(value="短信发送记录-添加", notes="短信发送记录-添加") @PostMapping(value = "/add") public R add(@RequestBody SmsRecord smsRecord) { return R.data(smsRecordService.save(smsRecord)); } /** * 编辑 * @return */ @ApiOperation(value="短信发送记录-编辑", notes="短信发送记录-编辑") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public R edit(@RequestBody SmsRecord smsRecord) { return R.data(smsRecordService.updateById(smsRecord)); } /** * 通过id删除 * * @param id * @return */ @ApiOperation(value="短信发送记录-通过id删除", notes="短信发送记录-通过id删除") @DeleteMapping(value = "/delete") public R delete(@RequestParam(name="id",required=true) String id) { return R.data(smsRecordService.removeById(id)); } /** * 批量删除 * * @param ids * @return */ @ApiOperation(value="短信发送记录-批量删除", notes="短信发送记录-批量删除") @DeleteMapping(value = "/deleteBatch") public R deleteBatch(@RequestParam(name="ids",required=true) String ids) { return R.data(smsRecordService.removeByIds(Arrays.asList(ids.split(",")))); } /** * 通过id查询 * * @param id * @return */ @ApiOperation(value="短信发送记录-通过id查询", notes="短信发送记录-通过id查询") @GetMapping(value = "/queryById") public R queryById(@RequestParam(name="id",required=true) String id) { SmsRecord SmsRecord = smsRecordService.getById(id); return R.data(SmsRecord); } } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/entity/SmsRecord.java
New file @@ -0,0 +1,44 @@ package cn.gistack.sm.sms.entity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.springblade.core.tenant.mp.TenantEntity; /** * 短信发送记录 */ @Data @TableName("sm_sms_record") @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @ApiModel(value = "sm_sms_record对象", description = "短信发送记录") public class SmsRecord extends TenantEntity { /** * 模板id */ @ApiModelProperty(value = "模板id") private String templateId; /** * 手机号(可能有多个,以英文逗号分隔) */ @ApiModelProperty(value = "手机号(可能有多个,以英文逗号分隔)") private String phone; /** * 消息内容 */ @ApiModelProperty(value = "消息内容") private String content; /** * 响应内容 */ @ApiModelProperty(value = "响应内容") private String resContent; } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/mapper/SmsRecordMapper.java
New file @@ -0,0 +1,12 @@ package cn.gistack.sm.sms.mapper; import cn.gistack.sm.sms.entity.SmsRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * 短信发送记录 * @author zhongrj */ public interface SmsRecordMapper extends BaseMapper<SmsRecord> { } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/mapper/SmsRecordMapper.xml
New file @@ -0,0 +1,5 @@ <?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="cn.gistack.sm.sms.mapper.SmsRecordMapper"> </mapper> skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/service/ISmsRecordService.java
New file @@ -0,0 +1,7 @@ package cn.gistack.sm.sms.service; import cn.gistack.sm.sms.entity.SmsRecord; import org.springblade.core.mp.base.BaseService; public interface ISmsRecordService extends BaseService<SmsRecord> { } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/service/impl/SmsRecordServiceImpl.java
New file @@ -0,0 +1,14 @@ package cn.gistack.sm.sms.service.impl; import cn.gistack.sm.patrol.mapper.PatrolGroupMapper; import cn.gistack.sm.sms.entity.SmsRecord; import cn.gistack.sm.sms.mapper.SmsRecordMapper; import cn.gistack.sm.sms.service.ISmsRecordService; import org.springblade.core.mp.base.BaseServiceImpl; /** * 短信发送记录 * @author zhongrj */ public class SmsRecordServiceImpl extends BaseServiceImpl<SmsRecordMapper, SmsRecord> implements ISmsRecordService { } skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java
@@ -63,7 +63,7 @@ * 获取随机字符串 * @return */ private String getRandNumber() { public static String getRandNumber() { // 计算token // Date date = new Date(); // String dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(date); skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/vo/SmsRecordVO.java
New file @@ -0,0 +1,12 @@ package cn.gistack.sm.sms.vo; import cn.gistack.sm.sms.entity.SmsRecord; import lombok.Data; /** * 短信发送记录vo * @author zhongrj */ @Data public class SmsRecordVO extends SmsRecord { } skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java
@@ -16,6 +16,9 @@ */ package cn.gistack.system.controller; import cn.gistack.common.node.DeptUserTreeNode; import cn.gistack.common.node.TreeNode; import cn.gistack.common.utils.NodeTreeUtil; import cn.gistack.system.vo.DeptVO; import cn.gistack.system.wrapper.DeptWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -176,4 +179,16 @@ } /** * 查询组织机构树数据(下级包含人员信息) * @param treeNode * @return */ @GetMapping("/getDeptAndUserTree") @ApiOperation(value = "查询组织机构树数据(下级包含人员信息)") public R getDeptAndUserTree(DeptUserTreeNode treeNode) { return R.data(deptService.getDeptAndUserTree(treeNode)); } } skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java
@@ -16,9 +16,13 @@ */ package cn.gistack.system.mapper; import cn.gistack.common.node.DeptUserTreeNode; import cn.gistack.common.node.TreeNode; import cn.gistack.system.entity.Dept; import cn.gistack.system.vo.DeptVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; @@ -65,4 +69,27 @@ */ List<String> getDeptNames(Long[] ids); /** * 查询组织机构树数据(下级包含人员信息) * @param treeNode * @return */ @MapKey(value = "id") Map<String, DeptUserTreeNode> getDeptAndUserTree(@Param("treeNode") DeptUserTreeNode treeNode); /** * 查询组织机构树 * @param treeNode * @return */ @MapKey(value = "id") Map<String, DeptUserTreeNode> getDeptMap(@Param("treeNode") DeptUserTreeNode treeNode); /** * 查询用户树 * @param treeNode * @return */ @MapKey(value = "id") Map<String, DeptUserTreeNode> getUserMap(@Param("treeNode") DeptUserTreeNode treeNode); } skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml
@@ -112,4 +112,79 @@ and is_deleted = 0 </select> <!--查询组织机构树数据(下级包含人员信息)--> <select id="getDeptAndUserTree" resultType="cn.gistack.common.node.DeptUserTreeNode"> ( SELECT dept.id, dept.parent_id parentId, dept.dept_name AS name, 0 AS phone, ( SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM blade_dept WHERE parent_id = dept.id and is_deleted = 0 ) AS hasChildren FROM blade_dept dept WHERE dept.is_deleted = 0 <if test="treeNode.id!=null and treeNode.id!=''"> and dept.id = #{treeNode.id} </if> ) union ( select bu.id, bu.dept_id parentId, bu.account AS name, bu.phone, 0 as hasChildren from blade_user bu left join blade_dept bd on bd.id = bu.dept_id where 1=1 and bu.is_deleted = 0 and bu.status = 1 <if test="treeNode.id!=null and treeNode.id!=''"> and bu.dept_id like concat(concat('%',#{treeNode.id}),'%') </if> ) </select> <!--查询组织机构树--> <select id="getDeptMap" resultType="cn.gistack.common.node.DeptUserTreeNode"> SELECT dept.id, dept.parent_id parentId, dept.dept_name AS name, 0 AS phone, ( SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM blade_dept WHERE parent_id = dept.id and is_deleted = 0 ) AS hasChildren FROM blade_dept dept WHERE dept.is_deleted = 0 <if test="treeNode.id!=null and treeNode.id!=''"> and dept.id = #{treeNode.id} </if> </select> <!--查询组织机构树数据(下级包含人员信息)--> <select id="getUserMap" resultType="cn.gistack.common.node.DeptUserTreeNode"> select bu.id, bu.dept_id parentId, bu.account AS name, bu.phone, 0 as hasChildren from blade_user bu left join blade_dept bd on bd.id = bu.dept_id where 1=1 and bu.is_deleted = 0 and bu.status = 1 <if test="treeNode.id!=null and treeNode.id!=''"> and bu.dept_id like concat(concat('%',#{treeNode.id}),'%') </if> </select> </mapper> skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java
@@ -16,6 +16,8 @@ */ package cn.gistack.system.service; import cn.gistack.common.node.DeptUserTreeNode; import cn.gistack.common.node.TreeNode; import cn.gistack.system.entity.Dept; import cn.gistack.system.vo.DeptVO; import com.baomidou.mybatisplus.extension.service.IService; @@ -116,4 +118,10 @@ */ List<DeptVO> search(String deptName, Long parentId); /** * 查询组织机构树数据(下级包含人员信息) * @param treeNode * @return */ List<TreeNode> getDeptAndUserTree(DeptUserTreeNode treeNode); } skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java
@@ -16,6 +16,9 @@ */ package cn.gistack.system.service.impl; import cn.gistack.common.node.DeptUserTreeNode; import cn.gistack.common.node.TreeNode; import cn.gistack.common.utils.NodeTreeUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -170,4 +173,18 @@ return DeptWrapper.build().listNodeVO(deptList); } /** * 查询组织机构树数据(下级包含人员信息) * @param treeNode * @return */ @Override public List<TreeNode> getDeptAndUserTree(DeptUserTreeNode treeNode) { // 查询数据 Map<String, DeptUserTreeNode> deptMap = baseMapper.getDeptMap(treeNode); Map<String, DeptUserTreeNode> userMap = baseMapper.getUserMap(treeNode); deptMap.putAll(userMap); // 处理并返回 return NodeTreeUtil.getDeptAndUserNodeTree(deptMap); } }