chendayu %!s(int64=2) %!d(string=hai) anos
pai
achega
18b954d154

+ 1 - 5
PAS/src/main/java/cn/cslg/pas/common/model/dto/EventAddNewDTO.java

@@ -20,7 +20,7 @@ import java.util.List;
 @Data
 public class EventAddNewDTO implements Serializable {
     /**
-     * 主键
+     * 事件id(主键)
      */
     private Integer id;
     /**
@@ -41,9 +41,5 @@ public class EventAddNewDTO implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date eventDate;
-    /**
-     * 专题库id
-     */
-    private Integer projectId;
 
 }

+ 27 - 0
PAS/src/main/java/cn/cslg/pas/common/model/dto/ProjectEventAddNewDTO.java

@@ -0,0 +1,27 @@
+package cn.cslg.pas.common.model.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 新增事件的DTO类
+ *
+ * @Author chenyu
+ * @Date 2023/4/2
+ */
+@Accessors(chain = true)
+@Data
+public class ProjectEventAddNewDTO implements Serializable {
+    /**
+     * 事件
+     */
+    List<EventAddNewDTO> eventAddNewDTOs;
+    /**
+     * 专题库id
+     */
+    private Integer projectId;
+
+}

+ 21 - 4
PAS/src/main/java/cn/cslg/pas/controller/EventController.java

@@ -4,6 +4,7 @@ import cn.cslg.pas.common.core.base.Constants;
 import cn.cslg.pas.common.model.dto.EventAddNewDTO;
 import cn.cslg.pas.common.model.dto.EventQueryPageDTO;
 import cn.cslg.pas.common.model.dto.EventUpdateDTO;
+import cn.cslg.pas.common.model.dto.ProjectEventAddNewDTO;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.service.IEventService;
@@ -13,6 +14,9 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 事件的Controller层
  *
