From bb1c56182e0a64c2898e4fa64637e84045a7ab74 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 3 Nov 2023 14:59:19 +0800 Subject: [PATCH] =?UTF-8?q?BUGFIX:=20sketchBoard=20upload=20checkMd5?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C;=20TASK:=20=E5=88=86=E7=B1=BB;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ClassificationController.java | 70 ++++++++ .../ai/da/controller/LibraryController.java | 2 +- .../ai/da/mapper/ClassificationMapper.java | 15 ++ .../ClassificationRelLibraryMapper.java | 15 ++ .../entity/ClassificationRelLibrary.java | 37 ++++ .../ai/da/model/dto/ClassificationDTO.java | 21 +++ .../com/ai/da/model/vo/ClassificationVO.java | 16 ++ .../ai/da/service/ClassificationService.java | 30 ++++ .../impl/ClassificationServiceImpl.java | 163 ++++++++++++++++++ .../da/service/impl/LibraryServiceImpl.java | 2 +- .../resources/mapper/ClassificationMapper.xml | 18 ++ .../mapper/ClassificationRelLibraryMapper.xml | 17 ++ src/main/resources/messages_en.properties | 9 +- 13 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/ai/da/controller/ClassificationController.java create mode 100644 src/main/java/com/ai/da/mapper/ClassificationMapper.java create mode 100644 src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java create mode 100644 src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java create mode 100644 src/main/java/com/ai/da/model/dto/ClassificationDTO.java create mode 100644 src/main/java/com/ai/da/model/vo/ClassificationVO.java create mode 100644 src/main/java/com/ai/da/service/ClassificationService.java create mode 100644 src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java create mode 100644 src/main/resources/mapper/ClassificationMapper.xml create mode 100644 src/main/resources/mapper/ClassificationRelLibraryMapper.xml diff --git a/src/main/java/com/ai/da/controller/ClassificationController.java b/src/main/java/com/ai/da/controller/ClassificationController.java new file mode 100644 index 00000000..9e94b4b5 --- /dev/null +++ b/src/main/java/com/ai/da/controller/ClassificationController.java @@ -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 saveOrUpdate(@Valid @RequestBody ClassificationDTO classificationDTO) { + return Response.success(classificationService.saveOrUpdate(classificationDTO)); + } + + /** + * 删除 + */ + @PostMapping("/delete") + @ApiOperationSupport(order = 2) + @ApiOperation(value = "删除", notes = "传入ClassificationDTO") + public Response delete(@Valid @RequestBody ClassificationDTO classificationDTO) { + return Response.success(classificationService.delete(classificationDTO)); + } + + @PostMapping("/queryClassification") + @ApiOperationSupport(order = 3) + @ApiModelProperty(value = "查询", notes = "传入ClassificationDTO") + public Response> queryClassification(@Valid @RequestBody ClassificationDTO classificationDTO) { + return Response.success(classificationService.queryClassification(classificationDTO)); + } + +} diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java index ab5b8355..92ce3c16 100644 --- a/src/main/java/com/ai/da/controller/LibraryController.java +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -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); diff --git a/src/main/java/com/ai/da/mapper/ClassificationMapper.java b/src/main/java/com/ai/da/mapper/ClassificationMapper.java new file mode 100644 index 00000000..fdc13893 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/ClassificationMapper.java @@ -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 { + +} diff --git a/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java b/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java new file mode 100644 index 00000000..f9094830 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java @@ -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 { + +} diff --git a/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java b/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java new file mode 100644 index 00000000..c8449830 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java @@ -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; + +} diff --git a/src/main/java/com/ai/da/model/dto/ClassificationDTO.java b/src/main/java/com/ai/da/model/dto/ClassificationDTO.java new file mode 100644 index 00000000..edbe7f37 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/ClassificationDTO.java @@ -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 classificationIdList; + @ApiModelProperty("LibraryID") + private Long libraryId; + @ApiModelProperty("分类删除校验1:校验0:不校验") + private Integer deleteConfirm; +} diff --git a/src/main/java/com/ai/da/model/vo/ClassificationVO.java b/src/main/java/com/ai/da/model/vo/ClassificationVO.java new file mode 100644 index 00000000..88506041 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/ClassificationVO.java @@ -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 childList; + +} diff --git a/src/main/java/com/ai/da/service/ClassificationService.java b/src/main/java/com/ai/da/service/ClassificationService.java new file mode 100644 index 00000000..5eab2895 --- /dev/null +++ b/src/main/java/com/ai/da/service/ClassificationService.java @@ -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 queryClassification(ClassificationDTO classificationDTO); + + List getClassificationVOList(List classificationList); +} diff --git a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java new file mode 100644 index 00000000..ecf37cd2 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java @@ -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 qw = new QueryWrapper<>(); + qw.lambda().in(ClassificationRelLibrary::getClassificationId, classificationDTO.getClassificationIdList()); + List 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 queryClassification(ClassificationDTO classificationDTO) { + AuthPrincipalVo userHolder = UserContext.getUserHolder(); + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Classification::getUserId, userHolder.getId()); + qw.lambda().eq(Classification::getType, classificationDTO.getType()); + qw.lambda().eq(Classification::getParentId, 0L); + List classificationList = classificationMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(classificationList)) { + // 获取结果集 + return getClassificationVOList(classificationList); + } + return new ArrayList<>(); + } + + @Override + public List getClassificationVOList(List classificationList) { + List classificationVOS = CopyUtil.copyList(classificationList, ClassificationVO.class); + for (ClassificationVO classificationVO : classificationVOS) { + // 递归 + List childList = recursionClassificationVO(classificationVO); + if (CollectionUtil.isNotEmpty(childList)) { + classificationVO.setChildList(childList); + } + } + return classificationVOS; + } + + private List recursionClassificationVO(ClassificationVO classificationVO) { + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Classification::getParentId, classificationVO.getId()); + List classificationChildList = classificationMapper.selectList(qw); + if (CollectionUtil.isEmpty(classificationChildList)) { + return new ArrayList<>(); + } + List classificationChildVOList = CopyUtil.copyList(classificationChildList, ClassificationVO.class); + for (ClassificationVO classificationChildVO : classificationChildVOList) { + // 递归 + List 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 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 classificationList = classificationMapper.selectList(qw); + if (CollectionUtil.isNotEmpty(classificationList)) { + throw new BusinessException("classificationName.already.exists"); + } + } +} diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index fe535615..3974417b 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -281,7 +281,7 @@ public class LibraryServiceImpl extends ServiceImpl 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 { diff --git a/src/main/resources/mapper/ClassificationMapper.xml b/src/main/resources/mapper/ClassificationMapper.xml new file mode 100644 index 00000000..20ea5ce1 --- /dev/null +++ b/src/main/resources/mapper/ClassificationMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/ClassificationRelLibraryMapper.xml b/src/main/resources/mapper/ClassificationRelLibraryMapper.xml new file mode 100644 index 00000000..3db8b654 --- /dev/null +++ b/src/main/resources/mapper/ClassificationRelLibraryMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index cf9c42bf..dbab072d 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -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! \ No newline at end of file +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! \ No newline at end of file