Browse Source

jyj 2 优化提交

jyj_dev2
zhouhaibin 4 weeks ago
parent
commit
19ff64b1dd
  1. 6
      ruoyi-admin/src/main/resources/application.yml
  2. 5
      zaojiaManagement/zaojia-productManagement/pom.xml
  3. 19
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/controller/ContractualProductInfoController.java
  4. 39
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/controller/JyjContractualTaskBatchController.java
  5. 5
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualProductInfo.java
  6. 42
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualTaskExport.java
  7. 32
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualUnitStatistics.java
  8. 43
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ProductStatisticsData.java
  9. 2
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/bo/ContractualProductInfoBo.java
  10. 2
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/vo/ContractualProductInfoVo.java
  11. 16
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/mapper/ContractualProductInfoMapper.java
  12. 16
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/mapper/DocumentTasksMapper.java
  13. 6
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/IContractualProductInfoService.java
  14. 10
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/IJyjContractualTaskBatchService.java
  15. 113
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/ContractualProductInfoServiceImpl.java
  16. 1
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/DocumentTaskResultsServiceImpl.java
  17. 113
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/JyjContractualTaskBatchServiceImpl.java
  18. 98
      zaojiaManagement/zaojia-productManagement/src/main/resources/mapper/productManagement/ContractualProductInfoMapper.xml
  19. 32
      zaojiaManagement/zaojia-productManagement/src/main/resources/mapper/productManagement/DocumentTasksMapper.xml

6
ruoyi-admin/src/main/resources/application.yml

@ -71,14 +71,14 @@ spring:
basename: i18n/messages
profiles:
#@profiles.active@
active: dev
active: test
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 1000MB
max-file-size: 10000MB
# 设置总上传的文件大小
max-request-size: 1000MB
max-request-size: 10000MB
mvc:
# 设置静态资源路径 防止所有请求都去查静态资源
static-path-pattern: /static/**

5
zaojiaManagement/zaojia-productManagement/pom.xml

@ -131,6 +131,11 @@
<artifactId>zip4j</artifactId>
<version>2.11.5</version>
</dependency>
<dependency>
<groupId>org.ofdrw</groupId>
<artifactId>ofdrw-converter</artifactId>
<version>1.17.18</version>
</dependency>
</dependencies>

19
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/controller/ContractualProductInfoController.java

@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.productManagement.domain.ContractualUnitStatistics;
import org.dromara.productManagement.domain.ProductStatisticsData;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -102,4 +104,21 @@ public class ContractualProductInfoController extends BaseController {
@PathVariable Long[] ids) {
return toAjax(contractualProductInfoService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 统计合同产品信息
*
* @param ids 主键串
*/
@Log(title = "统计合同产品信息", businessType = BusinessType.DELETE)
@GetMapping("/statistics")
public R<ProductStatisticsData> getStatistics(@RequestParam(required = false) String unitName) {
ProductStatisticsData productStatisticsData =contractualProductInfoService.getStatistics(unitName);
return R.ok(productStatisticsData);
}
@Log(title = "统计合同产品信息", businessType = BusinessType.DELETE)
@GetMapping("/unitStatistics")
public TableDataInfo<ContractualUnitStatistics> getUnitStatistics(@RequestParam(required = false) String unitName,PageQuery pageQuery) {
TableDataInfo<ContractualUnitStatistics> contractualUnitStatisticsTableDataInfo =contractualProductInfoService.getUnitStatistics(unitName,pageQuery);
return contractualUnitStatisticsTableDataInfo;
}
}

39
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/controller/JyjContractualTaskBatchController.java

