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

185 lines
10 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.datacollection.response.QuerySpecialAmountResponse;
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.bo.TaxPaymentBO;
import com.engine.salary.entity.taxpayment.dto.TaxFeedbackResultDTO;
import com.engine.salary.entity.taxpayment.dto.TaxWithholdingVoucherFeedbackDTO;
import com.engine.salary.entity.taxpayment.param.TaxPaymentQueryParam;
import com.engine.salary.entity.taxpayment.po.TaxPaymentRequestPO;
import com.engine.salary.entity.taxpayment.response.BaseResponse;
import com.engine.salary.entity.taxpayment.response.SyncWithholdingFeedbackResponse;
import com.engine.salary.entity.taxpayment.response.WithholdingFeedbackResponse;
import com.engine.salary.entity.taxpayment.response.WithholdingVoucherFeedbackResponse;
import com.engine.salary.enums.SalaryOnOffEnum;
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.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 缴款凭证
* <p>Copyright: Copyright (c) 2023</p>
* <p>Company: 泛微软件</p>
*
* @author qiantao
* @version 1.0
**/
@Slf4j
public class TaxPaymentWithholdingVoucherServiceImpl extends AbstractTaxPaymentService {
@Override
public TaxFeedbackResultDTO getFeedback(TaxPaymentQueryParam param) {
WithholdingVoucherFeedbackResponse feedbackResponse = (WithholdingVoucherFeedbackResponse) checkBeforeGetFeedbackResponse(param);
// 校验请求结果
String responseCode = Optional.ofNullable(feedbackResponse).map(WithholdingVoucherFeedbackResponse::getHead).map(SzyhResponseHead::getCode).orElse(null);
String msg = Optional.ofNullable(feedbackResponse).map(WithholdingVoucherFeedbackResponse::getHead).map(SzyhResponseHead::getMsg).orElse(null);
if (SzyhApiConstant.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);
}
if (feedbackResponse.getBody() == null) {
log.info("getAgreementQueryFeedbackResponse body null: {}", JSON.toJSONString(feedbackResponse));
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(175339, "税局接口异常,请稍后重试"));
}
// 获取返回的信息列表
WithholdingVoucherFeedbackResponse.Feedback synthesize = feedbackResponse.getBody().getZhsd();
if (synthesize.getFkzt().equals("1")) {
throw new SalaryRunTimeException(synthesize.getFkms());
}
if (SalaryOnOffEnum.ON.getValue().equals(param.getCheckFeedback())) {
return new TaxFeedbackResultDTO().setFinish(true);
}
// 更新缴款请求为已反馈
updateTaxPaymentRequest(param);
// 组装数据
TaxWithholdingVoucherFeedbackDTO feedbackDTO = TaxPaymentBO.buildTaxWithholdingVoucherFeedbackDTO(synthesize);
List<TaxWithholdingVoucherFeedbackDTO.Detail> details = synthesize.getJkpzmxlb().stream().map(e -> {
TaxWithholdingVoucherFeedbackDTO.Detail detail = new TaxWithholdingVoucherFeedbackDTO.Detail();
detail.setPaymentCode(e.getZsxmmc());
detail.setPaymentItem(e.getZspmmc());
detail.setPayAmount(e.getYjse());
return detail;
}).collect(Collectors.toList());
feedbackDTO.setDetails(details);
return feedbackDTO;
}
@Override
public Integer getServiceType() {
return TaxPaymentServiceTypeEnum.WITHHOLDING_VOUCHER.getValue();
}
protected <T extends BaseResponse> T getRequestIdResponse(TaxAgentTaxReturnPO returnPO,
String taxAgentName,
TaxPaymentQueryParam param,
TaxDeclarationApiConfigPO apiConfig,
Class<T> clazz) {
boolean syncStatus = clazz == SyncWithholdingFeedbackResponse.class;
String api = syncStatus ? SzyhApiConstant.GET_SYNC_WITHHOLDING_FEEDBACK : SzyhApiConstant.WITHHOLDING_VOUCHER;
String url = apiConfig.getHost() + api;
Map<String, Object> requestParam = DataCollectionBO.getApiBaseQueryParams(returnPO, taxAgentName, SalaryDateUtil.getFormatYYYYMM(param.getTaxYearMonth()));
if (syncStatus) {
requestParam.put("bblx", param.getReportType());
}
return postRequest(apiConfig, url, requestParam, clazz);
}
@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) {
List<TaxDeclareStatusPO> statuses = getTaxDeclareStatusService(user).getTaxDeclareStatusByTaxDeclareRecordId(taxDeclareRecord.getId());
statuses.forEach(status -> {
requestParam.put("sblx", status.getReportType());
String url = apiConfig.getHost() + SzyhApiConstant.CANCEL_WITHHOLDING_VOUCHER;
QuerySpecialAmountResponse cancelResponse = postRequest(apiConfig, url, requestParam, QuerySpecialAmountResponse.class);
SzyhResponseHead head = Optional.ofNullable(cancelResponse).map(QuerySpecialAmountResponse::getHead)
.orElse(new SzyhResponseHead("0", SalaryI18nUtil.getI18nLabel(183785, "银联缴款凭证作废失败,请稍后重试")));
SalaryAssert.isTrue(SzyhApiConstant.SUCCESS_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());
});
// }
}
@Override
public void syncWithholdingFeedback(TaxPaymentQueryParam param) {
TempWrapper tempWrapper = checkBeforeGetRequestIdResponse(param);
SyncWithholdingFeedbackResponse response = getRequestIdResponse(tempWrapper.getTaxReturnPO(), tempWrapper.getTaxAgentPO().getName(),
param, tempWrapper.getApiConfigPO(), SyncWithholdingFeedbackResponse.class);
// 校验请求结果
String responseCode = Optional.ofNullable(response)
.map(SyncWithholdingFeedbackResponse::getHead)
.map(SzyhResponseHead::getCode)
.orElse(null);
WithholdingFeedbackResponse.Feedback body = Optional.ofNullable(response)
.map(SyncWithholdingFeedbackResponse::getBody)
.orElse(null);
if (!SzyhApiConstant.SUCCESS_CODE.equals(responseCode) || Objects.isNull(body)) {
log.info("syncWithholdingFeedback code error{}", JSON.toJSONString(response));
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(95828, "税局接口异常,请稍后重试"));
}
Integer paymentStatus = SalaryEntityUtil.getIntValue(body.getJkzt(), -1);
TaxPaymentStatusEnum paymentStatusEnum = SalaryEnumUtil.enumMatchByValue(paymentStatus, TaxPaymentStatusEnum.class);
if (paymentStatusEnum != TaxPaymentStatusEnum.SUCCESS) {
throw new SalaryRunTimeException(String.format("查询失败,失败原因:%s申报状态%s", body.getJksbyy(), body.getSbzt()));
}
// 累计实缴金额
BigDecimal totalPaid = body.getKkfhlb().stream().map(e -> new BigDecimal(e.getSjse())).reduce(BigDecimal.ZERO, BigDecimal::add);
// 更新个税申报记录状态为已缴款
updateTaxDeclareRecord(param, totalPaid);
// 更新三方缴款反馈状态
getTaxPaymentRequestMapper().updateFeedbackByTaxDeclareRecordId(TaxPaymentRequestPO
.builder()
.feedback(SalaryOnOffEnum.ON.getValue())
.requestType(TaxPaymentServiceTypeEnum.WITHHOLDING_VOUCHER.getValue())
.taxDeclareRecordId(param.getTaxDeclareRecordId())
.build());
}
@Override
public void cancelWithholdingVoucher(TaxPaymentQueryParam param) {
TempWrapper tempWrapper = checkBeforeGetRequestIdResponse(param);
Map<String, Object> requestParam = DataCollectionBO.getApiBaseQueryParams(tempWrapper.getTaxReturnPO(), tempWrapper.getTaxAgentPO().getName(), SalaryDateUtil.getFormatYYYYMM(param.getTaxYearMonth()));
cancelWithholdingVoucher(tempWrapper.getApiConfigPO(), tempWrapper.getTaxDeclareRecord(), requestParam);
}
protected BaseResponse getFeedbackResponse(TaxDeclarationApiConfigPO apiConfig, String requestId) {
String url = apiConfig.getHost() + SzyhApiConstant.WITHHOLDING_VOUCHER_FEEDBACK;
String res = getRequest(apiConfig, requestId, url);
return JsonUtil.parseObject(res, WithholdingVoucherFeedbackResponse.class);
}
}