完成初版的问卷、问题、二维码管理

soul2/mobile_api
soul2 1 year ago
parent c0f08da047
commit 3b2f45600d
  1. 2
      src/main/java/cn/soul2/demo/JavaDemoApplication.java
  2. 9
      src/main/java/cn/soul2/demo/controller/QuestionnaireController.java
  3. 84
      src/main/java/cn/soul2/demo/controller/SubjectController.java
  4. 52
      src/main/java/cn/soul2/demo/dto/QnSubjectRefItemDTO.java
  5. 8
      src/main/java/cn/soul2/demo/dto/QnSubjectRefSaveDTO.java
  6. 3
      src/main/java/cn/soul2/demo/dto/SubjectDTO.java
  7. 8
      src/main/java/cn/soul2/demo/entity/SubjectItemsDO.java
  8. 24
      src/main/java/cn/soul2/demo/entity/sqlresult/RefQuestionnaireSubjectUseCountDO.java
  9. 50
      src/main/java/cn/soul2/demo/entity/sqlresult/SubjectChooseListDO.java
  10. 17
      src/main/java/cn/soul2/demo/mapper/QuestionnaireMapper.java
  11. 18
      src/main/java/cn/soul2/demo/mapper/SubjectMapper.java
  12. 10
      src/main/java/cn/soul2/demo/repository/IRefQuestionnaireSubjectRepository.java
  13. 10
      src/main/java/cn/soul2/demo/repository/IRefSubjectItemsRepository.java
  14. 27
      src/main/java/cn/soul2/demo/repository/ISubjectItemsRepository.java
  15. 45
      src/main/java/cn/soul2/demo/repository/ISubjectRepository.java
  16. 6
      src/main/java/cn/soul2/demo/repository/impl/QuestionnaireRepositoryImpl.java
  17. 45
      src/main/java/cn/soul2/demo/repository/impl/RefQuestionnaireSubjectRepositoryImpl.java
  18. 5
      src/main/java/cn/soul2/demo/repository/impl/RefSubjectItemsRepositoryImpl.java
  19. 35
      src/main/java/cn/soul2/demo/repository/impl/SubjectItemsRepositoryImpl.java
  20. 124
      src/main/java/cn/soul2/demo/repository/impl/SubjectRepositoryImpl.java
  21. 3
      src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java
  22. 5
      src/main/java/cn/soul2/demo/vo/QuestionnaireVO.java

