Explorar o código

1.处理平安驾意险传值问题
2.处理平安能源车的商业险赋值问题
3.处理平安支付回调接口问题
4.处理平安逻辑bug问题
5.处理协议修改协议类型后自动重新生成数据的逻辑

hxl13994548489 %!s(int64=2) %!d(string=hai) anos
pai
achega
54d480009d

+ 12 - 3
src/main/java/com/ydtech/modules/fnc/controller/InsPlyIncomeController.java

@@ -3,17 +3,16 @@ package com.ydtech.modules.fnc.controller;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.fnc.dto.PlatformSettlementRecordDto;
-import com.ydtech.modules.fnc.dto.SumAllAmountSettlementDto;
 import com.ydtech.modules.fnc.entity.InsPlyIncome;
 import com.ydtech.modules.fnc.entity.SettlementDocumentaryFeesEntity;
 import com.ydtech.modules.fnc.service.ImportAsyncService;
 import com.ydtech.modules.fnc.service.InsPlyIncomeService;
+import com.ydtech.modules.fnc.vo.InsPlyIncomeIdsVo;
 import com.ydtech.modules.fnc.vo.InsPlyIncomeVo;
 import com.ydtech.modules.inv.model.dto.InsBxNoPlyIncomeExcelDto;
 import com.ydtech.modules.inv.model.dto.InsBxOtherExcelDto;
 import com.ydtech.modules.inv.model.dto.InsBxPlyIncomeExcelDto;
 import com.ydtech.modules.inv.model.dto.InsNoBxOtherExcelDto;
-import com.ydtech.modules.inv.utils.EasyExcelUtils;
 import com.ydtech.modules.order.entity.BasePageResult;
 import com.ydtech.utils.SnowFlakeUtil;
 import com.ydtech.utils.StringUtils;
@@ -28,7 +27,6 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.io.InputStream;
 import java.time.Period;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -501,6 +499,17 @@ public class InsPlyIncomeController extends BaseController {
     public HttpResult<List<HashMap<String,Object>>> monthTotalReceivables(@RequestBody InsPlyIncomeVo insPlyIncomeVo) {
         return insPlyIncomeService.monthTotalReceivables(insPlyIncomeVo);
     }
+
+    /**
+     *  添加修正数据的逻辑
+     * @param
+     * @return
+     */
+    @PostMapping("/createData")
+    @ApiModelProperty(value = "添加修正数据的逻辑")
+    public HttpResult<List<InsPlyIncome>> createData(@RequestBody InsPlyIncomeIdsVo insPlyIncomeIdsVo) {
+        return insPlyIncomeService.createData(insPlyIncomeIdsVo);
+    }
 }
 
 

+ 9 - 0
src/main/java/com/ydtech/modules/fnc/service/InsPlyIncomeService.java

@@ -10,6 +10,7 @@ import com.ydtech.modules.fnc.dto.PlatformSettlementRecordDto;
 import com.ydtech.modules.fnc.entity.InsAreaCompany;
 import com.ydtech.modules.fnc.entity.InsPlyIncome;
 import com.ydtech.modules.fnc.entity.SettlementDocumentaryFeesEntity;
+import com.ydtech.modules.fnc.vo.InsPlyIncomeIdsVo;
 import com.ydtech.modules.fnc.vo.InsPlyIncomeVo;
 import com.ydtech.modules.order.entity.BasePageResult;
 import com.ydtech.modules.order.entity.InsOrders;
@@ -203,4 +204,12 @@ public interface InsPlyIncomeService extends IService<InsPlyIncome> {
      */
     FinancialReceivablesAllVo queryPrivateCar(FinancialReceivablesQueryVo financialReceivablesQueryVo);
 
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/8/7 11:20
+     *  @Description: 添加修正协议修改类型重新生成数据的逻辑
+     */
+    HttpResult<List<InsPlyIncome>> createData(InsPlyIncomeIdsVo insPlyIncomeIdsVo);
+
 }

+ 33 - 0
src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java

@@ -5,6 +5,7 @@ import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alipay.api.domain.VehicleIovData;
+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.github.pagehelper.PageHelper;
@@ -18,10 +19,12 @@ import com.ydtech.modules.admin.utils.SliceUpDateUtil;
 import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.esm.model.EsmInsCompany;
 import com.ydtech.modules.esm.service.EsmInsCompanyService;
+import com.ydtech.modules.fnc.dao.FncInsAreaCompanyMapper;
 import com.ydtech.modules.fnc.dao.InsPlyIncomeMapper;
 import com.ydtech.modules.fnc.dto.PlatformSettlementRecordDto;
 import com.ydtech.modules.fnc.entity.*;
 import com.ydtech.modules.fnc.service.*;
+import com.ydtech.modules.fnc.vo.InsPlyIncomeIdsVo;
 import com.ydtech.modules.fnc.vo.InsPlyIncomeVo;
 import com.ydtech.modules.fnc.vo.SettlementDocumentaryFeesVo;
 import com.ydtech.modules.ins.model.vo.res.*;
@@ -120,6 +123,9 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
     @Value("${upload.file.url}")
     private String uploadUrl;
 
+    @Autowired
+    private FncInsAreaCompanyMapper fncInsAreaCompanyMapper;
+
 
     public HttpResult<BasePageResult<InsPlyIncome>> queryplyIncome(InsPlyIncomeVo insPlyIncomeVo) {
 
@@ -3480,4 +3486,31 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
     private BigDecimal stringToBigdecimal(String value) {
         return new BigDecimal(value).setScale(5, RoundingMode.DOWN);
     }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/8/7 11:20
+     *  @Description: 修正协议变动重新生成数据逻辑
+     */
+    @Override
+    public HttpResult<List<InsPlyIncome>> createData(InsPlyIncomeIdsVo insPlyIncomeIdsVo) {
+        if(insPlyIncomeIdsVo.getIds()==null || insPlyIncomeIdsVo.getIds().size()==0){
+            throw new SystemException("子订单id不能为空!!");
+        }
+        List<String> ids = insPlyIncomeIdsVo.getIds();
+        List<InsPlyIncome>  newList=new ArrayList<>();
+        for(String  subOrderId:ids){
+            //查询子订单对象   com.ydtech.modules.order.entity
+            InsAreaCompany insAreaCompany = fncInsAreaCompanyMapper.selectById(subOrderId);
+            //大订单对象
+            InsOrders order = insOrdersService.existOrder(insAreaCompany.getOrderno());
+
+            //获取该订单的费用
+            InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper<InsFeeOrderNew>()
+                    .eq(InsFeeOrderNew::getInsOrderNo, insAreaCompany.getId()));
+            saveBalanceNew(order, insFeeOrderNew,insAreaCompany) ;
+        }
+        return HttpResult.ok(newList);
+    }
 }

+ 22 - 0
src/main/java/com/ydtech/modules/fnc/vo/InsPlyIncomeIdsVo.java

@@ -0,0 +1,22 @@
+package com.ydtech.modules.fnc.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2024/8/7 11:18
+ *  @Description:   修正数据vo
+ */
+@Data
+@ApiModel("修正数据vo")
+public class InsPlyIncomeIdsVo implements Serializable {
+
+    @ApiModelProperty("子订单id")
+    private List<String> ids;
+}

+ 13 - 0
src/main/java/com/ydtech/modules/ins/model/pingan/respose/PingAnQuoteRespVo.java

@@ -13,4 +13,17 @@ public class PingAnQuoteRespVo extends QuoteRespVo {
     // 小微险保费
     QuoteResponse.XwActualPremiumDTO xwActualPremium = new QuoteResponse.XwActualPremiumDTO();
 
+    /***
+     * 财意险
+     */
+    double cyPremium=0;
+    /***
+     *  小微险
+     */
+    double xwPremium=0;
+    /***
+     * 组合
+     */
+    double zhPremium=0;
+
 }

+ 3 - 0
src/main/java/com/ydtech/modules/ins/model/ya/YaQuoteInfoVo.java

@@ -51,6 +51,8 @@ public class YaQuoteInfoVo implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startDate;
 
+    private String userid;
+
     public YaQuoteInfoVo() {
     }
 
@@ -62,6 +64,7 @@ public class YaQuoteInfoVo implements Serializable {
         this.riskList = JSON.parseArray(JSON.toJSONString(insOrders.getRisk()), RiskInfoVo.class);
         this.kindList = JSON.parseArray(JSON.toJSONString(insOrders.getKing()), KindInfoVo.class);
         this.quoteno = insOrders.getQuoteno();
+        this.userid = insOrders.getUserid();
     }
 
 }

