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/DeviceExaminePlanServiceImpl.java |  349 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 349 insertions(+), 0 deletions(-)

diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
new file mode 100644
index 0000000..23b2af1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
@@ -0,0 +1,349 @@
+package com.ruoyi.device.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+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.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceExaminePlanDetailsDto;
+import com.ruoyi.device.dto.DeviceExaminePlanDto;
+import com.ruoyi.device.excel.upload.DeviceExaminePlanUpload;
+import com.ruoyi.device.mapper.DeviceExaminePlanDetailsMapper;
+import com.ruoyi.device.mapper.DeviceExaminePlanMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceExaminePlan;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import com.ruoyi.device.service.DeviceExaminePlanDetailsService;
+import com.ruoyi.device.service.DeviceExaminePlanService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceExaminePlanServiceImpl extends ServiceImpl<DeviceExaminePlanMapper, DeviceExaminePlan> implements DeviceExaminePlanService {
+
+    @Resource
+    private DeviceExaminePlanDetailsMapper deviceExaminePlanDetailsMapper;
+    @Resource
+    private DeviceExaminePlanDetailsService deviceExaminePlanDetailsService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝
+     * @param examinePlanDto
+     * @return
+     */
+    @Override
+    public boolean addDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        examinePlanDto.setWriteUserId(userId);
+        examinePlanDto.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(examinePlanDto);
+
+        // 娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(examinePlanDto.getExaminePlanDetailsList())) {
+            for (DeviceExaminePlanDetails deviceExaminePlanDetails : examinePlanDto.getExaminePlanDetailsList()) {
+                deviceExaminePlanDetails.setPlanId(examinePlanDto.getPlanId());
+            }
+            deviceExaminePlanDetailsService.saveBatch(examinePlanDto.getExaminePlanDetailsList());
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍告煡璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importDeviceExaminePlan(MultipartFile file) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        DeviceExaminePlan examinePlan = new DeviceExaminePlan();
+        examinePlan.setPlanName(fileName);
+        examinePlan.setWriteUserId(userId);
+        examinePlan.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(examinePlan);
+
+        List<DeviceExaminePlanDetails> examinePlanDetails = new ArrayList<>();
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), DeviceExaminePlanUpload.class, new AnalysisEventListener<DeviceExaminePlanUpload>() {
+                @Override
+                public void invoke(DeviceExaminePlanUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isNotBlank(detailsUpload.getDeviceName()) &&
+                            StringUtils.isNotBlank(detailsUpload.getDeviceNumber())) {
+                        // 瀵硅薄澶嶅埗
+                        DeviceExaminePlanDetails planDetails = new DeviceExaminePlanDetails();
+                        BeanUtils.copyProperties(detailsUpload, planDetails);
+
+                        planDetails.setPlanId(examinePlan.getPlanId());
+                        examinePlanDetails.add(planDetails);
+                    }
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            for (DeviceExaminePlanDetails examinePlanDetail : examinePlanDetails) {
+                Device device = deviceMapper.selectOne(Wrappers.<Device>lambdaQuery()
+                        .eq(Device::getManagementNumber, examinePlanDetail.getDeviceNumber().trim()));
+                if (device == null) {
+                    throw new ErrorException("璁惧缂栧彿" + examinePlanDetail.getDeviceNumber() + "鏈煡璇㈠埌璁惧, 璇烽噸鏂板鍏�");
+                }
+                User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                        .eq(User::getName, examinePlanDetail.getCheckChargerUser()));
+                if (user == null) {
+                    throw new ErrorException("璁惧缂栧彿" + examinePlanDetail.getDeviceNumber() + "鏈煡璇㈠埌鏍告煡浜�");
+                }
+                examinePlanDetail.setDeviceId(device.getId());
+                examinePlanDetail.setCheckChargerUserId(user.getId());
+            }
+
+            deviceExaminePlanDetailsService.saveBatch(examinePlanDetails);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     * @param deviceExaminePlan
+     * @return
+     */
+    @Override
+    public boolean submitRatifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan) {
+        baseMapper.update(null, Wrappers.<DeviceExaminePlan>lambdaUpdate()
+                .eq(DeviceExaminePlan::getPlanId, deviceExaminePlan.getPlanId())
+                .set(DeviceExaminePlan::getRatifyUserId, deviceExaminePlan.getRatifyUserId())
+                .set(DeviceExaminePlan::getRatifyRemark, null)
+                .set(DeviceExaminePlan::getRatifyStatus, null)
+                .set(DeviceExaminePlan::getRatifyTime, null)
+        );
+
+        DeviceExaminePlan examinePlan = baseMapper.selectById(deviceExaminePlan.getPlanId());
+
+        // 鍙戦�佹秷鎭�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璁惧鏍告煡璁″垝鎵瑰噯閫氱煡");
+        info.setContent(examinePlan.getPlanName() + "鐨勮澶囨牳鏌ヨ鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(examinePlan.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.DEVICE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鎺ユ敹浜�
+            User personnel = userMapper.selectById(examinePlan.getRatifyUserId());
+
+            String message = "";
+            message += "CNAS璁惧鏍告煡璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧鏍告煡璁″垝濉啓";
+            message += "\n" + examinePlan.getPlanName() + "鐨勬牎鍑嗘牳鏌ュ垝寰呮壒鍑�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(personnel.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return false;
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @param deviceExaminePlan
+     * @return
+     */
+    @Override
+    public boolean ratifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<DeviceExaminePlan>lambdaUpdate()
+                .eq(DeviceExaminePlan::getPlanId, deviceExaminePlan.getPlanId())
+                .set(DeviceExaminePlan::getRatifyRemark, deviceExaminePlan.getRatifyRemark())
+                .set(DeviceExaminePlan::getRatifyStatus, deviceExaminePlan.getRatifyStatus())
+                .set(DeviceExaminePlan::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒楄〃
+     * @param page
+     * @param deviceExaminePlan
+     * @return
+     */
+    @Override
+    public IPage<DeviceExaminePlanDto> pageDeviceExaminePlan(Page page, DeviceExaminePlan deviceExaminePlan) {
+        return baseMapper.deviceExaminePlanDetailsMapper(page, QueryWrappers.queryWrappers(deviceExaminePlan));
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param deviceExaminePlanDetails
+     * @return
+     */
+    @Override
+    public IPage<DeviceExaminePlanDetailsDto> pageDeviceExaminePlanDetail(Page page, DeviceExaminePlanDetails deviceExaminePlanDetails) {
+        if (deviceExaminePlanDetails.getPlanId() == null) {
+            return new Page();
+        }
+        return deviceExaminePlanDetailsMapper.pageDeviceExaminePlanDetail(page, QueryWrappers.queryWrappers(deviceExaminePlanDetails));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍告煡璁″垝
+     * @param deviceExaminePlanId 璁惧鏍告煡璁″垝id
+     * @param response 鍝嶅簲浣�
+     */
+    @Override
+    public void exportDeviceExaminePlanDetail(Integer deviceExaminePlanId, HttpServletResponse response) {
+        // 鏌ヨ璁惧鏍告煡璁″垝
+        DeviceExaminePlanDto deviceExaminePlanDto = baseMapper.selectExamineExaminePlanDto(deviceExaminePlanId);
+
+        // 鏌ヨ璁惧鏍告煡璁″垝璇︽儏
+        List<DeviceExaminePlanDetails> deviceExaminePlanDetailsList = deviceExaminePlanDetailsMapper.selectList(Wrappers.<DeviceExaminePlanDetails>lambdaQuery().eq(DeviceExaminePlanDetails::getPlanId, deviceExaminePlanId)
+                .orderByAsc(DeviceExaminePlanDetails::getCheckTime));
+        // 璁剧疆搴忓彿
+        ArrayList<DeviceExaminePlanDetailsDto> deviceExaminePlanDetailsDtoList = new ArrayList<>();
+        deviceExaminePlanDetailsList.forEach(deviceExamineRecordContrastDetail -> {
+            DeviceExaminePlanDetailsDto deviceExaminePlanDetailsDto = new DeviceExaminePlanDetailsDto();
+            BeanUtils.copyProperties(deviceExamineRecordContrastDetail, deviceExaminePlanDetailsDto);
+            deviceExaminePlanDetailsDto.setIndex(deviceExaminePlanDetailsList.indexOf(deviceExamineRecordContrastDetail) + 1);
+            deviceExaminePlanDetailsDtoList.add(deviceExaminePlanDetailsDto);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/examine-plan-detail.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceExaminePlanDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceExaminePlan", deviceExaminePlanDto);
+                    put("deviceExaminePlanDetailsDtoList", deviceExaminePlanDetailsDtoList);
+                    //鑾峰彇鏍告煡浜虹殑绛惧悕鍦板潃
+                    put("writeUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExaminePlanDto.getWriteUserId()));
+                    //鑾峰彇瀹℃煡浜虹殑绛惧悕鍦板潃
+                    put("reviewUserUrl", UserUtils.getFinalUserSignatureUrl(deviceExaminePlanDto.getRatifyUserId()));
+                }});
+
+        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("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public boolean updateDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        examinePlanDto.setWriteUserId(userId);
+        examinePlanDto.setWriteTime(LocalDateTime.now());
+        baseMapper.updateById(examinePlanDto);
+
+        deviceExaminePlanDetailsService.remove(Wrappers.<DeviceExaminePlanDetails>lambdaQuery()
+                .eq(DeviceExaminePlanDetails::getPlanId, examinePlanDto.getPlanId()));
+
+        // 娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(examinePlanDto.getExaminePlanDetailsList())) {
+            for (DeviceExaminePlanDetails deviceExaminePlanDetails : examinePlanDto.getExaminePlanDetailsList()) {
+                deviceExaminePlanDetails.setPlanId(examinePlanDto.getPlanId());
+            }
+            deviceExaminePlanDetailsService.saveBatch(examinePlanDto.getExaminePlanDetailsList());
+        }
+        return true;
+    }
+
+    @Override
+    public DeviceExaminePlanDto getDeviceExaminePlan(Integer planId) {
+        DeviceExaminePlan examinePlan = baseMapper.selectById(planId);
+        DeviceExaminePlanDto deviceExaminePlanDto = new DeviceExaminePlanDto();
+        BeanUtils.copyProperties(examinePlan, deviceExaminePlanDto);
+        // 鏌ヨ璇︽儏
+        List<DeviceExaminePlanDetails> list = deviceExaminePlanDetailsService.list(Wrappers.<DeviceExaminePlanDetails>lambdaQuery()
+                .eq(DeviceExaminePlanDetails::getPlanId, planId)
+                .orderByAsc(DeviceExaminePlanDetails::getCheckTime));
+        deviceExaminePlanDto.setExaminePlanDetailsList(list);
+
+        return deviceExaminePlanDto;
+    }
+}

--
Gitblit v1.9.3