BUGFIX: sketchBoard upload checkMd5校验;

TASK: 分类;
This commit is contained in:
shahaibo
2023-11-03 14:59:19 +08:00
parent 85a815dddc
commit bb1c56182e
13 changed files with 412 additions and 3 deletions

View File

@@ -0,0 +1,70 @@
package com.ai.da.controller;
import com.ai.da.common.response.Response;
import com.ai.da.mapper.entity.Workspace;
import com.ai.da.model.dto.ClassificationDTO;
import com.ai.da.model.dto.WorkspaceDTO;
import com.ai.da.model.enums.BizJson;
import com.ai.da.model.vo.ClassificationVO;
import com.ai.da.model.vo.ModelsVO;
import com.ai.da.model.vo.WorkspaceVO;
import com.ai.da.service.ClassificationService;
import com.ai.da.service.WorkspaceService;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.io.FileNotFoundException;
import java.util.List;
/**
* 控制器
*
* @author SHAHAIBO
* @since 2023-11-03
*/
@RestController
@AllArgsConstructor
@NoArgsConstructor
@RequestMapping("/api/classification")
@Api(value = "", tags = "接口")
public class ClassificationController {
@Resource
private ClassificationService classificationService;
/**
* 新增修改
*/
@PostMapping("/saveOrUpdate")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "新增修改", notes = "传入ClassificationDTO")
public Response<Boolean> saveOrUpdate(@Valid @RequestBody ClassificationDTO classificationDTO) {
return Response.success(classificationService.saveOrUpdate(classificationDTO));
}
/**
* 删除
*/
@PostMapping("/delete")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "删除", notes = "传入ClassificationDTO")
public Response<Boolean> delete(@Valid @RequestBody ClassificationDTO classificationDTO) {
return Response.success(classificationService.delete(classificationDTO));
}
@PostMapping("/queryClassification")
@ApiOperationSupport(order = 3)
@ApiModelProperty(value = "查询", notes = "传入ClassificationDTO")
public Response<List<ClassificationVO>> queryClassification(@Valid @RequestBody ClassificationDTO classificationDTO) {
return Response.success(classificationService.queryClassification(classificationDTO));
}
}

View File

@@ -88,7 +88,7 @@ public class LibraryController {
if (StringUtils.isEmpty(modelType)) {
throw new BusinessException("modelType.cannot.be.empty");
}
if (modelType.equals(ModelType.SYSTEM.getValue()) && StringUtils.isEmpty(sex)) {
if (StringUtils.isEmpty(sex)) {
throw new BusinessException("modelSex.cannot.be.empty");
}
FileVO fileVO = FileUtil.getFileSize(file);

View File

@@ -0,0 +1,15 @@
package com.ai.da.mapper;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.entity.ChatRobot;
import com.ai.da.mapper.entity.Classification;
/**
* Mapper 接口
*
* @author SHAHAIBO
* @since 2023-09-25
*/
public interface ClassificationMapper extends CommonMapper<Classification> {
}

View File

@@ -0,0 +1,15 @@
package com.ai.da.mapper;
import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.entity.Classification;
import com.ai.da.mapper.entity.ClassificationRelLibrary;
/**
* Mapper 接口
*
* @author SHAHAIBO
* @since 2023-09-25
*/
public interface ClassificationRelLibraryMapper extends CommonMapper<ClassificationRelLibrary> {
}

View File

@@ -0,0 +1,37 @@
package com.ai.da.mapper.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("classification_rel_library")
public class ClassificationRelLibrary implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "ID")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "分类名称")
private Long classificationId;
@ApiModelProperty(value = "分类名称")
private Long libraryId;
@ApiModelProperty(value = "用户ID")
private Long userId;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;
@ApiModelProperty(value = "是否删除1:是0:否")
private Integer isDeleted;
}

View File

@@ -0,0 +1,21 @@
package com.ai.da.model.dto;
import com.ai.da.mapper.entity.Classification;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
public class ClassificationDTO extends Classification {
private static final long serialVersionUID = 1L;
@ApiModelProperty("分类ID列表")
private List<Long> classificationIdList;
@ApiModelProperty("LibraryID")
private Long libraryId;
@ApiModelProperty("分类删除校验1校验0不校验")
private Integer deleteConfirm;
}

View File

@@ -0,0 +1,16 @@
package com.ai.da.model.vo;
import com.ai.da.mapper.entity.Classification;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
public class ClassificationVO extends Classification {
private static final long serialVersionUID = 1L;
private List<ClassificationVO> childList;
}

View File