+ 1 - 1
src/main/java/com/ydtech/modules/order/controller/PingAnOrderApiController.java

@@ -47,7 +47,7 @@ public class PingAnOrderApiController {
     @QuoteVerification("报价授权")
     @PostMapping("/quote")
     @ApiOperation("1报价-标的查询-车型查询-车辆确认-报价")
-    public HttpResult<QuoteRespVo> quote(@RequestBody PingAnQuoteVo<InsDrivingIntentionInsuranceSonVo> quoteVo) throws Exception {
+    public HttpResult<QuoteRespVo> quote(@RequestBody PingAnQuoteVo<Map<String,Object>> quoteVo) throws Exception {
         BaseQuoteInfoVo quoteInfo = this.insOrdersComponents.getQuoteInfo(quoteVo.getOrderNo(), quoteVo.getAgreementId());
         return this.pingAnOrderApiService.quote(quoteInfo, quoteVo);
     }

+ 6 - 0
src/main/java/com/ydtech/modules/order/entity/api/pingan/log/PinganApiLog.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 
@@ -61,6 +62,11 @@ public class PinganApiLog implements Serializable {
      */
     private String responseType;
 
+    /***
+     * 创建时间
+     */
+    private Date createTime;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 

+ 122 - 24
src/main/java/com/ydtech/modules/order/entity/api/pingan/request/QuoteRequest.java

@@ -1,10 +1,10 @@
 package com.ydtech.modules.order.entity.api.pingan.request;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.ydtech.constants.enums.InsurKind;
 import com.ydtech.modules.ins.model.vo.KindInfoVo;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.entity.api.pingan.response.CarConfirmResponse;
-import com.ydtech.modules.order.entity.api.pingan.response.SearchPAVehicleListResponse;
 import com.ydtech.modules.order.entity.api.pingan.utils.checkNull.CheckNotEmpty;
 import com.ydtech.modules.order.entity.api.pingan.utils.checkNull.FieldEmptyException;
 import com.ydtech.modules.order.entity.api.pingan.utils.checkNull.Validate;
@@ -13,12 +13,10 @@ import com.ydtech.modules.order.entity.config.PingAnConfigureParameters;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.pingan.InsDrivingIntentionInsuranceSonVo;
 import lombok.Data;
-import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
+
 /**
  *  @version
  *  @author: hxl
@@ -454,6 +452,16 @@ public class QuoteRequest extends PingAnBaseRequest {
      */
     //@CheckNotEmpty(fieldName = "是否投保小微险", message = "是否投保小微险不能为空")
     private String applyXiaoWei;
+
+
+    /***
+     * 是否投保组合产品
+     * true,false
+     * M
+     */
+    //@CheckNotEmpty(fieldName = "是否投保组合产品", message = "是否投保组合产品不能为空")
+    private String applyCombination;
+
     /***
      * 财意险列表
      */
@@ -464,6 +472,13 @@ public class QuoteRequest extends PingAnBaseRequest {
      */
     //@CheckNotEmpty(fieldName = "小微险列表")
     private List<UnAutoListInfoDTO> xiaoWeiListInfo=new ArrayList<UnAutoListInfoDTO>();
+
+    /***
+     *  组合险种
+     */
+    private List<CombinationInfoDTO> combinationInfoList=new ArrayList<CombinationInfoDTO>();
+
+
     /***
      * 非车代理人编码
      * (投保车驾意,且需要使用网点自己的非车代理需要传入。如下协议、子协议号都需要传入。)
@@ -751,7 +766,7 @@ public class QuoteRequest extends PingAnBaseRequest {
      */
     private List<Amount23XNYChargingPostListDTO> amount23XNYChargingPostList=new ArrayList<Amount23XNYChargingPostListDTO>();
     //todo
-    public QuoteRequest(PingAnConfigureParameters parameters, BaseQuoteInfoVo quoteInfo, SearchPAVehicleListResponse.ModelsDto modelsDto, String flowid,String accommodationFlag,String applyUnAuto,String applyXiaoWei,List<UnAutoListInfoDTO> unAutoListInfo,List<UnAutoListInfoDTO> xiaoWeiListInfo,List<Amount22XNYChargingPostListDTO> amount22XNYChargingPostList, List<Amount23XNYChargingPostListDTO> amount23XNYChargingPostList) {
+    public QuoteRequest(PingAnConfigureParameters parameters, BaseQuoteInfoVo quoteInfo,String flowid,String accommodationFlag,List<Amount22XNYChargingPostListDTO> amount22XNYChargingPostList, List<Amount23XNYChargingPostListDTO> amount23XNYChargingPostList,Map<String,Object> jymap) {
         this.setUserId(parameters.getUserId());
         this.setFlowid(flowid);
         InsOrders insOrders = new InsOrders();
@@ -764,14 +779,64 @@ public class QuoteRequest extends PingAnBaseRequest {
         this.setApplyBiz(String.valueOf(map.get("syFlag")));
         this.bizQuote=bizQuoteDto;
         this.setAccommodationFlag(accommodationFlag);
-        this.setApplyUnAuto(applyUnAuto);
-        this.setApplyXiaoWei(applyXiaoWei);
+        //处理驾意险信息
+        List<QuoteRequest.UnAutoListInfoDTO>  unAutoListInfoList=new ArrayList<>();
+        List<QuoteRequest.UnAutoListInfoDTO>  xiaoWeiListInfoList=new ArrayList<>();
+        List<QuoteRequest.CombinationInfoDTO>  combinationInfoList=new ArrayList<>();
 
-        this.setIsOnlineProducts("N");
+        if(jymap!=null && jymap.get("0")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) jymap.get("0");
+            if(linkedMap!=null && linkedMap.size()>0){
+                InsDrivingIntentionInsuranceSonVo vo = BeanUtil.mapToBean(linkedMap, InsDrivingIntentionInsuranceSonVo.class, true);
+                QuoteRequest.UnAutoListInfoDTO unAutoListInfoDTO =new QuoteRequest.UnAutoListInfoDTO(vo.getProductCode(),vo.getCode(),vo.getQuantity());
+                unAutoListInfoList.add(unAutoListInfoDTO);
+            }
+        }
+        if(jymap!=null && jymap.get("1")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) jymap.get("1");
+            if(linkedMap!=null && linkedMap.size()>0){
+                InsDrivingIntentionInsuranceSonVo vo = BeanUtil.mapToBean(linkedMap, InsDrivingIntentionInsuranceSonVo.class, true);
+                QuoteRequest.UnAutoListInfoDTO unAutoListInfoDTO =new QuoteRequest.UnAutoListInfoDTO(vo.getProductCode(),vo.getCode(),vo.getQuantity());
+                unAutoListInfoList.add(unAutoListInfoDTO);
+            }
+        }
+        if(jymap!=null && jymap.get("2")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) jymap.get("2");
+            if(linkedMap!=null && linkedMap.size()>0){
+                List<InsDrivingIntentionInsuranceSonVo> zhlist = (List<InsDrivingIntentionInsuranceSonVo>)linkedMap.get("2");
+                for(InsDrivingIntentionInsuranceSonVo zhVo : zhlist ){
+                    QuoteRequest.CombinationInfoDTO combinationInfo =new QuoteRequest.CombinationInfoDTO(zhVo.getProductCode(),zhVo.getCode(),zhVo.getQuantity(),zhVo.getCombineProductType());
+                    combinationInfoList.add(combinationInfo);
+                }
+            }
+        }
+        if(unAutoListInfoList!=null && unAutoListInfoList.size()>0){
+            this.setApplyUnAuto("true");
+        }else{
+            this.setApplyUnAuto("false");
+        }
+        if(xiaoWeiListInfoList!=null && xiaoWeiListInfoList.size()>0){
+            this.setApplyXiaoWei("true");
+        }else{
+            this.setApplyXiaoWei("false");
+        }
+        if(xiaoWeiListInfoList!=null && xiaoWeiListInfoList.size()>0){
+            this.setApplyXiaoWei("true");
+        }else{
+            this.setApplyXiaoWei("false");
+        }
+        if(combinationInfoList!=null && combinationInfoList.size()>0){
+            this.setApplyCombination("true");
+        }else{
+            this.setApplyCombination("false");
+        }
         // 财意险列表
+        this.setUnAutoListInfo(unAutoListInfoList);
         // 小微险列表
-        this.setUnAutoListInfo(unAutoListInfo);
-        this.setXiaoWeiListInfo(xiaoWeiListInfo);
+        this.setXiaoWeiListInfo(unAutoListInfoList);
+        // 组合险列表
+        this.setCombinationInfoList(combinationInfoList);
+        this.setIsOnlineProducts("N");
         this.setAmount22XNYChargingPostList(amount22XNYChargingPostList);
         this.setAmount23XNYChargingPostList(amount23XNYChargingPostList);
     }
@@ -781,19 +846,8 @@ public class QuoteRequest extends PingAnBaseRequest {
      *  @Date: 2024/7/19 16:17
      *  @Description:  处理财意险列表、小微险列表、组合险
      */
-    public QuoteRequest transYJPingAnRequestMsg(InsDrivingIntentionInsuranceSonVo vo, QuoteRequest quoteRequest, String type) {
-        //处理
-        List<UnAutoListInfoDTO>  unAutoListInfoList=new ArrayList<>();
-        if(vo!=null && StringUtils.isNotBlank(vo.getProductCode()) ){
-              UnAutoListInfoDTO  unAutoListInfoDTO =new  UnAutoListInfoDTO(vo.getProductCode(),vo.getCode(),"1");
-              unAutoListInfoList.add(unAutoListInfoDTO);
-        }
-        if(unAutoListInfoList!=null && unAutoListInfoList.size()>0){
-            quoteRequest.setApplyUnAuto("true");
-        }else{
-            quoteRequest.setApplyUnAuto("false");
-        }
-        quoteRequest.setUnAutoListInfo(unAutoListInfoList);
+    public QuoteRequest transYJPingAnRequestMsg(Map<String,Object> map, QuoteRequest quoteRequest, String type) {
+
         return quoteRequest;
     }
 
@@ -1023,6 +1077,50 @@ public class QuoteRequest extends PingAnBaseRequest {
             this.sellListSize = sellListSize;
         }
     }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/8/6 15:58
+     *  @Description:  组合险
+     */
+    @Data
+    public static class CombinationInfoDTO implements Serializable {
+
+        /***
+         * 产品编码
+         * M
+         */
+        @CheckNotEmpty(fieldName = "产品编码", message = "产品编码不能为空")
+        private String productCode;
+        /***
+         * 套餐编码
+         * M
+         */
+        @CheckNotEmpty(fieldName = "套餐编码", message = "套餐编码不能为空")
+        private String setMeal;
+        /***
+         * 购买份数
+         * M
+         */
+        @CheckNotEmpty(fieldName = "购买份数", message = "购买份数不能为空")
+        private String policyAmount;
+
+        /***
+         * 组合产品类型
+         * 11组合产品
+         * M
+         */
+        @CheckNotEmpty(fieldName = "组合产品类型", message = "组合产品类型不能为空")
+        private String productType;
+
+
+        public CombinationInfoDTO(String productCode, String setMeal, String policyAmount,String productType) {
+            this.productCode = productCode;
+            this.setMeal = setMeal;
+            this.policyAmount = policyAmount;
+            this.productType = productType;
+        }
+    }
     /***
      * 新增加设备损失险设备信息列表
      */

+ 40 - 0
src/main/java/com/ydtech/modules/order/entity/api/pingan/response/QuoteResponse.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -88,6 +89,11 @@ public class QuoteResponse extends PingAnBaseResponse {
      */
     private XwActualPremiumDTO xwActualPremium;
 
+    /***
+     * 财产险保费
+     */
+    private CombinationPremiumDTO combinationPremium;
+
     /***
      * 商业险信息
      */
@@ -1533,5 +1539,39 @@ public class QuoteResponse extends PingAnBaseResponse {
 
     }
 
+    /***
+     * 组合险保费
+     */
+    @Data
+    public static class CombinationPremiumDTO implements Serializable {
+        /***
+         * 小微险保费
+         */
+        private List<CombinationPremiumDetaillDTO> premiumList =new ArrayList<CombinationPremiumDetaillDTO>();
+
+    }
+    @Data
+    public static class CombinationPremiumDetaillDTO implements Serializable {
+
+        /***
+         * 财意险类型
+         */
+        private String productType;
+        /***
+         * 产品编码
+         */
+        private String productCode;
+        /***
+         * 套餐编码
+         */
+        private String setMeal;
+        /***
+         * 保费
+         */
+        private String premium;
+
+    }
+
+
 
 }

+ 1 - 0
src/main/java/com/ydtech/modules/order/entity/vo/BaseQuoteInfoVo.java

@@ -32,6 +32,7 @@ public class BaseQuoteInfoVo extends YaQuoteInfoVo {
 
     public BaseQuoteInfoVo(InsOrders insOrders) {
         super(insOrders);
+        this.userId = insOrders.getUserid();
         this.orderNo = insOrders.getOrderno();
         this.vehicleAndVesselTax = insOrders.getVehicleAndVesselTax().toJavaObject(VehicleAndVesselTax.class);
     }

+ 56 - 18
src/main/java/com/ydtech/modules/order/entity/vo/pingan/InsDrivingIntentionInsuranceSonVo.java

@@ -1,5 +1,6 @@
 package com.ydtech.modules.order.entity.vo.pingan;
 
+import io.swagger.annotations.ApiModel;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -9,41 +10,78 @@ import java.io.Serializable;
  */
 
 @Data
+@ApiModel(value = "驾意险")
 public class InsDrivingIntentionInsuranceSonVo implements Serializable {
 
 
     private Integer id;
-
+    /***
+     *
+     * 02财产险
+     * 03意外险
+     * 10 小微险
+     */
     private String drivingCodeId;
-
+    /***
+     * 保险公司id
+     */
     private String companyId;
-
+    /***
+     *  packageCode   套餐编码
+     */
     private String code;
-
-    private String name;
-
+    /***
+     *  套餐名称
+     */
+    private String projectName;
+    /***
+     *  保额
+     */
     private String amount;
-
+    /***
+     *  保费
+     */
     private String premium;
-
+    /***
+     *  折扣
+     */
     private String discount;
-
+    /***
+     *   保费说明   每份保费或每份保费*座位数
+     */
     private String insuredAmountTips;
-
+    /***
+     * 最小购买年龄
+     */
     private String leastAcceptInsureAge;
-
+    /***
+     * 最大购买年龄
+     */
     private String topAcceptInsureAge;
-
+    /***
+     * 版本
+     */
     private String version;
-
+    /***
+     * 最大购买次数
+     */
     private String sellListSize;
-
+    /***
+     * 组合产品标识	02-组合必选
+     * 01-不可单独销售
+     */
     private String  combineProductType;
-
+    /***
+     * 产品编码
+     */
     private String productCode;
 
-    private String projectName;
-
+    /***
+     *  产品名称
+     */
+    private String name;
+    /***
+     *  份数
+     */
     private String quantity;
-
 }

+ 1 - 2
src/main/java/com/ydtech/modules/order/service/PingAnOrderApiService.java

@@ -10,7 +10,6 @@ import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.InsDrivingIntentionInsuranceVo;
 import com.ydtech.modules.order.entity.vo.SpecialAuditVo;
 import com.ydtech.modules.order.entity.vo.bohai.ProductDetailsQueryVo;
-import com.ydtech.modules.order.entity.vo.pingan.InsDrivingIntentionInsuranceSonVo;
 import com.ydtech.modules.order.entity.vo.pingan.PingAnQuoteVo;
 import com.ydtech.modules.order.entity.vo.pingan.RenewalConfirmVo;
 import com.ydtech.modules.order.entity.vo.pingan.StorefrontQueryVo;
@@ -40,7 +39,7 @@ public interface PingAnOrderApiService {
      * @param quoteVo
      * @return
      */
-    HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfo, PingAnQuoteVo<InsDrivingIntentionInsuranceSonVo> quoteVo) throws Exception;
+    HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfo, PingAnQuoteVo<Map<String,Object>> quoteVo) throws Exception;
 
     /**
      * 提交影像

+ 373 - 77
src/main/java/com/ydtech/modules/order/service/impl/PingAnOrderApiServiceImpl.java

@@ -1,8 +1,11 @@
 package com.ydtech.modules.order.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.google.gson.Gson;
 import com.ydtech.config.properties.PingAnApiConfigurationProperties;
+import com.ydtech.constants.enums.InsurKind;
 import com.ydtech.constants.enums.dict.InsOrderStatusEnum;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
@@ -34,7 +37,6 @@ import com.ydtech.modules.order.entity.config.PingAnConfigureParameters;
 import com.ydtech.modules.order.entity.crawler.vo.CrawlerPolicyPrintVo;
 import com.ydtech.modules.order.entity.dto.InsUploadImagesDto;
 import com.ydtech.modules.order.entity.po.InsTaskImages;
-import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
 import com.ydtech.modules.order.entity.po.InsUploadFiles;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.InsDrivingIntentionInsuranceVo;
@@ -45,6 +47,7 @@ import com.ydtech.modules.order.entity.vo.pingan.PingAnQuoteVo;
 import com.ydtech.modules.order.entity.vo.pingan.RenewalConfirmVo;
 import com.ydtech.modules.order.entity.vo.pingan.StorefrontQueryVo;
 import com.ydtech.modules.order.service.*;
+import com.ydtech.modules.order.utils.MD5Util;
 import com.ydtech.modules.order.utils.PingAnUpLoadUtils;
 import com.ydtech.modules.protocol.entity.po.PtlAgreementAttribution;
 import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
@@ -198,8 +201,10 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
      * @Exception
      */
     @Override
-    public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfo, PingAnQuoteVo<InsDrivingIntentionInsuranceSonVo> quoteVo) throws Exception {
+    public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfo, PingAnQuoteVo<Map<String,Object>> quoteVo) throws Exception {
 
+        //验证参数
+        checkData(quoteVo);
         // 车型查询
         CarInfoVo carInfo = quoteInfo.getCarInfo();
         PinganApiLog pinganApiLog = new PinganApiLog(quoteVo.getOrderNo(),null,quoteVo.getAgreementId());
@@ -208,8 +213,6 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         // 通过 协议id获取配置实体
         PingAnConfigureParameters parameters = configureParametersComponents.toEntity(PingAnConfigureParameters.class,
                 ptlAgreementAttribution);
-
-
         try {
             // 1. 标的信息
             IndexRequest indexRequest = new IndexRequest(parameters, carInfo);
@@ -249,15 +252,15 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             }
             //4.报价  使用车辆确认返回的流程id
             pinganApiLog.setId(null);
-            QuoteRequest quoteRequest = new QuoteRequest(parameters, quoteInfo, model, carConfirmResponse.getFlowid(), quoteVo.getAccommodationFlag(), quoteVo.getApplyUnAuto(), quoteVo.getApplyXiaoWei(), quoteVo.getUnAutoListInfo(), quoteVo.getXiaoWeiListInfo(), quoteVo.getAmount22XNYChargingPostList(), quoteVo.getAmount23XNYChargingPostList());
+            QuoteRequest quoteRequest = new QuoteRequest(parameters, quoteInfo,carConfirmResponse.getFlowid(), quoteVo.getAccommodationFlag(), quoteVo.getAmount22XNYChargingPostList(), quoteVo.getAmount23XNYChargingPostList(),quoteVo.getAccidentalDrivingVo());
             //能源车 判断 赋值能源参数
             if("1,2,3,".contains(carInfo.getEnergyType())){
+                //新能源参数传递
                 quoteRequest = quoteRequest.transferPingAnRequestMsgNY(quoteInfo.getKindList(), quoteRequest,carConfirmResponse.getBizQuoteConfig());
             }else{
+                //客车、货车传递
                 quoteRequest = quoteRequest.transferPingAnRequestMsg(quoteInfo.getKindList(), quoteRequest,carConfirmResponse.getBizQuoteConfig());
             }
-
-            quoteRequest = quoteRequest.transYJPingAnRequestMsg(quoteVo.getAccidentalDrivingVo(), quoteRequest,"1");
             QuoteResponse quoteResponse = null;
             try {
                 quoteResponse = pinganRequestApiComponents.quote(quoteRequest,pinganApiLog);
@@ -266,7 +269,7 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             }
             if (quoteResponse != null && "0".equals(quoteResponse.getResultCode())) {
                 //5.组装返回的报价信息
-                return getQuoteRespVo(quoteResponse, quoteInfo, ptlAgreementAttribution, model,parameters.getUserId(),pinganApiLog,carConfirmResponse);
+                return getQuoteRespVo(quoteResponse, quoteInfo, ptlAgreementAttribution, model,parameters.getUserId(),pinganApiLog,carConfirmResponse,quoteVo);
             }else{
                 throw new SystemException(quoteResponse.getResultMessage());
             }
@@ -274,13 +277,42 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             throw new SystemException(e.getMessage());
         }
     }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/8/6 16:21
+     *  @Description:  验证参数是否正确
+     */
+    private static void checkData(PingAnQuoteVo<Map<String, Object>> quoteVo) {
+        String agreementId = quoteVo.getAgreementId();
+        if(StringUtils.isBlank(agreementId)){
+            throw new SystemException("未选择协议不能报价");
+        }
+        Map<String, Object> map = quoteVo.getAccidentalDrivingVo();
+        if(map!=null && map.get("2")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) map.get("2");
+            int  count =0;
+            if(linkedMap!=null && linkedMap.size()>0){
+                List<InsDrivingIntentionInsuranceSonVo> zhlist = (List<InsDrivingIntentionInsuranceSonVo>)linkedMap.get("2");
+                for(InsDrivingIntentionInsuranceSonVo zhVo : zhlist ){
+                    if("01".equals(zhVo.getCombineProductType())){
+                        count++;
+                    }
+                }
+            }
+            if(count==1){
+                throw new SystemException("组合险不能只选择不可单独销售的产品");
+            }
+        }
+    }
 
     public HttpResult<QuoteRespVo> getQuoteRespVo(QuoteResponse response,
                                                   BaseQuoteInfoVo yaQuoteInfoVo,
                                                   PtlAgreementAttribution ptlAgreementAttribution,
                                                   SearchPAVehicleListResponse.ModelsDto modelsDto,String userId,
                                                   PinganApiLog pinganApiLog,
-                                                  CarConfirmResponse carConfirmResponse
+                                                  CarConfirmResponse carConfirmResponse,
+                                                  PingAnQuoteVo<Map<String,Object>> quoteVo
     ) {
 
         PingAnQuoteRespVo quoteRespVo = new PingAnQuoteRespVo();
@@ -320,8 +352,6 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             syPremium = Double.parseDouble(bizQuoteResult.getPremiumTotal() == null ? "0" : bizQuoteResult.getPremiumTotal());
             //商业险保费
             quoteRespVo.setSyPremium(syPremium);
-            //商业险保单号
-            quoteRespVo.setSyApplyNo(bizQuoteResult.getQueryRequestCode());
             QuoteResponse.QuoteDTO bizQuote = response.getBizQuote();
             // 交强
             quoteRespVo.setStartDateJq(forceQuote.getBeginDate());
@@ -330,19 +360,20 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             quoteRespVo.setStartDateSy(bizQuote.getBeginDate());
             quoteRespVo.setEndDateSy(bizQuote.getEndDate());
             // 商业险险种
-            List<QuoteResponse.ClauseCaseListDTO> clauseCaseList = bizQuoteResult.getClauseCaseList();
+            List<KindInfoVo> kindList = yaQuoteInfoVo.getKindList();
             QuoteKindRespVo kind;
-            if(clauseCaseList!=null && clauseCaseList.size()>0){
-                for (QuoteResponse.ClauseCaseListDTO clauseCaseListDTO : clauseCaseList) {
+            if(kindList!=null && kindList.size()>0){
+                for (KindInfoVo kindInfoVo : kindList) {
                     kind = new QuoteKindRespVo();
-                    kind.setKindCode(clauseCaseListDTO.getProductCode());
-                    kind.setKindName(clauseCaseListDTO.getProductName());
-                    double amount = Double.parseDouble(clauseCaseListDTO.getAmount() == null ? "0" : clauseCaseListDTO.getAmount());
-                    kind.setAmount(amount);
-                    double count = Double.parseDouble(clauseCaseListDTO.getCount() == null ? "0" : clauseCaseListDTO.getCount());
-                    kind.setUnitAmount(count);
-                    //保费
-                    kind.setCoveragePremium(amount * count);
+                    kind.setKindCode(kindInfoVo.getKindCode());
+                    kind.setKindName(kindInfoVo.getKindName());
+                    kind.setAmount(kindInfoVo.getAmount());
+                    kind.setCoveragePremium(getPremium(bizQuoteResult,xnyFlag,kindInfoVo.getKindCode()));
+                    kind.setUnitAmount(kindInfoVo.getUnitAmount());
+                    kind.setServiceTimes(String.valueOf(kindInfoVo.getServiceTimes()));
+                    if (!ObjectUtils.isEmpty(kindInfoVo.getDeductibleRate())) {
+                        kind.setDeductibleRate(Double.parseDouble(kindInfoVo.getDeductibleRate()));
+                    }
                     kindList1.add(kind);
                 }
             }
@@ -352,6 +383,15 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         QuoteResponse.AhsUpcActualPremiumDTO ahsUpcActualPremium = response.getAhsUpcActualPremium();
         // 小微险保费
         QuoteResponse.XwActualPremiumDTO xwActualPremium = response.getXwActualPremium();
+        double zhAmount=0;
+        //组合险保费
+        QuoteResponse.CombinationPremiumDTO combinationPremium = response.getCombinationPremium();
+        if(combinationPremium!=null && combinationPremium.getPremiumList()!=null && combinationPremium.getPremiumList().size()>0){
+            List<QuoteResponse.CombinationPremiumDetaillDTO> premiumList = combinationPremium.getPremiumList();
+            for(QuoteResponse.CombinationPremiumDetaillDTO vo :premiumList){
+                zhAmount+=StringUtils.isBlank(vo.getPremium())?0:Double.parseDouble(vo.getPremium());
+            }
+        }
         //小微险保费
         quoteRespVo.setAhsUpcActualPremium(ahsUpcActualPremium);
         quoteRespVo.setXwActualPremium(xwActualPremium);
@@ -362,11 +402,15 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             //   财意险总保费
             double ahsUpcTotalPremium = Double.parseDouble(ahsUpcActualPremium.getAhsUpcTotalPremium() == null ? "0" : ahsUpcActualPremium.getAhsUpcTotalPremium());;
             jyPremium += ahsUpcTotalPremium;
+            quoteRespVo.setCyPremium(ahsUpcTotalPremium);
         }
         if (!ObjectUtils.isEmpty(xwActualPremium)) {
             double xwPremium = Double.parseDouble(xwActualPremium.getXwPremium() == null ? "0" : xwActualPremium.getXwPremium());
             jyPremium += xwPremium;
+            quoteRespVo.setXwPremium(xwPremium);
         }
+        jyPremium += zhAmount;
+        quoteRespVo.setZhPremium(zhAmount);
         //  报价险种放入保费
         List<QuoteRiskRespVo> riskList1 = QuoteRiskRespVo.toQuoteRiskRespVoList(riskList, jqPremium, syPremium);
 
@@ -384,16 +428,182 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         quoteRespVo.setOrderno(yaQuoteInfoVo.getOrderNo());
         quoteRespVo.setCoreModels(modelsDto.toCoreModelsVo());
         String orderId = yaQuoteInfoVo.getOrderNo();
-        return responseOrder(response, quoteRespVo, ptlAgreementAttribution, orderId,userId,pinganApiLog,carConfirmResponse);
+        return responseOrder(response, quoteRespVo, ptlAgreementAttribution, orderId,userId,pinganApiLog,carConfirmResponse,quoteVo);
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/8/6 17:46
+     *  @Description:  赋值新能源、非新能源的商业险信息
+     */
+    private double getPremium(QuoteResponse.BizQuoteResultDTO bizQuoteResult, Boolean xnyFlag,String code) {
+        double val=0;
+        //机动车损失保险保费
+        if (InsurKind.A.getCode().equalsIgnoreCase(code)) {
+            //能源车
+            if(xnyFlag){
+                //premium01XNY	C	新能源汽车损失保险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium01XNY())?0:Double.parseDouble(bizQuoteResult.getPremium01XNY());
+            }else{
+                // premium01	C	机动车损失保险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium01())?0:Double.parseDouble(bizQuoteResult.getPremium01());
+            }
+        }
+        //三者险
+        if (InsurKind.B.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //premium02XNY	C	新能源汽车第三者责任保险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium02XNY())?0:Double.parseDouble(bizQuoteResult.getPremium02XNY());
+            }else{
+                // premium02	C	机动车第三者责任保险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium02())?0:Double.parseDouble(bizQuoteResult.getPremium02());
+            }
+        }
+        //乘客责任险
+        if (InsurKind.D4.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //premium03XNY	C	新能源汽车车上人员责任保险(司机)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium03XNY())?0:Double.parseDouble(bizQuoteResult.getPremium03XNY());
+            }else{
+                //premium04	C	机动车车上人员责任保险(司机)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium04())?0:Double.parseDouble(bizQuoteResult.getPremium04());
+            }
+        }
+        //司机责任险
+        if (InsurKind.D3.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                // premium04XNY	C单座保费*乘客座位数	新能源汽车车上人员责任保险(乘客)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium04XNY())?0:Double.parseDouble(bizQuoteResult.getPremium04XNY());
+            }else{
+                //premium05	C单座保费*乘客座位数	机动车车上人员责任保险(乘客)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium05())?0:Double.parseDouble(bizQuoteResult.getPremium05());
+            }
+        }
+        //  客车  premium06	C      * 	附加车上货物责任险保费   能源无
+        //  附加医保外用药责任险(第三者责任保险)
+        if (InsurKind.SY_FJ_YBW1.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //  premium18XNY	C	附加医保外用药责任险保额(三者)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium18XNY())?0:Double.parseDouble(bizQuoteResult.getPremium18XNY());
+            }else{
+                // premium07	C	附加医保外用药责任险保费(三者)
+                val = StringUtils.isBlank(bizQuoteResult.getPremium07())?0:Double.parseDouble(bizQuoteResult.getPremium07());
+            }
+        }
+        // 附加医保外用药责任险(车上人员责任保险(乘客))
+        if (InsurKind.SY_FJ_YBW2.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //  premium19XNY	C	附加医保外用药责任险保额(司机)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium19XNY())?0:Double.parseDouble(bizQuoteResult.getPremium19XNY());
+            }else{
+                // premium08	C	附加医保外用药责任险保费(司机)
+                val = StringUtils.isBlank(bizQuoteResult.getPremium08())?0:Double.parseDouble(bizQuoteResult.getPremium08());
+            }
+        }
+        // 附加医保外用药责任险(车上人员责任保险(司机))
+        if (InsurKind.SY_FJ_YBW3.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //   premium20XNY	C	附加医保外用药责任险保额(乘客)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium20XNY())?0:Double.parseDouble(bizQuoteResult.getPremium20XNY());
+            }else{
+                // premium09	C	附加医保外用药责任险保费(乘客)
+                val = StringUtils.isBlank(bizQuoteResult.getPremium09())?0:Double.parseDouble(bizQuoteResult.getPremium09());
+            }
+        }
+        // 附加绝对免赔率特约条款(车损)
+        if (InsurKind.MJ1.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                // premium05XNY	C     * 	附加绝对免赔率特约险(车损)保费   能源车
+                val = StringUtils.isBlank(bizQuoteResult.getPremium05XNY())?0:Double.parseDouble(bizQuoteResult.getPremium05XNY());
+            }else{
+                //premium53	C	附加绝对免赔率特约险(车损)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium53())?0:Double.parseDouble(bizQuoteResult.getPremium53());
+            }
+        }
+        // 附加绝对免赔率特约条款(机动车第三者责任保险)
+        if (InsurKind.MJ2.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //   premium06XNY	C	附加绝对免赔率特约险(三者)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium06XNY())?0:Double.parseDouble(bizQuoteResult.getPremium06XNY());
+            }else{
+                // premium54	C	附加绝对免赔率特约险(三者)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium54())?0:Double.parseDouble(bizQuoteResult.getPremium54());
+            }
+        }
+        // 附加绝对免赔率特约条款(机动车车上人员责任保险(司机))
+        if (InsurKind.MJ3.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //  //premium07XNY	C	附加绝对免赔率特约险(车上人员司机)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium07XNY())?0:Double.parseDouble(bizQuoteResult.getPremium07XNY());
+            }else{
+                //premium55	C	附加绝对免赔率特约险(车上人员司机)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium55())?0:Double.parseDouble(bizQuoteResult.getPremium55());
+            }
+        }
+
+
+        // 附加绝对免赔率特约条款(机动车车上人员责任保险(乘客))
+        if (InsurKind.MJ4.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //   premium08XNY	C	附加绝对免赔率特约险(车上人员乘客)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium08XNY())?0:Double.parseDouble(bizQuoteResult.getPremium08XNY());
+            }else{
+                // * premium56	C	附加绝对免赔率特约险(车上人员乘客)保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium56())?0:Double.parseDouble(bizQuoteResult.getPremium56());
+            }
+        }
+        //附加修理期间费用补偿险  premium10	C	附加修理期间费用补偿险保费   非能源  无
+        // premium09XNY	C	附加车轮单独损失险保费   能源车  无
+        // premium10XNY	C	附加新增加设备损失险保费    能源车  无
+        //  premium11	C	附加新增加设备损失险保费    非能源  无
+        // 附加新增加设备损失险   暂时没有
+        //附加车身划痕损失险
+        if (InsurKind.L.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //premium11XNY	C	附加车身划痕损失险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium11XNY())?0:Double.parseDouble(bizQuoteResult.getPremium11XNY());
+            }else{
+                //premium17	C	附加车身划痕损失险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium17())?0:Double.parseDouble(bizQuoteResult.getPremium17());
+            }
+        }
+        //附加法定节假日限额翻倍险
+        if (InsurKind.BD.getCode().equalsIgnoreCase(code)) {
+            if(xnyFlag){
+                //        * premium17XNY	C	附加法定节假日限额翻倍险保费
+                val = StringUtils.isBlank(bizQuoteResult.getPremium17XNY())?0:Double.parseDouble(bizQuoteResult.getPremium17XNY());
+            }else{
+                //premium74	C	附加法定节假日限额翻倍险保费    能源无
+                val = StringUtils.isBlank(bizQuoteResult.getPremium74())?0:Double.parseDouble(bizQuoteResult.getPremium74());
+            }
+        }
+        //premium32	C	附加精神损害抚慰金责任险(三者)保费    能源无
+        //premium30	C	附加精神损害抚慰金责任险(司机)保费      能源无
+        //         * premium31	C	附加精神损害抚慰金责任险(乘客)保费   能源无
+        //         * premium52	C	附加车轮单独损失险保费      能源无
+        //         * premium73	C	机动车钥匙丢失或损坏费用补偿险保费   能源无
+        //         *
+        //         * premium75	C	附加发动机损坏除外特约条款保费    能源无
+        // premium12XNY	C	附加修理期间费用补偿险保费    新能源  无
+        //premium13XNY	C	附加车上货物责任险保费
+        // * premium14XNY	C	附加精神损害抚慰金责任险(三者保费
+        // * premium15XNY	C	附加精神损害抚慰金责任险(司机保费
+        //* premium16XNY	C	附加精神损害抚慰金责任险(乘客保费
+        //* premium21XNY	C	附加外部电网故障损失险保费
+        //  * premium22XNY	C	附加自用充电桩损失保险保费
+        // * premium23XNY	C	附加自用充电桩责任保险保费
+        return val;
     }
 
     public HttpResult<QuoteRespVo> responseOrder(QuoteResponse response,
-                                                 QuoteRespVo quoteRespVo,
+                                                 PingAnQuoteRespVo quoteRespVo,
                                                  PtlAgreementAttribution ptlAgreementAttribution,
                                                  String orderId,
                                                  String userId,
                                                  PinganApiLog pinganApiLog,
-                                                 CarConfirmResponse carConfirmResponse
+                                                 CarConfirmResponse carConfirmResponse,
+                                                 PingAnQuoteVo<Map<String,Object>> quoteVo
+
     ) {
         // 保存订单信息
         InsAreaCompany insAreaCompany = new InsAreaCompany(quoteRespVo, ptlAgreementAttribution);
@@ -402,14 +612,68 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         insAreaCompany.setReptxt(JSON.parseObject(JSON.toJSONString(response)));
         insAreaCompany.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode());
         insAreaCompany.setInsOrderNo(flowid);
