From 60f4dec2af3d208a2b67d700478698bf1668b790 Mon Sep 17 00:00:00 2001 From: username <1532322479@qq.com> Date: Sun, 20 Apr 2025 21:01:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1=E4=B8=8E?= =?UTF-8?q?=E5=9B=BE=E5=BA=93=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CtGalleryImagesController.java | 241 ++++++++++++++++- .../CtImagesFeedbackRefController.java | 166 ++++++++++++ .../ct/controller/CtTaskBranchController.java | 17 ++ .../controller/CtTaskFeedbackController.java | 93 ++++++- .../ct/controller/CtTaskInfoController.java | 28 +- .../controller/CtTaskTemplateController.java | 11 + .../com/bs/ct/domain/CtGalleryImages.java | 13 + .../com/bs/ct/domain/CtGalleryImagesTag.java | 30 +++ .../com/bs/ct/domain/CtImagesFeedbackRef.java | 42 +++ .../java/com/bs/ct/domain/CtTaskBranch.java | 3 + .../java/com/bs/ct/domain/CtTaskFeedback.java | 12 + .../java/com/bs/ct/domain/CtTaskInfo.java | 5 + .../main/java/com/bs/ct/domain/CtTaskTag.java | 6 +- .../ct/mapper/CtImagesFeedbackRefMapper.java | 14 + .../service/ICtImagesFeedbackRefService.java | 14 + .../impl/CtImagesFeedbackRefServiceImpl.java | 19 ++ .../com/bs/ct/utils/OperateImageUtils.java | 252 ++++++++++++++++++ .../controller/common/CommonController.java | 12 +- .../images/CtImagesFeedbackRefMapper.xml | 7 + 19 files changed, 962 insertions(+), 23 deletions(-) create mode 100644 bs-admin/src/main/java/com/bs/ct/controller/CtImagesFeedbackRefController.java create mode 100644 bs-admin/src/main/java/com/bs/ct/domain/CtImagesFeedbackRef.java create mode 100644 bs-admin/src/main/java/com/bs/ct/mapper/CtImagesFeedbackRefMapper.java create mode 100644 bs-admin/src/main/java/com/bs/ct/service/ICtImagesFeedbackRefService.java create mode 100644 bs-admin/src/main/java/com/bs/ct/service/impl/CtImagesFeedbackRefServiceImpl.java create mode 100644 bs-admin/src/main/java/com/bs/ct/utils/OperateImageUtils.java create mode 100644 bs-admin/src/main/resources/mapper/images/CtImagesFeedbackRefMapper.xml diff --git a/bs-admin/src/main/java/com/bs/ct/controller/CtGalleryImagesController.java b/bs-admin/src/main/java/com/bs/ct/controller/CtGalleryImagesController.java index 41cf0be..766faa7 100644 --- a/bs-admin/src/main/java/com/bs/ct/controller/CtGalleryImagesController.java +++ b/bs-admin/src/main/java/com/bs/ct/controller/CtGalleryImagesController.java @@ -1,20 +1,31 @@ package com.bs.ct.controller; +import java.awt.image.BufferedImage; +import java.io.IOException; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import com.bs.cm.domain.CmAttach; import com.bs.cm.service.ICmAttachService; import com.bs.common.config.BsConfig; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.model.LoginUser; import com.bs.common.utils.file.FileUploadUtils; import com.bs.common.utils.file.FileUtils; -import com.bs.ct.domain.CtTaskFeedback; +import com.bs.ct.domain.*; +import com.bs.ct.service.*; +import com.bs.ct.utils.OperateImageUtils; +import com.bs.ct.utils.UUIDUtils; import com.bs.framework.config.ServerConfig; +import com.bs.system.service.ISysDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -33,8 +44,6 @@ import com.bs.common.enums.BusinessType; import com.bs.common.utils.poi.ExcelUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import cn.hutool.core.lang.Validator; -import com.bs.ct.domain.CtGalleryImages; -import com.bs.ct.service.ICtGalleryImagesService; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; @@ -49,12 +58,28 @@ import javax.annotation.Resource; @RestController @RequestMapping("/gallery/images") public class CtGalleryImagesController extends BaseController { + @Value("${bs.profile}") + private String profile; @Resource private ICtGalleryImagesService ctGalleryImagesService; @Autowired private ServerConfig serverConfig; @Autowired private ICmAttachService cmAttachService; + @Resource + private ICtTaskTagService ctTaskTagService; + @Resource + private ICtGalleryImagesTagService ctGalleryImagesTagService; + @Resource + private ICtTagService ctTagService; + @Autowired + private ISysDeptService deptService; + @Resource + private ICtTaskBranchService ctTaskBranchService; + @Resource + private ICtTaskInfoService ctTaskInfoService; + @Resource + private ICtImagesFeedbackRefService ctImagesFeedbackRefService; /** * 分页查询图库图片列表 */ @@ -71,6 +96,9 @@ public class CtGalleryImagesController extends BaseController { private void setFile(List list) { for (CtGalleryImages ctGalleryImages : list) { + List galleryImagesTags = ctGalleryImagesTagService.list(new LambdaQueryWrapper() + .eq(CtGalleryImagesTag::getImageId, ctGalleryImages.getId())); + ctGalleryImages.setImagesTags(galleryImagesTags); List cmAttachList = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId,ctGalleryImages.getFileId())); ctGalleryImages.setFile(cmAttachList); } @@ -84,16 +112,104 @@ public class CtGalleryImagesController extends BaseController { public AjaxResult list(CtGalleryImages ctGalleryImages) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); condition(queryWrapper,ctGalleryImages); + if (null != ctGalleryImages.getFeedbackId()) { + List ctImagesFeedbackRefs = ctImagesFeedbackRefService.list(new LambdaQueryWrapper() + .eq(CtImagesFeedbackRef::getFeedbackId, ctGalleryImages.getFeedbackId())); + List imageIds = ctImagesFeedbackRefs.stream() + .map(CtImagesFeedbackRef::getImageId) + .collect(Collectors.toList()); + if (null != imageIds && imageIds.size() > 0) { + List galleryImages = ctGalleryImagesService.list(new LambdaQueryWrapper() + .in(CtGalleryImages::getId, imageIds)); + return success(galleryImages); + } else { + return null; + } + } List list = ctGalleryImagesService.list(queryWrapper); return success(list); } + /** + * 生成图片 + */ + @ApiOperation("生成图片") + @Log(title = "生成图片", businessType = BusinessType.UPDATE) + @PostMapping("/generateImage") + public AjaxResult generateImage(@RequestBody CtGalleryImages ctGalleryImages) { + List imagesIds = ctGalleryImages.getIds(); + String imageType = ctGalleryImages.getImageType(); // 假设 CtGalleryImages 有一个 imageType 字段用于指定生成图片的类型 + List list = ctGalleryImagesService.list(new LambdaQueryWrapper() + .in(CtGalleryImages::getId, imagesIds)); + BufferedImage[] imgs = new BufferedImage[list.size()]; + int index = 0; + for (CtGalleryImages galleryImages : list) { + String attachUrl = galleryImages.getImagePath().replace("/profile", ""); + String filePath = profile + attachUrl; + try { + imgs[index++] = OperateImageUtils.getBufferedImage(filePath); + } catch (IOException e) { + e.printStackTrace(); + return AjaxResult.error("读取图片失败: " + filePath); + } + } + BufferedImage destImg = null; + String outputFileName = null; + try { + switch (imageType) { + case "nineGrid": + if (imgs.length >= 9) { + destImg = OperateImageUtils.mergeImageToGrid(3, 3, imgs); + outputFileName = UUIDUtils.generatorUUID() + "nineGrid.jpg"; + } else { + return AjaxResult.error("生成九宫格图片需要至少9张图片"); + } + break; + case "fourGrid": + if (imgs.length >= 4) { + BufferedImage[] fourImgs = new BufferedImage[4]; + System.arraycopy(imgs, 0, fourImgs, 0, 4); + destImg = OperateImageUtils.mergeImageToGrid(2, 2, fourImgs); + outputFileName = UUIDUtils.generatorUUID() + "fourGrid.jpg"; + } else { + return AjaxResult.error("生成四宫格图片需要至少4张图片"); + } + break; + case "horizontalMerge": + if (imgs.length >= 2) { + destImg = OperateImageUtils.mergeImage(true, imgs); + outputFileName = UUIDUtils.generatorUUID() + "horizontalMerge.jpg"; + } else { + return AjaxResult.error("水平合并需要至少2张图片"); + } + break; + case "verticalMerge": + if (imgs.length >= 2) { + destImg = OperateImageUtils.mergeImage(false, imgs); + outputFileName = UUIDUtils.generatorUUID() + "verticalMerge.jpg"; + } else { + return AjaxResult.error("垂直合并需要至少2张图片"); + } + break; + default: + return AjaxResult.error("不支持的图片类型: " + imageType); + } + } catch (IOException e) { + e.printStackTrace(); + } + if (destImg != null) { + OperateImageUtils.saveImage(destImg, profile , outputFileName, "jpg"); + return AjaxResult.success("图片生成成功"); + } + return AjaxResult.error("图片生成失败"); + } + // /** * 通用上传请求(单个) */ @PostMapping("/upload") - public AjaxResult uploadFile(MultipartFile file, String fileId, Long cataId, String imageTitle, Date photoTime,Date uploadTime, - String isOpen,String keyWords,String remarks + public AjaxResult uploadFile(MultipartFile file, String fileId, Long cataId, String imageTitle, Date photoTime, Date uploadTime, + String isOpen, String keyWords, String remarks, Long tagId, ArrayList ctTags, Long feedbackId ) throws Exception { try @@ -130,11 +246,41 @@ public class CtGalleryImagesController extends BaseController { Long id = cmAttach.getId(); AjaxResult ajax = AjaxResult.success(); ajax.put("cmAttach", cmAttach); + CtTaskTag taskTag = null; + if (null != tagId) { + taskTag = ctTaskTagService.getById(tagId); + ctGalleryImages.setCataId(taskTag.getSaveDir()); + } ctGalleryImages.setImageName(originalFilename); ctGalleryImages.setImagePath(fileName); ctGalleryImages.setImageSize(BigDecimal.valueOf(file.getSize())); ctGalleryImages.setFileId(newId); boolean saveImage = ctGalleryImagesService.save(ctGalleryImages); + if (saveImage) { + ajax.put("imageId",ctGalleryImages.getId()); + if (null != taskTag) { + CtGalleryImagesTag ctGalleryImagesTag = new CtGalleryImagesTag(); + ctGalleryImagesTag.setImageId(ctGalleryImages.getId()); + ctGalleryImagesTag.setTagType(taskTag.getTagType()); + ctGalleryImagesTag.setTagName(taskTag.getTagName()); + ctGalleryImagesTagService.save(ctGalleryImagesTag); + } + if (null != ctTags) { + for (Long ctTagId : ctTags) { + CtTag ctTag = ctTagService.getById(ctTagId); + CtGalleryImagesTag ctGalleryImagesTag = new CtGalleryImagesTag(); + ctGalleryImagesTag.setImageId(ctGalleryImages.getId()); + ctGalleryImagesTag.setTagType(ctTag.getTagType()); + ctGalleryImagesTag.setTagName(ctTag.getTagName()); + ctGalleryImagesTag.setIsPhoto(ctTag.getIsPhoto()); + ctGalleryImagesTag.setTagDesc(ctTag.getTagDesc()); + ctGalleryImagesTag.setPhotoNum(ctTag.getPhotoNum()); + ctGalleryImagesTag.setSaveDir(ctTag.getSaveDir()); + ctGalleryImagesTag.setFileId(ctTag.getFileId()); + ctGalleryImagesTagService.save(ctGalleryImagesTag); + } + } + } return ajax; } return null; @@ -145,6 +291,91 @@ public class CtGalleryImagesController extends BaseController { } } + /** + * 修改图库图片 + */ + @ApiOperation("添加图片标签") + @Log(title = "添加图片标签", businessType = BusinessType.UPDATE) + @PostMapping("/saveByTag") + public AjaxResult saveByTag(@RequestBody CtGalleryImages ctGalleryImages) { + ctGalleryImages.getTaskTagId(); + CtTaskTag ctTaskTag = ctTaskTagService.getById(ctGalleryImages.getTaskTagId()); + List ids = ctGalleryImages.getIds(); + for (Long id : ids) { + CtGalleryImagesTag ctGalleryImagesTag = new CtGalleryImagesTag(); + ctGalleryImagesTag.setImageId(id); + ctGalleryImagesTag.setTagType(ctTaskTag.getTagType()); + ctGalleryImagesTag.setTagName(ctTaskTag.getTagName()); + List ctGalleryImagesTags = ctGalleryImagesTagService.list(new LambdaQueryWrapper() + .eq(CtGalleryImagesTag::getImageId, id) + .eq(CtGalleryImagesTag::getTagType, ctTaskTag.getTagType()) + .eq(CtGalleryImagesTag::getTagName, ctTaskTag.getTagName())); + if (null == ctGalleryImagesTags || ctGalleryImagesTags.size() == 0) { + ctGalleryImagesTagService.save(ctGalleryImagesTag); + } + } + return toAjax(true); + } + + /** + * 修改图库图片 + */ + @ApiOperation("生成任务") + @Log(title = "生成任务", businessType = BusinessType.UPDATE) + @PostMapping("/generateTasks") + public AjaxResult generateTasks(@RequestBody CtGalleryImages ctGalleryImages) { + List imagesIds = ctGalleryImages.getIds(); + List list = ctGalleryImagesTagService.list(new LambdaQueryWrapper() + .in(CtGalleryImagesTag::getImageId, imagesIds)); + CtTaskInfo ctTaskInfo = new CtTaskInfo(); + Long newId = System.currentTimeMillis() + new Random().nextInt(1000); + ctTaskInfo.setId(newId); + List branchList = ctTaskInfo.getBranchList(); + for (CtTaskBranch sdTaskOtherBranch : branchList) { + sdTaskOtherBranch.setTaskId(ctTaskInfo.getId()); + sdTaskOtherBranch.setType("机构"); + ctTaskBranchService.saveOrUpdate(sdTaskOtherBranch); + } + //设置发起单位与部门 + LoginUser loginUser = getLoginUser(); + Long deptId = loginUser.getDeptId(); + if (null != deptId) { + ctTaskInfo.setDeptId(deptId); + SysDept sysDept = deptService.selectDeptById(deptId); + Long parentId = sysDept.getParentId(); + SysDept parentDept = deptService.selectDeptById(parentId); + if (null != parentDept) { + ctTaskInfo.setBranchCode(String.valueOf(parentDept.getDeptId())); + ctTaskInfo.setBranchName(parentDept.getDeptName()); + } + } + if ("1".equals(ctTaskInfo.getStatus())) { + ctTaskInfo.setTaskDate(new Date()); + } + boolean save = ctTaskInfoService.save(ctTaskInfo); + if (save) { + List tasgs = ctTaskInfo.getTags(); + if (null != tasgs && tasgs.size() > 0) { + if (null != list && list.size() > 0) { + for (CtGalleryImagesTag image : list) { + CtTaskTag taskTag = new CtTaskTag(); + taskTag.setTaskId(ctTaskInfo.getId()); + taskTag.setTagName(image.getTagName()); + taskTag.setTagType(image.getTagType()); + taskTag.setIsPhoto(image.getIsPhoto()); + taskTag.setTagDesc(image.getTagDesc()); + taskTag.setPhotoNum(image.getPhotoNum()); + taskTag.setSaveDir(image.getSaveDir()); + taskTag.setFileId(image.getFileId()); + ctTaskTagService.save(taskTag); + } + } + } + } + return success(ctTaskInfo); + } + + /** * 导出图库图片列表 diff --git a/bs-admin/src/main/java/com/bs/ct/controller/CtImagesFeedbackRefController.java b/bs-admin/src/main/java/com/bs/ct/controller/CtImagesFeedbackRefController.java new file mode 100644 index 0000000..818ae25 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/ct/controller/CtImagesFeedbackRefController.java @@ -0,0 +1,166 @@ +package com.bs.ct.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.bs.ct.service.ICtGalleryImagesService; +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.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.commons.lang3.StringUtils; +import com.bs.ct.domain.CtImagesFeedbackRef; +import com.bs.ct.service.ICtImagesFeedbackRefService; +import javax.annotation.Resource; + +/** + * 图片任务反馈关联Controller + * + * @author bs + * @date 2025-04-20 + */ +@Api(tags = "图片任务反馈关联") +@RestController +@RequestMapping("/images/ref") +public class CtImagesFeedbackRefController extends BaseController { + @Resource + private ICtImagesFeedbackRefService ctImagesFeedbackRefService; + @Resource + private ICtGalleryImagesService ctGalleryImagesService; + /** + * 分页查询图片任务反馈关联列表 + */ + @ApiOperation("分页查询图片任务反馈关联列表") + @GetMapping("/pageList") + public TableDataInfo pageList(CtImagesFeedbackRef ctImagesFeedbackRef) { + startPage(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,ctImagesFeedbackRef); + List list = ctImagesFeedbackRefService.list(queryWrapper); + return getDataTable(list); + } + + /** + * 查询图片任务反馈关联列表 + */ + @ApiOperation("查询图片任务反馈关联列表") + @GetMapping("/list") + public AjaxResult list(CtImagesFeedbackRef ctImagesFeedbackRef) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,ctImagesFeedbackRef); + List list = ctImagesFeedbackRefService.list(queryWrapper); + return success(list); + } + + /** + * 导出图片任务反馈关联列表 + */ + @ApiOperation("导出图片任务反馈关联列表") + @Log(title = "图片任务反馈关联导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, CtImagesFeedbackRef ctImagesFeedbackRef) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,ctImagesFeedbackRef); + List list = ctImagesFeedbackRefService.list(queryWrapper); + ExcelUtil util = new ExcelUtil(CtImagesFeedbackRef. class); + util.exportExcel(response, list, "图片任务反馈关联数据"); + } + + /** + * 获取图片任务反馈关联详细信息 + */ + @ApiOperation("获取图片任务反馈关联详细信息") + @GetMapping(value = "/{imageId}") + public AjaxResult getInfo(@PathVariable("imageId") Long imageId) { + return success(ctImagesFeedbackRefService.getById(imageId)); + } + + /** + * 新增图片任务反馈关联 + */ + @ApiOperation("新增图片任务反馈关联") + @Log(title = "图片任务反馈关联新增", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody CtImagesFeedbackRef ctImagesFeedbackRef) { + return toAjax(ctImagesFeedbackRefService.save(ctImagesFeedbackRef)); + } + + /** + * 修改图片任务反馈关联 + */ + @ApiOperation("修改图片任务反馈关联") + @Log(title = "图片任务反馈关联修改", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody CtImagesFeedbackRef ctImagesFeedbackRef) { + return toAjax(ctImagesFeedbackRefService.updateById(ctImagesFeedbackRef)); + } + + /** + * 删除图片任务反馈关联 + */ + @ApiOperation("删除图片任务反馈关联") + @Log(title = "图片任务反馈关联删除", businessType = BusinessType.DELETE) + @DeleteMapping("/{imageIds}") + public AjaxResult remove(@PathVariable List imageIds) { + return toAjax(ctImagesFeedbackRefService.removeBatchByIds(imageIds)); + } + + /** + * 条件设置 + */ + private void condition (LambdaQueryWrapper queryWrapper,CtImagesFeedbackRef ctImagesFeedbackRef){ + + + //图片id + if(null != (ctImagesFeedbackRef.getImageId())){ + queryWrapper.eq(CtImagesFeedbackRef::getImageId,ctImagesFeedbackRef.getImageId()); + } + + //任务反馈id + if(null != (ctImagesFeedbackRef.getFeedbackId())){ + queryWrapper.eq(CtImagesFeedbackRef::getFeedbackId,ctImagesFeedbackRef.getFeedbackId()); + } + + //创建人 + if(null != (ctImagesFeedbackRef.getCreateBy())){ + queryWrapper.eq(CtImagesFeedbackRef::getCreateBy,ctImagesFeedbackRef.getCreateBy()); + } + + //创建时间 + if(null != (ctImagesFeedbackRef.getCreateTime())){ + queryWrapper.eq(CtImagesFeedbackRef::getCreateTime,ctImagesFeedbackRef.getCreateTime()); + } + + //修改人 + if(null != (ctImagesFeedbackRef.getUpdateBy())){ + queryWrapper.eq(CtImagesFeedbackRef::getUpdateBy,ctImagesFeedbackRef.getUpdateBy()); + } + + //修改时间 + if(null != (ctImagesFeedbackRef.getUpdateTime())){ + queryWrapper.eq(CtImagesFeedbackRef::getUpdateTime,ctImagesFeedbackRef.getUpdateTime()); + } + + //租户ID + if(StringUtils.isNotEmpty(ctImagesFeedbackRef.getTenantId())){ + queryWrapper.eq(CtImagesFeedbackRef::getTenantId,ctImagesFeedbackRef.getTenantId()); + } + + } + +} diff --git a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskBranchController.java b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskBranchController.java index fcb0c16..4cfdf79 100644 --- a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskBranchController.java +++ b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskBranchController.java @@ -15,8 +15,10 @@ import com.bs.common.core.domain.entity.SysUser; import com.bs.common.exception.UtilException; import com.bs.ct.domain.CtTaskFeedback; import com.bs.ct.domain.CtTaskInfo; +import com.bs.ct.domain.CtTaskTag; import com.bs.ct.service.ICtTaskFeedbackService; import com.bs.ct.service.ICtTaskInfoService; +import com.bs.ct.service.ICtTaskTagService; import com.bs.ct.vo.CtTaskBranchVO; import com.bs.ct.vo.MyTaskVO; import com.bs.system.service.ISysDeptService; @@ -69,6 +71,8 @@ public class CtTaskBranchController extends BaseController { private ICtTaskFeedbackService ctTaskFeedbackService; @Resource private ICmAttachService cmAttachService; + @Resource + private ICtTaskTagService ctTaskTagService; /** * 分页查询任务机构信息列表 */ @@ -112,12 +116,14 @@ public class CtTaskBranchController extends BaseController { .skip(start) // 跳过前4条数据 .limit(pageSize) // 最多取6条数据 .collect(Collectors.toList()); + setTag(result); TableDataInfo data = getDataTable(result); data.setTotal(ctTaskBranches.size()); return data; } + private List filterCtTaskBranchList(List list, CtTaskBranch filterParams) { List filteredList = new ArrayList<>(list); if (filterParams.getTaskType() != null && !filterParams.getTaskType().isEmpty()) { @@ -215,11 +221,20 @@ public class CtTaskBranchController extends BaseController { .skip(start) // 跳过前4条数据 .limit(pageSize) // 最多取6条数据 .collect(Collectors.toList()); + setTag(result); TableDataInfo data = getDataTable(result); data.setTotal(ctTaskBranches.size()); return data; } + private void setTag(List result) { + for (CtTaskBranch branch : result) { + Long taskId = branch.getTaskId(); + List ctTaskTags = ctTaskTagService.list(new LambdaQueryWrapper().eq(CtTaskTag::getTaskId, taskId)); + branch.setCtTaskTags(ctTaskTags); + } + } + /** * 导出任务交办列表 */ @@ -270,6 +285,8 @@ public class CtTaskBranchController extends BaseController { taskOtherBranch.setTaskDate(byId.getTaskDate()); taskOtherBranch.setSdTaskOther(byId); } + + List feedbackListByCreateTime = ctTaskFeedbackService.list(new LambdaQueryWrapper() .eq(CtTaskFeedback::getTaskBranchId, taskOtherBranch.getId()) .ne(CtTaskFeedback::getStatus, 0) diff --git a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskFeedbackController.java b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskFeedbackController.java index 8c4d6fe..55a4dcb 100644 --- a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskFeedbackController.java +++ b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskFeedbackController.java @@ -1,15 +1,14 @@ package com.bs.ct.controller; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; +import java.util.*; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; import com.bs.cm.domain.CmAttach; import com.bs.cm.service.ICmAttachService; import com.bs.common.core.domain.entity.SysUser; -import com.bs.ct.domain.CtTaskInfo; -import com.bs.ct.service.ICtTaskInfoService; +import com.bs.ct.domain.*; +import com.bs.ct.service.*; import com.bs.system.service.ISysUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -31,8 +30,7 @@ import com.bs.common.enums.BusinessType; import com.bs.common.utils.poi.ExcelUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import cn.hutool.core.lang.Validator; -import com.bs.ct.domain.CtTaskFeedback; -import com.bs.ct.service.ICtTaskFeedbackService; + import javax.annotation.Resource; /** @@ -53,6 +51,12 @@ public class CtTaskFeedbackController extends BaseController { private ISysUserService userService; @Resource private ICmAttachService cmAttachService; + @Resource + private ICtTaskTagService ctTaskTagService; + @Resource + private ICtImagesFeedbackRefService ctImagesFeedbackRefService; + @Resource + private ICtGalleryImagesService ctGalleryImagesService; /** * 分页查询任务反馈列表 */ @@ -68,8 +72,20 @@ public class CtTaskFeedbackController extends BaseController { private void setFile(List list) { for (CtTaskFeedback ctFeedback : list) { - List cmAttachList = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId,ctFeedback.getFileId())); - ctFeedback.setFile(cmAttachList); + List ctImagesFeedbackRefs = ctImagesFeedbackRefService.list(new LambdaQueryWrapper() + .eq(CtImagesFeedbackRef::getFeedbackId, ctFeedback.getId())); + if (null != ctImagesFeedbackRefs && ctImagesFeedbackRefs.size() > 0) { + List imageIds = ctImagesFeedbackRefs.stream() + .map(CtImagesFeedbackRef::getImageId) // 提取 imageId + .collect(Collectors.toList()); + List galleryImages = ctGalleryImagesService.list(new LambdaQueryWrapper() + .in(CtGalleryImages::getId, imageIds)); + List fileIds = galleryImages.stream() + .map(CtGalleryImages::getFileId) + .collect(Collectors.toList()); + List cmAttachList = cmAttachService.list(new LambdaQueryWrapper().in(CmAttach::getFileId,fileIds)); + ctFeedback.setFile(cmAttachList); + } } } @@ -80,12 +96,45 @@ public class CtTaskFeedbackController extends BaseController { @GetMapping("/list") public AjaxResult list(CtTaskFeedback ctTaskFeedback) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); - condition(queryWrapper,ctTaskFeedback); + if (-1 == ctTaskFeedback.getTaskTagId()) { + queryWrapper.eq(CtTaskFeedback::getTaskId, ctTaskFeedback.getTaskId()) + .eq(CtTaskFeedback::getTaskBranchId,ctTaskFeedback.getTaskBranchId()) + .isNull(CtTaskFeedback::getTaskTagId); + } else { + condition(queryWrapper,ctTaskFeedback); + } List list = ctTaskFeedbackService.list(queryWrapper); setFile(list); return success(list); } + /** + * 通过标签查询任务反馈列表 + */ + @ApiOperation("通过标签查询任务反馈列表") + @GetMapping("/listByTag") + public AjaxResult listByTag(CtTaskFeedback ctTaskFeedback) { + Map map = new HashMap<>(); + List ctTaskTags = ctTaskTagService.list(new LambdaQueryWrapper().eq(CtTaskTag::getTaskId, ctTaskFeedback.getTaskId())); + List ctTaskFeedbacks = ctTaskFeedbackService.list(new LambdaQueryWrapper() + .eq(CtTaskFeedback::getTaskId, ctTaskFeedback.getTaskId()) + .eq(CtTaskFeedback::getTaskBranchId,ctTaskFeedback.getTaskBranchId()) + .isNull(CtTaskFeedback::getTaskTagId)); + for (CtTaskTag taskTag : ctTaskTags) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(CtTaskFeedback::getTaskTagId,taskTag.getId()); + queryWrapper.eq(CtTaskFeedback::getTaskBranchId,ctTaskFeedback.getTaskBranchId()); + List list = ctTaskFeedbackService.list(queryWrapper); + setFile(list); + taskTag.setCtTaskFeedbacks(list); + } + map.put("ctTaskTags",ctTaskTags); + map.put("ctTaskFeedbacks",ctTaskFeedbacks); + return success(map); + } + + + /** * 导出任务反馈列表 */ @@ -117,7 +166,23 @@ public class CtTaskFeedbackController extends BaseController { @PostMapping public AjaxResult add(@RequestBody CtTaskFeedback ctTaskFeedback) { updateFile(ctTaskFeedback); - return toAjax(ctTaskFeedbackService.save(ctTaskFeedback)); + boolean save = ctTaskFeedbackService.save(ctTaskFeedback); + if (save) { + saveRef(ctTaskFeedback); + } + return toAjax(true); + } + + private void saveRef(CtTaskFeedback ctTaskFeedback) { + List imageIds = ctTaskFeedback.getImageIds(); + if (null != imageIds && imageIds.size() > 0) { + for (Long imageId : imageIds) { + CtImagesFeedbackRef ctImagesFeedbackRef = new CtImagesFeedbackRef(); + ctImagesFeedbackRef.setFeedbackId(ctTaskFeedback.getId()); + ctImagesFeedbackRef.setImageId(imageId); + ctImagesFeedbackRefService.save(ctImagesFeedbackRef); + } + } } private void updateFile(CtTaskFeedback ctTaskFeedback) { @@ -140,6 +205,7 @@ public class CtTaskFeedbackController extends BaseController { @PutMapping public AjaxResult edit(@RequestBody CtTaskFeedback ctTaskFeedback) { updateFile(ctTaskFeedback); + saveRef(ctTaskFeedback); return toAjax(ctTaskFeedbackService.updateById(ctTaskFeedback)); } @@ -169,6 +235,11 @@ public class CtTaskFeedbackController extends BaseController { queryWrapper.eq(CtTaskFeedback::getTaskId,ctTaskFeedback.getTaskId()); } + //任务id + if(Validator.isNotEmpty(ctTaskFeedback.getTaskTagId())){ + queryWrapper.eq(CtTaskFeedback::getTaskTagId,ctTaskFeedback.getTaskTagId()); + } + //机构任务id if(Validator.isNotEmpty(ctTaskFeedback.getTaskBranchId())){ queryWrapper.eq(CtTaskFeedback::getTaskBranchId,ctTaskFeedback.getTaskBranchId()); diff --git a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskInfoController.java b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskInfoController.java index f74dc77..bd45da7 100644 --- a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskInfoController.java +++ b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskInfoController.java @@ -11,11 +11,10 @@ import com.bs.cm.domain.CmAttach; import com.bs.cm.service.ICmAttachService; import com.bs.common.core.domain.entity.SysDept; import com.bs.common.core.domain.model.LoginUser; -import com.bs.ct.domain.CtTaskBranch; -import com.bs.ct.domain.CtTaskFeedback; -import com.bs.ct.domain.CtTaskTemplate; +import com.bs.ct.domain.*; import com.bs.ct.service.ICtTaskBranchService; import com.bs.ct.service.ICtTaskFeedbackService; +import com.bs.ct.service.ICtTaskTagService; import com.bs.system.service.ISysDeptService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -37,7 +36,6 @@ import com.bs.common.enums.BusinessType; import com.bs.common.utils.poi.ExcelUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import cn.hutool.core.lang.Validator; -import com.bs.ct.domain.CtTaskInfo; import com.bs.ct.service.ICtTaskInfoService; import javax.annotation.Resource; @@ -61,6 +59,9 @@ public class CtTaskInfoController extends BaseController { private ICmAttachService cmAttachService; @Resource private ICtTaskFeedbackService ctTaskFeedbackService; + @Resource + private ICtTaskTagService ctTaskTagService; + /** * 分页查询任务信息列表 */ @@ -335,7 +336,17 @@ public class CtTaskInfoController extends BaseController { if ("1".equals(ctTaskInfo.getStatus())) { ctTaskInfo.setTaskDate(new Date()); } - return toAjax(ctTaskInfoService.save(ctTaskInfo)); + boolean save = ctTaskInfoService.save(ctTaskInfo); + if (save) { + List tasgs = ctTaskInfo.getTags(); + if (null != tasgs && tasgs.size() > 0) { + for (CtTaskTag taskTag : tasgs){ + taskTag.setTaskId(ctTaskInfo.getId()); + } + ctTaskTagService.saveBatch(tasgs); + } + } + return toAjax(true); } /** @@ -363,6 +374,13 @@ public class CtTaskInfoController extends BaseController { ctTaskInfo.setTaskDate(new Date()); ctTaskInfo.setTaskInitiator(loginUser.getUsername()); } + List tasgs = ctTaskInfo.getTags(); + if (null != tasgs && tasgs.size() > 0) { + for (CtTaskTag taskTag : tasgs) { + taskTag.setTaskId(ctTaskInfo.getId()); + } + ctTaskTagService.saveOrUpdateBatch(tasgs); + } return toAjax(ctTaskInfoService.updateById(ctTaskInfo)); } diff --git a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskTemplateController.java b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskTemplateController.java index 9aa3e54..e8b9bd3 100644 --- a/bs-admin/src/main/java/com/bs/ct/controller/CtTaskTemplateController.java +++ b/bs-admin/src/main/java/com/bs/ct/controller/CtTaskTemplateController.java @@ -89,6 +89,17 @@ public class CtTaskTemplateController extends BaseController { .skip(start) // 跳过前4条数据 .limit(pageSize) // 最多取6条数据 .collect(Collectors.toList()); + for (CtTaskTemplate taskTemplate : result) { + List listTag = ctTaskTemplateTagService.list(new LambdaQueryWrapper() + .eq(CtTaskTemplateTag::getTemplateId,taskTemplate.getId())); + for (CtTaskTemplateTag ctTaskTemplateTag : listTag) { + List cmAttaches = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId, ctTaskTemplateTag.getFileId())); + if (null != cmAttaches && cmAttaches.size() > 0) { + ctTaskTemplateTag.setFiles(cmAttaches); + } + } + taskTemplate.setTags(listTag); + } TableDataInfo data = getDataTable(result); data.setTotal(ctTaskTemplates.size()); return data; diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImages.java b/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImages.java index da4a6a7..75e2b69 100644 --- a/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImages.java +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImages.java @@ -109,5 +109,18 @@ public class CtGalleryImages extends BaseEntity{ @TableField(exist = false) private List file; + @TableField(exist = false) + private List ids; + + @TableField(exist = false) + private Long taskTagId; + + @TableField(exist = false) + private List imagesTags; + + @TableField(exist = false) + private Long feedbackId; + @TableField(exist = false) + private String imageType; } diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImagesTag.java b/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImagesTag.java index 980727e..5def268 100644 --- a/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImagesTag.java +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtGalleryImagesTag.java @@ -47,6 +47,36 @@ public class CtGalleryImagesTag extends BaseEntity{ @ApiModelProperty(value = "标签名称") private String tagName; + /** 标签说明 */ + + @Excel(name = "标签说明") + @ApiModelProperty(value = "标签说明") + private String tagDesc; + + /** 是否需要拍照 */ + + @Excel(name = "是否需要拍照") + @ApiModelProperty(value = "是否需要拍照") + private String isPhoto; + + /** 拍照数量要求 */ + + @Excel(name = "拍照数量要求") + @ApiModelProperty(value = "拍照数量要求") + private Long photoNum; + + /** 照片存放目录 */ + + @Excel(name = "照片存放目录") + @ApiModelProperty(value = "照片存放目录") + private Long saveDir; + + /** 附件id */ + + @Excel(name = "附件id") + @ApiModelProperty(value = "附件id") + private Long fileId; + /** 备注 */ @Excel(name = "备注") diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtImagesFeedbackRef.java b/bs-admin/src/main/java/com/bs/ct/domain/CtImagesFeedbackRef.java new file mode 100644 index 0000000..19a55e5 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtImagesFeedbackRef.java @@ -0,0 +1,42 @@ +package com.bs.ct.domain; + +import com.bs.common.annotation.Excel; +import com.bs.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +/** + * 图片任务反馈关联对象 ct_images_feedback_ref + * + * @author bs + * @date 2025-04-20 + */ +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("ct_images_feedback_ref") +@Data +public class CtImagesFeedbackRef extends BaseEntity{ + private static final long serialVersionUID = 1L; + + /** 图片id */ + + @Excel(name = "图片id") + @ApiModelProperty(value = "图片id") + private Long imageId; + + /** 任务反馈id */ + + @Excel(name = "任务反馈id") + @ApiModelProperty(value = "任务反馈id") + private Long feedbackId; + + + + +} diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskBranch.java b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskBranch.java index 494ebc2..55dfc89 100644 --- a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskBranch.java +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskBranch.java @@ -205,4 +205,7 @@ public class CtTaskBranch extends BaseEntity{ @TableField(exist = false) private Integer pageSize; + + @TableField(exist = false) + private List ctTaskTags; } diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskFeedback.java b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskFeedback.java index 286c744..6f7ff93 100644 --- a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskFeedback.java +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskFeedback.java @@ -40,12 +40,24 @@ public class CtTaskFeedback extends BaseEntity{ @ApiModelProperty(value = "任务id") private Long taskId; + /** 任务标签id */ + + @Excel(name = "任务标签id") + @ApiModelProperty(value = "任务标签id") + private Long taskTagId; + /** 任务id */ @Excel(name = "任务id") @TableField(exist = false) private List taskIds; + /** 图片id */ + + @Excel(name = "图片id") + @TableField(exist = false) + private List imageIds; + /** 机构任务id */ @Excel(name = "机构任务id") diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskInfo.java b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskInfo.java index 9591cc2..db639f5 100644 --- a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskInfo.java +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskInfo.java @@ -175,4 +175,9 @@ public class CtTaskInfo extends BaseEntity{ @TableField(exist = false) private CtTaskFeedback sdTaskOtherFeedbackByFeedback; + + @TableField(exist = false) + private List tags; + + } diff --git a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskTag.java b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskTag.java index 236311d..ba89a41 100644 --- a/bs-admin/src/main/java/com/bs/ct/domain/CtTaskTag.java +++ b/bs-admin/src/main/java/com/bs/ct/domain/CtTaskTag.java @@ -1,5 +1,6 @@ package com.bs.ct.domain; +import com.bs.cm.domain.CmAttach; import com.bs.common.annotation.Excel; import com.bs.common.core.domain.BaseEntity; import lombok.Data; @@ -11,6 +12,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; +import java.util.List; + /** * 任务标签对象 ct_task_tag * @@ -82,7 +85,8 @@ public class CtTaskTag extends BaseEntity{ @ApiModelProperty(value = "备注") private String remarks; - + @TableField(exist = false) + private List ctTaskFeedbacks; } diff --git a/bs-admin/src/main/java/com/bs/ct/mapper/CtImagesFeedbackRefMapper.java b/bs-admin/src/main/java/com/bs/ct/mapper/CtImagesFeedbackRefMapper.java new file mode 100644 index 0000000..30b8d48 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/ct/mapper/CtImagesFeedbackRefMapper.java @@ -0,0 +1,14 @@ +package com.bs.ct.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import com.bs.ct.domain.CtImagesFeedbackRef; + +/** + * 图片任务反馈关联Mapper接口 + * + * @author bs + * @date 2025-04-20 + */ +public interface CtImagesFeedbackRefMapper extends BaseMapperX { + +} diff --git a/bs-admin/src/main/java/com/bs/ct/service/ICtImagesFeedbackRefService.java b/bs-admin/src/main/java/com/bs/ct/service/ICtImagesFeedbackRefService.java new file mode 100644 index 0000000..86bd225 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/ct/service/ICtImagesFeedbackRefService.java @@ -0,0 +1,14 @@ +package com.bs.ct.service; + +import com.github.yulichang.base.MPJBaseService; +import com.bs.ct.domain.CtImagesFeedbackRef; + +/** + * 图片任务反馈关联Service接口 + * + * @author bs + * @date 2025-04-20 + */ +public interface ICtImagesFeedbackRefService extends MPJBaseService{ + +} diff --git a/bs-admin/src/main/java/com/bs/ct/service/impl/CtImagesFeedbackRefServiceImpl.java b/bs-admin/src/main/java/com/bs/ct/service/impl/CtImagesFeedbackRefServiceImpl.java new file mode 100644 index 0000000..4a9659c --- /dev/null +++ b/bs-admin/src/main/java/com/bs/ct/service/impl/CtImagesFeedbackRefServiceImpl.java @@ -0,0 +1,19 @@ +package com.bs.ct.service.impl; + +import com.bs.ct.mapper.CtImagesFeedbackRefMapper; +import com.bs.ct.domain.CtImagesFeedbackRef; +import com.bs.ct.service.ICtImagesFeedbackRefService; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * 图片任务反馈关联Service业务层处理 + * + * @author bs + * @date 2025-04-20 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class CtImagesFeedbackRefServiceImpl extends MPJBaseServiceImpl implements ICtImagesFeedbackRefService { + +} diff --git a/bs-admin/src/main/java/com/bs/ct/utils/OperateImageUtils.java b/bs-admin/src/main/java/com/bs/ct/utils/OperateImageUtils.java new file mode 100644 index 0000000..a87d336 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/ct/utils/OperateImageUtils.java @@ -0,0 +1,252 @@ +package com.bs.ct.utils; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +/** + * @author oucq + * @version Aug 3, 2016 6:13:55 PM + * + * 该类实现了图片的合并功能,可以选择水平合并或者垂直合并,还可以合并成九宫格、四宫格等类型。 + */ +public class OperateImageUtils { + + /** + * @param fileUrl + * 文件绝对路径或相对路径 + * @return 读取到的缓存图像 + * @throws IOException + * 路径错误或者不存在该文件时抛出IO异常 + */ + public static BufferedImage getBufferedImage(String fileUrl) throws IOException { + File f = new File(fileUrl); + return ImageIO.read(f); + } + + /** + * @param savedImg + * 待保存的图像 + * @param saveDir + * 保存的目录 + * @param fileName + * 保存的文件名,必须带后缀,比如 "beauty.jpg" + * @param format + * 文件格式:jpg、png或者bmp + * @return + */ + public static boolean saveImage(BufferedImage savedImg, String saveDir, String fileName, String format) { + boolean flag = false; + + // 先检查保存的图片格式是否正确 + String[] legalFormats = { "jpg", "JPG", "png", "PNG", "bmp", "BMP" }; + int i = 0; + for (i = 0; i < legalFormats.length; i++) { + if (format.equals(legalFormats[i])) { + break; + } + } + if (i == legalFormats.length) { // 图片格式不支持 + System.out.println("不是保存所支持的图片格式!"); + return false; + } + + // 再检查文件后缀和保存的格式是否一致 + String postfix = fileName.substring(fileName.lastIndexOf('.') + 1); + if (!postfix.equalsIgnoreCase(format)) { + System.out.println("待保存文件后缀和保存的格式不一致!"); + return false; + } + + String fileUrl = saveDir + fileName; + File file = new File(fileUrl); + try { + flag = ImageIO.write(savedImg, format, file); + } catch (IOException e) { + e.printStackTrace(); + } + + return flag; + } + + /** + * 待合并的两张图必须满足这样的前提,如果水平方向合并,则高度必须相等;如果是垂直方向合并,宽度必须相等。 + * mergeImage方法不做判断,自己判断。 + * + * @param img1 + * 待合并的第一张图 + * @param img2 + * 带合并的第二张图 + * @param isHorizontal + * 为true时表示水平方向合并,为false时表示垂直方向合并 + * @return 返回合并后的BufferedImage对象 + * @throws IOException + */ + public static BufferedImage mergeImage(boolean isHorizontal, BufferedImage img1, BufferedImage img2) + throws IOException { + int w1 = img1.getWidth(); + int h1 = img1.getHeight(); + int w2 = img2.getWidth(); + int h2 = img2.getHeight(); + + // 从图片中读取RGB + int[] ImageArrayOne = new int[w1 * h1]; + ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中 + int[] ImageArrayTwo = new int[w2 * h2]; + ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2); + + // 生成新图片 + BufferedImage DestImage = null; + if (isHorizontal) { // 水平方向合并 + DestImage = new BufferedImage(w1 + w2, h1, BufferedImage.TYPE_INT_RGB); + DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB + DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2); + } else { // 垂直方向合并 + DestImage = new BufferedImage(w1, h1 + h2, BufferedImage.TYPE_INT_RGB); + DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB + DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB + } + + return DestImage; + } + + /**合并任数量的图片成一张图片 + * @param isHorizontal true代表水平合并,fasle代表垂直合并 + * @param imgs 欲合并的图片数组 + * @return + * @throws IOException + */ + public static BufferedImage mergeImage(boolean isHorizontal, BufferedImage... imgs) throws IOException { + // 生成新图片 + BufferedImage DestImage = null; + + // 计算新图片的长和高 + int allw = 0, allh = 0, allwMax = 0, allhMax = 0; + for (BufferedImage img : imgs) { + allw += img.getWidth(); + allh += img.getHeight(); + if (img.getWidth() > allwMax) { + allwMax = img.getWidth(); + } + ; + if (img.getHeight() > allhMax) { + allhMax = img.getHeight(); + } + ; + } + // 创建新图片 + if (isHorizontal) { + DestImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB); + } else { + DestImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB); + } + + // 合并所有子图片到新图片 + int wx = 0, wy = 0; + for (int i = 0; i < imgs.length; i++) { + BufferedImage img = imgs[i]; + int w1 = img.getWidth(); + int h1 = img.getHeight(); + // 从图片中读取RGB + int[] ImageArrayOne = new int[w1 * h1]; + ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中 + if (isHorizontal) { // 水平方向合并 + DestImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB + } else { // 垂直方向合并 + DestImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB + } + wx += w1; + wy += h1; + } + return DestImage; + } + + /** + * 合并图片成指定行数和列数的网格 + * @param rows 行数 + * @param cols 列数 + * @param imgs 欲合并的图片数组 + * @return 合并后的BufferedImage对象 + * @throws IOException + */ + public static BufferedImage mergeImageToGrid(int rows, int cols, BufferedImage... imgs) throws IOException { + if (imgs.length < rows * cols) { + throw new IllegalArgumentException("图片数量不足,无法组成指定的网格"); + } + + // 计算新图片的宽度和高度 + int maxWidth = 0; + int maxHeight = 0; + for (BufferedImage img : imgs) { + maxWidth = Math.max(maxWidth, img.getWidth()); + maxHeight = Math.max(maxHeight, img.getHeight()); + } + int newWidth = maxWidth * cols; + int newHeight = maxHeight * rows; + + // 创建新图片 + BufferedImage destImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); + + // 合并图片到新图片 + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + int index = i * cols + j; + BufferedImage img = imgs[index]; + int x = j * maxWidth; + int y = i * maxHeight; + int[] imageArray = new int[img.getWidth() * img.getHeight()]; + imageArray = img.getRGB(0, 0, img.getWidth(), img.getHeight(), imageArray, 0, img.getWidth()); + destImage.setRGB(x, y, img.getWidth(), img.getHeight(), imageArray, 0, img.getWidth()); + } + } + + return destImage; + } + + public static void main(String[] args) { + try { + // 读取待合并的文件 + BufferedImage[] imgs = new BufferedImage[9]; + for (int i = 0; i < 9; i++) { + imgs[i] = getBufferedImage("D:\\edge下载\\下载\\1_2019年-2024年数据\\" + (i + 1) + ".jpg"); + } + + // 合并成九宫格 + BufferedImage destImg = mergeImageToGrid(3, 3, imgs); + saveImage(destImg, "D:\\edge下载\\下载\\1_2019年-2024年数据\\", "nineGrid.jpg", "jpg"); + System.out.println("九宫格合并完毕!"); + + // 合并成四宫格 + BufferedImage[] fourImgs = new BufferedImage[4]; + System.arraycopy(imgs, 0, fourImgs, 0, 4); + destImg = mergeImageToGrid(2, 2, fourImgs); + saveImage(destImg, "D:\\edge下载\\下载\\1_2019年-2024年数据\\", "fourGrid.jpg", "jpg"); + System.out.println("四宫格合并完毕!"); + + // 测试水平合并 + BufferedImage horizontalMergedImg = mergeImage(true, imgs[0], imgs[1]); + saveImage(horizontalMergedImg, "D:\\edge下载\\下载\\1_2019年-2024年数据\\", "horizontalMerge.jpg", "jpg"); + System.out.println("水平合并完毕!"); + + // 测试垂直合并 + BufferedImage verticalMergedImg = mergeImage(false, imgs[0], imgs[1]); + saveImage(verticalMergedImg, "D:\\edge下载\\下载\\1_2019年-2024年数据\\", "verticalMerge.jpg", "jpg"); + System.out.println("垂直合并完毕!"); + + // 测试多张图片水平合并 + BufferedImage multiHorizontalMergedImg = mergeImage(true, imgs[0], imgs[1], imgs[2]); + saveImage(multiHorizontalMergedImg, "D:\\edge下载\\下载\\1_2019年-2024年数据\\", "multiHorizontalMerge.jpg", "jpg"); + System.out.println("多张图片水平合并完毕!"); + + // 测试多张图片垂直合并 + BufferedImage multiVerticalMergedImg = mergeImage(false, imgs[0], imgs[1], imgs[2]); + saveImage(multiVerticalMergedImg, "D:\\edge下载\\下载\\1_2019年-2024年数据\\", "multiVerticalMerge.jpg", "jpg"); + System.out.println("多张图片垂直合并完毕!"); + + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java b/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java index 33cbffb..f0f6f90 100644 --- a/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java +++ b/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java @@ -274,14 +274,24 @@ public class CommonController } List list = cmAttachService.list(new LambdaQueryWrapper() .eq(CmAttach::getFileId, attachVo.getFileId())); + List ctGalleryImages = ctGalleryImagesService.list(new LambdaQueryWrapper() + .eq(CtGalleryImages::getFileId, attachVo.getFileId())); if (null != list && list.size() > 0) { for (CmAttach cmAttach : list) { cmAttach.setOldName(attachVo.getOldName()); - String attachUrlNew = newAttachUrl.replace("/uploadPath", "/profile"); + System.out.println(newAttachUrl); + String attachUrlNew = "/profile" + newAttachUrl; cmAttach.setAttachFileUrl(attachUrlNew); } cmAttachService.updateBatchById(list); } + if (null != ctGalleryImages && ctGalleryImages.size() > 0) { + for (CtGalleryImages ctGalleryImage : ctGalleryImages) { + String attachUrlNew = "/profile" + newAttachUrl; + ctGalleryImage.setImagePath(attachUrlNew); + } + ctGalleryImagesService.updateBatchById(ctGalleryImages); + } return AjaxResult.success(); } diff --git a/bs-admin/src/main/resources/mapper/images/CtImagesFeedbackRefMapper.xml b/bs-admin/src/main/resources/mapper/images/CtImagesFeedbackRefMapper.xml new file mode 100644 index 0000000..1075fd4 --- /dev/null +++ b/bs-admin/src/main/resources/mapper/images/CtImagesFeedbackRefMapper.xml @@ -0,0 +1,7 @@ + + + + +