Преглед на файлове

feat(property): 新增合同签约功能并优化房屋信息获取

- 在 AContractInfoController 中添加签合同接口
- 在 AContractInfoService 中添加签合同方法
- 实现合同信息的保存和处理逻辑
- 优化房屋详细信息获取方法,增加设备信息和租户信息
- 新增合同相关数据结构和工厂类
nahida преди 10 месеца
родител
ревизия
038f3826fd
променени са 18 файла, в които са добавени 481 реда и са изтрити 104 реда
  1. 7 0
      src/main/java/com/zksy/controller/property/AContractInfoController.java
  2. 5 0
      src/main/java/com/zksy/property/constant/ContractConstant.java
  3. 9 0
      src/main/java/com/zksy/property/domain/bo/Contract.java
  4. 19 0
      src/main/java/com/zksy/property/domain/bo/ContractA.java
  5. 33 0
      src/main/java/com/zksy/property/domain/bo/ContractB.java
  6. 17 0
      src/main/java/com/zksy/property/domain/bo/ContractC.java
  7. 2 0
      src/main/java/com/zksy/property/domain/bo/RentalTempBo.java
  8. 31 0
      src/main/java/com/zksy/property/domain/dto/ContractFormDTO.java
  9. 21 0
      src/main/java/com/zksy/property/factory/ContractFactory.java
  10. 3 0
      src/main/java/com/zksy/property/service/AContractInfoService.java
  11. 177 13
      src/main/java/com/zksy/property/service/impl/AContractInfoServiceImpl.java
  12. 35 16
      src/main/java/com/zksy/property/service/impl/ARentalContractServiceImpl.java
  13. 76 53
      src/main/java/com/zksy/property/service/impl/ASimplifiedHouseInfoServiceImpl.java
  14. BIN
      src/main/resources/templates/~$2.docx
  15. BIN
      src/main/resources/templates/~$3.docx
  16. 34 0
      src/test/java/com/zksy/property/service/impl/AContractInfoServiceImplTest.java
  17. 4 1
      src/test/java/com/zksy/property/service/impl/ARentalContractServiceImplTest.java
  18. 8 21
      src/test/java/com/zksy/property/service/impl/ASimplifiedHouseInfoServiceImplTest.java

+ 7 - 0
src/main/java/com/zksy/controller/property/AContractInfoController.java

@@ -1,6 +1,7 @@
 package com.zksy.controller.property;
 
 import com.zksy.property.domain.AContractInfo;
+import com.zksy.property.domain.dto.ContractFormDTO;
 import com.zksy.property.service.AContractInfoService;
 import com.zksy.utils.AjaxResult;
 import io.swagger.annotations.Api;
@@ -62,4 +63,10 @@ public class AContractInfoController {
         return AjaxResult.success(service.getBySimplifiedHouseId(simplifiedHouseId));
     }
 
+    @PostMapping("/signContract")
+    @ApiOperation(value = "合同信息签约")
+    public AjaxResult signContract(@RequestBody ContractFormDTO dto) {
+        return AjaxResult.success(service.signContract(dto));
+    }
+
 }

+ 5 - 0
src/main/java/com/zksy/property/constant/ContractConstant.java

@@ -0,0 +1,5 @@
+package com.zksy.property.constant;
+
+public class ContractConstant {
+    public static final String PARTY_B = "沅陵园区";
+}

+ 9 - 0
src/main/java/com/zksy/property/domain/bo/Contract.java

@@ -0,0 +1,9 @@
+package com.zksy.property.domain.bo;
+
+
+import lombok.Data;
+
+@Data
+public abstract class Contract {
+
+}

+ 19 - 0
src/main/java/com/zksy/property/domain/bo/ContractA.java

@@ -0,0 +1,19 @@
+package com.zksy.property.domain.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractA extends Contract{
+    private String tenantName;//租方
+    private String landlordName;//房东
+    private String tenantTimeStart;//租期开始时间
+    private String tenantTime;//租期
+    private String tenantTimeEnd;//租期结束时间
+    private String tenantRent;//每套租金
+    private String tenantDeposit;//每套物业费
+    private String tenantDepositAmount;//押金
+}

