个税在线申报-个税申报表在线申报功能开发

This commit is contained in:
黎永顺 2023-08-23 15:41:38 +08:00
parent f7c03082f4
commit c4d0dbf296
14 changed files with 961 additions and 70 deletions

View File

@ -163,4 +163,59 @@ export const taxdeclarationDelete = (params) => {
return postFetch("/api/bs/hrmsalary/taxdeclaration/delete", params);
};
//个税申报表申报数据-获取在线申报反馈
export const taxdeclarationGetDeclareFeedback = (params) => {
return postFetch("/api/bs/hrmsalary/taxdeclaration/getDeclareFeedback", params);
};
//个税申报表申报数据-更正申报
export const taxdeclaratioUpdateDeclare = (params) => {
return postFetch("/api/bs/hrmsalary/taxdeclaration/updateDeclare", params);
};
//个税申报表申报数据-作废申报
export const taxdeclaratioUpdateCancel = (params) => {
return postFetch("/api/bs/hrmsalary/taxdeclaration/cancel", params);
};
//个税申报表申报数据-获取作废反馈
export const taxdeclaratioGetCancelFeedback = (params) => {
return postFetch("/api/bs/hrmsalary/taxdeclaration/getCancelFeedback", params);
};
//个税申报表申报数据-三方协议缴款反馈
export const taxPaymentAgreementPayFeedback = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/agreement/pay/feedback", params);
};
//个税申报表申报数据-应缴税额查询
export const taxPaymentTaxAmount = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/tax/amount", params);
};
//个税申报表申报数据-获取企业的三方信息
export const taxPaymentgetAgreement = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/getAgreement", params);
};
//个税申报表申报数据-获取企业的三方信息查询反馈
export const taxPaymentgetAgreementFeedback = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/getAgreementFeedback", params);
};
//个税申报表申报数据-同步缴款状态
export const taxPaymentVoucherStatusSync = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/voucher/status/sync", params);
};
//个税申报表申报数据-三方缴款,最终支付
export const taxPaymentAgreemenPay = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/agreement/pay", params);
};
//个税申报表申报数据-开具企业缴税完税证明
export const taxPaymentWithheldVoucherGet = (params) => {
return postFetch("/api/bs/hrmsalary/taxPayment/withheldVoucher/get", params);
};

View File

