32197351@qq.com преди 1 година
родител
ревизия
168f817775
променени са 22 файла, в които са добавени 1758 реда и са изтрити 0 реда
  1. BIN
      itdmServer/doc/报告模板/报告模板 中文1.docx
  2. 5 0
      itdmServer/module-iTDM/pom.xml
  3. 48 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/common/BGType.java
  4. 40 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/common/BGXsType.java
  5. 191 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/controller/ItdmBaogaoController.java
  6. 56 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/convert/BaogaoConvert.java
  7. 55 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/dto/ItdmBaogaoCreateDTO.java
  8. 98 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/entity/ItdmBaogao.java
  9. 17 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/mapper/ItdmBaogaoMapper.java
  10. 5 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/mapper/xml/ItdmBaogaoMapper.xml
  11. 43 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/service/IItdmBaogaoService.java
  12. 250 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/service/impl/ItdmBaogaoServiceImpl.java
  13. 288 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/util/PoiTiUtils.java
  14. 90 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vo/ItdmBaogaoListVO.java
  15. 215 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/ItdmBaogaoList.vue
  16. 26 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/ItdmBaogao_menu_insert.sql
  17. 161 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/modules/ItdmBaogaoForm.vue
  18. 84 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/modules/ItdmBaogaoModal.Style#Drawer.vue
  19. 60 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/modules/ItdmBaogaoModal.vue
  20. 3 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/itdmTestPlan/mapper/ItdmTestPlanMapper.java
  21. 16 0
      itdmServer/module-iTDM/src/main/java/org/jeecg/modules/itdmTestPlan/mapper/xml/ItdmTestPlanMapper.xml
  22. 7 0
      itdmServer/pom.xml

BIN
itdmServer/doc/报告模板/报告模板 中文1.docx


+ 5 - 0
itdmServer/module-iTDM/pom.xml

@@ -17,6 +17,11 @@
             <artifactId>jeecg-boot-base-core</artifactId>
         </dependency>
         <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+
+        </dependency>
+        <dependency>
             <groupId>org.mapstruct</groupId>
             <artifactId>mapstruct</artifactId>
         </dependency>

+ 48 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/common/BGType.java

@@ -0,0 +1,48 @@
+package org.jeecg.modules.baogao.common;
+
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+
+@Getter
+public enum BGType {
+    /**
+     *
+     */
+    Mo1("0", "检验检测机构资质认定CMA(海检检测)"),
+    /**
+     *
+     */
+    Mo2("1", "实验室认可标识CNAS"),
+    /**
+     *
+     */
+    Mo3("2", "其他Others"),
+
+
+    ;
+
+    BGType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    private String code;
+    private String name;
+
+    public static final String  getCode(String code) {
+        if (StringUtils.isEmpty(code)) {
+            return null;
+        }
+        return Arrays.stream(BGType.values()).filter(i -> code.equals(i.getCode())).map(i -> i.getName()).findFirst().orElse(null);
+    }
+
+    public static final BGType get(String code) {
+        if (StringUtils.isEmpty(code)) {
+            return null;
+        }
+        return Arrays.stream(BGType.values()).filter(i -> code.equals(i.getCode())).findFirst().orElse(null);
+    }
+
+}

+ 40 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/common/BGXsType.java

@@ -0,0 +1,40 @@
+package org.jeecg.modules.baogao.common;
+
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+
+@Getter
+public enum BGXsType {
+    zy("0", "中英文"),
+    z("1", "中文"),
+    y("2", "英文"),
+
+
+
+    no("3", "不需要"),
+
+    ;
+
+    BGXsType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    private  String code;
+    private  String name;
+    public static final String  getCode(String code) {
+        if (StringUtils.isEmpty(code)) {
+            return null;
+        }
+        return Arrays.stream(BGXsType.values()).filter(i -> code.equals(i.getCode())).map(i -> i.getName()).findFirst().orElse(null);
+    }
+
+    public static final BGXsType get(String code) {
+        if (StringUtils.isEmpty(code)) {
+            return null;
+        }
+        return Arrays.stream(BGXsType.values()).filter(i -> code.equals(i.getCode())).findFirst().orElse(null);
+    }
+}

+ 191 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/controller/ItdmBaogaoController.java

