From 33f8bb2acdf33d276f408cd74cc274b772a559e3 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期五, 07 三月 2025 18:29:00 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java      |    9 +++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MyFileUtil.java          |  128 ++++++++++++++++++++++++++++++++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java |   14 ++--
 3 files changed, 144 insertions(+), 7 deletions(-)

diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java
index c205b59..989234b 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/IndexController.java
@@ -21,6 +21,7 @@
 import com.ruoyi.system.query.*;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.*;
+import com.ruoyi.web.controller.tool.MyFileUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import jdk.nashorn.internal.parser.Token;
@@ -31,7 +32,10 @@
 import org.springframework.util.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -76,6 +80,11 @@
     private TContractRentTypeService contractRentTypeService;
     @Autowired
     private StateProcessTemplateService processTemplateService;
+
+    public static void main(String[] args) throws IOException {
+        File file = new File("D:\\wechatFiles\\WeChat Files\\wxid_25nztsudcon722\\FileStorage\\File\\2025-03\\2.mp3");
+        MultipartFile multipartFile = MyFileUtil.fileToMultipartFile(file, "3333");
+    }
     /**
      * 获取轮播图管理列表
      */
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MyFileUtil.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MyFileUtil.java
new file mode 100644
index 0000000..40af28a
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/MyFileUtil.java
@@ -0,0 +1,128 @@
+package com.ruoyi.web.controller.tool;
+
+import org.springframework.web.multipart.MultipartFile;
+import java.io.*;
+import java.nio.file.Files;
+ 
+ 
+/**
+ * @author RainbowCloud
+ */
+public class MyFileUtil {
+ 
+    /**
+     * 将 File 转换为 MultipartFile。
+     *
+     * @param file      要转换的文件
+     * @param fieldName 字段名,通常用于表单中的文件字段名
+     * @return 转换后的 MultipartFile
+     * @throws IOException 如果发生I/O错误
+     */
+    public static MultipartFile fileToMultipartFile(File file, String fieldName) throws IOException {
+        try {
+            if (file == null || !file.exists()) {
+                throw new FileNotFoundException("文件未找到:" + file);
+            }
+            byte[] content = Files.readAllBytes(file.toPath());
+            return new ByteArrayMultipartFile(content, file.getName(), fieldName, Files.probeContentType(file.toPath()));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            // 删除临时文件
+            file.delete();
+        }
+    }
+ 
+    /**
+     * 将 MultipartFile 转换为 File。
+     *
+     * @param multipartFile 要转换的 MultipartFile
+     * @return 转换后的 File
+     * @throws IOException 如果发生I/O错误
+     */
+    public static File multipartFileToFile(MultipartFile multipartFile) throws IOException {
+        if (multipartFile.isEmpty()) {
+            throw new IOException("传入的MultipartFile为空");
+        }
+        String originalFilename = multipartFile.getOriginalFilename();
+        String tempFileSuffix = originalFilename != null ? originalFilename.substring(originalFilename.lastIndexOf('.')) : ".tmp";
+        File tempFile = File.createTempFile("temp", tempFileSuffix);
+        try (InputStream ins = multipartFile.getInputStream();
+             OutputStream os = new FileOutputStream(tempFile)) {
+            byte[] buffer = new byte[8192];
+            int bytesRead;
+            while ((bytesRead = ins.read(buffer)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+        }
+        return tempFile;
+    }
+ 
+    /**
+     * 内置一个简单的 MultipartFile 实现类,用于File转换
+     */
+    private static class ByteArrayMultipartFile implements MultipartFile {
+        private final byte[] content;
+        private final String name;
+        private final String originalFilename;
+        private final String contentType;
+ 
+        /**
+         * 构造函数
+         *
+         * @param content         文件内容
+         * @param originalFilename 文件原始名字
+         * @param name            字段名
+         * @param contentType     文件类型
+         */
+        public ByteArrayMultipartFile(byte[] content, String originalFilename, String name, String contentType) {
+            this.content = content;
+            this.originalFilename = originalFilename;
+            this.name = name;
+            this.contentType = contentType;
+        }
+ 
+        @Override
+        public String getName() {
+            return this.name;
+        }
+ 
+        @Override
+        public String getOriginalFilename() {
+            return this.originalFilename;
+        }
+ 
+        @Override
+        public String getContentType() {
+            return this.contentType;
+        }
+ 
+        @Override
+        public boolean isEmpty() {
+            return (this.content == null || this.content.length == 0);
+        }
+ 
+        @Override
+        public long getSize() {
+            return this.content.length;
+        }
+ 
+        @Override
+        public byte[] getBytes() {
+            return this.content;
+        }
+ 
+        @Override
+        public InputStream getInputStream() {
+            return new ByteArrayInputStream(this.content);
+        }
+ 
+        @Override
+        public void transferTo(File dest) throws IOException, IllegalStateException {
+            try (OutputStream os = new FileOutputStream(dest)) {
+                os.write(this.content);
+            }
+        }
+    }
+ 
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
index e4f3ba8..dd8ced0 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/FlowListenerService.java
@@ -294,7 +294,7 @@
                 }
                 if (tContractRentType != null && rentBill.getEndTime().isAfter(tContractRentType.getChangeTime())) {
                     long moneyDays = 0;
-                    moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), rentBill.getEndTime());
+                    moneyDays = ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), rentBill.getEndTime())+1;
                     // 计算租金变动的天数
                     contract.setChangeTime(tContractRentType.getChangeTime());
                     // 递增递减的租金
