Browse Source

计算周期

drew 6 years ago
parent
commit
d2cdf3f6ee

+ 1 - 1
src/main/java/com/izouma/zhumj/domain/sale/Contract.java

@@ -168,7 +168,7 @@ public class Contract extends BaseEntity implements Serializable {
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "contractId")
     @ApiModelProperty("账单")
-    List<ContractCycle> bills = new ArrayList<>();
+    List<ContractBill> bills = new ArrayList<>();
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "contractId")

+ 0 - 1
src/main/java/com/izouma/zhumj/domain/sale/IndividualBill.java

@@ -32,7 +32,6 @@ public class IndividualBill extends BaseEntity {
     @ApiModelProperty(value = "门店id", name = "storeId")
     private Long storeId;
 
-
     @ApiModelProperty(value = "账单id", name = "cycleId")
     private Long cycleId;
 

+ 72 - 3
src/main/java/com/izouma/zhumj/service/sale/ContractService.java

@@ -10,6 +10,7 @@ import com.izouma.zhumj.dto.ContractCheckinInfo;
 import com.izouma.zhumj.dto.PageQuery;
 import com.izouma.zhumj.dto.sale.StoreContractDTO;
 import com.izouma.zhumj.enums.BillStatus;
+import com.izouma.zhumj.enums.BillType;
 import com.izouma.zhumj.enums.CheckInType;
 import com.izouma.zhumj.event.ContractUpdateEvent;
 import com.izouma.zhumj.event.NewContractEvent;
@@ -34,9 +35,8 @@ import org.springframework.util.ObjectUtils;
 
 import javax.persistence.criteria.Predicate;
 import javax.transaction.Transactional;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.math.BigDecimal;
+import java.time.*;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
@@ -179,6 +179,36 @@ public class ContractService {
 
                 }
             }
+
+            int idx = 1;
+            if (record.getCheckInType() == CheckInType.TEAM_POST_PAID) {
+                List<ContractBill> bills = new ArrayList<>();
+                LocalDate date = record.getContractBeginTime().toLocalDate();
+                while (YearMonth.from(date).compareTo(YearMonth.from(record.getContractEndTime())) <= 0) {
+                    YearMonth month = YearMonth.from(date);
+                    ContractBill contractBill = ContractBill.builder()
+                            .startTime(month.atDay(1).atTime(LocalTime.MIN))
+                            .endTime(month.atEndOfMonth().atTime(Constants.TIME_MAX))
+                            .dueTime(month.atEndOfMonth().atTime(LocalTime.MIN))
+                            .customerId(record.getCustomerId())
+                            .saleId(record.getSaleId())
+                            .type(BillType.POST_PAID)
+                            .status(BillStatus.PENDING)
+                            .idx(idx++)
+                            .build();
+                    bills.add(contractBill);
+                    date = date.plusMonths(1);
+                }
+                record.setBills(bills);
+            } else {
+                for (ContractBill bill : record.getBills()) {
+                    bill.setSaleId(record.getSaleId());
+                    bill.setStatus(BillStatus.NOT_PAID);
+                    bill.setType(BillType.PRE_PAID);
+                    bill.setCustomerId(record.getCustomerId());
+                    bill.setIdx(idx++);
+                }
+            }
         }
         List<ContractRoomType> roomList = new ArrayList<>();
         //设置房型信息存储
@@ -428,4 +458,43 @@ public class ContractService {
                                 .orElse(null))
                         .build()).collect(Collectors.toList());
     }
+
+    public static List<ContractBill> calcBills(Contract contract) {
+        if (contract.getCheckInType() == CheckInType.TEAM
+                || contract.getCheckInType() == CheckInType.SCATTERED_BEDS) {
+            int totalMonth = contract.getContractMonthly();
+            LocalDateTime dueTime = contract.getContractBeginTime().plusDays(contract.getAdvancePayment());
+            List<ContractBill> bills = new ArrayList<>();
+            int idx = 0;
+            while (totalMonth > 0) {
+                LocalDateTime startTime = contract.getContractBeginTime().plusMonths(contract.getPay() * idx);
+                LocalDateTime endTime = startTime.plusMonths(contract.getPay());
+                if (endTime.isAfter(contract.getContractEndTime())) {
+                    endTime = contract.getContractEndTime();
+                } else {
+                    endTime = endTime.plusSeconds(-1);
+                }
+                int month = totalMonth - contract.getPay() <= 0 ? totalMonth : contract.getPay();
+                BigDecimal money = contract.getMonthlyRent().multiply(BigDecimal.valueOf(month));
+                if (idx == 0) {
+                    money = money.add(contract.getFlowBet());
+                }
+                ContractBill bill = ContractBill.builder()
+                        .idx(++idx)
+                        .dueTime(dueTime)
+                        .startTime(startTime)
+                        .endTime(endTime)
+                        .money(money)
+                        .build();
+                bills.add(bill);
+                totalMonth = Math.max(0, totalMonth - contract.getPay());
+                dueTime = dueTime.plusMonths(contract.getPay());
+
+                System.out.println(String.format("%s %s %s %s",
+                        bill.getStartTime(), bill.getEndTime(), bill.getDueTime(), bill.getMoney()));
+            }
+            return bills;
+        }
+        return null;
+    }
 }