-        Map<String, Object> map = new HashMap<>();
-        QuoteResponse.AhsUpcActualPremiumDTO ahsUpcActualPremium = response.getAhsUpcActualPremium();
-        // 小微险保费
-        QuoteResponse.XwActualPremiumDTO xwActualPremium = response.getXwActualPremium();
-        map.put("xwActualPremium", xwActualPremium);
-        map.put("ahsUpcActualPremium", ahsUpcActualPremium);
+
+        Map<String, Object> map = quoteVo.getAccidentalDrivingVo();
+        List<QuoteRequest.UnAutoListInfoDTO>  unAutoListInfoList=new ArrayList<>();
+        List<QuoteRequest.UnAutoListInfoDTO>  xiaoWeiListInfoList=new ArrayList<>();
+        List<QuoteRequest.CombinationInfoDTO>  combinationInfoList=new ArrayList<>();
+        if(map!=null && map.get("0")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) map.get("0");
+            if(linkedMap!=null && linkedMap.size()>0){
+                InsDrivingIntentionInsuranceSonVo vo = BeanUtil.mapToBean(linkedMap, InsDrivingIntentionInsuranceSonVo.class, true);
+                QuoteRequest.UnAutoListInfoDTO unAutoListInfoDTO =new QuoteRequest.UnAutoListInfoDTO(vo.getProductCode(),vo.getCode(),vo.getQuantity());
+                unAutoListInfoList.add(unAutoListInfoDTO);
+            }
+        }
+
+        if(map!=null && map.get("1")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) map.get("1");
+            if(linkedMap!=null && linkedMap.size()>0){
+                InsDrivingIntentionInsuranceSonVo vo = BeanUtil.mapToBean(linkedMap, InsDrivingIntentionInsuranceSonVo.class, true);
+                QuoteRequest.UnAutoListInfoDTO unAutoListInfoDTO =new QuoteRequest.UnAutoListInfoDTO(vo.getProductCode(),vo.getCode(),vo.getQuantity());
+                unAutoListInfoList.add(unAutoListInfoDTO);
+            }
+        }
+        if(map!=null && map.get("2")!=null ){
+            LinkedHashMap<String,Object> linkedMap = (LinkedHashMap<String,Object>) map.get("2");
+            if(linkedMap!=null && linkedMap.size()>0){
+                List<InsDrivingIntentionInsuranceSonVo> zhlist = (List<InsDrivingIntentionInsuranceSonVo>)linkedMap.get("2");
+                for(InsDrivingIntentionInsuranceSonVo zhVo : zhlist ){
+                    QuoteRequest.CombinationInfoDTO combinationInfo =new QuoteRequest.CombinationInfoDTO(zhVo.getProductCode(),zhVo.getCode(),zhVo.getQuantity(),zhVo.getCombineProductType());
+                    combinationInfoList.add(combinationInfo);
+                }
+            }
+        }
         //赋值驾意险信息
