Ver código fonte

兼容邮储产品

sakuya 3 anos atrás
pai
commit
1eedd6f6eb
16 arquivos alterados com 257 adições e 321 exclusões
  1. 1 0
      eladmin-system/src/main/java/me/zhengjie/application/admin/controller/vo/ModelReq.java
  2. 1 0
      eladmin-system/src/main/java/me/zhengjie/application/admin/controller/vo/NotaryOrderQueryReq.java
  3. 3 3
      eladmin-system/src/main/java/me/zhengjie/application/admin/service/AdminOrderService.java
  4. 21 220
      eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/AdminOrderServiceImpl.java
  5. 2 2
      eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/ModelNotarizationServiceImpl.java
  6. 6 0
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankOrderController.java
  7. 17 16
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/vo/BankOrderVO.java
  8. 1 0
      eladmin-system/src/main/java/me/zhengjie/application/bank/controller/vo/NotaryNoteVo.java
  9. 1 1
      eladmin-system/src/main/java/me/zhengjie/application/bank/mq/RedisReceiver.java
  10. 3 3
      eladmin-system/src/main/java/me/zhengjie/application/bank/service/NotaryNoteService.java
  11. 1 1
      eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/BankOrderServiceImpl.java
  12. 15 66
      eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/NotaryNoteServiceImpl.java
  13. 35 6
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/ModelRepository.java
  14. 3 0
      eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/ModelEntity.java
  15. 1 0
      eladmin-system/src/main/java/me/zhengjie/domain/model/ModelConstant.java
  16. 146 3
      eladmin-system/src/main/java/me/zhengjie/domain/model/ModelSynthesizerDomain.java

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/application/admin/controller/vo/ModelReq.java

@@ -30,4 +30,5 @@ public class ModelReq extends BaseRequest {
 	//    邮享贷【ZH04021】
 	//    小额贷款【ZH02001】
     private String productType;
+    private Integer contractType;
 }

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/application/admin/controller/vo/NotaryOrderQueryReq.java

@@ -83,4 +83,5 @@ public class NotaryOrderQueryReq extends BaseRequest {
     private String businessNo;
     private String orderType;
     private String prodId;
+    private String content;
 }

+ 3 - 3
eladmin-system/src/main/java/me/zhengjie/application/admin/service/AdminOrderService.java

