package org.dromara.crm.domain.vo; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; import org.dromara.crm.domain.CrmContract; import com.fasterxml.jackson.annotation.JsonFormat; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.List; /** * CRM合同视图对象 crm_contract * * @author AI Assistant * @date 2025-10-04 */ @Data @AutoMapper(target = CrmContract.class) public class CrmContractVo implements Serializable { @Serial private static final long serialVersionUID = 1L; /** * 主键ID */ @ExcelProperty(value = "ID") private Long id; /** * 合同编号 */ @ExcelProperty(value = "合同编号") private String contractNo; /** * 合同名称 */ @ExcelProperty(value = "合同名称") private String contractName; /** * 客户ID */ private Long customerId; /** * 客户名称 */ @ExcelProperty(value = "客户名称") private String customerName; /** * 商机ID */ private Long opportunityId; /** * 报价单ID */ private Long quoteId; /** * 原合同ID(续签时关联) */ private Long parentContractId; /** * 续签次数 */ @ExcelProperty(value = "续签次数") private Integer renewalCount; /** * 合同模板ID */ private Long templateId; /** * 合同模版 */ @ExcelProperty(value = "合同模版", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_contract_template") private String contractTemplate; /** * 联系人ID */ private Long contactId; /** * 联系人姓名 */ @ExcelProperty(value = "联系人") private String contactName; /** * 联系人手机 */ private String contactMobile; /** * 合同类型 */ @ExcelProperty(value = "合同类型", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_contract_type") private String contractType; /** * 合同性质 */ @ExcelProperty(value = "合同性质", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_contract_nature") private String contractNature; /** * 合同金额 */ @ExcelProperty(value = "合同金额") private BigDecimal amount; /** * 币种 */ @ExcelProperty(value = "币种", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_currency") private String currency; /** * 税率(%) */ @ExcelProperty(value = "税率(%)") private BigDecimal taxRate; /** * 含税金额 */ @ExcelProperty(value = "含税金额") private BigDecimal amountWithTax; /** * 签订日期 */ @ExcelProperty(value = "签订日期") private LocalDate signDate; /** * 实际签订日期 */ @ExcelProperty(value = "实际签订日期") private LocalDate actualSignDate; /** * 开始日期 */ @ExcelProperty(value = "开始日期") private LocalDate startDate; /** * 结束日期 */ @ExcelProperty(value = "结束日期") private LocalDate endDate; /** * 合同期限(月) */ @ExcelProperty(value = "合同期限(月)") private Integer contractPeriod; /** * 合同状态 */ @ExcelProperty(value = "合同状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_contract_status") private String status; /** * 履约状态 */ @ExcelProperty(value = "履约状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_performance_status") private String performanceStatus; /** * 履约完成度(%) */ @ExcelProperty(value = "履约完成度(%)") private BigDecimal performanceRate; /** * 客户满意度(1-5星) */ @ExcelProperty(value = "客户满意度") private Integer customerSatisfaction; /** * 审批状态 */ @ExcelProperty(value = "审批状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "crm_contract_approval_status") private String approvalStatus; /** * 审批流程ID */ private Long approvalFlowId; /** * 合同文件路径 */ private String contractFile; /** * 附件文件 */ private String attachmentFiles; /** * 负责人ID */ private Long ownerUserId; /** * 负责人姓名 */ @ExcelProperty(value = "负责人") private String ownerUserName; /** * 已回款金额 */ @ExcelProperty(value = "已回款金额") private BigDecimal receivedAmount; /** * 未回款金额 */ @ExcelProperty(value = "未回款金额") private BigDecimal unreceivedAmount; /** * 已开票金额 */ @ExcelProperty(value = "已开票金额") private BigDecimal invoiceAmount; /** * 未开票金额 */ @ExcelProperty(value = "未开票金额") private BigDecimal uninvoiceAmount; /** * 甲方 */ @ExcelProperty(value = "甲方") private String partyA; /** * 甲方地址 */ private String partyAAddress; /** * 甲方联系人 */ private String partyAContact; /** * 甲方联系电话 */ private String partyAMobile; /** * 甲方法定代表人 */ private String partyALegalPerson; /** * 甲方代理人 */ private String partyAAgent; /** * 甲方电话/传真 */ private String partyAPhoneFax; /** * 甲方开户银行 */ private String partyABank; /** * 甲方银行账号 */ private String partyAAccount; /** * 供方主体ID(关联crm_supplier_info表) */ private Long supplierId; /** * 供方主体名称(冗余字段,用于显示) */ private String supplierName; /** * 结算方式(arrive_payment-货到付款/advance_payment-款到发货) */ private String settlementMethod; /** * 乙方 */ @ExcelProperty(value = "乙方") private String partyB; /** * 乙方地址 */ private String partyBAddress; /** * 乙方联系人 */ private String partyBContact; /** * 乙方联系电话 */ private String partyBMobile; /** * 乙方法定代表人 */ @ExcelProperty(value = "乙方法定代表人") private String partyBLegalPerson; /** * 乙方代理人 */ @ExcelProperty(value = "乙方代理人") private String partyBAgent; /** * 乙方电话/传真 */ @ExcelProperty(value = "乙方电话/传真") private String partyBPhoneFax; /** * 乙方开户银行 */ @ExcelProperty(value = "乙方开户银行") private String partyBBank; /** * 乙方银行账号 */ @ExcelProperty(value = "乙方银行账号") private String partyBAccount; /** * 付款条款 */ private String paymentTerms; /** * 交付条款 */ private String deliveryTerms; /** * 合同条款 */ private String contractTerms; /** * 作废原因 */ private String invalidReason; /** * 作废时间 */ private LocalDateTime invalidTime; /** * 创建部门 */ private Long createDept; /** * 创建部门名称 */ @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "createDept") @ExcelProperty(value = "创建部门") private String createDeptName; /** * 创建者 */ private Long createBy; /** * 创建者昵称 */ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") @ExcelProperty(value = "创建人") private String createByName; /** * 创建时间 */ @ExcelProperty(value = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date createTime; /** * 更新者 */ private Long updateBy; /** * 更新者昵称 */ @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "updateBy") @ExcelProperty(value = "更新人") private String updateByName; /** * 更新时间 */ @ExcelProperty(value = "更新时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") private Date updateTime; /** * 合同模板内容(富文本HTML) */ private String templateContent; /** * 第五条结算方式草稿(按结算方式区分的JSON) */ private String settlementClauseDrafts; /** * 备注 */ @ExcelProperty(value = "备注") private String remark; /** * 当前用户是否可以审批(前端使用,非数据库字段) */ private Boolean canApprove; /** * 合同产品明细列表(非数据库字段,查询时关联) */ private List products; public List getProducts() { return products; } public void setProducts(List products) { this.products = products; } }