@ -56,16 +56,16 @@ public class JyjContractualTaskBatchController extends BaseController {
return jyjContractualTaskBatchService.queryPageList(bo, pageQuery);
}
/**
* 导出合同批处理记录列表
*/
@SaCheckPermission("productManagement:JyjcontractualTaskBatch:export")
@Log(title = "合同批处理记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(JyjContractualTaskBatchBo bo, HttpServletResponse response) {
List<JyjContractualTaskBatchVo> list = jyjContractualTaskBatchService.queryList(bo);
ExcelUtil.exportExcel(list, "合同批处理记录", JyjContractualTaskBatchVo.class, response);
}
// /**
// * 导出合同批处理记录列表
// */
// @SaCheckPermission("productManagement:JyjcontractualTaskBatch:export")
// @Log(title = "合同批处理记录", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(JyjContractualTaskBatchBo bo, HttpServletResponse response) {
// List<JyjContractualTaskBatchVo> list = jyjContractualTaskBatchService.queryList(bo);
// ExcelUtil.exportExcel(list, "合同批处理记录", JyjContractualTaskBatchVo.class, response);
// }
/**
* 获取合同批处理记录详细信息
@ -135,4 +135,23 @@ public class JyjContractualTaskBatchController extends BaseController {
public R<String> getContractulContent(@PathVariable Long id) {
return R.ok("ok",jyjContractualTaskBatchService.getContractulContent(id));
}
/**
* 导出特定ID的合同批处理结果
*
* @param id 主键
* @param batchName 批次名称
* @param resultType 结果类型
*/
@SaCheckPermission("productManagement:JyjcontractualTaskBatch:export")
@Log(title = "合同批处理结果", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void exportResult(
@RequestParam(required = false) String documentName,
@RequestParam(required = false) String batchName,
@RequestParam(required = false) String resultType,
@RequestParam(required = false) String problemPoint,
HttpServletResponse response) {
jyjContractualTaskBatchService.exportResultById(documentName, batchName, resultType, problemPoint, response);
}
}

5
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualProductInfo.java