@@ -0,0 +1,191 @@
+package org.jeecg.modules.baogao.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.xkcoding.http.util.StringUtil;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
+import org.jeecg.modules.baogao.entity.ItdmBaogao;
+import org.jeecg.modules.baogao.service.IItdmBaogaoService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.moban.entity.ItdmMoban;
+import org.jeecg.modules.weituo.entity.ItdmWeituoInfo;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpin;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpinExtend;
+import org.jeecg.modules.weituo.service.IItdmWeituoInfoService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date: 2023-05-19
+ * @Version: V1.0
+ */
+@Api(tags = "报告生成")
+@RestController
+@RequestMapping("/baogao/itdmBaogao")
+@Slf4j
+public class ItdmBaogaoController extends JeecgController<ItdmBaogao, IItdmBaogaoService> {
+    @Autowired
+    private IItdmBaogaoService itdmBaogaoService;
+
+
+    /**
+     * 分页列表查询
+     *
+     * @param itdmBaogao
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "报告生成-分页列表查询")
+    @ApiOperation(value = "报告生成-分页列表查询", notes = "报告生成-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ItdmBaogao>> queryPageList(ItdmBaogao itdmBaogao,
+                                                   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                   HttpServletRequest req) {
+        QueryWrapper<ItdmBaogao> queryWrapper = QueryGenerator.initQueryWrapper(itdmBaogao, req.getParameterMap());
+        Page<ItdmBaogao> page = new Page<ItdmBaogao>(pageNo, pageSize);
+        IPage<ItdmBaogao> pageList = itdmBaogaoService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param itdmBaogao
+     * @return
+     */
+    @AutoLog(value = "报告生成-添加")
+    @ApiOperation(value = "报告生成-添加", notes = "报告生成-添加")
+    //@RequiresPermissions("org.jeecg.modules:itdm_baogao:add")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody ItdmBaogaoCreateDTO itdmBaogao) {
+        itdmBaogaoService.createBaogao(itdmBaogao);
+        return Result.OK("添加成功!");
+    }
+
+
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "报告生成-通过id删除")
+    @ApiOperation(value = "报告生成-通过id删除", notes = "报告生成-通过id删除")
+    //@RequiresPermissions("org.jeecg.modules:itdm_baogao:delete")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        itdmBaogaoService.removeById(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "报告生成-批量删除")
+    @ApiOperation(value = "报告生成-批量删除", notes = "报告生成-批量删除")
+    //@RequiresPermissions("org.jeecg.modules:itdm_baogao:deleteBatch")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.itdmBaogaoService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "报告生成-通过id查询")
+    @ApiOperation(value = "报告生成-通过id查询", notes = "报告生成-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<ItdmBaogao> queryById(@RequestParam(name = "id", required = true) String id) {
+        ItdmBaogao itdmBaogao = itdmBaogaoService.getById(id);
+        if (itdmBaogao == null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(itdmBaogao);
+    }
+
+
+
+    @GetMapping(value = "/weituo/list")
+    public Result<List<ItdmWeituoInfo>> queryweituoList(ItdmWeituoInfo itdmWeituoInfo,
+                                                        HttpServletRequest req) {
+        QueryWrapper<ItdmWeituoInfo> queryWrapper = QueryGenerator.initQueryWrapper(itdmWeituoInfo, req.getParameterMap());
+        List<ItdmWeituoInfo> pageList = itdmBaogaoService.queryweituoList(queryWrapper);
+        return Result.OK(pageList);
+    }
+
+
+    @GetMapping(value = "/yangpin/list")
+    public Result<List<ItdmWeituoYangpin>> queryYangpinList(String weituoId) {
+        if (StringUtil.isEmpty(weituoId)) {
+            return Result.OK();
+        }
+        List<ItdmWeituoYangpin> pageList = itdmBaogaoService.queryYangpinList(weituoId);
+        return Result.OK(pageList);
+    }
+
+
+    @GetMapping(value = "/shiyan/list")
+    public Result<List<ItdmWeituoYangpinExtend>> queryShiyanList(String yangpinIds) {
+        if (StringUtil.isEmpty(yangpinIds)) {
+            return Result.OK();
+        }
+        List<ItdmWeituoYangpinExtend> pageList = itdmBaogaoService.queryShiyanList(Arrays.asList(yangpinIds.split(",")));
+        return Result.OK(pageList);
+    }
+
+
+
+    @GetMapping(value = "/munam/queryById")
+    public Result<ItdmMoban> queryMubanById(@RequestParam(name="mobanId",required=true) String mobanId) {
+        ItdmMoban itdmMoban = itdmBaogaoService.queryMubanById(mobanId);
+        if(itdmMoban==null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(itdmMoban);
+    }
+
+
+
+}

+ 56 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/convert/BaogaoConvert.java

@@ -0,0 +1,56 @@
+package org.jeecg.modules.baogao.convert;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
+import org.jeecg.modules.baogao.entity.ItdmBaogao;
+import org.jeecg.modules.baogao.vo.ItdmBaogaoListVO;
+import org.jeecg.modules.weituo.dto.WeituoInsertCommand;
+import org.jeecg.modules.weituo.dto.WeituoUpdateCommand;
+import org.jeecg.modules.weituo.entity.ItdmWeituoInfo;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpin;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpinExtend;
+import org.jeecg.modules.weituo.vo.ItdmWeituoInfoInfoVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 敏感词 Convert
+ *
+ * @author 永不言败
+ */
+@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE,imports ={ CollectionUtils.class, Collectors.class})
+
+public interface BaogaoConvert {
+
+    BaogaoConvert INSTANCE = Mappers.getMapper(BaogaoConvert.class);
+
+
+    ItdmBaogaoListVO convert(ItdmBaogao convert);
+
+
+    @Mapping(target ="records",source ="results" )
+    Page<ItdmBaogaoListVO> converter(Page<ItdmBaogao> page, List<ItdmBaogaoListVO> results);
+
+
+    @Mapping(target = "sampleIds", expression = "java(dto!=null&&CollectionUtils.isEmpty(dto.getSampleIds())?" +
+            "dto.getSampleIds().stream().collect(Collectors.joining(\",\")):\"\")")
+
+    @Mapping(target = "testItemsIds", expression = "java(dto!=null&&CollectionUtils.isEmpty(dto.getTestItemsIds())?" +
+            "dto.getTestItemsIds().stream().collect(Collectors.joining(\",\")):\"\")")
+    ItdmBaogao convert(ItdmBaogaoCreateDTO dto);
+
+
+
+
+
+
+
+
+
+}

+ 55 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/dto/ItdmBaogaoCreateDTO.java

@@ -0,0 +1,55 @@
+package org.jeecg.modules.baogao.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date: 2023-05-19
+ * @Version: V1.0
+ */
+@Data
+public class ItdmBaogaoCreateDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    private String weituoId;
+
+    /**
+     * 委托样品id列表
+     */
+    private List<String> sampleIds;
+
+    /**
+     * 委托样品检测Id列表
+     */
+
+    private List<String> testItemsIds;
+
+    /**
+     * 报告类型
+     */
+
+    private String baogaoType;
+
+
+
+    private  String wendu;
+    private  String daqiya;
+    private String shidu;
+
+}

+ 98 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/entity/ItdmBaogao.java

