diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java index bb1305f..1ee6797 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java @@ -37,6 +37,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; /** @@ -51,17 +53,6 @@ import java.util.*; public class BasicInformationController extends BaseController { @Value("${ruoyi.profile}") private String fileAddress; - // 1.审核通过之后再审核不要通知 - // 2.项目评价配置和详情那边同步显示 - // 3.换掉项目动态导出模板 - // 6.项目不填项目起止日期导入失败 - // 7.企业端统计项目总数有问题 - // 9.项目基础信息时间查询改了格式 - // 10.添加项目统计页面根据年份查找统计数据 - - // 4.项目汇编管理修改pdf - // 5.月度报告修改 - // 8.企业和政务登录 @Resource private SysDictDataMapper sysDictDataMapper; @@ -281,6 +272,7 @@ public class BasicInformationController extends BaseController { } + /** * 模板信息 */ @@ -341,6 +333,32 @@ public class BasicInformationController extends BaseController { // planInformationService.save(planInformation); // }); // return AjaxResult.success(); +// } + +// /** +// * 123 +// */ +// @ApiOperation("66666") +// @PostMapping("/a5") +// public void e1() { +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); +// // 待转换的字符串 +// String dateTimeStr = "2025-04-11 16:52:19"; +// // 转换为 LocalDateTime +// List list = basicInformationService.list(); +// List mx1 = mxService.list(); +// list.forEach(x-> { +// //添加五要素模型信息 +// List wys = new ArrayList<>(); +// mx1.forEach(y -> { +// WysmxInformation wysmxInformation = new WysmxInformation(); +// wysmxInformation.setYsmc(y.getName()); +// wysmxInformation.setZdname(y.getJtzb()); +// wysmxInformation.setXmId(x.getId()); +// wys.add(wysmxInformation); +// }); +// wysmxInformationService.saveBatch(wys); +// });W // } @ApiOperation(value = "导出单片材料") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslBqglController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslBqglController.java new file mode 100644 index 0000000..310eb36 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslBqglController.java @@ -0,0 +1,84 @@ +package com.ruoyi.gysl.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.gysl.entity.GyslBqgl; +import com.ruoyi.gysl.entity.request.ZwIdPageReq; +import com.ruoyi.gysl.service.GyslBqglService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.io.Serializable; +import java.util.List; + +/** + * 标签管理(GyslBqgl)表控制层 + * + * @author makejava + * @since 2025-04-15 09:18:33 + */ +@Api(tags = "标签管理") +@RestController +@RequestMapping("/gysl/bqgl") +public class GyslBqglController extends BaseController { + /** + * 服务对象 + */ + @Resource + private GyslBqglService gyslBqglService; + + + /** + * 根据项目id查询项目标签管理 + * + * @param zwIdPageReq 查询实体 + * @return 所有数据 + */ + @ApiOperation("根据项目id查询项目标签管理") + @GetMapping("/searchId") + public AjaxResult selectAll(@Valid ZwIdPageReq zwIdPageReq) { + return success(gyslBqglService.searchId(zwIdPageReq)); + } + /** + * 新增数据 + * + * @param gyslBqgl 实体对象 + * @return 新增结果 + */ + @PostMapping("/add") + @ApiOperation("新增数据") + public AjaxResult insert(@RequestBody GyslBqgl gyslBqgl) { + return success(gyslBqglService.save(gyslBqgl)); + } + + /** + * 修改数据 + * + * @param gyslBqgl 实体对象 + * @return 修改结果 + */ + @PostMapping("/edit") + @ApiOperation("修改数据") + public AjaxResult update(@RequestBody GyslBqgl gyslBqgl) { + return success(gyslBqglService.updateById(gyslBqgl)); + } + + /** + * 删除数据 + * + * @param idList 主键结合 + * @return 删除结果 + */ + @ApiOperation("删除数据") + @DeleteMapping("/delete") + public AjaxResult delete(@RequestParam("idList") List idList) { + return success(gyslBqglService.removeByIds(idList)); + } +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslProjectHandbookController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslProjectHandbookController.java index 54d9982..30aa4ae 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslProjectHandbookController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/GyslProjectHandbookController.java @@ -3,18 +3,22 @@ package com.ruoyi.gysl.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.layout.Document; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.gysl.entity.GyslProjectHandbook; import com.ruoyi.gysl.service.GyslProjectHandbookService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.File; import java.io.Serializable; -import java.util.List; import static com.ruoyi.common.core.domain.AjaxResult.success; @@ -28,12 +32,15 @@ import static com.ruoyi.common.core.domain.AjaxResult.success; @RestController @RequestMapping("/gysl/handbook") public class GyslProjectHandbookController { + + /** * 服务对象 */ @Resource private GyslProjectHandbookService gyslProjectHandbookService; + /** * 分页查询所有数据 * @@ -91,7 +98,7 @@ public class GyslProjectHandbookController { */ @ApiOperation("删除数据") @DeleteMapping("/delete") - public AjaxResult delete(@RequestParam("idList") List idList) { + public AjaxResult delete(@RequestParam("idList") java.util.List idList) { return success(gyslProjectHandbookService.removeByIds(idList)); } @@ -103,8 +110,8 @@ public class GyslProjectHandbookController { @PostMapping(value = "/export") public void export(HttpServletResponse response, @RequestParam Integer id) throws Exception { - - + gyslProjectHandbookService.generatePdfs(response,id); } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslBqgl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslBqgl.java new file mode 100644 index 0000000..e7121c2 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/GyslBqgl.java @@ -0,0 +1,45 @@ +package com.ruoyi.gysl.entity; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import java.io.Serializable; + +import com.ruoyi.gysl.entity.baseModel.BaseModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 标签管理(GyslBqgl)表实体类 + * + * @author makejava + * @since 2025-04-15 09:18:33 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("gysl_bqgl") +@ApiModel(value="标签管理") +public class GyslBqgl extends BaseModel { + + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + + @ApiModelProperty(value = "项目id") + private Long xmId; + + + @ApiModelProperty(value ="标签类型" ) + private Integer type; + + + @ApiModelProperty(value ="标签名称" ) + private String name; + +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BasicInformationResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BasicInformationResponse.java index f30b610..f5905d4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BasicInformationResponse.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BasicInformationResponse.java @@ -41,4 +41,7 @@ public class BasicInformationResponse { @ApiModelProperty("其他信息") private List projectOtherInfos; + + @ApiModelProperty("标签管理") + private List bqglResponses; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BqglResponse.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BqglResponse.java new file mode 100644 index 0000000..f72c726 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/entity/response/BqglResponse.java @@ -0,0 +1,23 @@ +package com.ruoyi.gysl.entity.response; + +import com.ruoyi.gysl.entity.GyslBqgl; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 标签管理返回体1 + * @author du + * @since 2025/4/15 9:47 + */ +@Data +public class BqglResponse { + + @ApiModelProperty(value ="标签类型" ) + private Integer type; + + + @ApiModelProperty(value ="标签名称" ) + private List list; +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java index 67a89fd..52e7be2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/BasicInformationMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.gysl.entity.*; import com.ruoyi.gysl.entity.request.BasicInformationPageReq; +import com.ruoyi.gysl.entity.response.BasicInformationResponse; import com.ruoyi.gysl.entity.response.ProjectExcelInfo; import org.apache.ibatis.annotations.Param; @@ -20,7 +21,7 @@ public interface BasicInformationMapper extends BaseMapper { /** * 导出项目数据 */ - List selectList(); + List selectProjectList(); /** * 分页查询所有数据 @@ -62,5 +63,12 @@ public interface BasicInformationMapper extends BaseMapper { List select3(@Param("id") Long id); QyrzInformation select4(@Param("id") Long id); List select5(@Param("id") Long id); + + /** + * 根据项目id集合查询项目 + */ + List idListToProject(@Param("idList") List idList); + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/GyslBqglMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/GyslBqglMapper.java new file mode 100644 index 0000000..e23083a --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/mapper/GyslBqglMapper.java @@ -0,0 +1,29 @@ +package com.ruoyi.gysl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.gysl.entity.*; +import com.ruoyi.gysl.entity.request.BasicInformationPageReq; +import com.ruoyi.gysl.entity.request.ZwIdPageReq; +import com.ruoyi.gysl.entity.response.ProjectExcelInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 标签管理(gysl_bqgl)表数据库访问层 + * + * @author makejava + * @since 2025-02-24 09:25:51 + */ +public interface GyslBqglMapper extends BaseMapper { + + /** + * 根据项目id查询项目标签管理 + * + * @param zwIdPageReq 查询实体 + * @return 所有数据 + */ + List searchId(@Param("req") ZwIdPageReq zwIdPageReq); +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslBqglService.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslBqglService.java new file mode 100644 index 0000000..839542b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslBqglService.java @@ -0,0 +1,26 @@ +package com.ruoyi.gysl.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.gysl.entity.GyslBqgl; +import com.ruoyi.gysl.entity.request.ZwIdPageReq; +import com.ruoyi.gysl.entity.response.BqglResponse; + +import java.util.List; + +/** + * 标签管理(GyslBqgl)表服务接口 + * + * @author makejava + * @since 2025-04-15 09:18:33 + */ +public interface GyslBqglService extends IService { + + /** + * 根据项目id查询项目标签管理 + * + * @param zwIdPageReq 查询实体 + * @return 所有数据 + */ + List searchId(ZwIdPageReq zwIdPageReq); +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslProjectHandbookService.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslProjectHandbookService.java index 549433a..83f853c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslProjectHandbookService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/GyslProjectHandbookService.java @@ -1,7 +1,14 @@ package com.ruoyi.gysl.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.itextpdf.layout.Document; +import com.ruoyi.gysl.entity.BasicInformation; import com.ruoyi.gysl.entity.GyslProjectHandbook; +import com.ruoyi.gysl.entity.response.BasicInformationResponse; + +import javax.servlet.http.HttpServletResponse; +import java.io.FileNotFoundException; +import java.net.MalformedURLException; /** * 项目手册(GyslProjectHandbook)表服务接口 @@ -11,5 +18,29 @@ import com.ruoyi.gysl.entity.GyslProjectHandbook; */ public interface GyslProjectHandbookService extends IService { + + /** + * 生成pdf + */ + void generatePdfs(HttpServletResponse response,Integer id) throws FileNotFoundException, MalformedURLException; + + /** + * 封面页设计 + */ + void addCoverPage(Document document, GyslProjectHandbook gyslProjectHandbook) throws MalformedURLException; + + /** + * 目录页设计 + */ + void addTableOfContents(Document document, java.util.List basicInfoList); + + /** + * 内容页设计 + */ + void addProductPages(Document document, java.util.List basicInfoList) throws MalformedURLException; + + + } + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java index 33d8815..87633be 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java @@ -111,6 +111,9 @@ public class BasicInformationServiceImpl extends ServiceImpl selectList() { - return baseMapper.selectList(); + return baseMapper.selectProjectList(); } @@ -239,6 +242,8 @@ public class BasicInformationServiceImpl extends ServiceImpl sysDictData) { + public String getDictLabel(String dictType, String dictValue, List sysDictData) { List collect = sysDictData.stream().filter(x -> x.getDictType().equals(dictType) && x.getDictValue().equals(dictValue)) .collect(Collectors.toList()); - if (collect.isEmpty()){ + if (collect.isEmpty()) { return "/"; - }else { + } else { return collect.get(0).getDictLabel(); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslBqglServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslBqglServiceImpl.java new file mode 100644 index 0000000..5502643 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslBqglServiceImpl.java @@ -0,0 +1,64 @@ +package com.ruoyi.gysl.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.gysl.entity.GyslBqgl; +import com.ruoyi.gysl.entity.request.ZwIdPageReq; +import com.ruoyi.gysl.entity.response.BqglResponse; +import com.ruoyi.gysl.mapper.GyslBqglMapper; +import com.ruoyi.gysl.service.GyslBqglService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 标签管理(GyslBqgl)表服务实现类 + * + * @author makejava + * @since 2025-04-15 09:18:33 + */ +@Service("gyslBqglService") +public class GyslBqglServiceImpl extends ServiceImpl implements GyslBqglService { + + /** + * 根据项目id查询项目标签管理 + * + * @param zwIdPageReq 查询实体 + * @return 所有数据 + */ + @Override + public List searchId(ZwIdPageReq zwIdPageReq) { + List lists = baseMapper.searchId(zwIdPageReq); +// 按 type 分组,并转换为 BqglResponse(type 是 Integer,分组键类型需一致) + Map groupedMap = lists.stream() + .filter(e -> e.getType() != null) // 过滤无效分组键(type 为 null 的条目) + .collect(Collectors.groupingBy( + GyslBqgl::getType, + Collectors.collectingAndThen( + Collectors.toList(), + list -> { + BqglResponse data = new BqglResponse(); + data.setType(list.get(0).getType()); // 取第一个元素的 type(分组后 type 相同) + // 过滤并转换子项(仅保留 name 和 type 均非 null 的条目) + List itemList = list.stream() + .filter(e -> e.getName() != null && e.getType() != null) + .map(e -> { + GyslBqgl item = new GyslBqgl(); + item.setId(e.getId()); + item.setName(e.getName()); + item.setType(e.getType()); + return item; + }) + .collect(Collectors.toList()); + data.setList(itemList); + return data; + } + ) + )); + return groupedMap.values().stream() + .filter(response -> !response.getList().isEmpty()) + .collect(Collectors.toList()); + } +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java index 5d61590..d52f3ec 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/GyslProjectHandbookServiceImpl.java @@ -1,11 +1,36 @@ package com.ruoyi.gysl.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.itextpdf.io.image.ImageData; +import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.colors.ColorConstants; +import com.itextpdf.kernel.colors.DeviceRgb; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.*; +import com.itextpdf.layout.properties.AreaBreakType; +import com.itextpdf.layout.properties.HorizontalAlignment; +import com.itextpdf.layout.properties.TextAlignment; +import com.itextpdf.layout.properties.UnitValue; +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.gysl.entity.GyslProjectHandbook; +import com.ruoyi.gysl.entity.response.BasicInformationResponse; +import com.ruoyi.gysl.mapper.BasicInformationMapper; import com.ruoyi.gysl.mapper.ProjectHandBookMapper; import com.ruoyi.gysl.service.GyslProjectHandbookService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.FileNotFoundException; +import java.net.MalformedURLException; +import java.util.Arrays; + /** * 项目手册(GyslProjectHandbook)表服务实现类 * @@ -15,5 +40,167 @@ import org.springframework.stereotype.Service; @Service("gyslProjectHandbookService") public class GyslProjectHandbookServiceImpl extends ServiceImpl implements GyslProjectHandbookService { + @Resource + private BasicInformationMapper basicInformationMapper; + + + /** + * 生成pdf + */ + @Override + public void generatePdfs(HttpServletResponse response, Integer id) throws FileNotFoundException, MalformedURLException { + //获取当前手册信息 + GyslProjectHandbook byId = getById(id); + //获取手册对应项目信息 + java.util.List basicInfoList = basicInformationMapper.idListToProject + (Arrays.asList(byId.getXmId().split(","))); + // 设置响应头 + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "attachment; filename=\"product_catalog.pdf\""); + try ( + // 直接绑定到 response 的输出流(不再生成本地文件) + PdfDocument pdf = new PdfDocument(new PdfWriter(response.getOutputStream())); + Document document = new Document(pdf) + ) { + addCoverPage(document, byId); + addTableOfContents(document, basicInfoList); + addProductPages(document, basicInfoList); + } catch (Exception e) { + response.reset(); // 清除已写入的内容 + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + throw new RuntimeException("PDF生成失败", e); + } + } + + /** + * 封面页设计 + */ + @Override + public void addCoverPage(Document document, GyslProjectHandbook gyslProjectHandbook) throws MalformedURLException { + //添加手册名称 + Paragraph coverTitle = new Paragraph(gyslProjectHandbook.getName()) + .setFontSize(30) + .setBold() + .setFontColor(ColorConstants.BLUE) + .setTextAlignment(TextAlignment.CENTER) + .setMarginTop(200); // 垂直居中 + document.add(coverTitle); + //添加副标题 + Paragraph ft = new Paragraph(gyslProjectHandbook.getSubtitle()) + .setFontSize(22) + .setFontColor(ColorConstants.BLUE) + .setTextAlignment(TextAlignment.RIGHT) + .setMarginTop(300); // 垂直居中 + document.add(ft); + //添加封面图片 + try { + if (!FileUtils.checkAllowDownload(gyslProjectHandbook.getCoverImg())) { + throw new ServiceException("资源文件({})非法! "); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(gyslProjectHandbook.getCoverImg(), Constants.RESOURCE_PREFIX); + ImageData imageData = ImageDataFactory.create(downloadPath); + Image image = new Image(imageData).setWidth(300).setHorizontalAlignment(HorizontalAlignment.CENTER); + document.add(image); + } catch (Exception e) { + throw new ServiceException("下载文件失败! "); + } + document.add(new AreaBreak()); // 强制分页 + } + + /** + * 目录页设计 + */ + @Override + public void addTableOfContents(Document document, java.util.List basicInfoList) { + Paragraph tocTitle = new Paragraph("目录") + .setFontSize(20) + .setBold() + .setTextAlignment(TextAlignment.CENTER); + document.add(tocTitle); + List tocList = new List() + .setSymbolIndent(20); + basicInfoList.forEach(x -> tocList.add(x.getBasicInformation().getName())); + document.add(tocList); + document.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); + } + + /** + * 内容页设计 + */ + @Override + public void addProductPages(Document document, java.util.List basicInfoList) throws MalformedURLException { + basicInfoList.forEach(x -> { + Paragraph chapter1 = new Paragraph(x.getBasicInformation().getName()) + .setFontSize(18) + .setBold(); + document.add(chapter1); + // 1. 添加园区信息表格 + Table parkTable = new Table(UnitValue.createPercentArray(new float[]{30, 70})) + .setWidth(UnitValue.createPercentValue(100)) + .setMarginBottom(20) + .setKeepTogether(true); // 保持表格在同一页; + // 园区信息标题(蓝色背景) + Cell cell = new Cell(1, 2) + .setBackgroundColor(new DeviceRgb(33, 150, 243)) + .add(new Paragraph("园区信息") + .setFontColor(DeviceRgb.WHITE) + .setFontSize(16) + .setBold()) + .setTextAlignment(TextAlignment.CENTER) + .setPadding(8); + parkTable.addCell(cell); + // 添加园区信息行 + parkTable.addCell(new Cell().add(new Paragraph("总投资额")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("项目标签")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("项目标签")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("2.87万m²")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("现状分类")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("毛坯")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("重点发展产业")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("70个")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("建设模式")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("宿舍78间")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("所属功能区")).setPadding(5)); + parkTable.addCell(new Cell().add(new Paragraph("A栋18900m²,B栋5500m²整租价格可议")).setPadding(5)); + document.add(parkTable); + // 2. 添加厂房信息表格 + Table factoryTable = new Table(UnitValue.createPercentArray(new float[]{25, 35, 35})) + .setWidth(UnitValue.createPercentValue(100)).setKeepTogether(true); // 保持表格在同一页; + // 厂房信息标题(蓝色背景) + Cell cell2 = new Cell(1, 2) + .setBackgroundColor(new DeviceRgb(33, 150, 243)) + .add(new Paragraph("厂房信息") + .setFontColor(DeviceRgb.WHITE) + .setFontSize(16) + .setBold()) + .setTextAlignment(TextAlignment.CENTER) + .setPadding(8); + factoryTable.addCell(cell2); + // 子标题(浅灰色背景) + Cell z1 = new Cell() + .setBackgroundColor(new DeviceRgb(245, 245, 245)) + .add(new Paragraph("A栋具体参数").setBold()) + .setTextAlignment(TextAlignment.CENTER) + .setPadding(5); + factoryTable.addCell(z1); + Cell z2 = new Cell() + .setBackgroundColor(new DeviceRgb(245, 245, 245)) + .add(new Paragraph("B栋具体参数").setBold()) + .setTextAlignment(TextAlignment.CENTER) + .setPadding(5); + factoryTable.addCell(z2); + // 添加参数行 + factoryTable.addCell(new Cell().add(new Paragraph("租金")).setPadding(5)); + factoryTable.addCell(new Cell().add(new Paragraph("首层35元/m²,2-3层30元/m²,4-9层25元/m²")).setPadding(5)); + factoryTable.addCell(new Cell().add(new Paragraph("首层32元/m²,2-3层26元/m²,4-5层25元/m²")).setPadding(5)); + factoryTable.addCell(new Cell().add(new Paragraph("租金")).setPadding(5)); + factoryTable.addCell(new Cell().add(new Paragraph("首层35元/m²,2-3层30元/m²,4-9层25元/m²")).setPadding(5)); + factoryTable.addCell(new Cell().add(new Paragraph("首层32元/m²,2-3层26元/m²,4-5层25元/m²")).setPadding(5)); + document.add(factoryTable); + }); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index 6f81204..9388209 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -78,6 +78,7 @@ public class CommonController /** * 通用上传请求(单个) */ + @ApiOperation("通用上传请求") @PostMapping("/upload") public AjaxResult uploadFile(MultipartFile file) throws Exception { @@ -142,6 +143,7 @@ public class CommonController * 本地资源通用下载 */ @GetMapping("/download/resource") + @ApiOperation("本地资源通用下载") public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception { diff --git a/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml b/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml index 667d9d6..c4e74d5 100644 --- a/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/BasicInformationMapper.xml @@ -289,7 +289,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - SELECT a.xmfrdwxz, a.nature, @@ -347,6 +347,59 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where a.longitude is not null and a.latitude is not null + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/mapper/GyslBqglMapper.xml b/ruoyi-admin/src/main/resources/mapper/GyslBqglMapper.xml new file mode 100644 index 0000000..9811cc6 --- /dev/null +++ b/ruoyi-admin/src/main/resources/mapper/GyslBqglMapper.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml b/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml index d29ce3e..f6f31ea 100644 --- a/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/QyStatsMapper.xml @@ -25,6 +25,43 @@ FROM gysl_basic_information a LEFT JOIN gysl_plan_information b ON a.id = b.xm_id where a.tyshxydm = #{userName} + + + SELECT COUNT(*) AS allProject, + ROUND(IFNULL(SUM(b.zjzmj), 0) / 10000, 1) AS allGrossArea, + IFNULL(SUM(CASE WHEN a.xzfl = 1 THEN 1 ELSE 0 END), 0) AS allBuilding1, + IFNULL(SUM(CASE WHEN a.xzfl = 2 THEN 1 ELSE 0 END), 0) AS allBuilding2, + IFNULL(SUM(CASE WHEN a.xzfl = 3 THEN 1 ELSE 0 END), 0) AS allBuilding3, + + IFNULL(SUM( + + + CASE WHEN LEFT(a.begain_time, 4) = #{years} THEN 1 ELSE 0 END + + + CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN 1 ELSE 0 END + + + ), 0) AS currentYearProject, + + ROUND(IFNULL(SUM( + CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) THEN b.zjzmj ELSE 0 END + ), 0)/10000,1) AS currentYearGrossArea, + + IFNULL(SUM( + CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) and a.xzfl = 1 THEN 1 ELSE 0 END + ), 0) AS currentBuilding1, + + IFNULL(SUM( + CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) and a.xzfl = 2 THEN 1 ELSE 0 END + ), 0) AS currentBuilding2, + + IFNULL(SUM( + CASE WHEN LEFT(a.begain_time, 4) = YEAR(NOW()) and a.xzfl = 3 THEN 1 ELSE 0 END + ), 0) AS currentBuilding3 + FROM gysl_basic_information a + LEFT JOIN gysl_plan_information b ON a.id = b.xm_id + where a.tyshxydm = #{userName}