+ 33 - 0
src/main/java/com/zksy/property/domain/bo/ContractB.java

@@ -0,0 +1,33 @@
+package com.zksy.property.domain.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractB extends Contract{
+    private String purpose;//用途
+
+    private String landlordName;//房东
+    private String landlordUniCode;//法人统一社会信用代码
+    private String landlordlegalRepresentative;//法定代表人
+    private String landlordDuty;//房东职务
+
+    private String tenantName;//租方
+    private String tenantUniCode;//租方统一社会信用代码
+    private String tenantLegalRepresentative;//法定代表人
+    private String tenantDuty;//租方职务
+
+    private String who;//谁
+    private String whatTime;//何时
+    private String title;//标题
+
+
+    private String tenantTimeStart;//租期开始时间
+    private String tenantTimeEnd;//租期结束时间
+    private String tenantRent;//每套租金
+    private String tenantDeposit;//每套物业费
+    private String tenantDepositAmount;//押金
+}

+ 17 - 0
src/main/java/com/zksy/property/domain/bo/ContractC.java

@@ -0,0 +1,17 @@
+package com.zksy.property.domain.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractC extends Contract{
+    private String tenantName;//租方
+    private String tenantTimeStart;//租期开始时间
+    private String tenantTimeEnd;//租期结束时间
+    private String tenantRent;//每套租金
+    private String tenantDeposit;//每套物业费
+    private String tenantDepositAmount;//押金
+}

+ 2 - 0
src/main/java/com/zksy/property/domain/bo/RentalTempBo.java

