From 55d694aaae4e421b5e55cd941500e08f85cb5d4d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 27 八月 2026 18:21:33 +0800
Subject: [PATCH] feat(sales): 添加框架合同订单功能并优化销售台账管理

---
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java |  199 +++++++++++++++++++++++--------------------------
 1 files changed, 94 insertions(+), 105 deletions(-)

diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java
index 72ddbaa..56d5694 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java
@@ -2,20 +2,20 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.measuringinstrumentledger.dto.MeasuringInstrumentLedgerImportDto;
 import com.ruoyi.measuringinstrumentledger.dto.MeasuringInstrumentLedgerDto;
 import com.ruoyi.measuringinstrumentledger.mapper.MeasuringInstrumentLedgerMapper;
 import com.ruoyi.measuringinstrumentledger.mapper.MeasuringInstrumentLedgerRecordMapper;
 import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedger;
 import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
 import com.ruoyi.measuringinstrumentledger.service.MeasuringInstrumentLedgerService;
-import com.ruoyi.other.mapper.TempFileMapper;
-import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.sales.mapper.CommonFileMapper;
@@ -23,22 +23,19 @@
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FilenameUtils;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 import java.util.List;
-import java.util.UUID;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -52,12 +49,7 @@
 
     private final MeasuringInstrumentLedgerMapper measuringInstrumentLedgerMapper;
     private final MeasuringInstrumentLedgerRecordMapper measuringInstrumentLedgerRecordMapper;
-    private final TempFileMapper tempFileMapper;
-    private final CommonFileMapper commonFileMapper;
     private final SysUserMapper sysUserMapper;
-
-    @Value("${file.upload-dir}")
-    private String uploadDir;
 
     @Override
     public IPage<MeasuringInstrumentLedger> listPage(Page page, MeasuringInstrumentLedger measuringInstrumentLedger) {
@@ -74,12 +66,6 @@
                 collect = measuringInstrumentLedgerRecords.stream().map(MeasuringInstrumentLedgerRecord::getId).collect(Collectors.toList());
             }
             collect.add(item.getId());
-            LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
-            salesLedgerFileWrapper.in(CommonFile::getCommonId, collect)
-                    .in(CommonFile::getType,types);
-            List<CommonFile> commonFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
-            item.setCommonFiles(commonFiles);
-
         });
         return measuringInstrumentLedgerIPage;
     }
@@ -107,13 +93,93 @@
 //            if(!CollectionUtils.isEmpty(req.getTempFileIds())){
 //                migrateTempFilesToFormal(measuringInstrumentLedger.getId(), req.getTempFileIds(), FileNameType.MEASURING.getValue());
 //            }
