192 lines
11 KiB
Java
192 lines
11 KiB
Java
package com.engine.salary.service.impl;
|
||
|
||
import com.alibaba.fastjson.JSON;
|
||
import com.engine.salary.constant.SzyhApiConstant;
|
||
import com.engine.salary.entity.datacollection.bo.DataCollectionBO;
|
||
import com.engine.salary.entity.taxagent.po.TaxAgentTaxReturnPO;
|
||
import com.engine.salary.entity.taxagent.response.SzyhResponseHead;
|
||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationApiConfigPO;
|
||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclareRecordPO;
|
||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclareStatusPO;
|
||
import com.engine.salary.entity.taxpayment.dto.TaxAgreementFeedbackResultDTO;
|
||
import com.engine.salary.entity.taxpayment.dto.TaxFeedbackResultDTO;
|
||
import com.engine.salary.entity.taxpayment.param.TaxPaymentQueryParam;
|
||
import com.engine.salary.entity.taxpayment.response.BaseResponse;
|
||
import com.engine.salary.entity.taxpayment.response.WithholdingFeedbackResponse;
|
||
import com.engine.salary.enums.salarysob.DeclareReportTypeEnum;
|
||
import com.engine.salary.enums.taxdeclaration.TaxDeclareStatusEnum;
|
||
import com.engine.salary.enums.taxdeclaration.TaxPaymentServiceTypeEnum;
|
||
import com.engine.salary.enums.taxdeclaration.TaxPaymentStatusEnum;
|
||
import com.engine.salary.exception.SalaryRunTimeException;
|
||
import com.engine.salary.util.*;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.util.Map;
|
||
import java.util.Objects;
|
||
import java.util.Optional;
|
||
|
||
/**
|
||
* 三方缴款
|
||
* <p>Copyright: Copyright (c) 2023</p>
|
||
* <p>Company: 泛微软件</p>
|
||
*
|
||
* @author qiantao
|
||
* @version 1.0
|
||
**/
|
||
@Slf4j
|
||
public class TaxPaymentWithholdingServiceImpl extends AbstractTaxPaymentService {
|
||
|
||
@Override
|
||
public TaxFeedbackResultDTO getFeedback(TaxPaymentQueryParam param) {
|
||
WithholdingFeedbackResponse feedbackResponse = (WithholdingFeedbackResponse) checkBeforeGetFeedbackResponse(param);
|
||
// 校验请求结果
|
||
String responseCode = Optional.ofNullable(feedbackResponse).map(WithholdingFeedbackResponse::getHead).map(SzyhResponseHead::getCode).orElse(null);
|
||
String msg = Optional.ofNullable(feedbackResponse).map(WithholdingFeedbackResponse::getHead).map(SzyhResponseHead::getMsg).orElse(null);
|
||
if (SzyhApiConstant.HANDLING_CODE.equals(responseCode) || SzyhApiConstant.TASK_HANDLING_CODE.equals(responseCode)) {
|
||
// 如果接口仍在处理中,则继续轮询
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(175337, "缴款还在处理中,请稍后点击缴款反馈"));
|
||
}
|
||
// 获取返回的人员信息列表
|
||
if (!SzyhApiConstant.SUCCESS_CODE.equals(responseCode)) {
|
||
log.info("getAgreementQueryFeedbackResponse not success: {}", JSON.toJSONString(feedbackResponse));
|
||
throw new SalaryRunTimeException(msg);
|
||
}
|
||
|
||
TaxDeclareStatusPO status = getTaxDeclareStatusService(user).getTaxDeclareStatus(param.getTaxDeclareRecordId(),param.getReportType());
|
||
WithholdingFeedbackResponse.Feedback feedback = Optional.of(feedbackResponse)
|
||
.map(WithholdingFeedbackResponse::getBody)
|
||
.map(body -> {
|
||
if (Objects.equals(status.getReportType(), DeclareReportTypeEnum.COMPREHENSIVE_INCOME.getValue())) {
|
||
return body.getZhsdjk();
|
||
} else if (Objects.equals(status.getReportType(), DeclareReportTypeEnum.CLASSIFIED_INCOME.getValue())) {
|
||
return body.getFlsdjk();
|
||
} else if (Objects.equals(status.getReportType(), DeclareReportTypeEnum.NONRESIDENT_INCOME.getValue())) {
|
||
return body.getFjmsdjk();
|
||
} else {
|
||
return body.getXsgsdjk();
|
||
}
|
||
|
||
})
|
||
.orElse(null);
|
||
if (feedback == null) {
|
||
// 更新缴款请求为已反馈
|
||
updateTaxPaymentRequest(param);
|
||
log.info("getAgreementQueryFeedbackResponse empty data error: {}", JSON.toJSONString(feedbackResponse));
|
||
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(175338, "税局接口错误,未返回有效数据"));
|
||
}
|
||
// 判断缴款状态是否成功
|
||
Integer paymentStatus = SalaryEntityUtil.getIntValue(feedback.getJkzt(), -1);
|
||
TaxPaymentStatusEnum paymentStatusEnum = SalaryEnumUtil.enumMatchByValue(paymentStatus, TaxPaymentStatusEnum.class);
|
||
if (paymentStatusEnum != TaxPaymentStatusEnum.SUCCESS) {
|
||
// 更新缴款请求为已反馈
|
||
updateTaxPaymentRequest(param);
|
||
throw new SalaryRunTimeException(String.format("缴款失败,失败原因:%s,申报状态:%s", feedback.getJksbyy(), feedback.getSbzt()));
|
||
}
|
||
// 累计实缴金额
|
||
BigDecimal totalPaid = feedback.getKkfhlb().stream().map(e -> new BigDecimal(e.getSjse())).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||
|
||
if (TaxDeclareStatusEnum.DECLARE_SUCCESS_PAID.getValue().equals(status.getTaxDeclareStatus())) {
|
||
// 更新缴款请求为已反馈
|
||
updateTaxPaymentRequest(param);
|
||
throw new SalaryRunTimeException("当前申报表状态为已缴款,无法更新状态");
|
||
}
|
||
BigDecimal taxPayAmount = SalaryEntityUtil.empty2Zero(status.getTaxPayAmount());
|
||
BigDecimal taxPurePaidAmount = SalaryEntityUtil.empty2Zero(status.getTaxPurePaidAmount());
|
||
if (SalaryEntityUtil.empty2Zero(status.getTaxPaidAmount()).equals(totalPaid) && taxPayAmount.compareTo(BigDecimal.ZERO) > 0) {
|
||
// 更新缴款请求为已反馈
|
||
updateTaxPaymentRequest(param);
|
||
throw new SalaryRunTimeException("请进行缴款后再刷新缴款状态");
|
||
}
|
||
status.setTaxDeclareStatus(TaxDeclareStatusEnum.DECLARE_SUCCESS_PAID.getValue());
|
||
status.setTaxPaidAmount(totalPaid.toString());
|
||
status.setTaxPurePaidAmount(taxPurePaidAmount.add(taxPayAmount).toString());
|
||
status.setTaxPayAmount(BigDecimal.ZERO.toString());
|
||
getTaxDeclareStatusService(user).updateTaxDeclareStatus(status, false);
|
||
|
||
|
||
//更新主记录
|
||
getTaxDeclareStatusService(user).updateRecord(param.getTaxDeclareRecordId());
|
||
// 更新缴款请求为已反馈
|
||
updateTaxPaymentRequest(param);
|
||
|
||
TaxDeclareRecordPO declareRecordPO = getTaxDeclareRecordService(user).getById(param.getTaxDeclareRecordId());
|
||
BigDecimal otherAmount = SalaryEntityUtil.empty2Zero(declareRecordPO.getTaxPaidAmount()).subtract(SalaryEntityUtil.empty2Zero(declareRecordPO.getTaxPurePaidAmount()));
|
||
|
||
return new TaxAgreementFeedbackResultDTO()
|
||
.setPayAmount(SalaryEntityUtil.thousandthConvert(SalaryEntityUtil.empty2Zero(status.getTaxPaidAmount()).toString()))
|
||
.setOtherAmount(SalaryEntityUtil.thousandthConvert(otherAmount.toString()))
|
||
.setPersonNum(status.getPersonNum().toString());
|
||
}
|
||
|
||
@Override
|
||
public Integer getServiceType() {
|
||
return TaxPaymentServiceTypeEnum.WITHHOLDING_PAY.getValue();
|
||
}
|
||
|
||
protected <T extends BaseResponse> T getRequestIdResponse(TaxAgentTaxReturnPO returnPO,
|
||
String taxAgentName,
|
||
TaxPaymentQueryParam param,
|
||
TaxDeclarationApiConfigPO apiConfig,
|
||
Class<T> clazz) {
|
||
String protocolNumber = param.getProtocolNumber();
|
||
String paymentNumber = param.getPaymentNumber();
|
||
Integer reportType = param.getReportType();
|
||
String taxAmount = param.getTaxAmount();
|
||
SalaryAssert.notBlank(protocolNumber, SalaryI18nUtil.getI18nLabel(184071, "三方协议号为空"));
|
||
SalaryAssert.notBlank(paymentNumber, SalaryI18nUtil.getI18nLabel(184071, "缴款帐号为空"));
|
||
SalaryAssert.notNull(reportType, SalaryI18nUtil.getI18nLabel(184071, "报表类型为空"));
|
||
SalaryAssert.notBlank(taxAmount, SalaryI18nUtil.getI18nLabel(184071, "应纳税额为空"));
|
||
String url = apiConfig.getHost() + SzyhApiConstant.DECLARE_WITH_HOLDING;
|
||
Map<String, Object> requestParam = DataCollectionBO.getApiBaseQueryParams(returnPO, taxAgentName, SalaryDateUtil.getFormatYYYYMM(param.getTaxYearMonth()));
|
||
requestParam.put("sfxyh", protocolNumber);
|
||
requestParam.put("jkzh", paymentNumber);
|
||
requestParam.put("bblx", reportType);
|
||
requestParam.put("ynse", taxAmount);
|
||
return postRequest(apiConfig, url, requestParam, clazz);
|
||
}
|
||
|
||
@Override
|
||
protected TempWrapper checkBeforeGetRequestIdResponse(TaxPaymentQueryParam param) {
|
||
TempWrapper tempWrapper = super.checkBeforeGetRequestIdResponse(param);
|
||
return tempWrapper;
|
||
}
|
||
|
||
// @Override
|
||
// public void cancelWithholdingVoucher(TaxDeclarationApiConfigPO apiConfig, TaxDeclareRecordPO taxDeclareRecord, Map<String, Object> requestParam) {
|
||
// TaxPaymentRequestPO paymentRequestPO = getTaxPaymentRequestMapper().getOne(TaxPaymentRequestPO
|
||
// .builder()
|
||
// .requestType(TaxPaymentServiceTypeEnum.WITHHOLDING_VOUCHER.getValue())
|
||
// .taxAgentId(taxDeclareRecord.getTaxAgentId())
|
||
// .taxYearMonth(taxDeclareRecord.getTaxCycle())
|
||
// .build());
|
||
//// if (paymentRequestPO != null) {
|
||
// TaxPaymentClient taxPaymentClient = new TaxPaymentClient(taxDeclareRecord.getTaxAgentId());
|
||
// List<TaxDeclareStatusPO> statuses = getTaxDeclareStatusService(user).getTaxDeclareStatusByTaxDeclareRecordId(taxDeclareRecord.getId());
|
||
// statuses.forEach(status -> {
|
||
// requestParam.put("sblx", status.getReportType());
|
||
// QuerySpecialAmountResponse cancelResponse = taxPaymentClient.cancelWithholdingVoucher(requestParam);
|
||
// SzyhResponseHead head = Optional.ofNullable(cancelResponse).map(QuerySpecialAmountResponse::getHead)
|
||
// .orElse(new SzyhResponseHead("0", SalaryI18nUtil.getI18nLabel(183785, "银联缴款凭证作废失败,请稍后重试")));
|
||
// SalaryAssert.isTrue(SzyhApiConstant.SUCCESS_CODE.equals(head.getCode()) || SzyhApiConstant.NONE_VOUCHER_CODE.equals(head.getCode()), head.getMsg());
|
||
//
|
||
// getTaxPaymentRequestMapper().updateFeedbackByRequestTypeTaxAgentIdTaxYearMonth(TaxPaymentRequestPO
|
||
// .builder()
|
||
// .feedback(SalaryOnOffEnum.ON.getValue())
|
||
// .requestType(TaxPaymentServiceTypeEnum.WITHHOLDING_VOUCHER.getValue())
|
||
// .taxAgentId(taxDeclareRecord.getTaxAgentId())
|
||
// .taxYearMonth(taxDeclareRecord.getTaxCycle())
|
||
// .build());
|
||
// });
|
||
//
|
||
//// }
|
||
// }
|
||
|
||
protected BaseResponse getFeedbackResponse(TaxDeclarationApiConfigPO apiConfig, String requestId) {
|
||
String url = apiConfig.getHost() + SzyhApiConstant.DECLARE_WITH_HOLDING_FEEDBACK;
|
||
String res = getRequest(apiConfig, requestId, url);
|
||
log.info("getWithholdingFeedback:requestId {} res {} ", requestId, res);
|
||
return JsonUtil.parseObject(res, WithholdingFeedbackResponse.class);
|
||
}
|
||
}
|