From 4f3a98f19143865cdc1de4791e8a95d96bd40c65 Mon Sep 17 00:00:00 2001 From: maven <2163098428@qq.com> Date: 星期五, 01 八月 2025 13:27:59 +0800 Subject: [PATCH] yys 密码已重置 --- cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java | 498 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 498 insertions(+), 0 deletions(-) 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..c743869 --- /dev/null +++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java @@ -0,0 +1,498 @@ +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.DeviceDocumentsService; +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.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.LocalDate; +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 InsSampleMapper insSampleMapper; + + private DeviceDocumentsService 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) { + + 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> 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 = 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; + } + + /** + * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍 + * @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()); + } + + @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<DeviceDocuments> documentList = documentService.list(Wrappers.<DeviceDocuments>lambdaQuery().eq(DeviceDocuments::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(); + inputStream.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.getMaintenanceDate().format(dateTimeFormatter)); + // 澶勭悊鏂规硶 + deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getMaintenanceContent()); + // 澶囨敞 + deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getRemark()); + } + + deviceMetricRecordAndMaintenanceDtoList.add(deviceMetricRecordAndMaintenanceDto); + } + return deviceMetricRecordAndMaintenanceDtoList; + } + + /** + * 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀� + * + * @param documentList 妗f鍒楄〃 + * @param documentExportWordDtoList 杩斿洖缁檞ord鐨勬暟鎹垪琛� + */ + private static void extracted(List<DeviceDocuments> documentList, List<DocumentExportWordDto> documentExportWordDtoList) { + // 缁欐。妗堝姞搴忓彿 骞朵笖鍒嗕负宸﹀彸涓や釜鍒楄〃鍦╳ord涓樉绀� + for (int i = 0; i < documentList.size(); i++) { + // 鍒涘缓word琛ㄦ牸涓竴琛岀殑鏁版嵁瀵硅薄 + DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto(); + // 鑾峰彇妗f淇℃伅 + DeviceDocuments 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(); + inputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("瀵煎嚭澶辫触"); + } + } +} -- Gitblit v1.9.3