@@ -73,6 +73,8 @@ public class RentalTempBo {
     private String b52;
     private String b53;
     private String b54;
+    private String b55;
+    private String b56;
 
     private String c1;
     private String c2;

+ 31 - 0
src/main/java/com/zksy/property/domain/dto/ContractFormDTO.java

@@ -0,0 +1,31 @@
+package com.zksy.property.domain.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ContractFormDTO {
+
+    private String houseId;
+    private Map<String,Object> contractData;
+    private RentalInfo rentalInfo;
+
+
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @Data
+    public static class RentalInfo {
+        private String rentalName ;//租客名称
+        private String rentalPhone ;//租客手机
+        private String rentalIdCard ;//租客身份证
+        private String rentalTimeStart ;//租客开始时间
+        private String rentalTime ;//租期
+        private String rentalRect ;//租金
+    }
+
+}

+ 21 - 0
src/main/java/com/zksy/property/factory/ContractFactory.java

@@ -0,0 +1,21 @@
+package com.zksy.property.factory;
+
+import com.zksy.property.domain.bo.Contract;
+import com.zksy.property.domain.bo.ContractA;
+import com.zksy.property.domain.bo.ContractB;
+import com.zksy.property.domain.bo.ContractC;
+
+public class ContractFactory {
+    public static Contract createContract(String houseType) {
+        switch (houseType) {
+            case "公租房":
+                return new ContractA();
+            case "厂房":
+                return new ContractB();
+            case "创新创业基地":
+                return new ContractC();
+            default:
+                throw new IllegalArgumentException("不支持的房屋类型: " + houseType);
+        }
+    }
+}

+ 3 - 0
src/main/java/com/zksy/property/service/AContractInfoService.java

@@ -3,6 +3,7 @@ package com.zksy.property.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zksy.property.domain.AContractInfo;
+import com.zksy.property.domain.dto.ContractFormDTO;
 
 import java.util.List;
 
@@ -16,4 +17,6 @@ public interface AContractInfoService extends IService<AContractInfo> {
     List<AContractInfo> getAContractInfoList(String contractNumber,String contractDate,String contractStatus);
 
     AContractInfo getBySimplifiedHouseId(String simplifiedHouseId);
+
+    String signContract(ContractFormDTO dto);
 }

+ 177 - 13
src/main/java/com/zksy/property/service/impl/AContractInfoServiceImpl.java

@@ -1,31 +1,45 @@
 package com.zksy.property.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.property.domain.AContractInfo;
+import com.zksy.property.domain.ASimplifiedHouseInfo;
+import com.zksy.property.domain.bo.*;
+import com.zksy.property.domain.dto.ContractFormDTO;
+import com.zksy.property.domain.vo.HouseInfoVo;
+import com.zksy.property.factory.ContractFactory;
 import com.zksy.property.mapper.AContractInfoMapper;
 import com.zksy.property.service.AContractInfoService;
+import com.zksy.property.service.ARentalContractService;
+import com.zksy.property.service.ASimplifiedHouseInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
 
 /**
-* @author Administrator
-* @description 针对表【a_contract_info(合同信息表)】的数据库操作Service实现
-* @createDate 2025-07-14 11:59:44
-*/
+ * @author Administrator
+ * @description 针对表【a_contract_info(合同信息表)】的数据库操作Service实现
+ * @createDate 2025-07-14 11:59:44
+ */
 @Service
 public class AContractInfoServiceImpl extends ServiceImpl<AContractInfoMapper, AContractInfo>
-    implements AContractInfoService{
+        implements AContractInfoService {
+
+    @Autowired
+    @Lazy
+    private ASimplifiedHouseInfoService aSimplifiedHouseInfoService;
 
     @Override
     public Page<AContractInfo> findByPage(long pageNum, long pageSize, String contractNumber, String contractDate, String contractStatus) {
-        Page<AContractInfo> page = new Page<>(pageNum,pageSize);
+        Page<AContractInfo> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<AContractInfo> queryWrapper = new LambdaQueryWrapper();
-        queryWrapper.like(contractNumber != null,AContractInfo::getContractNumber,contractNumber);
-        queryWrapper.eq(contractDate != null,AContractInfo::getContractDate,contractDate);
-        queryWrapper.like(contractStatus != null,AContractInfo::getContractStatus,contractStatus);
+        queryWrapper.like(contractNumber != null, AContractInfo::getContractNumber, contractNumber);
+        queryWrapper.eq(contractDate != null, AContractInfo::getContractDate, contractDate);
+        queryWrapper.like(contractStatus != null, AContractInfo::getContractStatus, contractStatus);
         queryWrapper.orderByDesc(AContractInfo::getUpdateTime);
         Page<AContractInfo> page1 = this.page(page, queryWrapper);
         return page1;
@@ -34,9 +48,9 @@ public class AContractInfoServiceImpl extends ServiceImpl<AContractInfoMapper, A
     @Override
     public List<AContractInfo> getAContractInfoList(String contractNumber, String contractDate, String contractStatus) {
         LambdaQueryWrapper<AContractInfo> queryWrapper = new LambdaQueryWrapper();
-        queryWrapper.like(contractNumber != null,AContractInfo::getContractNumber,contractNumber);
-        queryWrapper.eq(contractDate != null,AContractInfo::getContractDate,contractDate);
-        queryWrapper.like(contractStatus != null,AContractInfo::getContractStatus,contractStatus);
+        queryWrapper.like(contractNumber != null, AContractInfo::getContractNumber, contractNumber);
+        queryWrapper.eq(contractDate != null, AContractInfo::getContractDate, contractDate);
+        queryWrapper.like(contractStatus != null, AContractInfo::getContractStatus, contractStatus);
         List<AContractInfo> list = this.list(queryWrapper);
         return list;
     }
@@ -44,9 +58,159 @@ public class AContractInfoServiceImpl extends ServiceImpl<AContractInfoMapper, A
     @Override
     public AContractInfo getBySimplifiedHouseId(String simplifiedHouseId) {
         LambdaQueryWrapper<AContractInfo> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(AContractInfo::getSimplifiedHouseId,simplifiedHouseId);
+        queryWrapper.eq(AContractInfo::getSimplifiedHouseId, simplifiedHouseId);
         return this.getOne(queryWrapper);
     }
+
+    @Override
+    public String signContract(ContractFormDTO dto) {
+        HouseInfoVo houseDetailInfo = aSimplifiedHouseInfoService.getHouseDetailInfo(dto.getHouseId());
+        ASimplifiedHouseInfo aSimplifiedHouseInfo = aSimplifiedHouseInfoService.getById(dto.getHouseId());
+        Contract baseContract = ContractFactory.createContract(aSimplifiedHouseInfo.getAssetType());
+        BeanUtil.copyProperties(dto.getContractData(), baseContract);
+        RentalTempBo bo = new RentalTempBo();
+        var resPath = "";
+        if (baseContract instanceof ContractA) {
+            processContractA((ContractA) baseContract,aSimplifiedHouseInfo,houseDetailInfo, bo);
+            resPath = fillContractData(bo, aSimplifiedHouseInfo.getAssetType());
+        } else if (baseContract instanceof ContractB) {
+            processContractB((ContractB) baseContract, bo);
+            resPath = fillContractData(bo, aSimplifiedHouseInfo.getAssetType());
+        } else if (baseContract instanceof ContractC) {
+            processContractC((ContractC) baseContract, bo);
+            resPath = fillContractData(bo, aSimplifiedHouseInfo.getAssetType());
+        }
+        return resPath;
+    }
+
+    private static void processContractC(ContractC baseContract, RentalTempBo bo) {
+        ContractC contractC = baseContract;
+        //todo 处理bo
+        bo.setC1("");
+        bo.setC2("");
+        bo.setC3("");
+        bo.setC4("");
+        bo.setC5("");
+        bo.setC6("");
+        bo.setC7("");
+        bo.setC8("");
+        bo.setC9("");
+        bo.setC10("");
+        bo.setC11("");
+        bo.setC12("");
+        bo.setC13("");
+        bo.setC14("");
+        bo.setC15("");
+        bo.setC16("");
+        bo.setC17("");
+        bo.setC18("");
+        bo.setC19("");
+        bo.setC20("");
+        bo.setC21("");
+        bo.setC22("");
+        bo.setC23("");
+        bo.setC24("");
+        bo.setC25("");
+        bo.setC26("");
+        bo.setC27("");
+    }
+
+    private static void processContractB(ContractB baseContract, RentalTempBo bo) {
+        ContractB contractB = baseContract;
+        //todo 处理bo
+        bo.setB1("");
+        bo.setB2("");
+        bo.setB3("");
+        bo.setB4("");
+        bo.setB5("");
+        bo.setB6("");
+        bo.setB7("");
+        bo.setB8("");
+        bo.setB9("");
+        bo.setB10("");
+        bo.setB11("");
+        bo.setB12("");
+        bo.setB13("");
+        bo.setB14("");
+        bo.setB15("");
+        bo.setB16("");
+        bo.setB17("");
+        bo.setB18("");
+        bo.setB19("");
+        bo.setB20("");
+        bo.setB21("");
+        bo.setB22("");
+        bo.setB23("");
+        bo.setB24("");
+        bo.setB25("");
+        bo.setB26("");
+        bo.setB27("");
+        bo.setB28("");
+        bo.setB29("");
+        bo.setB30("");
+        bo.setB31("");
+        bo.setB32("");
+        bo.setB33("");
+        bo.setB34("");
+        bo.setB35("");
+        bo.setB36("");
+        bo.setB37("");
+        bo.setB38("");
+        bo.setB39("");
+        bo.setB40("");
+        bo.setB41("");
+        bo.setB42("");
+        bo.setB43("");
+        bo.setB44("");
+        bo.setB45("");
+        bo.setB46("");
+        bo.setB47("");
+        bo.setB48("");
+        bo.setB49("");
+        bo.setB50("");
+        bo.setB51("");
+        bo.setB52("");
+        bo.setB53("");
+        bo.setB54("");
+        bo.setB55("");
+        bo.setB56("");
+    }
+
+    private static void processContractA(ContractA baseContract, ASimplifiedHouseInfo aSimplifiedHouseInfo, HouseInfoVo houseDetailInfo, RentalTempBo bo) {
+        ContractA contractA = baseContract;
+        //todo 处理bo
+        bo.setA1(contractA.getLandlordName());
+        bo.setA2(contractA.getTenantName());
+        bo.setA3(aSimplifiedHouseInfo.getAddress());
+        bo.setA4(contractA.getTenantTime());
+        bo.setA5(contractA.getTenantTimeStart());
+        bo.setA6(contractA.getTenantTimeEnd());
+        bo.setA7(contractA.getTenantRent());
+        bo.setA8(contractA.getTenantDeposit());
+        bo.setA9(contractA.getTenantDepositAmount());
+    }
+
+    @Autowired
+    private ARentalContractService aRentalContractService;
+
+    private String fillContractData(RentalTempBo bo, String houseType) {
+        var f = 0;
+        switch (houseType) {
+            case "公租房": {
+                f = 1;
+                break;
+            }
+            case "厂房": {
+                f = 2;
+                break;
+            }
+            case "创新创业基地": {
+                f = 3;
+                break;
+            }
+        }
+        return aRentalContractService.generatorRental(String.valueOf(f), bo);
+    }
 }
 
 

+ 35 - 16
src/main/java/com/zksy/property/service/impl/ARentalContractServiceImpl.java

@@ -8,6 +8,7 @@ import com.zksy.property.domain.bo.RentalTempBo;
 import com.zksy.property.mapper.ARentalContractMapper;
 import com.zksy.property.service.ARentalContentService;
 import com.zksy.property.service.ARentalContractService;
+import com.zksy.service.MinioFileStorageService;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.apache.poi.xwpf.usermodel.XWPFRun;
@@ -15,8 +16,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
 import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Method;
 import java.util.HashMap;
@@ -37,6 +38,9 @@ public class ARentalContractServiceImpl extends ServiceImpl<ARentalContractMappe
     @Autowired
     private ARentalContentService aRentalContentService;
 
+    @Autowired
+    private MinioFileStorageService minioFileStorageService;
+
     @Override
     public Page<ARentalContract> findByPage(long pageNum, long pageSize, String tenantName, String contractNumber, String contractStatus) {
         Page<ARentalContract> page = new Page<>(pageNum,pageSize);
@@ -60,41 +64,56 @@ public class ARentalContractServiceImpl extends ServiceImpl<ARentalContractMappe
 
     @Override
     public String generatorRental(String mark, RentalTempBo bo) {
+        // 定义标记与字段数量的映射关系
         Map<String, Integer> markToFieldCount = new HashMap<>();
         markToFieldCount.put("1", 9);
-        markToFieldCount.put("2", 54);
+        markToFieldCount.put("2", 56);
         markToFieldCount.put("3", 27);
 
+        // 验证标记类型
         if (!markToFieldCount.containsKey(mark)) {
             throw new IllegalArgumentException("不支持的 mark 类型:" + mark);
         }
 
         int fieldCount = markToFieldCount.get(mark);
+
+        // 根据标记确定前缀
         String prefix;
         switch (mark) {
-            case "1": prefix = "a"; break;
-            case "2": prefix = "b"; break;
-            case "3": prefix = "c"; break;
-            default: throw new IllegalStateException("非法 mark 值");
+            case "1":
+                prefix = "a";
+                break;
+            case "2":
+                prefix = "b";
+                break;
+            case "3":
+                prefix = "c";
+                break;
+            default:
+                throw new IllegalStateException("非法 mark 值:" + mark);
         }
 
         String templatePath = "templates/" + mark + ".docx";
-        String outputPath = "C:\\Users\\hxb\\Downloads\\已替换合同.docx";
 
-        Map<String, String> contentMap = buildContentMap(bo, prefix, fieldCount);
+        try (InputStream inputStream = new ClassPathResource(templatePath).getInputStream()) {
+            // 构建内容映射
+            Map<String, String> contentMap = buildContentMap(bo, prefix, fieldCount);
 
-        try (InputStream inputStream = new ClassPathResource(templatePath).getInputStream();
-             XWPFDocument document = new XWPFDocument(inputStream);
-             FileOutputStream outputStream = new FileOutputStream(outputPath)) {
+            // 创建临时文件
+            File tempFile = File.createTempFile("rental_contract_", ".docx");
+            tempFile.deleteOnExit(); // JVM退出时自动删除
 
-            replacePlaceholders(document, contentMap);
-            document.write(outputStream);
+            // 处理文档并写入临时文件
+            try (XWPFDocument document = new XWPFDocument(inputStream);
+                 FileOutputStream outputStream = new FileOutputStream(tempFile)) {
 
-        } catch (IOException e) {
+                replacePlaceholders(document, contentMap);
+                document.write(outputStream);
+            }
+            return minioFileStorageService.uploadFileByFile(tempFile,"合同");
+        } catch (Exception e) {
             throw new RuntimeException("处理文档时发生错误", e);
         }
-
-        return "";
     }
 
     private Map<String, String> buildContentMap(RentalTempBo bo, String prefix, int count) {

+ 76 - 53
src/main/java/com/zksy/property/service/impl/ASimplifiedHouseInfoServiceImpl.java

@@ -8,8 +8,10 @@ import com.zksy.property.domain.vo.HouseInfoVo;
 import com.zksy.property.mapper.ASimplifiedHouseInfoMapper;
 import com.zksy.property.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -51,84 +53,105 @@ public class ASimplifiedHouseInfoServiceImpl extends ServiceImpl<ASimplifiedHous
     @Autowired
     private ADeviceInfoService aDeviceInfoService;
     @Autowired
+    @Lazy
     private AContractInfoService aContractInfoService;
 
     @Override
     public HouseInfoVo getHouseDetailInfo(String simplifiedHouseId) {
-        var vo = new HouseInfoVo();
-        ASimplifiedHouseInfo aSimplifiedHouseInfo = this.getById(simplifiedHouseId);
-        if(aSimplifiedHouseInfo == null){
+        ASimplifiedHouseInfo houseInfo = this.getById(simplifiedHouseId);
+        if (houseInfo == null) {
             throw new RuntimeException("数据不存在");
         }
-        vo.setHouseName(aSimplifiedHouseInfo.getHouseName());
-        vo.setAddress(aSimplifiedHouseInfo.getAddress());
-        vo.setStatus(aSimplifiedHouseInfo.getStatus());
-        vo.setRentRange(aSimplifiedHouseInfo.getRentRange());
-
-        AHouseInfoDetail houseInfoDetail = aHouseInfoDetailService.getBySimplifiedHouseId(simplifiedHouseId);
-        HouseInfoVo.HouseInfo houseInfo = new HouseInfoVo.HouseInfo();
-        houseInfo.setFloor(aSimplifiedHouseInfo.getFloor());
-        if(houseInfoDetail == null){
-            houseInfo.setArea(null);
-            houseInfo.setHouseType(null);
-            houseInfo.setIntroduce(null);
-        }else {
-            houseInfo.setArea(houseInfoDetail.getArea());
-            houseInfo.setHouseType(houseInfoDetail.getHouseType());
-            houseInfo.setIntroduce(houseInfoDetail.getIntroduce());
+
+        HouseInfoVo vo = new HouseInfoVo();
+        vo.setHouseName(houseInfo.getHouseName());
+        vo.setAddress(houseInfo.getAddress());
+        vo.setStatus(houseInfo.getStatus());
+        vo.setRentRange(houseInfo.getRentRange());
+
+        // 设置房屋详细信息
+        AHouseInfoDetail detail = aHouseInfoDetailService.getBySimplifiedHouseId(simplifiedHouseId);
+        vo.setHouseInfo(buildHouseInfo(houseInfo, detail));
+
+        // 设置设备信息
+        List<ADeviceInfo> deviceInfos = aDeviceInfoService.getBySimplifiedHouseId(simplifiedHouseId);
+        vo.setDeviceInfo(mapDeviceInfo(deviceInfos));
+
+        // 如果房屋已租,设置租户和合同信息
+        if ("已租".equals(houseInfo.getStatus())) {
+            vo.setTenantInfo(buildTenantInfo(simplifiedHouseId));
+            vo.setContractInfo(buildContractInfo(simplifiedHouseId));
+        }
+
+        return vo;
+    }
+
+    // 构建房屋详细信息
+    private HouseInfoVo.HouseInfo buildHouseInfo(ASimplifiedHouseInfo houseInfo, AHouseInfoDetail detail) {
+        HouseInfoVo.HouseInfo info = new HouseInfoVo.HouseInfo();
+        info.setFloor(houseInfo.getFloor());
+
+        if (detail != null) {
+            info.setArea(detail.getArea());
+            info.setHouseType(detail.getHouseType());
+            info.setIntroduce(detail.getIntroduce());
         }
-        vo.setHouseInfo(houseInfo);
 
+        return info;
+    }
+
+    // 映射设备信息列表
+    private List<HouseInfoVo.DeviceInfo> mapDeviceInfo(List<ADeviceInfo> deviceInfos) {
+        return deviceInfos.stream()
+                .map(deviceInfo -> {
+                    HouseInfoVo.DeviceInfo device = new HouseInfoVo.DeviceInfo();
+                    device.setDeviceName(deviceInfo.getDeviceName());
+                    device.setDeviceType(deviceInfo.getDeviceType());
+                    device.setDeviceBrand(deviceInfo.getDeviceBrand());
+                    device.setDeviceNumber(deviceInfo.getDeviceNumber());
+                    device.setDevicePrice(deviceInfo.getDevicePrice());
+                    return device;
+                })
+                .collect(Collectors.toList());
+    }
+
+    // 构建租户信息
+    private HouseInfoVo.TenantInfo buildTenantInfo(String simplifiedHouseId) {
         ATenantInfo tenantInfo = aTenantInfoService.getBySimplifiedHouseId(simplifiedHouseId);
         HouseInfoVo.TenantInfo tenant = new HouseInfoVo.TenantInfo();
-        if(tenantInfo == null){
-            tenant.setTenantName(null);
-            tenant.setTenantIdCard(null);
-            tenant.setTenantInDate(null);
-            tenant.setTenantTime(null);
-            tenant.setTenantRent(null);
-            tenant.setTenantNumber(null);
-        }else {
+
+        if (tenantInfo != null) {
             tenant.setTenantName(tenantInfo.getTenantName());
             tenant.setTenantIdCard(tenantInfo.getTenantIdCard());
-            tenant.setTenantInDate(tenantInfo.getTenantInDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            tenant.setTenantInDate(formatDate(tenantInfo.getTenantInDate()));
             tenant.setTenantTime(tenantInfo.getTenantTime());
             tenant.setTenantRent(tenantInfo.getTenantRent().toString());
             tenant.setTenantNumber(tenantInfo.getTenantNumber());
         }
-        vo.setTenantInfo(tenant);
 
-        List<ADeviceInfo> deviceInfos = aDeviceInfoService.getBySimplifiedHouseId(simplifiedHouseId);
-        List<HouseInfoVo.DeviceInfo> deviceInfoList = deviceInfos.stream().map(deviceInfo -> {
-            HouseInfoVo.DeviceInfo device = new HouseInfoVo.DeviceInfo();
-            device.setDeviceName(deviceInfo.getDeviceName());
-            device.setDeviceType(deviceInfo.getDeviceType());
-            device.setDeviceBrand(deviceInfo.getDeviceBrand());
-            device.setDeviceNumber(deviceInfo.getDeviceNumber());
-            device.setDevicePrice(deviceInfo.getDevicePrice());
-            return device;
-        }).collect(Collectors.toList());
-        vo.setDeviceInfo(deviceInfoList);
+        return tenant;
+    }
 
+    // 构建合同信息
+    private HouseInfoVo.ContractInfo buildContractInfo(String simplifiedHouseId) {
         AContractInfo contractInfo = aContractInfoService.getBySimplifiedHouseId(simplifiedHouseId);
         HouseInfoVo.ContractInfo contract = new HouseInfoVo.ContractInfo();
-        if(contractInfo == null){
-            contract.setContractNumber(null);
-            contract.setContractDate(null);
-            contract.setContractTime(null);
-            contract.setContractExpirationDate(null);
-            contract.setContractDeposit(null);
-            contract.setContractStatus(null);
-        }else {
+
+        if (contractInfo != null) {
             contract.setContractNumber(contractInfo.getContractNumber());
-            contract.setContractDate(contractInfo.getContractDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            contract.setContractDate(formatDate(contractInfo.getContractDate()));
             contract.setContractTime(contractInfo.getContractTime());
-            contract.setContractExpirationDate(contractInfo.getContractExpirationDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            contract.setContractExpirationDate(formatDate(contractInfo.getContractExpirationDate()));
             contract.setContractDeposit(contractInfo.getContractDeposit().toString());
             contract.setContractStatus(contractInfo.getContractStatus());
         }
-        vo.setContractInfo(contract);
-        return vo;
+
+        return contract;
+    }
+
+    // 日期格式化工具方法
+    private String formatDate(LocalDate date) {
+        return date != null ? date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) : null;
     }
 }
 

BIN
src/main/resources/templates/~$2.docx


BIN
src/main/resources/templates/~$3.docx


+ 34 - 0
src/test/java/com/zksy/property/service/impl/AContractInfoServiceImplTest.java

@@ -0,0 +1,34 @@
+package com.zksy.property.service.impl;
+
+import com.zksy.property.domain.dto.ContractFormDTO;
+import com.zksy.property.service.AContractInfoService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.HashMap;
+
+@SpringBootTest
+class AContractInfoServiceImplTest {
+
+
+    @Autowired
+    private AContractInfoService aContractInfoService;
+    @Test
+    void signContract() {
+        ContractFormDTO dto = new ContractFormDTO();
+        dto.setHouseId("637a5298e3a076ab80fd695f5435a3a9");
+        var map = new HashMap<String,Object>();
+        map.put("tenantName","123");
+        map.put("landlordName","123");
+        map.put("tenantTimeStart","123");
+        map.put("tenantTime","123");
+        map.put("tenantTimeEnd","123");
+        map.put("tenantRent","123");
+        map.put("tenantDeposit","123");
+        map.put("tenantDepositAmount","123");
+        dto.setContractData(map);
+
+        aContractInfoService.signContract(dto);
+    }
+}

+ 4 - 1
src/test/java/com/zksy/property/service/impl/ARentalContractServiceImplTest.java

@@ -24,7 +24,8 @@ class ARentalContractServiceImplTest {
         t.setA7("7");
         t.setA8("8");
         t.setA9("9");
-        aRentalContractService.generatorRental("1",t);
+        var path = aRentalContractService.generatorRental("1",t);
+        System.out.println(path);
     }
 
     @Test
@@ -84,6 +85,8 @@ class ARentalContractServiceImplTest {
         t.setB52("52");
         t.setB53("53");
         t.setB54("54");
+        t.setB55("55");
+        t.setB56("56");
         aRentalContractService.generatorRental("2",t);
     }
 

+ 8 - 21
src/test/java/com/zksy/property/service/impl/ASimplifiedHouseInfoServiceImplTest.java

@@ -1,11 +1,12 @@
 package com.zksy.property.service.impl;
 
-import com.zksy.property.domain.vo.HouseInfoVo;
 import com.zksy.property.service.ASimplifiedHouseInfoService;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
 @SpringBootTest
 class ASimplifiedHouseInfoServiceImplTest {
 
@@ -13,26 +14,12 @@ class ASimplifiedHouseInfoServiceImplTest {
     private ASimplifiedHouseInfoService simplifiedHouseInfoService;
     @Test
     void test(){
-        HouseInfoVo info = simplifiedHouseInfoService.getHouseDetailInfo("35c10d2b4be0a7eee74300b759e0efcf");
-        System.out.println(info);
-    }
-
-    @Test
-    void testEmpty(){
-        simplifiedHouseInfoService.getHouseDetailInfo("12321321321");
+        simplifiedHouseInfoService.getHouseDetailInfo("35c10d2b4be0a7eee74300b759e0efcf");
+        assertThrows(RuntimeException.class, () -> {
+            simplifiedHouseInfoService.getHouseDetailInfo("12321321321");
+        });
+        simplifiedHouseInfoService.getHouseDetailInfo("637a5298e3a076ab80fd695f5435a3a9");
+        simplifiedHouseInfoService.getHouseDetailInfo("45371d4140ccb8347c8f9b1dae03e7b9");
     }
 
-    @Test
-    void testNoDevice(){
-        var vo = simplifiedHouseInfoService.getHouseDetailInfo("637a5298e3a076ab80fd695f5435a3a9");
-        System.out.println(vo);
-    }
-
-    @Test
-    void testNoHouseDetail(){
-        var vo = simplifiedHouseInfoService.getHouseDetailInfo("45371d4140ccb8347c8f9b1dae03e7b9");
-        System.out.println(vo);
-    }
-
-
 }