-            // 鍙拌处璁板綍缁戝畾涓�娆�
-            if(!CollectionUtils.isEmpty(req.getTempFileIds())){
-                migrateTempFilesToFormal(measuringInstrumentLedgerRecord.getId(), req.getTempFileIds(), FileNameType.MEASURINGRecord.getValue());
-            }
             return true;
         }
         return false;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult importData(MultipartFile file) {
+        if (file == null || file.isEmpty()) {
+            return AjaxResult.error("璇蜂笂浼� Excel 鏂囦欢");
+        }
+        String filename = file.getOriginalFilename();
+        if (filename == null || !(filename.endsWith(".xls") || filename.endsWith(".xlsx"))) {
+            return AjaxResult.error("鍙敮鎸佸鍏� xls 鎴� xlsx 鏂囦欢");
+        }
+        try {
+            ExcelUtil<MeasuringInstrumentLedgerImportDto> util = new ExcelUtil<>(MeasuringInstrumentLedgerImportDto.class);
+            List<MeasuringInstrumentLedgerImportDto> rows = util.importExcel(file.getInputStream());
+            if (CollectionUtils.isEmpty(rows)) {
+                return AjaxResult.error("Excel 涓病鏈夊彲瀵煎叆鐨勬暟鎹�");
+            }
+            Set<String> codes = new HashSet<>();
+            Map<Integer, String> errors = new LinkedHashMap<>();
+            List<MeasuringInstrumentLedger> ledgers = new ArrayList<>();
+            Long tenantId = SecurityUtils.getLoginUser().getTenantId();
+            Long userId = SecurityUtils.getUserId();
+            String userName = SecurityUtils.getLoginUser().getNickName();
+            for (int i = 0; i < rows.size(); i++) {
+                MeasuringInstrumentLedgerImportDto row = rows.get(i);
+                int excelRow = i + 2;
+                String code = StringUtils.trim(row.getCode());
+                String name = StringUtils.trim(row.getName());
+                if (!StringUtils.hasText(code)) {
+                    errors.put(excelRow, "璁¢噺鍣ㄥ叿缂栧彿涓嶈兘涓虹┖");
+                    continue;
+                }
+                if (!StringUtils.hasText(name)) {
+                    errors.put(excelRow, "璁¢噺鍣ㄥ叿鍚嶇О涓嶈兘涓虹┖");
+                    continue;
+                }
+                if (!codes.add(code)) {
+                    errors.put(excelRow, "璁¢噺鍣ㄥ叿缂栧彿鍦� Excel 涓噸澶�");
+                    continue;
+                }
+                if (row.getValid() != null && row.getValid() <= 0) {
+                    errors.put(excelRow, "妫�瀹氭湁鏁堟湡蹇呴』澶т簬 0");
+                    continue;
+                }
+                MeasuringInstrumentLedger ledger = new MeasuringInstrumentLedger();
+                ledger.setCode(code);
+                ledger.setName(name);
+                ledger.setModel(StringUtils.trim(row.getModel()));
+                ledger.setMostDate(row.getMostDate());
+                ledger.setValid(row.getValid());
+                ledger.setRecordDate(row.getRecordDate() == null ? new Date() : row.getRecordDate());
+                ledger.setUnit(StringUtils.trim(row.getUnit()));
+                ledger.setDeptId(row.getDeptId());
+                ledger.setInstationLocation(StringUtils.trim(row.getInstationLocation()));
+                ledger.setCycle(StringUtils.trim(row.getCycle()));
+                ledger.setUserId(userId);
+                ledger.setUserName(userName);
+                ledger.setTenantId(tenantId);
+                if (row.getMostDate() != null && row.getValid() != null) {
+                    ledger.setNextDate(new Date(row.getMostDate().getTime() + 86400000L * row.getValid()));
+                }
+                ledgers.add(ledger);
+            }
+            if (!codes.isEmpty()) {
+                for (String code : measuringInstrumentLedgerMapper.selectExistingCodes(tenantId, codes)) {
+                    errors.put(-1, "璁¢噺鍣ㄥ叿缂栧彿宸插瓨鍦細" + code);
+                }
+            }
+            if (!errors.isEmpty()) {
+                return AjaxResult.error("瀵煎叆鏍¢獙澶辫触锛�" + errors.values().stream().limit(100).collect(Collectors.joining("锛�")));
+            }
+            saveBatch(ledgers);
+            return AjaxResult.success("鎴愬姛瀵煎叆 " + ledgers.size() + " 鏉℃暟鎹�");
+        } catch (Exception e) {
+            log.error("璁¢噺鍣ㄥ叿鍙拌处瀵煎叆澶辫触", e);
+            return AjaxResult.error("瀵煎叆澶辫触锛岃妫�鏌� Excel 鍐呭");
+        }
+    }
+
+    @Override
+    public void downloadTemplate(HttpServletResponse response) {
+        ExcelUtil<MeasuringInstrumentLedgerImportDto> util = new ExcelUtil<>(MeasuringInstrumentLedgerImportDto.class);
+        util.importTemplateExcel(response, "璁¢噺鍣ㄥ叿鍙拌处瀵煎叆妯℃澘");
     }
 
     @Override
@@ -131,84 +197,7 @@
         }
         measuringInstrumentLedger.setUserName(sysUser.getUserName());
         measuringInstrumentLedgerMapper.insert(measuringInstrumentLedger);
