diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java new file mode 100644 index 0000000..d406e4b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java @@ -0,0 +1,116 @@ +package com.casic.missiles.utils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/7 15:37 + */ +public class FileUtil { + private static Logger log = LoggerFactory.getLogger(FileUtil.class); + + /** + * MultipartFile转File + */ + public static File multipartFileToFile(MultipartFile multipartFile) { + File file = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = multipartFile.getInputStream(); + file = new File(multipartFile.getOriginalFilename()); + outputStream = new FileOutputStream(file); + //项目根目录下放置文件 + write(inputStream, outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return file; + } + + public static void write(InputStream inputStream, OutputStream outputStream) { + byte[] buffer = new byte[4096]; + try { + int count = inputStream.read(buffer, 0, buffer.length); + while (count != -1) { + outputStream.write(buffer, 0, count); + count = inputStream.read(buffer, 0, buffer.length); + } + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) { + FileItem fileItem = createFileItem(inputStream, fileName); + //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象 + return new CommonsMultipartFile(fileItem); + } + + /** + * FileItem类对象创建 + */ + public static FileItem createFileItem(InputStream inputStream, String fileName) { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "file"; + FileItem item = factory.createItem(textFieldName, MediaType.APPLICATION_OCTET_STREAM_VALUE, true, fileName); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + OutputStream os = null; + //使用输出流输出输入流的字节 + try { + os = item.getOutputStream(); + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + inputStream.close(); + } catch (IOException e) { + log.error("Stream copy exception", e); + throw new IllegalArgumentException("文件上传失败"); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + } + return item; + } + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java new file mode 100644 index 0000000..d406e4b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java @@ -0,0 +1,116 @@ +package com.casic.missiles.utils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/7 15:37 + */ +public class FileUtil { + private static Logger log = LoggerFactory.getLogger(FileUtil.class); + + /** + * MultipartFile转File + */ + public static File multipartFileToFile(MultipartFile multipartFile) { + File file = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = multipartFile.getInputStream(); + file = new File(multipartFile.getOriginalFilename()); + outputStream = new FileOutputStream(file); + //项目根目录下放置文件 + write(inputStream, outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return file; + } + + public static void write(InputStream inputStream, OutputStream outputStream) { + byte[] buffer = new byte[4096]; + try { + int count = inputStream.read(buffer, 0, buffer.length); + while (count != -1) { + outputStream.write(buffer, 0, count); + count = inputStream.read(buffer, 0, buffer.length); + } + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) { + FileItem fileItem = createFileItem(inputStream, fileName); + //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象 + return new CommonsMultipartFile(fileItem); + } + + /** + * FileItem类对象创建 + */ + public static FileItem createFileItem(InputStream inputStream, String fileName) { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "file"; + FileItem item = factory.createItem(textFieldName, MediaType.APPLICATION_OCTET_STREAM_VALUE, true, fileName); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + OutputStream os = null; + //使用输出流输出输入流的字节 + try { + os = item.getOutputStream(); + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + inputStream.close(); + } catch (IOException e) { + log.error("Stream copy exception", e); + throw new IllegalArgumentException("文件上传失败"); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + } + return item; + } + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml index 754fb3f..171f90d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml @@ -39,11 +39,18 @@ + + + - id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time + id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, + product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, + check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, + install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time, + is_del,model_id,help_instruction diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java index b798a3a..f6b0fcd 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java @@ -6,6 +6,8 @@ import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.model.subcontract.SubcontractCertificate; import com.casic.missiles.service.subcontract.ISubcontractCertificateService; import com.sun.org.apache.bcel.internal.generic.RET; @@ -15,9 +17,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.Objects; @Controller @RequestMapping("/subcontract/certificate") @@ -49,9 +53,14 @@ @ResponseBody public ReturnDTO> listPage(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, - String createTimeStart, String createTimeEnd) { + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd) { Page page = PageFactory.defaultPage(); - page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd); + page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, + subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd); return ReturnUtil.success(super.packForBT(page)); } @@ -61,8 +70,25 @@ public void export(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd, @RequestParam("ids") List ids) throws IOException { - List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd, ids); + List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, + equipmentName, subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd, + ids); super.exportExcel(SubcontractCertificate.class, list, ""); } + + @ApiOperation("批量导入") + @PostMapping("/import") + @ResponseBody + public ReturnDTO infoImport(@RequestParam("file") MultipartFile file) throws IOException { + if(Objects.isNull(file)){ + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + } + certificateService.batchImport(file); + return ReturnUtil.success(); + } } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java new file mode 100644 index 0000000..d406e4b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java @@ -0,0 +1,116 @@ +package com.casic.missiles.utils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/7 15:37 + */ +public class FileUtil { + private static Logger log = LoggerFactory.getLogger(FileUtil.class); + + /** + * MultipartFile转File + */ + public static File multipartFileToFile(MultipartFile multipartFile) { + File file = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = multipartFile.getInputStream(); + file = new File(multipartFile.getOriginalFilename()); + outputStream = new FileOutputStream(file); + //项目根目录下放置文件 + write(inputStream, outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return file; + } + + public static void write(InputStream inputStream, OutputStream outputStream) { + byte[] buffer = new byte[4096]; + try { + int count = inputStream.read(buffer, 0, buffer.length); + while (count != -1) { + outputStream.write(buffer, 0, count); + count = inputStream.read(buffer, 0, buffer.length); + } + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) { + FileItem fileItem = createFileItem(inputStream, fileName); + //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象 + return new CommonsMultipartFile(fileItem); + } + + /** + * FileItem类对象创建 + */ + public static FileItem createFileItem(InputStream inputStream, String fileName) { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "file"; + FileItem item = factory.createItem(textFieldName, MediaType.APPLICATION_OCTET_STREAM_VALUE, true, fileName); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + OutputStream os = null; + //使用输出流输出输入流的字节 + try { + os = item.getOutputStream(); + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + inputStream.close(); + } catch (IOException e) { + log.error("Stream copy exception", e); + throw new IllegalArgumentException("文件上传失败"); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + } + return item; + } + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml index 754fb3f..171f90d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml @@ -39,11 +39,18 @@ + + + - id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time + id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, + product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, + check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, + install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time, + is_del,model_id,help_instruction diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java index b798a3a..f6b0fcd 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java @@ -6,6 +6,8 @@ import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.model.subcontract.SubcontractCertificate; import com.casic.missiles.service.subcontract.ISubcontractCertificateService; import com.sun.org.apache.bcel.internal.generic.RET; @@ -15,9 +17,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.Objects; @Controller @RequestMapping("/subcontract/certificate") @@ -49,9 +53,14 @@ @ResponseBody public ReturnDTO> listPage(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, - String createTimeStart, String createTimeEnd) { + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd) { Page page = PageFactory.defaultPage(); - page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd); + page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, + subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd); return ReturnUtil.success(super.packForBT(page)); } @@ -61,8 +70,25 @@ public void export(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd, @RequestParam("ids") List ids) throws IOException { - List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd, ids); + List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, + equipmentName, subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd, + ids); super.exportExcel(SubcontractCertificate.class, list, ""); } + + @ApiOperation("批量导入") + @PostMapping("/import") + @ResponseBody + public ReturnDTO infoImport(@RequestParam("file") MultipartFile file) throws IOException { + if(Objects.isNull(file)){ + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + } + certificateService.batchImport(file); + return ReturnUtil.success(); + } } diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml index cfbdcfd..84ca460 100644 --- a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -4,7 +4,7 @@ spring: datasource: # driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&nullCatalogMeansCurrent=true username: root password: Casic203 redis: diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java new file mode 100644 index 0000000..2f3877b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.certificate; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class SubcontractCertificateImportDTO { + + @ExcelProperty(value = "证书编号") + private String certificateNo; + + @ExcelProperty(value = "证书名称") + private String certificateName; + + @ExcelProperty("检测单位编号") + private String subcontractorNo; + + @ExcelProperty("检测单位名称") + private String subcontractorName; + + @ExcelIgnore + private Long subcontractorId; + + @ExcelIgnore + private Long equipmentId; + + @ExcelProperty("受检设备编号") + private String equipmentNo; + + @ExcelProperty("设备名称") + private String equipmentName; + + @ExcelProperty(value = "规格型号") + private String equipmentModel; + + @ExcelProperty(value = "辅助字段") + private String helpInstruction; + + @ExcelProperty(value = "出厂编号") + private String equipmentManufactureNo; + + @ExcelProperty(value = "检定(校准)日期", converter = DateExcelConverter.class) + private Date checkDate; + + @ExcelProperty(value = "证书有效期", converter = DateExcelConverter.class) + private Date certificateValid; + + @ExcelProperty("计量标识") + private String meterIdentify; + + @ExcelProperty("证书报告附件") + private String certificateReport; +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java new file mode 100644 index 0000000..d406e4b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java @@ -0,0 +1,116 @@ +package com.casic.missiles.utils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/7 15:37 + */ +public class FileUtil { + private static Logger log = LoggerFactory.getLogger(FileUtil.class); + + /** + * MultipartFile转File + */ + public static File multipartFileToFile(MultipartFile multipartFile) { + File file = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = multipartFile.getInputStream(); + file = new File(multipartFile.getOriginalFilename()); + outputStream = new FileOutputStream(file); + //项目根目录下放置文件 + write(inputStream, outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return file; + } + + public static void write(InputStream inputStream, OutputStream outputStream) { + byte[] buffer = new byte[4096]; + try { + int count = inputStream.read(buffer, 0, buffer.length); + while (count != -1) { + outputStream.write(buffer, 0, count); + count = inputStream.read(buffer, 0, buffer.length); + } + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) { + FileItem fileItem = createFileItem(inputStream, fileName); + //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象 + return new CommonsMultipartFile(fileItem); + } + + /** + * FileItem类对象创建 + */ + public static FileItem createFileItem(InputStream inputStream, String fileName) { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "file"; + FileItem item = factory.createItem(textFieldName, MediaType.APPLICATION_OCTET_STREAM_VALUE, true, fileName); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + OutputStream os = null; + //使用输出流输出输入流的字节 + try { + os = item.getOutputStream(); + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + inputStream.close(); + } catch (IOException e) { + log.error("Stream copy exception", e); + throw new IllegalArgumentException("文件上传失败"); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + } + return item; + } + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml index 754fb3f..171f90d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml @@ -39,11 +39,18 @@ + + + - id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time + id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, + product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, + check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, + install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time, + is_del,model_id,help_instruction diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java index b798a3a..f6b0fcd 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java @@ -6,6 +6,8 @@ import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.model.subcontract.SubcontractCertificate; import com.casic.missiles.service.subcontract.ISubcontractCertificateService; import com.sun.org.apache.bcel.internal.generic.RET; @@ -15,9 +17,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.Objects; @Controller @RequestMapping("/subcontract/certificate") @@ -49,9 +53,14 @@ @ResponseBody public ReturnDTO> listPage(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, - String createTimeStart, String createTimeEnd) { + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd) { Page page = PageFactory.defaultPage(); - page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd); + page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, + subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd); return ReturnUtil.success(super.packForBT(page)); } @@ -61,8 +70,25 @@ public void export(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd, @RequestParam("ids") List ids) throws IOException { - List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd, ids); + List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, + equipmentName, subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd, + ids); super.exportExcel(SubcontractCertificate.class, list, ""); } + + @ApiOperation("批量导入") + @PostMapping("/import") + @ResponseBody + public ReturnDTO infoImport(@RequestParam("file") MultipartFile file) throws IOException { + if(Objects.isNull(file)){ + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + } + certificateService.batchImport(file); + return ReturnUtil.success(); + } } diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml index cfbdcfd..84ca460 100644 --- a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -4,7 +4,7 @@ spring: datasource: # driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&nullCatalogMeansCurrent=true username: root password: Casic203 redis: diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java new file mode 100644 index 0000000..2f3877b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.certificate; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class SubcontractCertificateImportDTO { + + @ExcelProperty(value = "证书编号") + private String certificateNo; + + @ExcelProperty(value = "证书名称") + private String certificateName; + + @ExcelProperty("检测单位编号") + private String subcontractorNo; + + @ExcelProperty("检测单位名称") + private String subcontractorName; + + @ExcelIgnore + private Long subcontractorId; + + @ExcelIgnore + private Long equipmentId; + + @ExcelProperty("受检设备编号") + private String equipmentNo; + + @ExcelProperty("设备名称") + private String equipmentName; + + @ExcelProperty(value = "规格型号") + private String equipmentModel; + + @ExcelProperty(value = "辅助字段") + private String helpInstruction; + + @ExcelProperty(value = "出厂编号") + private String equipmentManufactureNo; + + @ExcelProperty(value = "检定(校准)日期", converter = DateExcelConverter.class) + private Date checkDate; + + @ExcelProperty(value = "证书有效期", converter = DateExcelConverter.class) + private Date certificateValid; + + @ExcelProperty("计量标识") + private String meterIdentify; + + @ExcelProperty("证书报告附件") + private String certificateReport; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java index ad5c82e..c4e453a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java @@ -14,6 +14,8 @@ import java.io.Serializable; import java.util.Date; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.converter.DateExcelConverter; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -51,7 +53,7 @@ */ @ApiModelProperty("证书编号") @TableField("certificate_no") - @ExcelProperty(value = "证书号",index = 0) + @ExcelProperty(value = "证书编号",index = 0) private String certificateNo; /** @@ -81,7 +83,7 @@ */ @ApiModelProperty("检测单位名称") @TableField(exist = false) - @ExcelProperty(value = "检测单位",index = 6) + @ExcelProperty(value = "检测单位",index = 5) private String subcontractorName; /** @@ -96,7 +98,7 @@ */ @ApiModelProperty("受检设备编号") @TableField(exist = false) - @ExcelProperty(value = "样品编号",index = 2) + //@ExcelProperty(value = "样品编号",index = 2) private String equipmentNo; /** @@ -104,7 +106,7 @@ */ @ApiModelProperty("受检设备名称") @TableField(exist = false) - @ExcelProperty(value = "样品名称",index = 3) + @ExcelProperty(value = "设备名称",index = 2) private String equipmentName; /** @@ -112,7 +114,7 @@ */ @ApiModelProperty("出厂编号") @TableField(exist = false) - @ExcelProperty(value = "出厂编号",index = 5) + @ExcelProperty(value = "出厂编号",index = 4) private String equipmentManufactureNo; /** @@ -120,7 +122,7 @@ */ @ApiModelProperty("型号") @TableField(exist = false) - @ExcelProperty(value = "型号",index = 4) + @ExcelProperty(value = "规格型号",index = 3) private String equipmentModel; /** @@ -128,6 +130,7 @@ */ @ApiModelProperty("检定(校准)日期") @TableField("check_date") + @ExcelProperty(value = "检定(校准)日期",index = 6, converter = DateExcelConverter.class) private Date checkDate; /** @@ -135,6 +138,7 @@ */ @ApiModelProperty("证书有效期") @TableField("certificate_valid") + @ExcelProperty(value = "证书有效期",index = 7, converter = DateExcelConverter.class) private Date certificateValid; /** @@ -142,8 +146,14 @@ */ @ApiModelProperty("计量标识") @TableField("meter_identify") + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY) private String meterIdentify; + @ApiModelProperty("计量标识名称") + @TableField(exist = false) + @ExcelProperty(value = "计量标识", index = 8) + private String meterIdentifyName; + /** * 原始记录附件 */ @@ -163,7 +173,7 @@ */ @ApiModelProperty("创建时间") @TableField("create_time") - @ExcelProperty(value = "创建时间",index = 7, converter = DateExcelConverter.class) + //@ExcelProperty(value = "创建时间",index = 7, converter = DateExcelConverter.class) private Date createTime; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java index 514e0e8..759cb30 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java @@ -433,9 +433,12 @@ } - res.setStatistic(getEquipmentCommonAggrs(list,EquipmentInfo::getCategory, MeterDictCode.EQUIPMENT_CATEGORY)); - res.setNameAggrList(getEquipmentCommonAggrs(list,EquipmentInfo::getEquipmentName, null)); - res.setMeterAggrList(getEquipmentCommonAggrs(list,EquipmentInfo::getMeterIdentify, MeterDictCode.EQUIPMENT_METER_IDENTITY)); + res.setStatistic(getEquipmentCommonAggrs(list.stream().filter(l->ObjectUtil.isNotEmpty(l.getCategory())).collect(Collectors.toList()), + EquipmentInfo::getCategory, MeterDictCode.EQUIPMENT_CATEGORY)); + res.setNameAggrList(getEquipmentCommonAggrs(list.stream().filter(l->ObjectUtil.isNotEmpty(l.getEquipmentName())).collect(Collectors.toList()), + EquipmentInfo::getEquipmentName, null)); + res.setMeterAggrList(getEquipmentCommonAggrs(list.stream().filter(l->ObjectUtil.isNotEmpty(l.getMeterIdentify())).collect(Collectors.toList()), + EquipmentInfo::getMeterIdentify, MeterDictCode.EQUIPMENT_METER_IDENTITY)); return res; } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java new file mode 100644 index 0000000..d406e4b --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/FileUtil.java @@ -0,0 +1,116 @@ +package com.casic.missiles.utils; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import java.io.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/4/7 15:37 + */ +public class FileUtil { + private static Logger log = LoggerFactory.getLogger(FileUtil.class); + + /** + * MultipartFile转File + */ + public static File multipartFileToFile(MultipartFile multipartFile) { + File file = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = multipartFile.getInputStream(); + file = new File(multipartFile.getOriginalFilename()); + outputStream = new FileOutputStream(file); + //项目根目录下放置文件 + write(inputStream, outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return file; + } + + public static void write(InputStream inputStream, OutputStream outputStream) { + byte[] buffer = new byte[4096]; + try { + int count = inputStream.read(buffer, 0, buffer.length); + while (count != -1) { + outputStream.write(buffer, 0, count); + count = inputStream.read(buffer, 0, buffer.length); + } + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) { + FileItem fileItem = createFileItem(inputStream, fileName); + //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象 + return new CommonsMultipartFile(fileItem); + } + + /** + * FileItem类对象创建 + */ + public static FileItem createFileItem(InputStream inputStream, String fileName) { + FileItemFactory factory = new DiskFileItemFactory(16, null); + String textFieldName = "file"; + FileItem item = factory.createItem(textFieldName, MediaType.APPLICATION_OCTET_STREAM_VALUE, true, fileName); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + OutputStream os = null; + //使用输出流输出输入流的字节 + try { + os = item.getOutputStream(); + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + inputStream.close(); + } catch (IOException e) { + log.error("Stream copy exception", e); + throw new IllegalArgumentException("文件上传失败"); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error("Stream close exception", e); + } + } + } + return item; + } + +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml index 754fb3f..171f90d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentInfoMapper.xml @@ -39,11 +39,18 @@ + + + - id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time + id, equipment_no as equipmentNo, equipment_name, usage_status, level, product_country, manufacturer, manufacture_no as manufactureNo, + product_date, unit_price, purchase_date, model, quality_condition, company_id, dept_id, category, check_cycle, remark, instructions_file, + check_organization, check_date, certificate_valid as certificateValid, meter_identify, use_position, director_name, RFID, use_sign, + install_location, install_location_ext, test_task, remark_ext, create_user_id, create_user_name, create_time, update_time, + is_del,model_id,help_instruction diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java index b798a3a..f6b0fcd 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/subcontract/SubcontractCertificateController.java @@ -6,6 +6,8 @@ import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; import com.casic.missiles.model.subcontract.SubcontractCertificate; import com.casic.missiles.service.subcontract.ISubcontractCertificateService; import com.sun.org.apache.bcel.internal.generic.RET; @@ -15,9 +17,11 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.Objects; @Controller @RequestMapping("/subcontract/certificate") @@ -49,9 +53,14 @@ @ResponseBody public ReturnDTO> listPage(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, - String createTimeStart, String createTimeEnd) { + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd) { Page page = PageFactory.defaultPage(); - page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd); + page = certificateService.listScopePage(page, certificateNo, certificateName, equipmentNo, equipmentName, + subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd); return ReturnUtil.success(super.packForBT(page)); } @@ -61,8 +70,25 @@ public void export(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd, @RequestParam("ids") List ids) throws IOException { - List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd, ids); + List list = certificateService.listScope(certificateNo, certificateName, equipmentNo, + equipmentName, subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd, + ids); super.exportExcel(SubcontractCertificate.class, list, ""); } + + @ApiOperation("批量导入") + @PostMapping("/import") + @ResponseBody + public ReturnDTO infoImport(@RequestParam("file") MultipartFile file) throws IOException { + if(Objects.isNull(file)){ + throw new BusinessException(BusinessExceptionEnum.UPLOAD_FILE_NULL); + } + certificateService.batchImport(file); + return ReturnUtil.success(); + } } diff --git a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml index cfbdcfd..84ca460 100644 --- a/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml +++ b/casic-metering-eqpt-api/src/main/resources/config/application-dev.yml @@ -4,7 +4,7 @@ spring: datasource: # driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true&nullCatalogMeansCurrent=true + url: jdbc:mysql://111.198.10.15:11336/casic_metering_xichang?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&&allowMultiQueries=true&nullCatalogMeansCurrent=true username: root password: Casic203 redis: diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java new file mode 100644 index 0000000..2f3877b --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/certificate/SubcontractCertificateImportDTO.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.certificate; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class SubcontractCertificateImportDTO { + + @ExcelProperty(value = "证书编号") + private String certificateNo; + + @ExcelProperty(value = "证书名称") + private String certificateName; + + @ExcelProperty("检测单位编号") + private String subcontractorNo; + + @ExcelProperty("检测单位名称") + private String subcontractorName; + + @ExcelIgnore + private Long subcontractorId; + + @ExcelIgnore + private Long equipmentId; + + @ExcelProperty("受检设备编号") + private String equipmentNo; + + @ExcelProperty("设备名称") + private String equipmentName; + + @ExcelProperty(value = "规格型号") + private String equipmentModel; + + @ExcelProperty(value = "辅助字段") + private String helpInstruction; + + @ExcelProperty(value = "出厂编号") + private String equipmentManufactureNo; + + @ExcelProperty(value = "检定(校准)日期", converter = DateExcelConverter.class) + private Date checkDate; + + @ExcelProperty(value = "证书有效期", converter = DateExcelConverter.class) + private Date certificateValid; + + @ExcelProperty("计量标识") + private String meterIdentify; + + @ExcelProperty("证书报告附件") + private String certificateReport; +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java b/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java index ad5c82e..c4e453a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/subcontract/SubcontractCertificate.java @@ -14,6 +14,8 @@ import java.io.Serializable; import java.util.Date; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.converter.DateExcelConverter; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -51,7 +53,7 @@ */ @ApiModelProperty("证书编号") @TableField("certificate_no") - @ExcelProperty(value = "证书号",index = 0) + @ExcelProperty(value = "证书编号",index = 0) private String certificateNo; /** @@ -81,7 +83,7 @@ */ @ApiModelProperty("检测单位名称") @TableField(exist = false) - @ExcelProperty(value = "检测单位",index = 6) + @ExcelProperty(value = "检测单位",index = 5) private String subcontractorName; /** @@ -96,7 +98,7 @@ */ @ApiModelProperty("受检设备编号") @TableField(exist = false) - @ExcelProperty(value = "样品编号",index = 2) + //@ExcelProperty(value = "样品编号",index = 2) private String equipmentNo; /** @@ -104,7 +106,7 @@ */ @ApiModelProperty("受检设备名称") @TableField(exist = false) - @ExcelProperty(value = "样品名称",index = 3) + @ExcelProperty(value = "设备名称",index = 2) private String equipmentName; /** @@ -112,7 +114,7 @@ */ @ApiModelProperty("出厂编号") @TableField(exist = false) - @ExcelProperty(value = "出厂编号",index = 5) + @ExcelProperty(value = "出厂编号",index = 4) private String equipmentManufactureNo; /** @@ -120,7 +122,7 @@ */ @ApiModelProperty("型号") @TableField(exist = false) - @ExcelProperty(value = "型号",index = 4) + @ExcelProperty(value = "规格型号",index = 3) private String equipmentModel; /** @@ -128,6 +130,7 @@ */ @ApiModelProperty("检定(校准)日期") @TableField("check_date") + @ExcelProperty(value = "检定(校准)日期",index = 6, converter = DateExcelConverter.class) private Date checkDate; /** @@ -135,6 +138,7 @@ */ @ApiModelProperty("证书有效期") @TableField("certificate_valid") + @ExcelProperty(value = "证书有效期",index = 7, converter = DateExcelConverter.class) private Date certificateValid; /** @@ -142,8 +146,14 @@ */ @ApiModelProperty("计量标识") @TableField("meter_identify") + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY) private String meterIdentify; + @ApiModelProperty("计量标识名称") + @TableField(exist = false) + @ExcelProperty(value = "计量标识", index = 8) + private String meterIdentifyName; + /** * 原始记录附件 */ @@ -163,7 +173,7 @@ */ @ApiModelProperty("创建时间") @TableField("create_time") - @ExcelProperty(value = "创建时间",index = 7, converter = DateExcelConverter.class) + //@ExcelProperty(value = "创建时间",index = 7, converter = DateExcelConverter.class) private Date createTime; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java index 514e0e8..759cb30 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/board/NoticeBoardServiceImpl.java @@ -433,9 +433,12 @@ } - res.setStatistic(getEquipmentCommonAggrs(list,EquipmentInfo::getCategory, MeterDictCode.EQUIPMENT_CATEGORY)); - res.setNameAggrList(getEquipmentCommonAggrs(list,EquipmentInfo::getEquipmentName, null)); - res.setMeterAggrList(getEquipmentCommonAggrs(list,EquipmentInfo::getMeterIdentify, MeterDictCode.EQUIPMENT_METER_IDENTITY)); + res.setStatistic(getEquipmentCommonAggrs(list.stream().filter(l->ObjectUtil.isNotEmpty(l.getCategory())).collect(Collectors.toList()), + EquipmentInfo::getCategory, MeterDictCode.EQUIPMENT_CATEGORY)); + res.setNameAggrList(getEquipmentCommonAggrs(list.stream().filter(l->ObjectUtil.isNotEmpty(l.getEquipmentName())).collect(Collectors.toList()), + EquipmentInfo::getEquipmentName, null)); + res.setMeterAggrList(getEquipmentCommonAggrs(list.stream().filter(l->ObjectUtil.isNotEmpty(l.getMeterIdentify())).collect(Collectors.toList()), + EquipmentInfo::getMeterIdentify, MeterDictCode.EQUIPMENT_METER_IDENTITY)); return res; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/subcontract/SubcontractCertificateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/subcontract/SubcontractCertificateServiceImpl.java index 4dd3d44..c053371 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/subcontract/SubcontractCertificateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/subcontract/SubcontractCertificateServiceImpl.java @@ -1,25 +1,56 @@ package com.casic.missiles.service.impl.subcontract; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.constants.MeterDictCode; import com.casic.missiles.core.application.context.AbstractPermissionContext; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.datascope.DataScope; +import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.dto.ReturnDTO; +import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.board.EquipmentStatisticsList; +import com.casic.missiles.dto.certificate.SubcontractCertificateImportDTO; import com.casic.missiles.dto.equipment.EquipmentCertificateDTO; +import com.casic.missiles.dto.equipment.EquipmentImportDTO; +import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.listeners.CommonExcelListener; +import com.casic.missiles.model.equipment.EquipmentInfo; import com.casic.missiles.model.subcontract.SubcontractCertificate; import com.casic.missiles.mapper.subcontract.SubcontractCertificateMapper; +import com.casic.missiles.model.subcontract.Subcontractor; +import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.service.equipment.IEquipmentInfoService; import com.casic.missiles.service.subcontract.ISubcontractCertificateService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.service.subcontract.ISubcontractorService; +import com.casic.missiles.utils.DictCodeUtils; +import com.casic.missiles.utils.FileUtil; +import com.casic.missiles.utils.MinioUtil; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; -import java.util.List; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.*; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; /** *

@@ -34,20 +65,185 @@ public class SubcontractCertificateServiceImpl extends ServiceImpl implements ISubcontractCertificateService { private final AbstractPermissionContext permissionContext; - private IEquipmentInfoService equipmentInfoService; + private final MinioUtil minioUtil; + private final AbstractDictService dictService; + private IEquipmentInfoService equipmentInfoService; + private ISubcontractorService subcontractorService; @Autowired - public void setEquipmentInfoService(IEquipmentInfoService equipmentInfoService){ + public void setEquipmentInfoService(IEquipmentInfoService equipmentInfoService,ISubcontractorService subcontractorService){ this.equipmentInfoService = equipmentInfoService; + this.subcontractorService = subcontractorService; } @Override - public ReturnDTO batchImport(MultipartFile file) { - // todo - return null; + @Transactional + public ReturnDTO batchImport(MultipartFile file) throws IOException { + //获取文件输入流,压缩文件直接读取 + InputStream in = new BufferedInputStream(file.getInputStream()); + ZipInputStream zin = new ZipInputStream(in, Charset.forName("GBK")); + //MultipartFile转File,外层zip + File realFile = FileUtil.multipartFileToFile(file); + ZipFile zipFile = new ZipFile(realFile, Charset.forName("GBK")); + BufferedInputStream bs = new BufferedInputStream(zin); + ZipEntry ze; + ZipEntry eze = null; + List multipartFileList = new ArrayList<>(); + try { + //读取zip包中pdf证书文件 + while ((ze = zin.getNextEntry()) != null) { + if (ze.isDirectory()) { + continue; + } + if (ze.toString().endsWith("pdf")) { + InputStream inputStream = zipFile.getInputStream(ze); + //File转MultipartFile,zip内部文件 + MultipartFile multipartFile = FileUtil.getMultipartFile(inputStream, ze.getName()); + multipartFileList.add(multipartFile); + } + if (ze.toString().endsWith("xlsx") || ze.toString().endsWith("xls")) { + eze = ze; + } + } + if(CollectionUtils.isEmpty(multipartFileList) || Objects.isNull(eze)){ + //无证书或证书文件非pdf或无Excel + throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); + } + + //读取zip包中excel文件 + InputStream inputStream = zipFile.getInputStream(eze); + //转换为MultipartFile + MultipartFile excelFile = FileUtil.getMultipartFile(inputStream, eze.getName()); + //解析excel文件,对应文件名转换minio上传文件名,批量存储 + CommonExcelListener listener = new CommonExcelListener<>(); + EasyExcel.read(excelFile.getInputStream(), SubcontractCertificateImportDTO.class, listener) + .headRowNumber(1).autoTrim(true).sheet(0).doRead(); + List certificateImportList = listener.getList(); + validImport(certificateImportList); + + + List minioNameList = minioUtil.upload(multipartFileList.toArray(new MultipartFile[multipartFileList.size()])); + //Map:pdf文件名-minio上传文件名 + Map minioMap = new HashMap<>(); + for (int i = 0; i < minioNameList.size(); i++) { + minioMap.put(multipartFileList.get(i).getOriginalFilename(), minioNameList.get(i)); + } + saveImport(certificateImportList,minioMap); + + + }finally { + in.close(); + zin.closeEntry(); + zin.close(); + bs.close(); + } + return ReturnUtil.success(); } + void validImport(List list){ + if(CollectionUtils.isEmpty(list)){ + throw new BusinessException(BusinessExceptionEnum.IMPORT_NO_DATA); + } + List subcontractorList = subcontractorService.list(); + List equipmentInfoList = equipmentInfoService.list(); + List meterIdentityDicts = dictService.findInDictByCode(MeterDictCode.EQUIPMENT_METER_IDENTITY); + String validMsg = "第%d行数据校验失败:%s"; + for (int i = 0; i < list.size(); i++) { + SubcontractCertificateImportDTO importDTO = list.get(i); + if (StrUtil.isBlank(importDTO.getCertificateNo())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "证书编号不能为空")); + } + if (StrUtil.isBlank(importDTO.getCertificateName())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "证书名称不能为空")); + } + // 检测单位 + if (StrUtil.isBlank(importDTO.getSubcontractorNo())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "检测单位编号不能为空")); + } + Optional subcontractorOpt = subcontractorList.stream().filter(s->s.getSubcontractorNo().equals(importDTO.getSubcontractorNo())).findFirst(); + if(subcontractorOpt.isPresent()){ + Subcontractor subcontractor = subcontractorOpt.get(); + if(!subcontractor.getCompanyName().equals(importDTO.getSubcontractorName())){ + throw new BusinessException(1500, String.format(validMsg, i + 1, "检测单位名称与名录不一致")); + } + importDTO.setSubcontractorId(subcontractor.getId()); + }else { + throw new BusinessException(1500, String.format(validMsg, i + 1, "检测单位不存在")); + } + // 受检设备 + if (StrUtil.isBlank(importDTO.getEquipmentNo())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "受检设备编号不能为空")); + } + Optional equipmentInfoOpt = equipmentInfoList.stream().filter(s->s.getEquipmentNo().equals(importDTO.getEquipmentNo())).findFirst(); + if(equipmentInfoOpt.isPresent()){ + EquipmentInfo equipmentInfo = equipmentInfoOpt.get(); + if(!equipmentInfo.getEquipmentName().equals(importDTO.getEquipmentName()) + ||!equipmentInfo.getModel().equals(importDTO.getEquipmentModel()) + ||!equipmentInfo.getManufactureNo().equals(importDTO.getEquipmentManufactureNo()) + ||(StrUtil.isNotEmpty(equipmentInfo.getHelpInstruction()) && !equipmentInfo.getHelpInstruction().equals(importDTO.getHelpInstruction()))){ + throw new BusinessException(1500, String.format(validMsg, i + 1, "受检设备信息与设备台账不一致")); + } + + importDTO.setEquipmentId(equipmentInfo.getId()); + }else { + throw new BusinessException(1500, String.format(validMsg, i + 1, "受检设备编号不存在")); + } + // 检定校准日期 + if (ObjectUtil.isEmpty(importDTO.getCheckDate())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "检定(校准)日期不能为空")); + } + // 证书有效期 + if (ObjectUtil.isEmpty(importDTO.getCertificateValid())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "证书有效期不能为空")); + } + // 计量标识 + if (StrUtil.isBlank(importDTO.getMeterIdentify())){ + throw new BusinessException(1500, String.format(validMsg, i + 1, "计量标识不能为空")); + } + Optional dictOpt = meterIdentityDicts.stream().filter(s->s.getCode().equals(importDTO.getMeterIdentify())).findFirst(); + if(!dictOpt.isPresent()){ + throw new BusinessException(1500, String.format(validMsg, i + 1, "计量标识不合法")); + } + // 证书文件 + if(StrUtil.isBlank(importDTO.getCertificateReport())){ + throw new BusinessException(1500, String.format(validMsg, i + 1, "证书报告附件不能为空")); + } + } + } + + void saveImport(List list,Map minioMap){ + AuthUser user = permissionContext.getAuthService().getLoginUser(); + List resultList = new ArrayList<>(); + list.forEach(cert -> { + List excelFileList = Arrays.asList(cert.getCertificateReport().split(";")); + excelFileList.forEach(f -> { + SubcontractCertificate certificate = new SubcontractCertificate(); + BeanUtil.copyProperties(cert,certificate); + certificate.setCertificateReport(minioMap.get(f)); + certificate.setCreateUserId(user.getId()); + certificate.setCreateUserName(user.getName()); + certificate.setCreateDeptId(user.getDeptId()); + certificate.setCreateTime(new Date()); + certificate.setUpdateTime(new Date()); + resultList.add(certificate); + }); + }); + // 保存证书信息 + this.saveBatch(resultList); + // 取最新的证书更新设备信息 + Map> equipmentMaps = resultList.stream().collect(Collectors.groupingBy(SubcontractCertificate::getEquipmentId)); + for (Long equipmentId : equipmentMaps.keySet()) { + List subList = equipmentMaps.get(equipmentId); + if(subList.size() > 1){ + subList.sort(Comparator.comparing(SubcontractCertificate::getCertificateValid)); + } + SubcontractCertificate latest = subList.get(subList.size()-1); + equipmentInfoService.updateCertificateInfo(equipmentId,latest.getSubcontractorName(),latest.getCheckDate(),latest.getCertificateValid(),latest.getMeterIdentify()); + } + } + + @Override @Transactional public void saveOrUpdateInfo(SubcontractCertificate entity) { @@ -63,16 +259,33 @@ } @Override - public Page listScopePage(Page page, String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd) { + public Page listScopePage(Page page, String certificateNo, String certificateName, + String equipmentNo, String equipmentName, String subcontractorName, + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd) { DataScope dataScope = permissionContext.getAuthService().getLoginUserDataScope(); dataScope.setScopeName("c.create_dept_id"); - QueryWrapper queryWrapper = commonQuery(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd); - page.setRecords(this.baseMapper.listScopePage(dataScope,page,queryWrapper)); + QueryWrapper queryWrapper = commonQuery(certificateNo, certificateName, equipmentNo, + equipmentName, subcontractorName, createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd); + List list = this.baseMapper.listScopePage(dataScope,page,queryWrapper); + for (SubcontractCertificate certificate : list) { + warp(certificate); + } + page.setRecords(list); return page; } @Override - public List listScope(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd, List ids) { + public List listScope(String certificateNo, String certificateName, String equipmentNo, + String equipmentName, String subcontractorName, + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd, + List ids) { DataScope dataScope = permissionContext.getAuthService().getLoginUserDataScope(); dataScope.setScopeName("c.create_dept_id"); QueryWrapper queryWrapper; @@ -80,9 +293,23 @@ queryWrapper = new QueryWrapper<>(); queryWrapper.in("c.id",ids); }else { - queryWrapper = commonQuery(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, createTimeStart, createTimeEnd); + queryWrapper = commonQuery(certificateNo, certificateName, equipmentNo, equipmentName, subcontractorName, + createTimeStart, createTimeEnd, + equipmentManufactureNo,certificateValidStart,certificateValidEnd,checkDateStart,checkDateEnd); } - return this.baseMapper.listScope(dataScope,queryWrapper); + List list = this.baseMapper.listScope(dataScope,queryWrapper); + for (SubcontractCertificate certificate : list) { + warp(certificate); + } + return list; + } + + public void warp(SubcontractCertificate i) { + try { + DictCodeUtils.convertDictCodeToName(i); + } catch (Exception e) { + throw new RuntimeException(e); + } } @Override @@ -95,7 +322,12 @@ return this.baseMapper.listByEquipment(equipmentId); } - private QueryWrapper commonQuery(String certificateNo, String certificateName, String equipmentNo, String equipmentName, String subcontractorName, String createTimeStart, String createTimeEnd){ + private QueryWrapper commonQuery(String certificateNo, String certificateName, String equipmentNo, + String equipmentName, String subcontractorName, + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart,String certificateValidEnd, + String checkDateStart, String checkDateEnd){ QueryWrapper queryWrapper = new QueryWrapper<>(); if(StrUtil.isNotEmpty(certificateNo)){ queryWrapper.like("c.certificate_no",certificateNo); @@ -109,6 +341,9 @@ if(StrUtil.isNotEmpty(equipmentName)){ queryWrapper.like("e.equipment_name",equipmentName); } + if(StrUtil.isNotEmpty(equipmentManufactureNo)){ + queryWrapper.like("e.manufacture_no",equipmentManufactureNo); + } if(StrUtil.isNotEmpty(subcontractorName)){ queryWrapper.like("s.company_name",subcontractorName); } @@ -118,6 +353,10 @@ if(StrUtil.isNotEmpty(createTimeEnd)){ queryWrapper.le("c.create_time",createTimeEnd); } + queryWrapper.ge(StrUtil.isNotEmpty(certificateValidStart),"c.certificate_valid",certificateValidStart); + queryWrapper.le(StrUtil.isNotEmpty(certificateValidEnd),"c.certificate_valid",certificateValidEnd); + queryWrapper.ge(StrUtil.isNotEmpty(checkDateStart),"c.check_date",checkDateStart); + queryWrapper.le(StrUtil.isNotEmpty(checkDateEnd),"c.check_date",checkDateEnd); return queryWrapper; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/subcontract/ISubcontractCertificateService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/subcontract/ISubcontractCertificateService.java index a8f9747..6c8563c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/subcontract/ISubcontractCertificateService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/subcontract/ISubcontractCertificateService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; /** @@ -19,20 +20,27 @@ */ public interface ISubcontractCertificateService extends IService { - ReturnDTO batchImport(MultipartFile file); + ReturnDTO batchImport(MultipartFile file) throws IOException; void saveOrUpdateInfo(SubcontractCertificate subcontractCertificate); void removeInfo(Long id); - Page listScopePage(Page page,String certificateNo,String certificateName, - String equipmentNo,String equipmentName,String subcontractorName, - String createTimeStart,String createTimeEnd); + Page listScopePage(Page page, String certificateNo, String certificateName, + String equipmentNo, String equipmentName, String subcontractorName, + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart, String certificateValidEnd, + String checkDateStart, String checkDateEnd + ); - List listScope(String certificateNo,String certificateName, - String equipmentNo,String equipmentName,String subcontractorName, - String createTimeStart,String createTimeEnd, - List ids); + List listScope(String certificateNo, String certificateName, + String equipmentNo, String equipmentName, String subcontractorName, + String createTimeStart, String createTimeEnd, + String equipmentManufactureNo, + String certificateValidStart, String certificateValidEnd, + String checkDateStart, String checkDateEnd, + List ids); List listBySubcontractor(Long subcontractorId);