Browse Source

消息发布模块

wangwl 2 months ago
parent
commit
cefa376a26

+ 7 - 0
pom.xml

@@ -247,6 +247,13 @@
                 <version>30.1.1-jre</version>
             </dependency>
 
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>5.8.36</version>
+            </dependency>
+
+
 
         </dependencies>
     </dependencyManagement>

+ 6 - 0
ruoyi-common/pom.xml

@@ -155,6 +155,12 @@
             <artifactId>guava</artifactId>
         </dependency>
 
+<!--        hutool工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 116 - 0
ruoyi-equity/src/main/java/com/ruoyi/equity/controller/SendMessageRecordController.java

@@ -0,0 +1,116 @@
+package com.ruoyi.equity.controller;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.equity.domain.vo.SendMessageRecordVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.equity.domain.SendMessageRecord;
+import com.ruoyi.equity.service.ISendMessageRecordService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 消息发布Controller
+ * 
+ * @author ruoyi
+ * @date 2025-03-11
+ */
+@RestController
+@Api(tags = "消息发布")
+@RequestMapping("/equity/send-message")
+public class SendMessageRecordController extends BaseController
+{
+    @Autowired
+    private ISendMessageRecordService sendMessageRecordService;
+
+    /**
+     * 查询消息发布列表
+     */
+    @ApiOperation("查询消息发布列表")
+    @PreAuthorize("@ss.hasPermi('equity:send-message:list')")
+    @GetMapping("/list")
+    public TableDataInfo<SendMessageRecordVO> list(SendMessageRecordVO sendMessageRecord)
+    {
+        startPage();
+        List<SendMessageRecordVO> list = sendMessageRecordService.selectSendMessageRecordList(sendMessageRecord);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出消息发布列表
+     */
+//    @ApiOperation("导出消息发布列表")
+//    @PreAuthorize("@ss.hasPermi('equity:send-message:export')")
+//    @Log(title = "消息发布", businessType = BusinessType.EXPORT)
+//    @PostMapping("/export")
+//    public void export(HttpServletResponse response, SendMessageRecord sendMessageRecord)
+//    {
+//        List<SendMessageRecord> list = sendMessageRecordService.selectSendMessageRecordList(sendMessageRecord);
+//        ExcelUtil<SendMessageRecord> util = new ExcelUtil<SendMessageRecord>(SendMessageRecord.class);
+//        util.exportExcel(response, list, "消息发布数据");
+//    }
+
+    /**
+     * 获取消息发布详细信息
+     */
+    @ApiOperation("获取消息发布详细信息")
+    @PreAuthorize("@ss.hasPermi('equity:send-message:query')")
+    @GetMapping(value = "/{sendMessageId}")
+    public R<SendMessageRecord> getInfo(@PathVariable("sendMessageId") Long sendMessageId)
+    {
+        return R.ok(sendMessageRecordService.selectSendMessageRecordBySendMessageId(sendMessageId));
+    }
+
+    /**
+     * 新增消息发布
+     */
+    @ApiOperation("新增消息发布")
+    @PreAuthorize("@ss.hasPermi('equity:send-message:add')")
+    @Log(title = "消息发布", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R<Integer> add(@RequestBody SendMessageRecord sendMessageRecord)
+    {
+        return R.ok(sendMessageRecordService.insertSendMessageRecord(sendMessageRecord));
+    }
+
+    /**
+     * 修改消息发布
+     */
+    @ApiOperation("修改消息发布")
+    @PreAuthorize("@ss.hasPermi('equity:send-message:edit')")
+    @Log(title = "消息发布", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R<Integer> edit(@RequestBody SendMessageRecord sendMessageRecord)
+    {
+        return R.ok(sendMessageRecordService.updateSendMessageRecord(sendMessageRecord));
+    }
+
+    /**
+     * 删除消息发布
+     */
+    @ApiOperation("删除消息发布")
+    @PreAuthorize("@ss.hasPermi('equity:send-message:remove')")
+    @Log(title = "消息发布", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{sendMessageIds}")
+    public R<Integer> remove(@PathVariable Long[] sendMessageIds)
+    {
+        return R.ok(sendMessageRecordService.deleteSendMessageRecordBySendMessageIds(sendMessageIds));
+    }
+}

+ 60 - 0
ruoyi-equity/src/main/java/com/ruoyi/equity/domain/SendMessageRecord.java

@@ -0,0 +1,60 @@
+package com.ruoyi.equity.domain;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 消息发布对象 e_send_message_record
+ * 
+ * @author ruoyi
+ * @date 2025-03-11
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("e_send_message_record")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "SendMessageRecord", description = "消息发布")
+public class SendMessageRecord extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 消息ID */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty("消息ID")
+    private Long sendMessageId;
+
+    /** 消息类型 */
+    @Excel(name = "消息类型")
+    @ApiModelProperty("消息类型")
+    private String msgType;
+
+    /** 通知公司 */
+    @Excel(name = "通知公司")
+    @ApiModelProperty("通知公司")
+    private Long companyId;
+
+    /** 消息内容 */
+    @Excel(name = "消息内容")
+    @ApiModelProperty("消息内容")
+    private String msgContent;
+
+    /** 发布时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "发布时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("发布时间")
+    private Date sendTime;
+
+
+
+}

+ 13 - 0
ruoyi-equity/src/main/java/com/ruoyi/equity/domain/vo/SendMessageRecordVO.java

@@ -0,0 +1,13 @@
+package com.ruoyi.equity.domain.vo;
+
+import com.ruoyi.equity.domain.SendMessageRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SendMessageRecordVO extends SendMessageRecord {
+    @ApiModelProperty("通知公司名称")
+    private String companyName;
+}

+ 64 - 0
ruoyi-equity/src/main/java/com/ruoyi/equity/mapper/SendMessageRecordMapper.java

@@ -0,0 +1,64 @@
+package com.ruoyi.equity.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.equity.domain.SendMessageRecord;
+import com.ruoyi.equity.domain.vo.SendMessageRecordVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 消息发布Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2025-03-11
+ */
+public interface SendMessageRecordMapper extends BaseMapper<SendMessageRecord>
+{
+    /**
+     * 查询消息发布
+     * 
+     * @param sendMessageId 消息发布主键
+     * @return 消息发布
+     */
+    public SendMessageRecord selectSendMessageRecordBySendMessageId(Long sendMessageId);
+
+    /**
+     * 查询消息发布列表
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 消息发布集合
+     */
+    public List<SendMessageRecordVO> selectSendMessageRecordList(SendMessageRecord sendMessageRecord);
+
+    /**
+     * 新增消息发布
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 结果
+     */
+    public int insertSendMessageRecord(SendMessageRecord sendMessageRecord);
+
+    /**
+     * 修改消息发布
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 结果
+     */
+    public int updateSendMessageRecord(SendMessageRecord sendMessageRecord);
+
+    /**
+     * 删除消息发布
+     * 
+     * @param sendMessageId 消息发布主键
+     * @return 结果
+     */
+    public int deleteSendMessageRecordBySendMessageId(Long sendMessageId);
+
+    /**
+     * 批量删除消息发布
+     * 
+     * @param sendMessageIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteSendMessageRecordBySendMessageIds(Long[] sendMessageIds);
+}

+ 63 - 0
ruoyi-equity/src/main/java/com/ruoyi/equity/service/ISendMessageRecordService.java

@@ -0,0 +1,63 @@
+package com.ruoyi.equity.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.equity.domain.SendMessageRecord;
+import com.ruoyi.equity.domain.vo.SendMessageRecordVO;
+
+/**
+ * 消息发布Service接口
+ * 
+ * @author ruoyi
+ * @date 2025-03-11
+ */
+public interface ISendMessageRecordService extends IService<SendMessageRecord>
+{
+    /**
+     * 查询消息发布
+     * 
+     * @param sendMessageId 消息发布主键
+     * @return 消息发布
+     */
+    public SendMessageRecord selectSendMessageRecordBySendMessageId(Long sendMessageId);
+
+    /**
+     * 查询消息发布列表
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 消息发布集合
+     */
+    public List<SendMessageRecordVO> selectSendMessageRecordList(SendMessageRecord sendMessageRecord);
+
+    /**
+     * 新增消息发布
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 结果
+     */
+    public int insertSendMessageRecord(SendMessageRecord sendMessageRecord);
+
+    /**
+     * 修改消息发布
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 结果
+     */
+    public int updateSendMessageRecord(SendMessageRecord sendMessageRecord);
+
+    /**
+     * 批量删除消息发布
+     * 
+     * @param sendMessageIds 需要删除的消息发布主键集合
+     * @return 结果
+     */
+    public int deleteSendMessageRecordBySendMessageIds(Long[] sendMessageIds);
+
+    /**
+     * 删除消息发布信息
+     * 
+     * @param sendMessageId 消息发布主键
+     * @return 结果
+     */
+    public int deleteSendMessageRecordBySendMessageId(Long sendMessageId);
+}

+ 144 - 0
ruoyi-equity/src/main/java/com/ruoyi/equity/service/impl/SendMessageRecordServiceImpl.java

@@ -0,0 +1,144 @@
+package com.ruoyi.equity.service.impl;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.equity.domain.EquityMessageRecord;
+import com.ruoyi.equity.domain.ShareholderInfo;
+import com.ruoyi.equity.domain.vo.SendMessageRecordVO;
+import com.ruoyi.equity.mapper.SendMessageRecordMapper;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.equity.service.IEquityMessageRecordService;
+import com.ruoyi.equity.service.IShareholderInfoService;
+import com.ruoyi.system.service.ISysRoleService;
+import com.ruoyi.system.service.ISysUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.equity.mapper.SendMessageRecordMapper;
+import com.ruoyi.equity.domain.SendMessageRecord;
+import com.ruoyi.equity.service.ISendMessageRecordService;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * 消息发布Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2025-03-11
+ */
+@Service
+@RequiredArgsConstructor
+public class SendMessageRecordServiceImpl extends ServiceImpl<SendMessageRecordMapper, SendMessageRecord> implements ISendMessageRecordService
+{
+    private final SendMessageRecordMapper sendMessageRecordMapper;
+
+    private final IShareholderInfoService shareholderInfoService;
+
+    private final ISysUserService systemUserService;
+
+    private final IEquityMessageRecordService equityMessageRecordService;
+
+    /**
+     * 查询消息发布
+     * 
+     * @param sendMessageId 消息发布主键
+     * @return 消息发布
+     */
+    @Override
+    public SendMessageRecord selectSendMessageRecordBySendMessageId(Long sendMessageId)
+    {
+        return sendMessageRecordMapper.selectSendMessageRecordBySendMessageId(sendMessageId);
+    }
+
+    /**
+     * 查询消息发布列表
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 消息发布
+     */
+    @Override
+    public List<SendMessageRecordVO> selectSendMessageRecordList(SendMessageRecord sendMessageRecord)
+    {
+        return sendMessageRecordMapper.selectSendMessageRecordList(sendMessageRecord);
+    }
+
+    /**
+     * 新增消息发布
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 结果
+     */
+    @Override
+    public int insertSendMessageRecord(SendMessageRecord sendMessageRecord)
+    {
+        sendMessageRecord.setSendTime(DateUtils.getNowDate());
+        //查询当前公司以及所有下级节点
+        List<Long> shareholderIds = shareholderInfoService.list(new LambdaQueryWrapper<ShareholderInfo>()
+                .eq(ShareholderInfo::getNodeType, 1)
+                .like(ShareholderInfo::getAncestors, sendMessageRecord.getCompanyId())).stream().map(ShareholderInfo::getShareholderId).collect(Collectors.toList());
+        shareholderIds.add(sendMessageRecord.getCompanyId());
+        //根据所有节点信息,获取其关联的用户id
+        List<Long> userIds = systemUserService.selectUserIdsByShareholderIds(shareholderIds);
+        if (CollectionUtil.isNotEmpty(userIds)){
+            //批量设置消息
+            List<EquityMessageRecord> messages = userIds.stream().map(userId -> {
+                EquityMessageRecord messageRecord = EquityMessageRecord.builder()
+                        .userId(userId)
+                        .msgType(sendMessageRecord.getMsgType())
+                        .msgContent(sendMessageRecord.getMsgContent())
+                        .msgTime(sendMessageRecord.getSendTime())
+                        .isRead("0")
+                        .build();
+                messageRecord.setCreateTime(DateUtils.getNowDate());
+                messageRecord.setCreateBy(SecurityUtils.getUsername());
+                return messageRecord;
+            }).collect(Collectors.toList());
+            //存入消息通知表中
+            equityMessageRecordService.saveBatch(messages);
+        }
+
+        sendMessageRecord.setCreateTime(DateUtils.getNowDate());
+        return sendMessageRecordMapper.insertSendMessageRecord(sendMessageRecord);
+    }
+
+    /**
+     * 修改消息发布
+     * 
+     * @param sendMessageRecord 消息发布
+     * @return 结果
+     */
+    @Override
+    public int updateSendMessageRecord(SendMessageRecord sendMessageRecord)
+    {
+        sendMessageRecord.setUpdateTime(DateUtils.getNowDate());
+        return sendMessageRecordMapper.updateSendMessageRecord(sendMessageRecord);
+    }
+
+    /**
+     * 批量删除消息发布
+     * 
+     * @param sendMessageIds 需要删除的消息发布主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSendMessageRecordBySendMessageIds(Long[] sendMessageIds)
+    {
+        return sendMessageRecordMapper.deleteSendMessageRecordBySendMessageIds(sendMessageIds);
+    }
+
+    /**
+     * 删除消息发布信息
+     * 
+     * @param sendMessageId 消息发布主键
+     * @return 结果
+     */
+    @Override
+    public int deleteSendMessageRecordBySendMessageId(Long sendMessageId)
+    {
+        return sendMessageRecordMapper.deleteSendMessageRecordBySendMessageId(sendMessageId);
+    }
+}

+ 87 - 0
ruoyi-equity/src/main/resources/mapper/equity/SendMessageRecordMapper.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.equity.mapper.SendMessageRecordMapper">
+    
+    <resultMap type="SendMessageRecord" id="SendMessageRecordResult">
+        <result property="sendMessageId"    column="send_message_id"    />
+        <result property="msgType"    column="msg_type"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="msgContent"    column="msg_content"    />
+        <result property="sendTime"    column="send_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectSendMessageRecordVo">
+        select send_message_id, msg_type, company_id, msg_content, send_time, create_by, create_time, update_by, update_time, remark from e_send_message_record
+    </sql>
+
+
+    
+    <select id="selectSendMessageRecordBySendMessageId" parameterType="Long" resultMap="SendMessageRecordResult">
+        <include refid="selectSendMessageRecordVo"/>
+        where send_message_id = #{sendMessageId}
+    </select>
+    <select id="selectSendMessageRecordList" resultType="com.ruoyi.equity.domain.vo.SendMessageRecordVO">
+        select *,(select shareholder_name from e_shareholder_info esi where esi.shareholder_id = esmr.company_id) as companyName
+        from e_send_message_record esmr
+    </select>
+
+    <insert id="insertSendMessageRecord" parameterType="SendMessageRecord" useGeneratedKeys="true" keyProperty="sendMessageId">
+        insert into e_send_message_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="msgType != null and msgType != ''">msg_type,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="msgContent != null and msgContent != ''">msg_content,</if>
+            <if test="sendTime != null">send_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="msgType != null and msgType != ''">#{msgType},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="msgContent != null and msgContent != ''">#{msgContent},</if>
+            <if test="sendTime != null">#{sendTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSendMessageRecord" parameterType="SendMessageRecord">
+        update e_send_message_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="msgType != null and msgType != ''">msg_type = #{msgType},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="msgContent != null and msgContent != ''">msg_content = #{msgContent},</if>
+            <if test="sendTime != null">send_time = #{sendTime},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where send_message_id = #{sendMessageId}
+    </update>
+
+    <delete id="deleteSendMessageRecordBySendMessageId" parameterType="Long">
+        delete from e_send_message_record where send_message_id = #{sendMessageId}
+    </delete>
+
+    <delete id="deleteSendMessageRecordBySendMessageIds" parameterType="String">
+        delete from e_send_message_record where send_message_id in 
+        <foreach item="sendMessageId" collection="array" open="(" separator="," close=")">
+            #{sendMessageId}
+        </foreach>
+    </delete>
+</mapper>

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -126,4 +126,7 @@ public interface SysUserMapper
     public SysUser checkEmailUnique(String email);
 
     List<SysUser> selectShareholderUserList();
+
+    List<Long> selectUserIdsByShareholderIds(@Param("shareholderIds") List<Long> shareholderIds);
+
 }

+ 6 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -15,6 +15,12 @@ public interface ISysUserService
      */
     public List<SysUser> selectShareholderUserList();
 
+    /**
+     * 根据股东id获取所有相关联的用户id
+     */
+    public List<Long> selectUserIdsByShareholderIds(List<Long> shareholderIds);
+
+
     /**
      * 根据条件分页查询用户列表
      * 

+ 5 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -73,6 +73,11 @@ public class SysUserServiceImpl implements ISysUserService {
         return userMapper.selectShareholderUserList();
     }
 
+    @Override
+    public List<Long> selectUserIdsByShareholderIds(List<Long> shareholderIds) {
+        return userMapper.selectUserIdsByShareholderIds(shareholderIds);
+    }
+
     /**
      * 根据条件分页查询用户列表
      *

+ 7 - 1
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -146,8 +146,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<select id="selectShareholderUserList" resultType="com.ruoyi.common.core.domain.entity.SysUser">
 		select user_id, shareholder_id from sys_user where shareholder_id is not null
 	</select>
+    <select id="selectUserIdsByShareholderIds" resultType="java.lang.Long">
+		select user_id from sys_user where shareholder_id in
+		<foreach close=")" collection="shareholderIds" item="id" open="(" separator=",">
+			#{id}
+		</foreach>
+	</select>
 
-	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
+    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
  			<if test="deptId != null and deptId != 0">dept_id,</if>