Преглед изворни кода

新增
1、新增月度费用可以按照天计算金额功能

liangwenxuan пре 2 недеља
родитељ
комит
5a1d8c90ea

+ 1 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/bpm/vo/CheckInExpenseItemReqVo.java

@@ -120,4 +120,5 @@ public class CheckInExpenseItemReqVo {
 
     private Date createTime;
 
+    private Integer isDayCalculate;
 }

+ 6 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/biz/ExpenseItemDO.java

@@ -136,4 +136,10 @@ public class ExpenseItemDO {
 
     private Date createTime;
 
+    /**
+     * 是否按天计算费用
+     */
+    @Schema(description = "是否按天计算费用,0:否,1:是")
+    private Integer isDayCalculate;
+
 }

+ 2 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyAskLeaveServiceImpl.java

@@ -453,7 +453,7 @@ public class ElderlyAskLeaveServiceImpl implements ElderlyAskLeaveService {
             LocalDate monthEnd = currentYearMonth.atEndOfMonth();
             LocalDate periodEnd = endDate.isBefore(monthEnd) ? endDate : monthEnd;
 
-            // 计算这个月的天数
+            // 计算这个月退费的天数
             int daysInMonth = calculateOverlapDays(currentDate, periodEnd, true);
 
             // 特殊处理:如果是最后一个月且不包含结束当天,需要减1天
@@ -502,7 +502,7 @@ public class ElderlyAskLeaveServiceImpl implements ElderlyAskLeaveService {
         // 计算金额
         BigDecimal actualAmount = resolveCustomAmount(outboundRefundItem, expenseItemDO.getActualAmount());
         int monthTotalDays = yearMonth.lengthOfMonth();
-        BigDecimal dayPrice = actualAmount.divide(BigDecimal.valueOf(monthTotalDays), 5, RoundingMode.HALF_UP);
+        BigDecimal dayPrice = expenseItemDO.getIsDayCalculate() == 1 ? expenseItemDO.getActualAmount() :actualAmount.divide(BigDecimal.valueOf(monthTotalDays), 5, RoundingMode.HALF_UP);
         BigDecimal monthAmount = dayPrice.multiply(BigDecimal.valueOf(daysInMonth)).setScale(2, RoundingMode.HALF_UP);
 
         dailyExpenses.setPrice(dayPrice);

+ 4 - 4
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ElderlyTempOutServiceImpl.java

@@ -277,11 +277,11 @@ public class ElderlyTempOutServiceImpl implements ElderlyTempOutService {
                 respVO.setExpenseSource(BusinessConstants.EXPENSE_ITEM);
                 respVO.setSourceExpenseItemId(item.getId());
 
-                BigDecimal monthAmount = item.getTotalAmount() == null ? BigDecimal.ZERO : item.getTotalAmount();
+                BigDecimal monthAmount = item.getActualAmount() == null ? BigDecimal.ZERO : item.getActualAmount();
                 BigDecimal dayPrice = BigDecimal.ZERO;
                 BigDecimal addAmount = BigDecimal.ZERO;
                 if (monthAmount.compareTo(BigDecimal.ZERO) != 0 && daysInMonth > 0 && addDays > 0) {
-                    dayPrice = monthAmount.divide(BigDecimal.valueOf(daysInMonth), 8, RoundingMode.DOWN);
+                    dayPrice = item.getIsDayCalculate() == 1 ? item.getActualAmount() : monthAmount.divide(BigDecimal.valueOf(daysInMonth), 8, RoundingMode.DOWN);
                     addAmount = dayPrice.multiply(BigDecimal.valueOf(addDays)).setScale(2, RoundingMode.HALF_UP);
                 }
 
@@ -323,12 +323,12 @@ public class ElderlyTempOutServiceImpl implements ElderlyTempOutService {
                 continue;
             }
 
-            BigDecimal monthAmount = item.getTotalAmount() == null ? BigDecimal.ZERO : item.getTotalAmount();
+            BigDecimal monthAmount = item.getActualAmount() == null ? BigDecimal.ZERO : item.getActualAmount();
             if (monthAmount.compareTo(BigDecimal.ZERO) == 0) {
                 continue;
             }
 
-            BigDecimal dayPrice = monthAmount.divide(BigDecimal.valueOf(daysInMonth), 8, RoundingMode.DOWN);
+            BigDecimal dayPrice = item.getIsDayCalculate() == 1 ? item.getActualAmount() : monthAmount.divide(BigDecimal.valueOf(daysInMonth), 8, RoundingMode.DOWN);
             BigDecimal addAmount = dayPrice.multiply(BigDecimal.valueOf(addDays)).setScale(2, RoundingMode.HALF_UP);
             if (addAmount.compareTo(BigDecimal.ZERO) == 0) {
                 continue;

+ 17 - 12
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -3739,20 +3739,25 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
                 }
                 respVO.setExpenseSource(BusinessConstants.EXPENSE_ITEM);
                 respVO.setSourceExpenseItemId(item.getId());
-                BigDecimal originAmount = item.getActualAmount();
-                BigDecimal originTotal = item.getTotalAmount();
-                if (finalActualStart.isAfter(monthStart) || finalActualEnd.isBefore(monthEnd)) {
-                    long monthDays = ChronoUnit.DAYS.between(monthStart, monthEnd) + 1;
-                    long actualDays = ChronoUnit.DAYS.between(finalActualStart, finalActualEnd) + 1;
-                    if (monthDays > 0 && actualDays > 0) {
-                        BigDecimal ratio = BigDecimal.valueOf(actualDays)
-                                .divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.HALF_UP);
-                        originAmount = originAmount.multiply(ratio).setScale(2, RoundingMode.HALF_UP);
-                        originTotal = originTotal.multiply(ratio).setScale(2, RoundingMode.HALF_UP);
+                long monthDays = ChronoUnit.DAYS.between(monthStart, monthEnd) + 1;
+                if (item.getIsDayCalculate() == 1){
+                    respVO.setPrice(item.getActualAmount());
+                    respVO.setTotalAmount(respVO.getPrice().multiply(new BigDecimal(monthDays)));
+                }else {
+                    BigDecimal originAmount = item.getActualAmount();
+                    BigDecimal originTotal = item.getTotalAmount();
+                    if (finalActualStart.isAfter(monthStart) || finalActualEnd.isBefore(monthEnd)) {
+                        long actualDays = ChronoUnit.DAYS.between(finalActualStart, finalActualEnd) + 1;
+                        if (monthDays > 0 && actualDays > 0) {
+                            BigDecimal ratio = BigDecimal.valueOf(actualDays)
+                                    .divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.HALF_UP);
+                            originAmount = originAmount.multiply(ratio).setScale(2, RoundingMode.HALF_UP);
+                            originTotal = originTotal.multiply(ratio).setScale(2, RoundingMode.HALF_UP);
+                        }
                     }
+                    respVO.setPrice(originAmount);
+                    respVO.setTotalAmount(originTotal);
                 }
-                respVO.setPrice(originAmount);
-                respVO.setTotalAmount(originTotal);
                 respVO.setItemName(item.getItemName());
                 respVO.setItemCategory(item.getItemCategoryName());
                 respVO.setCount(item.getCount() == null ? 1 : item.getCount());

+ 23 - 14
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseServiceImpl.java

@@ -235,24 +235,33 @@ public class ExpenseServiceImpl implements ExpenseService {
 
 
             //判断是否是月初一号入住的,那就按照一整月计算,不要按照天数算
-            if (localDate.getDayOfMonth() == 1) {
-                amount = amount.add(item.getActualAmount());
+            if(item.getIsDayCalculate() == 1){
                 orderItemDO.setPrice(item.getAmount());
                 orderItemDO.setActualPrice(item.getActualAmount());
-                orderItemDO.setTotalAmount(item.getTotalAmount());
-                orderItemDO.setRoundAmount(orderItemDO.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
-                orderItemDO.setRoundTwoDecimalAmount(orderItemDO.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
-            } else {
-                BigDecimal actualAmount = item.getActualAmount();
-                BigDecimal dayPrice = actualAmount.divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.DOWN);
-                BigDecimal actualPrice = dayPrice.multiply(BigDecimal.valueOf(daysUntilMonthEnd)).setScale(8, RoundingMode.DOWN);
-                amount = amount.add(actualPrice.setScale(2, RoundingMode.HALF_UP));
-
-                orderItemDO.setPrice(item.getAmount());
-                orderItemDO.setActualPrice(item.getActualAmount());
-                orderItemDO.setTotalAmount(actualPrice);
+                orderItemDO.setTotalAmount(item.getTotalAmount().multiply(new BigDecimal(daysUntilMonthEnd)));
                 orderItemDO.setRoundAmount(orderItemDO.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
                 orderItemDO.setRoundTwoDecimalAmount(orderItemDO.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                amount = amount.add(orderItemDO.getTotalAmount());
+            }else {
+                if (localDate.getDayOfMonth() == 1) {
+                    amount = amount.add(item.getActualAmount());
+                    orderItemDO.setPrice(item.getAmount());
+                    orderItemDO.setActualPrice(item.getActualAmount());
+                    orderItemDO.setTotalAmount(item.getTotalAmount());
+                    orderItemDO.setRoundAmount(orderItemDO.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
+                    orderItemDO.setRoundTwoDecimalAmount(orderItemDO.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                } else {
+                    BigDecimal actualAmount = item.getActualAmount();
+                    BigDecimal dayPrice = actualAmount.divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.DOWN);
+                    BigDecimal actualPrice = dayPrice.multiply(BigDecimal.valueOf(daysUntilMonthEnd)).setScale(8, RoundingMode.DOWN);
+                    amount = amount.add(actualPrice.setScale(2, RoundingMode.HALF_UP));
+
+                    orderItemDO.setPrice(item.getAmount());
+                    orderItemDO.setActualPrice(item.getActualAmount());
+                    orderItemDO.setTotalAmount(actualPrice);
+                    orderItemDO.setRoundAmount(orderItemDO.getTotalAmount().setScale(0, RoundingMode.HALF_UP));
+                    orderItemDO.setRoundTwoDecimalAmount(orderItemDO.getTotalAmount().setScale(2, RoundingMode.HALF_UP));
+                }
             }
             orderItemDO.setCreatedTime(new Date());
             orderItemDO.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());

+ 3 - 1
yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/ExpenseItemMapper.xml

@@ -59,7 +59,8 @@
         expense_data.changeEndDate,
         expense_data.changeFlag,
         expense_data.createTime,
-        expense_data.billAmount
+        expense_data.billAmount,
+        expense_data.isDayCalculate
         FROM (
         SELECT
         eei.id,
@@ -159,6 +160,7 @@
         eei.change_end_date AS changeEndDate,
         eei.change_flag AS changeFlag,
         eei.create_time AS createTime,
+        eei.is_day_calculate AS isDayCalculate,
         CASE
         WHEN DATE_FORMAT(eei.change_start_date, '%Y-%m') = #{billingMonth}
         THEN COALESCE(