@@ -0,0 +1,98 @@
+package org.jeecg.modules.baogao.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date:   2023-05-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("itdm_baogao")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="itdm_baogao对象", description="报告生成")
+public class ItdmBaogao implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+	/**所属部门*/
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+	/**委托编号*/
+	@Excel(name = "委托编号", width = 15)
+    @ApiModelProperty(value = "委托编号")
+    private String weituoNo;
+	/**委托id*/
+	@Excel(name = "委托id", width = 15)
+    @ApiModelProperty(value = "委托id")
+    private String weituoId;
+	/**委托单位名称*/
+	@Excel(name = "委托单位名称", width = 15)
+    @ApiModelProperty(value = "委托单位名称")
+    private String weituoClient;
+	/**委托样品列表*/
+	@Excel(name = "委托样品列表", width = 15)
+    @ApiModelProperty(value = "委托样品列表")
+    private String sampleNames;
+	/**委托样品id列表*/
+	@Excel(name = "委托样品id列表", width = 15)
+    @ApiModelProperty(value = "委托样品id列表")
+    private String sampleIds;
+	/**委托联系人*/
+	@Excel(name = "委托联系人", width = 15)
+    @ApiModelProperty(value = "委托联系人")
+    private String weituoLxr;
+	/**委托样品检测Id列表*/
+	@Excel(name = "委托样品检测Id列表", width = 15)
+    @ApiModelProperty(value = "委托样品检测Id列表")
+    private String testItemsIds;
+	/**委托样品检测列表*/
+	@Excel(name = "委托样品检测列表", width = 15)
+    @ApiModelProperty(value = "委托样品检测列表")
+    private String testItemsNames;
+	/**报告类型*/
+	@Excel(name = "报告类型", width = 15)
+    @ApiModelProperty(value = "报告类型")
+    private String baogaoType;
+	/**报告文件地址*/
+	@Excel(name = "报告文件地址", width = 15)
+    @ApiModelProperty(value = "报告文件地址")
+    private String filePath;
+}

+ 17 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/mapper/ItdmBaogaoMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.baogao.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.baogao.entity.ItdmBaogao;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date:   2023-05-19
+ * @Version: V1.0
+ */
+public interface ItdmBaogaoMapper extends BaseMapper<ItdmBaogao> {
+
+}

+ 5 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/mapper/xml/ItdmBaogaoMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.baogao.mapper.ItdmBaogaoMapper">
+
+</mapper>

+ 43 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/service/IItdmBaogaoService.java

@@ -0,0 +1,43 @@
+package org.jeecg.modules.baogao.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.poi.ss.formula.functions.T;
+import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
+import org.jeecg.modules.baogao.entity.ItdmBaogao;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.baogao.vo.ItdmBaogaoListVO;
+import org.jeecg.modules.moban.entity.ItdmMoban;
+import org.jeecg.modules.weituo.entity.ItdmWeituoInfo;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpin;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpinExtend;
+
+import java.util.List;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date:   2023-05-19
+ * @Version: V1.0
+ */
+public interface IItdmBaogaoService extends IService<ItdmBaogao> {
+
+
+    List<ItdmWeituoInfo> queryweituoList(Wrapper<ItdmWeituoInfo> queryWrapper);
+
+
+    List<ItdmWeituoYangpin> queryYangpinList(String weituoId);
+
+    List<ItdmWeituoYangpinExtend> queryShiyanList(List<String> yangpinId);
+
+
+    ItdmMoban queryMubanById(String mubanid);
+
+    Page<ItdmBaogaoListVO> pageVO(Page<ItdmBaogao> pageVO, QueryWrapper<ItdmBaogao> queryWrapper);
+
+
+    void createBaogao(ItdmBaogaoCreateDTO itdmBaogao);
+
+
+}

+ 250 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/service/impl/ItdmBaogaoServiceImpl.java