@@ -29,14 +33,27 @@ public class EventController {
 
     @Operation(summary = "新增事件")
     @PostMapping("/addNew")
-    public String addNew(@RequestBody EventAddNewDTO eventAddNewDTO) {
-        log.info("开始处理【新增事件】的请求,请求参数为:{}", eventAddNewDTO);
+    public String addNew(@RequestBody List<EventAddNewDTO> eventAddNewDTOs) {
+        log.info("开始处理【新增事件】的请求,请求参数为:{}", eventAddNewDTOs);
+        List<Integer> eventIds;
+        try {
+            eventIds = eventService.addNew(eventAddNewDTOs);
+        } catch (XiaoShiException e) {
+            return Response.error(e.getMessage());
+        }
+        return Response.success(eventIds);
+    }
+
+    @Operation(summary = "专题库中新增事件")
+    @PostMapping("/addNewEvent")
+    public String addNewEvent(@RequestBody ProjectEventAddNewDTO projectEventAddNewDTO) {
+        log.info("开始处理【专题库中新增事件】的请求,请求参数为:{}", projectEventAddNewDTO);
         try {
-            eventService.addNew(eventAddNewDTO);
+            eventService.addNewEvent(projectEventAddNewDTO);
         } catch (XiaoShiException e) {
             return Response.error(e.getMessage());
         }
-        return Response.success("新增事件完成");
+        return Response.success("新增单个事件完成");
     }
 
     @Operation(summary = "查询事件")

+ 1 - 1
PAS/src/main/java/cn/cslg/pas/domain/Project.java

@@ -169,7 +169,7 @@ public class Project extends BaseEntity<Project> {
     @TableField(exist = false)
     private String productName;
 
-    //以下为新增专题库时新增的事件(可新增多个事件)↓ 陈宇
+    //事件
     @TableField(exist = false)
     private List<EventAddNewDTO> eventAddNewDTOs;
 

+ 6 - 4
PAS/src/main/java/cn/cslg/pas/mapper/AssoEventProjectMapper.java

@@ -1,9 +1,11 @@
-package cn.cslg.pas.mapper;
+package cn.cslg.pas.mapper.asso;
 
 import cn.cslg.pas.domain.asso.AssoEventProject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * 事件和专题库关联表的Mapper层接口
  *
@@ -13,12 +15,12 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface AssoEventProjectMapper extends BaseMapper<AssoEventProject> {
     /**
-     * 根据事件id和专题库id删除数据
+     * 根据事件ids和专题库id批量删除数据
      *
-     * @param eventId   事件id
+     * @param eventIds  事件ids
      * @param projectId 专题库id
      * @return 返回受影响的行数
      */
-    int deleteByEventIdAndProjectId(Integer eventId, Integer projectId);
+    int deleteByEventIdsAndProjectId(List<Integer> eventIds, Integer projectId);
 
 }

+ 23 - 0
PAS/src/main/java/cn/cslg/pas/service/IAssoEventProjectService.java

@@ -0,0 +1,23 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.domain.asso.AssoEventProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * 事件和专题库关联的Service层接口
+ *
+ * @Author chenyu
+ * @Date 2023/4/4
+ */
+public interface IAssoEventProjectService extends IService<AssoEventProject> {
+    /**
+     * 批量新增事件和专题库关联数据
+     *
+     * @param eventIds  事件ids
+     * @param projectId 专题库id
+     */
+    void addNew(List<Integer> eventIds, Integer projectId);
+
+}

+ 16 - 3
PAS/src/main/java/cn/cslg/pas/service/IEventService.java

@@ -4,10 +4,13 @@ import cn.cslg.pas.common.JsonPage;
 import cn.cslg.pas.common.model.dto.EventAddNewDTO;
 import cn.cslg.pas.common.model.dto.EventQueryPageDTO;
 import cn.cslg.pas.common.model.dto.EventUpdateDTO;
+import cn.cslg.pas.common.model.dto.ProjectEventAddNewDTO;
 import cn.cslg.pas.domain.Event;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 /**
  * 事件的Service层接口
  *
@@ -16,12 +19,21 @@ import org.springframework.transaction.annotation.Transactional;
  */
 public interface IEventService extends IService<Event> {
     /**
-     * 新增事件
+     * 批量新增事件
      *
-     * @param eventAddNewDTO 新增事件的DTO类对象
+     * @param eventAddNewDTOs 新增事件的DTO类对象集合
+     * @return 返回事件eventIds
      */
     @Transactional
-    void addNew(EventAddNewDTO eventAddNewDTO);
+    List<Integer> addNew(List<EventAddNewDTO> eventAddNewDTOs);
+
+    /**
+     * 专题库中新增事件
+     *
+     * @param projectEventAddNewDTO 专题库新增事件的DTO类对象集合
+     */
+    @Transactional
+    void addNewEvent(ProjectEventAddNewDTO projectEventAddNewDTO);
 
     /**
      * 分页查询事件
@@ -35,6 +47,7 @@ public interface IEventService extends IService<Event> {
      *
      * @param eventUpdateDTO 修改事件的DTO类对象
      */
+    @Transactional
     void update(EventUpdateDTO eventUpdateDTO);
 
     /**

+ 8 - 21
PAS/src/main/java/cn/cslg/pas/service/ProjectService.java

@@ -5,16 +5,14 @@ import cn.cslg.pas.common.core.exception.CustomException;
 import cn.cslg.pas.common.model.PersonnelVO;
 import cn.cslg.pas.common.model.dto.ClientDTO;
 import cn.cslg.pas.common.model.dto.EventAddNewDTO;
+import cn.cslg.pas.common.model.dto.ProjectEventAddNewDTO;
 import cn.cslg.pas.common.model.dto.UploadFileDTO;
 import cn.cslg.pas.common.model.vo.*;
 import cn.cslg.pas.common.utils.*;
 import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils;
-import cn.cslg.pas.common.utils.SecurityUtils.SecurityUtils;
-import cn.cslg.pas.common.utils.auth.checkAuth;
 import cn.cslg.pas.domain.*;
-import cn.cslg.pas.domain.asso.AssoEventProject;
 import cn.cslg.pas.exception.XiaoShiException;
-import cn.cslg.pas.mapper.AssoEventProjectMapper;
+import cn.cslg.pas.mapper.asso.AssoEventProjectMapper;
 import cn.cslg.pas.mapper.ProductMapper;
 import cn.cslg.pas.mapper.ProjectMapper;
 import cn.cslg.pas.mapper.asso.AssoStructurePatentMapper;
@@ -110,7 +108,7 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
     private final ProductMapper productMapper;
     private final ProjectMapper projectMapper;
     private final IEventService eventService;
-    private final AssoEventProjectMapper assoEventProjectMapper;
+    private final IAssoEventProjectService assoEventProjectService;
 
     public Project getProjectByName(String name) {
         LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
@@ -462,24 +460,13 @@ public class ProjectService extends ServiceImpl<ProjectMapper, Project> {
         project.insert();
         this.addProjectUser(project.getId());
 
-        //新增事件(若有添加事件)
+        //新增事件
         List<EventAddNewDTO> eventAddNewDTOs = project.getEventAddNewDTOs();
-        Integer projectId = project.getId();
         if (eventAddNewDTOs != null && eventAddNewDTOs.size() > 0) {
-            for (EventAddNewDTO eventAddNewDTO : eventAddNewDTOs) {
-                //若没有事件id则为新创建的事件,需要调用新增事件接口,若有事件id则为添加已有的事件,此时只需将事件id和专题库id存入关联表即可
-                Integer eventId = eventAddNewDTO.getId();
-                if (eventId == null) {
-                    eventAddNewDTO.setProjectId(projectId);
-                    eventService.addNew(eventAddNewDTO);
-                } else {
-                    AssoEventProject assoEventProject = new AssoEventProject()
-                            .setEventId(eventId)
-                            .setProjectId(projectId);
-                    assoEventProjectMapper.insert(assoEventProject);
-                }
-
-            }
+            ProjectEventAddNewDTO projectEventAddNewDTO = new ProjectEventAddNewDTO()
+                    .setEventAddNewDTOs(eventAddNewDTOs)
+                    .setProjectId(project.getId());
+            eventService.addNewEvent(projectEventAddNewDTO);
         }
 
         log.info("新增专题库完成");

+ 56 - 0
PAS/src/main/java/cn/cslg/pas/service/impl/AssoEventProjectServiceImpl.java

@@ -0,0 +1,56 @@
+package cn.cslg.pas.service.impl;
+
+import cn.cslg.pas.domain.asso.AssoEventProject;
+import cn.cslg.pas.mapper.asso.AssoEventProjectMapper;
+import cn.cslg.pas.service.IAssoEventProjectService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 事件和专题库关联的Service层接口实现类
+ *
+ * @Author chenyu
+ * @Date 2023/4/4
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Service
+public class AssoEventProjectServiceImpl extends ServiceImpl<AssoEventProjectMapper, AssoEventProject> implements IAssoEventProjectService {
+    private final AssoEventProjectMapper assoEventProjectMapper;
+
+    /**
+     * 新增事件和专题库关联数据
+     *
+     * @param eventIds  事件ids
+     * @param projectId 专题库id
+     */
+    @Override
+    public void addNew(List<Integer> eventIds, Integer projectId) {
+        log.info("开始处理【批量新增事件和专题库关联】的业务,参数为:{}, {}", eventIds, projectId);
+
+        //删除原有相同的关联数据
+//        LambdaQueryWrapper<AssoEventProject> wrapper = new LambdaQueryWrapper<>();
+//        wrapper.in(AssoEventProject::getProjectId, projectId);
+//        this.remove(wrapper);
+        assoEventProjectMapper.deleteByEventIdsAndProjectId(eventIds, projectId);
+
+        ArrayList<AssoEventProject> assoEventProjects = new ArrayList<>();
+        for (Integer eventId : eventIds) {
+            AssoEventProject assoEventProject = new AssoEventProject()
+                    .setEventId(eventId)
+                    .setProjectId(projectId);
+            assoEventProjects.add(assoEventProject);
+        }
+        //数据入事件和专题库关联表
+        this.saveBatch(assoEventProjects);
+
+        log.info("批量新增事件和专题库关联完成");
+
+    }
+
+}

+ 78 - 47
PAS/src/main/java/cn/cslg/pas/service/impl/EventServiceImpl.java

@@ -5,20 +5,20 @@ import cn.cslg.pas.common.model.PersonnelVO;
 import cn.cslg.pas.common.model.dto.EventAddNewDTO;
 import cn.cslg.pas.common.model.dto.EventQueryPageDTO;
 import cn.cslg.pas.common.model.dto.EventUpdateDTO;
+import cn.cslg.pas.common.model.dto.ProjectEventAddNewDTO;
 import cn.cslg.pas.common.model.vo.EventListItemVO;
 import cn.cslg.pas.common.utils.CacheUtils;
-import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils;
 import cn.cslg.pas.common.utils.ThrowException;
 import cn.cslg.pas.domain.Event;
 import cn.cslg.pas.domain.Project;
 import cn.cslg.pas.domain.asso.AssoEventProject;
-import cn.cslg.pas.mapper.AssoEventProjectMapper;
 import cn.cslg.pas.mapper.EventMapper;
+import cn.cslg.pas.mapper.asso.AssoEventProjectMapper;
+import cn.cslg.pas.service.IAssoEventProjectService;
 import cn.cslg.pas.service.IEventService;
 import cn.cslg.pas.service.ProjectService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -30,7 +30,6 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.StringJoiner;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -48,65 +47,95 @@ public class EventServiceImpl extends ServiceImpl<EventMapper, Event> implements
     private final ProjectService projectService;
     private final EventMapper eventMapper;
     private final AssoEventProjectMapper assoEventProjectMapper;
+    private final IAssoEventProjectService assoEventProjectService;
     private final CacheUtils cacheUtils;
     private final LoginUtils loginUtils;
 
     /**
      * 新增事件
      *
-     * @param eventAddNewDTO 新增事件的DTO类对象
+     * @param eventAddNewDTOs 新增事件的DTO类对象集合
+     * @return 返回事件eventIds
      */
     @Override
-    public void addNew(EventAddNewDTO eventAddNewDTO) {
-        log.info("开始处理【新增事件】的业务,参数为:{}", eventAddNewDTO);
+    public List<Integer> addNew(List<EventAddNewDTO> eventAddNewDTOs) {
+        log.info("开始处理【批量新增事件】的业务,参数为:{}", eventAddNewDTOs);
 
-        //检查名称是否被占用(同一租户下不能有同名事件名称)
-        String questionName = eventAddNewDTO.getQuestionName();
-        Integer projectId = eventAddNewDTO.getProjectId();
-        Project project = projectService.getById(projectId);
-        Integer tenantId = project.getTenantId();
+        //获取当前登陆人信息取出登陆人id、登陆人名称、租户id
+        PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
+        Integer tenantId = personnelVO.getTenantId();
+        Integer createPersonId = personnelVO.getId();
+        String createPersonName = personnelVO.getName();
 
-        log.info("检查事件名称是否被占用(同一租户下不能有同名事件)");
-        int count = eventMapper.countByNameAndTenantId(questionName, tenantId);
-        if (count > 0) {
-            ThrowException.throwXiaoShiException("新增事件失败,当前租户下事件名称【" + questionName + "】已存在,请尝试更换名称");
+        //取出DTOs中的事件名称questionNames,根据事件名称questionNames和租户id查询出重名的已有事件
+        List<String> questionNames = eventAddNewDTOs.stream().map(EventAddNewDTO::getQuestionName).collect(Collectors.toList());
+        LambdaQueryWrapper<Event> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(Event::getQuestionName, questionNames).in(Event::getTenantId, tenantId);
+        List<Event> existNamesEvents = this.list(wrapper);
+        if (existNamesEvents != null && existNamesEvents.size() > 0) {
+            ThrowException.throwXiaoShiException("新增失败,本租户下事件名称【" + existNamesEvents.get(0).getQuestionName() + "已存在,请尝试更换名称】");
         }
 
-        //新增事件DTO数据赋值给事件表实体类
-        Event event = new Event();
-        BeanUtils.copyProperties(eventAddNewDTO, event);
-        event.setTenantId(tenantId);
-        List<Integer> applicationScenarios = eventAddNewDTO.getApplicationScenarios();
-        //若有应用场景,则将应用场景集合转换成以逗号拼接的字符串,并赋值给实体类对应参数
-        if (applicationScenarios != null && applicationScenarios.size() > 0) {
-            String applicationScenario = applicationScenarios.stream().map(String::valueOf).collect(Collectors.joining(","));
-            event.setApplicationScenario(applicationScenario);
-        }
-
-        //获取当前登陆人id及姓名
-        PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
-        event
-                .setCreatePersonId(personnelVO.getId())
-                .setCreatePersonName(personnelVO.getName());
-
-        log.info("数据入事件表");
-        int rows = eventMapper.insert(event);
-        if (rows != 1) {
-            ThrowException.throwXiaoShiException("新增事件失败,服务器忙请稍后再次尝试");
+        //新增事件
+        ArrayList<Event> events = new ArrayList<>();
+        for (EventAddNewDTO eventAddNewDTO : eventAddNewDTOs) {
+            String questionName = eventAddNewDTO.getQuestionName();
+            if (questionName == null || questionName.equals("")) {
+                ThrowException.throwXiaoShiException("新增失败,事件名称不能为空");
+            }
+            Event event = new Event();
+            BeanUtils.copyProperties(eventAddNewDTO, event);
+            event
+                    .setTenantId(tenantId)
+                    .setCreatePersonId(createPersonId)
+                    .setCreatePersonName(createPersonName);
+            List<Integer> applicationScenarios = eventAddNewDTO.getApplicationScenarios();
+            //若有应用场景,则将应用场景集合转换成以逗号拼接的字符串,并赋值给实体类对应参数
+            if (applicationScenarios != null && applicationScenarios.size() > 0) {
+                String applicationScenario = applicationScenarios.stream().map(String::valueOf).collect(Collectors.joining(","));
+                event.setApplicationScenario(applicationScenario);
+            }
+            events.add(event);
         }
+        //数据入事件表
+        this.saveBatch(events);
 
-        //数据入事件和专题库关联表
-        Integer eventId = event.getId();
-        AssoEventProject assoEventProject = new AssoEventProject()
-                .setEventId(eventId)
-                .setProjectId(projectId);
-        log.info("数据入事件和专题库关联表");
-        rows = assoEventProjectMapper.insert(assoEventProject);
-        if (rows != 1) {
-            ThrowException.throwXiaoShiException("新增事件失败,数据入事件和专题库关联表失败,服务器忙请稍后再次尝试");
+        ArrayList<Integer> eventIds = new ArrayList<>();
+        for (Event event : events) {
+            eventIds.add(event.getId());
         }
 
         log.info("新增事件完成");
+        return eventIds;
+    }
+
+    /**
+     * 专题库中新增事件
+     *
+     * @param projectEventAddNewDTO 专题库新增事件的DTO类对象集合
+     */
+    @Override
+    public void addNewEvent(ProjectEventAddNewDTO projectEventAddNewDTO) {
+        log.info("开始处理【专题库中新增事件】的业务,参数为:{}", projectEventAddNewDTO);
+
+        //新增事件
+        List<EventAddNewDTO> eventAddNewDTOs = projectEventAddNewDTO.getEventAddNewDTOs();
+        Integer projectId = projectEventAddNewDTO.getProjectId();
+        List<Integer> eventIds = new ArrayList<>();
+        //过滤去除已有事件↓(根据是否有id来过滤,有id则为已有事件无需新增,只做关联)
+        List<EventAddNewDTO> oldEventAddNewDTOs = eventAddNewDTOs.stream().filter(item -> item.getId() != null).collect(Collectors.toList());
+        eventAddNewDTOs.removeAll(oldEventAddNewDTOs);
+
+        //过滤后为新事件↓,新事件需要先去新增事件,拿到事件ids后再做关联
+        if (eventAddNewDTOs.size() > 0) {
+            List<Integer> newEventIds = this.addNew(eventAddNewDTOs);
+            eventIds.addAll(newEventIds);
+        }
+        for (EventAddNewDTO oldEventAddNewDTO : oldEventAddNewDTOs) {
+            eventIds.add(oldEventAddNewDTO.getId());
+        }
+        //新增事件和专题库关联
+        assoEventProjectService.addNew(eventIds, projectId);
 
     }
 
@@ -209,7 +238,9 @@ public class EventServiceImpl extends ServiceImpl<EventMapper, Event> implements
         }
 
         //删除事件和专题库关联表数据
-        assoEventProjectMapper.deleteByEventIdAndProjectId(eventId, projectId);
+        ArrayList<Integer> eventIds = new ArrayList<>();
+        eventIds.add(eventId);
+        assoEventProjectMapper.deleteByEventIdsAndProjectId(eventIds, projectId);
 
         //删除事件表数据
 //        int rows = eventMapper.deleteById(eventId);

+ 10 - 6
PAS/src/main/resources/mapper/AssoEventProjectMapper.xml

@@ -1,14 +1,18 @@
 <?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.cslg.pas.mapper.AssoEventProjectMapper">
-    <!--根据事件id和专题库id删除数据-->
-    <!--int deleteByEventIdAndProjectId(Integer eventId, Integer projectId);-->
-    <delete id="deleteByEventIdAndProjectId">
+<mapper namespace="cn.cslg.pas.mapper.asso.AssoEventProjectMapper">
+    <!--根据事件ids和专题库id批量删除数据-->
+    <!--int deleteByEventIdsAndProjectId(List<Integer> eventIds, Integer projectId);-->
+    <delete id="deleteByEventIdsAndProjectId">
         delete
         from pas.asso_event_project
-        where event_id = #{eventId}
-          and project_id = #{projectId}
+        where event_id in (
+        <foreach collection="eventIds" item="n" separator=",">
+            #{n}
+        </foreach>
+        )
+        and project_id = #{projectId}
     </delete>
 
 </mapper>