package com.ydtech.modules.fnc.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ydtech.core.page.HttpResult;
import com.ydtech.modules.admin.model.po.SysAmountAuditingEntity;
import com.ydtech.modules.admin.model.po.SysUserAccountHistory;
import com.ydtech.modules.fnc.entity.InsPlyIncome;
import com.ydtech.modules.fnc.dao.InsPlyIncomeMapper;
import com.ydtech.modules.fnc.entity.SettlementDocumentaryLogEntity;
import com.ydtech.modules.fnc.service.InsPlyIncomeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ydtech.modules.fnc.service.SettlementDocumentaryFeesService;
import com.ydtech.modules.fnc.service.SettlementDocumentaryLogService;
import com.ydtech.modules.fnc.vo.InsPlyIncomeVo;
import com.ydtech.modules.fnc.vo.SettlementDocumentaryFeesVo;
import com.ydtech.modules.order.entity.BasePageResult;
import com.ydtech.modules.order.entity.InsAreaCompany;
import com.ydtech.modules.order.entity.InsOrders;
import com.ydtech.modules.order.service.InsAreaCompanyService;
import com.ydtech.modules.order.service.InsOrdersService;
import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
*
* 保司结算手续费 服务实现类
*
*
* @author gws
* @since 2024-01-05
*/
@Service
public class InsPlyIncomeServiceImpl extends ServiceImpl implements InsPlyIncomeService {
@Autowired
private InsOrdersService insOrdersService;
@Autowired
private InsAreaCompanyService insAreaCompanyService;
@Autowired
private InsFeeOrderNewService insFeeOrderNewService;
@Autowired
private SettlementDocumentaryFeesService settlementDocumentaryFeesService;
@Autowired
private SettlementDocumentaryLogService settlementDocumentaryLogService;
public HttpResult> queryplyIncome(InsPlyIncomeVo insPlyIncomeVo){
try{
Page page = new Page<>(insPlyIncomeVo.getPageNum(), insPlyIncomeVo.getPageSize());
PageInfo> pageHelper = null;
PageHelper.startPage(insPlyIncomeVo.getPageNum(),insPlyIncomeVo.getPageSize());
List list= this.baseMapper.selectByCondition(insPlyIncomeVo);
pageHelper=new PageInfo(list);
BasePageResult pageResult=new BasePageResult(insPlyIncomeVo.getPageNum(), insPlyIncomeVo.getPageSize(), pageHelper.getTotal(), pageHelper.getPages(), list);
return HttpResult.ok(pageResult);
}catch (Exception e){
e.printStackTrace();
return HttpResult.error("查询异常");
}
}
@Override
public void saveBalance(String companyId, String orderno) {
InsOrders insOrders = insOrdersService.getById(orderno);
InsAreaCompany insAreaCompany = insAreaCompanyService.getById(companyId);
InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getInsFeeOrderNewByCompanyId(companyId);
this.saveBalanc(insFeeOrderNew, insOrders, insAreaCompany);
}
private void saveBalanc(InsFeeOrderNew insFeeOrderNew, InsOrders insOrders, InsAreaCompany insAreaCompany) {
InsPlyIncome insPlyIncome = new InsPlyIncome();
insPlyIncome.setOrderno(insFeeOrderNew.getId()); // 子订单号
// 存储保单号
try {
this.setPolicyno(insPlyIncome,insAreaCompany);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
insPlyIncome.setDeptId(insFeeOrderNew.getDeptId());
insPlyIncome.setRiskcode(insOrders.getProductid());
insPlyIncome.setPayDate(insAreaCompany.getPayDate());
insPlyIncome.setSignDate(insAreaCompany.getSigningTime());
insPlyIncome.setCompanyId(insAreaCompany.getCompanyId());
insPlyIncome.setAgreementId(insFeeOrderNew.getAgreementId());
insPlyIncome.setLicenseno(insOrders.getLicenseno());
insPlyIncome.setTaxamount(insAreaCompany.getTaxamount());
BigDecimal bigDecimal = this.sumAmount(insFeeOrderNew.getJqNoTaxPremium(), insFeeOrderNew.getSyNoTaxPremium(), insFeeOrderNew.getNoNoTaxPremium());
// 不含保费
insPlyIncome.setNoTaxPremium(bigDecimal);
// 手续费比例
BigDecimal CostsProportion = this.sumAmount(insFeeOrderNew.getJqSuperviseCostsProportion(), insFeeOrderNew.getSySuperviseCostsProportion(), insFeeOrderNew.getNoSuperviseCostsProportion());
insPlyIncome.setCommissionFeerate(CostsProportion);
// 其他费用比例
BigDecimal OtherCostsProportion = this.sumAmount(insFeeOrderNew.getJqOtherCostsProportion(), insFeeOrderNew.getSyOtherCostsProportion(), insFeeOrderNew.getNoOtherCostsProportion());
insPlyIncome.setOtherFeerate(OtherCostsProportion);
// 手续费金额
BigDecimal SuperviseCostsPremiums = this.sumAmount(insFeeOrderNew.getJqSuperviseCostsPremiums(), insFeeOrderNew.getSySuperviseCostsPremiums(), insFeeOrderNew.getNoSuperviseCostsPremiums());
insPlyIncome.setCommissionFeevalue(SuperviseCostsPremiums);
// 其他费用金额
BigDecimal OtherCostsPremiums = this.sumAmount(insFeeOrderNew.getJqOtherCostsPremiums(), insFeeOrderNew.getSyOtherCostsPremiums(), insFeeOrderNew.getNoOtherCostsPremiums());
insPlyIncome.setOtherFeevalue(OtherCostsPremiums);
insPlyIncome.setAllFeeValue(SuperviseCostsPremiums.add(OtherCostsPremiums));
insPlyIncome.setCreateTime(LocalDateTime.now());
insPlyIncome.setDocumentaryFeesStatus("0");
insPlyIncome.setHandlingFeesStatus("0");
baseMapper.insert(insPlyIncome);
}
private void setPolicyno(InsPlyIncome insPlyIncome, InsAreaCompany insAreaCompany) throws JsonProcessingException {
ObjectMapper objJson = new ObjectMapper();
String jqpolicyno = insAreaCompany.getJqpolicyno(); // 交强保单号
String sypolicyno = insAreaCompany.getSypolicyno(); // 商业保单号
JSONArray crossInsurance = insAreaCompany.getCrossInsurance(); // 非车保单号
if(ObjectUtils.isNotEmpty(jqpolicyno)){
insPlyIncome.setPolicyno(jqpolicyno);
}
if(ObjectUtils.isNotEmpty(sypolicyno)){
insPlyIncome.setSyPolicyno(sypolicyno);
}
if(ObjectUtils.isNotEmpty(crossInsurance)){
JsonNode jsonArryNode= objJson.readTree(crossInsurance.toJSONString());
if (jsonArryNode.isArray()) {
for (JsonNode jsonNode : jsonArryNode) {
JsonNode jsonNode1 = jsonNode.get("policyNumber");//非车保单号
if(ObjectUtils.isNotEmpty(jsonNode1)){
insPlyIncome.setNoPolicyno(jsonNode1.asText());
}else {
String nopolicy = jsonNode.get("policy").asText(); //非车保单号
insPlyIncome.setNoPolicyno(nopolicy);
}
}
}
}
}
private BigDecimal sumAmount(BigDecimal amount1, BigDecimal amount2, BigDecimal amount3) {
BigDecimal jqNoTaxPremium = (amount1 != null) ? amount1 : BigDecimal.ZERO;
BigDecimal syNoTaxPremium = (amount2 != null) ? amount2 : BigDecimal.ZERO;
BigDecimal noNoTaxPremium = (amount3 != null) ? amount3 : BigDecimal.ZERO;
return jqNoTaxPremium.add(syNoTaxPremium).add(noNoTaxPremium);
}
public HttpResult> queryNew(InsPlyIncomeVo insPlyIncomeVo){
try{
HashMap params = new HashMap<>();
PageInfo> pageHelper = null;
PageHelper.startPage(insPlyIncomeVo.getPageNum(),insPlyIncomeVo.getPageSize());
params.put("pageNum",insPlyIncomeVo.getPageNum());
params.put("pageSize",insPlyIncomeVo.getPageSize());
if(ObjectUtils.isNotEmpty(insPlyIncomeVo.getStartDate())){
params.put("startDate",insPlyIncomeVo.getStartDate().toString());
}
if(ObjectUtils.isNotEmpty(insPlyIncomeVo.getEndDate())){
params.put("endDate",insPlyIncomeVo.getEndDate().toString());
}
if(StringUtils.isNotEmpty(insPlyIncomeVo.getOrderno())){
params.put("orderno",insPlyIncomeVo.getOrderno());
}
if(StringUtils.isNotEmpty(insPlyIncomeVo.getPolicyno())){
params.put("policyno",insPlyIncomeVo.getPolicyno());
}
List list= this.baseMapper.queryNew(params);
pageHelper=new PageInfo(list);
BasePageResult pageResult=new BasePageResult(insPlyIncomeVo.getPageNum(), insPlyIncomeVo.getPageSize(), pageHelper.getTotal(), pageHelper.getPages(), list);
return HttpResult.ok(pageResult);
}catch (Exception e){
e.printStackTrace();
return HttpResult.error("查询异常");
}
}
@Override
@Transactional
public void uodateBalance(InsPlyIncomeVo insPlyIncomeVo) {
InsPlyIncome insPlyIncome = new InsPlyIncome();
insPlyIncomeVo.setHandlingFeesStatus("1");
BeanUtils.copyProperties(insPlyIncomeVo, insPlyIncome);
baseMapper.uopdateByOrderno(insPlyIncome);
// 生成记录
SettlementDocumentaryLogEntity settlementDocumentaryLogEntity = new SettlementDocumentaryLogEntity();
if(StringUtils.isNotEmpty(insPlyIncomeVo.getAgreementType()) && "1".equals(insPlyIncomeVo.getAgreementType())){
// 只有平台协议 才会跟单费一笔结算
settlementDocumentaryLogEntity.setAmount(insPlyIncomeVo.getOtherFeevalue()); // 跟单费金额
}
settlementDocumentaryLogEntity.setHandingAmount(insPlyIncomeVo.getCommissionFeevalue()); // 手续费金额
settlementDocumentaryLogEntity.setSettlementDocumentaryId(insPlyIncomeVo.getOrderno()); // 关联id
settlementDocumentaryLogEntity.setAmountType("1"); //手续费结算
settlementDocumentaryLogEntity.setCreateTime(new Date());
settlementDocumentaryLogService.save(settlementDocumentaryLogEntity);
}
@Override
@Transactional
public HttpResult> totalQuery(InsPlyIncomeVo insPlyIncomeVo) {
HashMap params = new HashMap<>();
PageInfo> pageHelper = null;
params.put("startDate",insPlyIncomeVo.getStartDate().toString());
params.put("endDate",insPlyIncomeVo.getEndDate().toString());
// 判断非跟单结算日期是否已经存在
String resultDate = this.JudgingDate(params);
if(StringUtils.isNotEmpty(resultDate)){
return HttpResult.error("该时间段已近有单据做过结算,请结算");
}
params.put("pageNum",insPlyIncomeVo.getPageNum());
params.put("pageSize",insPlyIncomeVo.getPageSize());
List list= this.baseMapper.totalQuery(params);
pageHelper=new PageInfo(list);
return HttpResult.ok(new BasePageResult<>(insPlyIncomeVo.getPageNum(), insPlyIncomeVo.getPageSize(), pageHelper.getTotal(), pageHelper.getPages(), list));
}
private String JudgingDate(HashMap params) {
if(ObjectUtils.isNotEmpty(params.get("startDate")) && ObjectUtils.isNotEmpty(params.get("endDate")) ){
String checkResult = settlementDocumentaryFeesService.checkDate(params);
if(StringUtils.isNotEmpty(checkResult)){
return checkResult;
}
}
return null;
}
@Override
@Transactional
public HttpResult batchBalance(InsPlyIncomeVo insPlyIncomeVo) {
// 生成新数据
SettlementDocumentaryFeesVo settlementDocumentaryFeesVo = new SettlementDocumentaryFeesVo();
settlementDocumentaryFeesVo.setTotalAmount(insPlyIncomeVo.getTotAmount());
settlementDocumentaryFeesVo.setTotalOrders(insPlyIncomeVo.getTotalorders());
settlementDocumentaryFeesVo.setTimeFrame(insPlyIncomeVo.getTimeFrame());
settlementDocumentaryFeesVo.setCreateTime(LocalDateTime.now());
settlementDocumentaryFeesVo.setStartTime(insPlyIncomeVo.getStartDate().atStartOfDay());
settlementDocumentaryFeesVo.setEndTime(insPlyIncomeVo.getEndDate().atStartOfDay());
settlementDocumentaryFeesVo.setSettlementAmount(insPlyIncomeVo.getSettlementAmount());// 结算金额
settlementDocumentaryFeesVo.setUnsettledAmount(insPlyIncomeVo.getTotAmount().subtract(insPlyIncomeVo.getSettlementAmount())); //未结算金额
return settlementDocumentaryFeesService.inertSettle(settlementDocumentaryFeesVo);
//
}
}