@@ -0,0 +1,30 @@
package com.ai.da.service;
import com.ai.da.mapper.entity.Classification;
import com.ai.da.mapper.entity.Library;
import com.ai.da.model.dto.ChatFlushDTO;
import com.ai.da.model.dto.ChatRobotLibraryDTO;
import com.ai.da.model.dto.ChatSendDTO;
import com.ai.da.model.dto.ClassificationDTO;
import com.ai.da.model.vo.ChatRobotVO;
import com.ai.da.model.vo.ClassificationVO;
import java.math.BigDecimal;
import java.util.List;
/**
* @author SHAHAIBO
* @version 1.0
* @project aida_back
* @description 分类服务接口
* @date 2023/11/3 10:00:00
*/
public interface ClassificationService {
Boolean saveOrUpdate(ClassificationDTO classificationDTO);
Boolean delete(ClassificationDTO classificationDTO);
List<ClassificationVO> queryClassification(ClassificationDTO classificationDTO);
List<ClassificationVO> getClassificationVOList(List<Classification> classificationList);
}

View File

@@ -0,0 +1,163 @@
package com.ai.da.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.utils.CopyUtil;
import com.ai.da.mapper.ClassificationMapper;
import com.ai.da.mapper.ClassificationRelLibraryMapper;
import com.ai.da.mapper.entity.Classification;
import com.ai.da.mapper.entity.ClassificationRelLibrary;
import com.ai.da.model.dto.ClassificationDTO;
import com.ai.da.model.vo.AuthPrincipalVo;
import com.ai.da.model.vo.ClassificationVO;
import com.ai.da.service.ClassificationService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* @author SHAHAIBO
* @version 1.0
* @project aida_back
* @description 分类 接口服务实现类
* @date 2023/11/3 10:00:00
*/
@Slf4j
@Service
public class ClassificationServiceImpl implements ClassificationService {
@Resource
private ClassificationMapper classificationMapper;
@Resource
private ClassificationRelLibraryMapper classificationRelLibraryMapper;
@Override
public Boolean saveOrUpdate(ClassificationDTO classificationDTO) {
//校验
classificationDTOCheck(classificationDTO);
AuthPrincipalVo userHolder = UserContext.getUserHolder();
Classification classification = CopyUtil.copyObject(classificationDTO, Classification.class);
if (null == classificationDTO.getId()) {
// 新增
if (null == classification.getParentId()) {
// 一级分类parentId
classification.setParentId(0L);
}
classification.setCreateTime(LocalDateTime.now());
classification.setUserId(userHolder.getId());
int insert = classificationMapper.insert(classification);
if (insert == 1) {
return Boolean.TRUE;
}else {
throw new BusinessException("save.classification.failed");
}
}else {
// 修改
classification.setUpdateTime(LocalDateTime.now());
int update = classificationMapper.updateById(classification);
if (update == 1) {
return Boolean.TRUE;
}else {
throw new BusinessException("update.classification.failed");
}
}
}
@Override
public Boolean delete(ClassificationDTO classificationDTO) {
QueryWrapper<ClassificationRelLibrary> qw = new QueryWrapper<>();
qw.lambda().in(ClassificationRelLibrary::getClassificationId, classificationDTO.getClassificationIdList());
List<ClassificationRelLibrary> classificationRelLibraryList = classificationRelLibraryMapper.selectList(qw);
if (0 == classificationDTO.getDeleteConfirm()) {
// 校验删除的分类是否有关联的library数据
if (CollectionUtil.isNotEmpty(classificationRelLibraryList)) {
throw new BusinessException("the.classification.you.deleted.has.associated.library");
}
}else {
if (CollectionUtil.isNotEmpty(classificationRelLibraryList)) {
classificationRelLibraryMapper.delete(qw);
}
}
classificationMapper.deleteBatchIds(classificationDTO.getClassificationIdList());
return Boolean.TRUE;
}
@Override
public List<ClassificationVO> queryClassification(ClassificationDTO classificationDTO) {
AuthPrincipalVo userHolder = UserContext.getUserHolder();
QueryWrapper<Classification> qw = new QueryWrapper<>();
qw.lambda().eq(Classification::getUserId, userHolder.getId());
qw.lambda().eq(Classification::getType, classificationDTO.getType());
qw.lambda().eq(Classification::getParentId, 0L);
List<Classification> classificationList = classificationMapper.selectList(qw);
if (CollectionUtil.isNotEmpty(classificationList)) {
// 获取结果集
return getClassificationVOList(classificationList);
}
return new ArrayList<>();
}
@Override
public List<ClassificationVO> getClassificationVOList(List<Classification> classificationList) {
List<ClassificationVO> classificationVOS = CopyUtil.copyList(classificationList, ClassificationVO.class);
for (ClassificationVO classificationVO : classificationVOS) {
// 递归
List<ClassificationVO> childList = recursionClassificationVO(classificationVO);
if (CollectionUtil.isNotEmpty(childList)) {
classificationVO.setChildList(childList);
}
}
return classificationVOS;
}
private List<ClassificationVO> recursionClassificationVO(ClassificationVO classificationVO) {
QueryWrapper<Classification> qw = new QueryWrapper<>();
qw.lambda().eq(Classification::getParentId, classificationVO.getId());
List<Classification> classificationChildList = classificationMapper.selectList(qw);
if (CollectionUtil.isEmpty(classificationChildList)) {
return new ArrayList<>();
}
List<ClassificationVO> classificationChildVOList = CopyUtil.copyList(classificationChildList, ClassificationVO.class);
for (ClassificationVO classificationChildVO : classificationChildVOList) {
// 递归
List<ClassificationVO> childList = recursionClassificationVO(classificationChildVO);
if (CollectionUtil.isNotEmpty(childList)) {
classificationChildVO.setChildList(childList);
}
}
return classificationChildVOList;
}
private void classificationDTOCheck(ClassificationDTO classificationDTO) {
if (StringUtils.isEmpty(classificationDTO.getType())) {
throw new BusinessException("type.cannot.be.empty");
}
if (StringUtils.isEmpty(classificationDTO.getClassificationName())) {
throw new BusinessException("classificationName.cannot.be.empty");
}
QueryWrapper<Classification> qw = new QueryWrapper<>();
qw.lambda().ne(null != classificationDTO.getId(), Classification::getId, classificationDTO.getId());
qw.lambda().eq(Classification::getType, classificationDTO.getType());
if (null == classificationDTO.getParentId()) {
qw.lambda().eq(Classification::getParentId, 0L);
}else {
qw.lambda().eq(Classification::getParentId, classificationDTO.getParentId());
}
qw.lambda().eq(Classification::getClassificationName, classificationDTO.getClassificationName());
List<Classification> classificationList = classificationMapper.selectList(qw);
if (CollectionUtil.isNotEmpty(classificationList)) {
throw new BusinessException("classificationName.already.exists");
}
}
}