@ -22,6 +22,7 @@ import PayrollDetail from "./pages/payroll/payrollDetail";
import Declare from "./pages/declare";
import DeclareDetail from "./pages/declareDetail";
import Employeedeclare from "./pages/employeedeclare";
import EnterprisePayCertificationDetail from "./pages/enterprisePayCertificationDetail";
import EmployeedeclareDetail from "./pages/employeedeclareDetail";
import TaxRate from "./pages/taxRate";
import TaxAgents from "./pages/taxAgent";
@ -160,6 +161,8 @@ const Routes = (
<Route key="declare" path="declare" component={Declare}/>
<Route key="declareDetail" path="declareDetail" component={DeclareDetail}/>
<Route key="employeedeclare" path="employeedeclare" component={Employeedeclare}/>
<Route key="enterprisePayCertificationDetail" path="enterprisePayCertificationDetail"
component={EnterprisePayCertificationDetail}/>
<Route key="employeedeclareDetail" path="employeedeclareDetail" component={EmployeedeclareDetail}/>
<Route
key="generateDeclarationDetail"

View File

@ -158,7 +158,7 @@ export default class Declare extends React.Component {
href={`${window.ecologyContentPath || ""}/spa/hrmSalary/static/index.html#/main/hrmSalary/declareDetail?id=${record.id}`}
target="_blank"
>
查看
{getLabel(83110, "查看详情")}
</a>
{
showWithDrawBtn &&

View File

@ -0,0 +1,93 @@
export const paymentFeedbackConditions = [
{
items: [
{
colSpan: 1,
conditionType: "SELECT",
domkey: ["type"],
fieldcol: 12,
label: "缴款方式",
lanId: 111,
labelcol: 6,
value: "",
rules: "required",
viewAttr: 3,
detailtype: 3,
options: []
}
],
defaultshow: true
}
];
export const paymentTripartiteConditions = [
{
items: [
{
colSpan: 1,
conditionType: "INPUT",
domkey: ["taxAgent"],
fieldcol: 12,
label: "个税扣缴义务人",
lanId: 537996,
labelcol: 6,
value: "",
viewAttr: 1
},
{
colSpan: 1,
conditionType: "INPUT",
domkey: ["amount"],
fieldcol: 12,
label: "应缴金额",
lanId: 111,
labelcol: 6,
value: "",
viewAttr: 1
},
{
colSpan: 1,
conditionType: "INPUT",
domkey: ["personNum"],
fieldcol: 12,
label: "申报人数",
lanId: 111,
labelcol: 6,
value: "",
viewAttr: 1
}
],
defaultshow: true
}
];
export const paymentBankConditions = [
{
items: [
{
colSpan: 1,
conditionType: "SELECT",
domkey: ["protocolNumber"],
fieldcol: 12,
label: "开户行",
lanId: 111,
labelcol: 6,
value: "",
rules: "required",
viewAttr: 3,
options: []
},
{
colSpan: 1,
conditionType: "SELECT",
domkey: ["count"],
fieldcol: 12,
label: "开户行号",
lanId: 111,
labelcol: 6,
value: "",
viewAttr: 1,
options: []
}
],
defaultshow: true
}
];

View File

@ -0,0 +1,256 @@
/*
* Author: 黎永顺
* name: 在线申报-缴款按钮
* Description:
* Date: 2023/8/22
*/
import React, { Component } from "react";
import { WeaLocaleProvider } from "ecCom";
import { inject, observer } from "mobx-react";
import { Button, Dropdown, Menu, message, Modal } from "antd";
import PaymentDialog from "./paymentDialog";
import {
taxPaymentAgreemenPay,
taxPaymentgetAgreement,
taxPaymentgetAgreementFeedback,
taxPaymentTaxAmount
} from "../../../apis/declare";
import { getQueryString } from "../../../util/url";
import { paymentBankConditions, paymentTripartiteConditions } from "./constants";
const { getLabel } = WeaLocaleProvider;
@inject("declareStore")
@observer
class PaymentBtn extends Component {
constructor(props) {
super(props);
this.state = {
paymentDialog: {
visible: false, title: "",
buttons: [], conditions: [],
taxAmount: ""
}
};
this.timer = null;
}
handleTripartiteContributions = () => {
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: <div>
<div style={{ textAlign: "center" }}>{getLabel(111, "确定要进行三方缴款吗?")}</div>
<div
style={{ textAlign: "center" }}>{getLabel(111, "若申请过银行缴款,点击确定,将自动作废银行缴款凭证。并进行三方缴款。 ")}</div>
</div>,
onOk: () => {
taxPaymentTaxAmount({ taxDeclareRecordId: getQueryString("id") })
.then(({ status, data, errormsg }) => {
if (status) {
const { paymentDialog } = this.state;
this.setState({
paymentDialog: {
...paymentDialog, visible: true,
title: getLabel(111, "应缴纳"), taxAmount: data.amount,
buttons: [
<Button type="primary" onClick={this.taxPaymentgetAgreement}>{getLabel(111, "确认缴款")}</Button>
],
conditions: _.map(paymentTripartiteConditions, item => {
return {
...item,
items: _.map(item.items, it => {
const key = it["domkey"][0];
return {
...it,
value: data[key]
};
})
};
})
}
});
} else {
message.error(errormsg);
}
});
}
});
};
taxPaymentgetAgreement = () => {
const { taxCycle: taxYearMonth, taxAgentId } = this.props.declareInfo;
const payload = {
taxDeclareRecordId: getQueryString("id"),
taxAgentId, taxYearMonth
};
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={true}>{getLabel(111, "确认缴款")}</Button>
]
}
});
taxPaymentgetAgreement(payload).then(({ status, data, errormsg }) => {
if (status) {
this.handleCancel();
this.getBankAccountInfo({ ...payload, requestId: data });
} else {
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" onClick={() => this.taxPaymentgetAgreement()}
loading={false}>{getLabel(111, "确认缴款")}</Button>
]
}
});
message.error(errormsg);
}
}).catch(() => {
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" onClick={() => this.taxPaymentgetAgreement()}
loading={false}>{getLabel(111, "确认缴款")}</Button>
]
}
});
});
};
getBankAccountInfo = (payload) => {
let loop = () => {
clearTimeout(this.timer);
this.timer = setTimeout(async () => {
let response = await taxPaymentgetAgreementFeedback(payload);
const { data, status, errormsg } = response;
if (status) {
const { finish, form } = data;
if (finish) {
const { feedbacks, bankForm } = form;
const { paymentDialog } = this.state;
this.setState({
paymentDialog: {
...paymentDialog, visible: true,
title: getLabel(111, "银行账号信息"),
buttons: [
<Button type="primary" onClick={this.taxPaymentAgreemenPay}>{getLabel(826, "确定")}</Button>
],
conditions: _.map(paymentBankConditions, item => {
return {
...item,
items: _.map(item.items, it => {
const key = it["domkey"][0];
if (key === "protocolNumber") {
return {
...it,
value: !_.isEmpty(bankForm) ? bankForm.bank : "",
options: _.map(feedbacks, o => ({ key: o.sfxyh, showname: o.yhhbmc }))
};
} else if (key === "count") {
return {
...it,
value: !_.isEmpty(bankForm) ? bankForm.bank : "",
options: _.map(feedbacks, o => ({ key: o.sfxyh, showname: o.khhhh }))
};
}
return { ...it };
})
};
})
}
});
} else {
loop();
}
} else {
message.warning(errormsg);
clearTimeout(this.timer);
}
}, 800);
};
loop();
};
taxPaymentAgreemenPay = () => {
const { paymentDialog } = this.state;
const { taxAmount } = paymentDialog;
const { declareStore: { paymentForm } } = this.props;
const { taxCycle: taxYearMonth, taxAgentId } = this.props.declareInfo;
paymentForm.validateForm().then(f => {
if (f.isValid) {
const { protocolNumber } = paymentForm.getFormParams();
const payload = {
taxDeclareRecordId: getQueryString("id"),
taxAgentId, taxYearMonth, taxAmount, protocolNumber
};
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={true}>{getLabel(826, "确定")}</Button>
]
}
});
taxPaymentAgreemenPay(payload).then(({ status, errormsg }) => {
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={false}
onClick={this.taxPaymentAgreemenPay}>{getLabel(826, "确定")}</Button>
]
}
});
if (status) {
message.success(getLabel(111, "缴款处理中,请稍后点击缴款反馈按钮获取缴款信息"));
this.handleCancel();
} else {
message.error(errormsg);
}
}).catch(() => this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={false}
onClick={this.taxPaymentAgreemenPay}>{getLabel(826, "确定")}</Button>
]
}
}));
} else {
f.showErrors();
}
});
};
handleCancel = () => {
const { paymentDialog } = this.state;
this.setState({
paymentDialog: {
...paymentDialog, visible: false,
title: "", buttons: [], conditions: []
}
});
};
render() {
const { paymentDialog } = this.state;
return (
<React.Fragment>
<Dropdown.Button
onClick={this.handleTripartiteContributions}
overlay={
<Menu>
<Menu.Item key="bank_voucher_payment">{getLabel(111, "银行端凭证缴款")}</Menu.Item>
<Menu.Item key="destory_voucher">{getLabel(111, "作废缴款凭证")}</Menu.Item>
</Menu>
}
type="ghost">{getLabel(111, "三方缴款")}</Dropdown.Button>
<PaymentDialog
{...paymentDialog}
onCancel={this.handleCancel}
/>
</React.Fragment>
);
}
}
export default PaymentBtn;

