xieb
2023-04-23 b82f8f6f82f0d9348997abb77e5d72deac078fa2
Merge remote-tracking branch 'origin/jtdev' into jtdev
9 files modified
8 files added
442 ■■■■■ changed files
skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/node/DeptUserTreeNode.java 17 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java 41 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-system-api/src/main/java/cn/gistack/system/entity/Menu.java 7 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java 41 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsRecordController.java 98 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/entity/SmsRecord.java 44 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/mapper/SmsRecordMapper.java 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/mapper/SmsRecordMapper.xml 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/service/ISmsRecordService.java 7 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/service/impl/SmsRecordServiceImpl.java 14 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java 2 ●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/vo/SmsRecordVO.java 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java 15 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java 27 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml 75 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java 8 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java 17 ●●●●● patch | view | raw | blame | history
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);
    }
}