@@ -0,0 +1,250 @@
+package org.jeecg.modules.baogao.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.time.DateUtils;
+import org.checkerframework.checker.units.qual.A;
+import org.jcp.xml.dsig.internal.DigesterOutputStream;
+import org.jeecg.config.JeecgBaseConfig;
+import org.jeecg.modules.baogao.convert.BaogaoConvert;
+import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
+import org.jeecg.modules.baogao.entity.ItdmBaogao;
+import org.jeecg.modules.baogao.mapper.ItdmBaogaoMapper;
+import org.jeecg.modules.baogao.service.IItdmBaogaoService;
+import org.jeecg.modules.baogao.util.PoiTiUtils;
+import org.jeecg.modules.baogao.vo.ItdmBaogaoListVO;
+import org.jeecg.modules.chuanganqi.entity.ItdmChuanganqi;
+import org.jeecg.modules.chuanganqi.mapper.ItdmChuanganqiMapper;
+import org.jeecg.modules.itdmDevice.entity.ItdmDevice;
+import org.jeecg.modules.itdmDevice.mapper.ItdmDeviceMapper;
+import org.jeecg.modules.itdmGongdanMaster.entity.ItdmGongdanMaster;
+import org.jeecg.modules.itdmGongdanMaster.mapper.ItdmGongdanMasterMapper;
+import org.jeecg.modules.itdmTestPlan.entity.ItdmTestPlan;
+import org.jeecg.modules.itdmTestPlan.mapper.ItdmTestPlanMapper;
+import org.jeecg.modules.moban.entity.ItdmMoban;
+import org.jeecg.modules.moban.mapper.ItdmMobanMapper;
+import org.jeecg.modules.weituo.entity.ItdmWeituoInfo;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpin;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpinExtend;
+import org.jeecg.modules.weituo.mapper.ItdmWeituoInfoMapper;
+import org.jeecg.modules.weituo.mapper.ItdmWeituoYangpinExtendMapper;
+import org.jeecg.modules.weituo.mapper.ItdmWeituoYangpinMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date: 2023-05-19
+ * @Version: V1.0
+ */
+@Service
+@SuppressWarnings("all")
+public class ItdmBaogaoServiceImpl extends ServiceImpl<ItdmBaogaoMapper, ItdmBaogao> implements IItdmBaogaoService {
+    @Resource
+    JeecgBaseConfig jeecgBaseConfig;
+
+    @Autowired
+    private ItdmMobanMapper itdmMobanMapper;
+    @Autowired
+    private ItdmWeituoInfoMapper itdmWeituoInfoMapper;
+
+    @Autowired
+    private ItdmWeituoYangpinMapper itdmWeituoYangpinMapper;
+    @Autowired
+    private ItdmWeituoYangpinExtendMapper itdmWeituoYangpinExtendMapper;
+
+
+    @Autowired
+    private ItdmMobanMapper mobanMapper;
+
+
+    @Autowired
+    private ItdmTestPlanMapper tdmTestPlanMapper;
+
+
+    @Autowired
+    private ItdmGongdanMasterMapper itdmGongdanMaster;
+
+
+    @Autowired
+    private ItdmDeviceMapper itdmDeviceMapper;
+
+
+    @Autowired
+    private ItdmChuanganqiMapper chuangeMapper;
+
+
+    @Override
+    public Page<ItdmBaogaoListVO> pageVO(Page<ItdmBaogao> pageVO, QueryWrapper<ItdmBaogao> queryWrapper) {
+
+
+        Page<ItdmBaogao> page = this.getBaseMapper().selectPage(pageVO, queryWrapper);
+
+        List<ItdmBaogaoListVO> listVO = new ArrayList<>();
+
+        for (ItdmBaogao itdmBaogao : page.getRecords()) {
+
+            ItdmMoban itdmMoban = mobanMapper.selectById(itdmBaogao.getBaogaoType());
+            ItdmBaogaoListVO vo = BaogaoConvert.INSTANCE.convert(itdmBaogao);
+            vo.setBaogaoTypeName(itdmMoban.getName());
+            listVO.add(vo);
+
+        }
+        return BaogaoConvert.INSTANCE.converter(page, listVO);
+    }
+
+    @Override
+    public List<ItdmWeituoInfo> queryweituoList(Wrapper<ItdmWeituoInfo> queryWrapper) {
+        return itdmWeituoInfoMapper.selectList(queryWrapper);
+    }
+
+
+    @Override
+    public List<ItdmWeituoYangpin> queryYangpinList(String weituoId) {
+        return itdmWeituoYangpinMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).eq(
+                ItdmWeituoYangpin::getWeituoId, weituoId
+        ));
+    }
+
+    @Override
+    public List<ItdmWeituoYangpinExtend> queryShiyanList(List<String> yangpinId) {
+        return itdmWeituoYangpinExtendMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).in(
+                ItdmWeituoYangpinExtend::getYangpinId, yangpinId
+        ));
+    }
+
+    @Override
+    public ItdmMoban queryMubanById(String mubanid) {
+        return itdmMobanMapper.selectById(mubanid);
+    }
+
+
+    @Override
+    public void createBaogao(ItdmBaogaoCreateDTO dto) {
+        ItdmWeituoInfo itdmWeituoInfo = itdmWeituoInfoMapper.selectById(dto.getWeituoId());
+        ItdmBaogao itdmBaogao = BaogaoConvert.INSTANCE.convert(dto);
+        itdmBaogao.setWeituoClient(itdmWeituoInfo.getWeituoClient());
+        itdmBaogao.setWeituoNo(itdmWeituoInfo.getWeituoNo());
+        itdmBaogao.setWeituoLxr(itdmWeituoInfo.getWeituoLxr());
+
+
+        List<ItdmWeituoYangpin> yangpins = itdmWeituoYangpinMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpin.class).in(
+                ItdmWeituoYangpin::getId, dto.getSampleIds()
+        ));
+
+        List<ItdmWeituoYangpinExtend> testItems = itdmWeituoYangpinExtendMapper.selectList(Wrappers.lambdaQuery(ItdmWeituoYangpinExtend.class).in(
+                ItdmWeituoYangpinExtend::getId, dto.getTestItemsIds()
+        ));
+
+
+        itdmBaogao.setSampleNames(yangpins.stream().map(o -> o.getSampleName()).collect(Collectors.joining(",")));
+
+        itdmBaogao.setTestItemsNames(testItems.stream().map(o -> o.getTestItems()).collect(Collectors.joining(",")));
+
+        ItdmMoban itdmMoban = mobanMapper.selectById(dto.getBaogaoType());
+
+        String fileName = jeecgBaseConfig.getPath().getUpload() + File.separator + "word" + File.separator + System.currentTimeMillis() + ".docx";
+        FileUtil.touch(fileName);
+
+
+        try {
+            Map map = getMap(dto, itdmWeituoInfo, yangpins, testItems, getChuanganqiList(dto.getTestItemsIds()), getDeviceList(dto.getTestItemsIds()));
+
+            PoiTiUtils.create(jeecgBaseConfig.getPath().getUpload() + File.separator + itdmMoban.getFilePath(), map,
+                    new FileOutputStream(fileName));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+
+        itdmBaogao.setFilePath(fileName);
+
+        this.baseMapper.insert(itdmBaogao);
+    }
+
+
+    Map<String, Object> getMap(ItdmBaogaoCreateDTO dto, ItdmWeituoInfo wweotuo, List<ItdmWeituoYangpin> yweituoInfo, List<ItdmWeituoYangpinExtend> extendList,
+                               List<ItdmChuanganqi> chuanges, List<ItdmDevice> deviceList) throws ParseException {
+
+        Map<String, Object> map = new HashMap<>();
+
+        map.put("reportNo", wweotuo.getWeituoNo());
+        // map.put("time", wweotuo.getShenheTime() == null ? "   年    月   日" : DateUtils.parseDate(wweotuo.getShenheTime(), "yyyy年 MM月 dd日"));
+        map.putAll(PoiTiUtils.getWeituoInfo(wweotuo));
+        map.putAll(PoiTiUtils.getJIanceyiju(extendList));
+        map.putAll(PoiTiUtils.getWeituoYangplList(yweituoInfo, extendList));
+        map.putAll(PoiTiUtils.getBaogaoShebeiList(chuanges, deviceList));
+        map.putAll(PoiTiUtils.getYuanshijilShebeiList(deviceList));
+        map.putAll(PoiTiUtils.getYuanshijilChuanganqiList(chuanges));
+        map.putAll(PoiTiUtils.getBaogaoInfo(yweituoInfo, extendList));
+        map.putAll(PoiTiUtils.getYSjlInfo(wweotuo, yweituoInfo, extendList));
+        map.put("wendu", dto.getWendu());
+        map.put("shidu", dto.getShidu());
+        map.put("daqiya", dto.getDaqiya());
+        map.putAll(PoiTiUtils.getBaogaoImage(getBaogaoImage(dto)));
+
+        return map;
+    }
+
+
+    private List<String> getBaogaoImage(ItdmBaogaoCreateDTO dto) {
+
+
+        return tdmTestPlanMapper.getImageByShiyanid(dto.getTestItemsIds())
+                .stream().distinct().collect(Collectors.toList());
+    }
+
+    private List<ItdmDevice> getDeviceList(List<String> list) {
+
+
+        List<String> shebeiids = tdmTestPlanMapper.geSBByShiyanid(list)
+                .stream().distinct().collect(Collectors.toList());
+
+        if (shebeiids == null || shebeiids.size() == 0) {
+            return new ArrayList<>();
+        }
+        return itdmDeviceMapper.selectList(Wrappers.lambdaQuery(ItdmDevice.class).in(ItdmDevice::getId, shebeiids));
+    }
+
+
+    public List<ItdmChuanganqi> getChuanganqiList(List<String> list) {
+
+        List<String> chuanganqitIds = new ArrayList<>();
+
+        List<String> chuangants = tdmTestPlanMapper.geChuanganqitByShiyanid(list);
+
+
+        for (String chuangant : chuangants) {
+            String[] chuangantArr = chuangant.split(",");
+            for (String ch : chuangantArr) {
+                chuanganqitIds.add(ch);
+            }
+        }
+
+        if (chuangants == null || chuangants.size() == 0) {
+            return new ArrayList<>();
+        }
+
+        return chuangeMapper.selectList(Wrappers.lambdaQuery(ItdmChuanganqi.class)
+                .in(ItdmChuanganqi::getId, chuanganqitIds.stream().distinct().collect(Collectors.toList())));
+
+
+    }
+}

