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.WithholdingVoucherFeedbackResponse; import com.engine.salary.enums.SalaryOnOffEnum; import com.engine.salary.enums.taxdeclaration.TaxPaymentServiceTypeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.remote.tax.client.TaxPaymentClient; import com.engine.salary.util.JsonUtil; import com.engine.salary.util.SalaryAssert; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryI18nUtil; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** * 缴款凭证 *

Copyright: Copyright (c) 2023

*

Company: 泛微软件

* * @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)||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); } 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 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 getRequestIdResponse(TaxAgentTaxReturnPO returnPO, String taxAgentName, TaxPaymentQueryParam param, TaxDeclarationApiConfigPO apiConfig, Class clazz) { boolean syncStatus = clazz == SyncWithholdingFeedbackResponse.class; String api = syncStatus ? SzyhApiConstant.GET_SYNC_WITHHOLDING_FEEDBACK : SzyhApiConstant.WITHHOLDING_VOUCHER; String url = apiConfig.getHost() + api; Map 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 requestParam) { TaxPaymentRequestPO paymentRequestPO = getTaxPaymentRequestMapper().getOne(TaxPaymentRequestPO .builder() .requestType(TaxPaymentServiceTypeEnum.WITHHOLDING_VOUCHER.getValue()) .taxAgentId(taxDeclareRecord.getTaxAgentId()) .taxYearMonth(taxDeclareRecord.getTaxCycle()) .build()); // if (paymentRequestPO != null) { List statuses = getTaxDeclareStatusService(user).getTaxDeclareStatusByTaxDeclareRecordId(taxDeclareRecord.getId()); TaxPaymentClient taxPaymentClient = new TaxPaymentClient(taxDeclareRecord.getTaxAgentId()); 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()), 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); // TaxPaymentClient taxPaymentClient = new TaxPaymentClient(param.getTaxAgentId()); // Map requestParam = DataCollectionBO.getApiBaseQueryParams(tempWrapper.getTaxReturnPO(), tempWrapper.getTaxAgentPO().getName(), SalaryDateUtil.getFormatYYYYMM(param.getTaxYearMonth())); // requestParam.put("bblx", param.getReportType()); // SyncWithholdingFeedbackResponse response = taxPaymentClient.getSyncWithholding(requestParam); // // // 校验请求结果 // 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 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); } }