weaver-hrm-salary/src/com/engine/salary/service/impl/TaxPaymentWithholdingServic...

192 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}