+ 288 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/util/PoiTiUtils.java

@@ -0,0 +1,288 @@
+package org.jeecg.modules.baogao.util;
+
+import cn.hutool.core.io.FileUtil;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import org.apache.commons.lang3.time.DateUtils;
+import org.jeecg.modules.baogao.common.BGType;
+import org.jeecg.modules.baogao.common.BGXsType;
+import org.jeecg.modules.baogao.dto.ItdmBaogaoCreateDTO;
+import org.jeecg.modules.chuanganqi.entity.ItdmChuanganqi;
+import org.jeecg.modules.itdmDevice.entity.ItdmDevice;
+import org.jeecg.modules.weituo.entity.ItdmWeituoInfo;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpin;
+import org.jeecg.modules.weituo.entity.ItdmWeituoYangpinExtend;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.ParseException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class PoiTiUtils {
+
+
+    public static void create(String templateDocx, Map<String, Object> map, OutputStream outputStream) throws IOException {
+        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
+
+        ConfigureBuilder builder = Configure.builder();
+        builder.buildGramer("{", "}");
+        builder.bind("g", policy);
+        builder.bind("g1", policy);
+
+        XWPFTemplate template = XWPFTemplate.compile(templateDocx, builder.build()).render(map);
+        template.writeAndClose(outputStream);
+    }
+
+
+
+
+
+
+
+
+
+
+
+    public static Map<String, Object> getWeituoYangplList(List<ItdmWeituoYangpin> yweituoInfo, List<ItdmWeituoYangpinExtend> extendList) {
+
+        List<Map<String, String>> g1maMapList = new ArrayList<>();
+        for (ItdmWeituoYangpin y : yweituoInfo) {
+            List<ItdmWeituoYangpinExtend> list = extendList.stream()
+                    .filter(i -> i.getYangpinId().equals(y.getId())).collect(Collectors.toList());
+            for (int x = 0; x < list.size(); x++) {
+                Map<String, String> map11 = new HashMap<>();
+                map11.put("sampleName", "");
+                map11.put("sampleNo", "");
+                map11.put("sampleModelSpecification", "");
+                map11.put("sampleQuantities", "");
+                map11.put("sampleManufacturer", "");
+                if (x == 0) {
+                    map11.put("sampleName", y.getSysOrgCode());
+                    map11.put("sampleNo", y.getSampleCode());
+                    map11.put("sampleModelSpecification", y.getSampleModelSpecification());
+                    map11.put("sampleQuantities", y.getSampleQuantities());
+                    map11.put("sampleManufacturer", y.getSampleManufacturer());
+
+                }
+                map11.put("testItems", y.getSysOrgCode());
+                map11.put("standardRequirement", y.getSampleCode());
+                map11.put("judgementBasis", y.getSampleModelSpecification());
+                map11.put("remark", y.getSampleManufacturer());
+                g1maMapList.add(map11);
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+
+        map.put("g1", g1maMapList);
+
+        return map;
+    }
+
+
+    public static Map<String, Object> getBaogaoShebeiList(List<ItdmChuanganqi> chuanges, List<ItdmDevice> deviceList) {
+
+        List<Map<String, String>> maps = deviceList.stream().map(i -> {
+            Map<String, String> map1 = new HashMap<>();
+            map1.put("name", i.getDeviceName());
+            map1.put("xinghao", i.getDeviceModel());
+            map1.put("guanliCode", i.getDeviceNo());
+            map1.put("youxiaoqi", i.getDeviceLife());
+            return map1;
+        }).collect(Collectors.toList());
+
+
+        List<Map<String, String>> chuangaiqi = chuanges.stream().map(i -> {
+            Map<String, String> map1 = new HashMap<>();
+            map1.put("name", "传感器");
+            map1.put("xinghao", i.getXinghao());
+            map1.put("guanliCode", i.getXuliehao());
+            map1.put("youxiaoqi", i.getYouxiaoqi());
+            return map1;
+        }).collect(Collectors.toList());
+        maps.addAll(chuangaiqi);
+
+
+        Map<String, Object> map = new HashMap<>();
+
+        map.put("g", maps);
+
+        return map;
+    }
+
+
+    public static Map<String, Object> getBaogaoImage(List<String> list) {
+
+        List<Map<String, Object>> mapList=list.stream().map(
+                i->{
+                    Map<String, Object> map1 = new HashMap<>();
+                    map1.put("path", i);
+                    map1.put("name", FileUtil.mainName(i));
+                    return map1;
+                }
+
+        ).collect(Collectors.toList());
+
+        Map<String, Object> map = new HashMap<>();
+
+        map.put("images", mapList);
+
+        return map;
+    }
+
+
+
+    public static Map<String, Object> getJIanceyiju(List<ItdmWeituoYangpinExtend> extendList) {
+
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("standardRequirementStr", extendList.stream().map(ItdmWeituoYangpinExtend::getStandardRequirement).collect(Collectors.joining("、")));
+        map.put("standardRequirementList", extendList.stream().map(ItdmWeituoYangpinExtend::getStandardRequirement).collect(Collectors.toList()));
+
+
+        return map;
+    }
+
+
+
+    public static Map<String, Object> getWeituoInfo(ItdmWeituoInfo wweotuo) throws ParseException {
+
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("shenheTime", wweotuo.getShenheTime() == null ? "" : wweotuo.getShenheTime());
+
+        map.put("weituoNo", wweotuo.getWeituoNo());
+        map.put("weituoClient", wweotuo.getWeituoClient());
+        map.put("weituoAddress", wweotuo.getWeituoAddress());
+        map.put("weituoLxr", wweotuo.getWeituoLxr());
+        map.put("weituoPhone", wweotuo.getWeituoPhone());
+
+        map.put("weituoEmail", wweotuo.getWeituoEmail());
+
+        map.put("teshuyaoqiu", wweotuo.getTeshuyaoqiu());
+
+        char s = '\u2610';
+        char s1 = '\u2611';
+        BGXsType b = BGXsType.get(wweotuo.getBgxs());
+
+
+        for (BGXsType bgXsType : BGXsType.values()) {
+            boolean bool = b != null && bgXsType.getCode().equals(b.getCode());
+
+            map.put("t" + bgXsType.getCode(), bool ? s1 : s);
+        }
+
+        if (wweotuo.getBgyz() != null) {
+            List<String> strings = Arrays.stream(wweotuo.getBgyz().split(",")).collect(Collectors.toList());
+
+
+            for (BGType bgXsType : BGType.values()) {
+                boolean bool = strings.contains(bgXsType.getCode());
+
+                map.put("x" + bgXsType.getCode(), bool ? s1 : s);
+            }
+
+        }
+
+
+        return map;
+    }
+
+
+
+    public static Map<String, Object> getYuanshijilShebeiList(List<ItdmDevice> deviceList) {
+
+
+        Map<String, Object> map = new HashMap<>();
+
+        for (int i = 0; i < deviceList.size(); i++) {
+            ItdmDevice shebei = deviceList.get(i);
+            map.put("sname" + i, shebei.getDeviceName());
+            map.put("sxinghao" + i, shebei.getDeviceModel());
+            map.put("sguanliCode" + i, shebei.getDeviceNo());
+            map.put("syouxiaoqi" + i, shebei.getDeviceLife());
+        }
+        return map;
+    }
+
+    public static Map<String, Object> getYuanshijilChuanganqiList(List<ItdmChuanganqi> chuanges) {
+
+
+        Map<String, Object> map = new HashMap<>();
+
+
+        for (int i = 0; i < chuanges.size(); i++) {
+            ItdmChuanganqi shebei = chuanges.get(i);
+            map.put("b" + i, shebei.getXuliehao());
+
+
+            map.put("l" + i, shebei.getLingmindu());
+
+            map.put("y" + i, shebei.getYouxiaoqi());
+        }
+        return map;
+    }
+
+
+    public static Map<String, Object> getYSjlInfo(ItdmWeituoInfo weituoInfo,List<ItdmWeituoYangpin> yweituoInfo, List<ItdmWeituoYangpinExtend> extendList) {
+        int sum = yweituoInfo.stream().mapToInt(i -> Integer.parseInt(i.getSampleQuantities())).sum();
+
+
+
+
+
+        Map<String, Object> map = new HashMap<>();
+        String componentNo = sum > 1 ? weituoInfo.getWeituoNo() + "-001~" + String.format("%03d", sum) : weituoInfo.getWeituoNo();
+
+        map.put("y_componentName", componentNo);
+        map.put("y_testItems", extendList.stream().map(ItdmWeituoYangpinExtend::getTestItems).collect(Collectors.joining(",")));
+        return map;
+    }
+
+
+    public static Map<String, Object> getBaogaoInfo(List<ItdmWeituoYangpin> yweituoInfo, List<ItdmWeituoYangpinExtend> extendList) {
+        Map<String, Object> map = new HashMap<>();
+
+        if (yweituoInfo != null && extendList.size() > 0) {
+
+
+            ItdmWeituoYangpinExtend yangpinExtend = extendList.get(0);
+            map.put("b_testItems", yangpinExtend.getTestItems());
+            ItdmWeituoYangpin yangpin = yweituoInfo.stream()
+                    .filter(i -> i.getId().equals(yangpinExtend.getYangpinId())).findFirst().orElse(null);
+
+            if (yangpin != null) {
+                map.put("b_componentName", yangpin.getSampleName());
+
+                map.put("b_chanpinNo", yangpin.getSampleCode());
+
+                map.put("b_specification", yangpin.getSampleModelSpecification());
+
+                map.put("b_sampleManufacturer", yangpin.getSampleManufacturer());
+                map.put("b_productQuantity", yangpin.getSampleQuantities());
+            }
+
+
+
+
+        }
+
+
+
+
+        return map;
+    }
+
+
+
+
+    public static void main(String[] args) throws ParseException, IOException {
+
+        System.out.println(FileUtil.mainName("D://123.txt"));
+
+
+    }
+
+}

+ 90 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vo/ItdmBaogaoListVO.java

@@ -0,0 +1,90 @@
+package org.jeecg.modules.baogao.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 报告生成
+ * @Author: jeecg-boot
+ * @Date: 2023-05-19
+ * @Version: V1.0
+ */
+@Data
+public class ItdmBaogaoListVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+    /**
+     * 创建人
+     */
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    private String sysOrgCode;
+    /**
+     * 委托编号
+     */
+    private String weituoNo;
+    /**
+     * 委托id
+     */
+    private String weituoId;
+    /**
+     * 委托单位名称
+     */
+    private String weituoClient;
+    /**
+     * 委托样品列表
+     */
+    private String sampleNames;
+    /**
+     * 委托样品id列表
+     */
+    private String sampleIds;
+    /**
+     * 委托联系人
+     */
+    private String weituoLxr;
+    /**
+     * 委托样品检测Id列表
+     */
+    private String testItemsIds;
+    /**
+     * 委托样品检测列表
+     */
+    private String testItemsNames;
+    /**
+     * 报告类型
+     */
+    private String baogaoType;
+
+
+    private  String baogaoTypeName;
+    /**
+     * 报告文件地址
+     */
+    private String filePath;
+}

+ 215 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/ItdmBaogaoList.vue

@@ -0,0 +1,215 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('报告生成')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <itdm-baogao-modal ref="modalForm" @ok="modalFormOk"></itdm-baogao-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import ItdmBaogaoModal from './modules/ItdmBaogaoModal'
+
+  export default {
+    name: 'ItdmBaogaoList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      ItdmBaogaoModal
+    },
+    data () {
+      return {
+        description: '报告生成管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'委托编号',
+            align:"center",
+            dataIndex: 'weituoNo'
+          },
+          {
+            title:'委托id',
+            align:"center",
+            dataIndex: 'weituoId'
+          },
+          {
+            title:'委托单位名称',
+            align:"center",
+            dataIndex: 'weituoClient_dictText'
+          },
+          {
+            title:'委托样品id列表',
+            align:"center",
+            dataIndex: 'sampleIds'
+          },
+          {
+            title:'委托联系人',
+            align:"center",
+            dataIndex: 'weituoLxr'
+          },
+          {
+            title:'委托样品检测Id列表',
+            align:"center",
+            dataIndex: 'testItemsIds_dictText'
+          },
+          {
+            title:'报告类型',
+            align:"center",
+            dataIndex: 'baogaoType'
+          },
+          {
+            title:'报告文件地址',
+            align:"center",
+            dataIndex: 'filePath'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/baogao/itdmBaogao/list",
+          delete: "/baogao/itdmBaogao/delete",
+          deleteBatch: "/baogao/itdmBaogao/deleteBatch",
+          exportXlsUrl: "/baogao/itdmBaogao/exportXls",
+          importExcelUrl: "baogao/itdmBaogao/importExcel",
+          
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'weituoNo',text:'委托编号',dictCode:''})
+        fieldList.push({type:'string',value:'weituoId',text:'委托id',dictCode:''})
+        fieldList.push({type:'list_multi',value:'weituoClient',text:'委托单位名称',dictTable:"", dictText:'', dictCode:''})
+        fieldList.push({type:'string',value:'sampleNames',text:'委托样品列表',dictCode:''})
+        fieldList.push({type:'string',value:'sampleIds',text:'委托样品id列表',dictCode:''})
+        fieldList.push({type:'string',value:'weituoLxr',text:'委托联系人',dictCode:''})
+        fieldList.push({type:'list_multi',value:'testItemsIds',text:'委托样品检测Id列表',dictTable:"", dictText:'', dictCode:''})
+        fieldList.push({type:'string',value:'testItemsNames',text:'委托样品检测列表',dictCode:''})
+        fieldList.push({type:'string',value:'baogaoType',text:'报告类型',dictCode:''})
+        fieldList.push({type:'Text',value:'filePath',text:'报告文件地址',dictCode:''})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 26 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/ItdmBaogao_menu_insert.sql

@@ -0,0 +1,26 @@
+-- 注意:该页面对应的前台目录为views/baogao文件夹下
+-- 如果你想更改到其他目录,请修改sql中component字段对应的值
+
+
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description, status, del_flag, rule_flag, create_by, create_time, update_by, update_time, internal_or_external)
+VALUES ('2023051910058010060', NULL, '报告生成', '/baogao/itdmBaogaoList', 'module-iTDM/baogao/ItdmBaogaoList', NULL, NULL, 0, NULL, '1', 0.00, 0, NULL, 1, 1, 0, 0, 0, NULL, '1', 0, 0, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0);
+
+-- 权限控制sql
+-- 新增
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2023051910058010061', '2023051910058010060', '新增', NULL, NULL, 0, NULL, NULL, 2, 'org.jeecg.modules:itdm_baogao:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0, 0, '1', 0);
+-- 编辑
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2023051910058010062', '2023051910058010060', '编辑', NULL, NULL, 0, NULL, NULL, 2, 'org.jeecg.modules:itdm_baogao:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0, 0, '1', 0);
+-- 删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2023051910058010063', '2023051910058010060', '删除', NULL, NULL, 0, NULL, NULL, 2, 'org.jeecg.modules:itdm_baogao:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0, 0, '1', 0);
+-- 批量删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2023051910058010064', '2023051910058010060', '批量删除', NULL, NULL, 0, NULL, NULL, 2, 'org.jeecg.modules:itdm_baogao:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0, 0, '1', 0);
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2023051910058010065', '2023051910058010060', '导出excel', NULL, NULL, 0, NULL, NULL, 2, 'org.jeecg.modules:itdm_baogao:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0, 0, '1', 0);
+-- 导入excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external)
+VALUES ('2023051910058010066', '2023051910058010060', '导入excel', NULL, NULL, 0, NULL, NULL, 2, 'org.jeecg.modules:itdm_baogao:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2023-05-19 10:05:06', NULL, NULL, 0, 0, '1', 0);