View File

@ -0,0 +1,51 @@
/*
* Author: 黎永顺
* name: 在线申报-缴款弹框
* Description:
* Date: 2023/8/22
*/
import React, { Component } from "react";
import { inject, observer } from "mobx-react";
import { WeaDialog } from "ecCom";
import { getSearchs } from "../../../util";
@inject("declareStore")
@observer
class PaymentDialog extends Component {
componentWillReceiveProps(nextProps, nextContext) {
const { declareStore: { paymentForm, changePaymentForm }, conditions } = nextProps;
if (nextProps.visible !== this.props.visible && nextProps.visible && nextProps.conditions) {
paymentForm.initFormFields(conditions);
}
if (nextProps.visible !== this.props.visible && !nextProps.visible) {
paymentForm.resetForm();
changePaymentForm();
}
}
handleChange = (val) => {
const key = Object.keys(val)[0];
if (key === "protocolNumber") {
const { declareStore: { paymentForm } } = this.props;
paymentForm.updateFields({
count: val[key].value
});
}
};
render() {
const { conditions, declareStore: { paymentForm } } = this.props;
return (
<WeaDialog
{...this.props} className="paymentDialog" initLoadCss
style={{ width: 550 }}
>
<div className="paymentDialogContent">
{!_.isEmpty(conditions) && getSearchs(paymentForm, conditions, 1, false, this.handleChange)}
</div>
</WeaDialog>
);
}
}
export default PaymentDialog;

View File

