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

538 lines
18 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 {
createAddUpSituation,
deleteAllAddUpSituation,
deleteSelectAddUpSituation,
editAddUpSituation,
getAddUpSituation,
getCumSituationSaCondition,
importCumSituationParam
} from "../../../apis/cumSituation";
import { removePropertyCondition } from "../../../util/response";
import DataTables from "../dataTables";
import Layout from "../layout";
import ImportFormCom from "../cumDeduct/components/importFormCom";
import { DataCollectionDatePicker, DataCollectionSelect } from "../cumDeduct";
import moment from "moment";
import { dataCollectCondition, taxOptions } from "./columns";
import AddItems from "../addItems";
import TableRecord from "../components/tableRecord";
import { convertToUrlString } from "../../../util/url";
import { postFetch } from "../../../util/request";
import { getDomkes } from "../../../util";
const getKey = WeaTools.getKey;
const getLabel = WeaLocaleProvider.getLabel;
@inject("taxAgentStore", "cumSituationStore")
@observer
class Index extends Component {
constructor(props) {
super(props);
this.state = {
year: moment(new Date()).format("YYYY"),
declareMonth: moment(new Date()).month() + 1 >= 10 ? (moment(new Date()).month() + 1) + "" : "0" + (moment(new Date()).month() + 1),
taxAgentId: "",
innerWidth: window.innerWidth,
addAllLoading: 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/addUpSituation/downloadTemplate",
importResult: {},
previewUrl: "/api/bs/hrmsalary/addUpSituation/preview"
},
exportPayloadUrl: "",
exportPayloadType: false,
advanceCondition: null,
targetid: "",
taxAgentOption: []
};
this.tableRef = null;
this.addItemRef = null;
this.tableRecordRef = null;
}
componentDidMount() {
this.getAdvanceCondition();
}
/*
* Author: 黎永顺
* Description: 高级搜素框-表单项
* Params:
* Date: 2023/2/20
*/
getAdvanceCondition = async () => {
const { data: authTaxAgent } = await postFetch("/api/bs/hrmsalary/taxAgent/listAuth", { filterType: "QUERY_DATA" });
const { cumSituationStore: { form } } = this.props;
getCumSituationSaCondition().then(({ status, data }) => {
if (status) {
this.setState({
advanceCondition: removePropertyCondition(data.condition),
taxAgentOption: _.map(authTaxAgent, g => ({ key: String(g.id), showname: g.name }))
});
form.initFormFields(removePropertyCondition(data.condition));
}
});
};
/*
* 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)) {
editAddUpSituation({ ...payload, id }).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("编辑成功");
this.handleCloseSlide();
this.tableRef.getTableDate();
} else {
message.error(errormsg || "编辑失败");
}
});
} else {
createAddUpSituation(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
*/
handleTableOperate = ({ key }, record) => {
const { id } = record;
key === "handleAddData" ? getAddUpSituation({ id }).then(({ status, data }) => {
if (status) this[key]("编辑", data);
}) : key === "log" ? this.setState({ targetid: id }) : this.deleteSelectAddUpSituation(record);
};
/*
* Author: 黎永顺
* Description:新增数据采集-往期累计情况(工资、薪金)
* Params: screenParams规则日期必须放在数组最后一位人员信息必须第一位
* Date: 2023/2/20
*/
handleAddData = async (title = "新建", editId = {}) => {
const { data } = await postFetch("/api/bs/hrmsalary/taxAgent/listAuth", { filterType: "ADMIN_DATA" });
const taxAgentOption = _.map(data, o => ({ key: String(o.id), showname: o.name }));
const { cumSituationStore: { addForm } } = this.props;
const { slidePayload } = this.state;
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)
}))
};
}
});
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}
isCum
editId={editId}
condition={conditions}
/> :
<TableRecord
ref={(dom) => this.tableRecordRef = dom}
className="accumulated"
taxAgentOption={taxAgentOption}
url="/api/bs/hrmsalary/addUpSituation/getDetailList"
record={editId}
screenParams={["accumulatedSituationId", "taxAgentId", "taxYearMonth"]}
/>
}
});
};
/*
* Author: 黎永顺
* Description: 一键清空
* Params:
* Date: 2023/2/20
*/
deleteAllAddUpSituation = () => {
const { declareMonth, year } = this.state;
const payload = {
taxYearMonth: year + "-" + declareMonth
};
Modal.confirm({
title: "信息确认",
content: `确定清空税款所属期为${year}-${declareMonth}的所有往期累计情况的数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
deleteAllAddUpSituation(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
this.tableRef.getTableDate();
} else {
message.error(errormsg || "删除失败");
}
});
}
});
};
/*
* Author: 黎永顺
* Description: 删除所选
* Params:
* Date: 2023/2/20
*/
deleteSelectAddUpSituation = (record = {}) => {
const { declareMonth, year } = this.state;
const { selectedRowKeys: ids } = this.tableRef.state;
const { id, departmentName, username } = record;
if (ids.length === 0 && !id) {
message.warning("请选择表格数据");
return;
}
const payload = {
taxYearMonth: year + "-" + declareMonth,
ids: !id ? ids : [id]
};
Modal.confirm({
title: "信息确认",
content: !id ? "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。" :
`确定删除${departmentName}${username}(税款所属期:${declareMonth})的往期累计情况数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
deleteSelectAddUpSituation(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 { cumSituationStore: { form } } = this.props;
const { declareMonth, taxAgentId, year, exportPayloadType } = this.state;
this.setState({
exportPayloadType: !exportPayloadType,
exportPayloadUrl: `${window.location.origin}/api/bs/hrmsalary/addUpSituation/export?ids=&year=${year}&taxYearMonth=${year}-${declareMonth}&taxAgentId=${taxAgentId}&${convertToUrlString(form.getFormParams())}`
});
};
/*
* Author: 黎永顺
* Description:数据采集-导出选中
* Params:
* Date: 2023/2/20
*/
handleExportSelect = () => {
const { selectedRowKeys: ids } = this.tableRef.state;
const { declareMonth, taxAgentId, year, exportPayloadType } = this.state;
if (ids.length === 0) {
message.warning("请选择需要导出的数据");
return;
}
this.setState({
exportPayloadType: !exportPayloadType,
exportPayloadUrl: `${window.location.origin}/api/bs/hrmsalary/addUpSituation/export?ids=${ids.join(",")}&year=${year}&taxYearMonth=${year}-${declareMonth}&taxAgentId=${taxAgentId}`
});
};
/*
* Author: 黎永顺
* Description: 顶部操作按钮
* Params:
* Date: 2023/2/17
*/
getTopBtns = () => {
const { addAllLoading } = this.state;
return [
<Button type="primary" onClick={this.handleOpenImport}>导入</Button>,
<Button type="ghost" onClick={() => this.handleAddData()}>新建</Button>,
<Dropdown
overlay={
<Menu className="dropdownMenuWrapper" onClick={this.handleDataMenuClick}>
<Menu.Item key="deleteSelectAddUpSituation">批量删除</Menu.Item>
<Menu.Item key="deleteAllAddUpSituation">一键清空</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 { declareMonth, year, taxAgentId, innerWidth, taxAgentOption } = this.state;
const items = [
{
com: DataCollectionDatePicker({
label: "纳税年度",
value: year,
onChange: this.screenChange,
key: "year",
format: "YYYY",
tip: "提示:默认显示本年截至上次所有员工的累计收入及各项累计扣除额、已预扣税额,与本月应发和各项应扣除项一起计算出本月应缴纳税额",
labelCol: 11,
wrapperCol: 13
})
},
{
com: DataCollectionSelect({
label: "税款所属期",
value: declareMonth,
onChange: this.screenChange,
options: taxOptions,
key: "declareMonth",
labelCol: 12,
wrapperCol: 12
})
},
{
com: DataCollectionSelect({
label: "个税扣缴义务人",
value: taxAgentId,
onChange: this.screenChange,
options: [{ key: "", showname: "全部" }, ...taxAgentOption],
key: "taxAgentId",
labelCol: 16,
wrapperCol: 8
})
}
];
return <WeaSearchGroup className="screenSituationWrapper" showGroup needTigger={false} items={items}
col={innerWidth < 900 ? 1 : 3}/>;
};
screenChange = ({ key, value }) => {
const { cumSituationStore: { form } } = this.props;
this.setState({ [key]: value }, () => this.tableRef.getTableDate({ ...form.getFormParams(), current: 1 }));
};
handleAdSearch = () => {
const { cumSituationStore: { form } } = this.props;
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.cumSituationStore.initAddForm();
};
handleSaveData = () => {
const { cumSituationStore: { addForm } } = this.props, { slidePayload } = this.state;
const taxAgentOption = slidePayload.children.props.taxAgentOption;
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: "必要信息不完整,红色*为必填项!"
});
}
});
};
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/addUpSituation/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 }, cumSituationStore: { form } } = this.props;
const {
declareMonth, taxAgentId, slidePayload, saveLoading, exportPayloadUrl, advanceCondition,
importPayload, year, exportPayloadType, targetid
} = this.state;
const tablePayload = { taxYearMonth: `${year}-${declareMonth}`, year, 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="addupsituation"
form={form} condition={advanceCondition} onAdSearch={this.handleAdSearch}
onCancel={this.handleCloseImport} onImportFile={importCumSituationParam}
detailOptBtns={this.getDetailOptBtns()}
importPayload={{ ...importPayload, importOpts: { taxYearMonth: importPayload.importOpts.declareMonth } }}
targetid={targetid} onClearTargrtid={() => this.setState({ targetid: "" })}
>
<DataTables
ref={dom => this.tableRef = dom}
url="/api/bs/hrmsalary/addUpSituation/list"
payload={tablePayload}
showOperateBtn={showOperateBtn}
onTableOperate={this.handleTableOperate}
onViewDetails={(record) => this.handleAddData("往期累计情况(工资、薪金)记录", record)}
form={form}
/>
</Layout>
);
}
}
export default Index;