+ 3 - 0
src/main/vue/src/components/sale/ContractRoomChoose.vue

@@ -157,5 +157,8 @@ export default {
             padding-right: 12px;
         }
     }
+    .el-select {
+        width: auto;
+    }
 }
 </style>

+ 6 - 0
src/main/vue/src/styles/app.less

@@ -270,3 +270,9 @@ li {
 * {
     outline: none;
 }
+
+.edit-view {
+    .el-select {
+        width: 215px;
+    }
+}

+ 6 - 6
src/main/vue/src/views/sale/ContractEdit.vue

@@ -613,11 +613,12 @@ export default {
                 {
                     value: 'TEAM_POST_PAID',
                     label: '团散'
-                },
-                {
-                    value: 'INDIVIDUAL',
-                    label: '散客'
                 }
+                // ,
+                // {
+                //     value: 'INDIVIDUAL',
+                //     label: '散客'
+                // }
             ],
             ContractSourceType: [
                 {
@@ -795,7 +796,6 @@ export default {
             let billDate = addDays(contractBeginTime, -this.formData.advancePayment);
             let maxDate = addMonths(contractEndTime, -pay);
             let bills = [];
-            let money = 0;
             let index = 0;
             let totalMoney = 0;
             if (this.formData.checkInType == 'TEAM' || this.formData.checkInType == 'SCATTERED_BEDS') {
@@ -1222,4 +1222,4 @@ export default {
         }
     }
 }
-</style>
+</style>

+ 20 - 1
src/test/java/com/izouma/zhumj/CommonTest.java

@@ -3,7 +3,11 @@ package com.izouma.zhumj;
 import com.izouma.zhumj.config.Constants;
 import com.izouma.zhumj.domain.BaseEntity;
 import com.izouma.zhumj.domain.User;
+import com.izouma.zhumj.domain.sale.Contract;
+import com.izouma.zhumj.enums.CheckInType;
 import com.izouma.zhumj.enums.DepositRefundStatus;
+import com.izouma.zhumj.service.sale.ContractService;
+import com.izouma.zhumj.utils.DateTimeUtils;
 import com.izouma.zhumj.utils.NullAwareBeanUtilsBean;
 import com.izouma.zhumj.web.BaseController;
 import org.apache.commons.beanutils.BeanUtilsBean;
@@ -193,7 +197,22 @@ public class CommonTest {
     }
 
     @Test
-    public void testNumberic(){
+    public void testNumberic() {
         System.out.println(StringUtils.isNumeric("1233"));
     }
+
+    @Test
+    public void testCalcBills() {
+        Contract contract = Contract.builder()
+                .checkInType(CheckInType.TEAM)
+                .contractMonthly(14)
+                .pay(3)
+                .advancePayment(5)
+                .flowBet(BigDecimal.valueOf(3000))
+                .monthlyRent(BigDecimal.valueOf(5000))
+                .contractBeginTime(DateTimeUtils.toLocalDateTime("2020-03-01 00:00:00", DateTimeUtils.DATE_TIME_HHMMSS_FORMAT))
+                .contractEndTime(DateTimeUtils.toLocalDateTime("2020-03-01 00:00:00", DateTimeUtils.DATE_TIME_HHMMSS_FORMAT).plusMonths(14).plusSeconds(-1))
+                .build();
+        ContractService.calcBills(contract);
+    }
 }

+ 1 - 0
src/test/java/com/izouma/zhumj/repo/sale/ContractRepoTest.java

@@ -325,4 +325,5 @@ public class ContractRepoTest extends ZhumjApplicationTests {
         contractRoomType.setContractId(contract.getId());
         contractRoomTypeRepo.save(contractRoomType);
     }
+
 }