From 3cfdf020e7f3c5fcef3a4b48e8532704b5b8b83b Mon Sep 17 00:00:00 2001 From: zhuo <2089219845@qq.com> Date: 星期四, 20 二月 2025 13:20:16 +0800 Subject: [PATCH] 设备移植 --- cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java | 20 cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java | 94 + cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java | 10 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java | 16 cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml | 17 cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java | 45 pom.xml | 8 cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java | 15 cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java | 861 +++++++++++++++ cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java | 28 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java | 5 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java | 492 +++++++++ cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java | 89 + cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java | 22 cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java | 115 ++ cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java | 38 cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java | 34 cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java | 55 + cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java | 77 + cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java | 36 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java | 44 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java | 19 cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java | 138 ++ basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java | 2 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java | 14 cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java | 14 cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java | 23 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java | 43 ruoyi-admin/pom.xml | 7 cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java | 59 + cnas-device/pom.xml | 28 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java | 43 cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java | 75 + cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java | 80 + cnas-device/src/main/resources/mapper/DeviceMapper.xml | 189 +++ inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java | 26 cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java | 45 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java | 205 +++ cnas-device/src/main/resources/mapper/DataConfigMapper.xml | 50 cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java | 12 40 files changed, 3,176 insertions(+), 17 deletions(-) diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java index b50d427..5b0b1cd 100644 --- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java +++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardProductListServiceImpl.java @@ -139,7 +139,7 @@ } return true; }).peek(standardProductList -> { - // todo: 鍒ゆ柇鏄惁鏄師鏉愪笅鍗�, 闇�瑕佸晩鎶婇鑹茬粦瀹氬埌璇曟牱棰滆壊鐨勮姹傚�间笂 + //鍒ゆ柇鏄惁鏄師鏉愪笅鍗�, 闇�瑕佸晩鎶婇鑹茬粦瀹氬埌璇曟牱棰滆壊鐨勮姹傚�间笂 if (StringUtils.isNotBlank(insSample.getPartNo())) { // 鍒ゆ柇鏄惁鏈夎繖涓瓧娈典笖鏄枃鏈被鍨� if (StringUtils.isNotBlank(standardProductList.getInspectionItem()) diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml new file mode 100644 index 0000000..4aee7af --- /dev/null +++ b/cnas-device/pom.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>ruoyi</artifactId> + <groupId>com.ruoyi</groupId> + <version>3.8.9</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>cnas-device</artifactId> + + <dependencies> + + <!--涓氬姟妯″潡--> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>inspect-server</artifactId> + </dependency> + </dependencies> + + <properties> + <maven.compiler.source>8</maven.compiler.source> + <maven.compiler.target>8</maven.compiler.target> + </properties> + +</project> diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java new file mode 100644 index 0000000..36b2341 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java @@ -0,0 +1,205 @@ +package com.ruoyi.device.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.device.dto.DataConfigDto; +import com.ruoyi.device.dto.DeviceCollectionDto; +import com.ruoyi.device.dto.DeviceDto; +import com.ruoyi.device.pojo.DataConfig; +import com.ruoyi.device.pojo.Device; +import com.ruoyi.device.service.DataConfigService; +import com.ruoyi.device.service.DeviceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 璁惧(DeviceController)琛ㄦ帶鍒跺眰 + */ +@Api(tags = "璁惧") +@RestController +@RequestMapping("/deviceScope") +public class DeviceController { + + @Resource + private DeviceService deviceService; + + @Value("${file.path}") + private String filePath; + + @Value("${wordUrl}") + private String wordUrl; + + @Autowired + private DataConfigService dataConfigService; + + + @ApiOperation(value = "鏌ョ湅璁惧浜岀淮鐮佹寜閽�") + @GetMapping("/showDeviceQrCodeButton") + public void showDeviceQrCodeButton() { } + + //璁惧宸ュ叿鏄庣粏 + + @ApiOperation(value = "鏌ヨ璁惧璇︽儏鍒楄〃") + @GetMapping("/selectDeviceParameter") + public Result selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull){ + return Result.success(deviceService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull)); + } + + @ApiOperation(value = "娣诲姞璁惧璇︽儏鍙傛暟") + @PostMapping("/addDeviceParameter") + public Result addDeviceParameter(@RequestBody Device itemParameter) { + return Result.success(deviceService.addDeviceParameter(itemParameter)); + } + + @ApiOperation(value = "鍒犻櫎璁惧璇︽儏鍙傛暟") + @DeleteMapping("/delDeviceParameter") + public Result<?> delDeviceParameter(Integer id) { + return Result.success(deviceService.delDeviceParameter(id)); + } + + @ApiOperation(value = "淇敼璁惧璇︽儏鍙傛暟") + @PostMapping("/upDeviceParameter") + public Result<?> upDeviceParameter(@RequestBody Device itemParameter) { + return Result.success(deviceService.upDeviceParameter(itemParameter)); + } + + @ApiOperation(value = "鑾峰彇璁惧鎬昏") + @GetMapping("/selectEquipmentOverview") + public Result selectEquipmentOverview() { + return Result.success(deviceService.selectEquipmentOverview()); + } + + @ApiOperation(value = "鑾峰彇琚巿鏉冧汉") + @GetMapping("/authorizedPerson") + public Result authorizedPerson() { + return Result.success(deviceService.authorizedPerson()); + } + + @ApiOperation(value = "鎼滅储") + @GetMapping("/search") + public Result search(Integer status, String deviceName, String specificationModel, String largeCategory) { + return Result.success(deviceService.search(status, deviceName, specificationModel, largeCategory)); + } + + //鍥剧墖涓婁紶 + @ApiOperation(value = "璁惧鏂囦欢涓婁紶") + @PostMapping("/uploadFile") + public Result uploadFile(MultipartFile file) { + String urlString; + String pathName; + String filename = file.getOriginalFilename(); + String path; + try { + String contentType = file.getContentType(); + if (contentType != null && contentType.startsWith("image/")) { + // 鏄浘鐗� + path = filePath; + } else { + // 鏄枃浠� + path = wordUrl; + } + + File realpath = new File(path); + if (!realpath.exists()) { + realpath.mkdirs(); + } + pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "-" + file.getOriginalFilename(); + urlString = realpath + "/" + pathName; + file.transferTo(new File(urlString)); + HashMap<String, String> map = new HashMap<>(); + map.put("name", filename); + map.put("url", pathName); + return Result.success(map); + } catch (Exception e) { + e.printStackTrace(); + System.err.println("鏂囦欢涓婁紶閿欒"); + return null; + } + } + + @ApiOperation(value = "鑾峰彇璁惧璐熻矗浜�") + @GetMapping("/selectDevicePrincipal") + public Result selectDevicePrincipal() { + return Result.success(deviceService.selectDevicePrincipal()); + } + + @ApiOperation(value = "閫氳繃椤圭洰鑾峰彇璁惧鍒楄〃") + @GetMapping("/selectDeviceByCategory") + public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory) { + return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,laboratory)); + } + + @ApiOperation(value = "閫氳繃璁惧缂栧彿鑾峰彇璁惧鍒楄〃") + @GetMapping("/selectDeviceByCode") + public Result<DeviceDto> selectDeviceByCode(Integer id) { + return Result.success(deviceService.selectDeviceByCode(id)); + } + + + @ApiOperation("/鏁伴噰-鏁版嵁閲囬泦") + @PostMapping("/dataCollection") + public Result<?> dataAcquisition(HttpServletRequest request,@RequestBody DeviceCollectionDto dto) { + return deviceService.dataAcquisition(request, dto); + } + + @ApiOperation(value = "缁存姢鏁伴噰閰嶇疆") + @PostMapping("/saveDataAcquisitionConfiguration") + public Result<?> saveDataAcquisitionConfiguration(@RequestParam(value = "deviceId") Integer deviceId, @RequestBody DataConfigDto dataConfigList) { + dataConfigService.saveDataAcquisitionConfiguration(deviceId, dataConfigList); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ鏁伴噰閰嶇疆") + @GetMapping("/queryDataAcquisitionConfiguration") + public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) { + return dataConfigService.queryDataAcquisitionConfiguration(dataConfig); + } + + + @ApiOperation(value = "鍒犻櫎鏁伴噰閰嶇疆") + @DeleteMapping("/deleteDataAcquisitionConfiguration") + public Result<?> deleteDataAcquisitionConfiguration(@RequestParam("ids") String ids) { + List<String> split = Arrays.asList(ids.split(",")); + List<String> collect = split.stream().distinct().collect(Collectors.toList()); + dataConfigService.removeBatchByIds(collect); + return Result.success(); + } + + + + @ApiOperation(value = "宸︿晶璁惧鏍戝舰鏍�") + @GetMapping("/treeDevice") + public Result treeDevice(String deviceName) { + return Result.success(deviceService.treeDevice(deviceName)); + } + + + @ApiOperation(value = "璁惧妗f瀵煎嚭") + @GetMapping("/exportDeviceFile") + public void exportDeviceFile(@RequestParam Integer deviceId, HttpServletResponse response) throws Exception { + deviceService.exportDeviceFile(deviceId,response); + } + + @ApiOperation(value = "浠櫒璁惧涓�瑙堣〃瀵煎嚭") + @GetMapping("/exportEquipmentDetails") + public void exportEquipmentDetails(HttpServletResponse response) throws Exception { + deviceService.exportEquipmentDetails(response); + } +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java new file mode 100644 index 0000000..ea630ea --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java @@ -0,0 +1,36 @@ +package com.ruoyi.device.dto; + +import com.ruoyi.device.pojo.DataConfig; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class DataConfigDto { + + private List<DataConfig> dataConfigList; + + private Boolean isDevice; + + @ApiModelProperty("鏂囦欢鍚庣紑") + private String fileType; + + @ApiModelProperty("閲囬泦鍦板潃") + private String collectUrl; + + @ApiModelProperty("瀛樺偍鍦板潃") + private String storageUrl; + + @ApiModelProperty("璁惧IP") + private String ip; + + @ApiModelProperty("鏁伴噰-濮旀墭瀛楁") + private String entrustCode; + + @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁") + private String sampleCode; + + @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О") + private String dbFileName; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java new file mode 100644 index 0000000..29a7c53 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java @@ -0,0 +1,28 @@ +package com.ruoyi.device.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 璁惧閲囬泦瀵硅薄 + * + * @Author zhuo + * @Date 2024/12/3 + */ +@Data +public class DeviceCollectionDto { + + @ApiModelProperty(value = "鏍峰搧id") + private Integer id; + + @ApiModelProperty(value = "璁㈠崟缂栧彿") + private String entrustCode; + + @ApiModelProperty(value = "鏍峰搧缂栧彿") + private String sampleCode; + + @ApiModelProperty(value = "閲囬泦鐨勬楠岄」id") + private List<Integer> itemIds; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java new file mode 100644 index 0000000..e9034d4 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java @@ -0,0 +1,77 @@ +package com.ruoyi.device.dto; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DeviceConfigDtoPage{ + + @ApiModelProperty(value = "璁惧鍚嶇О") + private String deviceName; + + @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛") + @TableField(fill = FieldFill.INSERT) + private Integer createUser; + + @ApiModelProperty(value = "鏂囦欢鍚庣紑") + private String fileType; + + @ApiModelProperty(value = "閲囬泦鍦板潃") + private String collectUrl; + + @ApiModelProperty(value = "瀛樺偍鍦板潃") + private String storageUrl; + + @ApiModelProperty(value = "IP鍦板潃") + private String ip; + + @ApiModelProperty(value = "妫�楠岄」鍒嗙被") + private String inspectionItemClass; + + @ApiModelProperty(value = "妫�楠岄」") + private String inspectionItem; + + @ApiModelProperty(value = "妫�楠岄」瀛愰」") + private String inspectionItemSubclass; + + @ApiModelProperty(value = "鍏紡") + private String formula; + + @ApiModelProperty(value = "鍙傜収X") + private String referx; + + @ApiModelProperty(value = "X") + private String x; + + @ApiModelProperty(value = "鍙傜収Y") + private String refery; + + + @ApiModelProperty(value = "Y") + private String y; + + @ApiModelProperty(value = "鍒悕") + private String anotherName; + + @ApiModelProperty(value = "鍖归厤鍚嶇О") + private String matchingName; + + private Integer id; + + @ApiModelProperty(value = "妫�楠屽璞�") + private String sample; + + @ApiModelProperty(value = "妫�楠岄」鐩甶d") + private Integer structureItemParameterId; + + @ApiModelProperty("鏁伴噰-濮旀墭瀛楁") + private String entrustCode; + + @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁") + private String sampleCode; + + @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О") + private String dbFileName; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java new file mode 100644 index 0000000..da16e75 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java @@ -0,0 +1,43 @@ +package com.ruoyi.device.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.device.pojo.Device; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DeviceDto extends Device { + + @ApiModelProperty(value = "绠$悊浜�") + private String equipmentManagerUser; + + @ApiModelProperty(value = "鎵�灞為儴闂�") + @JsonInclude(JsonInclude.Include.NON_NULL) + private String laboratoryName; + + @ApiModelProperty(value = "妫�楠岄」鐩�") + private String insProductItem; + + @ApiModelProperty(value = "绠$悊浜哄鍚�") + private String equipmentManagerName; + + @ApiModelProperty(value = "琚巿鏉冧汉濮撳悕") + private String authorizedPersonName; + + @ApiModelProperty(value = "鏍稿噯璇佷功缂栧彿") + private String calibrateNo; + + @ApiModelProperty(value = "鏈�杩戞牎鍑嗘棩鏈�") + private LocalDateTime lastCalibrationDateTwo; + + @ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡") + private LocalDateTime nextCalibrationDateTwo; + + +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java new file mode 100644 index 0000000..d02ecdf --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java @@ -0,0 +1,19 @@ +package com.ruoyi.device.dto; + +import com.ruoyi.device.pojo.Device; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Author: yuan + * Date: 2024-12-10 鏄熸湡浜� 15:55:29 + * Description: + */ +@Data +public class DeviceExport extends Device { + @ApiModelProperty("绠$悊浜�") + private String equipmentManagerName; + + @ApiModelProperty("搴忓彿") + private Integer index; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java new file mode 100644 index 0000000..da58c09 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java @@ -0,0 +1,38 @@ +package com.ruoyi.device.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Author: yuan + * Date: 2024-12-13 鏄熸湡浜� 10:43:06 + * Description: 浠櫒璁惧妗f鍗′腑鏄剧ず鐨勮澶囨牎鍑嗚褰曞拰缁存姢璁板綍鐨勫垪琛ㄥ璞� + */ +@Data +public class DeviceMetricRecordAndMaintenanceDto { + @ApiModelProperty("搴忓彿") + private Integer index; + + // 鏍″噯琛ㄤ腑鐨勬暟鎹� + @ApiModelProperty("鏍″噯鏃ユ湡") + private String calibrationDateString; + + @ApiModelProperty("璇佷功鏍囧彿") + private String certificateNumber; + + @ApiModelProperty("鏍″噯鏈夋晥鏃ユ湡") + private String validityDateString; + + @ApiModelProperty("鍒ゅ畾") + private String judgement; + + // 缁翠慨璁板綍琛ㄤ腑鐨勬暟鎹� + @ApiModelProperty("缁翠慨鏃ユ湡") + private String maintenanceDateString; + + @ApiModelProperty("澶勭悊鏂瑰紡") + private String handlingMethod; + + @ApiModelProperty("澶囨敞") + private String comments; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java new file mode 100644 index 0000000..0db811c --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java @@ -0,0 +1,45 @@ +package com.ruoyi.device.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Author: yuan + * Date: 2024-12-13 鏄熸湡浜� 8:45:34 + * Description: 鐢ㄤ簬浠櫒璁惧妗f鍗$殑瀵煎嚭 + */ +@Data +public class DocumentExportWordDto { + + // 璁惧妗f宸﹀垪琛� + @ApiModelProperty("搴忓彿") + private Integer index1; + + @ApiModelProperty("妗f鍚嶇О") + private String name1; + + @ApiModelProperty("浠芥暟") + private Integer quantity1; + + @ApiModelProperty("椤电爜") + private Integer pageCount1; + + @ApiModelProperty("褰掓。鏃ユ湡") + private String archiveDateString1; + + // 璁惧妗f鍙冲垪琛� + @ApiModelProperty("搴忓彿") + private Integer index2; + + @ApiModelProperty("妗f鍚嶇О") + private String name2; + + @ApiModelProperty("浠芥暟") + private Integer quantity2; + + @ApiModelProperty("椤电爜") + private Integer pageCount2; + + @ApiModelProperty("褰掓。鏃ユ湡") + private String archiveDateString2; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java new file mode 100644 index 0000000..d2cde7e --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java @@ -0,0 +1,45 @@ +package com.ruoyi.device.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +@Data +public class DeviceMaintenanceExport { + + @ColumnWidth(20) + @ExcelProperty("璁惧鍚嶇О") + private String deviceName; + + @ColumnWidth(20) + @ExcelProperty("娴佺▼缂栧彿") + private String deviceNumber; + + @ColumnWidth(20) + @ExcelProperty("绠$悊缂栧彿") + private String managementNumber; + + @ColumnWidth(50) + @ExcelProperty("缁存姢鍐呭") + private String content; + + @ColumnWidth(20) + @ExcelProperty("缁存姢鏃堕棿") + private String date; + + @ColumnWidth(20) + @ExcelProperty("涓嬫缁存姢鏃堕棿") + private String nextDate; + + @ColumnWidth(20) + @ExcelProperty("缁存姢绫诲瀷") + private String maintenanceType; + + @ColumnWidth(20) + @ExcelProperty("缁存姢浜�") + private String name; + + @ColumnWidth(50) + @ExcelProperty("澶囨敞") + private String comments; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java new file mode 100644 index 0000000..7392b4e --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.device.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.device.pojo.CollectBridge; + +/** + * 鏁板瓧鐢垫ˉ閲囬泦 + * + * @author zhuo + * @since 2025-02-19 + */ +public interface CollectBridgeMapper extends BaseMapper<CollectBridge> { + +} + diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java new file mode 100644 index 0000000..e810e5c --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.device.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.device.dto.DeviceConfigDtoPage; +import com.ruoyi.device.pojo.DataConfig; + +import java.util.List; + +/** + * <p> + * Mapper 鎺ュ彛 + * </p> + * + * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃 + * @since 2024-07-13 12:23:00 + */ +public interface DataConfigMapper extends BaseMapper<DataConfig> { + + List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId); + + List<Integer> deleteDataConfig(); +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java new file mode 100644 index 0000000..0297885 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.device.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.device.excel.DeviceMaintenanceExport; +import com.ruoyi.device.pojo.DeviceMaintenance; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 璁惧缁存姢淇濆吇 + */ +@Mapper +public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> { + List<DeviceMaintenance> getDeviceMaintenanceParam(); + + + List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId); +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java new file mode 100644 index 0000000..2f2c500 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java @@ -0,0 +1,43 @@ +package com.ruoyi.device.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.device.dto.DeviceDto; +import com.ruoyi.device.pojo.Device; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 璁惧(Device)琛ㄦ暟鎹簱璁块棶灞� + */ +public interface DeviceMapper extends BaseMapper<Device> { + + IPage<Device> selectDeviceParameter(Page page, QueryWrapper<Device> ew); + List<Device> selectEquipmentOverview(Page page, QueryWrapper<Device> ew); + + //鑾峰彇琚巿鏉冧汉 + List<Device> authorizedPerson(); + + //鏌ヨ + List<Device> search(@Param(value = "status") Integer status, @Param(value = "deviceName") String deviceName, + @Param(value = "specificationModel") String specificationModel, @Param(value = "largeCategory") String largeCategory); + + //鑾峰彇鍥剧墖鏁版嵁 + void selectDeviceImage(@Param(value = "name") String name ,@Param(value = "id") Integer id); + + //鏌ヨ璁惧璐熻矗浜� + List<Device> selectDevicePrincipal(); + + IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers, @Param("laboratoryNameIsNull") Boolean laboratoryNameIsNull); + + List<Map<String, Object>> getInspectionItemSubclass(@Param("id") Integer id); + + List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName); + + DeviceDto selectDeviceByCode(Integer id); +} + diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java new file mode 100644 index 0000000..bc4bc28 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java @@ -0,0 +1,16 @@ +package com.ruoyi.device.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.device.pojo.DeviceMetricRecord; + +/** + * <p> + * 璁惧鏍″噯 - 鏍″噯璁板綍 Mapper 鎺ュ彛 + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-09-27 10:20:01 + */ +public interface DeviceMetricRecordMapper extends BaseMapper<DeviceMetricRecord> { + +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java new file mode 100644 index 0000000..d2fc7d0 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DocumentMapper.java @@ -0,0 +1,12 @@ +package com.ruoyi.device.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.device.pojo.Document; +import org.apache.ibatis.annotations.Mapper; + +/** + * 璁惧妗f + */ +@Mapper +public interface DocumentMapper extends BaseMapper<Document> { +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java new file mode 100644 index 0000000..3d02bbe --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java @@ -0,0 +1,34 @@ +package com.ruoyi.device.pojo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 鏁板瓧鐢垫ˉ閲囬泦 + * + * @author zhuo + * @since 2025-02-19 + */ +@Data +@TableName("collect_bridge") +public class CollectBridge { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("濮旀墭缂栧彿") + private String entrustCode; + + @ApiModelProperty("閲囬泦鍊�") + private String collectValue; + + @ApiModelProperty("鏃堕棿") + private LocalDateTime collectDate; + +} + diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java new file mode 100644 index 0000000..547679d --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java @@ -0,0 +1,80 @@ +package com.ruoyi.device.pojo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * <p> + * + * </p> + * + * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃 + * @since 2024-07-13 12:23:00 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@TableName("device_data_config") +@ApiModel(value = "DataConfig瀵硅薄", description = "") +public class DataConfig implements Serializable { + + @ApiModelProperty("涓婚敭id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("鍏紡") + private String formula; + + @ApiModelProperty("鍙傜収X") + private String referx; + + @ApiModelProperty("鍙傜収Y") + private String refery; + + @ApiModelProperty("x") + private String x; + + @ApiModelProperty("y") + private String y; + + @ApiModelProperty("璁惧id") + private Integer deviceId; + + @ApiModelProperty("妫�楠岄」鍒嗙被") + private String inspectionItemClass; + + @ApiModelProperty("妫�楠岄」鐩�") + private String inspectionItem; + + @ApiModelProperty("妫�楠岄」瀛愰」") + private String inspectionItemSubclass; + + @TableField(exist = false) + @ApiModelProperty("妫�楠岄」瀛愰」") + private String insProductItem; + + @ApiModelProperty("妫�楠岄」id") + private Integer structureItemParameterId; + + @ApiModelProperty("搴忓彿") + private String serialNumber; + + @ApiModelProperty("鍒悕") + private String anotherName; + + @ApiModelProperty("鍖归厤鍚嶇О") + private String matchingName; + + @TableField(select = false, exist = false) + private Boolean isDevice; + +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java new file mode 100644 index 0000000..d403f5a --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java @@ -0,0 +1,138 @@ +package com.ruoyi.device.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 璁惧(Device)琛ㄥ璞� + */ +@TableName(value = "device") +@Data +public class Device implements Serializable { + + @ApiModelProperty(value = "涓婚敭") + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "璁惧鍚嶇О") + private String deviceName; + + @ApiModelProperty(value = "en璁惧鍚嶇О") + private String enDeviceName; + + @ApiModelProperty(value = "瑙勬牸鍨嬪彿") + private String specificationModel; + + @ApiModelProperty(value = "鐢熶骇鍘傚") + private String manufacturer; + + @ApiModelProperty(value = "鍑哄巶缂栧彿") + private String factoryNo; + + @ApiModelProperty(value = "绠$悊缂栧彿") + private String managementNumber; + + @ApiModelProperty(value = "鎶�鏈寚鏍�") + private String technicalIndicators; + + @ApiModelProperty(value = "璐疆鏃ユ湡") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime acquisitionDate; + + @ApiModelProperty(value = "鏍″噯鏈夋晥鏃ユ湡") + private LocalDateTime activationDate; + + @ApiModelProperty(value = "绠$悊浜篒d") + private Integer equipmentManager; + + @ApiModelProperty(value = "瀛樻斁鐐�") + private String storagePoint; + + @ApiModelProperty(value = "鎵�灞為儴闂↖d") + private Integer subordinateDepartmentsId; + + @ApiModelProperty(value = "妫�楠岄」鐩甀d") + private String insProductIds; + + @ApiModelProperty(value = "鏍″噯鏈嶅姟鏈烘瀯") + private String calibrationServices; + + @ApiModelProperty(value = "鏈�杩戞牎鍑嗘棩鏈�") + private LocalDateTime lastCalibrationDate; + + @ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡") + private LocalDateTime nextCalibrationDate; + + @ApiModelProperty(value = "璁惧绫诲瀷") + private String largeCategory; + + @ApiModelProperty(value = "鍗曚环") + private BigDecimal unitPrice; + + @ApiModelProperty(value = "璁惧鐘舵��") + private Integer deviceStatus; + + @ApiModelProperty(value = "鏍″噯鍛ㄦ湡(鏈�)") + private String calibrationDate; + + @ApiModelProperty(value = "鍥剧墖涓婁紶") + private String imageUpload; + + @ApiModelProperty(value = "鍥剧墖澶囨敞") + private String imageName; + + @ApiModelProperty(value = "鍒涘缓浜篿d") + @TableField(fill = FieldFill.INSERT) + private Integer createUser; + + @ApiModelProperty(value = "鏇存柊鏃堕棿") + @TableField(fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + @ApiModelProperty(value = "鍒涘缓鏃堕棿") + @TableField(fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + @ApiModelProperty("鏁伴噰-鏂囦欢鍚庣紑") + private String fileType; + + @ApiModelProperty("鏁伴噰-閲囬泦鍦板潃") + private String collectUrl; + + @ApiModelProperty("鏁伴噰-瀛樺偍鍦板潃") + private String storageUrl; + + @ApiModelProperty("鏁伴噰-璁惧IP") + private String ip; + + @ApiModelProperty("鏁伴噰-鏄惁涓烘暟閲囪澶�") + @TableField(exist = false) + private Boolean isItADataAcquisitionDevice; + + @ApiModelProperty("鏁伴噰-濮旀墭瀛楁") + private String entrustCode; + + @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁") + private String sampleCode; + + @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О") + private String dbFileName; + + @ApiModelProperty("琚巿鏉冧汉") + private String authorizedPerson; + + @ApiModelProperty("璧勪骇缂栫爜") + private String assetCode; + + @ApiModelProperty("浜у湴") + private String origin; + +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java new file mode 100644 index 0000000..bf3c6c6 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java @@ -0,0 +1,44 @@ +package com.ruoyi.device.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +/** + * 璁惧缁存姢淇濆吇 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("device_maintenance") +public class DeviceMaintenance { + + //璁惧id + @TableId(type = IdType.AUTO) + private Integer id; + + private Integer deviceId; + + private String deviceName; + //缂栧彿 + private String deviceNumber; + //缁熶竴缂栧彿 + private String managementNumber; + //缁存姢鍐呭 + private String content; + //缁存姢鏃ユ湡 + @TableField(fill = FieldFill.INSERT) + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate date; + //涓嬫缁存姢鏃ユ湡 + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate nextDate; + //缁存姢绫诲瀷 + private Integer maintenanceType; + //缁存姢浜哄憳 + private String name; + //澶囨敞 + private String comments; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java new file mode 100644 index 0000000..5855ca2 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java @@ -0,0 +1,89 @@ +package com.ruoyi.device.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * <p> + * 璁惧鏍″噯 - 鏍″噯璁板綍 + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-09-27 10:20:01 + */ +@Getter +@Setter +@TableName("device_metric_record") +@ApiModel(value = "DeviceMetricRecord瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍") +public class DeviceMetricRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("涓婚敭id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("璁板綍缂栧彿") + private String processNumber; + + @ApiModelProperty("璁¢噺鍗曚綅") + private String unitOfMeasure; + + @ApiModelProperty("鏍″噯鏃ユ湡") + private Date calibrationDate; + + @ApiModelProperty("涓嬫鏍″噯鏃ユ湡") + private Date nextCalibrationDate; + + @ApiModelProperty("璁$畻鍣ㄥ叿") + private String calculatingApparatus; + + @ApiModelProperty("璁$畻鏍囧噯閲忕▼") + private String standardRange; + + @ApiModelProperty("璁¢噺鏍囧噯涓嶇‘瀹氬害") + private String calibrationStandardUncertainty; + + @ApiModelProperty("渚濇嵁鏂囦欢") + private String byDocument; + + @ApiModelProperty("璇佷功缂栧彿") + private String certificateSerialNumber; + + @ApiModelProperty("鐘舵��") + private String status; + + @ApiModelProperty("鍘熸枃浠跺悕绉�") + private String fileName; + + @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О") + private String systemFileName; + + @ApiModelProperty("澶囨敞") + private String remark; + + @ApiModelProperty("璁惧id") + private Integer deviceId; + + @ApiModelProperty("鍒涘缓鏃堕棿 / 鐧昏鏃ユ湡") + @JsonFormat(pattern = "yyyy-MM-dd") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + @ApiModelProperty("鐧昏浜�") + private String createUser; + + @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�") + private String type; + + @ApiModelProperty("纭鏃堕棿") + private Date confirmDate; +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java new file mode 100644 index 0000000..25ab334 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/Document.java @@ -0,0 +1,94 @@ +package com.ruoyi.device.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + + +/** + * 璁惧妗f + */ +@Data +@TableName(value = "device_documents") +public class Document implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 涓婚敭ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 鏂囨。绫诲瀷锛堟灇涓撅級 + */ + private String documentType; + + /** + * 鍚嶇О + */ + private String name; + + /** + * 鐗堟湰鍙� + */ + private String version; + + /** + * 鏁伴噺 + */ + private Integer quantity; + + /** + * 椤垫暟 + */ + private Integer pageCount; + + /** + * 鎻愪緵鍟� + */ + private String provider; + + /** + * 鎻愪緵鏃ユ湡 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime provideDate; + + /** + * 澶囨敞 + */ + private String comments; + + /** + * 鍒涘缓鏃堕棿 + */ + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createdAt; + + /** + * 鏇存柊鏃堕棿 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updatedAt; + + private int deviceId; + + @ApiModelProperty("璧勪骇缂栧彿") + private String number; + + @ApiModelProperty("鍘熷鏂囦欢鍚嶇О") + private String systemFileName; + + @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О") + private String fileName; + + +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java new file mode 100644 index 0000000..e680c0e --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java @@ -0,0 +1,23 @@ +package com.ruoyi.device.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.device.dto.DataConfigDto; +import com.ruoyi.device.pojo.DataConfig; + +/** + * <p> + * 鏈嶅姟绫� + * </p> + * + * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃 + * @since 2024-07-13 12:23:00 + */ +public interface DataConfigService extends IService<DataConfig> { + + void deleteDataConfig(); + + void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList); + + Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig); +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java new file mode 100644 index 0000000..b732701 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java @@ -0,0 +1,59 @@ +package com.ruoyi.device.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.core.domain.entity.User; +import com.ruoyi.device.dto.DeviceCollectionDto; +import com.ruoyi.device.dto.DeviceDto; +import com.ruoyi.device.pojo.Device; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 璁惧(Device)琛ㄦ湇鍔℃帴鍙� + */ +public interface DeviceService extends IService<Device> { + + + IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull); + + int addDeviceParameter(Device itemParameter); + + int delDeviceParameter(Integer id); + + int upDeviceParameter(Device itemParameter); + + List<Device> selectEquipmentOverview(); + + List<Device> authorizedPerson(); + + List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory); + + List<Device> selectDevicePrincipal(); + + List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory); + + DeviceDto selectDeviceByCode(Integer id); + + Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto); + + List<Map<String, Object>> treeDevice(String deviceName); + + /** + * 瀵煎嚭璁惧鍒楄〃 + * @param deviceId + * @param response + */ + void exportDeviceFile(Integer deviceId, HttpServletResponse response); + + /** + * 瀵煎嚭璁惧宸ュ叿鏄庣粏 + * @param response + */ + void exportEquipmentDetails(HttpServletResponse response); +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java new file mode 100644 index 0000000..bd9b275 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/DocumentService.java @@ -0,0 +1,10 @@ +package com.ruoyi.device.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.device.pojo.Document; + +/** + * 璁惧妗f + */ +public interface DocumentService extends IService<Document> { +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java b/cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java new file mode 100644 index 0000000..8ed0bfd --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/QrShowService.java @@ -0,0 +1,55 @@ +package com.ruoyi.device.service; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.device.pojo.DeviceMetricRecord; +import org.springframework.ui.Model; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Objects; +import java.util.Optional; + +public interface QrShowService { + + /** + * 璁$畻鍚敤鏃堕暱 + * @param activationDate + * @return + */ + double calcUsedYears(LocalDateTime activationDate); + + /** + * 璁$畻璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮 + * @param startDate + * @param endDate + * @return + */ + double calcDeviceNextCheckRatio(Date startDate, Date endDate); + + /** + * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍 + * @param deviceId + * @param type + * @return + */ + DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type); + + /** + * 鏍煎紡鍖栨棩鏈� + * @return + */ + String formatDate(Date date,String formatter); + + + /** + * 鏍煎紡鍖栨棩鏈� + * @return + */ + String formatDate(LocalDate date, String formatter); +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java new file mode 100644 index 0000000..1bbac34 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java @@ -0,0 +1,75 @@ +package com.ruoyi.device.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.device.dto.DataConfigDto; +import com.ruoyi.device.mapper.DataConfigMapper; +import com.ruoyi.device.mapper.DeviceMapper; +import com.ruoyi.device.pojo.DataConfig; +import com.ruoyi.device.pojo.Device; +import com.ruoyi.device.service.DataConfigService; +import lombok.AllArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * <p> + * 鏈嶅姟瀹炵幇绫� + * </p> + * + * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃 + * @since 2024-07-13 12:23:00 + */ +@Service +@AllArgsConstructor +public class DataConfigServiceImpl extends ServiceImpl<DataConfigMapper, DataConfig> implements DataConfigService { + + private DeviceMapper deviceMapper; + + private DataConfigMapper dataConfigMapper; + + @Override + public void deleteDataConfig() { + List<Integer> integers = dataConfigMapper.deleteDataConfig(); + if (!integers.isEmpty()) { + dataConfigMapper.deleteBatchIds(integers); + } + } + + @Override + public void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList) { + if (dataConfigList.getIsDevice()) { + Device device = new Device(); + BeanUtils.copyProperties(dataConfigList, device); + device.setId(deviceId); + deviceMapper.updateById(device); + } else { + this.saveOrUpdateBatch(dataConfigList.getDataConfigList()); + } + } + + @Override + public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) { + if (dataConfig.getIsDevice()) { + LambdaQueryWrapper<DataConfig> wrapper = Wrappers.<DataConfig>lambdaQuery() + .eq(DataConfig::getDeviceId, dataConfig.getDeviceId()) + .eq(DataConfig::getInspectionItem, dataConfig.getInspectionItem()) + .eq(DataConfig::getInspectionItemSubclass, dataConfig.getInspectionItemSubclass()); + if (StringUtils.isNotBlank(dataConfig.getInspectionItemClass())) { + wrapper.eq(DataConfig::getInspectionItemClass, dataConfig.getInspectionItemClass()); + } + if (dataConfig.getStructureItemParameterId() != null) { + wrapper.eq(DataConfig::getStructureItemParameterId, dataConfig.getStructureItemParameterId()); + } + List<DataConfig> list = baseMapper.selectList(wrapper); + return Result.success(list); + } else { + return Result.success(dataConfigMapper.selectDataConfigList(dataConfig.getDeviceId())); + } + } +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java new file mode 100644 index 0000000..2192576 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java @@ -0,0 +1,492 @@ +package com.ruoyi.device.service.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.ruoyi.basic.mapper.StructureItemParameterMapper; +import com.ruoyi.basic.pojo.StructureItemParameter; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.core.domain.entity.User; +import com.ruoyi.common.utils.QueryWrappers; +import com.ruoyi.device.dto.*; +import com.ruoyi.device.mapper.CollectBridgeMapper; +import com.ruoyi.device.mapper.DeviceMaintenanceMapper; +import com.ruoyi.device.mapper.DeviceMapper; +import com.ruoyi.device.mapper.DeviceMetricRecordMapper; +import com.ruoyi.device.pojo.*; +import com.ruoyi.device.service.DataConfigService; +import com.ruoyi.device.service.DeviceService; +import com.ruoyi.device.service.DocumentService; +import com.ruoyi.device.utils.DataAcquisition; +import com.ruoyi.framework.exception.ErrorException; +import com.ruoyi.inspect.mapper.InsSampleMapper; +import com.ruoyi.inspect.pojo.InsProduct; +import com.ruoyi.inspect.util.HackLoopTableRenderPolicy; +import com.ruoyi.system.mapper.UserMapper; +import lombok.AllArgsConstructor; +import org.apache.logging.log4j.util.Strings; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 璁惧(Device)琛ㄦ湇鍔″疄鐜扮被 + */ +@Service +@AllArgsConstructor +public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService { + + private DeviceMapper deviceMapper; + + private UserMapper userMapper; + + private StructureItemParameterMapper structureItemParameterMapper; + + private DataConfigService dataConfigService; + + private QrShowServiceImpl qrShowService; + + private InsSampleMapper insSampleMapper; + + private DocumentService documentService; + + private DeviceMetricRecordMapper deviceMetricRecordMapper; + + private DeviceMaintenanceMapper deviceMaintenanceMapper; + + private CollectBridgeMapper collectBridgeMapper; + + @Override + public IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) { + IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull); + return iPage; + } + + @Override + public int addDeviceParameter(Device itemParameter) { + return deviceMapper.insert(itemParameter); + } + + @Override + public int delDeviceParameter(Integer id) { + return deviceMapper.deleteById(id); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public int upDeviceParameter(Device itemParameter) { + // 鍒犻櫎鏁伴噰闆嗛厤缃暟鎹� + dataConfigService.deleteDataConfig(); + // 闇�瑕佸悓鏃舵洿鏀� device琛� + + + return deviceMapper.updateById(itemParameter); + } + + @Override + public List<Device> selectEquipmentOverview() { + return deviceMapper.selectEquipmentOverview(new Page(1, 10), QueryWrappers.queryWrappers(new Device())); + } + + @Override + public List<Device> authorizedPerson() { + return deviceMapper.authorizedPerson(); + } + + @Override + public List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory) { + return deviceMapper.search(status, deviceName, specificationModel, largeCategory); + } + + @Override + public List<Device> selectDevicePrincipal() { + return deviceMapper.selectDevicePrincipal(); + } + + @Override + public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) { + List<Integer> id; + + try { + id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery() + .eq(StructureItemParameter::getInspectionItem, inspectionItem) + .eq(ObjectUtils.isNotEmpty(inspectionItemSubclass), StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass) + .eq(ObjectUtils.isNotEmpty(laboratory), StructureItemParameter::getLaboratory, laboratory) + .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList()); + } catch (Exception e) { + return null; + } + List<Device> devices = deviceMapper.selectList(Wrappers.<Device>lambdaQuery() + .eq(Device::getDeviceStatus, 0) + .isNotNull(Device::getInsProductIds)); + List<Device> devices2 = new ArrayList<>(); + for (Device device : devices) { + String[] ids = device.getInsProductIds().split(","); + for (String i : ids) { + if (ObjectUtils.isNotEmpty(i)) { + if (id.contains(Integer.parseInt(i))) { + devices2.add(device); + break; + } + } + } + } + return devices2; + } + + @Override + public DeviceDto selectDeviceByCode(Integer id) { + DeviceDto deviceDto = deviceMapper.selectDeviceByCode(id); + List<Integer> ids = new ArrayList<>(); + if (Strings.isNotEmpty(deviceDto.getAuthorizedPerson())) { + if (deviceDto.getAuthorizedPerson().equals("null")) { + deviceDto.setAuthorizedPerson("[]"); + } + ids = JSON.parseArray(deviceDto.getAuthorizedPerson(), Integer.class); + } + String name = ""; + if (!ids.isEmpty()) { + name = userMapper.selectBatchIds(ids).stream().map(User::getName).collect(Collectors.joining(",")); + } + deviceDto.setAuthorizedPersonName(name); + //鏌ヨ璁惧鏍″噯淇℃伅 + DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(id, "calibrate"); + deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber()); + + // 鍒颁簡鍋滅敤鏃ユ湡锛岃嚜鍔ㄥ皢鐘舵�佹敼涓哄仠鐢� + if (deviceDto.getNextCalibrationDate() != null) { + if (LocalDateTime.now().isAfter(deviceDto.getNextCalibrationDate())) { + // todo: 璁惧杩愯鐘舵�佸瓧鍏� +// List<Enums> enums = enumService.selectEnumByCategory("璁惧鐘舵��"); +// List<Enums> status = enums.stream().filter(item -> item.getLabel().equals("鍋滅敤")).collect(Collectors.toList()); +// deviceDto.setDeviceStatus(Integer.parseInt(status.get(0).getValue())); + deviceMapper.updateById(deviceDto); + } + } + return deviceDto; + } + + @Override + public Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto) { + + // 鏌ヨ妫�楠岄」 + List<Integer> itemIds = dto.getItemIds(); + if (CollectionUtils.isEmpty(itemIds)) { + throw new ErrorException("娌℃湁闇�瑕佹暟閲囩殑妫�楠岄」"); + } + List<InsProduct> insProducts = insSampleMapper.selectProductResult(itemIds); + + // 鏌ヨ妫�楠岄」缁戝畾鐨刬d + List<Integer> itemParameterIds = insProducts.stream().map(InsProduct::getStructureItemParameterId).collect(Collectors.toList()); + + Set<String> deviceCodeSet = new LinkedHashSet<>(); + for (InsProduct product : insProducts) { + // 鏌ヨ璁惧 + // 娣诲姞璁惧缂栧彿 + if (product.getInsProductResult() != null) { + List<JSONObject> jsonObjects = JSON.parseArray(product.getInsProductResult().getEquipValue(), JSONObject.class); + for (JSONObject jsonObject : jsonObjects) { + if (!"".equals(jsonObject.get("v") + "")) { + List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�"); + deviceCodeSet.addAll(v); + } + } + } + } + if (CollectionUtils.isEmpty(deviceCodeSet)) { + throw new ErrorException("鏈�夋嫨璁惧淇℃伅"); + } + // 鑾峰彇璁惧闆嗗悎 + List<Device> deviceList = baseMapper.selectList(Wrappers.<Device>lambdaQuery() + .in(Device::getManagementNumber, deviceCodeSet) + .isNotNull(Device::getIp) + .ne(Device::getIp, "")); + + if (CollectionUtils.isEmpty(deviceList)) { + throw new ErrorException("鏃犺澶囬厤缃噰闆嗙粦瀹氫俊鎭�"); + } + + // 鏁伴噰杩斿洖淇℃伅 + Map<String, Object> map = new HashMap<>(); + for (Device device : deviceList) { + String ip = device.getIp(); + // 鏍规嵁妫�楠岄」鑾峰彇config + List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery() + .in(DataConfig::getStructureItemParameterId, itemParameterIds) + .eq(DataConfig::getDeviceId, device.getId())); + + // 鑾峰彇璁惧閰嶇疆绫� + // 鍒ゆ柇璁惧鏄惁鏄暟瀛楃洿妗� + if (device.getManagementNumber().equals("JCZX-ZB-ER02022")) { + map.putAll(dataCollectBridge(list, device, dto.getEntrustCode())); + } else { + map.putAll(DataAcquisition.dataAcquisitionEntrance(list, device, dto.getEntrustCode(), dto.getEntrustCode(), ip, insProducts.get(0).getCableTag())); + } + } + + + // 4銆侀�犲惊鐜鏁帮紝鍙備笌鍏紡璁$畻 + if (ObjectUtils.isNotEmpty(map)) { + Map<String, Object> frequency = DataAcquisition.createFrequency(dto.getEntrustCode(), dto.getEntrustCode(), map); + return Result.success(frequency); + } else { + return Result.success(null); + } + } + + /** + * 鑾峰彇鏁板瓧鐩存ˉ妫�娴嬩俊鎭� + * @return + */ + public Map<String, ?> dataCollectBridge(List<DataConfig> dataConfig, Device device, String entrustCode) { + // 鎷兼帴鍚嶅瓧 + Map<String, List<DataConfig>> userMap = dataConfig.stream() + .peek(i -> { + String itemName = i.getInspectionItem(); + if (StringUtils.isNotBlank(i.getInspectionItemClass())) { + itemName += "@" + i.getInspectionItemClass(); + } + String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass(); + + // 娣诲姞妫�楠岄」鍚嶇О + i.setInsProductItem(name); + }) + .collect(Collectors.groupingBy(DataConfig::getInsProductItem)); + + Map<String, Object> map = new HashMap<>(); + + userMap.forEach((k, v) -> { + List<String> resultValue = new ArrayList<>(); + // 鏌ヨ鐩存ˉ鐢垫祦鐢甸樆鏁伴噰鍊� + List<CollectBridge> collectBridges = collectBridgeMapper.selectList(Wrappers.<CollectBridge>lambdaQuery() + .like(CollectBridge::getEntrustCode, entrustCode) + .orderByAsc(CollectBridge::getCollectDate)); + + resultValue = collectBridges.stream().map(CollectBridge::getCollectValue).collect(Collectors.toList()); + + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("equipName", device.getDeviceName()); + hashMap.put("equipValue", device.getManagementNumber()); + hashMap.put("result", resultValue); + map.put(k, hashMap); + }); + return map; + } + + + @Override + public List<Map<String, Object>> treeDevice(String deviceName) { + List<Map<String, Object>> listMap = deviceMapper.treeDevice(deviceName); + return listMap; + } + + + + @Override + public void exportDeviceFile(Integer deviceId, HttpServletResponse response) { + + // 璁惧淇℃伅 + Device device = baseMapper.selectById(deviceId); + // 璁惧妗f + List<Document> documentList = documentService.list(Wrappers.<Document>lambdaQuery().eq(Document::getDeviceId, deviceId)); + // 璁惧鏍″噯琛� + List<DeviceMetricRecord> deviceMetricRecordList = deviceMetricRecordMapper.selectList(Wrappers.<DeviceMetricRecord>lambdaQuery().eq(DeviceMetricRecord::getDeviceId, deviceId)); + // 璁惧缁翠慨琛� + List<DeviceMaintenance> deviceMaintenanceList = deviceMaintenanceMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery().eq(DeviceMaintenance::getDeviceId, deviceId)); + + + // 杩斿洖缁檞ord鐨勬暟鎹垪琛� 鍒嗕负宸﹀彸涓ゅ垪鏁版嵁 + List<DocumentExportWordDto> documentExportWordDtoList = new ArrayList<>(); + // 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀� + extracted(documentList, documentExportWordDtoList); + + + // 灏嗘牎鍑嗚〃鍜岀淮淇〃鏀惧叆涓�涓璞′腑鏂逛究word琛ㄦ牸涓樉绀� + List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = getDeviceMetricRecordAndMaintenanceDtoList(deviceMetricRecordList, deviceMaintenanceList); + + + // 鑾峰彇璺緞 + InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-document.docx"); + Configure configure = Configure.builder() + .bind("document", new HackLoopTableRenderPolicy()) + .bind("deviceMetricRecordAndMaintenanceDtoList", new HackLoopTableRenderPolicy()) + .build(); + XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( + new HashMap<String, Object>() {{ + put("device", device); + put("document", documentExportWordDtoList); // 妗f + put("deviceMetricRecordAndMaintenanceDtoList", deviceMetricRecordAndMaintenanceDtoList); // 鏍″噯琛� 鍜� 缁翠慨琛� + }}); + + try { + response.setContentType("application/msword"); + String fileName = URLEncoder.encode( + device.getDeviceName() + "妗f", "UTF-8"); + response.setHeader("Content-disposition", + "attachment;filename=" + fileName + ".docx"); + OutputStream os = response.getOutputStream(); + template.write(os); + os.flush(); + os.close(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("瀵煎嚭澶辫触"); + } + } + + private List<DeviceMetricRecordAndMaintenanceDto> getDeviceMetricRecordAndMaintenanceDtoList(List<DeviceMetricRecord> deviceMetricRecordList, List<DeviceMaintenance> deviceMaintenanceList) { + // 璁惧鏍″噯琛ㄥ拰璁惧缁翠慨琛ㄧ殑闆嗗悎 + List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = new ArrayList<>(); + // 璁惧鏍″噯琛ㄥ拰璁惧缁翠慨琛ㄧ殑闀垮害鍙兘涓嶄竴鏍� 鍙栨渶澶у�� 涓嶅鐨勭敤绌烘暟鎹~鍏� + int metricRecordSize = deviceMetricRecordList.size(); + int maintenanceSize = deviceMaintenanceList.size(); + int size = Math.max(metricRecordSize, maintenanceSize); + // 缁� 鏍¢獙鍜岀淮淇璞� 璧嬪�� + for (int i = 0; i < size; i++) { + // 鏍¢獙鍜岀淮淇璞� + DeviceMetricRecordAndMaintenanceDto deviceMetricRecordAndMaintenanceDto = new DeviceMetricRecordAndMaintenanceDto(); + // 璁剧疆搴忓彿 + deviceMetricRecordAndMaintenanceDto.setIndex(i + 1); + + // 鏍″噯琛ㄦ暟鎹� + if (metricRecordSize > i) { + // 璁剧疆鏃ユ湡鏍煎紡 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + // 鑾峰彇璁惧鏍″噯琛ㄦ暟鎹� + DeviceMetricRecord deviceMetricRecord = deviceMetricRecordList.get(i); + // 璁剧疆鏍″噯鏃ユ湡 + deviceMetricRecordAndMaintenanceDto.setCalibrationDateString(sdf.format(deviceMetricRecord.getCalibrationDate())); + // 璁剧疆璇佷功缂栧彿 + deviceMetricRecordAndMaintenanceDto.setCertificateNumber(deviceMetricRecord.getCertificateSerialNumber()); + // 璁剧疆鏈夋晥鏈� + deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getNextCalibrationDate())); + // 璁剧疆鏍″噯鏈夋晥鏃ユ湡 + deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getConfirmDate())); + // 璁剧疆妫�楠岀粨鏋� + deviceMetricRecordAndMaintenanceDto.setJudgement(deviceMetricRecord.getStatus()); + } + + // 缁翠慨琛ㄦ暟鎹� + if (maintenanceSize > i) { + // 鑾峰彇璁惧缁翠慨琛ㄦ暟鎹� + DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(i); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 缁翠慨鏃ユ湡 + deviceMetricRecordAndMaintenanceDto.setMaintenanceDateString(deviceMaintenance.getDate().format(dateTimeFormatter)); + // 澶勭悊鏂规硶 + deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getContent()); + // 澶囨敞 + deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getComments()); + } + + deviceMetricRecordAndMaintenanceDtoList.add(deviceMetricRecordAndMaintenanceDto); + } + return deviceMetricRecordAndMaintenanceDtoList; + } + + /** + * 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀� + * + * @param documentList 妗f鍒楄〃 + * @param documentExportWordDtoList 杩斿洖缁檞ord鐨勬暟鎹垪琛� + */ + private static void extracted(List<Document> documentList, List<DocumentExportWordDto> documentExportWordDtoList) { + // 缁欐。妗堝姞搴忓彿 骞朵笖鍒嗕负宸﹀彸涓や釜鍒楄〃鍦╳ord涓樉绀� + for (int i = 0; i < documentList.size(); i++) { + // 鍒涘缓word琛ㄦ牸涓竴琛岀殑鏁版嵁瀵硅薄 + DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto(); + // 鑾峰彇妗f淇℃伅 + Document document = documentList.get(i); + // 鏍煎紡鍖栨棩鏈� + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 鏍规嵁搴忓彿 鍒嗗埆鍔犲叆涓や釜鍒楄〃 + if (i % 2 == 0) { + // 濂囨暟鍦ㄥ乏鍒� + documentExportWordDto.setIndex1(i + 1); + documentExportWordDto.setName1(document.getName()); + documentExportWordDto.setQuantity1(document.getQuantity()); + documentExportWordDto.setPageCount1(document.getPageCount()); + documentExportWordDto.setArchiveDateString1(document.getProvideDate().format(dateTimeFormatter)); + } else { + // 鍋舵暟鍦ㄥ彸鍒� + documentExportWordDto.setIndex2(i + 1); + documentExportWordDto.setName2(document.getName()); + documentExportWordDto.setQuantity2(document.getQuantity()); + documentExportWordDto.setPageCount2(document.getPageCount()); + documentExportWordDto.setArchiveDateString2(document.getProvideDate().format(dateTimeFormatter)); + } + // 鎶婁竴琛屾暟鎹璞″姞鍏ュ垪琛� + documentExportWordDtoList.add(documentExportWordDto); + } + } + + @Override + public void exportEquipmentDetails(HttpServletResponse response) { + List<Device> deviceList = baseMapper.selectList(null); + List<DeviceExport> deviceExportList = new ArrayList<>(); + + int index = 1; + for (Device device : deviceList) { + Integer equipmentManager = device.getEquipmentManager(); + String equipmentManagerName = null; + if (equipmentManager != null) { + User user = userMapper.selectById(equipmentManager); + if (user != null) { + equipmentManagerName = user.getName(); + } + } + DeviceExport deviceExport = new DeviceExport(); + BeanUtils.copyProperties(device, deviceExport); + deviceExport.setIndex(index); + deviceExport.setEquipmentManagerName(equipmentManagerName); + deviceExportList.add(deviceExport); + index++; + } + + // 鑾峰彇璺緞 + InputStream inputStream = this.getClass().getResourceAsStream("/static/word/quipment-details.docx"); + Configure configure = Configure.builder() + .bind("deviceList", new HackLoopTableRenderPolicy()) + .build(); + XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( + new HashMap<String, Object>() {{ + put("deviceList", deviceExportList); + }}); + + try { + response.setContentType("application/msword"); + String fileName = URLEncoder.encode( + "浠櫒璁惧涓�瑙堣〃", "UTF-8"); + response.setHeader("Content-disposition", + "attachment;filename=" + fileName + ".docx"); + OutputStream os = response.getOutputStream(); + template.write(os); + os.flush(); + os.close(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("瀵煎嚭澶辫触"); + } + } +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java new file mode 100644 index 0000000..0f905bc --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DocumentServiceImpl.java @@ -0,0 +1,14 @@ +package com.ruoyi.device.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.device.mapper.DocumentMapper; +import com.ruoyi.device.pojo.Document; +import com.ruoyi.device.service.DocumentService; +import org.springframework.stereotype.Service; + +/** + * 璁惧妗f + */ +@Service +public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> implements DocumentService { +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java new file mode 100644 index 0000000..bb26ed6 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/QrShowServiceImpl.java @@ -0,0 +1,115 @@ +package com.ruoyi.device.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.basic.mapper.StructureItemParameterMapper; +import com.ruoyi.basic.service.ProductService; +import com.ruoyi.device.mapper.DeviceMapper; +import com.ruoyi.device.mapper.DeviceMetricRecordMapper; +import com.ruoyi.device.pojo.DeviceMetricRecord; +import com.ruoyi.device.service.QrShowService; +import com.ruoyi.inspect.mapper.InsOrderMapper; +import com.ruoyi.inspect.service.InsOrderService; +import com.ruoyi.system.service.CustomService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.ui.Model; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Objects; +import java.util.Optional; + +@Service +public class QrShowServiceImpl implements QrShowService { + + + + @Autowired + private DeviceMetricRecordMapper deviceMetricRecordMapper; + + + + /** + * 璁$畻鍚敤鏃堕暱 + * @param activationDate + * @return + */ + public double calcUsedYears(LocalDateTime activationDate) { + if(Objects.isNull(activationDate)){ + return 0; + } + BigDecimal defDays = BigDecimal.valueOf(365); + BigDecimal usedDays = BigDecimal.valueOf(Duration.between(activationDate,LocalDateTime.now()).toDays()); + return usedDays.divide(defDays,2,RoundingMode.HALF_UP).setScale(2,RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 璁$畻璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮 + * @param startDate + * @param endDate + * @return + */ + public double calcDeviceNextCheckRatio(Date startDate, Date endDate){ + if(Objects.isNull(startDate) || Objects.isNull(endDate)){ + return 0; + } + LocalDateTime startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + LocalDateTime endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + long totalDays = Duration.between(startLocalDate, endLocalDate).toDays(); + long usedDays = Duration.between(startLocalDate, LocalDateTime.now()).toDays(); + BigDecimal calcVal = BigDecimal.valueOf(usedDays).divide(BigDecimal.valueOf(totalDays),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP); + if(calcVal.compareTo(BigDecimal.ZERO)<0){ + calcVal = BigDecimal.ZERO; + }else if(calcVal.compareTo(BigDecimal.valueOf(100))>0){ + calcVal = BigDecimal.valueOf(100); + } + return calcVal.doubleValue(); + } + + /** + * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍 + * @param deviceId + * @param type + * @return + */ + public DeviceMetricRecord getDeviceMetricRecord(int deviceId, String type){ + return Optional.ofNullable( + deviceMetricRecordMapper.selectOne(Wrappers.<DeviceMetricRecord>lambdaQuery() + .eq(DeviceMetricRecord::getDeviceId, deviceId) + .eq(DeviceMetricRecord::getType, type) + .orderByDesc(DeviceMetricRecord::getCreateTime) + .last("limit 1"))).orElse(new DeviceMetricRecord()); + } + + /** + * 鏍煎紡鍖栨棩鏈� + * @return + */ + public String formatDate(Date date,String formatter){ + if(Objects.isNull(date)){ + return ""; + } + LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + return localDateTime.format(DateTimeFormatter.ofPattern(formatter)); + } + /** + * 鏍煎紡鍖栨棩鏈� + * @return + */ + public String formatDate(LocalDate date,String formatter){ + if(Objects.isNull(date)){ + return ""; + } + return date.format(DateTimeFormatter.ofPattern(formatter)); + } + + +} diff --git a/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java new file mode 100644 index 0000000..5065c0b --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java @@ -0,0 +1,861 @@ +package com.ruoyi.device.utils; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.ruoyi.device.pojo.DataConfig; +import com.ruoyi.device.pojo.Device; +import com.ruoyi.framework.exception.ErrorException; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class DataAcquisition { + + private static final String HTTP = "http://"; + + private static final String GETFILE = ":9527/lims/getFile"; // 鑾峰彇鏂囦欢鎺ュ彛 + + private static final String MOVEFILE = ":9527/lims/moveFile"; // 鏂囦欢绉诲姩鍦板潃 + + private static final String splitIdentifier = "@-@"; // 鑷畾涔夊敮涓�鏍囪瘑鍒嗗壊绗� + + public static final String frequency = "frequency"; + + /** + * 鏁伴噰鍏ュ彛 + * + * @param dataConfig + * @param device + * @return + */ + public static Map<String, Object> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip, String cableTag) { + // 鍒ゆ柇鏄惁鏄奖鍍忔祴閲忎华 + if (device.getManagementNumber().equals("JCZX-ZB-OP07001")) { + if (device.getFileType().equals(".xlsx")) { + String url = device.getCollectUrl() + "\\" + sampleCode.replace("/", ""); + if (StringUtils.isNotBlank(dataConfig.get(0).getAnotherName())) { + url += dataConfig.get(0).getAnotherName() ; + } + url += ".xlsx"; + device.setCollectUrl(url); + } + } + // 鍒ゆ柇鏄惁鏄數缂嗙噧鐑х儫瀵嗗害娴嬮噺绯荤粺 + if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) { + if (device.getFileType().equals(".txt")) { + device.setCollectUrl(device.getCollectUrl() + "\\-" + sampleCode.replace("/", "")); + } + } + /** + * filePath 鏂囦欢閲囬泦璺緞 + * fileExtension 鏂囦欢鍚庣紑 + * entrustCode 濮旀墭缂栧彿 + * sampleCode 鏍峰搧缂栧彿 + * mdbEntrustCode mdb鏂囦欢闇�瑕侊細濮旀墭缂栧彿瀛楁 涓轰粈涔堟病鏈夊幓杩欎釜mdb鍓嶇紑鍛紵鍥犱负宸茬粡缁欏鎴风殑閮ㄥ垎鐢佃剳涓婂畨瑁呬簡閲囬泦鍣紝鑰岀敤鎴蜂笉鎺ュ彈閲嶆柊瀹夎閲囬泦鍣紝鎵�浠ュ氨娌℃湁鍘婚櫎 + * mdbSampleCode mdb鏂囦欢闇�瑕侊細鏍峰搧缂栧彿瀛楁 + */ + String http = HTTP + ip + GETFILE + + "?filePath=" + device.getCollectUrl() + + "&fileExtension=" + device.getFileType() + + "&entrustCode=" + entrustCode + + "&sampleCode=" + sampleCode + + "&mdbEntrustCode=" + device.getEntrustCode() + + "&mdbSampleCode=" + device.getSampleCode() + + "&dbFileName=" + device.getDbFileName(); + String result = null; + try { + result = HttpUtil.get(http); + } catch (IORuntimeException e) { + e.printStackTrace(); + throw new ErrorException("鎵�鍦ㄧ數鑴戞湭瀹夎鎴栨湭鍚姩锛歀IMS鏂囦欢閲囬泦鍣紒"); + } + JSONObject jsonObject = JSON.parseObject(result); + if (Objects.equals(jsonObject.get("code"), 1)) { + if (ObjectUtils.isEmpty(jsonObject.get("msg"))) { + throw new ErrorException("鏈煡璇㈠埌鏂囦欢锛佸彲鑳借璺緞锛�" + device.getCollectUrl() + "锛変笅骞舵病鏈夋墍闇�(" + device.getFileType() +")鏂囦欢锛�"); + } else { + throw new ErrorException(jsonObject.get("msg") + ""); + } + } else { + String data = jsonObject.get("data") + ""; + // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁� + Map<String, List<DataConfig>> userMap = dataConfig.stream() + .peek(i -> { + String itemName = i.getInspectionItem(); + if (StringUtils.isNotBlank(i.getInspectionItemClass())) { + itemName += "@" + i.getInspectionItemClass(); + } + String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass(); + + // 娣诲姞妫�楠岄」鍚嶇О + i.setInsProductItem(name); + }) + .collect(Collectors.groupingBy(DataConfig::getInsProductItem)); + Map<String, Object> map; + switch (device.getFileType()) { + case ".docx": + map = analysisString(data, userMap, device, entrustCode, sampleCode); + break; + case ".xlsx": + map = analysisList(data, userMap, device, entrustCode, sampleCode); + break; + case ".txt": + map = analysisTxt(data, userMap, device, entrustCode, sampleCode); + break; + case ".csv": + map = analysisList(data, userMap, device, entrustCode, sampleCode); + break; + case ".mdb": + // 鍒ゆ柇鏄惁鏄媺鍔涙満 + if (device.getManagementNumber().equals("JCZX-ZB-FF01014")) { + map = analysisMdbByPull(data, userMap, device, cableTag); + } else { + map = analysisMdb(data, userMap, device); + } + break; + case ".db": + map = analysisDb(data, userMap, device); + break; + case ".png": + map = readPngString(data, userMap, device); + break; + default: + map = null; + break; + } + // 濡傛灉瀛樺湪瀛樺偍鍦板潃锛屽垯绉诲姩鍦板潃 + if (ObjectUtils.isNotEmpty(device.getStorageUrl())) { + String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl() + "&fileType=" + device.getFileType(); + HttpUtil.get(s); + } + return map; + } + } + + public static Map<String, Object> createFrequency(String entrustCode, String sampleCode, Map<String, Object> map) { + Set<String> set = new LinkedHashSet<>(); + map.forEach((key, value) -> { + String[] split = key.split(","); + String inspectionItem = split[0]; + // 鍙鏈変竴涓笉涓虹┖灏眘et杩涘幓 + if (ObjectUtils.isNotEmpty(value)) { + set.add(inspectionItem); + } + }); + Map<String, Object> result = new HashMap<>(); + for (String inspectionItemKey : set) { + Map<String, Object> hashMap = new HashMap<>(); + map.forEach((key, value) -> { + String[] split = key.split(","); + String inspectionItem = split[0]; + if (inspectionItemKey.equals(inspectionItem)) { + if (split.length > 1) { + hashMap.put(split[1], value); + } else { + hashMap.put("", value); + } + } + }); + String frequency = createKey(entrustCode, sampleCode, inspectionItemKey); + hashMap.put("frequency", frequency); + result.put(inspectionItemKey, hashMap); + } + return result; + } + + public static String createKey(String entrustCode, String sampleCode, String inspectionItemKey) { + + return "1"; + } + + /** + * 闇�瑕侀�氳繃X,Y杞村畾浣� + * + * @param data + * @param dataConfig + * @return + */ + private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, Device device) { + JSONObject jsonObject = JSON.parseObject(data); + Map<String, Object> map = new HashMap<>(); + if (jsonObject.isEmpty()) { + return map; + } + JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString()); + dataConfig.forEach((k, v) -> { + AtomicInteger numberOfDataEntries = new AtomicInteger(); + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + String refery = getRefer(v.get(config).getRefery()); + for (int i = 0; i < dataList.size(); i++) { + JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString()); + Object o = jsonObject1.get(refery); + if (ObjectUtils.isNotEmpty(o)) { + numberOfDataEntries.addAndGet(1); + list.add(o); + } + } + } + // 鎷兼帴鏁伴噰閰嶇疆 + List<Object> result = new ArrayList<>(); + for (int i = 0; i < numberOfDataEntries.get(); i++) { + String aggregate = ""; + for (int j = 0; j < v.size(); j++) { + int index; + if (j == 0) { + index = i; + } else { + index = numberOfDataEntries.get() + i; + } + aggregate += list.get(index).toString() + ","; + } + int lastIndex = aggregate.lastIndexOf(","); + String substring = aggregate.substring(0, lastIndex); + result.add(substring); + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(result, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + /** + * @param data + * @param dataConfig + * @return + */ + private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, Device device) { + JSONObject jsonObject = JSON.parseObject(data); + Map<String, Object> map = new HashMap<>(); + if (jsonObject.isEmpty()) { + return map; + } + JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString()); + dataConfig.forEach((k, v) -> { + DataConfig configVo = v.get(0); + AtomicInteger numberOfDataEntries = new AtomicInteger(); + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + String refery = getRefer(v.get(config).getRefery()); + for (int i = 0; i < dataList.size(); i++) { + JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString()); + Object o = jsonObject1.get(refery); + if (ObjectUtils.isNotEmpty(o)) { + numberOfDataEntries.addAndGet(1); + list.add(o); + } + } + } + // 鎷兼帴鏁伴噰閰嶇疆 + List<Object> result = new ArrayList<>(); + for (int i = 0; i < numberOfDataEntries.get(); i++) { + String aggregate = ""; + for (int j = 0; j < v.size(); j++) { + int index; + if (j == 0) { + index = i; + } else { + index = numberOfDataEntries.get() + i; + } + aggregate += list.get(index).toString() + ","; + } + int lastIndex = aggregate.lastIndexOf(","); + String substring = aggregate.substring(0, lastIndex); + result.add(substring); + + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(result, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + + /** + * 鎷夊姏鏈烘暟閲� + * + * @param data + * @param dataConfig + * @return + */ + private static Map<String, Object> analysisMdbByPull(String data, Map<String, List<DataConfig>> dataConfig, Device device, String cableTag) { + JSONObject jsonObject = JSON.parseObject(data); + Map<String, Object> map = new HashMap<>(); + if (jsonObject.isEmpty()) { + return map; + } + JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString()); + + dataConfig.forEach((k, v) -> { + List<Map<String, String>> resultValue = new ArrayList<>(); + + DataConfig configVo = v.get(0); + for (int i = 0; i < dataList.size(); i++) { + JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString()); + // 鑾峰彇鏃堕棿 + String dDate = jsonObject1.getString("dDate"); + String dTime = jsonObject1.getString("dTime"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); + + // 瑙f瀽绗竴涓棩鏈熸椂闂村瓧绗︿覆 + LocalDateTime dateTime1 = LocalDateTime.parse(dDate, formatter); + // 鑾峰彇骞存湀鏃� + String yearMonthDay = dateTime1.toLocalDate().toString(); + + // 瑙f瀽绗簩涓棩鏈熸椂闂村瓧绗︿覆 + LocalDateTime dateTime2 = LocalDateTime.parse(dTime, formatter); + // 鑾峰彇鏃跺垎 + String hourMinute = dateTime2.toLocalTime().toString(); + // 鎷兼帴骞存湀鏃ュ拰鏃跺垎 + String mergedDateTime = yearMonthDay + " " + hourMinute; + + // 鑾峰彇鍘氬害 + String report = jsonObject1.getString("Report"); + String thickness = extractValue(report, "鍘氬害:\\s*(\\S*?)~"); + + // 鑾峰彇鎷変几寮哄害浼搁暱鐜� + String result = ""; + if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("鎷変几寮哄害")) { + result = extractValue(report, "鎷変几寮哄害:\\s*(\\S*?)~"); + + } + //鍒ゆ柇妫�楠屽瓙椤规槸鍚︽槸鎷変几寮哄害 + if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("浼搁暱鐜�")) { + result = extractValue(report, "浼搁暱鐜�:\\s*(\\S*?)~"); + } + Map<String, String> reportMap = new HashMap<>(); + reportMap.put("mergedDateTime", mergedDateTime); + reportMap.put("thickness", thickness); + reportMap.put("result", result); + resultValue.add(reportMap); + } + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("equipName", device.getDeviceName()); + hashMap.put("equipValue", device.getManagementNumber()); + hashMap.put("result", resultValue); + map.put(k, hashMap); + }); + return map; + } + + private static String extractValue(String input, String regex) { + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(input); + return matcher.find() ? matcher.group(1) : null; + } + + private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?"); + + /** + * 鍙渶X杞� + * + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + private static Map<String, Object> readPngString(String data, Map<String, List<DataConfig>> dataConfig, Device device) { + Map<String, Object> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + String referx = getRefer(v.get(config).getReferx()); + String result = null; + // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿 + String[] aColumnY = data.split("\n"); + List<String> list1 = new ArrayList<>(); + // 璇ュ惊鐜緱鍑虹敤鎴烽厤缃殑y杞� + for (int i = 0; i < aColumnY.length; i++) { + String addDataWithSpaces = referx.replaceAll("", " "); + int x = getXOrY(v.get(config).getX(), k, "X"); + if (aColumnY[i].contains(addDataWithSpaces)) { + Matcher matcher = SPATTERN.matcher(aColumnY[i]); + while (matcher.find()) { + String group = matcher.group(); + list1.add(group); + } + } + if (ObjectUtils.isNotEmpty(list1)) { + result = list1.get(x); + } + } + if (ObjectUtils.isNotEmpty(result)) { + list.add(result); + } + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(list, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + /** + * 浠庢枃浠朵腑鎻愬彇鍑烘潵鐨勬枃瀛楋紝濡傛灉鏈夊叕寮忥紝杩涜鍏紡璁$畻锛屽惁鍒欏彇鍒楄〃绗竴涓�� + * + * @param list 鎻愬彇鍑虹殑鏁板瓧 + * @param dataConfig 瀛樺偍鍏紡鐨勫璞� + * @return + */ + private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) { + if (list.size() == 0) { + Map<String, Object> hashMap = new HashMap<>(); + hashMap.put("equipName", device.getDeviceName()); + hashMap.put("equipValue", device.getManagementNumber()); + hashMap.put("result", null); + return hashMap; + } + ArrayList<Object> listResult = new ArrayList<>(); + Map<String, Object> hashMap = new HashMap<>(); + // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻 + if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) { + // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹� + if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) { + String s = calculationFormulaList(list, dataConfig.getFormula()); + listResult.add(s); + } else { + list.forEach(i -> { + List<Object> strings = Arrays.asList(i.toString().split(",")); + String s = calculationFormulaList(strings, dataConfig.getFormula()); + listResult.add(s); + }); + } + } else { + listResult.addAll(list); + } + // 涓轰簡缁欏墠绔仛鏁版嵁鍖哄垎 + if (listResult.size() > 1) { + hashMap.put("result", listResult); + } else { + hashMap.put("result", listResult.get(0).toString()); + } + hashMap.put("equipName", device.getDeviceName()); + hashMap.put("equipValue", device.getManagementNumber()); + return hashMap; + } + + /** + * 瑙f瀽String鏁版嵁 + * + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + private static Map<String, Object> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig, + Device device, String entrustCode, String sampleCode) { + Map<String, Object> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = new ArrayList<>(); + // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X + if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) { + // 鍒ゆ柇鏄惁鏄儫瀵嗗害 + if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) { + // 鎸夎鍒嗗壊鏁版嵁 + String[] lines = data.split("\n"); + + // 鎻愬彇鏈�鍚庝竴琛岀殑绗竴涓暟瀛� + String lastLine = lines[lines.length - 1]; + String firstNumber = lastLine.split("\t")[0]; + list.add(firstNumber); + } else { + list = analyzeData(data, v, k, ","); + } + // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦� + } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) { + list = analyzeDataEntrustCodAndSampleCode(data, v, k, ",", device, entrustCode, sampleCode); + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(list, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + /** + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + private static Map<String, Object> analysisString(String data, Map<String, List<DataConfig>> dataConfig, Device device, + String entrustCode, String sampleCode) { + String processingDataAfterSpaces = data + .replaceAll(" +", splitIdentifier) + .replaceAll("\r", "") + .replaceAll(" ", ""); + Map<String, Object> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = new ArrayList<>(); + // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X + if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) { + list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier); + // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦� + } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) { + list = analyzeDataEntrustCodAndSampleCode(processingDataAfterSpaces, v, k, splitIdentifier, device, entrustCode, sampleCode); + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(list, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + /** + * 鍙朮锛孻涓や釜瀹氫綅 + * + * @param data 閲囬泦鍒扮殑鏂囦欢瀛楃涓� + * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗� + * @return + */ + public static Map<String, Object> analysisList(String data, Map<String, List<DataConfig>> dataConfig, + Device device, String entrustCode, String sampleCode) { + Map<String, Object> map = new HashMap<>(); + dataConfig.forEach((k, v) -> { + List<Object> list = new ArrayList<>(); + // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X + if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) { + list = analyzeData(data, v, k, splitIdentifier); + // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦� + } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) { + list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode); + } + // 杩涜鍏紡璁$畻 + Object resultValue = calculationFormula(list, v.get(0), k, device); + map.put(k, resultValue); + }); + return map; + } + + private static List<Object> analyzeDataEntrustCodAndSampleCode(String data, List<DataConfig> v, String k, String splitIdentifier, + Device device, String entrustCodeValue, String sampleCodeValue) { + entrustCodeValue = entrustCodeValue.replaceAll(" ", ""); + sampleCodeValue = sampleCodeValue.replaceAll(" ", ""); + // 鏈�缁堢粨鏋� + List<Object> list = new ArrayList<>(); + int numberOfDataEntries = 0; + // 鍙杄ntrustCode涓巗ampleCode鎵�鍦ㄤ綅 + for (int config = 0; config < v.size(); config++) { + numberOfDataEntries = 0; + Integer entrustCodeY = null; + Integer sampleCodeY = null; + Integer referYCoordinate = null; + String refery = getRefer(v.get(config).getRefery()); + String entrustCode = getRefer(device.getEntrustCode()); // 濮旀墭缂栧彿瀛楁 + String sampleCode = getRefer(device.getSampleCode()); // 鏍峰搧缂栧彿瀛楁 + if (ObjectUtils.isEmpty(refery)) { + continue; + } + // 鍘婚櫎鎵�鏈夌殑绌烘牸锛岄�氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿 + String[] aColumnY = data.replaceAll(" ", "").split("\n"); + for (int i = 0; i < aColumnY.length; i++) { + // 濡傛灉閫氳繃鍒ゆ柇锛屽畾浣嶅埌Y杞� + if (aColumnY[i].contains(entrustCode) && aColumnY[i].contains(sampleCode)) { + String[] aLine = aColumnY[i].split(splitIdentifier); + for (int j = 0; j < aLine.length; j++) { + if (aLine[j].contains(entrustCode)) { + entrustCodeY = j; + } + if (aLine[j].contains(sampleCode) ) { + sampleCodeY = j; + } + if (aLine[j].contains(refery)) { + referYCoordinate = j; + } + } + } + if (ObjectUtils.isNotEmpty(entrustCodeY) && ObjectUtils.isNotEmpty(sampleCodeY) && ObjectUtils.isNotEmpty(referYCoordinate)) { + String[] aLine = aColumnY[i].split(splitIdentifier); + try { + if (aLine[entrustCodeY].contains(entrustCodeValue) && aLine[sampleCodeY].contains(sampleCodeValue)) { + String result = aLine[referYCoordinate]; + // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁 + if (ObjectUtils.isNotEmpty(result)) { + numberOfDataEntries += 1; + list.add(result); + } + } + } catch (Exception e) {} + } + } + } + // 鎷兼帴鏁伴噰閰嶇疆 + List<Object> result = new ArrayList<>(); + for (int i = 0; i < numberOfDataEntries; i++) { + String aggregate = ""; + for (int j = 0; j < v.size(); j++) { + int index; + if (j == 0) { + index = i; + } else { + index = numberOfDataEntries + i; + } + aggregate += list.get(index).toString() + ","; + } + int lastIndex = aggregate.lastIndexOf(","); + String substring = aggregate.substring(0, lastIndex); + result.add(substring); + } + return result; + } + + // 鐢变簬鍦ㄦ柟娉曚腑浼氬ぇ閲忕殑鍒ゆ柇锛屾墍浠ュ仛涓�涓柟娉� + private static int getXOrY(String value, String k, String tips) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new ErrorException(k + "锛氭湭閰嶇疆" + tips + "鍧愭爣杞寸殑鍊硷紒"); + } + } + + // 闃叉鍙傜収鐗╀负绌烘姤閿欙紝杩涜鍒ゆ柇濡傛灉涓虹┖璧嬪�肩┖瀛楃 + private static String getRefer(String refer) { + return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : ""; + } + + /** + * 濮旀墭缂栧彿涓庢牱鍝佺紪鍙烽兘涓虹┖鎵ц + * + * @param data + * @param v + * @param k + * @param split + * @return + */ + public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) { + List<Object> list = new ArrayList<>(); + for (int config = 0; config < v.size(); config++) { + // 鍙栦袱涓敤鎴烽厤缃殑鍙傜収鐗� + String referx = getRefer(v.get(config).getReferx()); + String refery = getRefer(v.get(config).getRefery()); + if (ObjectUtils.isEmpty(refery) && ObjectUtils.isEmpty(referx)) { + continue; + } + // 鏈�缁堢粨鏋� + List<Object> result = new ArrayList<>(); + // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿 + String[] aColumnY = data.replaceAll(" ", "").split("\n"); + Integer end = null; + // 閲囬泦鏁版嵁锛歒杞� + for (int i = 0; i < aColumnY.length; i++) { + // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓虹┖鍒欐墽琛岋紝鍚屾椂璇ヨ鍖呭惈Y鍙傜収 + if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isEmpty(referx) && aColumnY[i].contains(refery)) { + // 鍙朰鍧愭爣鍊� + int y = getXOrY(v.get(config).getY(), k, "Y"); + String[] aLineX = aColumnY[i].split(split); + for (int j = 0; j < aLineX.length; j++) { + if (aLineX[j].contains(refery)) { + String[] split1 = new String[0]; + try { + split1 = aColumnY[i + y].split(split); + } catch (Exception e) { + throw new ErrorException(k + "锛歒杞村畾浣嶈秴鍑猴紒"); + } + try { + result.add(split1[j]); + } catch (Exception e) { + throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒"); + } + } + } + // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓嶄负绌哄垯鎵ц,姝ゅY瀹氬尯鍩� + } else if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isNotEmpty(referx)) { + // 鍙杧鐨勫�硷紝闃叉鎶ラ敊 + int x = getXOrY(v.get(config).getX(), k, "X"); + // 鍙朰鍧愭爣鍊� + int y = getXOrY(v.get(config).getY(), k, "Y"); + // 缂撳瓨Y鐨勭粨鏉熷�� + if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) { + end = i + y; + } + // 鍒ゆ柇鏄惁鍦ㄥ弬鐓х墿涓鸿捣鍒帮紝Y鍧愭爣鍊间负鏈�缁堣寖鍥� + if (ObjectUtils.isNotEmpty(end) && i <= end) { + String[] aLineX = aColumnY[i].split(split); + for (int j = 0; j < aLineX.length; j++) { + if (aLineX[j].contains(referx)) { + try { + result.add(aLineX[j + x]); + } catch (Exception e) { + throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒"); + } + break; + } + } + } + // 濡傛灉X鍙傜収涓嶄负绌哄悓鏃惰琛屽寘鍚玐鍙傜収锛屽垯鎵ц涓嬮潰鐨勪唬鐮� + } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) { + String[] aLineX = aColumnY[i].split(split); + // 鍙杧鐨勫�硷紝闃叉鎶ラ敊 + int x = getXOrY(v.get(config).getX(), k, "X"); + for (int j = 0; j < aLineX.length; j++) { + if (aLineX[j].contains(referx)) { + try { + result.add(aLineX[j + x]); + } catch (Exception e) { + throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒"); + } + } + } + } + } + // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁 + if (ObjectUtils.isNotEmpty(result)) { +// String formatProcessing = getFormatProcessing(result); + list.addAll(result); + } + } + return list; + } + + public static String getFormatProcessing(String value) { + value = value.replaceAll("%", ""); + if (value.contains("=")) { + String[] split = value.split("="); + return split[split.length - 1]; + } else if (value.contains(":")) { + String[] split = value.split(":"); + return split[split.length - 1]; + } else { + return value; + } + } + + public static String getIp(HttpServletRequest request) { + String ipAddress = request.getRemoteAddr(); + // 闃叉鍥炵幆鍦板潃鍙樹负IPv6 + return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress; + } + + public static String calculationFormulaList(List<Object> list, String formula) { + //棣栧厛灏唋ist杞崲涓篵igdecmic + List<BigDecimal> bigDecimalList = list.stream() + .map(obj -> { + return new BigDecimal((obj).toString()); + }).collect(Collectors.toList()); + + //灏嗕腑鏂囩殑(杞崲鑻辨枃鐨�()) + formula = formula.replace("锛�", "(") + .replace("锛�", ")") + .replace("锛�", ","); + //鐒跺悗鎻愬彇鍏紡 + String strs = formula.substring(0, formula.indexOf("(")); + String upperStr = strs.toUpperCase(); + if (upperStr.matches(".*\\d.*")) { + upperStr = ""; + } + //鐒跺悗鑾峰彇鏈�澶栭潰鎷彿閲岄潰鐨勫��,鍐嶆牴鎹�","鍒嗗壊 + int start = formula.indexOf("("); + int end = -1; + int a = 0; + for (int i = start; i < formula.length(); i++) { + char c = formula.charAt(i); + if (c == '(') { + a++; + } else if (c == ')') { + a--; + if (a == 0) { + end = i; + } + } + } + if (start == -1 || end == -1) { + throw new ErrorException("鍏紡鎷彿涓嶅尮閰�: " + formula); + } + + String argumentsStr = formula.substring(start + 1, end); + List<String> arguments = new ArrayList<>(); + int bracketCount = 0; + StringBuilder currentArgument = new StringBuilder(); + for (char c : argumentsStr.toCharArray()) { + if (c == ',' && bracketCount == 0) { + arguments.add(currentArgument.toString()); + currentArgument.setLength(0); + } else { + if (c == '(') bracketCount++; + if (c == ')') bracketCount--; + currentArgument.append(c); + } + } + arguments.add(currentArgument.toString()); + String[] bracketStrs = arguments.toArray(new String[0]); + List<BigDecimal> results = new ArrayList<>(); + for (String expr : bracketStrs) { + Pattern pattern = Pattern.compile("([A-Z])(\\d+)"); + Matcher matcher = pattern.matcher(expr); + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + String letter = matcher.group(1); + int index = Integer.parseInt(matcher.group(2)) - 1; // 灏�1-based杞负0-based + if (index < bigDecimalList.size()) { + matcher.appendReplacement(sb, bigDecimalList.get(index).toString()); + } else { + throw new RuntimeException("鍏紡涓殑涓嬫爣 " + index + " 瓒呭嚭鑼冨洿"); + } + } + matcher.appendTail(sb); + + // 璁$畻琛ㄨ揪寮� + ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); + try { + Object result = engine.eval(sb.toString()); + results.add(new BigDecimal(result.toString())); + } catch (Exception e) { + throw new IllegalArgumentException("鏃犳硶璁$畻鍏紡: " + sb, e); + } + } + // 鏍规嵁鍑芥暟鍚嶇О杩涜鐩稿簲璁$畻 + BigDecimal finalResult; + if (upperStr.equals("") || upperStr == null) { + finalResult = results.get(0); + } else { + switch (upperStr) { + case "MAX": + finalResult = results.stream().max(BigDecimal::compareTo) + .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MAX鍊�")); + break; + case "MIN": + finalResult = results.stream().min(BigDecimal::compareTo) + .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MIN鍊�")); + break; + case "SUM": + finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add); + break; + case "ABS": + finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add); + break; + case "AVERAGE": + finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide) + .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP); + break; + case "MEDIAN": + int size = results.size(); + if (size % 2 == 1) { + finalResult = results.get(size / 2); + } else { + BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2)); + finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP); + } + break; + default: + throw new UnsupportedOperationException("鏆備笉鏀寔鍑芥暟: " + upperStr); + } + } + + return finalResult.toString(); + // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹� + } + +} diff --git a/cnas-device/src/main/resources/mapper/DataConfigMapper.xml b/cnas-device/src/main/resources/mapper/DataConfigMapper.xml new file mode 100644 index 0000000..c28aac6 --- /dev/null +++ b/cnas-device/src/main/resources/mapper/DataConfigMapper.xml @@ -0,0 +1,50 @@ +<?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="com.ruoyi.device.mapper.DataConfigMapper"> + + <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 --> + <resultMap id="BaseResultMap" type="com.ruoyi.device.pojo.DataConfig"> + <id column="id" property="id" /> + <result column="formula" property="formula" /> + <result column="referx" property="referx" /> + <result column="refery" property="refery" /> + <result column="x" property="x" /> + <result column="y" property="y" /> + </resultMap> + + <select id="selectDataConfigList" resultType="com.ruoyi.device.dto.DeviceConfigDtoPage"> + SELECT d.device_name, + d.file_type, + d.collect_url, + d.storage_url, + d.ip, + d.entrust_code, + d.sample_code, + d.db_file_name, + ip.inspection_item, + ip.inspection_item_class, + if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '', + ip.inspection_item_subclass, ip.inspection_item) inspection_item_subclass, + ip.sample, + ddc.formula, + ddc.referx, + ddc.refery, + ddc.x, + ddc.y, + ddc.another_name, + ddc.matching_name, + ddc.id, + ip.id structureItemParameterId + FROM device d + left join structure_item_parameter ip on FIND_IN_SET(ip.id, d.ins_product_ids) + left join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id + where d.id = #{deviceId} + </select> + + <select id="deleteDataConfig" resultType="integer"> + SELECT ddc.id + FROM device d + left join structure_item_parameter ip on not FIND_IN_SET(ip.id, d.ins_product_ids) + inner join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id + </select> +</mapper> diff --git a/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml new file mode 100644 index 0000000..79d1849 --- /dev/null +++ b/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml @@ -0,0 +1,17 @@ +<?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="com.ruoyi.device.mapper.DeviceMaintenanceMapper"> + + <select id="getDeviceMaintenanceParam" resultType="com.ruoyi.device.pojo.DeviceMaintenance"> + select id,device_id,device_name, device_number,management_number,content,name + ,date from device_maintenance + </select> + + + <select id="deviceMaintenanceExport" resultType="com.ruoyi.device.excel.DeviceMaintenanceExport"> + select id, device_id, device_name, device_number, management_number, content, date, if(maintenance_type = 1, '璁″垝涓淮鎶�', '浣跨敤鍓嶅悗缁存姢'), next_date, name, comments + from device_maintenance dm + where dm.device_id = #{deviceId} + </select> +</mapper> diff --git a/cnas-device/src/main/resources/mapper/DeviceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMapper.xml new file mode 100644 index 0000000..2d5c6c8 --- /dev/null +++ b/cnas-device/src/main/resources/mapper/DeviceMapper.xml @@ -0,0 +1,189 @@ +<?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="com.ruoyi.device.mapper.DeviceMapper"> + <select id="selectDeviceParameter" resultType="com.ruoyi.device.pojo.Device"> + select * from( + select id, + large_category, + date_production, + equipment_manager, + authorized_person, + device_name, + internal_code, + asset_code, + calibration_date, + scrap_time, + acceptance_records, + subclass, + factory_no, + acquisition_date, + accurate_measurement, + specification_model, + device_status, + storage_point, + activation_date, + latest_traceability, + down_time, + maintenance_records, + manufacturer, + detection_type, + _costs, + calibration_certicate, + create_user, + create_time, + update_user, + update_time, + status + from device + ) a + <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''"> + ${ew.customSqlSegment} + </if> + </select> + <select id="selectEquipmentOverview" resultType="com.ruoyi.device.pojo.Device"> + select * from( + select id, + device_name, + specification_model, + device_status, + create_user, + status, + update_time + from device + ) a + <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''"> + ${ew.customSqlSegment} + </if> + </select> + <select id="authorizedPerson" resultType="com.ruoyi.device.pojo.Device"> + select id, + authorized_person + from device + </select> + <select id="search" resultType="com.ruoyi.device.pojo.Device"> + select * + from device + <where> + <if test="deviceName!=null and deviceName!=''"> + and device_name like concat('%',#{deviceName},'%') + </if> + <if test="status!=null and status!=''"> + and device_status = status + </if> + <if test="specificationModel!=null and specificationModel!= ''"> + and specification_model = #{specificationModel} + </if> + <if test="largeCategory!=null"> + and large_category = #{largeCategory} + </if> + <if test="largeCategory == 'null'"> + and (large_category = '' or large_category is null) + </if> + </where> + </select> + + <select id="selectDeviceImage" resultType="com.ruoyi.device.pojo.Device"> + select (image_upload, create_user, create_time) values (#{image_upload} + , #{createUser} + , #{createTime}) + </select> + <select id="selectDevicePrincipal" resultType="com.ruoyi.device.pojo.Device"> + select id, + equipment_manager + from device + </select> + + <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.Device"> + select * from( + SELECT + d.*, + cmr.calibration_date as last_calibration_date_two, + cmr.next_calibration_date as next_calibration_date_two, + GROUP_CONCAT(distinct inspection_item SEPARATOR ';') AS insProductItem, + u.name , + l.laboratory_name + FROM + device d + LEFT JOIN `user` u ON u.id = d.equipment_manager + LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id + LEFT JOIN device_metric_record cmr ON d.id = cmr.device_id + LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids) + <where> + <if test="laboratoryNameIsNull != null and laboratoryNameIsNull == true"> + l.laboratory_name is null + </if> + AND cmr.type = 'calibrate' or cmr.type is null or cmr.type = '' + </where> + GROUP BY + d.id, + u.name, l.laboratory_name + ) a + <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''"> + ${ew.customSqlSegment} + </if> + </select> + + <select id="getInspectionItemSubclass" resultType="map"> + SELECT ip.inspection_item, + if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '', + ip.inspection_item_subclass, ip.inspection_item) inspection_item_subclass + FROM ins_product ip + where ip.ins_sample_id = #{id} + </select> + <resultMap id="treeDeviceDto" type="map"> + <result property="label" column="laboratory_name"/> + <result property="value" column="value" /> + <collection property="children" resultMap="storagePointMap" javaType="List"/> + </resultMap> + + <resultMap id="storagePointMap" type="map"> + <result property="value" column="value"/> + <result property="label" column="storage_point"/> + <collection property="children" resultMap="deviceNameMap" javaType="List"/> + </resultMap> + + <resultMap id="deviceNameMap" type="map"> + <result property="value" column="id"/> + <result property="label" column="device_name"/> + <result property="managementNumber" column="management_number"/> + </resultMap> + + <select id="treeDevice" resultMap="treeDeviceDto"> + select + d.id, + case when l.laboratory_name is null || l.laboratory_name ='' then '鍏朵粬' else l.laboratory_name end as laboratory_name, + case when d.storage_point is null || d.storage_point ='' then '鍏朵粬' else d.storage_point end as storage_point, + d.device_name, + d.management_number, + null as value + from device d + LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id + <where> + <if test="deviceName!=null and deviceName!=''"> + and device_name like concat('%',#{deviceName},'%') + </if> + </where> + order by l.laboratory_name desc, d.storage_point desc + </select> + + <select id="selectDeviceByCode" resultType="com.ruoyi.device.dto.DeviceDto"> + SELECT d.*, + GROUP_CONCAT(DISTINCT inspection_item SEPARATOR ';') AS ins_product_item, + l.laboratory_name, + u1.name equipmentManager_name, + u2.name authorized_person_name + FROM device d + LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids) + LEFT JOIN laboratory l ON d.subordinate_departments_id = l.id + LEFT JOIN user u1 ON u1.id = d.equipment_manager + LEFT JOIN user u2 ON u2.id = d.authorized_person + WHERE d.id = #{id} + + GROUP BY d.id, + l.laboratory_name, + u1.name, + u2.name + </select> +</mapper> diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java index c2d04ee..bda6f2e 100644 --- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java +++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java @@ -211,11 +211,6 @@ return Result.success(); } - @Scheduled(fixedDelay = 1200000) - public void getIfsOrderTiming() { - insOrderService.getIfsOrder(); - } - @ApiOperation(value = "淇敼璁㈠崟鍗曞彿") @PostMapping("/updateEntrustCode") diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java index 1f39ef1..b1d6747 100644 --- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java +++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java @@ -35,10 +35,7 @@ import com.ruoyi.common.core.domain.entity.InformationNotification; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.User; -import com.ruoyi.common.utils.DateImageUtil; -import com.ruoyi.common.utils.QueryWrappers; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.WxCpUtils; +import com.ruoyi.common.utils.*; import com.ruoyi.framework.exception.ErrorException; import com.ruoyi.inspect.dto.*; import com.ruoyi.inspect.mapper.*; @@ -634,10 +631,7 @@ } String thing = null; if (product.getTemplateId() != null && set.add(product.getTemplateId())) { - long begin = System.currentTimeMillis(); thing = standardTemplateService.getStandTempThingById(product.getTemplateId()); - long end = System.currentTimeMillis(); - System.out.println("=========鏃堕棿====" + (end - begin)); } if (StrUtil.isNotEmpty(thing)) { JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0))); @@ -648,10 +642,7 @@ style.put("columnlen", config.get("columnlen")); product.setTemplate(cellData); product.setStyle(style); - long begin = System.currentTimeMillis(); product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId())); - long end = System.currentTimeMillis(); - System.out.println("=========鏃堕棿22222====" + (end - begin)); } } } @@ -1527,7 +1518,7 @@ standardMethod2.append("銆�").append(s); } standardMethod2.replace(0, 1, ""); - // todo: 妫�娴嬬被鍨� + // todo: 鏌ヨ瀛楀吀妫�娴嬬被鍨� // List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName(""); String orderType = null; @@ -2289,6 +2280,7 @@ String finalModelStr = modelStr; // todo: 鏌ヨ瀛楀吀 + // List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName(""); String orderType = null; String formType = null; diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java b/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java new file mode 100644 index 0000000..c15200c --- /dev/null +++ b/inspect-server/src/main/java/com/ruoyi/inspect/task/RawMaterIalSchedule.java @@ -0,0 +1,26 @@ +package com.ruoyi.inspect.task; + +import com.ruoyi.inspect.service.InsOrderService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @Author zhuo + * @Date 2025/2/20 + */ +@Component +public class RawMaterIalSchedule { + + @Resource + private InsOrderService insOrderService; + + /** + * 瀹氭椂浠诲姟鑾峰彇閲囪喘璁㈠崟 + */ + @Scheduled(fixedDelay = 1200000) + public void getIfsOrderTiming() { + insOrderService.getIfsOrder(); + } +} diff --git a/pom.xml b/pom.xml index 344fdf9..94e9b64 100644 --- a/pom.xml +++ b/pom.xml @@ -264,6 +264,13 @@ <version>${ruoyi.version}</version> </dependency> + <!--cnas璁惧绠$悊--> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>cnas-device</artifactId> + <version>${ruoyi.version}</version> + </dependency> + <!-- minio --> <dependency> <groupId>io.minio</groupId> @@ -376,6 +383,7 @@ <module>performance-server</module> <module>cnas-require</module> <module>cnas-manage</module> + <module>cnas-device</module> </modules> <packaging>pom</packaging> diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 9f62143..7dd0fdb 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -91,6 +91,13 @@ <artifactId>cnas-manage</artifactId> </dependency> + <!--cnas璁惧绠$悊--> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>cnas-device</artifactId> + </dependency> + + </dependencies> <build> -- Gitblit v1.9.3