-        //insAreaCompany.setPingAnAccidentInfo(JSON.parseObject(JSON.toJSONString(map)));
+        Map<String,Object> jyMap=new HashMap<>();
+        Map<String,Object> xwMap=new HashMap<>();
+        Map<String,Object> zhMap=new HashMap<>();
+        if(unAutoListInfoList!=null && unAutoListInfoList.size()>0){
+            jyMap.put("sumAmount",quoteRespVo.getCyPremium());
+            jyMap.put("list",unAutoListInfoList);
+        }
+        if(xiaoWeiListInfoList!=null && xiaoWeiListInfoList.size()>0){
+            xwMap.put("sumAmount",quoteRespVo.getXwPremium());
+            xwMap.put("list",xiaoWeiListInfoList);
+        }
+        if(combinationInfoList!=null && combinationInfoList.size()>0){
+            zhMap.put("sumAmount",quoteRespVo.getZhPremium());
+            zhMap.put("list",combinationInfoList);
+        }
+
+        List<Map<String,Object>>  list=new ArrayList<Map<String,Object>>();
+        if(jyMap!=null && jyMap.size()>0){
+            list.add(jyMap);
+        }
+        if(xwMap!=null && xwMap.size()>0){
+            list.add(xwMap);
+        }
+        if(zhMap!=null && zhMap.size()>0){
+            list.add(zhMap);
+        }
+        if(list!=null && list.size()>0){
+            insAreaCompany.setAccidentInfo(JSON.parseArray(JSON.toJSONString(list)));
+        }
         // 车船税
         QuoteResponse.ForceQuoteResultDTO.TaxDTO tax = response.getForceQuoteResult().getTax();
         TaxArrears taxArrears = new TaxArrears("往年欠税", Double.parseDouble(tax.getLastYearPay()),
@@ -456,8 +720,8 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         //图片
         List<InsUploadImagesDto> imgList = insTaskImagesMapper.getByOrderNoInsUploadImagesDtoList(insAreaCompany.getOrderno());
 
-       // List<InsTaskImagesBase64> insTaskImagesBase64s = insTaskImagesService.findByOrderNo(insOrders.getOrderno(),
-       //         insAreaCompany.getId(), true);
+        // List<InsTaskImagesBase64> insTaskImagesBase64s = insTaskImagesService.findByOrderNo(insOrders.getOrderno(),
+        //         insAreaCompany.getId(), true);
         if (imgList.isEmpty()) {
             return HttpResult.error("影像集合为空");
         } else {
@@ -483,7 +747,7 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
                 String documentFormat = fileName.split("\\.")[1];
                 boolean upLoadFileFlag = PingAnUpLoadUtils.getUpLoadFile(properties.getHost(), properties.getBucket(), properties.getAk(), properties.getSk(), file, key);
                 if(!upLoadFileFlag){
-                    throw new SystemException("上传影像文件失败");
+                    // throw new SystemException("上传影像文件失败");
                 }
                 UploadFilesRequest.DocListDTO docListDTO = new UploadFilesRequest.DocListDTO(key, documentClass, documentType, documentName,documentFormat ,
                         null, insAreaCompany.getJqapplyno(),null, parameters.getUserId(), "openApi");
@@ -750,8 +1014,8 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         PingAnConfigureParameters parameters = configureParametersComponents.toEntity(PingAnConfigureParameters.class,
                 ptlAgreementAttribution);
         List<String> list=new ArrayList<>();
-        String bizApplyNo = insAreaCompany.getJqpolicyno();
-        String forceApplyNo = insAreaCompany.getSypolicyno();
+        String bizApplyNo = insAreaCompany.getSyapplyno();
+        String forceApplyNo = insAreaCompany.getJqapplyno();
         if (StringUtils.isNotBlank(bizApplyNo)) {
             list.add(bizApplyNo);
         }
@@ -1082,16 +1346,18 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
                 } else if (("单商".equals(insAreaCompany.getProduct()) || "单三".equals(insAreaCompany.getProduct())) && sqflag) {
                     insAreaCompany.setSypolicyno(sypolicyno);
                 }
-                if(OrderStatusCodeEnum.ORDER_STATUS_CODE_B2.getCode().equals(status)){
+                String orderstatus = insAreaCompany.getOrderstatus();
+                if(OrderStatusCodeEnum.ORDER_STATUS_CODE_B2.getCode().equals(status)  && ("0".equals(orderstatus) || "1".equals(orderstatus))  ){
                     //已核保待缴费
                     insAreaCompany.setOrderstatus(InsOrderStatusEnum.WAIT_PAY.getCode());
-                }else if(OrderStatusCodeEnum.ORDER_STATUS_CODE_B5.getCode().equals(status)){
+                }else if(OrderStatusCodeEnum.ORDER_STATUS_CODE_B5.getCode().equals(status) && ("0".equals(orderstatus) || "1".equals(orderstatus) || "2".equals(orderstatus))  ){
                     //说明核保成功,更新大订单和小订单的状态为3  更新为已承保
                     if(StringUtils.isNotBlank(noticeNo)){
                         insAreaCompany.setNoticeNo(noticeNo);
                     }
                     insAreaCompany.setOrderstatus(InsOrderStatusEnum.ACCEPT_INSURANCE.getCode());
                 }
+
                 insAreaCompanyService.updateCompanyAndOrders(insAreaCompany);
                 return HttpResult.ok("更新状态成功");
 
@@ -1270,7 +1536,7 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         } catch (Exception e) {
             throw new SystemException(e.getMessage());
         }
-        if (recoverApplyVerifyCodeResponse != null && "0".equals(recoverApplyVerifyCodeResponse.getResultCode())) {
+        if (recoverApplyVerifyCodeResponse != null && "0".equals(recoverApplyVerifyCodeResponse.getResultCode())  || (recoverApplyVerifyCodeResponse != null  && recoverApplyVerifyCodeResponse.getResultMessage().contains("已成功采集验证码"))) {
             return createNotice(companyId);
         }else{
             throw new SystemException(recoverApplyVerifyCodeResponse.getResultMessage());
@@ -1290,51 +1556,74 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         // 通过 协议id获取配置实体
         PingAnConfigureParameters parameters = configureParametersComponents.toEntity(PingAnConfigureParameters.class,
                 ptlAgreementAttribution);
-        String forceApplyNo= insAreaCompany.getJqapplyno();
-        String  bizApplyNo = insAreaCompany.getSyapplyno();
         //生成通知单号
         ArrayList<String>  noticelist =new ArrayList<String>();
+        String bizApplyNo = insAreaCompany.getSyapplyno();
+        String forceApplyNo = insAreaCompany.getJqapplyno();
         if (StringUtils.isNotBlank(bizApplyNo)) {
             noticelist.add(bizApplyNo);
         }
         if (StringUtils.isNotBlank(forceApplyNo)) {
             noticelist.add(forceApplyNo);
         }
-        //生成通知单号
-        NoticeDoRequest noticeDoRequest = new NoticeDoRequest(parameters.getUserId(), noticelist);
-        NoticeDoResponse noticeDoResponse = null;
+        String noticeNo="";
         PinganApiLog pinganApiLog = new PinganApiLog(insAreaCompany.getOrderno(),companyId,insAreaCompany.getAgreementId());
-        try {
-            noticeDoResponse = pinganRequestApiComponents.createNoticeNo(noticeDoRequest,pinganApiLog);
-        } catch (Exception e) {
-            throw new SystemException(e.getMessage());
-        }
-        String noticeNo = noticeDoResponse.getNoticeNo();
-        ScanCodeURLRequest.DocumentDTO  noticeNoeDto=new  ScanCodeURLRequest.DocumentDTO(noticeNo,"07");
-        ArrayList<ScanCodeURLRequest.DocumentDTO>  scancodelist =new ArrayList<ScanCodeURLRequest.DocumentDTO>();
-        if (StringUtils.isNotBlank(noticeNo)) {
-            scancodelist.add(noticeNoeDto);
+        if(StringUtils.isNotBlank(insAreaCompany.getNoticeNo())){
+            noticeNo = insAreaCompany.getNoticeNo();
+        }else{
+            //生成通知单号
+            NoticeDoRequest noticeDoRequest = new NoticeDoRequest(parameters.getUserId(), noticelist);
+            NoticeDoResponse noticeDoResponse = null;
+            try {
+                noticeDoResponse = pinganRequestApiComponents.createNoticeNo(noticeDoRequest,pinganApiLog);
+            } catch (Exception e) {
+                throw new SystemException(e.getMessage());
+            }
+            noticeNo = noticeDoResponse.getNoticeNo();
         }
+
         // 获取支付的链接 只支持通知单号类型07    单证类型(01投保单02保单03批改申请单04批单05赔案号06报案号07通知单号)
         pinganApiLog.setId(null);
-        ScanCodeURLRequest scanCodeURLRequest = new ScanCodeURLRequest(scancodelist, "68",parameters.getUserId());
-        ScanCodeURLResponse scanCodeURLResponse = null;
+        ChexianStandardPrePaymentResponse chexianStandardPrePaymentResponse = null;
+        long currentTimeMillis = System.currentTimeMillis();
+        // 转换为秒,并去掉前10位(即 Tue Aug 20 18:26:39 GMT+08:00 2019 对应的秒数)
+        long seconds = currentTimeMillis / 1000L;
+        // 保留后13位
+        long l = seconds % 1000000000000L;
+        String tradeNo=properties.getClientId()+l ;
+        String clientId=properties.getClientId();
+        String mingwen=clientId +noticeNo+"CNY" +insAreaCompany.getSumpremium();
+        String signMsg = MD5Util.sha256Hex(mingwen);
+
+        ChexianStandardPrePaymentRequest  chexianStandardPrePaymentRequest =new ChexianStandardPrePaymentRequest(insAreaCompany.getSumpremium().toString(),null,null,noticeNo,null,null,tradeNo,signMsg,clientId,"CNY", properties.getClientId()+"车险保费",null);
         try {
-            scanCodeURLResponse = pinganRequestApiComponents.getScanCodeURL(scanCodeURLRequest,pinganApiLog);
+            chexianStandardPrePaymentResponse = pinganRequestApiComponents.chexianStandardPrePayment(chexianStandardPrePaymentRequest,pinganApiLog);
         } catch (Exception e) {
             throw new SystemException(e.getMessage());
         }
-        String payUrl = "";
-        //成功将支付的url链接赋值
-        if (scanCodeURLResponse != null && ScanCodeURLResponseCodeEnum.SCAN_CODE_URL_CODE_MSG_Y.getCode().equals(scanCodeURLResponse.getResultCode())) {
-            payUrl = scanCodeURLResponse.getScanCodeURLList().get(0).getScanCodeURL();
-        } else {
-            return HttpResult.error("二维码支付接口报错");
-        }
-        insAreaCompany.setPaymentLink(payUrl);
-        return HttpResult.ok(payUrl);
+        return HttpResult.ok(chexianStandardPrePaymentResponse.getPayUrl());
     }
     /**
+     *
+     *  ScanCodeURLRequest scanCodeURLRequest = new ScanCodeURLRequest(scancodelist, "68",parameters.getUserId());
+     *         ScanCodeURLResponse scanCodeURLResponse = null;
+     *         try {
+     *             scanCodeURLResponse = pinganRequestApiComponents.getScanCodeURL(scanCodeURLRequest,pinganApiLog);
+     *         } catch (Exception e) {
+     *             throw new SystemException(e.getMessage());
+     *         }
+     *         String payUrl = "";
+     *         //成功将支付的url链接赋值
+     *         if (scanCodeURLResponse != null && ScanCodeURLResponseCodeEnum.SCAN_CODE_URL_CODE_MSG_Y.getCode().equals(scanCodeURLResponse.getResultCode())) {
+     *             payUrl = scanCodeURLResponse.getScanCodeURLList().get(0).getScanCodeURL();
+     *         } else {
+     *             return HttpResult.error("二维码支付接口报错");
+     *         }
+     *         insAreaCompany.setPaymentLink(payUrl);
+     *
+     * /
+
+     /**
      *  @version
      *  @author: hxl
      *  @Date: 2024/7/22 18:57
@@ -1349,10 +1638,10 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
         PingAnConfigureParameters parameters = configureParametersComponents.toEntity(PingAnConfigureParameters.class,
                 ptlAgreementAttribution);
         PinganApiLog pinganApiLog = new PinganApiLog(insAreaCompany.getOrderno(),companyId,insAreaCompany.getAgreementId());
-        String bizApplyNo = insAreaCompany.getJqpolicyno();
-        String forceApplyNo = insAreaCompany.getSypolicyno();
         //生成通知单号
         ArrayList<String>  noticelist =new ArrayList<String>();
+        String bizApplyNo = insAreaCompany.getSyapplyno();
+        String forceApplyNo = insAreaCompany.getJqapplyno();
         if (StringUtils.isNotBlank(bizApplyNo)) {
             noticelist.add(bizApplyNo);
         }
@@ -1564,8 +1853,8 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             pinganApiLog.setId(null);
             pinganApiLog.setRequestUrl("/payReturn");
             pinganApiLog.setRequestType("支付回调");
-            pinganApiLog.setRequestParam(payReturnRequest.toString());
-            pinganApiLog.setResponseBody(null);
+            pinganApiLog.setRequestParam(new Gson().toJson(payReturnRequest));
+            pinganApiLog.setResponseBody(payReturnRequest.getResultMsg()+"-"+payReturnRequest.getErrorMsg());
             pinganApiLogService.save(pinganApiLog);
             // 账号信息
             PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(insAreaCompany.getAgreementId());
@@ -1573,8 +1862,8 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
             PingAnConfigureParameters parameters = configureParametersComponents.toEntity(PingAnConfigureParameters.class,
                     ptlAgreementAttribution);
             List<String> list = new ArrayList<>();
-            String bizApplyNo = insAreaCompany.getJqpolicyno();
-            String forceApplyNo = insAreaCompany.getSypolicyno();
+            String bizApplyNo = insAreaCompany.getSyapplyno();
+            String forceApplyNo = insAreaCompany.getJqapplyno();
             if (StringUtils.isNotBlank(bizApplyNo)) {
                 list.add(bizApplyNo);
             }
@@ -1595,22 +1884,29 @@ public class PingAnOrderApiServiceImpl implements PingAnOrderApiService {
                     String status = "";
                     if (documentList != null && documentList.size() > 0) {
                         Boolean flag = false;
-                        //B2 为 未缴费
                         for (DocumentStatusListResponse.DocumentDTO dto : documentList) {
                             status = dto.getStatus();
-                            if (!OrderStatusCodeEnum.ORDER_STATUS_CODE_B5.getCode().equals(dto.getStatus())) {
+                            if (OrderStatusCodeEnum.ORDER_STATUS_CODE_B5.getCode().equals(dto.getStatus())) {
                                 flag = false;
                             }
                         }
                         //已承保更新承保状态
-                        if (!flag && OrderStatusCodeEnum.ORDER_STATUS_CODE_B5.getCode().equals(status)) {
+                        if (OrderStatusCodeEnum.ORDER_STATUS_CODE_B5.getCode().equals(status)) {
                             insAreaCompany.setOrderstatus(InsOrderStatusEnum.ACCEPT_INSURANCE.getCode());
                             insAreaCompanyService.updateCompanyAndOrders(insAreaCompany);
-                            return HttpResult.ok("承保成功");
+                            return HttpResult.ok("支付成功");
                         }
                     }
                 }
             }
+        }else{
+            PinganApiLog pinganApiLog = new PinganApiLog(null,null,null);
+            pinganApiLog.setId(null);
+            pinganApiLog.setRequestUrl("/payReturn");
+            pinganApiLog.setRequestType("支付回调");
+            pinganApiLog.setRequestParam(new Gson().toJson(payReturnRequest));
+            pinganApiLog.setResponseBody(payReturnRequest.getResultMsg()+"-"+payReturnRequest.getErrorMsg());
+            pinganApiLogService.save(pinganApiLog);
         }
         return HttpResult.error("支付失败");
     }

+ 131 - 0
src/main/java/com/ydtech/modules/order/utils/MD5Util.java

@@ -0,0 +1,131 @@
+package com.ydtech.modules.order.utils;
+
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class MD5Util {
+
+    private static final String HEX_CHARS = "0123456789abcdef";
+    private MD5Util() {}
+
+   /**
+     * 返回 MessageDigest MD5
+     */
+   private static MessageDigest getDigest() {
+	   try {
+           return MessageDigest.getInstance("MD5");
+       } catch (NoSuchAlgorithmException e) {
+           throw new RuntimeException(e);
+       }
+    }
+   
+   /**
+    * 返回 MessageDigest MD5
+    */
+  private static MessageDigest getDigestBySha() {
+	   try {
+          return MessageDigest.getInstance("SHA-256");
+      } catch (NoSuchAlgorithmException e) {
+          throw new RuntimeException(e);
+      }
+   }
+
+    /**
+     * MD5加密,并返回作为一个十六进制字节
+     */
+    public static byte[] md5(byte[] data) {
+        return getDigest().digest(data);
+    }
+
+    /**
+     * SHA-256加密,并返回作为一个十六进制字节
+     */
+    public static byte[] sha256(byte[] data) {
+        return getDigestBySha().digest(data);
+    }
+
+    /**
+     * MD5加密,并返回作为一个十六进制字节
+     * <code>byte[]</code>.
+     * 
+     * @param data
+     *            Data to digest
+     * @return MD5 digest
+     */
+    public static byte[] md5(String data) {
+    	byte[] bytes = null;
+        try {
+        	bytes = md5(data.getBytes("UTF-8"));
+		} catch (UnsupportedEncodingException e) {
+			//LogUtil.error("MD5加密出错。",e);
+		}
+		return bytes;
+    }
+
+    /**
+     * MD5加密,并返回一个32字符的十六进制值
+     */
+    public static String md5Hex(byte[] data) {
+        return toHexString(md5(data));
+    }
+
+    /**
+     * MD5加密,并返回一个32字符的十六进制值
+     */
+    public static String md5Hex(String data) {
+        return toHexString(md5(data));
+    }
+    /**
+     * SHA256加密
+     */
+    public static String sha256Hex(String data) {
+        try {
+			return toHexString(sha256(data.getBytes("UTF-8")));
+		} catch (UnsupportedEncodingException e) {
+			//LogUtil.error("MD5加密出错。",e);
+			return null;
+		}
+    }
+    
+    private static String toHexString(byte[] b) {
+        StringBuffer stringbuffer = new StringBuffer();
+        for (int i = 0; i < b.length; i++) {
+        	stringbuffer.append(HEX_CHARS.charAt(b[i] >>> 4 & 0x0F));
+        	stringbuffer.append(HEX_CHARS.charAt(b[i] & 0x0F));
+        }
+        return stringbuffer.toString();
+    }
+
+	/**
+	 * MD5加密
+	 * @param s
+	 * @return
+	 */
+	public static String MD5(String s) {
+		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };
+		try {
+			byte[] btInput = s.getBytes("UTF-8");
+			// 获得MD5摘要算法的 MessageDigest 对象
+			MessageDigest mdInst = MessageDigest.getInstance("MD5");
+			// 使用指定的字节更新摘要
+			mdInst.update(btInput);
+			// 获得密文
+			byte[] md = mdInst.digest();
+			// 把密文转换成十六进制的字符串形式
+			int j = md.length;
+			char str[] = new char[j * 2];
+			int k = 0;
+			for (int i = 0; i < j; i++) {
+				byte byte0 = md[i];
+				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+				str[k++] = hexDigits[byte0 & 0xf];
+			}
+			return new String(str);
+		} catch (Exception e) {
+			
+			return null;
+		}
+	}
+}