+ 161 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/modules/ItdmBaogaoForm.vue

@@ -0,0 +1,161 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="委托编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="weituoNo">
+              <a-input v-model="model.weituoNo" placeholder="请输入委托编号"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托id" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="weituoId">
+              <a-input v-model="model.weituoId" placeholder="请输入委托id"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托单位名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="weituoClient">
+              <j-multi-select-tag type="list_multi" v-model="model.weituoClient" dictCode="" placeholder="请选择委托单位名称" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托样品列表" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sampleNames">
+              <a-input v-model="model.sampleNames" placeholder="请输入委托样品列表"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托样品id列表" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="sampleIds">
+              <a-input v-model="model.sampleIds" placeholder="请输入委托样品id列表"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托联系人" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="weituoLxr">
+              <a-input v-model="model.weituoLxr" placeholder="请输入委托联系人"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托样品检测Id列表" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="testItemsIds">
+              <j-multi-select-tag type="list_multi" v-model="model.testItemsIds" dictCode="" placeholder="请选择委托样品检测Id列表" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="委托样品检测列表" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="testItemsNames">
+              <a-input v-model="model.testItemsNames" placeholder="请输入委托样品检测列表"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="报告类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="baogaoType">
+              <a-input v-model="model.baogaoType" placeholder="请输入报告类型"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="报告文件地址" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="filePath">
+              <a-input v-model="model.filePath" placeholder="请输入报告文件地址"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'ItdmBaogaoForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+           weituoId: [
+              { required: true, message: '请输入委托id!'},
+           ],
+           sampleIds: [
+              { required: true, message: '请输入委托样品id列表!'},
+           ],
+           testItemsIds: [
+              { required: true, message: '请输入委托样品检测Id列表!'},
+           ],
+           baogaoType: [
+              { required: true, message: '请输入报告类型!'},
+           ],
+        },
+        url: {
+          add: "/baogao/itdmBaogao/add",
+          edit: "/baogao/itdmBaogao/edit",
+          queryById: "/baogao/itdmBaogao/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 84 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/modules/ItdmBaogaoModal.Style#Drawer.vue

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <itdm-baogao-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></itdm-baogao-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import ItdmBaogaoForm from './ItdmBaogaoForm'
+
+  export default {
+    name: 'ItdmBaogaoModal',
+    components: {
+      ItdmBaogaoForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 60 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/baogao/vue/modules/ItdmBaogaoModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <itdm-baogao-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></itdm-baogao-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import ItdmBaogaoForm from './ItdmBaogaoForm'
+  export default {
+    name: 'ItdmBaogaoModal',
+    components: {
+      ItdmBaogaoForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 3 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/itdmTestPlan/mapper/ItdmTestPlanMapper.java

@@ -21,6 +21,9 @@ public interface ItdmTestPlanMapper extends BaseMapper<ItdmTestPlan> {
     public List<String> geSBByShiyanid(@Param("list") List<String> list);
 
 
+    public  List<String> getImageByShiyanid(@Param("list") List<String> list);
+
+
 
 
 

+ 16 - 0
itdmServer/module-iTDM/src/main/java/org/jeecg/modules/itdmTestPlan/mapper/xml/ItdmTestPlanMapper.xml

@@ -38,4 +38,20 @@
 
 
     </select>
+    <select id="getImageByShiyanid" resultType="java.lang.String">
+
+
+        select c.extra_pic
+        from itdm_gongdan_master as b
+
+        inner join itdm_gongdan_shuju c on b.id = c.wo_id
+
+        where b.test_items_id in
+
+
+        <foreach item="item" collection="list" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+
+    </select>
 </mapper>

+ 7 - 0
itdmServer/pom.xml

@@ -63,6 +63,7 @@
 		<org.projectlombok.version>1.18.22</org.projectlombok.version>
 
 		<lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
+		<poiti.version>1.10.5</poiti.version>
 
 	</properties>
 
@@ -141,6 +142,12 @@
 
 		<dependencies>
 			<dependency>
+				<groupId>com.deepoove</groupId>
+				<artifactId>poi-tl</artifactId>
+
+				<version>${poiti.version}</version>
+			</dependency>
+			<dependency>
 				<groupId>org.mapstruct</groupId>
 				<artifactId>mapstruct</artifactId>
 				<version>${org.mapstruct.version}</version>