@ -56,7 +56,7 @@ public class ContractualProductInfo extends TenantEntity {
* 价格单位
*/
private String priceUnit;
private String cpuModel;
/**
* 数量
*/
@ -77,6 +77,7 @@ public class ContractualProductInfo extends TenantEntity {
*/
@TableLogic
private String delFlag;
@TableField(exist = false)
public String unitName;
}

42
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualTaskExport.java

@ -0,0 +1,42 @@
package org.dromara.productManagement.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 合同审查结果导出对象
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public class ContractualTaskExport {
/**
* 甲方单位
*/
@ExcelProperty(value = "甲方单位")
private String partyAName;
/**
* 文件名称
*/
@ExcelProperty(value = "文件名称")
private String documentName;
@ExcelProperty(value = "批次名称")
private String batchName;
/**
* 问题点
*/
@ExcelProperty(value = "问题点")
private String issuePoint;
/**
* 问题详情
*/
@ExcelProperty(value = "问题详情")
private String issueDetail;
}

32
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualUnitStatistics.java

@ -0,0 +1,32 @@
package org.dromara.productManagement.domain;
import lombok.Data;
/**
* 合同产品单位统计对象
*
* @author ruoyi
*/
@Data
public class ContractualUnitStatistics {
private static final long serialVersionUID = 1L;
/** 单位名称 */
private String unitName;
/** 台式电脑数量 */
private Integer desktopCount;
/** 便携式电脑数量 */
private Integer laptopCount;
/** 服务器数量 */
private Integer serverCount;
/** 操作系统数量 */
private Integer osCount;
/** 数据库数量 */
private Integer dbCount;
}

43
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ProductStatisticsData.java

@ -0,0 +1,43 @@
package org.dromara.productManagement.domain;
import java.util.List;
import lombok.Data;
/**
* 合同产品统计数据
*/
@Data
public class ProductStatisticsData {
/** 设备统计列表 */
private List<EquipmentStat> equipmentStats;
/**
* 设备统计项 (内部类)
*/
@Data
public static class EquipmentStat {
/** 设备类型名称 */
private String name;
/** 设备总数量 */
private Long totalCount;
/** 品牌统计列表 */
private List<BrandStat> brands;
}
/**
* 品牌统计项 (内部类)
*/
@Data
public static class BrandStat {
/** 品牌名称 */
private String name;
/** 数量 */
private Long count;
}
}

2
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/bo/ContractualProductInfoBo.java

@ -49,6 +49,7 @@ public class ContractualProductInfoBo extends BaseEntity {
* 单价
*/
private Long unitPrice;
private String cpuModel;
/**
* 价格单位
@ -69,6 +70,7 @@ public class ContractualProductInfoBo extends BaseEntity {
* 类型
*/
private String type;
public String unitName;
}

2
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/vo/ContractualProductInfoVo.java

@ -63,6 +63,7 @@ public class ContractualProductInfoVo implements Serializable {
*/
@ExcelProperty(value = "单价")
private Long unitPrice;
private String cpuModel;
/**
* 价格单位
@ -88,5 +89,6 @@ public class ContractualProductInfoVo implements Serializable {
@ExcelProperty(value = "类型")
private String type;
public String unitName;
}

16
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/mapper/ContractualProductInfoMapper.java

@ -1,9 +1,15 @@
package org.dromara.productManagement.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.productManagement.domain.ContractualProductInfo;
import org.dromara.productManagement.domain.ContractualUnitStatistics;
import org.dromara.productManagement.domain.bo.ContractualProductInfoBo;
import org.dromara.productManagement.domain.vo.ContractualProductInfoVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 合同产品信息Mapper接口
*
@ -11,5 +17,13 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
* @date 2025-03-18
*/
public interface ContractualProductInfoMapper extends BaseMapperPlus<ContractualProductInfo, ContractualProductInfoVo> {
/**
* 查询用于统计的产品信息列表
*
* @param queryParam 查询参数
* @return 产品信息集合
*/
List<ContractualProductInfo> selectProductInfoForStatistics(@Param("unitName") String unitName);
Page<ContractualProductInfoVo> selectProductInfoPage(@Param("page") Page<ContractualProductInfo> page, @Param("queryParam") ContractualProductInfoBo queryParam);
Page<ContractualUnitStatistics> getUnitStatisticsPage(@Param("page") Page<ContractualProductInfo> page, @Param("unitName") String unitName);
}

16
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/mapper/DocumentTasksMapper.java

@ -6,12 +6,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.productManagement.domain.ContractualTaskExport;
import org.dromara.productManagement.domain.DocumentTaskGroup;
import org.dromara.productManagement.domain.DocumentTasks;
import org.dromara.productManagement.domain.vo.DocumentTasksVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysUser;
import java.util.List;
/**
* 文档任务Mapper接口
*
@ -25,4 +28,17 @@ import org.dromara.system.domain.SysUser;
public interface DocumentTasksMapper extends BaseMapperPlus<DocumentTasks, DocumentTasksVo> {
Page<DocumentTaskGroup> selectDocumentTaskGroups(@Param("page") Page<DocumentTasks> page,@Param(Constants.WRAPPER) Wrapper<DocumentTasks> wrapper);
/**
* 根据条件查询文档任务并关联相关信息
*
* @param batchName 批次名称可选
* @param documentName 文档名称可选
* @param resultType 结果类型可选
* @return 合约任务导出列表
*/
List<ContractualTaskExport> selectContractualTaskExport(@Param("batchName") String batchName,
@Param("documentName") String documentName,
@Param("resultType") String resultType,
@Param("problemPoint") String problemPoint);
}

6
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/IContractualProductInfoService.java

@ -1,5 +1,7 @@
package org.dromara.productManagement.service;
import org.dromara.productManagement.domain.ContractualUnitStatistics;
import org.dromara.productManagement.domain.ProductStatisticsData;
import org.dromara.productManagement.domain.vo.ContractualProductInfoVo;
import org.dromara.productManagement.domain.bo.ContractualProductInfoBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -65,4 +67,8 @@ public interface IContractualProductInfoService {
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
ProductStatisticsData getStatistics(String unitName);
TableDataInfo<ContractualUnitStatistics> getUnitStatistics(String unitName, PageQuery pageQuery);
}

10
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/IJyjContractualTaskBatchService.java

@ -82,4 +82,14 @@ public interface IJyjContractualTaskBatchService {
void getContractulPdf(Long id, HttpServletResponse response) throws UnsupportedEncodingException;
String getContractulContent(Long id);
/**
* 根据ID导出合同批处理结果
*
* @param documentName 文档名称
* @param batchName 批次名称
* @param resultType 结果类型
* @param response 响应对象
*/
void exportResultById(String documentName, String batchName, String resultType,String problemPoint, HttpServletResponse response);
}

113
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/ContractualProductInfoServiceImpl.java

@ -8,6 +8,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.productManagement.domain.ContractualUnitStatistics;
import org.dromara.productManagement.domain.DocumentTaskGroup;
import org.dromara.productManagement.domain.ProductStatisticsData;
import org.springframework.stereotype.Service;
import org.dromara.productManagement.domain.bo.ContractualProductInfoBo;
import org.dromara.productManagement.domain.vo.ContractualProductInfoVo;
@ -15,9 +18,11 @@ import org.dromara.productManagement.domain.ContractualProductInfo;
import org.dromara.productManagement.mapper.ContractualProductInfoMapper;
import org.dromara.productManagement.service.IContractualProductInfoService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 合同产品信息Service业务层处理
@ -52,8 +57,9 @@ public class ContractualProductInfoServiceImpl implements IContractualProductInf
@Override
public TableDataInfo<ContractualProductInfoVo> queryPageList(ContractualProductInfoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ContractualProductInfo> lqw = buildQueryWrapper(bo);
Page<ContractualProductInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
Page<ContractualProductInfoVo> contractualProductInfoPage = baseMapper.selectProductInfoPage(pageQuery.build(), bo);
// Page<ContractualProductInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(contractualProductInfoPage);
}
/**
@ -134,4 +140,107 @@ public class ContractualProductInfoServiceImpl implements IContractualProductInf
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
public ProductStatisticsData getStatistics(String unitName) {
ProductStatisticsData statistics = new ProductStatisticsData();
List<ProductStatisticsData.EquipmentStat> equipmentStats = new ArrayList<>();
// 查询所有符合条件的产品数据
List<ContractualProductInfo> productList = baseMapper.selectProductInfoForStatistics(unitName);
// 按类型分组统计
Map<String, List<ContractualProductInfo>> typeMap = productList.stream()
.collect(Collectors.groupingBy(ContractualProductInfo::getType));
// 处理每种设备类型
for (Map.Entry<String, List<ContractualProductInfo>> entry : typeMap.entrySet()) {
String type = entry.getKey();
List<ContractualProductInfo> typeProducts = entry.getValue();
ProductStatisticsData.EquipmentStat equipmentStat = new ProductStatisticsData.EquipmentStat();
equipmentStat.setName(type);
// 计算总数量(累加quantity字段)
Long totalCount = typeProducts.stream()
.mapToLong(product -> product.getQuantity() != null ? product.getQuantity() : 0)
.sum();
equipmentStat.setTotalCount(totalCount);
// 按品牌分组统计
Map<String, List<ContractualProductInfo>> brandMap = typeProducts.stream()
.collect(Collectors.groupingBy(ContractualProductInfo::getBrand));
List<ProductStatisticsData.BrandStat> brandStats = new ArrayList<>();
for (Map.Entry<String, List<ContractualProductInfo>> brandEntry : brandMap.entrySet()) {
String brand = brandEntry.getKey();
List<ContractualProductInfo> brandProducts = brandEntry.getValue();
ProductStatisticsData.BrandStat brandStat = new ProductStatisticsData.BrandStat();
brandStat.setName(brand);
// 计算品牌数量(累加quantity字段)
Long brandCount = brandProducts.stream()
.mapToLong(product -> product.getQuantity() != null ? product.getQuantity() : 0)
.sum();
brandStat.setCount(brandCount);
brandStats.add(brandStat);
}
// 按数量降序排序
// 按数量降序排序
brandStats.sort((a, b) -> Long.compare(b.getCount(), a.getCount()));
equipmentStat.setBrands(brandStats);
equipmentStats.add(equipmentStat);
}
// 添加CPU型号统计
ProductStatisticsData.EquipmentStat cpuModelStat = new ProductStatisticsData.EquipmentStat();
cpuModelStat.setName("技术路线CPU");
// 按CPU型号分组统计,过滤掉空值和null
Map<String, List<ContractualProductInfo>> cpuModelMap = productList.stream()
.filter(product -> product.getCpuModel() != null && !product.getCpuModel().isEmpty())
.collect(Collectors.groupingBy(ContractualProductInfo::getCpuModel));
List<ProductStatisticsData.BrandStat> cpuStats = new ArrayList<>();
for (Map.Entry<String, List<ContractualProductInfo>> cpuEntry : cpuModelMap.entrySet()) {
String cpuModel = cpuEntry.getKey();
List<ContractualProductInfo> cpuProducts = cpuEntry.getValue();
ProductStatisticsData.BrandStat cpuStat = new ProductStatisticsData.BrandStat();
cpuStat.setName(cpuModel);
// 计算该CPU型号的数量
Long cpuCount = cpuProducts.stream()
.mapToLong(product -> product.getQuantity() != null ? product.getQuantity() : 0)
.sum();
cpuStat.setCount(cpuCount);
cpuStats.add(cpuStat);
}
// CPU型号按数量降序排序
cpuStats.sort((a, b) -> Long.compare(b.getCount(), a.getCount()));
cpuModelStat.setBrands(cpuStats);
// 计算CPU总数(只计算有CPU型号的产品)
Long cpuTotalCount = productList.stream()
.filter(product -> product.getCpuModel() != null && !product.getCpuModel().isEmpty())
.mapToLong(product -> product.getQuantity() != null ? product.getQuantity() : 0)
.sum();
cpuModelStat.setTotalCount(cpuTotalCount);
equipmentStats.add(cpuModelStat);
statistics.setEquipmentStats(equipmentStats);
return statistics;
}
@Override
public TableDataInfo<ContractualUnitStatistics> getUnitStatistics(String unitName, PageQuery pageQuery) {
Page<ContractualUnitStatistics> contractualUnitStatisticsPage = baseMapper.getUnitStatisticsPage(pageQuery.build(), unitName);
return TableDataInfo.build(contractualUnitStatisticsPage);
}
}

1
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/DocumentTaskResultsServiceImpl.java

@ -263,6 +263,7 @@ public class DocumentTaskResultsServiceImpl implements IDocumentTaskResultsServi
documentTasks.setId(documentTaskId);
if(size>0){
documentTasks.setResultType("reviewFail");
documentTasks.setProblemPoint("人工干预");
}else{
documentTasks.setResultType("reviewSuccess");
documentTasks.setProblemPoint("");

113
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/JyjContractualTaskBatchServiceImpl.java

@ -5,8 +5,11 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -14,6 +17,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.productManagement.domain.*;
import org.dromara.productManagement.domain.vo.RequirementEntityVo;
import org.dromara.productManagement.mapper.ContractualInfoMapper;
import org.dromara.productManagement.mapper.DocumentTaskResultsMapper;
import org.dromara.productManagement.mapper.DocumentTasksMapper;
@ -22,6 +26,7 @@ import org.dromara.productManagement.utils.MyHttpUtils;
import org.dromara.productManagement.utils.MyTimeUtils;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService;
import org.ofdrw.converter.ConvertHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.dromara.productManagement.domain.bo.JyjContractualTaskBatchBo;
@ -239,30 +244,72 @@ public class JyjContractualTaskBatchServiceImpl implements IJyjContractualTaskBa
@Override
public void getContractulPdf(Long id, HttpServletResponse response) throws UnsupportedEncodingException {
// // PDF文件的绝对路径
// DocumentTasks documentTasks = documentTasksMapper.selectById(id);
// String pdfPath = documentTasks.getFilePath();
// String fileName = documentTasks.getDocumentName();
//
// File file = new File(pdfPath);
// if (!file.exists()) {
// throw new RuntimeException("文件不存在");
// }
// response.setContentType("application/pdf");
//// 正确的方式
// String encodedFileName = URLEncoder.encode(fileName, "UTF-8")
// .replaceAll("\\+", "%20");
// response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"");
// response.setContentLength((int) file.length());
// try (FileInputStream inputStream = new FileInputStream(file);
// OutputStream outputStream = response.getOutputStream()) {
//
// byte[] buffer = new byte[1024];
// int bytesRead;
// while ((bytesRead = inputStream.read(buffer)) != -1) {
// outputStream.write(buffer, 0, bytesRead);
// }
// outputStream.flush();
// } catch (IOException e) {
// throw new RuntimeException("文件读取失败", e);
// }
// PDF文件的绝对路径
// PDF文件的绝对路径
DocumentTasks documentTasks = documentTasksMapper.selectById(id);
String pdfPath = documentTasks.getFilePath();
String filePath = documentTasks.getFilePath();
String fileName = documentTasks.getDocumentName();
File file = new File(pdfPath);
File file = new File(filePath);
if (!file.exists()) {
throw new RuntimeException("文件不存在");
}
// 检查文件类型
String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
response.setContentType("application/pdf");
// 正确的方式
String encodedFileName = URLEncoder.encode(fileName, "UTF-8")
String encodedFileName = URLEncoder.encode(fileName.replace(".ofd", ".pdf"), "UTF-8")
.replaceAll("\\+", "%20");
response.setHeader("Content-Disposition", "inline; filename=\"" + encodedFileName + "\"");
response.setContentLength((int) file.length());
try (FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
try {
if ("ofd".equals(fileExtension)) {
// 直接使用流进行转换
try (FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream()) {
// 使用OFD转PDF工具进行转换
ConvertHelper.toPdf(inputStream, outputStream);
}
} else {
// 如果是PDF直接输出
try (FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
}
}
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException("文件读取失败", e);
}
@ -276,4 +323,46 @@ public class JyjContractualTaskBatchServiceImpl implements IJyjContractualTaskBa
String text = contractualInfo.getText();
return text;
}
@Override
public void exportResultById(String documentName, String batchName, String resultType,String problemPoint, HttpServletResponse response) {
try {
// 1. 调用Mapper查询数据
List<ContractualTaskExport> list = documentTasksMapper.selectContractualTaskExport(batchName, documentName, resultType, problemPoint);
// 处理每个任务的 issueDetail 字段
for (ContractualTaskExport task : list) {
String issueDetail = task.getIssueDetail();
if (issueDetail != null && !issueDetail.isEmpty()) {
// 将 JSON 字符串转换为 ContractualRes 对象
ContractualRes contractualRes = JsonUtils.parseObject(issueDetail, ContractualRes.class);
if (contractualRes != null && contractualRes.getResults() != null) {
StringBuilder formattedDetail = new StringBuilder();
for (ContractualRes.ContractReviewResult result : contractualRes.getResults()) {
if (result.getContentList() != null && !result.getContentList().isEmpty()) {
int problemIndex = 1;
for (ContractualRes.ProblemDetail problem : result.getContentList()) {
formattedDetail.append(problemIndex).append(". ")
.append(problem.getProblemTitle())
.append(": ")
.append(problem.getProblemDesc())
.append("\n");
problemIndex++;
}
}
}
// 更新任务的 issueDetail 字段为格式化后的文本
task.setIssueDetail(formattedDetail.toString().trim());
}
}
}
ExcelUtil.exportExcel(list, "合同批处理结果", ContractualTaskExport.class, response);
} catch (Exception e) {
log.error("导出失败:", e);
throw new ServiceException("导出Excel失败,请联系管理员");
}
}
}

98
zaojiaManagement/zaojia-productManagement/src/main/resources/mapper/productManagement/ContractualProductInfoMapper.xml

@ -3,5 +3,101 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.productManagement.mapper.ContractualProductInfoMapper">
<select id="selectProductInfoForStatistics" resultType="org.dromara.productManagement.domain.ContractualProductInfo">
SELECT
p.id,
p.task_id,
p.file_name,
p.brand,
p.version_str,
p.unit_price,
p.price_unit,
p.quantity,
p.total_price,
p.type,
p.cpu_model,
i.purchaser_name AS unitName
FROM
contractual_product_info p
INNER JOIN
contractual_info i ON p.task_id = i.task_id
<where>
<if test="unitName != null and unitName != ''">
AND i.purchaser_name LIKE CONCAT('%', #{unitName}, '%')
</if>
AND p.del_flag = '0'
</where>
ORDER BY
p.type, p.brand
</select>
<select id="selectProductInfoPage" resultType="org.dromara.productManagement.domain.vo.ContractualProductInfoVo">
SELECT
p.id,
p.task_id,
p.file_name,
p.brand,
p.version_str,
p.unit_price,
p.quantity,
p.total_price,
p.type,
p.cpu_model,
i.purchaser_name AS unitName
FROM
contractual_product_info p
INNER JOIN contractual_info i ON p.task_id = i.task_id
<where>
<if test="queryParam.fileName != null and queryParam.fileName != ''">
AND p.file_name LIKE CONCAT('%', #{queryParam.fileName}, '%')
</if>
<if test="queryParam.unitName != null and queryParam.unitName != ''">
AND i.purchaser_name LIKE CONCAT('%', #{queryParam.unitName}, '%')
</if>
<if test="queryParam.brand != null and queryParam.brand != ''">
AND p.brand LIKE CONCAT('%', #{queryParam.brand}, '%')
</if>
<if test="queryParam.versionStr != null and queryParam.versionStr != ''">
AND p.version_str LIKE CONCAT('%', #{queryParam.versionStr}, '%')
</if>
<if test="queryParam.cpuModel != null and queryParam.cpuModel != ''">
AND p.cpu_model LIKE CONCAT('%', #{queryParam.cpuModel}, '%')
</if>
<if test="queryParam.type != null and queryParam.type != ''">
AND p.type LIKE CONCAT('%', #{queryParam.type}, '%')
</if>
<if test="queryParam.unitPrice != null and queryParam.unitPrice != ''">
AND p.unit_price = #{queryParam.unitPrice}
</if>
AND p.del_flag = '0'
</where>
ORDER BY
p.type, p.brand
</select>
<select id="getUnitStatisticsPage" resultType="org.dromara.productManagement.domain.ContractualUnitStatistics">
SELECT
ci.purchaser_name AS unitName,
SUM(CASE WHEN lp.type = '便携式计算机' THEN lp.quantity ELSE 0 END) AS laptopCount,
SUM(CASE WHEN lp.type = '台式计算机' THEN lp.quantity ELSE 0 END) AS desktopCount,
SUM(CASE WHEN lp.type = '服务器' THEN lp.quantity ELSE 0 END) AS serverCount,
SUM(CASE WHEN lp.type = '服务器操作系统' THEN lp.quantity ELSE 0 END) AS osCount,
SUM(CASE WHEN lp.type = '数据库' THEN lp.quantity ELSE 0 END) AS dbCount
FROM
(SELECT t1.*
FROM contractual_product_info t1
INNER JOIN (
SELECT file_name, MAX(create_time) as max_create_time
FROM contractual_product_info
WHERE del_flag = '0'
GROUP BY file_name
) t2 ON t1.file_name = t2.file_name AND t1.create_time = t2.max_create_time
WHERE t1.del_flag = '0') lp
LEFT JOIN contractual_info ci ON lp.task_id = ci.task_id
WHERE
ci.del_flag = '0'
<if test="unitName != null and unitName != ''">
AND ci.purchaser_name LIKE CONCAT('%', #{unitName}, '%')
</if>
GROUP BY
ci.purchaser_name
</select>
</mapper>

32
zaojiaManagement/zaojia-productManagement/src/main/resources/mapper/productManagement/DocumentTasksMapper.xml

@ -100,5 +100,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND create_time = #{groupDate}
ORDER BY create_time DESC
</select>
<!-- ... 现有代码 ... -->
<select id="selectContractualTaskExport" resultType="org.dromara.productManagement.domain.ContractualTaskExport">
SELECT
dt.document_name,
dt.batch_name,
ci.purchaser_name AS party_a_name,
dt.problem_point AS issue_point,
dtr.result AS issue_detail
FROM
document_tasks dt
LEFT JOIN
document_task_results dtr ON dt.id = dtr.document_task_id
LEFT JOIN
contractual_info ci ON ci.task_id = dt.id
WHERE
dt.progress_status = 'SUCCESS'
<if test="batchName != null and batchName != ''">
AND dt.batch_name LIKE CONCAT('%', #{batchName}, '%')
</if>
<if test="documentName != null and documentName != ''">
AND dt.document_name LIKE CONCAT('%', #{documentName}, '%')
</if>
<if test="problemPoint != null and problemPoint != ''">
AND dt.problem_point LIKE CONCAT('%', #{problemPoint}, '%')
</if>
<if test="resultType != null and resultType != ''">
AND dt.result_type = #{resultType}
</if>
ORDER BY
ci.purchaser_name DESC,
dt.document_name DESC
</select>
</mapper>

Loading…
Cancel
Save