salary-management-front/pc4mobx/hrmSalary/pages/dataAcquisition/otherDeduct/index.js

563 lines
19 KiB
JavaScript
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.

/*
* Author: 黎永顺
* name: 其他免税扣除
* Description:
* Date: 2023/2/21
*/
import React, { Component } from "react";
import { inject, observer } from "mobx-react";
import { WeaLocaleProvider, WeaSearchGroup, WeaTools } from "ecCom";
import { Button, Dropdown, Menu, message, Modal } from "antd";
import {
createData,
deleteAllData,
deleteSelectData,
editData,
extendToLastMonth,
getData,
getOtherDeductSaCondition,
importOtherDeductionParam,
importOtherDeductionPreview
} from "../../../apis/otherDeduct";
import { removePropertyCondition } from "../../../util/response";
import DataTables from "../dataTables";
import Layout from "../layout";
import moment from "moment";
import ImportFormCom from "../cumDeduct/components/importFormCom";
import { DataCollectionDatePicker, DataCollectionSelect } from "../cumDeduct";
import { dataCollectCondition } from "./columns";
import AddItems from "../addItems";
import TableRecord from "../components/tableRecord";
import { convertToUrlString } from "../../../util/url";
import { getDomkes } from "../../../util";
import TaxSetDialog from "./taxSetDialog";
const getKey = WeaTools.getKey;
const getLabel = WeaLocaleProvider.getLabel;
@inject("taxAgentStore", "otherDeductStore")
@observer
class Index extends Component {
constructor(props) {
super(props);
this.state = {
declareMonth: moment(new Date()).format("YYYY-MM"),
taxAgentId: "",
innerWidth: window.innerWidth,
lastLoading: false,
saveLoading: false,
slidePayload: {
visible: false,
title: "",
children: null,
data: {}
},
importPayload: {
visible: false,
importOpts: {
declareMonth: moment(new Date()).format("YYYY-MM")
},
importFormComponent: null,
templateLink: "/api/bs/hrmsalary/otherDeduction/downloadTemplate",
importResult: {},
previewUrl: "/api/bs/hrmsalary/otherDeduction/preview"
},
exportPayloadUrl: "",
exportPayloadType: false,
advanceCondition: null,
targetid: "",
taxSetDialog: { visible: false, dataType: "", id: "" }
};
this.tableRef = null;
this.addItemRef = null;
this.tableRecordRef = null;
}
componentDidMount() {
this.getAdvanceCondition();
}
/*
* Author: 黎永顺
* Description: 高级搜素框-表单项
* Params:
* Date: 2023/2/20
*/
getAdvanceCondition = () => {
const { otherDeductStore: { form } } = this.props;
getOtherDeductSaCondition().then(({ status, data }) => {
if (status) {
this.setState({ advanceCondition: removePropertyCondition(data.condition) });
form.initFormFields(removePropertyCondition(data.condition));
}
});
};
/*
* Author: 黎永顺
* Description: 沿用上月
* Params:
* Date: 2023/2/21
*/
extendToLastMonth = () => {
const { declareMonth, taxAgentId } = this.state;
const payload = { declareMonth, taxAgentId };
this.setState({ lastLoading: true });
extendToLastMonth(payload).then(({ status, data, errormsg }) => {
this.setState({ lastLoading: false });
if (status) {
message.success(data || "操作成功");
this.tableRef.getTableDate();
} else {
message.error(errormsg || "操作失败");
}
}).catch(() => this.setState({ lastLoading: false }));
};
/*
* Author: 黎永顺
* Description: 数据采集-信息保存
* Params:
* Date: 2023/2/20
*/
handleSaveDeduction = (payload) => {
const { slidePayload } = this.state;
const { data } = slidePayload;
const { id } = data;
this.setState({ saveLoading: true });
if (!_.isEmpty(data)) {
editData({ ...payload, id }).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("编辑成功");
this.handleCloseSlide();
this.tableRef.getTableDate();
} else {
message.error(errormsg || "编辑失败");
}
});
} else {
createData(payload).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("新增成功");
this.handleCloseSlide();
this.tableRef.getTableDate();
} else {
message.error(errormsg || "新增失败");
}
});
}
};
/*
* Author: 黎永顺
* Description: 导入数据采集-数据查看
* Params:
* Date: 2023/2/20
*/
handlePreviewImport = (params) => {
importOtherDeductionPreview(params).then(({ status, data, errormsg }) => {
if (status) {
const { preview = [] } = data;
const { importPayload } = this.state;
this.setState({
importPayload: { ...importPayload, slideDataSource: preview }
});
} else {
message.error(errormsg || "预览失败");
}
});
};
/*
* Author: 黎永顺
* Description:列表操作
* Params:
* Date: 2023/2/20
*/
handleTableOperate = ({ key }, record) => {
const { id } = record;
key === "handleAddData" ? getData({ id }).then(({ status, data }) => {
if (status) this[key]("编辑", data);
}) : key === "log" ? this.setState({ targetid: id }) : this.deleteSelectData(record);
};
/*
* Author: 黎永顺
* Description: 一键清空
* Params:
* Date: 2023/2/20
*/
deleteAllData = () => {
const { declareMonth, taxAgentId } = this.state;
const payload = { declareMonth, taxAgentId };
Modal.confirm({
title: "信息确认",
content: `确定清空税款所属期为${declareMonth}的所有其他免税扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
deleteAllData(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
this.tableRef.getTableDate();
} else {
message.error(errormsg || "删除失败");
}
});
}
});
};
/*
* Author: 黎永顺
* Description: 删除所选
* Params:
* Date: 2023/2/20
*/
deleteSelectData = (record = {}) => {
const { declareMonth } = this.state;
const { selectedRowKeys: ids } = this.tableRef.state;
const { id, departmentName, username } = record;
if (ids.length === 0 && !id) {
message.warning("请选择表格数据");
return;
}
const payload = { declareMonth, ids: !id ? ids : [id] };
Modal.confirm({
title: "信息确认",
content: !id ? "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。" :
`确定删除${departmentName}${username}(税款所属期:${declareMonth})的其他免税扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
deleteSelectData(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
this.tableRef.getTableDate();
this.tableRef.handleClearRows();
} else {
message.error(errormsg || "删除失败");
}
});
}
});
};
/*
* Author: 黎永顺
* Description:数据采集-导出全部
* Params:
* Date: 2023/2/20
*/
handleExportAll = () => {
const { otherDeductStore: { form } } = this.props;
const { declareMonth, taxAgentId, exportPayloadType } = this.state;
this.setState({
exportPayloadType: !exportPayloadType,
exportPayloadUrl: `${window.location.origin}/api/bs/hrmsalary/otherDeduction/export?ids=&declareMonth=${declareMonth}&taxAgentId=${taxAgentId}&${convertToUrlString(form.getFormParams())}`
});
};
/*
* Author: 黎永顺
* Description:数据采集-导出选中
* Params:
* Date: 2023/2/20
*/
handleExportSelect = () => {
const { selectedRowKeys: ids } = this.tableRef.state;
const { declareMonth, taxAgentId, exportPayloadType } = this.state;
if (ids.length === 0) {
message.warning("请选择需要导出的数据");
return;
}
this.setState({
exportPayloadType: !exportPayloadType,
exportPayloadUrl: `${window.location.origin}/api/bs/hrmsalary/otherDeduction/export?ids=${ids.join(",")}&declareMonth=${declareMonth}&taxAgentId=${taxAgentId}`
});
};
/*
* Author: 黎永顺
* Description:新增数据采集-累计专项附加扣除
* Params: screenParams规则日期必须放在数组最后一位人员信息必须第一位
* Date: 2023/2/20
*/
handleAddData = (title = "新建", editId = {}) => {
const { taxAgentStore, otherDeductStore: { addForm } } = this.props;
const { slidePayload } = this.state;
const { taxAgentOption } = taxAgentStore;
const conditions = _.map(dataCollectCondition, (it, idx) => {
if (idx === 0) {
return {
...it, title: getLabel(82743, "基础信息"),
items: _.map(it.items, o => {
if (getKey(o) === "taxAgentId") {
return {
...o, label: getLabel(o.lanId, o.label),
options: taxAgentOption, viewAttr: _.isEmpty(editId) ? 3 : 1
};
}
return {
...o, label: getLabel(o.lanId, o.label), viewAttr: _.isEmpty(editId) ? 3 : 1
};
})
};
} else if (idx === 1) {
return {
...it, title: getLabel(83871, "数据采集"),
items: _.map(it.items, o => ({
...o, label: getLabel(o.lanId, o.label),
extraDom: !_.isEmpty(editId) &&
<a href="javascript:void(0);" className="extra_tax" title={getLabel(111, "添加附表")}
onClick={() => this.setState({
taxSetDialog: {
visible: true, dataType: o.dataType, id: editId.id,
label: getLabel(o.lanId, o.label)
}
})}>
<i className="icon-coms02-Preview-1"/>
</a>
}))
};
}
});
addForm.initFormFields(conditions);
this.setState({
slidePayload: {
...slidePayload,
visible: true,
title,
data: editId,
children: title.length <= 2 ?
<AddItems
ref={(dom) => this.addItemRef = dom}
taxAgentOption={taxAgentOption}
form={addForm}
editId={editId}
condition={conditions}
/> :
<TableRecord
ref={(dom) => this.tableRecordRef = dom}
className="accumulated"
taxAgentOption={taxAgentOption}
url="/api/bs/hrmsalary/otherDeduction/getDetailList"
record={editId}
screenParams={["otherTaxExemptDeductionId", "taxAgentId", "declareMonth"]}
/>
}
});
};
/*
* Author: 黎永顺
* Description: 顶部操作按钮
* Params:
* Date: 2023/2/17
*/
getTopBtns = () => {
const { lastLoading } = this.state;
return [
<Button type="primary" onClick={this.handleOpenImport}>导入</Button>,
<Button type="ghost" onClick={() => this.handleAddData()}>新建</Button>,
<Button type="ghost" loading={lastLoading} onClick={this.extendToLastMonth}>沿用上月</Button>,
<Dropdown
overlay={
<Menu className="dropdownMenuWrapper" onClick={this.handleDataMenuClick}>
<Menu.Item key="deleteSelectData">批量删除</Menu.Item>
<Menu.Item key="deleteAllData">一键清空</Menu.Item>
<Menu.Item key="handleExportSelect">导出选中</Menu.Item>
<Menu.Item key="handleExportAll">导出全部</Menu.Item>
</Menu>
}
>
<Button type="ghost">更多</Button>
</Dropdown>
];
};
handleDataMenuClick = ({ key: keyFunc }) => this[keyFunc]();
/*
* Author: 黎永顺
* Description: 筛选组件
* Params:
* Date: 2023/2/17
*/
getScreen = () => {
const { taxAgentStore: { taxAgentOption } } = this.props;
const { declareMonth, taxAgentId, innerWidth } = this.state;
const items = [
{
com: DataCollectionDatePicker({
label: "税款所属期",
value: declareMonth,
onChange: this.screenChange,
key: "declareMonth",
tip: "提示:默认显示当前月所有员工申报的其他免税扣除额"
})
},
{
com: DataCollectionSelect({
label: "个税扣缴义务人",
value: taxAgentId,
onChange: this.screenChange,
options: [{ key: "", showname: "全部" }, ...taxAgentOption],
key: "taxAgentId"
})
}
];
return <WeaSearchGroup className="screenWrapper" showGroup needTigger={false} items={items}
col={innerWidth < 900 ? 1 : 2}/>;
};
screenChange = ({ key, value }) => {
const { otherDeductStore: { form } } = this.props;
this.setState({ [key]: value }, () => this.tableRef.getTableDate({ ...form.getFormParams(), current: 1 }));
};
handleCloseSlide = () => {
const { slidePayload } = this.state;
this.setState({
slidePayload: {
...slidePayload,
visible: false,
title: "",
children: null,
data: {}
}
});
this.tableRecordRef && this.tableRecordRef.handleResetSelectKeys();
this.handleDebounce = null;
this.props.otherDeductStore.initAddForm();
};
handleSaveData = () => {
const { otherDeductStore: { addForm }, taxAgentStore: { taxAgentOption } } = this.props;
addForm.validateForm().then(f => {
if (f.isValid) {
const payload = {
..._.reduce(getDomkes(dataCollectCondition), (pre, cur) => ({ ...pre, [cur]: "" }), {}),
...addForm.getFormParams(),
taxAgentName: _.find(taxAgentOption, it => it.key === addForm.getFormParams().taxAgentId).showname
};
this.handleSaveDeduction(payload);
} else {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
}
});
};
handleAdSearch = () => {
const { otherDeductStore: { form } } = this.props;
this.tableRef.getTableDate({ ...form.getFormParams(), current: 1 });
};
handleResize = (innerWidth) => this.setState({ innerWidth });
/*
* Author: 黎永顺
* Description: 数据采集-导入相关
* Params:
* Date: 2023/2/20
*/
handleOpenImport = () => {
const { importPayload } = this.state;
const { importOpts } = importPayload;
this.setState({
importPayload: {
...importPayload,
visible: true, step: 0,
importResult: {}, slideDataSource: [],
importFormComponent: <ImportFormCom {...importOpts} onChangeImportForm={this.handleChangeImportForm}/>
}
});
};
handleCloseImport = (doSearch = false) => {
const { importPayload } = this.state;
this.setState({
importPayload: {
...importPayload, visible: false, importFormComponent: null, step: 0,
importOpts: {
declareMonth: moment(new Date()).format("YYYY-MM")
}, importResult: {}, slideDataSource: []
}
}, () => doSearch && this.tableRef.getTableDate());
};
handleChangeImportForm = (key, value) => {
const { importPayload } = this.state;
const { importOpts } = importPayload;
this.setState({
importPayload: { ...importPayload, importOpts: { ...importOpts, [key]: value } }
});
};
/*
* Author: 黎永顺
* Description:详情页面-操作按钮
* Params:
* Date: 2023/2/20
*/
getDetailOptBtns = () => {
return [
<Dropdown.Button onClick={this.handleExportAllDetail}
overlay={<Menu
onClick={this.handleExportSelectDetail}>
<Menu.Item key="1">导出选中</Menu.Item>
</Menu>}
type="primary">
导出全部
</Dropdown.Button>
];
};
/*
* Author: 黎永顺
* Description: 导出详情数据
* Params:
* Date: 2023/2/21
*/
handleExportDetail = (url) => {
if (!this.handleDebounce) {
this.handleDebounce = _.debounce(() => {
window.open(`${window.location.origin}/api/bs/hrmsalary/otherDeduction/exportDetail${url}`, "_self");
this.handleDebounce = null;
}, 500);
}
this.handleDebounce();
};
handleExportSelectDetail = () => {
const { selectedRowKeys: ids, recordPayload } = this.tableRecordRef.state;
if (ids.length === 0) {
message.warning("请选择需要导出的数据");
return;
}
const exportParams = _.reduce(_.keys(_.omitBy(recordPayload, it => !it)), (pre, cur) => pre + `${pre && "&"}${cur}=${recordPayload[cur]}`, "");
const payload = `?${exportParams}&ids=${ids.join(",")}`;
this.handleExportDetail(payload);
};
handleExportAllDetail = () => {
const { recordPayload } = this.tableRecordRef.state;
const exportParams = _.reduce(_.keys(_.omitBy(recordPayload, it => !it)), (pre, cur) => pre + `${pre && "&"}${cur}=${recordPayload[cur]}`, "");
const payload = `?${exportParams}&ids=`;
this.handleExportDetail(payload);
};
render() {
const { taxAgentStore: { showOperateBtn }, otherDeductStore: { form } } = this.props;
const {
declareMonth, taxAgentId, slidePayload, saveLoading, exportPayloadUrl, advanceCondition,
importPayload, exportPayloadType, targetid, taxSetDialog
} = this.state;
const tablePayload = { declareMonth: [declareMonth], taxAgentId };
return (
<Layout title="其他免税扣除" btns={this.getTopBtns()} leftComp={this.getScreen()}
onResizeWindowInnerWidth={this.handleResize} slidePayload={slidePayload}
onClose={this.handleCloseSlide} onSave={this.handleSaveData}
slideLoading={saveLoading} exportPayloadUrl={exportPayloadUrl}
exportPayloadType={exportPayloadType} logFunction="otherdeduction"
form={form} condition={advanceCondition} onAdSearch={this.handleAdSearch}
onCancel={this.handleCloseImport} importPayload={importPayload}
detailOptBtns={this.getDetailOptBtns()} onImportFile={importOtherDeductionParam}
targetid={targetid} onClearTargrtid={() => this.setState({ targetid: "" })}
>
<DataTables
ref={dom => this.tableRef = dom}
url="/api/bs/hrmsalary/otherDeduction/list"
payload={tablePayload}
showOperateBtn={showOperateBtn}
onTableOperate={this.handleTableOperate}
onViewDetails={(record) => this.handleAddData("其他免税扣除记录", record)}
form={form}
/>
<TaxSetDialog {...taxSetDialog}
onCancel={() => this.setState({ taxSetDialog: { ...taxSetDialog, visible: false } })}/>
</Layout>
);
}
}
export default Index;