From 61b1802b1b26fc35c07fd09edc4ff2ff8ade6688 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期四, 29 一月 2026 14:52:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

---
 src/main/java/com/ruoyi/safe/service/impl/SafeTrainingServiceImpl.java |  179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 179 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/safe/service/impl/SafeTrainingServiceImpl.java b/src/main/java/com/ruoyi/safe/service/impl/SafeTrainingServiceImpl.java
new file mode 100644
index 0000000..0179898
--- /dev/null
+++ b/src/main/java/com/ruoyi/safe/service/impl/SafeTrainingServiceImpl.java
@@ -0,0 +1,179 @@
+package com.ruoyi.safe.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import com.ruoyi.project.system.domain.SysNotice;
+import com.ruoyi.safe.dto.SafeTrainingDetailsDto;
+import com.ruoyi.safe.dto.SafeTrainingDto;
+import com.ruoyi.safe.mapper.SafeTrainingDetailsMapper;
+import com.ruoyi.safe.mapper.SafeTrainingFileMapper;
+import com.ruoyi.safe.pojo.SafeTraining;
+import com.ruoyi.safe.mapper.SafeTrainingMapper;
+import com.ruoyi.safe.pojo.SafeTrainingDetails;
+import com.ruoyi.safe.pojo.SafeTrainingFile;
+import com.ruoyi.safe.service.SafeTrainingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 瀹夊叏鐢熶骇--瀹夊叏鍩硅鑰冩牳 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-01-29 10:54:06
+ */
+@Service
+public class SafeTrainingServiceImpl extends ServiceImpl<SafeTrainingMapper, SafeTraining> implements SafeTrainingService {
+
+    @Autowired
+    private SafeTrainingMapper safeTrainingMapper;
+
+    @Autowired
+    private SafeTrainingFileMapper safeTrainingFileMapper;
+
+    @Autowired
+    private SafeTrainingDetailsMapper safeTrainingDetailsMapper;
+
+    @Override
+    public IPage<SafeTrainingDto> pageSafeTraining(Page page, SafeTrainingDto safeTrainingDto) {
+        return safeTrainingMapper.pageSafeTraining(page, safeTrainingDto);
+    }
+
+    @Override
+    public int addOrUpdate(SafeTraining safeTraining) {
+        if (ObjectUtils.isNull(safeTraining.getId())) {
+            String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
+            // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶ц绋嬬紪鍙�
+            QueryWrapper<SafeTraining> queryWrapper = new QueryWrapper<>();
+            queryWrapper.likeRight("course_code", datePrefix)
+                    .orderByDesc("course_code")
+                    .last("LIMIT 1");
+            SafeTraining lastSafeTraining = safeTrainingMapper.selectOne(queryWrapper);
+            int sequenceNumber = 1; // 榛樿搴忓彿
+            if (lastSafeTraining != null && lastSafeTraining.getCourseCode() != null) {
+                String lastNo = lastSafeTraining.getCourseCode().toString();
+                if (lastNo.startsWith(datePrefix)) {
+                    String seqStr = lastNo.substring(datePrefix.length());
+                    try {
+                        sequenceNumber = Integer.parseInt(seqStr) + 1;
+                    } catch (NumberFormatException e) {
+                        sequenceNumber = 1;
+                    }
+                }
+            }
+            // 鐢熸垚瀹屾暣鐨勮绋嬬紪鍙�
+            String no = "KC-" + String.format("%s%03d", datePrefix, sequenceNumber);
+            safeTraining.setCourseCode(no);
+        }
+        //鏍规嵁鏃堕棿鍒ゆ柇鍩硅鐘舵��
+        String trainingDate = safeTraining.getTrainingDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDateTime openingTime = LocalDateTime.parse((trainingDate + safeTraining.getOpeningTime()), DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss"));
+        LocalDateTime endTime = LocalDateTime.parse((trainingDate + safeTraining.getEndTime()), DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss"));
+        if (LocalDateTime.now().isBefore(openingTime)) {
+            //鏈紑濮�
+            safeTraining.setState(0);
+        } else if (LocalDateTime.now().isAfter(endTime)) {
+            //宸茬粨鏉�
+            safeTraining.setState(2);
+        } else {
+            //杩涜涓�
+            safeTraining.setState(1);
+        }
+        //鏂板鎴栨洿鏂�
+        saveOrUpdate(safeTraining);
+        return 0;
+    }
+
+    @Override
+    public SafeTrainingDto getSafeTraining(Long id) {
+        //涓昏〃鏁版嵁
+        SafeTrainingDto safeTrainingDto = safeTrainingMapper.getSafeTraining(id);
+        //闄勪欢
+        List<SafeTrainingFile> safeTrainingFiles = safeTrainingFileMapper.selectList(Wrappers.<SafeTrainingFile>lambdaQuery().eq(SafeTrainingFile::getSafeTrainingId, id));
+        safeTrainingDto.setSafeTrainingFileList(safeTrainingFiles);
+        //鍩硅璁板綍璇︽儏
+        List<SafeTrainingDetailsDto> safeTrainingDetailsDto = safeTrainingDetailsMapper.getSafeTraining(id);
+        safeTrainingDto.setSafeTrainingDetailsDtoList(safeTrainingDetailsDto);
+        return safeTrainingDto;
+    }
+
+    @Override
+    public int saveSafeTraining(SafeTrainingDto safeTrainingDto) {
+        //鏇存柊涓昏〃
+        safeTrainingMapper.updateById(safeTrainingDto);
+        //鏇存柊鍩硅璁板綍璇︽儏
+        safeTrainingDto.getSafeTrainingDetailsDtoList().forEach(safeTrainingDetailsDto -> {
+            safeTrainingDetailsMapper.updateById(safeTrainingDetailsDto);
+        });
+        return 0;
+    }
+
+    @Override
+    public int delSafeTraining(List<Integer> ids) {
+        //鍒犻櫎涓昏〃
+        safeTrainingMapper.deleteBatchIds(ids);
+        //鍒犻櫎闄勪欢
+        safeTrainingFileMapper.delete(Wrappers.<SafeTrainingFile>lambdaQuery().in(SafeTrainingFile::getSafeTrainingId, ids));
+        //鍒犻櫎鍩硅璁板綍
+        safeTrainingDetailsMapper.delete(Wrappers.<SafeTrainingDetails>lambdaQuery().in(SafeTrainingDetails::getSafeTrainingId, ids));
+        return 0;
+    }
+
+    @Override
+    public void export(HttpServletResponse response, Long id) {
+        SafeTrainingDto safeTrainingDto = safeTrainingMapper.getSafeTraining(id);
+        List<SafeTrainingDetailsDto> safeTrainingDetailsDtoList = safeTrainingDetailsMapper.getSafeTraining(id);
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/safe-training.docx");
+        Configure configure = Configure.builder()
+                .bind("safeTrainingDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("safeTrainingDto", safeTrainingDto);
+                    put("safeTrainingDetailsDtoList", safeTrainingDetailsDtoList);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    safeTrainingDto.getCourseCode() + "鍩硅涓庤�冩牳璁″垝", "UTF-8");
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            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