-        if(!CollectionUtils.isEmpty(measuringInstrumentLedger.getTempFileIds())){
-            migrateTempFilesToFormal(measuringInstrumentLedger.getId(), measuringInstrumentLedger.getTempFileIds(), FileNameType.MEASURING.getValue());
-        }
         return true;
     }
 
-
-    /**
-     * 灏嗕复鏃舵枃浠惰縼绉诲埌姝e紡鐩綍
-     *
-     * @param businessId  涓氬姟ID锛堥攢鍞彴璐D锛�
-     * @param tempFileIds 涓存椂鏂囦欢ID鍒楄〃
-     * @throws IOException 鏂囦欢鎿嶄綔寮傚父
-     */
-    private void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds,Integer fileType) throws IOException {
-        if (CollectionUtils.isEmpty(tempFileIds)) {
-            return;
-        }
-
-        // 鏋勫缓姝e紡鐩綍璺緞锛堟寜涓氬姟绫诲瀷鍜屾棩鏈熷垎缁勶級
-        String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
-
-        Path formalDirPath = Paths.get(formalDir);
-
-        // 纭繚姝e紡鐩綍瀛樺湪锛堥�掑綊鍒涘缓锛�
-        if (!Files.exists(formalDirPath)) {
-            Files.createDirectories(formalDirPath);
-        }
-
-        for (String tempFileId : tempFileIds) {
-            // 鏌ヨ涓存椂鏂囦欢璁板綍
-            TempFile tempFile = tempFileMapper.selectById(tempFileId);
-            if (tempFile == null) {
-                log.warn("涓存椂鏂囦欢涓嶅瓨鍦紝璺宠繃澶勭悊: {}", tempFileId);
-                continue;
-            }
-
-            // 鏋勫缓姝e紡鏂囦欢鍚嶏紙鍖呭惈涓氬姟ID鍜屾椂闂存埑锛岄伩鍏嶅啿绐侊級
-            String originalFilename = tempFile.getOriginalName();
-            String fileExtension = FilenameUtils.getExtension(originalFilename);
-            String formalFilename = businessId + "_" +
-                    System.currentTimeMillis() + "_" +
-                    UUID.randomUUID().toString().substring(0, 8) +
-                    (StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
-
-            Path formalFilePath = formalDirPath.resolve(formalFilename);
-
-            try {
-                // 鎵ц鏂囦欢杩佺Щ锛堜娇鐢ㄥ師瀛愭搷浣滅‘淇濆畨鍏ㄦ�э級
-//                Files.move(
-//                        Paths.get(tempFile.getTempPath()),
-//                        formalFilePath,
-//                        StandardCopyOption.REPLACE_EXISTING,
-//                        StandardCopyOption.ATOMIC_MOVE
-//                );
-                // 鍘熷瓙绉诲姩澶辫触锛屼娇鐢ㄥ鍒�+鍒犻櫎
-                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
-                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
-                log.info("鏂囦欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
-
-                // 鏇存柊鏂囦欢璁板綍锛堝叧鑱斿埌涓氬姟ID锛�
-                CommonFile fileRecord = new CommonFile();
-                fileRecord.setCommonId(businessId);
-                fileRecord.setName(originalFilename);
-                fileRecord.setUrl(formalFilePath.toString());
-                fileRecord.setCreateTime(LocalDateTime.now());
-                fileRecord.setType(fileType);
-                commonFileMapper.insert(fileRecord);
-
-                // 鍒犻櫎涓存椂鏂囦欢璁板綍
-                tempFileMapper.deleteById(tempFile);
-
-                log.info("鏂囦欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
-            } catch (IOException e) {
-                log.error("鏂囦欢杩佺Щ澶辫触: {}", tempFile.getTempPath(), e);
-                // 鍙�夋嫨鍥炴粴浜嬪姟鎴栬褰曞け璐ユ枃浠�
-                throw new IOException("鏂囦欢杩佺Щ寮傚父", e);
-            }
-        }
-    }
 }

--
Gitblit v1.9.3