@ -1,9 +1,11 @@
package cn.soul2.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("cn.soul2.demo.mapper")
public class JavaDemoApplication {
public static void main(String[] args) {

@ -1,8 +1,10 @@
package cn.soul2.demo.controller;
import cn.soul2.demo.dto.QnSubjectRefSaveDTO;
import cn.soul2.demo.dto.QuestionnaireDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.repository.IQuestionnaireRepository;
import cn.soul2.demo.repository.IRefQuestionnaireSubjectRepository;
import cn.soul2.demo.utils.base.BackUtils;
import cn.soul2.demo.vo.QuestionnaireVO;
import cn.soul2.demo.vo.base.Back;
@ -29,6 +31,9 @@ public class QuestionnaireController {
@Autowired
private IQuestionnaireRepository questionnaireRepository;
@Autowired
private IRefQuestionnaireSubjectRepository refQuestionnaireSubjectRepository;
@PostMapping("saveOrUpdate")
public Back<Boolean> saveOrUpdate(@RequestBody QuestionnaireDTO dto) {
return BackUtils.success(questionnaireRepository.saveOrUpdate(dto));
@ -49,5 +54,9 @@ public class QuestionnaireController {
return BackUtils.success(questionnaireRepository.updateStatus(dto));
}
@PostMapping("ref")
public Back<Boolean> ref(@RequestBody QnSubjectRefSaveDTO dto) {
return BackUtils.success(refQuestionnaireSubjectRepository.updateRefSubjects(dto));
}
}

@ -0,0 +1,84 @@
package cn.soul2.demo.controller;
import cn.soul2.demo.dto.QnSubjectRefItemDTO;
import cn.soul2.demo.dto.SubjectDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.entity.SubjectItemsDO;
import cn.soul2.demo.entity.sqlresult.SubjectChooseListDO;
import cn.soul2.demo.repository.IRefSubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectRepository;
import cn.soul2.demo.utils.base.BackUtils;
import cn.soul2.demo.vo.SubjectItemVO;
import cn.soul2.demo.vo.SubjectVO;
import cn.soul2.demo.vo.base.Back;
import cn.soul2.demo.vo.base.VPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Soul2
* @date 2024-03-14 17:36
*/
@Slf4j
@RestController
@RequestMapping("/subject")
public class SubjectController {
@Autowired
private ISubjectRepository subjectRepository;
@Autowired
private ISubjectItemsRepository itemsRepository;
@Autowired
private IRefSubjectItemsRepository refSubjectItemsRepository;
@PostMapping("saveOrUpdate")
public Back<Boolean> saveOrUpdate(@RequestBody SubjectDTO dto) {
return BackUtils.success(subjectRepository.saveOrUpdate(dto));
}
@PostMapping("page")
public Back<VPage<SubjectVO>> page(@RequestBody SubjectDTO dto) {
return BackUtils.success(subjectRepository.page(dto));
}
@PostMapping("remove")
public Back<Boolean> remove(Collection<String> ids) {
return BackUtils.success(subjectRepository.removeAndItems(ids));
}
@PostMapping("status")
public Back<Boolean> status(@RequestBody UpdateStatusDTO dto) {
return BackUtils.success(subjectRepository.status(dto));
}
@PostMapping("items")
public Back<SubjectVO> item(@RequestBody SubjectDTO dto) {
SubjectVO vo = new SubjectVO();
BeanUtils.copyProperties(dto, vo);
List<SubjectItemsDO> items = itemsRepository.listBySubjectId(dto.getId());
return BackUtils.success(vo.setItems(items.stream().map(o -> {
SubjectItemVO itemVo = new SubjectItemVO();
BeanUtils.copyProperties(o, itemVo);
return itemVo;
}).collect(Collectors.toList())));
}
@PostMapping("chooseList")
public Back<VPage<SubjectChooseListDO>> chooseList(@RequestBody QnSubjectRefItemDTO dto) {
return BackUtils.success(subjectRepository.chooseList(dto));
}
}

@ -0,0 +1,52 @@
package cn.soul2.demo.dto;
import cn.soul2.demo.dto.base.PageParams;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-16 19:20
*/
@Data
@Accessors(chain = true)
public class QnSubjectRefItemDTO extends PageParams {
/**
* 问题Id
*/
private String subjectId;
/**
* 问卷id
*/
private String qnId;
/**
* 题目标题
*/
private String title;
/**
* 题目内容
*/
private String content;
/**
* 排列序号
*/
private Short sort;
/**
* 题目类型:0-单选;1-多选;2-文字
*/
private Short type;
/**
* 已选中
*/
private Boolean selected;
}

@ -7,20 +7,20 @@ import java.util.Collection;
/**
* @author Soul2
* @date 2024-03-13 15:21
* @date 2024-03-16 20:30
*/
@Data
@Accessors(chain = true)
public class QnSubjectRefDTO {
public class QnSubjectRefSaveDTO {
/**
* 问卷Id
* QnId
*/
private String qnId;
/**
* id
* 题ids
*/
private Collection<String> subjectIds;

@ -1,5 +1,6 @@
package cn.soul2.demo.dto;
import cn.soul2.demo.dto.base.PageParams;
import lombok.Data;
import lombok.experimental.Accessors;
@ -12,7 +13,7 @@ import java.util.List;
@Data
@Accessors(chain = true)
public class SubjectDTO {
public class SubjectDTO extends PageParams {
/**
* id

@ -15,7 +15,7 @@ import java.time.LocalDateTime;
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
* @since 2024-03-15 20:03:34
*/
@Getter
@Setter
@ -44,10 +44,10 @@ public class SubjectItemsDO extends Model<SubjectItemsDO> {
private Short sort;
/**
* 状态0禁用1启用
* 题目id
*/
@TableField("status")
private Short status;
@TableField("subject_id")
private String subjectId;
/**
* 更新时间

@ -0,0 +1,24 @@
package cn.soul2.demo.entity.sqlresult;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-16 15:04
*/
@Data
@Accessors(chain = true)
public class RefQuestionnaireSubjectUseCountDO {
/**
* 题目id
*/
private String subjectId;
/**
* 被问卷使用的次数
*/
private Integer useCount;
}

@ -0,0 +1,50 @@
package cn.soul2.demo.entity.sqlresult;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-16 13:22
*/
@Data
@Accessors(chain = true)
public class SubjectChooseListDO {
/**
* id
*/
private String id;
/**
* 题目标题
*/
private String title;
/**
* 题目内容
*/
private String content;
/**
* 排列序号
*/
private Short sort;
/**
* 题目类型:0-单选;1-多选;2-文字
*/
private Short type;
/**
* 被问卷使用的次数
*/
private Integer useCount;
/**
* 已选中
*/
private Integer selected;
}

@ -1,7 +1,13 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.QuestionnaireDO;
import cn.soul2.demo.vo.QuestionnaireVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* <p>
@ -13,4 +19,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface QuestionnaireMapper extends BaseMapper<QuestionnaireDO> {
/**
* 分页查询问卷及选择题目数量
*
* @param page 页码
* @param wrapper 查询条件
* @return {@link IPage}<{@link QuestionnaireVO}>
*/
@Select("select a.*, IFNULL(r.has_subject_count,0) as has_subject_count from (SELECT * FROM tb_questionnaire WHERE removed=0) a left join (select qn_id, count(subject_id) as has_subject_count from tb_ref_questionnaire_subject WHERE removed=0) r on a.id=r.qn_id " +
"${ew.customSqlSegment}")
IPage<QuestionnaireVO> page(IPage<QuestionnaireDO> page, @Param(Constants.WRAPPER) Wrapper wrapper);
}

@ -1,7 +1,13 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.SubjectDO;
import cn.soul2.demo.entity.sqlresult.SubjectChooseListDO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* <p>
@ -13,4 +19,16 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface SubjectMapper extends BaseMapper<SubjectDO> {
/**
* 分页查询已选题目, 用于问卷选择题目
*
* @param page 页码
* @param wrapper 查询条件
* @param qnId 问卷id
* @return {@link IPage}<{@link SubjectChooseListDO}>
*/
@Select("select a.id, ifnull(r.use_count, 0) as use_count, a.content, a.sort, a.title, a.type, (CASE WHEN EXISTS (SELECT 1 FROM tb_ref_questionnaire_subject WHERE removed = 0 and qn_id = #{qnId} AND subject_id = a.id) THEN 1 ELSE 0 END) AS selected from (select * from tb_subject WHERE removed = 0) a left join (select subject_id, count(qn_id) as use_count from tb_ref_questionnaire_subject WHERE removed = 0) r on a.id=r.subject_id " +
"${ew.customSqlSegment}")
IPage<SubjectChooseListDO> useCounts(IPage<SubjectChooseListDO> page, @Param(Constants.WRAPPER) Wrapper wrapper, String qnId);
}

@ -1,6 +1,6 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.QnSubjectRefDTO;
import cn.soul2.demo.dto.QnSubjectRefSaveDTO;
import cn.soul2.demo.entity.RefQuestionnaireSubjectDO;
import cn.soul2.demo.entity.SubjectDO;
import com.baomidou.mybatisplus.extension.service.IService;
@ -26,13 +26,7 @@ public interface IRefQuestionnaireSubjectRepository extends IService<RefQuestion
*/
List<SubjectDO> getSubjects(Collection<String> qnIds);
/**
* 连接问卷-题目
*
* @param dto QnId and subjectIds
* @return {@link Boolean}
*/
Boolean connectSubjects(QnSubjectRefDTO dto);
Boolean updateRefSubjects(QnSubjectRefSaveDTO dto);
}

@ -26,6 +26,16 @@ public interface IRefSubjectItemsRepository extends IService<RefSubjectItemsDO>
*/
List<SubjectItemsDO> getSubjectItems(Collection<String> subjectIds);
/**
* 更新连接
* 不在新列表中的则删除,无则
*
* @param subjectId
* @param newItemIds
* @return {@link Integer}
*/
Integer updateRef(String subjectId, Collection<String> newItemIds);
/**
* 连接题目-选项
*

@ -3,6 +3,9 @@ package cn.soul2.demo.repository;
import cn.soul2.demo.entity.SubjectItemsDO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 题选项表 服务类
@ -13,5 +16,29 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ISubjectItemsRepository extends IService<SubjectItemsDO> {
/**
* 根据题目id查询选项
*
* @param subjectId 题目id
* @return {@link List}<{@link SubjectItemsDO}>
*/
List<SubjectItemsDO> listBySubjectId(String subjectId);
/**
* 根据题目id查询选项
*
* @param subjectIds 题目id
* @return {@link List}<{@link SubjectItemsDO}>
*/
List<SubjectItemsDO> listBySubjectIds(Collection<String> subjectIds);
/**
* 删除指定题目id下的所有选项
*
* @param subjectIds 题目id
* @return {@link Boolean}
*/
Boolean removeBySubjectId(Collection<String> subjectIds);
}

@ -1,9 +1,16 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.QnSubjectRefItemDTO;
import cn.soul2.demo.dto.SubjectDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.entity.SubjectDO;
import cn.soul2.demo.entity.sqlresult.SubjectChooseListDO;
import cn.soul2.demo.vo.SubjectVO;
import cn.soul2.demo.vo.base.VPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
/**
* <p>
* 题目表 服务类
@ -14,6 +21,44 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ISubjectRepository extends IService<SubjectDO> {
/**
* 保存或更新
*
* @param dto 入参
* @return {@link Boolean}
*/
Boolean saveOrUpdate(SubjectDTO dto);
/**
* 删除题目,同时删除选项
*
* @param ids 题目id
* @return {@link Boolean}
*/
Boolean removeAndItems(Collection<String> ids);
/**
* 分页查询
*
* @param dto 查询条件
* @return {@link VPage}<{@link SubjectVO}>
*/
VPage<SubjectVO> page(SubjectDTO dto);
/**
* 更新状态
*
* @param dto 目标id和状态
* @return {@link Boolean}
* @deprecated 问题状态无意义, 更新状态将没有任何影响
*/
Boolean status(UpdateStatusDTO dto);
/**
* 问卷选择题目时的视图查询
*
* @param dto 查询条件
* @return {@link VPage}<{@link SubjectChooseListDO}>
*/
VPage<SubjectChooseListDO> chooseList(QnSubjectRefItemDTO dto);
}

@ -16,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.stream.Collectors;
/**
@ -29,6 +30,9 @@ import java.util.stream.Collectors;
@Service
public class QuestionnaireRepositoryImpl extends ServiceImpl<QuestionnaireMapper, QuestionnaireDO> implements IQuestionnaireRepository {
@Resource
private QuestionnaireMapper questionnaireMapper;
@Override
public VPage<QuestionnaireVO> page(QuestionnaireDTO dto) {
LambdaQueryWrapper<QuestionnaireDO> query = Wrappers.lambdaQuery();
@ -41,7 +45,7 @@ public class QuestionnaireRepositoryImpl extends ServiceImpl<QuestionnaireMapper
.le(dto.getEndTime() != null, QuestionnaireDO::getUpdatedTime, dto.getEndTime());
}
query.orderByDesc(QuestionnaireDO::getUpdatedTime).orderByDesc(QuestionnaireDO::getCreatedTime);
VPage<QuestionnaireDO> page = PageUtils.to(super.page(PageUtils.build(dto), query));
VPage<QuestionnaireVO> page = PageUtils.to(questionnaireMapper.page(PageUtils.build(dto), query));
return PageUtils.to(page, page.getRows().stream().map(e -> {
QuestionnaireVO vo = new QuestionnaireVO();
BeanUtils.copyProperties(e, vo);

@ -1,6 +1,6 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.QnSubjectRefDTO;
import cn.soul2.demo.dto.QnSubjectRefSaveDTO;
import cn.soul2.demo.entity.RefQuestionnaireSubjectDO;
import cn.soul2.demo.entity.SubjectDO;
import cn.soul2.demo.mapper.RefQuestionnaireSubjectMapper;
@ -10,8 +10,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.ArrayList;
import java.util.Collection;
@ -50,11 +53,39 @@ public class RefQuestionnaireSubjectRepositoryImpl extends ServiceImpl<RefQuesti
}
@Override
public Boolean connectSubjects(QnSubjectRefDTO dto) {
return super.saveBatch(dto.getSubjectIds().stream().map(s -> {
RefQuestionnaireSubjectDO ref = new RefQuestionnaireSubjectDO();
ref.setSubjectId(s).setQnId(dto.getQnId());
return ref;
}).collect(Collectors.toList()));
@Transactional
public Boolean updateRefSubjects(QnSubjectRefSaveDTO dto) {
if (StringUtils.isBlank(dto.getQnId())) {
return Boolean.FALSE;
}
// load old Ref data
LambdaQueryWrapper<RefQuestionnaireSubjectDO> query = Wrappers.lambdaQuery();
query.eq(RefQuestionnaireSubjectDO::getQnId, dto.getQnId());
List<RefQuestionnaireSubjectDO> oldRefs = super.list(query);
List<String> oldRefSubjectIds = oldRefs.stream().map(RefQuestionnaireSubjectDO::getSubjectId).collect(Collectors.toList());
// Calculate the data that needs to be changed
List<RefQuestionnaireSubjectDO> removeRefs = oldRefs.stream().filter(e -> !dto.getSubjectIds().contains(e.getSubjectId())).collect(Collectors.toList());
List<String> insertRefs = dto.getSubjectIds().stream().filter(e -> !oldRefSubjectIds.contains(e)).collect(Collectors.toList());
boolean removed;
if (CollectionUtils.isNotEmpty(removeRefs)) {
removed = super.removeByIds(removeRefs.stream().map(RefQuestionnaireSubjectDO::getId).collect(Collectors.toList()));
} else {
removed = true;
}
if (removed && CollectionUtils.isEmpty(insertRefs)) {
return Boolean.TRUE;
}
if (removed) {
boolean saved = super.saveBatch(insertRefs.stream().map(e -> {
RefQuestionnaireSubjectDO ref = new RefQuestionnaireSubjectDO();
return ref.setQnId(dto.getQnId()).setSubjectId(e);
}).collect(Collectors.toList()));
if (saved) {
return Boolean.TRUE;
}
}
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
}
}

@ -99,4 +99,9 @@ public class RefSubjectItemsRepositoryImpl extends ServiceImpl<RefSubjectItemsMa
}
return removed;
}
@Override
public Integer updateRef(String subjectId, Collection<String> newItemIds) {
return null;
}
}

@ -3,9 +3,18 @@ package cn.soul2.demo.repository.impl;
import cn.soul2.demo.entity.SubjectItemsDO;
import cn.soul2.demo.mapper.SubjectItemsMapper;
import cn.soul2.demo.repository.ISubjectItemsRepository;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 题选项表 服务实现类
@ -17,4 +26,30 @@ import org.springframework.stereotype.Service;
@Service
public class SubjectItemsRepositoryImpl extends ServiceImpl<SubjectItemsMapper, SubjectItemsDO> implements ISubjectItemsRepository {
@Override
public List<SubjectItemsDO> listBySubjectId(String subjectId) {
if (StringUtils.isBlank(subjectId)) {
return new ArrayList<>();
}
LambdaQueryWrapper<SubjectItemsDO> query = Wrappers.lambdaQuery();
query.eq(SubjectItemsDO::getSubjectId, subjectId);
return super.list(query);
}
@Override
public List<SubjectItemsDO> listBySubjectIds(Collection<String> subjectIds) {
if (CollectionUtils.isEmpty(subjectIds)) {
return new ArrayList<>();
}
LambdaQueryWrapper<SubjectItemsDO> query = Wrappers.lambdaQuery();
query.in(SubjectItemsDO::getSubjectId, subjectIds);
return super.list(query);
}
@Override
public Boolean removeBySubjectId(Collection<String> subjectIds) {
LambdaUpdateWrapper<SubjectItemsDO> update = Wrappers.lambdaUpdate();
update.in(SubjectItemsDO::getSubjectId, subjectIds);
return super.remove(update);
}
}

@ -1,12 +1,22 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.QnSubjectRefItemDTO;
import cn.soul2.demo.dto.SubjectDTO;
import cn.soul2.demo.dto.SubjectItemDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.entity.SubjectDO;
import cn.soul2.demo.entity.SubjectItemsDO;
import cn.soul2.demo.entity.sqlresult.SubjectChooseListDO;
import cn.soul2.demo.mapper.SubjectMapper;
import cn.soul2.demo.repository.IRefSubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectRepository;
import cn.soul2.demo.utils.base.PageUtils;
import cn.soul2.demo.vo.SubjectVO;
import cn.soul2.demo.vo.base.VPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@ -15,6 +25,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -31,33 +43,113 @@ public class SubjectRepositoryImpl extends ServiceImpl<SubjectMapper, SubjectDO>
@Autowired
private ISubjectItemsRepository itemsRepository;
@Autowired
private IRefSubjectItemsRepository refSubjectItemsRepository;
@Resource
private SubjectMapper subjectMapper;
@Override
@Transactional
public Boolean saveOrUpdate(SubjectDTO dto) {
SubjectDO entity = new SubjectDO();
BeanUtils.copyProperties(dto, entity);
if (StringUtils.isNotBlank(entity.getId())) {
// delete old connections when updating
refSubjectItemsRepository.disConnectItems(entity.getId(), true);
if (!super.saveOrUpdate(entity)) {
return Boolean.FALSE;
}
if (super.saveOrUpdate(entity)) {
boolean itemsSaved = itemsRepository.saveBatch(dto.getItems().stream().map(e -> {
SubjectItemsDO item = new SubjectItemsDO();
BeanUtils.copyProperties(e, item);
if (StringUtils.isNotEmpty(item.getId())) {
item.setId(item.getId());
// If no id is passed, it is save.
if (StringUtils.isBlank(entity.getId())) {
if (CollectionUtils.isNotEmpty(dto.getItems())) {
boolean itemsSaved = itemsRepository.saveBatch(dto.getItems().stream().map(e -> {
SubjectItemsDO item = new SubjectItemsDO();
BeanUtils.copyProperties(e, item);
item.setSubjectId(entity.getId());
return item;
}).collect(Collectors.toList()));
if (!itemsSaved) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
}
}
return Boolean.TRUE;
} else {
// otherwise update
List<SubjectItemsDO> addOrUpdateItems = new ArrayList<>();
List<String> removeItems = new ArrayList<>();
List<SubjectItemsDO> oldItems = itemsRepository.listBySubjectId(entity.getId());
Map<String, SubjectItemsDO> oldMap = oldItems.stream().collect(Collectors.toMap(SubjectItemsDO::getId, o -> o, (o1, o2) -> o1));
Map<String, SubjectItemDTO> dtoMap = null;
if (CollectionUtils.isNotEmpty(dto.getItems())) {
dtoMap = dto.getItems().stream().collect(Collectors.toMap(SubjectItemDTO::getItemId, o -> o, (o1, o2) -> o1));
} else {
dtoMap = new HashMap<>(0);
}
dtoMap.forEach((k, v) -> {
if (!oldMap.containsKey(k)) {
SubjectItemsDO addItem = new SubjectItemsDO();
BeanUtils.copyProperties(v, addItem);
addItem.setSubjectId(entity.getId());
addOrUpdateItems.add(addItem);
}
return item;
}).collect(Collectors.toList()));
if (!itemsSaved) {
});
Map<String, SubjectItemDTO> finalDtoMap = dtoMap;
oldMap.forEach((k, v) -> {
if (!finalDtoMap.containsKey(k)) {
removeItems.add(k);
} else {
SubjectItemsDO addItem = new SubjectItemsDO();
BeanUtils.copyProperties(v, addItem);
BeanUtils.copyProperties(finalDtoMap.get(k), addItem);
addOrUpdateItems.add(addItem);
}
});
if (CollectionUtils.isNotEmpty(removeItems) && !itemsRepository.removeByIds(removeItems)) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
} else if (CollectionUtils.isNotEmpty(addOrUpdateItems) && !itemsRepository.saveOrUpdateBatch(addOrUpdateItems)) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
}
return Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
@Transactional
public Boolean removeAndItems(Collection<String> ids) {
if (!super.removeByIds(ids) || !itemsRepository.removeBySubjectId(ids)) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
}
return Boolean.TRUE;
}
@Override
public VPage<SubjectVO> page(SubjectDTO dto) {
LambdaQueryWrapper<SubjectDO> query = Wrappers.lambdaQuery();
query.eq(dto.getType() != null, SubjectDO::getType, dto.getType())
.likeRight(StringUtils.isNotBlank(dto.getTitle()), SubjectDO::getTitle, dto.getTitle())
.orderByDesc(SubjectDO::getUpdatedTime);
VPage<SubjectDO> dovPage = PageUtils.to(super.page(PageUtils.build(dto), query));
return PageUtils.to(dovPage, dovPage.getRows().stream().map(e -> {
SubjectVO vo = new SubjectVO();
BeanUtils.copyProperties(e, vo);
return vo;
}).collect(Collectors.toList()));
}
@Override
public Boolean status(UpdateStatusDTO dto) {
LambdaUpdateWrapper<SubjectDO> update = Wrappers.lambdaUpdate();
update.set(SubjectDO::getStatus, dto.getStatus()).eq(SubjectDO::getId, dto.getId());
return super.update(update);
}
@Override
public VPage<SubjectChooseListDO> chooseList(QnSubjectRefItemDTO dto) {
LambdaQueryWrapper<SubjectDO> query = Wrappers.lambdaQuery();
query.like(StringUtils.isNotBlank(dto.getTitle()), SubjectDO::getTitle, dto.getTitle())
.eq(dto.getType() != null, SubjectDO::getType, dto.getType())
.orderByDesc(SubjectDO::getUpdatedTime);
return PageUtils.to(subjectMapper.useCounts(PageUtils.build(dto), query, dto.getQnId()));
}
}

@ -27,8 +27,7 @@ public class MybatisFastGenerator {
* 设置需要生成的表名
*/
private static final String[] TABLE_NAMES = {
"tb_ref_questionnaire_subject",
"tb_ref_subject_items",
"tb_subject_items",
};
/**
* 是否为表更新

@ -39,4 +39,9 @@ public class QuestionnaireVO {
*/
private LocalDateTime updatedTime;
/**
* 已选择的题目数量
*/
private Integer hasSubjectCount;
}

Loading…
Cancel
Save