Commit ecbfc658 by HlQ

[add] 合同管理添加合同不同阶段的收款时间字段

[chg] 钉钉消息体样式优化
1 parent d22db446
package vion.cron;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......@@ -15,10 +16,7 @@ import vion.service.IStoreService;
import java.math.BigDecimal;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -40,28 +38,23 @@ public class ContractRunner {
Set<String> existContractNoSet = contractService.list().stream().map(Contract::getContractNo).collect(Collectors.toSet());
Map<String, Integer> contractTypeMap = dictionaryService.lambdaQuery().eq(Dictionary::getType, "contract_type").list()
.stream().collect(Collectors.toMap(Dictionary::getValue, Dictionary::getKey));
Map<String, Integer> payTypeMap = dictionaryService.lambdaQuery().eq(Dictionary::getType, "pay_type").list()
.stream().collect(Collectors.toMap(Dictionary::getValue, Dictionary::getKey));
List<Contract> insertContractList = new ArrayList<>();
String url = "jdbc:sqlserver://47.92.144.255:1433;databaseName=UFDATA_001_2020;encrypt=false";
String username = "vion-reader";
String password = "vion-reader";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
String sql = "select t5.hetongpingshen_name as name,t1.hetongluru_name as contract_no,t1.hetongluru_char12 as type,t1.hetongluru_date01 as sign_date,t1.hetongluru_char01 as warranty_period,t1.hetongluru_start_date as maintain_sdate,t1.hetongluru_end_date as maintain_edate,t1.hetongluru_dec01 as total_amount,t5.hetongpingshen_dec02 as sign_ratio,t5.hetongpingshen_dec03 as arrive_ratio,t5.hetongpingshen_dec04 as system_check_ratio,t5.hetongpingshen_dec05 as project_check_ratio,t5.hetongpingshen_dec06 as warranty_ratio,t5.hetongpingshen_dec07 as maintain1_ratio,t5.hetongpingshen_dec09 as maintain2_ratio,t5.hetongpingshen_dec10 as maintain3_ratio,t2.cCusAbbName as customer_name,t4.cUser_Name as sale_name" +
" from tcu_hetongluru t1 left join Customer t2 on t1.account_id = t2.cCusCode left join tc_opportunity t3 on t1.hetongluru_char04 = t3.ufcode left join UA_User_Ex t4 on t1.owner_user_id = t4.cUser_Id left join tcu_hetongpingshen t5 on t1.hetongluru_name = t5.hetongpingshen_char05";
String sql = "select t5.hetongpingshen_name as name,t1.hetongluru_name as contract_no,t1.hetongluru_char12 as type,t1.hetongluru_date01 as sign_date,t1.hetongluru_char01 as warranty_period,t1.hetongluru_start_date as maintain_sdate,t1.hetongluru_end_date as maintain_edate,t1.hetongluru_dec01 as total_amount,t5.hetongpingshen_dec02 as sign_ratio,t5.hetongpingshen_dec03 as arrive_ratio,t5.hetongpingshen_dec04 as system_check_ratio,t5.hetongpingshen_dec05 as project_check_ratio,t5.hetongpingshen_dec06 as warranty_ratio,t5.hetongpingshen_dec07 as maintain1_ratio,t5.hetongpingshen_dec09 as maintain2_ratio,t5.hetongpingshen_dec10 as maintain3_ratio,t2.cCusAbbName as customer_name,t4.cUser_Name as sale_name,t1.create_time as entry_time,t5.hetongpingshen_date01 as sign_date1,t5.hetongpingshen_date04 as arrive_date,t5.hetongpingshen_date05 as system_check_date,t5.hetongpingshen_date06 as project_check_date,t5.hetongpingshen_date07 as warranty_date,t5.hetongpingshen_date08 as maintain_date1, t6.hetongpingshen_date09 as maintain_date2,t6.hetongpingshen_date10 as maintain_date3" +
" from tcu_hetongluru t1 left join Customer t2 on t1.account_id = t2.cCusCode left join tc_opportunity t3 on t1.hetongluru_char04 = t3.ufcode left join UA_User_Ex t4 on t1.owner_user_id = t4.cUser_Id left join tcu_hetongpingshen t5 on t1.hetongluru_name = t5.hetongpingshen_char05 left join tcu_hetongpingshen_attr t6 on t5.hetongpingshen_id = t6.hetongpingshen_id";
try (Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
String contractNo = resultSet.getString("contract_no");
if (!existContractNoSet.contains(contractNo)) {
Contract contract = new Contract();
String contractName = resultSet.getString("name");
if (StrUtil.isNotBlank(contractName)) {
contract.setName(resultSet.getString("name"));
} else {
contract.setName(contractNo);
}
Opt.ofBlankAble(resultSet.getString("name"))
.ifPresentOrElse(contract::setName, () -> contract.setName(contractNo));
contract.setContractNo(contractNo);
contract.setType(contractTypeMap.getOrDefault(resultSet.getString("type"), 0));
contract.setSignDate(resultSet.getDate("sign_date"));
......@@ -75,13 +68,21 @@ public class ContractRunner {
contract.setStatus(1);
contract.setTotalAmount(resultSet.getBigDecimal("total_amount"));
contract.setSignRatio(resultSet.getBigDecimal("sign_ratio"));
contract.setSignDate1(resultSet.getDate("sign_date1"));
contract.setArriveRatio(resultSet.getBigDecimal("arrive_ratio"));
contract.setArriveDate(resultSet.getDate("arrive_date"));
contract.setSystemCheckRatio(resultSet.getBigDecimal("system_check_ratio"));
contract.setSystemCheckDate(resultSet.getDate("system_check_date"));
contract.setProjectCheckRatio(resultSet.getBigDecimal("project_check_ratio"));
contract.setProjectCheckDate(resultSet.getDate("project_check_date"));
contract.setWarrantyRatio(resultSet.getBigDecimal("warranty_ratio"));
contract.setWarrantyDate(resultSet.getDate("warranty_date"));
contract.setMaintainRatio1(resultSet.getBigDecimal("maintain1_ratio"));
contract.setMaintainDate1(resultSet.getDate("maintain_date1"));
contract.setMaintainRatio2(resultSet.getBigDecimal("maintain2_ratio"));
contract.setMaintainDate2(resultSet.getDate("maintain_date2"));
contract.setMaintainRatio3(resultSet.getBigDecimal("maintain3_ratio"));
contract.setMaintainDate3(resultSet.getDate("maintain_date3"));
contract.setPaidAmount(BigDecimal.ZERO);
contract.setReceivableAmount(BigDecimal.ZERO);
contract.setOutstandingAmount(resultSet.getBigDecimal("total_amount"));
......@@ -90,9 +91,7 @@ public class ContractRunner {
contract.setSaleName(resultSet.getString("sale_name"));
contract.setCreateUser(-1L);
contract.setModifyUser(-1L);
contract.setEntryTime(resultSet.getTimestamp("entry_time"));
insertContractList.add(contract);
}
}
......@@ -110,59 +109,72 @@ public class ContractRunner {
ContractPayment contractSignPayment = new ContractPayment();
contractSignPayment.setContractId(contract.getId());
contractSignPayment.setPaymentType(1);
contractSignPayment.setPaymentRatio(null != contract.getSignRatio() ? contract.getSignRatio() : BigDecimal.ZERO);
contractSignPayment.setPaymentRatio(Opt.ofNullable(contract.getSignRatio()).orElse(BigDecimal.ZERO));
contractSignPayment.setPaymentDate(contract.getSignDate1());
contractPaymentList.add(contractSignPayment);
// 到货
ContractPayment contractArrivePayment = new ContractPayment();
contractArrivePayment.setContractId(contract.getId());
contractArrivePayment.setPaymentType(2);
contractArrivePayment.setPaymentRatio(null != contract.getArriveRatio() ? contract.getArriveRatio() : BigDecimal.ZERO);
contractArrivePayment.setPaymentRatio(Opt.ofNullable(contract.getArriveRatio()).orElse(BigDecimal.ZERO));
contractArrivePayment.setPaymentDate(contract.getArriveDate());
contractPaymentList.add(contractArrivePayment);
// 系统验收
ContractPayment contractSystemCheckPayment = new ContractPayment();
contractSystemCheckPayment.setContractId(contract.getId());
contractSystemCheckPayment.setPaymentType(3);
contractSystemCheckPayment.setPaymentRatio(null != contract.getSystemCheckRatio() ? contract.getSystemCheckRatio() : BigDecimal.ZERO);
contractSystemCheckPayment.setPaymentRatio(Opt.ofNullable(contract.getSystemCheckRatio()).orElse(BigDecimal.ZERO));
contractSystemCheckPayment.setPaymentDate(contract.getSystemCheckDate());
contractPaymentList.add(contractSystemCheckPayment);
// 项目验收
ContractPayment contractProjectCheckPayment = new ContractPayment();
contractProjectCheckPayment.setContractId(contract.getId());
contractProjectCheckPayment.setPaymentType(4);
contractProjectCheckPayment.setPaymentRatio(null != contract.getProjectCheckRatio() ? contract.getProjectCheckRatio() : BigDecimal.ZERO);
contractProjectCheckPayment.setPaymentRatio(Opt.ofNullable(contract.getProjectCheckRatio()).orElse(BigDecimal.ZERO));
contractProjectCheckPayment.setPaymentDate(contract.getProjectCheckDate());
contractPaymentList.add(contractProjectCheckPayment);
// 质保
ContractPayment contractWarrantyPayment = new ContractPayment();
contractWarrantyPayment.setContractId(contract.getId());
contractWarrantyPayment.setPaymentType(5);
contractWarrantyPayment.setPaymentRatio(null != contract.getWarrantyRatio() ? contract.getWarrantyRatio() : BigDecimal.ZERO);
contractWarrantyPayment.setPaymentRatio(Opt.ofNullable(contract.getWarrantyRatio()).orElse(BigDecimal.ZERO));
contractWarrantyPayment.setPaymentDate(contract.getWarrantyDate());
contractPaymentList.add(contractWarrantyPayment);
// 维保
ContractPayment contractMaintainPayment = new ContractPayment();
contractMaintainPayment.setContractId(contract.getId());
contractMaintainPayment.setPaymentType(6);
BigDecimal maintainPaymentRatio = BigDecimal.ZERO;
if (null != contract.getMaintainRatio1()) {
maintainPaymentRatio = maintainPaymentRatio.add(contract.getMaintainRatio1());
}
if (null != contract.getMaintainRatio2()) {
maintainPaymentRatio = maintainPaymentRatio.add(contract.getMaintainRatio2());
}
if (null != contract.getMaintainRatio3()) {
maintainPaymentRatio = maintainPaymentRatio.add(contract.getMaintainRatio3());
}
contractMaintainPayment.setPaymentRatio(maintainPaymentRatio);
contractPaymentList.add(contractMaintainPayment);
// 第一笔维保款
ContractPayment contractMaintainPayment1 = new ContractPayment();
contractMaintainPayment1.setContractId(contract.getId());
contractMaintainPayment1.setPaymentType(6);
contractMaintainPayment1.setPaymentRatio(Opt.ofNullable(contract.getMaintainRatio1()).orElse(BigDecimal.ZERO));
contractMaintainPayment1.setPaymentDate(contract.getMaintainDate1());
contractPaymentList.add(contractMaintainPayment1);
// 第二笔维保款
ContractPayment contractMaintainPayment2 = new ContractPayment();
contractMaintainPayment2.setContractId(contract.getId());
contractMaintainPayment2.setPaymentType(7);
contractMaintainPayment2.setPaymentRatio(Opt.ofNullable(contract.getMaintainRatio2()).orElse(BigDecimal.ZERO));
contractMaintainPayment2.setPaymentDate(contract.getMaintainDate2());
contractPaymentList.add(contractMaintainPayment2);
// 第三笔维保款
ContractPayment contractMaintainPayment3 = new ContractPayment();
contractMaintainPayment3.setContractId(contract.getId());
contractMaintainPayment3.setPaymentType(8);
contractMaintainPayment3.setPaymentRatio(Opt.ofNullable(contract.getMaintainRatio3()).orElse(BigDecimal.ZERO));
contractMaintainPayment3.setPaymentDate(contract.getMaintainDate3());
contractPaymentList.add(contractMaintainPayment3);
}
contractPaymentService.saveBatch(contractPaymentList);
insertContractList.forEach(c -> {
String contractNo = c.getContractNo();
Contract exist = contractService.lambdaQuery().eq(Contract::getContractNo, contractNo).one();
// 多份合同取最新录入的合同
Contract exist = contractService.lambdaQuery().eq(Contract::getContractNo, contractNo).orderByDesc(Contract::getEntryTime).last("limit 1").list().get(0);
Contract updDto = new Contract();
updDto.setId(exist.getId());
updDto.setPaidAmount(exist.getPaidAmount());
......
......@@ -50,8 +50,8 @@ public class TaskRunner {
JSONObject msg = new JSONObject();
JSONObject content = new JSONObject();
content.set("title", "请查看您未完成的工单~_~");
content.set("markdown", "请查看您未完成的工单" +
" \n 发送时间:" + DateUtil.now());
content.set("markdown", "#### 请查看您未完成的工单" +
" \n #### 发送时间:" + DateUtil.now());
content.set("btn_orientation", "1");
JSONArray jsonArray = new JSONArray();
......
package vion.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
......@@ -29,24 +29,6 @@ public class ContractDTO extends BaseDTO {
private Integer type;
/**
* 合同签订日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date signDate;
/**
* 合同维保开始日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date maintainSdate;
/**
* 合同维保结束日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date maintainEdate;
/**
* 合同进度:1-签订 2-发货 3-货到 4-安装 5-验收 6-质保
*/
private Integer status;
......@@ -92,36 +74,10 @@ public class ContractDTO extends BaseDTO {
*/
private String remark;
/**
* 记录创建者
*/
private Long createUser;
/**
* 记录最后一次修改者
*/
private Long modifyUser;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 修改时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date modifyTime;
private MultipartFile[] files;
/**
* 合同质保周期(月)
*/
private Integer warrantyPeriod;
/**
* 终验日期
*/
private Date finalDate;
......@@ -131,4 +87,10 @@ public class ContractDTO extends BaseDTO {
*/
private Long storeId;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date signDateStart;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date signDateEnd;
}
\ No newline at end of file
package vion.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
@Getter
@Setter
......@@ -27,25 +25,4 @@ public class ContractPaymentDTO {
*/
private BigDecimal paymentRatio;
/**
* 创建者
*/
private Integer createUser;
/**
* 记录最后一次修改者
*/
private Integer modifyUser;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 修改时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date modifyTime;
}
\ No newline at end of file
......@@ -158,50 +158,104 @@ public class Contract {
private BigDecimal invoiceAmount;
/**
* 录入时间
*/
@TableField(value = "entry_time")
private Date entryTime;
/**
* 合同签订付款比例
*/
@TableField(exist = false)
private BigDecimal signRatio;
/**
* 合同签订付款日期
*/
@TableField(exist = false)
private Date signDate1;
/**
* 合同到货付款比例
*/
@TableField(exist = false)
private BigDecimal arriveRatio;
/**
* 合同到货付款日期
*/
@TableField(exist = false)
private Date arriveDate;
/**
* 合同系统验收付款比例
*/
@TableField(exist = false)
private BigDecimal systemCheckRatio;
/**
* 合同系统验收付款日期
*/
@TableField(exist = false)
private Date systemCheckDate;
/**
* 合同项目验收付款比例
*/
@TableField(exist = false)
private BigDecimal projectCheckRatio;
/**
* 合同项目验收付款日期
*/
@TableField(exist = false)
private Date projectCheckDate;
/**
* 合同质保付款比例
*/
@TableField(exist = false)
private BigDecimal warrantyRatio;
/**
* 合同质保付款日期
*/
@TableField(exist = false)
private Date warrantyDate;
/**
* 合同维保付款比例1
*/
@TableField(exist = false)
private BigDecimal maintainRatio1;
/**
* 合同维保付款日期1
*/
@TableField(exist = false)
private Date maintainDate1;
/**
* 合同维保付款比例2
*/
@TableField(exist = false)
private BigDecimal maintainRatio2;
/**
* 合同维保付款日期2
*/
@TableField(exist = false)
private Date maintainDate2;
/**
* 合同维保付款比例2
*/
@TableField(exist = false)
private BigDecimal maintainRatio3;
/**
* 合同维保付款日期2
*/
@TableField(exist = false)
private Date maintainDate3;
}
\ No newline at end of file
......@@ -30,7 +30,7 @@ public class ContractPayment {
private Long contractId;
/**
* 付款方式:1-签订 2-发货 3-货到 4-安装 5-验收 6-质保
* 付款方式:1-签订 2-到货 3-系统验收 4-项目验收 5-质保 6-第一笔维保款 7-第二笔维保款 8-第三笔维保款
*/
@TableField(value = "payment_type")
private Integer paymentType;
......@@ -42,6 +42,12 @@ public class ContractPayment {
private BigDecimal paymentRatio;
/**
* 收款日期
*/
@TableField(value = "payment_date")
private Date paymentDate;
/**
* 创建者
*/
@TableField(value = "create_user")
......
......@@ -8,6 +8,7 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
......@@ -59,7 +60,8 @@ public class ContractServiceImpl extends MPJBaseServiceImpl<ContractMapper, Cont
public Page<ContractVO> list(ContractDTO dto) {
Contract contract = converter.convert(dto, new Contract());
Page<Contract> contractList = this.lambdaQuery(contract)
.orderByDesc(Contract::getModifyTime)
.between(ArrayUtil.isAllNotNull(dto.getSignDateStart(), dto.getSignDateEnd()), Contract::getSignDate, dto.getSignDateStart(), dto.getSignDateEnd())
.orderByDesc(Contract::getEntryTime)
.page(Page.of(dto.getPageNum(), dto.getPageSize()));
List<ContractVO> contractVOList = converter.convert(contractList.getRecords(), ContractVO.class);
// 查出合同关联的项目名
......@@ -77,9 +79,9 @@ public class ContractServiceImpl extends MPJBaseServiceImpl<ContractMapper, Cont
.orElse(ListUtil.of(0L));
Page<Contract> contractList = this.lambdaQuery(contract)
.select(Contract::getId, Contract::getName, Contract::getContractNo, Contract::getType, Contract::getSignDate, Contract::getWarrantyPeriod, Contract::getFinalDate, Contract::getStatus, Contract::getSaleName, Contract::getCustomerName)
.select(Contract::getId, Contract::getName, Contract::getContractNo, Contract::getType, Contract::getSignDate, Contract::getWarrantyPeriod, Contract::getFinalDate, Contract::getStatus, Contract::getSaleName, Contract::getCustomerName, Contract::getMaintainSdate, Contract::getMaintainEdate)
.in(CollUtil.isNotEmpty(ids), Contract::getId, ids)
.orderByDesc(Contract::getModifyTime)
.orderByDesc(Contract::getEntryTime)
.page(Page.of(dto.getPageNum(), dto.getPageSize()));
List<ContractVO> contractVOList = converter.convert(contractList.getRecords(), ContractVO.class);
// 查出合同关联的项目名
......
......@@ -9,6 +9,7 @@ import cn.hutool.core.lang.Opt;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
......@@ -92,6 +93,7 @@ public class TaskServiceImpl extends MPJBaseServiceImpl<TaskMapper, Task> implem
.leftJoin(ServiceOrder.class, ServiceOrder::getTaskId, Task::getId)
.between(data.getStartdate() != null && data.getEnddate() != null, Task::getRepairTime, data.getStartdate(), data.getEnddate())
.lt(data.getCurDate() != null, Task::getExpDate, data.getCurDate());
// todo 优化
if (taskIdSet.size() == 1 && CollUtil.get(taskIdSet, 0).equals(-99L)) {
// 不是管理员,并且第一次处理工单,但当前处理人是他
} else if (taskIdSet.size() == 1 && CollUtil.get(taskIdSet, 0).equals(0L)) {
......@@ -261,12 +263,14 @@ public class TaskServiceImpl extends MPJBaseServiceImpl<TaskMapper, Task> implem
JSONObject msg = new JSONObject();
JSONObject content = new JSONObject();
content.set("title", "您有一条新工单请及时处理哦~_~");
content.set("markdown", "门店信息: " + storeName + "[FullOfVitality]" +
" \n 报修人:" + task.getRepairPeople() +
" \n 联系方式:" + task.getRepairPhone() +
" \n 当前工单状态:" + orderStatusMap.get(task.getStatus()) +
" \n 故障描述:" + task.getFaultDescription() +
" \n 发送时间:" + DateUtil.now());
String markdown = StrUtil.format("#### 门店信息: **{}** [FullOfVitality]" +
" \n #### 报修人:{}" +
" \n #### 联系方式:{}" +
" \n #### 当前工单状态:{}" +
" \n #### 故障描述:{}" +
" \n #### 发送时间:{}",
storeName, task.getRepairPeople(), task.getRepairPhone(), orderStatusMap.get(task.getStatus()), task.getFaultDescription(), DateUtil.now());
content.set("markdown", markdown);
content.set("btn_orientation", "1");
JSONArray jsonArray = new JSONArray();
......
......@@ -129,11 +129,13 @@ public class TaskTempServiceImpl extends MPJBaseServiceImpl<TaskTempMapper, Task
JSONObject msg = new JSONObject();
JSONObject content = new JSONObject();
content.set("title", "客户提交工单,请及时处理哦~_~");
content.set("markdown", "门店信息: " + taskTemp.getStoreName() +
" \n 客户姓名:" + taskTemp.getRepairPeople() +
" \n 联系方式:" + taskTemp.getRepairPhone() +
" \n 故障描述:" + taskTemp.getFaultDescription() +
" \n 发送时间:" + DateUtil.now());
String markdown = StrUtil.format("#### 门店信息: **{}**" +
" \n #### 客户姓名:{}" +
" \n #### 联系方式:{}" +
" \n #### 故障描述:{}" +
" \n #### 发送时间:{}",
taskTemp.getStoreName(), taskTemp.getRepairPeople(), taskTemp.getRepairPhone(), taskTemp.getFaultDescription(), DateUtil.now());
content.set("markdown", markdown);
content.set("btn_orientation", "1");
JSONArray jsonArray = new JSONArray();
......
......@@ -123,6 +123,7 @@ public class ContractVO {
/**
* 终验日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date finalDate;
/**
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!