@@ -330,14 +330,14 @@
                             break;
                     }
                     // 不需要涨租金的时间段
-                    long originalDays = Math.abs(ChronoUnit.DAYS.between(contract.getFirstPayTime(), tContractRentType.getChangeTime()));
+                    long originalDays = Math.abs(ChronoUnit.DAYS.between(contract.getFirstPayTime(), tContractRentType.getChangeTime()))+1;
                     originalMoney = originalMoney.add(contract.getMonthRent().divide(new BigDecimal(30), 2, BigDecimal.ROUND_DOWN))
                             .multiply(new BigDecimal(originalDays));
                     rentBill.setPayableFeesMoney(contractRentTypeMoney.add(originalMoney));
                     rentBill.setOutstandingMoney(rentBill.getPayableFeesMoney());
                 } else {
                     // 不走递增递减
-                    long allDays = ChronoUnit.DAYS.between(contract.getStartPayTime(), rentBill.getEndTime());
+                    long allDays = ChronoUnit.DAYS.between(contract.getStartPayTime(), rentBill.getEndTime())+1;
                     int dayOfMonth = rentBill.getStartTime().getDayOfMonth();
                     if (dayOfMonth == 1) {
                         rentBill.setPayableFeesMoney(contract.getMonthRent().multiply(new BigDecimal(contract.getPayType().equals("1") ? 1 : contract.getPayType().equals("2") ? 3 : 12)));
@@ -394,7 +394,7 @@
                                         if (changeTime.isBefore(tBill.getEndTime()) && changeTime.isAfter(tBill.getStartTime())) {
                                             contract.setChangeTime(changeTime);
                                             // 租金递增递减的时长 天
-                                            long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tBill.getEndTime()));
+                                            long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tBill.getEndTime()))+1;
                                             // 递增递减的租金
                                             BigDecimal contractRentTypeMoney = new BigDecimal("0");
                                             // 不递增递减的租金
@@ -446,7 +446,7 @@
                                             System.err.println("首次递增递减");
                                             contract.setChangeTime(tContractRentType.getChangeTime());
                                             // 租金递增递减的时长 天
-                                            long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tBill.getEndTime()));
+                                            long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tBill.getEndTime()))+1;
                                             // 递增递减的租金
                                             BigDecimal contractRentTypeMoney = new BigDecimal("0");
                                             // 不递增递减的租金
@@ -536,7 +536,7 @@
                                 if (changeTime.isBefore(tBill.getEndTime()) && changeTime.isAfter(tBill.getStartTime())) {
                                     contract.setChangeTime(changeTime);
                                     // 租金递增递减的时长 天
-                                    long moneyDays = Math.abs(ChronoUnit.DAYS.between(changeTime, tBill.getEndTime()));
+                                    long moneyDays = Math.abs(ChronoUnit.DAYS.between(changeTime, tBill.getEndTime()))+1;
                                     // 递增递减的租金
                                     BigDecimal contractRentTypeMoney = new BigDecimal("0");
                                     // 不递增递减的租金
@@ -587,7 +587,7 @@
                                 if (tContractRentType.getChangeTime().isBefore(tBill.getEndTime()) && tContractRentType.getChangeTime().isAfter(tBill.getStartTime())) {
                                     contract.setChangeTime(tContractRentType.getChangeTime());
                                     // 租金递增递减的时长 天
-                                    long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tBill.getEndTime()));
+                                    long moneyDays = Math.abs(ChronoUnit.DAYS.between(tContractRentType.getChangeTime(), tBill.getEndTime()))+1;
                                     // 递增递减的租金
                                     BigDecimal contractRentTypeMoney = new BigDecimal("0");
                                     // 不递增递减的租金

--
Gitblit v1.7.1