package com.ydtech.modules.fnc.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ydtech.core.page.HttpResult;
import com.ydtech.modules.fnc.dao.InsuranceHandlingSettlementMonthMapper;
import com.ydtech.modules.fnc.dto.InsuranceHandlingSettlementMonthDto;
import com.ydtech.modules.fnc.entity.InsPlyIncome;
import com.ydtech.modules.fnc.entity.InsuranceHandlingSettlementMonthEntity;
import com.ydtech.modules.fnc.service.InsPlyIncomeService;
import com.ydtech.modules.fnc.service.InsuranceHandlingSettlementMonthService;
import com.ydtech.modules.fnc.vo.InsuranceHandlingSettlementMonthVo;
import com.ydtech.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
* 保险手续费结算关联表
*
*
* @author whp
* @since 2024-08-16
*/
@Slf4j
@Service
public class InsuranceHandlingSettlementMonthServiceImpl extends ServiceImpl implements InsuranceHandlingSettlementMonthService {
@Autowired
private InsPlyIncomeService insPlyIncomeService;
@Override
public List queryList(InsuranceHandlingSettlementMonthVo insuranceHandlingSettlementMonthVo) {
List resultList = baseMapper.queryList(insuranceHandlingSettlementMonthVo);
if (resultList.size() > 0) {
return resultList;
} else {
List invociAmount = insPlyIncomeService.getInvociAmount(insuranceHandlingSettlementMonthVo);
Map latestByTaskId = invociAmount.stream()
.collect(Collectors.toMap(
InsuranceHandlingSettlementMonthDto::getIncomeSigningTime, // 用于生成Map的键
Function.identity(),// 值是Stream中的元素本身
// 如果两个元素有相同的key(即相同的taskId),则选择createTime更晚的那个
BinaryOperator.maxBy(Comparator.comparing(InsuranceHandlingSettlementMonthDto::getCreateTime))
));
for (InsuranceHandlingSettlementMonthDto item : invociAmount) {
if (item.getTotalAmount() != null && item.getTotalAmount().compareTo(BigDecimal.ZERO) < 0) {
String formattedDateString = formatDateMinusOneMonth(item.getIncomeSigningTime());
if (StringUtils.isNotEmpty(formattedDateString)) {
InsuranceHandlingSettlementMonthDto insuranceHandlingSettlementMonthDto = latestByTaskId.get(formattedDateString);
insuranceHandlingSettlementMonthDto.setTotalAmount(insuranceHandlingSettlementMonthDto.getTotalAmount().add(item.getTotalAmount()));
latestByTaskId.remove(item.getIncomeSigningTime());
latestByTaskId.put(formattedDateString, insuranceHandlingSettlementMonthDto);
}
}
}
List list = new ArrayList<>(latestByTaskId.values());
list.stream().forEach(item -> {
if (item.getRemainingAmount() == null || item.getRemainingAmount().compareTo(BigDecimal.ZERO) == 0) {
item.setRemainingAmount(item.getTotalAmount());
item.setSettlementAmount(BigDecimal.ZERO);
}
});
return list;
}
}
public static String formatDateMinusOneMonth(String originalDateString) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
try {
Date date = sdf.parse(originalDateString);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, -1); // 月份减一
// 注意:如果原始月份是1月,这里将变成12月,而不是0或1
// 如果你需要特别处理这种情况(比如保持为1月或循环到前一年的12月),你需要添加逻辑来检查
return sdf.format(calendar.getTime());
} catch (ParseException e) {
e.printStackTrace();
return null; // 或者返回原始字符串,或者抛出一个自定义异常
}
}
/**
* 结算新增
*
* @param insuranceHandlingSettlementMonthVo
* @return
*/
@Override
public HttpResult insertByEntity(InsuranceHandlingSettlementMonthEntity insuranceHandlingSettlementMonthVo) {
baseMapper.insert(insuranceHandlingSettlementMonthVo);
return HttpResult.ok("结算成功");
}
@Override
public List getQueryLists(InsuranceHandlingSettlementMonthVo insuranceHandlingSettlementMonthVo) {
List resultList = baseMapper.queryList(insuranceHandlingSettlementMonthVo);
return resultList;
}
/**
*
* @param insuranceHandlingSettlementMonthDto
* @return 返回结算金额 未结算 开票金额
*/
@Override
public HashMap getSumAmount(InsuranceHandlingSettlementMonthDto insuranceHandlingSettlementMonthDto) {
return baseMapper.getSumAmount(insuranceHandlingSettlementMonthDto);
}
}