@@ -49,7 +49,7 @@ public interface AdminOrderService {
 
     AppBaseResponse<NotaryOrderQueryRsp> getCustomerInfo(HashMap<String, String> map);
 
-    AppBaseResponse<NotaryOrderQueryRsp> previewNotarization(NotaryOrderQueryReq req);
+    AppBaseResponse<String> previewNotarization(NotaryOrderQueryReq req);
 
     AppBaseResponse<NotaryOrderQueryRsp> bankCustomer(NotaryOrderQueryReq req);
 
@@ -58,6 +58,6 @@ public interface AdminOrderService {
     AppBaseResponse getDocList(NotaryOrderQueryReq req);
 
     Map<String, FileInfoEntity> getUploadFile(String businessNo);
-    
-	public OrderDetailDto getOrderDetail(String businessNo);
+
+	OrderDetailDto getOrderDetail(String businessNo);
 }

+ 21 - 220
eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/AdminOrderServiceImpl.java

@@ -21,7 +21,10 @@ import me.zhengjie.base.plus.QueryWrapperUtil;
 import me.zhengjie.base.util.*;
 import me.zhengjie.dao.mybatis.ModelRepository;
 import me.zhengjie.dao.mybatis.OrderFileRepository;
+import me.zhengjie.domain.model.ModelConstant;
+import me.zhengjie.domain.model.ModelSynthesizerDomain;
 import me.zhengjie.domain.order.OrderBizCodeMessage;
+import me.zhengjie.domain.order.OrderConstant;
 import me.zhengjie.domain.order.OrderFileConstant;
 import me.zhengjie.domain.user.UserDomain;
 import me.zhengjie.application.admin.service.AdminOrderService;
@@ -92,6 +95,8 @@ public class AdminOrderServiceImpl implements AdminOrderService {
 	ApplicationContextUtil contextUtil;
 	@Autowired
 	ContractOrderRepository contractOrderRepository;
+	@Autowired
+	ModelSynthesizerDomain modelSynthesizerDomain;
 
 	@Override
 	public AppBaseResponse<List<NotaryOrderQueryRsp>> query(NotaryOrderQueryReq req) {
@@ -332,163 +337,40 @@ public class AdminOrderServiceImpl implements AdminOrderService {
 	@Transactional(rollbackFor = Exception.class)
 	public AppBaseResponse partyPass(NotaryOrderQueryReq req) {
 		AppBaseResponse response = new AppBaseResponse();
-		ContractOrderEntity contractOrderEntity = contractOrderMapper.selectById(req.getId());
-		if ("0".equals(contractOrderEntity.getAutoGenerate())) {
+		ContractOrderEntity contractOrderEntity = contractOrderRepository.getContractOrderWithBizNo(req.getBusinessNo());
+		if (OrderConstant.NOTARIZATION_GENERATE_HAND.equals(contractOrderEntity.getAutoGenerate())) {
 			response.fail(OrderBizCodeMessage.NOTARIZATION_GENERATE_TYPE_ERROR);
 			return response;
 		}
 		// 检查面谈笔录是否提交
-
-		OrderFileEntity orderFile = orderFileRepository.getOrderFileWithCode(contractOrderEntity.getProdId(),
-				contractOrderEntity.getBusinessNo(), OrderFileConstant.TYPE_CODE_NOTE);
-
+		OrderFileEntity orderFile = orderFileRepository.getOrderNote(req.getBusinessNo());
 		if (orderFile == null) {
 			response.fail(ResultCode.INTERVIEW_NOTE_UNSUBMIT);
 			return response;
 		}
 		// 检查公证书模板是否处于编辑状态
-		String code = "";
-		if ("10".equals(req.getPartyId().substring(0, 2))) {
-			code = "10";
-		} else if ("11".equals(req.getPartyId().substring(0, 2))) {
-			code = "12";
-		} else {
-			code = "11";
-		}
-		if (modelRepository.existModelInEditing(contractOrderEntity.getProdId(),
-				contractOrderEntity.getNotaryOfficeId(), code)) {
+		if (modelRepository.existModelInEditing(contractOrderEntity.getProdId(), contractOrderEntity.getContractType(), contractOrderEntity.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_NOTARIZATION)) {
 			response.fail(OrderBizCodeMessage.MODEL_IN_EDITING);
 			return response;
 		}
 		// 检查是否具备可用的公证书编号
-		SimpleDateFormat yearFormatter = new SimpleDateFormat("yyyy");
-		QueryWrapper<NotarizationNoEntity> notarizationNoQw = new QueryWrapper<>();
-		notarizationNoQw.eq("notary_office_id", contractOrderEntity.getNotaryOfficeId());
-		notarizationNoQw.eq("no_status", 1);
-		notarizationNoQw.eq("used_year", yearFormatter.format(new Date()));
-		notarizationNoQw.apply("current_num < end_num");
-		notarizationNoQw.orderByAsc("create_time");
-		List<NotarizationNoEntity> notarizationNoList = notarizationNoMapper.selectList(notarizationNoQw);
+		List<NotarizationNoEntity> notarizationNoList = modelRepository.getListWithOfficeId(contractOrderEntity.getNotaryOfficeId());
 		if (notarizationNoList == null || notarizationNoList.size() == 0) {
 			response.fail(ResultCode.NO_NOTARIZARION_NO);
 			return response;
 		}
-		// Load公证书模板需要的信息
-		// 订单相关信息
-		Map<String, String> map = new HashMap<String, String>();
-		map.put("$LoanAmount$", contractOrderEntity.getContractMoney());
-		if ("10".equals(req.getPartyId().substring(0, 2))) {
-			map.put("$Type$", "借款合同");
-		} else if ("11".equals(req.getPartyId().substring(0, 2))) {
-			map.put("$Type$", "抵押合同");
-		} else {
-			map.put("$Type$", "担保合同");
-		}
-		// 公证书编号
 		NotarizationNoEntity notarizationNoEntity = notarizationNoList.get(0);
 		int currentNum = notarizationNoEntity.getCurrentNum() == 0 ? notarizationNoEntity.getBeginNum()
 				: notarizationNoEntity.getCurrentNum() + 1;
-		map.put("$NotarialNumber$", String.valueOf(currentNum));
-		// 公证处信息
-		NotaryOfficeEntity notaryOffice = notaryOfficeMapper.selectById(contractOrderEntity.getNotaryOfficeId());
-		String[] areas = notaryOffice.getAreaCodesStr().split(",");
-		QueryWrapper<ProvinceEntity> provinceQW = new QueryWrapper<>();
-		provinceQW.eq("code", areas[0]);
-		ProvinceEntity provinceEntity = provinceDao.selectOne(provinceQW);
-		String cityCodeZX = "110000,120000,310000,500000";
-		String cityName = "";
-		if (cityCodeZX.indexOf(provinceEntity.getCode()) <= -1) {
-			QueryWrapper<CityEntity> cityQW = new QueryWrapper<>();
-			cityQW.eq("code", areas[1]);
-			CityEntity cityEntity = cityDao.selectOne(cityQW);
-			cityName = cityEntity.getCityName();
-		}
-		String usedLocation = provinceEntity.getProvinceName().concat(cityName);
-		map.put("$Site$", usedLocation);
-		map.put("$NotaryOffice$", notaryOffice.getName());
-		// 借款人信息
-		try {
-			QueryWrapper<BorrowerEntity> borrowQw = new QueryWrapper<>();
-			borrowQw.eq("business_no", contractOrderEntity.getBusinessNo());
-			BorrowerEntity borrowerEntity = borrowerMapper.selectOne(borrowQw);
-			SimpleDateFormat monthformatter = new SimpleDateFormat("yyyy-MM");
-			Date beginDate = monthformatter.parse(borrowerEntity.getStartDate());
-			Date endDate = monthformatter.parse(borrowerEntity.getEndDate());
-			Integer months = DateUtils.getDiffNaturalMonth(endDate, beginDate);
-			map.put("$Year$", yearFormatter.format(new Date()));
-			map.put("$LoanName$", borrowerEntity.getUsername());
-			map.put("$LoanSex$", "1".equals(borrowerEntity.getSex()) ? "男" : "女");
-			map.put("$LoanBirthdday$", borrowerEntity.getBirth());
-			map.put("$LoanIDNo$", borrowerEntity.getIdCard());
-			map.put("$LoanRate$", borrowerEntity.getRate());
-			map.put("$LoanTerm$", borrowerEntity.getStartDate().concat(" - ").concat(borrowerEntity.getEndDate()));
-			map.put("$TotalMonth$", months.toString());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		// 抵押人信息
-		QueryWrapper<MortgageEntity> mortgageQw = new QueryWrapper<>();
-		mortgageQw.eq("business_no", contractOrderEntity.getBusinessNo());
-		MortgageEntity mortgageEntity = mortgageMapper.selectOne(mortgageQw);
-		if (mortgageEntity != null) {
-			map.put("$MortgageName$", mortgageEntity.getUsername());
-			map.put("$MortgageIDNo$", mortgageEntity.getIdCard());
-			map.put("$MortgageSex$", "1".equals(mortgageEntity.getSex()) ? "男" : "女");
-			map.put("$MortgageBirthdday$", mortgageEntity.getBirth());
-			map.put("$HouseAddr$", mortgageEntity.getHouseLocation());
-		}
-		// 担保人信息
-		QueryWrapper<GuaranteeEntity> guaranteeQw = new QueryWrapper<>();
-		guaranteeQw.eq("business_no", contractOrderEntity.getBusinessNo());
-		GuaranteeEntity guaranteeEntity = guaranteeMapper.selectOne(guaranteeQw);
-		if (guaranteeEntity != null) {
-			map.put("$GuaranteeName$", guaranteeEntity.getUsername());
-			map.put("$GuaranteeIDNo$", guaranteeEntity.getIdCard());
-			map.put("$GuaranteeSex$", "1".equals(guaranteeEntity.getSex()) ? "男" : "女");
-			map.put("$GuaranteeBirthdday$", guaranteeEntity.getBirth());
-		}
-		// 客户经理
-		try {
-			SimpleDateFormat dateSrcFormatter = new SimpleDateFormat("yyyyMMdd");
-			SimpleDateFormat dateDestFormatter = new SimpleDateFormat("yyyy/MM/dd");
-			SysUserEntity customer = userDao.selectById(contractOrderEntity.getCustomerId());
-			Date date = dateSrcFormatter.parse(customer.getIdCard().substring(6, 14));
-			map.put("$PBName$", customer.getNickName());
-			map.put("$PBSex$", customer.getGender());
-			map.put("$PBBirthday$", dateDestFormatter.format(date));
-			map.put("$PBIDNo$", customer.getIdCard());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		// 银行信息
-		BankEntity bankEntity = bankMapper.selectById(contractOrderEntity.getBankId());
-		map.put("$Bank$", bankEntity.getBankName());
-		map.put("$BankAddr$", bankEntity.getAddress());
-		map.put("$BankLeader$", bankEntity.getPrincipal());
-		// 其他信息
-		SimpleDateFormat dayFormatter = new SimpleDateFormat("yyyy-MM-dd");
-		map.put("$Date$", dayFormatter.format(new Date()));
 		// 生成并保存未签名公证书
-		ModelEntity modelEntity = modelRepository.getModelEntity(contractOrderEntity.getProdId(),
-				contractOrderEntity.getNotaryOfficeId(), code, "1");
-		String result = "";
-		String htmlPath = "";
-		String pdfPath = "";
-		try {
-			InputStream inputStream = NotaryNoteServiceImpl.class.getClassLoader()
-					.getResourceAsStream("template/note/notary-model.html");
-			result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
-			String content = result.replace("${ModelContent}",
-					TextTempletUtil.replaceContent(modelEntity.getContent(), map));
-			htmlPath = FileUploadUtil.saveHtml(content, contractOrderEntity.getBusinessNo());
-			pdfPath = FileUploadUtil.savePdf(content, contractOrderEntity.getBusinessNo());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
+		ModelEntity modelEntity = modelRepository.getModelEntity(contractOrderEntity.getProdId(),contractOrderEntity.getContractType(), contractOrderEntity.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_NOTARIZATION, "1");
+		String content = modelSynthesizerDomain.composeNotarizationTemplate(currentNum, req.getContent());
+		String htmlPath = FileUploadUtil.saveHtml(content, contractOrderEntity.getBusinessNo());
+		String pdfPath = FileUploadUtil.savePdf(content, contractOrderEntity.getBusinessNo());
 		//
 		OrderFileEntity notaryOrderFile = new OrderFileEntity();
 		notaryOrderFile.setBusinessNo(contractOrderEntity.getBusinessNo());
-		notaryOrderFile.setCode(code);
+		notaryOrderFile.setCode(ModelConstant.MODEL_TYPE_NOTARIZATION);
 		notaryOrderFile.setDocNo(String.valueOf(currentNum));
 		notaryOrderFile.setHtmlUrl(htmlPath);
 		notaryOrderFile.setPdfUrl(pdfPath);
@@ -535,93 +417,12 @@ public class AdminOrderServiceImpl implements AdminOrderService {
 	}
 
 	@Override
-	public AppBaseResponse<NotaryOrderQueryRsp> previewNotarization(NotaryOrderQueryReq req) {
-		AppBaseResponse<NotaryOrderQueryRsp> response = new AppBaseResponse<>();
-		try {
-			Map<String, String> map = new HashMap<String, String>();
-			if ("10".equals(req.getOrderType())) {
-				map.put("$Type$", "借款合同");
-			} else if ("11".equals(req.getOrderType())) {
-				map.put("$Type$", "担保合同");
-			} else {
-				map.put("$Type$", "抵押合同");
-			}
-			// 获取订单信息
-			QueryWrapper<ContractOrderEntity> qw = new QueryWrapper<>();
-			qw.eq("business_no", req.getBusinessNo());
-			ContractOrderEntity contractOrderEntity = contractOrderMapper.selectOne(qw);
-			// 获取公证处信息
-			NotaryOfficeEntity notaryOffice = notaryOfficeMapper.selectById(contractOrderEntity.getNotaryOfficeId());
-			map.put("$NotaryOffice$", notaryOffice.getName());
-			// 获取借款人信息
-			QueryWrapper<BorrowerEntity> borrowQw = new QueryWrapper<>();
-			borrowQw.eq("business_no", req.getBusinessNo());
-			BorrowerEntity borrowerEntity = borrowerMapper.selectOne(borrowQw);
-			SimpleDateFormat yearFormatter = new SimpleDateFormat("yyyy");
-			SimpleDateFormat monthformatter = new SimpleDateFormat("yyyy-MM");
-			Date beginDate = monthformatter.parse(borrowerEntity.getStartDate());
-			Date endDate = monthformatter.parse(borrowerEntity.getEndDate());
-			Integer months = DateUtils.getDiffNaturalMonth(endDate, beginDate);
-			map.put("$Year$", yearFormatter.format(new Date()));
-			map.put("$LoanName$", borrowerEntity.getUsername());
-			map.put("$LoanSex$", "1".equals(borrowerEntity.getSex()) ? "男" : "女");
-			map.put("$LoanBirthdday$", borrowerEntity.getBirth());
-			map.put("$LoanIDNo$", borrowerEntity.getIdCard());
-			map.put("$LoanRate$", borrowerEntity.getRate());
-			map.put("$LoanTerm$", borrowerEntity.getStartDate().concat(" - ").concat(borrowerEntity.getEndDate()));
-			map.put("$TotalMonth$", months.toString());
-			// 获取抵押人信息
-			QueryWrapper<MortgageEntity> mortgageQw = new QueryWrapper<>();
-			mortgageQw.eq("business_no", req.getBusinessNo());
-			MortgageEntity mortgageEntity = mortgageMapper.selectOne(mortgageQw);
-			if (mortgageEntity != null) {
-				map.put("$MortgageName$", mortgageEntity.getUsername());
-				map.put("$MortgageIDNo$", mortgageEntity.getIdCard());
-				map.put("$MortgageSex$", "1".equals(mortgageEntity.getSex()) ? "男" : "女");
-				map.put("$MortgageBirthdday$", mortgageEntity.getBirth());
-				map.put("$HouseAddr$", mortgageEntity.getHouseLocation());
-			}
-
-			// 获取担保人信息
-			QueryWrapper<GuaranteeEntity> guaranteeQw = new QueryWrapper<>();
-			guaranteeQw.eq("business_no", req.getBusinessNo());
-
-			GuaranteeEntity guaranteeEntity = guaranteeMapper.selectOne(guaranteeQw);
-			if (guaranteeEntity != null) {
-				map.put("$GuaranteeName$", guaranteeEntity.getUsername());
-				map.put("$GuaranteeIDNo$", guaranteeEntity.getIdCard());
-				map.put("$GuaranteeSex$", "1".equals(guaranteeEntity.getSex()) ? "男" : "女");
-				map.put("$GuaranteeBirthdday$", guaranteeEntity.getBirth());
-			}
-
-			// 获取银行信息
-			BankEntity bankEntity = bankMapper.selectById(contractOrderEntity.getBankId());
-			map.put("$Bank$", bankEntity.getBankName());
-			map.put("$BankAddr$", bankEntity.getAddress());
-			map.put("$BankLeader$", bankEntity.getPrincipal());
-			map.put("$LoanAmount$", contractOrderEntity.getContractMoney());
-			SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
-			map.put("$Date$", dateFormatter.format(new Date()));
-			map.put("$Site$", bankEntity.getAddress());
-			// 获取公证书编号
-			QueryWrapper<NotarizationNoEntity> notarizationNoQw = new QueryWrapper<>();
-			notarizationNoQw.eq("notary_office_id", contractOrderEntity.getNotaryOfficeId());
-			notarizationNoQw.eq("no_status", 1);
-			map.put("$NotarialNumber$", "          ");
-			// 获取模板信息
-			QueryWrapper<ModelEntity> modelQw = new QueryWrapper<>();
-			modelQw.eq("code", req.getOrderType());
-			modelQw.eq("notary_office_id", contractOrderEntity.getNotaryOfficeId());
-			modelQw.eq("status", 1);
-			ModelEntity modelEntity = modelMapper.selectOne(modelQw);
-			String content = TextTempletUtil.replaceContent(modelEntity.getContent(), map);
-
-//			NotaryOrderQueryRsp notaryOrderQueryRsp = new NotaryOrderQueryRsp();
-//			notaryOrderQueryRsp.setPreviewContent(content);
-//			response.setData(new AppResultData<NotaryOrderQueryRsp>(notaryOrderQueryRsp));
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
+	public AppBaseResponse<String> previewNotarization(NotaryOrderQueryReq req) {
+		AppBaseResponse<String> response = new AppBaseResponse<>();
+		ContractOrderEntity order = contractOrderRepository.getContractOrderWithBizNo(req.getBusinessNo());
+		ModelEntity model = modelRepository.getModelEntity(order.getProdId(), order.getContractType(), order.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_NOTARIZATION, "1");
+		String previewContent = modelSynthesizerDomain.composeNotarizationPreview(order, model.getContent());
+		response.setData(new AppResultData<String>(previewContent));
 		return response;
 	}
 

+ 2 - 2
eladmin-system/src/main/java/me/zhengjie/application/admin/service/impl/ModelNotarizationServiceImpl.java

@@ -145,7 +145,7 @@ public class ModelNotarizationServiceImpl implements ModelNotarizationService {
             return response;
         }
         ModelEntity model = ModelEntity.builder().code(req.getCode()).content(req.getContent())
-                .ifModify(0).notaryOfficeId(req.getNotaryOfficeId()).productType(req.getProductType())
+                .ifModify(0).notaryOfficeId(req.getNotaryOfficeId()).productType(req.getProductType()).contractType(req.getContractType())
                 .status(1).title(req.getTitle()).createTime(new Date()).build();
         if ("1,2,3,4,5,6,7,8,9".indexOf(req.getCode()) > -1) {
             model.setSort(req.getSort());
@@ -215,7 +215,7 @@ public class ModelNotarizationServiceImpl implements ModelNotarizationService {
         }
         ModelEntity model = ModelEntity.builder()
                 .id(req.getId()).code(req.getCode()).sort(req.getSort())
-                .content(req.getContent()).notaryOfficeId(req.getNotaryOfficeId()).status(req.getStatus())
+                .content(req.getContent()).notaryOfficeId(req.getNotaryOfficeId()).status(req.getStatus()).contractType(req.getContractType())
                 .title(req.getTitle()).productType(req.getProductType()).build();
         modelMapper.updateById(model);
         if ("6,7,8,9".indexOf(req.getCode()) > -1) {

+ 6 - 0
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/BankOrderController.java

@@ -9,6 +9,7 @@ import me.zhengjie.application.bank.service.BankOrderService;
 import me.zhengjie.base.ResponseDTO;
 import me.zhengjie.base.ResultCode;
 import me.zhengjie.base.util.DateUtils;
+import me.zhengjie.domain.order.OrderConstant;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -46,6 +47,11 @@ public class BankOrderController extends BaseController {
      */
     @RequestMapping("/save")
     public ResponseDTO<String> saveOrder(@RequestBody @Valid BankOrderVO vo) {
+        if (vo.getJointFlag() != null && vo.getJointFlag() == OrderConstant.JOINT_FLAG_TRUE) {
+            if (StringUtils.isEmpty(vo.getJointName()) || StringUtils.isEmpty(vo.getJointIdCard()) || StringUtils.isEmpty(vo.getJointPhone()) || StringUtils.isEmpty(vo.getJointSex()) || StringUtils.isEmpty(vo.getJointIdcardFrontPic()) || StringUtils.isEmpty(vo.getJointIdcardBackPic())) {
+                return ResponseDTO.error(ResultCode.PARAM_IS_BLANK);
+            }
+        }
         bankOrderService.saveContractOrder(vo, getCurrentUser());
         return ResponseDTO.success();
     }

+ 17 - 16
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/vo/BankOrderVO.java

@@ -3,6 +3,7 @@ package me.zhengjie.application.bank.controller.vo;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.Date;
 import java.util.Map;
@@ -13,30 +14,30 @@ public class BankOrderVO {
     // 主键id
     private Long id;
     // 业务编号
-    @NotNull(message = "业务编号不能为空")
+    @NotBlank(message = "业务编号不能为空")
     private String businessNo;
     // 产品ID
-    @NotNull(message = "产品ID不能为空")
+    @NotBlank(message = "产品ID不能为空")
     private String prodId;
     // 合同类型ID
-    @NotNull(message = "合同类型ID不能为空")
+    @NotBlank(message = "合同类型ID不能为空")
     private String contractTypeId;
     // 主合同编号
     private String mainContractNo;
     // 合同编号
-    @NotNull(message = "合同编号不能为空")
+    @NotBlank(message = "合同编号不能为空")
     private String contractNo;
     // 合同类型
     @NotNull(message = "合同类型不能为空")
     private Integer contractType;
     // 合同起始日
-    @NotNull(message = "合同起始日不能为空")
+    @NotBlank(message = "合同起始日不能为空")
     private String startDate;
     // 合同终止日
-    @NotNull(message = "合同终止日不能为空")
+    @NotBlank(message = "合同终止日不能为空")
     private String endDate;
     // 合同金额
-    @NotNull(message = "合同金额不能为空")
+    @NotBlank(message = "合同金额不能为空")
     private String contractMoney;
     // 利率(借款合同专有)
     private String rate;
@@ -51,31 +52,31 @@ public class BankOrderVO {
     // 合同附件
     private String contractAttachment;
     // 当事人姓名
-    @NotNull(message = "姓名不能为空")
+    @NotBlank(message = "姓名不能为空")
     private String name;
     // 性别
-    @NotNull(message = "性别不能为空")
+    @NotBlank(message = "性别不能为空")
     private String sex;
     // 出生日期
-    @NotNull(message = "出生日期不能为空")
+    @NotBlank(message = "出生日期不能为空")
     private String birth;
     // 身份证号
-    @NotNull(message = "身份证号码不能为空")
+    @NotBlank(message = "身份证号码不能为空")
     private String idCard;
     // 身份证正面照片
-    @NotNull(message = "身份证照片不能为空")
+    @NotBlank(message = "身份证照片不能为空")
     private String idcardFrontPic;
     // 身份证反面照片
-    @NotNull(message = "身份证照片不能为空")
+    @NotBlank(message = "身份证照片不能为空")
     private String idcardBackPic;
     // 居住地
-    @NotNull(message = "居住地不能为空")
+    @NotBlank(message = "居住地不能为空")
     private String residence;
     // 手机
-    @NotNull(message = "当事人手机号不能为空")
+    @NotBlank(message = "当事人手机号不能为空")
     private String phone;
     // 婚姻状态
-    @NotNull(message = "婚姻状态不能为空")
+    @NotBlank(message = "婚姻状态不能为空")
     private String marriage;
     // 结婚证
     private String marragePic;

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/application/bank/controller/vo/NotaryNoteVo.java

@@ -30,4 +30,5 @@ public class NotaryNoteVo {
 	// 问答列表
 	private List<NotaryNoteDto> notaryNoteDtos;
 	private String prodId;
+	private Integer contractType;
 }

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/application/bank/mq/RedisReceiver.java

@@ -47,7 +47,7 @@ public class RedisReceiver implements MessageListener {
 		String businessNo = jsonObject.getString("businessNo");
 		//
 		ContractOrderEntity contractOrderEntity = contractOrderRepository.getContractOrderWithBizNo(businessNo);
-		List<ModelEntity> models = modelRepository.getCommonModel(contractOrderEntity.getProdId(), contractOrderEntity.getNotaryOfficeId());
+		List<ModelEntity> models = modelRepository.getCommonModel(contractOrderEntity.getProdId(),contractOrderEntity.getContractType(), contractOrderEntity.getNotaryOfficeId());
 		// 在保存之前先删除数据
 		orderFileRepository.delFileWithBizNO(businessNo);
 		for (ModelEntity m : models) {

+ 3 - 3
eladmin-system/src/main/java/me/zhengjie/application/bank/service/NotaryNoteService.java

@@ -15,9 +15,9 @@ import com.alibaba.fastjson.JSONObject;
  * @author humuyu
  * @since 2022-03-10
  */
-public interface NotaryNoteService extends AbstractService<NotaryNoteEntity> {
+public interface NotaryNoteService {
 
-	public JSONObject getNotaryNoteByType(NotaryNoteVo notary);
+	JSONObject getNotaryNoteByType(NotaryNoteVo notary);
 
-	public AppBaseResponse saveNotaryNote(NotaryNoteVo notary);
+	AppBaseResponse saveNotaryNote(NotaryNoteVo notary);
 }

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/BankOrderServiceImpl.java

@@ -107,7 +107,7 @@ public class BankOrderServiceImpl implements BankOrderService {
 	public ResponseDTO<String> submitContractOrder(String businessNo, SysUserEntity currentUser) {
 		ResponseDTO response = new ResponseDTO<>();
 		ContractOrderEntity contractOrderEntity = contractOrderRepository.getContractOrderWithBizNo(businessNo);
-		if (modelRepository.existModelInEditing(contractOrderEntity.getProdId(), contractOrderEntity.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_COMMON_LIST)) {
+		if (modelRepository.existModelInEditing(contractOrderEntity.getProdId(),contractOrderEntity.getContractType(), contractOrderEntity.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_COMMON_LIST)) {
 			response.setCode(OrderBizCodeMessage.MODEL_IN_EDITING.getCode());
 			response.setMessage(OrderBizCodeMessage.MODEL_IN_EDITING.getMessage());
 			return response;

+ 15 - 66
eladmin-system/src/main/java/me/zhengjie/application/bank/service/impl/NotaryNoteServiceImpl.java

@@ -3,6 +3,7 @@ package me.zhengjie.application.bank.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
 import me.zhengjie.application.admin.service.dto.UserDto;
 import me.zhengjie.application.bank.controller.vo.NotaryNoteDto;
 import me.zhengjie.application.bank.controller.vo.NotaryNoteVo;
@@ -39,41 +40,15 @@ import java.util.*;
  * @since 2022-03-10
  */
 @Service
-public class NotaryNoteServiceImpl extends ServiceImpl<NotaryNoteMapper, NotaryNoteEntity> implements NotaryNoteService {
-	@Autowired
-    ContractOrderMapper contractOrderMapper;
-	@Autowired
-	BorrowerMapper borrowerMapper;
-	@Autowired
-	MortgageMapper mortgageMapper;
-	@Autowired
-	GuaranteeMapper guaranteeMapper;
-	@Autowired
-	NotaryOfficeMapper notaryOfficeMapper;
-	@Autowired
-	ModelMapper modelMapper;
-	@Autowired
-    BankOrderService bankOrderService;
-	@Autowired
-	ModelRepository modelRepository;
-	@Autowired
-	OrderFileMapper orderFileMapper;
-	@Autowired
-	ApplicationContextUtil contextUtil;
-	@Autowired
-    ContractOrderRepository contractOrderRepository;
-	@Autowired
-	BankMapper bankMapper;
-	@Autowired
-	SysUserMapper sysUserMapper;
-	@Autowired
-	ProvinceMapper provinceDao;
-	@Autowired
-	CityMapper cityDao;
-	@Autowired
-	OrderFileRepository orderFileRepository;
-	@Autowired
-	ModelSynthesizerDomain modelSynthesizerDomain;
+@RequiredArgsConstructor
+public class NotaryNoteServiceImpl implements NotaryNoteService {
+	private final NotaryOfficeMapper notaryOfficeMapper;
+	private final ModelRepository modelRepository;
+	private final OrderFileMapper orderFileMapper;
+	private final ApplicationContextUtil contextUtil;
+	private final ContractOrderRepository contractOrderRepository;
+	private final OrderFileRepository orderFileRepository;
+	private final ModelSynthesizerDomain modelSynthesizerDomain;
 
 	@Override
 	public JSONObject getNotaryNoteByType(NotaryNoteVo notary) {
@@ -81,7 +56,7 @@ public class NotaryNoteServiceImpl extends ServiceImpl<NotaryNoteMapper, NotaryN
 		// 查询问题列表
 		UserDto user = contextUtil.getCurrentUser().getUser();
 		NotaryOfficeEntity entity = notaryOfficeMapper.selectById(user.getOrgId().split("_")[1]);
-		ModelEntity modelEntity = modelRepository.getModelEntity(notary.getProdId(), String.valueOf(entity.getId()), ModelConstant.MODEL_TYPE_NOTE, ModelConstant.MODEL_STATUS_ENABLE);
+		ModelEntity modelEntity = modelRepository.getModelEntity(notary.getProdId(), notary.getContractType(), String.valueOf(entity.getId()), ModelConstant.MODEL_TYPE_NOTE, ModelConstant.MODEL_STATUS_ENABLE);
 		List<NotaryNoteEntity> notaryNotes = modelRepository.getNoteListWithModeId(modelEntity.getId());
 		// 组织回传数据
 		List<NotaryNoteDto> notaryNoteDtos = new ArrayList<>();
@@ -110,26 +85,17 @@ public class NotaryNoteServiceImpl extends ServiceImpl<NotaryNoteMapper, NotaryN
 		UserDto userDto = contextUtil.getCurrentUser().getUser();
 		String notaryOfficeId = userDto.getOrgId().split("_")[1];
 		String[] codes = {ModelConstant.MODEL_TYPE_NOTE};
-		if (modelRepository.existModelInEditing(notary.getProdId(),notaryOfficeId, codes)) {
+		if (modelRepository.existModelInEditing(notary.getProdId(),notary.getContractType(), notaryOfficeId, codes)) {
 			response.fail(OrderBizCodeMessage.MODEL_IN_EDITING);
 			return response;
 		}
 		List<NotaryNoteDto> notaryNoteDtoList = notary.getNotaryNoteDtos();
-		String modelContent = readFileInString();
-		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
 		NotaryOfficeEntity officeEntity = notaryOfficeMapper.selectById(userDto.getOrgId().split("_")[1]);
-		String htmlContent = "";
-		int i = 1;
-		for (NotaryNoteDto noteDto : notaryNoteDtoList) {
-			htmlContent = htmlContent.concat("<li>").concat(String.valueOf(i++)).concat(".")
-					.concat(noteDto.getQuestion()).concat("<br>").concat(noteDto.getAnswer()).concat("</li>");
-		}
-		htmlContent = modelContent.replace("${QuestionAnswerList}", htmlContent).replace("${yyyyMMdd}",
-				formatter.format(new Date())).replace("${NotaryUserName}",userDto.getNickName()).replace("${QueryUsers}",modelSynthesizerDomain.composeNotePartyList(notary.getBusinessNo()));
+		String htmlContent = modelSynthesizerDomain.composeNoteTemplate(notaryNoteDtoList, userDto.getNickName(), notary.getBusinessNo());
 		String htmlpath = FileUploadUtil.saveHtml(htmlContent, notary.getBusinessNo());
 		String pdfPath = FileUploadUtil.savePdf(htmlContent, notary.getBusinessNo());
 		//
-		ModelEntity modelEntity = modelRepository.getModelEntity(notary.getProdId(),String.valueOf(officeEntity.getId()), ModelConstant.MODEL_TYPE_NOTE, ModelConstant.MODEL_STATUS_ENABLE);
+		ModelEntity modelEntity = modelRepository.getModelEntity(notary.getProdId(), notary.getContractType(), String.valueOf(officeEntity.getId()), ModelConstant.MODEL_TYPE_NOTE, ModelConstant.MODEL_STATUS_ENABLE);
 		OrderFileEntity orderFile = new OrderFileEntity();
 		orderFile.setBusinessNo(notary.getBusinessNo());
 		orderFile.setCode(ModelConstant.MODEL_TYPE_NOTE);
@@ -166,30 +132,13 @@ public class NotaryNoteServiceImpl extends ServiceImpl<NotaryNoteMapper, NotaryN
 	}
 
 	/**
-	 * 读取文件内容
-	 *
-	 * @return
-	 */
-	private String readFileInString() {
-		String result = "";
-		try {
-			InputStream inputStream = NotaryNoteServiceImpl.class.getClassLoader()
-					.getResourceAsStream("template/note/notary-note.html");
-			result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		return result;
-	}
-
-	/**
 	 * 重新生成申请表
 	 *
 	 * @param businessNo
 	 */
 	private void recreateApplyDoc(String businessNo,String contractNo) {
 		ContractOrderEntity contractOrderEntity = contractOrderRepository.getContractOrderWithBizNo(businessNo);
-		ModelEntity model = modelRepository.getModelEntity(contractOrderEntity.getProdId(), contractOrderEntity.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_APPLY, ModelConstant.MODEL_STATUS_ENABLE);
+		ModelEntity model = modelRepository.getModelEntity(contractOrderEntity.getProdId(), contractOrderEntity.getContractType(), contractOrderEntity.getNotaryOfficeId(), ModelConstant.MODEL_TYPE_APPLY, ModelConstant.MODEL_STATUS_ENABLE);
 		OrderFileEntity fileEntity = orderFileRepository.getOrderFileWithCode(businessNo, ModelConstant.MODEL_TYPE_APPLY);
 		OrderFileEntity saveFile = new OrderFileEntity();
 		saveFile.setId(fileEntity.getId());

+ 35 - 6
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/ModelRepository.java

@@ -3,11 +3,15 @@ package me.zhengjie.dao.mybatis;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.RequiredArgsConstructor;
 import me.zhengjie.dao.mybatis.entity.ModelEntity;
+import me.zhengjie.dao.mybatis.entity.NotarizationNoEntity;
 import me.zhengjie.dao.mybatis.entity.NotaryNoteEntity;
 import me.zhengjie.dao.mybatis.mapper.ModelMapper;
+import me.zhengjie.dao.mybatis.mapper.NotarizationNoMapper;
 import me.zhengjie.dao.mybatis.mapper.NotaryNoteMapper;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 
 @RequiredArgsConstructor
@@ -16,19 +20,22 @@ public class ModelRepository {
 
     private final ModelMapper modelMapper;
     private final NotaryNoteMapper notaryNoteMapper;
+    private final NotarizationNoMapper notarizationNoMapper;
 
     /**
      * 是否存在编辑中的模板
      *
      * @param prodId 产品ID
+     * @param contractType 合同类型
      * @param notaryOfficeId 公证处ID
      * @param codes          模板类型
      * @return 存在返回true,不存在返回false
      */
-    public boolean existModelInEditing(String prodId,String notaryOfficeId, String[] codes) {
+    public boolean existModelInEditing(String prodId, Integer contractType, String notaryOfficeId, String[] codes) {
         QueryWrapper<ModelEntity> qw = new QueryWrapper<>();
         qw.eq("notary_office_id", notaryOfficeId);
-        qw.eq("product_type",prodId);
+        qw.eq("product_type", prodId);
+        qw.eq("contract_type", contractType);
         qw.eq("status", 0);
         qw.in("code", codes);
         long count = modelMapper.selectCount(qw);
@@ -39,28 +46,31 @@ public class ModelRepository {
      * 是否存在编辑中的模板
      *
      * @param prodId
+     * @param contractType   合同类型
      * @param notaryOfficeId
      * @param code
      * @return
      */
-    public boolean existModelInEditing(String prodId, String notaryOfficeId, String code) {
+    public boolean existModelInEditing(String prodId, Integer contractType, String notaryOfficeId, String code) {
         String[] codes = {code};
-        return existModelInEditing(prodId, notaryOfficeId, codes);
+        return existModelInEditing(prodId, contractType, notaryOfficeId, codes);
     }
 
     /**
      * 查询指定公证处指定状态的指定类型模板
      *
      * @param prodId
+     * @param contractType 合同类型
      * @param notaryOfficeId
      * @param code
      * @param status
      * @return
      */
-    public ModelEntity getModelEntity(String prodId, String notaryOfficeId, String code, String status) {
+    public ModelEntity getModelEntity(String prodId, Integer contractType, String notaryOfficeId, String code, String status) {
         QueryWrapper<ModelEntity> modelQw = new QueryWrapper<>();
         modelQw.eq("notary_office_id", notaryOfficeId);
         modelQw.eq("product_type", prodId);
+        modelQw.eq("contract_type", contractType);
         modelQw.eq("code", code);
         modelQw.eq("status", status);
         return modelMapper.selectOne(modelQw);
@@ -70,14 +80,16 @@ public class ModelRepository {
      * 获取通用模板
      *
      * @param prodId
+     * @param contractType   合同类型
      * @param notaryOfficeId
      * @return
      */
-    public List<ModelEntity> getCommonModel(String prodId, String notaryOfficeId) {
+    public List<ModelEntity> getCommonModel(String prodId, Integer contractType, String notaryOfficeId) {
         QueryWrapper<ModelEntity> model = new QueryWrapper<ModelEntity>();
         model.eq("notary_office_id", notaryOfficeId);
         model.eq("status", 1);
         model.eq("product_type", prodId);
+        model.eq("contract_type", contractType);
         model.in("code", "1,2,3,4,5".split(","));
         return modelMapper.selectList(model);
     }
@@ -94,4 +106,21 @@ public class ModelRepository {
         query.orderByAsc("sort");
         return notaryNoteMapper.selectList(query);
     }
+
+    /**
+     * 获取公证处公证书编号
+     *
+     * @param notaryOfficeId
+     * @return
+     */
+    public List<NotarizationNoEntity> getListWithOfficeId(String notaryOfficeId) {
+        SimpleDateFormat yearFormatter = new SimpleDateFormat("yyyy");
+        QueryWrapper<NotarizationNoEntity> notarizationNoQw = new QueryWrapper<>();
+        notarizationNoQw.eq("notary_office_id", notaryOfficeId);
+        notarizationNoQw.eq("no_status", 1);
+        notarizationNoQw.eq("used_year", yearFormatter.format(new Date()));
+        notarizationNoQw.apply("current_num < end_num");
+        notarizationNoQw.orderByAsc("create_time");
+        return notarizationNoMapper.selectList(notarizationNoQw);
+    }
 }

+ 3 - 0
eladmin-system/src/main/java/me/zhengjie/dao/mybatis/entity/ModelEntity.java

@@ -56,4 +56,7 @@ public class ModelEntity implements Serializable {
 
 	@TableField("product_type")
 	private String productType;
+
+	@TableField("contract_type")
+	private Integer contractType;
 }

+ 1 - 0
eladmin-system/src/main/java/me/zhengjie/domain/model/ModelConstant.java

@@ -10,6 +10,7 @@ public class ModelConstant {
     public static final String MODEL_TYPE_NOTIFICATION = "4";
     public static final String MODEL_TYPE_PROMISE = "5";
     public static final String MODEL_TYPE_NOTE = "6";
+    public static final String MODEL_TYPE_NOTARIZATION = "10";
     public static final String[] MODEL_TYPE_COMMON_LIST = {MODEL_TYPE_APPLY, MODEL_TYPE_CONFIRMATION, MODEL_TYPE_NOTICE, MODEL_TYPE_NOTIFICATION, MODEL_TYPE_PROMISE};
     /**
      * 模板状态

+ 146 - 3
eladmin-system/src/main/java/me/zhengjie/domain/model/ModelSynthesizerDomain.java

@@ -3,6 +3,8 @@ package me.zhengjie.domain.model;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.RequiredArgsConstructor;
 import me.zhengjie.application.admin.service.dto.UserDto;
+import me.zhengjie.application.bank.controller.vo.NotaryNoteDto;
+import me.zhengjie.application.bank.service.impl.NotaryNoteServiceImpl;
 import me.zhengjie.base.util.ApplicationContextUtil;
 import me.zhengjie.base.util.DateUtils;
 import me.zhengjie.base.util.StatusEnum;
@@ -32,12 +34,154 @@ public class ModelSynthesizerDomain {
     private final ApplicationContextUtil contextUtil;
 
     /**
-     * 合成面谈笔录当事人列表模板
+     * 合成公证书预览模板
+     *
+     * @param contractOrderEntity
+     * @param content
+     * @return
+     */
+    public String composeNotarizationPreview(ContractOrderEntity contractOrderEntity, String content) {
+        Map<String, String> data = prepareNotarizationTemplateData(contractOrderEntity);
+        return TextTempletUtil.replaceContent(content, data);
+    }
+
+
+    /**
+     * 合成公证书模板
+     *
+     * @param currentNum
+     * @param content
+     * @return
+     */
+    public String composeNotarizationTemplate(int currentNum, String content) {
+        content = content.replace("$NotarialNumber$", String.valueOf(currentNum));
+        String template = readFileInString("template/note/notary-model.html");
+        return template.replace("${ModelContent}", content);
+    }
+
+    /**
+     * 准备公证书模板数据
+     *
+     * @param contractOrderEntity
+     * @return
+     */
+    public Map<String, String> prepareNotarizationTemplateData(ContractOrderEntity contractOrderEntity) {
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("$ContractMoney$", contractOrderEntity.getContractMoney());
+        if (contractOrderEntity.getContractType() == OrderConstant.CONTRACT_TYPE_BORROWER) {
+            map.put("$Type$", "借款合同");
+        } else if (contractOrderEntity.getContractType() == OrderConstant.CONTRACT_TYPE_MORTGAGE) {
+            map.put("$Type$", "抵押合同");
+        } else if (contractOrderEntity.getContractType() == OrderConstant.CONTRACT_TYPE_GUARANTEE) {
+            map.put("$Type$", "保证合同");
+        } else if (contractOrderEntity.getContractType() == OrderConstant.CONTRACT_TYPE_CREDIT) {
+            map.put("$Type$", "授信合同");
+        }
+        // 公证处信息
+        NotaryOfficeEntity notaryOffice = notaryOfficeMapper.selectById(contractOrderEntity.getNotaryOfficeId());
+        String[] areas = notaryOffice.getAreaCodesStr().split(",");
+        QueryWrapper<ProvinceEntity> provinceQW = new QueryWrapper<>();
+        provinceQW.eq("code", areas[0]);
+        ProvinceEntity provinceEntity = provinceMapper.selectOne(provinceQW);
+        String cityCodeZX = "110000,120000,310000,500000";
+        String cityName = "";
+        if (cityCodeZX.indexOf(provinceEntity.getCode()) <= -1) {
+            QueryWrapper<CityEntity> cityQW = new QueryWrapper<>();
+            cityQW.eq("code", areas[1]);
+            CityEntity cityEntity = cityMapper.selectOne(cityQW);
+            cityName = cityEntity.getCityName();
+        }
+        String usedLocation = provinceEntity.getProvinceName().concat(cityName);
+        map.put("$Site$", usedLocation);
+        map.put("$NotaryOffice$", notaryOffice.getName());
+        // 借款人信息
+        try {
+            SimpleDateFormat yearFormatter = new SimpleDateFormat("yyyy");
+            SimpleDateFormat monthformatter = new SimpleDateFormat("yyyy-MM");
+            Date beginDate = monthformatter.parse(contractOrderEntity.getStartDate());
+            Date endDate = monthformatter.parse(contractOrderEntity.getEndDate());
+            Integer months = DateUtils.getDiffNaturalMonth(endDate, beginDate);
+            map.put("$Year$", yearFormatter.format(new Date()));
+            map.put("$PartyName$", contractOrderEntity.getName());
+            map.put("$PartySex$", "1".equals(contractOrderEntity.getSex()) ? "男" : "女");
+            map.put("$PartyBirthdday$", contractOrderEntity.getBirth());
+            map.put("$PartyIDNo$", contractOrderEntity.getIdCard());
+            map.put("$LoanRate$", contractOrderEntity.getRate());
+            map.put("$ContractTerm$", contractOrderEntity.getStartDate().concat(" - ").concat(contractOrderEntity.getEndDate()));
+            map.put("$TotalMonth$", months.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 客户经理
+        try {
+            SimpleDateFormat dateSrcFormatter = new SimpleDateFormat("yyyyMMdd");
+            SimpleDateFormat dateDestFormatter = new SimpleDateFormat("yyyy/MM/dd");
+            SysUserEntity customer = sysUserMapper.selectById(contractOrderEntity.getCustomerId());
+            Date date = dateSrcFormatter.parse(customer.getIdCard().substring(6, 14));
+            map.put("$PBName$", customer.getNickName());
+            map.put("$PBSex$", customer.getGender());
+            map.put("$PBBirthday$", dateDestFormatter.format(date));
+            map.put("$PBIDNo$", customer.getIdCard());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 银行信息
+        BankEntity bankEntity = bankMapper.selectById(contractOrderEntity.getBankId());
+        map.put("$Bank$", bankEntity.getBankName());
+        map.put("$BankAddr$", bankEntity.getAddress());
+        map.put("$BankLeader$", bankEntity.getPrincipal());
+        // 其他信息
+        SimpleDateFormat dayFormatter = new SimpleDateFormat("yyyy-MM-dd");
+        map.put("$Date$", dayFormatter.format(new Date()));
+        return map;
+    }
+
+
+    /**
+     * 合成面谈笔录模板
+     *
+     * @param notaryNoteDtoList
+     * @param userName
+     * @param businessNo
+     * @return
+     */
+    public String composeNoteTemplate(List<NotaryNoteDto> notaryNoteDtoList, String userName, String businessNo) {
+        String htmlContent = "";
+        String modelContent = readFileInString("template/note/notary-note.html");
+        int i = 1;
+        for (NotaryNoteDto noteDto : notaryNoteDtoList) {
+            htmlContent = htmlContent.concat("<li>").concat(String.valueOf(i++)).concat(".")
+                    .concat(noteDto.getQuestion()).concat("<br>").concat(noteDto.getAnswer()).concat("</li>");
+        }
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        htmlContent = modelContent.replace("${QuestionAnswerList}", htmlContent).replace("${yyyyMMdd}",
+                formatter.format(new Date())).replace("${NotaryUserName}", userName).replace("${QueryUsers}", composeNotePartyList(businessNo));
+        return htmlContent;
+    }
+
+    /**
+     * 读取配置模板
+     * @param file
+     * @return
+     */
+    private String readFileInString(String file) {
+        String result = "";
+        try {
+            InputStream inputStream = ModelSynthesizerDomain.class.getClassLoader().getResourceAsStream(file);
+            result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 拼接面谈笔录当事人列表
      *
      * @param businessNo
      * @return
      */
-    public String composeNotePartyList(String businessNo) {
+    private String composeNotePartyList(String businessNo) {
         ContractOrderEntity order = contractOrderRepository.getContractOrderWithBizNo(businessNo);
         BankEntity bank = bankMapper.selectById(order.getBankId());
         String lender = "贷款人:" + bank.getBankName() + ",住所:" + bank.getAddress() + ",负责人:" + bank.getPrincipal() + "<br/>";
@@ -112,7 +256,6 @@ public class ModelSynthesizerDomain {
         return userList;
     }
 
-
     /**
      * 准备面谈笔录模板数据
      *