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