package com.ydtech.modules.order.entity; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import com.fasterxml.jackson.annotation.JsonFormat; import com.ydtech.constants.enums.InsuranceRisk; import com.ydtech.constants.enums.dict.InsOrderStatusEnum; import com.ydtech.constants.enums.dict.agreement.ProductsType; import com.ydtech.exception.SystemException; import com.ydtech.modules.admin.model.SysDept; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.ins.model.vo.KindInfoVo; import com.ydtech.modules.ins.model.vo.RiskInfoVo; import com.ydtech.modules.order.entity.api.zijin.constants.enums.RiskCodeEnum; import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo; import io.swagger.annotations.ApiModelProperty; import lombok.*; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 保险订单表 * * @TableName ins_orders */ @EqualsAndHashCode @ToString @TableName(value = "ins_orders", autoResultMap = true) @Data @AllArgsConstructor @NoArgsConstructor public class InsOrders implements Serializable { /** * 订单号 */ @TableId(value = "orderno", type = IdType.AUTO) private String orderno; /** * 报价单号 */ @TableField(value = "quoteno") private String quoteno; /** * 承保 保险公司编号 */ @TableField(value = "company_id") private String companyId; /** * 承保 保险名称 */ @TableField(value = "ins_company") private String insCompany; /** * 报价状态 */ @TableField(value = "orderstatus") private String orderstatus; /** * 车辆信息 */ @TableField(value = "carinfo", typeHandler = FastjsonTypeHandler.class) private JSONObject carinfo; /** * 用户id */ @TableField(value = "userid") private String userid; /** * 代客录单时操作员ID */ @TableField(value = "operatorid") private String operatorid; @TableField(exist = false) private String operatorName; /** * 用户名称 */ @TableField(value = "username") private String username; /** * 代理团队id */ @TableField(value = "deptid") private String deptid; /** * 代理团队名称 */ @TableField(value = "deptname") private String deptname; /** * 车主信息 */ @TableField(value = "ownerinfo", typeHandler = FastjsonTypeHandler.class) private JSONObject ownerinfo; /** * 投保人信息 */ @TableField(value = "applyinfo", typeHandler = FastjsonTypeHandler.class) private JSONObject applyinfo; /** * 被保人信息 */ @TableField(value = "insureinfo", typeHandler = FastjsonTypeHandler.class) private JSONObject insureinfo; /** * 协议id */ @TableField(value = "agreeid") private String agreeid; /** * 产品id */ @TableField(value = "productid") private String productid; /** * 产品名称 */ @TableField(value = "product") private String product; /** * 创建时间 */ @TableField(value = "createtime") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createtime; /** * 车架号 VIN码 */ @TableField(value = "frameno") private String frameno; /** * 车牌号 */ @TableField(value = "licenseno") private String licenseno; /** * 投保人姓名 */ @TableField(value = "insuredname") private String insuredname; /** * 交强险开始时间 */ @TableField(value = "jqstartdate") private String jqstartdate; /** * 交强险结束时间 */ @TableField(value = "jqenddate") private String jqenddate; /** * 商业险开始时间 */ @TableField(value = "systartdate") private String systartdate; /** * 商业险结束时间 */ @TableField(value = "syenddate") private String syenddate; /** * 商业 交强 */ @TableField(value = "risk", typeHandler = FastjsonTypeHandler.class) private JSONArray risk; /** * 商业险信息 */ @TableField(value = "king", typeHandler = FastjsonTypeHandler.class) private JSONArray king; /** * 车船税信息 */ @TableField(value = "vehicle_and_vessel_tax", typeHandler = FastjsonTypeHandler.class) private JSONObject vehicleAndVesselTax; @TableField(value = "is_external") private Integer isExternal; @TableField(exist = false) private List insAreaCompanyList; //子级集合 @TableField(exist = false) private static final long serialVersionUID = 1L; @TableField(exist = false) private String subOrderId; //子订单id @TableField(exist = false) private BigDecimal willFirstPremiums; //一级预收金额 @TableField(exist = false) private BigDecimal willSecondPremiums; //二级预收金额 @TableField(exist = false) private BigDecimal willThreePremiums; //三级预收金额 @TableField(exist = false) private String managementSource; //业务员机构来源 @TableField(exist = false) private String auditStatus; //订单费用审核状态 @TableField(exist = false) private String auditUser; //订单费用审核人 @TableField(exist = false) private String auditTime; //订单费用审核时间 @TableField(exist = false) private String agreementCode; //协议code @TableField(exist = false) private String agreementName; //协议名称 @TableField(exist = false) private String partnerCompaniesName; //合作公司简称 @TableField(exist = false) private Integer apiType; @TableField(exist = false) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime signingTime; //签单时间 @TableField(exist = false) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime payDate; //支付时间 @TableField(exist = false) private String jqpremium; @TableField(exist = false) private String sypremium; @TableField(exist = false) private String jypremium; @TableField(exist = false) private String taxamount; @TableField(exist = false) private String problemOrder; @ApiModelProperty("交强险总比例") @TableField(exist = false) private BigDecimal jqCostsProportion; @ApiModelProperty("商业险总比例") @TableField(exist = false) private BigDecimal syCostsProportion; @ApiModelProperty("非车险总比例") @TableField(exist = false) private BigDecimal noCostsProportion; public InsOrders(SysUser user, SysDept dept, BaseQuoteInfoVo quoteInfoVo) { // 2. 组装订单 this.setQuoteno(String.valueOf(quoteInfoVo.getQuoteno())); this.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode()); // 0 报价 1 待核保 2 已核保待缴费 3 核保退回 4 核保不通过 this.setFrameno(quoteInfoVo.getCarInfo().getFrameNo()); this.setLicenseno(quoteInfoVo.getCarInfo().getLicenseNo()); this.setIsExternal(quoteInfoVo.getIsExternal() != null ? quoteInfoVo.getIsExternal() : 0); // 2.1 车辆信息 this.setCarinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getCarInfo()))); this.setUserid(user.getId()); this.setUsername(user.getName()); this.setDeptid(user.getDeptId()); this.setDeptname(dept == null ? "" : dept.getName()); // 2.2 人员信息 this.setOwnerinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getOwnerInfo()))); this.setApplyinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getPolicyHolderInfo()))); this.setInsureinfo(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getInsuredPersonInfo()))); this.setInsuredname(quoteInfoVo.getPolicyHolderInfo().getName()); List risks = quoteInfoVo.getRiskList(); List kinds = quoteInfoVo.getKindList(); // 2.3 主险种信息 this.insuranceInformation(risks, kinds); // 2.3.1 险种信息 this.setRisk(JSON.parseArray(JSON.toJSONString(quoteInfoVo.getRiskList()))); // 2.4 产品信息 this.productInformation(risks, kinds); this.setCreatetime(LocalDateTime.now()); // 2.5 车船税信息 this.setVehicleAndVesselTax(JSON.parseObject(JSON.toJSONString(quoteInfoVo.getVehicleAndVesselTax()))); } /** * 保险信息 * * @param risks 主险种 * @param kinds 商业险险种 */ private void insuranceInformation(List risks, List kinds) { for (RiskInfoVo riskInfoVo : risks) { if (InsuranceRisk.TRAFFIC.getCode().equals(riskInfoVo.getRiskCode())) { //交强 this.setJqstartdate(riskInfoVo.getStartDate()); this.setJqenddate(riskInfoVo.getEndDate()); } if (InsuranceRisk.BUSINESS.getCode().equals(riskInfoVo.getRiskCode())) { //商业 this.setSystartdate(riskInfoVo.getStartDate()); this.setSyenddate(riskInfoVo.getEndDate()); if (kinds.isEmpty()) { throw new SystemException("商业险险种未选择,不允许报价"); } } } } /** * 产品信息 * * @param risks 主险种 * @param kinds 商业险险种 */ public void productInformation(List risks, List kinds) { /** * 投保险种逻辑 * 单交-单交强 * 单商-单商业(含车损) * 单三-单商业(不含车损) * 交三-交强+商业(不含车损) * 交商-交强+商业(含车损) * 单交: * 单商:034001 * 单三:034002 * 交三:0330034002 * 交商:0330034001 * */ ProductsType productsType = InsuranceRisk.determineInsuranceInformation(kinds, risks); this.setProductid(productsType.getCode()); this.setProduct(productsType.getDesc()); } }