@ -0,0 +1,42 @@
/*
* Author: 黎永顺
* name: 在线申报-三方缴款详情
* Description:
* Date: 2023/8/22
*/
import React, { Component } from "react";
import { WeaDialog, WeaLocaleProvider } from "ecCom";
const { getLabel } = WeaLocaleProvider;
class PaymentFeedBackDetail extends Component {
render() {
const { showData } = this.props;
return (
<WeaDialog
{...this.props} className="paymentDialog" initLoadCss
style={{ width: 550 }}
>
<div className="with-holding-pay-detail">
<div className="status">{getLabel(111, "缴款成功")}</div>
<div className="line">
<div className="label">{getLabel(111, "状态:")}</div>
<div className="value">{getLabel(111, "申报成功,已缴款")}</div>
</div>
<div className="line">
<div className="label">{getLabel(111, "实缴金额:")}</div>
<div
className="value">{showData.payAmount} &nbsp;&nbsp;&nbsp;&nbsp; {parseFloat(showData.otherAmount) > 0 ? `(含滞纳金等{${showData.otherAmount}元)` : ""} </div>
</div>
<div className="line">
<div className="label">{getLabel(111, "申报人数:")}</div>
<div className="value">{showData.personNum} </div>
</div>
</div>
</WeaDialog>
);
}
}
export default PaymentFeedBackDetail;

View File

@ -0,0 +1,158 @@
/*
* Author: 黎永顺
* name: 在线申报-缴款反馈按钮
* Description:
* Date: 2023/8/22
*/
import React, { Component } from "react";
import { WeaLocaleProvider } from "ecCom";
import { Button, message } from "antd";
import { inject, observer } from "mobx-react";
import PaymentDialog from "./paymentDialog";
import PaymentFeedBackDetail from "./paymentFeedBackDetail";
import { paymentFeedbackConditions } from "./constants";
import { getQueryString } from "../../../util/url";
import { taxPaymentAgreementPayFeedback } from "../../../apis/declare";
const { getLabel } = WeaLocaleProvider;
@inject("declareStore")
@observer
class PaymentFeedbackBtn extends Component {
constructor(props) {
super(props);
this.state = {
paymentDialog: {
visible: false, title: "",
buttons: [], conditions: null
},
paymentFeedbackDialog: {
visible: false, title: "", showData: {}
},
loading: false
};
}
getFeedback = () => {
const { declareStore: { paymentForm } } = this.props;
paymentForm.validateForm().then(f => {
const { type } = paymentForm.getFormParams();
if (f.isValid) {
if (type === "WITHHOLDING_PAY") {
// 三方缴款 弹窗,打印新开页面
this.taxPaymentAgreementPayFeedback();
} else {
}
} else {
f.showErrors();
}
});
};
taxPaymentAgreementPayFeedback = () => {
const { taxCycle: taxYearMonth, taxAgentId } = this.props.declareInfo;
const payload = {
taxDeclareRecordId: getQueryString("id"),
taxAgentId, taxYearMonth
};
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={true}>{getLabel(111, "获取反馈")}</Button>
]
}
});
taxPaymentAgreementPayFeedback(payload).then(({ status, data, errormsg }) => {
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={false} onClick={this.getFeedback}>{getLabel(111, "获取反馈")}</Button>
]
}
});
if (status) {
this.handleCancel();
this.setState({
paymentFeedbackDialog: {
...this.state.paymentFeedbackDialog,
visible: true, title: getLabel(111, "三方缴款详情"),
showData: data
}
});
} else {
message.error(errormsg || getLabel(111, "缴款反馈失败!"));
}
}).catch(() => {
this.setState({
paymentDialog: {
...this.state.paymentDialog,
buttons: [
<Button type="primary" loading={false} onClick={this.getFeedback}>{getLabel(111, "获取反馈")}</Button>
]
}
});
});
};
handlePaymentFeedback = () => {
const { paymentDialog } = this.state;
this.setState({
paymentDialog: {
...paymentDialog, visible: true,
title: getLabel(111, "获取反馈"),
buttons: [
<Button type="primary" onClick={this.getFeedback}>{getLabel(111, "获取反馈")}</Button>
],
conditions: _.map(paymentFeedbackConditions, item => {
return {
...item,
items: _.map(item.items, it => {
return {
...it,
options: [
{ key: "WITHHOLDING_PAY", showname: getLabel(111, "三方缴款") },
{ key: "WITHHOLDING_VOUCHER", showname: getLabel(111, "缴款凭证打印") }
]
};
})
};
})
}
});
};
handleCancel = () => {
const { paymentDialog } = this.state;
this.setState({
paymentDialog: {
...paymentDialog, visible: false,
title: "", buttons: [], conditions: null
}
});
};
render() {
const { paymentDialog, paymentFeedbackDialog } = this.state;
return (
<React.Fragment>
<Button type="ghost" onClick={this.handlePaymentFeedback}>{getLabel(111, "缴款反馈")}</Button>
<PaymentDialog
{...paymentDialog}
onCancel={this.handleCancel}
/>
<PaymentFeedBackDetail
{...paymentFeedbackDialog}
onCancel={() => {
this.setState({
paymentFeedbackDialog: {
...paymentFeedbackDialog,
visible: false, title: "", showData: {}
}
}, () => this.props.updateDeclare());
}}
/>
</React.Fragment>
);
}
}
export default PaymentFeedbackBtn;