View File

@@ -281,7 +281,7 @@ public class LibraryServiceImpl extends ServiceImpl<LibraryMapper, Library> impl
qw.lambda().eq(Library::getAccountId, userInfo.getId());
qw.lambda().eq(Library::getLevel1Type, level1Type);
if (!StringUtils.isEmpty(sex)) {
if (level1Type.equals(LibraryLevel1TypeEnum.SKETCH_BOARD)) {
if (level1Type.equals(LibraryLevel1TypeEnum.SKETCH_BOARD.getRealName())) {
qw.lambda().eq(Library::getLevel2Type, level2Type);
qw.lambda().eq(Library::getLevel3Type, sex);
} else {

View File

@@ -0,0 +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="com.ai.da.mapper.ClassificationMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ai.da.mapper.entity.Classification">
<id column="id" property="id" />
<result column="classification_name" property="classificationName" />
<result column="type" property="type" />
<result column="parent_id" property="parentId" />
<result column="user_id" property="userId" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="is_deleted" property="isDeleted" />
</resultMap>
</mapper>

View File

@@ -0,0 +1,17 @@
<?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.ai.da.mapper.ClassificationRelLibraryMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ai.da.mapper.entity.ClassificationRelLibrary">
<id column="id" property="id" />
<result column="classification_id" property="classificationId" />
<result column="library_id" property="libraryId" />
<result column="user_id" property="userId" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="is_deleted" property="isDeleted" />
</resultMap>
</mapper>

View File

@@ -72,6 +72,9 @@ save.sysFile.failed=Save sysFile failed!
save.pythonTAllInfo.failed=Save pythonTAllInfo failed!
save.collection.failed=Save collection failed!
save.designItemDetail.failed=Save designItemDetail failed!
save.classification.failed=Save classification failed!
update.classification.failed=Update classification failed!
# 前端传参校验
singleOverall.cannot.be.empty=singleOverall cannot be empty!
colorBoards.cannot.be.empty=colorBoards cannot be empty!
@@ -131,4 +134,8 @@ level1Type.cannot.be.empty=level1Type cannot be empty!
regionNum.cannot.be.empty=regionNum cannot be empty!
phone.cannot.be.empty=phone cannot be empty!
printId.cannot.be.empty=printId cannot be empty!
path.cannot.be.empty=Path cannot be empty!
path.cannot.be.empty=path cannot be empty!
classificationName.cannot.be.empty=classificationName cannot be empty!
classificationName.already.exists=ClassificationName already exists, please change it!
the.classification.you.deleted.has.associated.library=The classification you deleted has associated data, are you sure to delete it!