View File

@ -47,6 +47,10 @@ class TaxDeclarationInfo extends Component {
return <div className="info-item">
<span className="label">{item["label"]}</span>
<span className="value">{declareInfo[item["key"]]}</span>
{
item.key === "taxPaidAmount" &&
<span className="value">{getLabel(111, "元")}</span>
}
</div>;
})
}

View File

@ -8,25 +8,48 @@ import React, { Component } from "react";
import { WeaLocaleProvider, WeaTab, WeaTable } from "ecCom";
import { Button, message } from "antd";
import TaxDeclarationInfo from "./components/taxDeclarationInfo";
import { apiflowBillingConfigStatus } from "../../apis/intelligentCalculateSalarySettings";
import PaymentBtn from "./components/paymentBtn";
import PaymentFeedbackBtn from "./components/paymentFeedbackBtn";
import {
getDeclareInfo,
getDetailList,
getTaxDeclarationTab,
taxdeclaratioGetCancelFeedback,
taxdeclarationDeclare,
taxdeclarationGetDeclareFeedback,
taxdeclarationGetRate,
taxdeclarationRefreshData
taxdeclarationRefreshData,
taxdeclaratioUpdateCancel,
taxdeclaratioUpdateDeclare,
taxPaymentVoucherStatusSync,
taxPaymentWithheldVoucherGet
} from "../../apis/declare";
import { getQueryString } from "../../util/url";
import { convertToUrlString, getQueryString } from "../../util/url";
import "./index.less";
const { getLabel } = WeaLocaleProvider;
const APIFox = {
refresh: taxdeclarationRefreshData, //刷新数据
declare: taxdeclarationDeclare, //在线申报
feedback: taxdeclarationGetDeclareFeedback,//申报反馈
correct: taxdeclaratioUpdateDeclare,//更正申报
cancel: taxdeclaratioUpdateCancel,//作废申报
cancelFeedback: taxdeclaratioGetCancelFeedback//作废反馈
};
class Index extends Component {
constructor(props) {
super(props);
this.state = {
tabs: [], selectedKey: "", columns: [], dataSource: [],
loading: { query: false, refresh: false, declare: false },
loading: {
query: false, refresh: false, declare: false, feedback: false,
correct: false, cancel: false, cancelFeedback: false, refreshingPay: false,
issuance: false
},
intelCalcSalaryStatus: false, //智能算薪 总开关是否开启
declareInfo: {}, pageInfo: { current: 0, pageSize: 10, total: 0 }
};
this.timer = null;
@ -37,16 +60,18 @@ class Index extends Component {
}
init = async () => {
const [tabsResult, infoResult] = await Promise.all([this.getTaxDeclarationTab(), this.getDeclareInfo()]);
const [tabsResult, infoResult, calcResult] = await Promise.all([this.getTaxDeclarationTab(), this.getDeclareInfo(), this.apiflowBillingConfigStatus()]);
const { data: tabDataSource, status: tabStatus } = tabsResult;
const { data: infoDataSource, status: infoStatus } = infoResult;
const { data: calcSalaryStatus, status: calcStatus } = calcResult;
this.setState({
tabs: tabStatus ? _.map(tabDataSource, it => ({
viewcondition: `${it.incomeCategory}%%${it.taxDeclarationId}`,
title: it.tabName
})) : this.state.tabs,
selectedKey: tabStatus ? `${_.take(tabDataSource)[0].incomeCategory}%%${_.take(tabDataSource)[0].taxDeclarationId}` : this.state.selectedKey,
declareInfo: infoStatus ? infoDataSource : this.state.declareInfo
declareInfo: infoStatus ? infoDataSource : this.state.declareInfo,
intelCalcSalaryStatus: calcStatus && calcSalaryStatus
});
this.getDetailList();
};
@ -64,6 +89,9 @@ class Index extends Component {
getDeclareInfo = () => {
return getDeclareInfo({ id: getQueryString("id") });
};
apiflowBillingConfigStatus = () => {
return apiflowBillingConfigStatus();
};
taxdeclarationGetRate = (index) => {
return taxdeclarationGetRate({ index });
};
@ -91,84 +119,116 @@ class Index extends Component {
}
}).catch(() => this.setState({ loading: { ...loading, query: false } }));
};
taxdeclarationRefreshData = () => {
this.setState({ loading: { ...this.state.loading, refresh: true } });
taxdeclarationRefreshData({ taxDeclareRecordId: getQueryString("id") }).then(async ({ status, data, errormsg }) => {
this.setState({ loading: { ...this.state.loading, refresh: false } });
if (status) {
message.destroy();
message.loading(getLabel(111, "刷新中..."), 0);
this.timer = setInterval(async () => {
const { status: resStatus, data: result } = await this.taxdeclarationGetRate(data);
const { status: rateStatus, finish, msg } = result;
if (resStatus && rateStatus) {
if (finish) {
handleOperateDeclare = (type) => {
const loadingTxt = {
refresh: getLabel(111, "刷新中..."), //刷新数据
declare: getLabel(111, "申报中..."), //在线申报
feedback: getLabel(111, "反馈中..."),//申报反馈
correct: getLabel(111, "更正申报中..."),//更正申报
cancel: getLabel(111, "作废申报中..."),//作废申报
cancelFeedback: getLabel(111, "作废反馈中...")//作废反馈
}, successTxt = {
refresh: getLabel(111, "刷新数据成功!"), //刷新数据
declare: getLabel(111, "在线申报成功!"), //在线申报
feedback: getLabel(111, "申报反馈成功!"),//申报反馈
correct: getLabel(111, "更正申报成功!"),//更正申报
cancel: getLabel(111, "作废申报成功!"),//作废申报
cancelFeedback: getLabel(111, "作废反馈成功!")//作废反馈
}, failTxt = {
refresh: getLabel(111, "刷新数据失败!"), //刷新数据
declare: getLabel(111, "在线申报失败!"), //在线申报
feedback: getLabel(111, "申报反馈失败!"),//申报反馈
correct: getLabel(111, "更正申报失败!"),//更正申报
cancel: getLabel(111, "作废申报失败!"),//作废申报
cancelFeedback: getLabel(111, "作废反馈失败!")//作废反馈
};
this.setState({ loading: { ...this.state.loading, [type]: true } });
APIFox[type]({ taxDeclareRecordId: getQueryString("id") })
.then(async ({ status, data, errormsg }) => {
if (status) {
message.destroy();
message.loading(loadingTxt[type], 0);
this.timer = setInterval(async () => {
const { status: resStatus, data: result } = await this.taxdeclarationGetRate(data);
const { status: rateStatus, finish, msg } = result;
if (resStatus && rateStatus) {
if (finish) {
this.setState({ loading: { ...this.state.loading, [type]: false } });
clearInterval(this.timer);
message.destroy();
message.success(successTxt[type]);
const promise = type === "refresh" ? await this.init() : await this.declare();
}
} else {
this.setState({ loading: { ...this.state.loading, [type]: false } });
clearInterval(this.timer);
message.destroy();
message.success(getLabel(111, "刷新数据成功!"));
const promise = this.init();
message.warning(msg || failTxt[type]);
const promise = type === "refresh" ? await this.init() : await this.declare();
}
} else {
clearInterval(this.timer);
message.destroy();
message.warning(msg || getLabel(111, "刷新数据失败!"));
const promise = this.init();
}
}, 1000);
} else {
clearInterval(this.timer);
message.destroy();
message.warning(errormsg);
}
}).catch(() => {
}, 1000);
} else {
this.setState({ loading: { ...this.state.loading, [type]: false } });
clearInterval(this.timer);
message.destroy();
message.warning(errormsg);
}
}).catch(() => {
message.destroy();
clearInterval(this.timer);
this.setState({ loading: { ...this.state.loading, refresh: false } });
this.setState({ loading: { ...this.state.loading, [type]: false } });
});
};
taxdeclarationDeclare = () => {
this.setState({ loading: { ...this.state.loading, declare: true } });
taxdeclarationDeclare({ taxDeclareRecordId: getQueryString("id") }).then(async ({ status, data, errormsg }) => {
this.setState({ loading: { ...this.state.loading, declare: false } });
taxPaymentVoucherStatusSync = () => {
const { taxAgentId, taxCycle: taxYearMonth } = this.state.declareInfo;
const payload = {
taxDeclareRecordId: getQueryString("id"),
taxAgentId, taxYearMonth
};
this.setState({ loading: { ...this.state.loading, refreshingPay: true } });
taxPaymentVoucherStatusSync(payload).then(({ status, errormsg }) => {
this.setState({ loading: { ...this.state.loading, refreshingPay: false } });
if (status) {
message.destroy();
message.loading(getLabel(111, "申报中..."), 0);
this.timer = setInterval(async () => {
const { status: resStatus, data: result } = await this.taxdeclarationGetRate(data);
const { status: rateStatus, finish, msg } = result;
if (resStatus && rateStatus) {
if (finish) {
clearInterval(this.timer);
message.destroy();
message.success(getLabel(111, "在线申报成功!"));
const promise = this.declare();
}
} else {
clearInterval(this.timer);
message.destroy();
message.warning(msg || getLabel(111, "在线申报失败!"));
const promise = this.declare();
}
}, 1000);
message.success(getLabel(111, "刷新成功!"));
const promise = this.declare();
} else {
clearInterval(this.timer);
message.destroy();
message.warning(errormsg);
message.error(errormsg || getLabel(111, "刷新失败!"));
}
}).catch(() => {
message.destroy();
clearInterval(this.timer);
this.setState({ loading: { ...this.state.loading, declare: false } });
});
}).catch(() => this.setState({ loading: { ...this.state.loading, refreshingPay: false } }));
};
getEnterprisePayCertificate = () => {
const { taxAgentId, taxCycle: taxYearMonth } = this.state.declareInfo;
const payload = {
taxDeclareRecordId: getQueryString("id"),
taxAgentId, taxYearMonth
};
this.setState({ loading: { ...this.state.loading, issuance: true } });
taxPaymentWithheldVoucherGet(payload).then(({ status, data, errormsg }) => {
this.setState({ loading: { ...this.state.loading, issuance: false } });
if (status && !_.isEmpty(data.vouchers)) {
window.open(`${window.ecologyContentPath || ""}/spa/hrmSalary/static/index.html#/main/hrmSalary/enterprisePayCertificationDetail?${convertToUrlString(payload)}`);
} else {
message.error(errormsg || "");
}
}).catch(() => this.setState({ loading: { ...this.state.loading, issuance: false } }));
};
render() {
const { tabs, selectedKey, columns, pageInfo, dataSource, loading, declareInfo } = this.state;
const {
tabs,
selectedKey,
columns,
pageInfo,
dataSource,
loading,
declareInfo,
intelCalcSalaryStatus
} = this.state;
let btns = [
<Button type="primary">{getLabel(17416, "导出")}</Button>,
<Button type="ghost" onClick={this.taxdeclarationDeclare}
<Button type="ghost" onClick={() => this.handleOperateDeclare("declare")}
loading={loading.declare}>{getLabel(111, "在线申报")}</Button>,
<Button type="ghost" onClick={this.taxdeclarationRefreshData}
<Button type="ghost" onClick={() => this.handleOperateDeclare("refresh")}
loading={loading.refresh}>{getLabel(111, "刷新数据")}</Button>
];
const pagination = {
@ -188,8 +248,54 @@ class Index extends Component {
}, () => this.getDetailList());
}
};
//申报状态:作废中
declareInfo.declareStatus === "DECLARE_CANCELLING" && (btns.splice(1, 2, <Button
type="ghost" loading={loading.cancelFeedback}
onClick={() => this.handleOperateDeclare("cancelFeedback")}>{getLabel(111, "作废反馈")}</Button>));
//申报状态:申报中
declareInfo.declareStatus === "DECLARING" && (btns.splice(1, 2, <Button
type="ghost">{getLabel(111, "申报反馈")}</Button>));
type="ghost" loading={loading.feedback}
onClick={() => this.handleOperateDeclare("feedback")}>{getLabel(111, "申报反馈")}</Button>));
//申报状态:缴款中
declareInfo.declareStatus === "DECLARE_SUCCESS_PAYING" && (btns.splice(1, 2));
//申报状态:已缴款
declareInfo.declareStatus === "DECLARE_SUCCESS_PAID" && (btns.splice(1, 2,
<Button type="ghost" loading={loading.correct}
onClick={() => this.handleOperateDeclare("correct")}>{getLabel(111, "更正申报")}</Button>));
//申报状态:申报成功,无需缴款
declareInfo.declareStatus === "DECLARE_SUCCESS_NO_PAY" &&
(btns.splice(1, 2,
<Button type="ghost" loading={loading.correct}
onClick={() => this.handleOperateDeclare("correct")}>{getLabel(111, "更正申报")}</Button>,
<Button type="ghost"
loading={loading.cancel}
onClick={() => this.handleOperateDeclare("cancel")}>{getLabel(111, "作废申报")}</Button>
));
//申报状态:申报成功,未缴款
declareInfo.declareStatus === "DECLARE_SUCCESS_UNPAID" &&
(btns.splice(1, 2,
<Button type="ghost" loading={loading.correct}
onClick={() => this.handleOperateDeclare("correct")}>{getLabel(111, "更正申报")}</Button>,
<Button type="ghost"
loading={loading.cancel}
onClick={() => this.handleOperateDeclare("cancel")}>{getLabel(111, "作废申报")}</Button>,
<Button type="ghost"
loading={loading.refreshingPay}
onClick={this.taxPaymentVoucherStatusSync}>{getLabel(111, "刷新缴款状态")}</Button>
));
if (!intelCalcSalaryStatus) {
if (["NOT_DECLARE", "DECLARE_FAIL"].includes(declareInfo.declareStatus)) {
btns.splice(1, 1);
}
}
if (intelCalcSalaryStatus && (declareInfo.declareStatus === "DECLARE_SUCCESS_UNPAID")) {
btns.push(<PaymentBtn declareInfo={declareInfo}/>, <PaymentFeedbackBtn declareInfo={declareInfo}
updateDeclare={this.declare}/>);
}
if (intelCalcSalaryStatus && declareInfo.taxPaidAmount && parseFloat(declareInfo.taxPaidAmount) > 0) {
btns.push(<Button type="ghost" loading={loading.issuance}
onClick={this.getEnterprisePayCertificate}>{getLabel(111, "开具企业完税证明")}</Button>);
}
return (
<div className="declareDetail-layout">
<TaxDeclarationInfo declareInfo={declareInfo}/>

View File

@ -113,3 +113,64 @@
}
}
.paymentDialog {
.ant-modal-title {
.text-elli {
color: #111;
font-weight: 700;
}
}
.paymentDialogContent {
padding: 16px 25px;
background: #f6f6f6;
.wea-search-group {
border: 1px solid #e5e5e5;
padding: 0;
border-bottom: none;
.ant-row, .ant-col-24 {
padding: 0;
}
.wea-form-item {
padding: 5px 16px;
background: #fff;
border-bottom: 1px solid #e5e5e5;
}
}
}
.with-holding-pay-detail {
display: flex;
flex-direction: column;
padding: 16px;
& > div {
line-height: 32px;
}
.status {
height: 32px;
display: flex;
align-items: center;
justify-content: center;
color: #8ED36E;
}
.line {
display: flex;
height: 32px;
align-items: center;
.label {
width: 30%;
flex-grow: 0;
flex-shrink: 0;
}
}
}
}

View File

@ -119,7 +119,7 @@ class Index extends Component {
} else if (type === "turn") {
if (id === "PAGEINFO") {
const { pageNum: current, size: pageSize } = params;
this.setState({ pageInfo: { ...pageInfo, current, pageSize } });
this.setState({ pageInfo: { ...this.state.pageInfo, current, pageSize } });
} else if (id === "EDIT") {
this.setState({
declareEditDialog: {

View File

@ -0,0 +1,58 @@
/*
* Author: 黎永顺
* name: 在线申报-个税开具证明查看页面
* Description:
* Date: 2023/8/23
*/
import React, { Component } from "react";
import { message } from "antd";
import { getQueryString } from "../../util/url";
import { taxPaymentWithheldVoucherGet } from "../../apis/declare";
class Index extends Component {
constructor(props) {
super(props);
this.state = {
loading: false,
dataSource: []
};
}
componentDidMount() {
this.getEnterprisePayCertificate();
}
getEnterprisePayCertificate = () => {
const payload = {
taxDeclareRecordId: getQueryString("taxDeclareRecordId"),
taxAgentId: getQueryString("taxAgentId"),
taxYearMonth: getQueryString("taxYearMonth")
};
this.setState({ loading: true });
taxPaymentWithheldVoucherGet(payload).then(({ status, data, errormsg }) => {
this.setState({ loading: false });
if (status && !_.isEmpty(data.vouchers)) {
this.setState({
dataSource: data.vouchers
});
} else {
message.error(errormsg || "");
}
}).catch(() => this.setState({ loading: false }));
};
render() {
const { dataSource, loading } = this.state;
return (
<div style={{ width: "100%", height: "100%" }}>
{
!_.isEmpty(dataSource) &&
<iframe src={`data:application/pdf;base64,${dataSource[0].content}`}
style={{ border: 0, width: "100%", height: "100%" }}/>
}
</div>
);
}
}
export default Index;

View File

@ -7,6 +7,9 @@ import * as API from "../apis/declare"; // 引入API接口文件
const { TableStore } = WeaTableNew;
export class DeclareStore {
@observable paymentForm = new WeaForm(); // declareDetail----在线申报-缴款Form
@observable tableStore = new TableStore(); // new table
@observable form = new WeaForm(); // nrew 一个form
@observable condition = []; // 存储后台得到的form数据
@ -26,6 +29,7 @@ export class DeclareStore {
@observable datailColumns = [];
@observable detailPageInfo = {};
@action changePaymentForm = () => this.paymentForm = new WeaForm();
@action setPageinfo = pageinfo => this.pageInfo = pageinfo;
// 初始化操作
@action