数据采集页面重构

This commit is contained in:
黎永顺 2023-02-21 09:57:44 +08:00
parent b6849400d7
commit a11ad9d7d1
7 changed files with 504 additions and 27 deletions

View File

@ -132,3 +132,8 @@ export const autoAddAll = (params) => {
export const getTableDate = ({ url, ...params }) => {
return postFetch(url, params);
};
//数据采集列表详情记录查询
export const getTableRecordDate = ({ url, ...params }) => {
return postFetch(url, params);
};

View File

@ -0,0 +1,27 @@
.tableRecordWrapper {
.accumulated {
.wea-form-cell-wrapper {
& > div:first-child {
width: 10% !important;
line-height: 46px;
}
& > div:nth-child(2) {
width: 40% !important;
.wea-form-item-wrapper {
display: flex !important;
align-items: center;
.to {
padding: 0 10px;
}
}
}
& > div:last-child {
width: 40% !important;
}
}
}
}

View File

@ -0,0 +1,148 @@
/*
* Author: 黎永顺
* name: 数据采集-详情记录页面
* Description:
* Date: 2023/2/20
*/
import React, { Component } from "react";
import { WeaSearchGroup } from "ecCom";
import UnifiedTable from "../../../components/UnifiedTable";
import { getTableRecordDate } from "../../../apis/cumDeduct";
import { DataCollectionDateRangePick, DataCollectionSelect, Input } from "../cumDeduct";
import "./index.less";
class TableRecord extends Component {
constructor(props) {
super(props);
this.state = {
loading: {
query: false
},
dataSource: [],
columns: [],
selectedRowKeys: [],
pageInfo: {
current: 1, pageSize: 10, total: 0
},
recordPayload: {
accumulatedSpecialAdditionalDeductionId: "",
otherTaxExemptDeductionId: "",
accumulatedSituationId: "",
specialAddDeductionId: "",
taxAgentId: "",
declareMonth: []
}
};
}
componentDidMount() {
this.getTableRecordData();
}
getTableRecordData = (payload) => {
const { loading, pageInfo } = this.state;
const { url, ...extraPayload } = this.props;
const module = { ...pageInfo, url, ...extraPayload, ...payload };
this.setState({ loading: { ...loading, query: true } });
getTableRecordDate(_.omit(module, ["className", "items", "total"])).then(({ status, data }) => {
this.setState({ loading: { ...loading, query: false } });
if (status) {
const { columns, list: dataSource, pageNum: current, pageSize, total } = data;
this.setState({
pageInfo: { ...pageInfo, current, pageSize, total },
dataSource,
columns
});
}
}).catch(() => this.setState({ loading: { ...loading, query: false } }));
};
/*
* Author: 黎永顺
* Description: 详情页面-筛选操作
* Params:
* Date: 2023/2/20
*/
handleTablerecordScreen = ({ key, value }) => {
const { recordPayload } = this.state;
// this.setState({
// recordPayload: {
// ...recordPayload,
// [key]: value
// }
// }, () => {
// this.tableRecordRef.getTableRecordData(this.state.recordPayload);
// });
};
render() {
const { className, screenParams, taxAgentOption } = this.props;
const { columns, dataSource, loading, selectedRowKeys, pageInfo, recordPayload } = this.state;
const rowSelection = {
selectedRowKeys,
onChange: (selectedRowKeys) => this.setState({ selectedRowKeys })
};
const pagination = {
...pageInfo,
showTotal: (total) => `${total}`,
pageSizeOptions: ["10", "20", "50", "100"],
showSizeChanger: true,
showQuickJumper: true,
onShowSizeChange: (current, pageSize) => {
this.setState({
pageInfo: { ...pageInfo, current, pageSize }
}, () => {
this.getTableRecordData();
});
},
onChange: (current) => {
this.setState({
pageInfo: { ...pageInfo, current }
}, () => {
this.getTableRecordData();
});
}
};
const items = [
{
com: Input({ value: editId.username })
},
{
com: DataCollectionDateRangePick({
label: "税款所属期",
range: recordPayload.declareMonth,
onChange: this.handleTablerecordScreen,
key: "declareMonth"
})
},
{
com: DataCollectionSelect({
label: "个税扣缴义务人",
value: !_.isNil(recordPayload.taxAgentId) ? recordPayload.taxAgentId.toString() : "",
options: [{ key: "", showname: "全部" }, ...taxAgentOption],
onChange: this.handleTablerecordScreen,
key: "taxAgentId"
})
}
];
return (
<div className="tableRecordWrapper">
<WeaSearchGroup className={className} showGroup needTigger={false} items={items} col={3}/>
<UnifiedTable
rowKey="id"
rowSelection={rowSelection}
columns={_.map(columns, item => ({
...item,
render: (text) => {
return <span className="ellipsis" title={text}> {text} </span>;
}
}))}
dataSource={dataSource}
pagination={pagination}
loading={loading.query}
/>
</div>
);
}
}
export default TableRecord;

View File

@ -0,0 +1,46 @@
/*
* Author: 黎永顺
* name: 数据采集-导入选项
* Description:
* Date: 2023/2/20
*/
import React, { Component } from "react";
import { WeaSearchGroup } from "ecCom";
import { DataCollectionDatePicker, DataCollectionSelect } from "../index";
class ImportFormCom extends Component {
screenChange = ({ key, value }) => {
const { onChangeImportForm } = this.props;
onChangeImportForm(key, value);
};
render() {
const { taxAgentOption, declareMonth, taxAgentId } = this.props;
const items = [
{
com: DataCollectionDatePicker({
label: "税款所属期",
value: declareMonth,
onChange: this.screenChange,
key: "declareMonth",
screen: false
})
},
{
com: DataCollectionSelect({
label: "个税扣缴义务人",
value: taxAgentId,
onChange: this.screenChange,
options: [{ key: "", showname: "全部" }, ...taxAgentOption],
key: "taxAgentId"
})
}
];
return (
<WeaSearchGroup className="screenWrapper" showGroup needTigger={false} items={items}
col={2}/>
);
}
}
export default ImportFormCom;

View File

@ -1,6 +1,6 @@
import React, { Component } from "react";
import { inject, observer } from "mobx-react";
import { WeaDatePicker, WeaFormItem, WeaHelpfulTip, WeaSearchGroup, WeaSelect } from "ecCom";
import { WeaDatePicker, WeaFormItem, WeaHelpfulTip, WeaInput, WeaSearchGroup, WeaSelect } from "ecCom";
import { Button, Dropdown, Menu, message, Modal } from "antd";
import {
autoAddAll,
@ -8,11 +8,17 @@ import {
deleteAllAddUpDeduction,
deleteSelectAddUpDeduction,
editAddUpDeduction,
getAddUpDeduction
getAddUpDeduction,
getCumDeductSaCondition,
importCumDeductParam,
importCumDeductPreview
} from "../../../apis/cumDeduct";
import DataTables from "../dataTables";
import AddItems from "../addItems";
import ImportFormCom from "./components/importFormCom";
import TableRecord from "../components/tableRecord";
import { dataCollectCondition } from "./columns";
import { removePropertyCondition } from "../../../util/response";
import Layout from "../layout";
import moment from "moment";
@ -32,9 +38,28 @@ class Index extends Component {
title: "",
children: null,
data: {}
}
},
importPayload: {
visible: false,
importOpts: {
declareMonth: moment(new Date()).format("YYYY-MM"),
taxAgentId: ""
},
importFormComponent: null,
step: 0,
importResult: {},
slideDataSource: []
},
exportPayloadUrl: "",
advanceCondition: null
};
this.tableRef = null;
this.addItemRef = null;
this.tableRecordRef = null;
}
componentDidMount() {
this.getAdvanceCondition();
}
/*
@ -56,6 +81,21 @@ class Index extends Component {
}
}).catch(() => this.setState({ addAllLoading: false }));
};
/*
* Author: 黎永顺
* Description: 高级搜素框-表单项
* Params:
* Date: 2023/2/20
*/
getAdvanceCondition = () => {
const { cumDeductStore: { form } } = this.props;
getCumDeductSaCondition().then(({ status, data }) => {
if (status) {
this.setState({ advanceCondition: removePropertyCondition(data.condition) });
form.initFormFields(removePropertyCondition(data.condition));
}
});
};
/*
* Author: 黎永顺
* Description: 一键清空
@ -112,6 +152,70 @@ class Index extends Component {
}
});
};
/*
* Author: 黎永顺
* Description:数据采集-导出全部
* Params:
* Date: 2023/2/20
*/
handleExportAll = () => {
const { declareMonth, taxAgentId } = this.state;
this.setState({
exportPayloadUrl: `${window.location.origin}/api/bs/hrmsalary/addUpDeduction/export?ids=&declareMonth=${declareMonth}&taxAgentId=${taxAgentId}`
});
};
/*
* Author: 黎永顺
* Description:数据采集-导出选中
* Params:
* Date: 2023/2/20
*/
handleExportSelect = () => {
const { selectedRowKeys: ids } = this.tableRef.state;
const { declareMonth, taxAgentId } = this.state;
if (ids.length === 0) {
message.warning("请选择需要导出的数据");
return;
}
this.setState({
exportPayloadUrl: `${window.location.origin}/api/bs/hrmsalary/addUpDeduction/export?ids=${ids.join(",")}&declareMonth=${declareMonth}&taxAgentId=${taxAgentId}`
});
};
/*
* Author: 黎永顺
* Description: 导入数据采集数据
* Params:
* Date: 2023/2/20
*/
handleImportFile = (params) => {
importCumDeductParam(params).then(({ status, data }) => {
if (status) {
const { importPayload } = this.state;
this.setState({
importPayload: { ...importPayload, importResult: data }
});
}
});
};
/*
* Author: 黎永顺
* Description: 导入数据采集-数据查看
* Params:
* Date: 2023/2/20
*/
handlePreviewImport = (params) => {
importCumDeductPreview(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: 数据采集-信息保存
@ -147,7 +251,6 @@ class Index extends Component {
});
}
};
handleSaveData = () => {
const { cumDeductStore: { addForm } } = this.props;
const { baseInfo } = this.addItemRef.state;
@ -174,22 +277,30 @@ class Index extends Component {
*/
handleAddData = (title = "新建", editId = {}) => {
const { taxAgentStore, cumDeductStore: { addForm } } = this.props;
addForm.initFormFields(dataCollectCondition);
const { slidePayload } = this.state;
const { taxAgentOption } = taxAgentStore;
addForm.initFormFields(dataCollectCondition);
this.setState({
slidePayload: {
...slidePayload,
visible: true,
title,
data: editId,
children: <AddItems
ref={(dom) => this.addItemRef = dom}
taxAgentOption={taxAgentOption}
form={addForm}
editId={editId}
condition={dataCollectCondition}
/>
children: title.length <= 2 ?
<AddItems
ref={(dom) => this.addItemRef = dom}
taxAgentOption={taxAgentOption}
form={addForm}
editId={editId}
condition={dataCollectCondition}
/> :
<TableRecord
ref={(dom) => this.tableRecordRef = dom}
className="accumulated"
taxAgentOption={taxAgentOption}
url="/api/bs/hrmsalary/addUpDeduction/getDetailList"
screenParams={["accumulatedSpecialAdditionalDeductionId", "taxAgentId", "declareMonth"]}
/>
}
});
};
@ -251,6 +362,10 @@ class Index extends Component {
screenChange = ({ key, value }) => {
this.setState({ [key]: value }, () => this.tableRef.getTableDate({ current: 1 }));
};
handleAdSearch = () => {
const { cumDeductStore: { form } } = this.props;
this.tableRef.getTableDate({ ...form.getFormParams(), current: 1 });
};
/*
* Author: 黎永顺
* Description: 顶部操作按钮
@ -260,7 +375,7 @@ class Index extends Component {
getTopBtns = () => {
const { addAllLoading } = this.state;
return [
<Button type="primary">导入</Button>,
<Button type="primary" onClick={this.handleOpenImport}>导入</Button>,
<Button type="ghost" onClick={() => this.handleAddData()}>新建</Button>,
<Button type="ghost" loading={addAllLoading} onClick={this.autoAddAll}>一键累计</Button>,
<Dropdown
@ -278,16 +393,90 @@ class Index extends Component {
];
};
handleDataMenuClick = ({ key: keyFunc }) => this[keyFunc]();
/*
* Author: 黎永顺
* Description:详情页面-操作按钮
* Params:
* Date: 2023/2/20
*/
getDetailOptBtns = () => {
return [
<Dropdown.Button
// onClick={this.handleExportAllDetailClick}
overlay={
<Menu
// onClick={handleExportSelectedDetailClick}
>
<Menu.Item key="1">导出选中</Menu.Item>
</Menu>
}
type="primary">
导出全部
</Dropdown.Button>
];
};
/*
* Author: 黎永顺
* Description: 数据采集-导入相关
* Params:
* Date: 2023/2/20
*/
handleOpenImport = () => {
const { importPayload } = this.state;
const { importOpts } = importPayload;
const { taxAgentStore: { taxAgentOption } } = this.props;
this.setState({
importPayload: {
...importPayload,
visible: true, step: 0,
importResult: {}, slideDataSource: [],
importFormComponent: <ImportFormCom {...importOpts} taxAgentOption={taxAgentOption}
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"),
taxAgentId: ""
}, importResult: {}, slideDataSource: []
}
}, () => doSearch && this.tableRef.getTableDate());
};
handleChangeImportForm = (key, value) => {
const { importPayload } = this.state;
const { importOpts } = importPayload;
this.setState({
importPayload: { ...importPayload, importOpts: { ...importOpts, [key]: value } }
});
};
handleImportSetStep = (step) => {
const { importPayload } = this.state;
this.setState({
importPayload: { ...importPayload, step }
});
};
render() {
const { taxAgentStore: { showOperateBtn } } = this.props;
const { declareMonth, taxAgentId, slidePayload, saveLoading } = this.state;
const { taxAgentStore: { showOperateBtn }, cumDeductStore: { form } } = this.props;
const {
declareMonth, taxAgentId, slidePayload, saveLoading, exportPayloadUrl, advanceCondition,
importPayload
} = 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}
slideLoading={saveLoading} exportPayloadUrl={exportPayloadUrl}
form={form} condition={advanceCondition} onAdSearch={this.handleAdSearch}
onImportSetStep={this.handleImportSetStep} onCancel={this.handleCloseImport}
importPayload={importPayload} onImportFile={this.handleImportFile}
onPreviewImport={this.handlePreviewImport} detailOptBtns={this.getDetailOptBtns()}
>
<DataTables
ref={dom => this.tableRef = dom}
@ -295,6 +484,7 @@ class Index extends Component {
payload={tablePayload}
showOperateBtn={showOperateBtn}
onTableOperate={this.handleTableOperate}
onViewDetails={(record) => this.handleAddData("累计专项附加扣除记录", record)}
/>
</Layout>
);
@ -303,16 +493,33 @@ class Index extends Component {
export default Index;
const DataCollectionDatePicker = (props) => {
const { value, label, onChange, format = "YYYY-MM", key } = props;
export const DataCollectionDatePicker = (props) => {
const { value, label, onChange, format = "YYYY-MM", key, screen = true } = props;
return <WeaFormItem label={label} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }}>
<WeaDatePicker value={value} onChange={(val) => onChange({ key, value: val })} format={format}/>
<WeaHelpfulTip title="提示:默认显示本年截至当前月所有员工申报的累计专项附加及其他扣除额" width={200}/>
{
screen &&
<WeaHelpfulTip title="提示:默认显示本年截至当前月所有员工申报的累计专项附加及其他扣除额" width={200}/>
}
</WeaFormItem>;
};
const DataCollectionSelect = (props) => {
export const DataCollectionSelect = (props) => {
const { value, label, onChange, options, key } = props;
return <WeaFormItem label={label} labelCol={{ span: 10 }} wrapperCol={{ span: 14 }}>
<WeaSelect value={value} onChange={(val) => onChange({ key, value: val })} options={options}/>
</WeaFormItem>;
};
export const Input = (props) => {
const { value } = props;
return (<WeaInput value={value} viewAttr={1}/>);
};
export const DataCollectionDateRangePick = (props) => {
const { range, label, onChange, format = "YYYY-MM", key } = props;
const [value1 = "", value2 = ""] = range;
return <WeaFormItem label={label} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }}>
<WeaDatePicker value={value1} onChange={(val) => onChange({ key, value: [val, value2] })} format={format}/>
<span className="to"></span>
<WeaDatePicker value={value2} onChange={(val) => onChange({ key, value: [value1, val] })} format={format}/>
</WeaFormItem>;
};

View File

@ -56,7 +56,7 @@ class DataTables extends Component {
render() {
const { columns, dataSource, loading, selectedRowKeys, pageInfo } = this.state;
const { showOperateBtn, onTableOperate } = this.props;
const { showOperateBtn, onTableOperate, onViewDetails } = this.props;
const rowSelection = {
selectedRowKeys,
onChange: (selectedRowKeys) => this.setState({ selectedRowKeys })
@ -106,7 +106,7 @@ class DataTables extends Component {
...item,
render: (text, record) => (
<div className="linkWapper">
<a href="javaScript:void(0);">查看明细</a>
<a href="javaScript:void(0);" onClick={() => onViewDetails(record)}>查看明细</a>
{
showOperateBtn &&
<Popover

View File

@ -6,8 +6,12 @@
*/
import React, { Component } from "react";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { WeaNewScroll, WeaSlideModal, WeaTab, WeaTop } from "ecCom";
import ImportModal from "../../components/importModal";
import { modalColumns } from "./cumDeduct/columns";
import SlideModalTitle from "../../components/slideModalTitle";
import { getSearchs } from "../../util";
import "./index.less";
@inject("taxAgentStore")
@ -26,6 +30,18 @@ class Layout extends Component {
window.addEventListener("resize", this.resizeUpdate);
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.exportPayloadUrl !== this.props.exportPayloadUrl) {
/*
* Author: 黎永顺
* Description:导出数据采集数据
* Params:
* Date: 2023/2/20
*/
window.open(nextProps.exportPayloadUrl, "_self");
}
}
componentWillUnmount() {
window.removeEventListener("resize", this.resizeUpdate);
}
@ -39,9 +55,15 @@ class Layout extends Component {
const { showSearchAd } = this.state;
const {
title, btns, leftComp, children, taxAgentStore: { showOperateBtn },
slidePayload, onClose, onSave, slideLoading
slidePayload, onClose, onSave, slideLoading, form, condition,
onAdSearch, onCancel, importPayload, onImportSetStep, onImportFile,
onPreviewImport, detailOptBtns
} = this.props;
const { visible, title: subtitle, children: slideChildren } = slidePayload;
const {
visible: importVisiable, step, importFormComponent, importOpts,
importResult, slideDataSource
} = importPayload;
return (
<div className="layoutWrapper">
<WeaTop title={title} buttons={showOperateBtn ? btns : []}
@ -51,19 +73,41 @@ class Layout extends Component {
<WeaTab
searchType={["base", "advanced"]}
replaceLeft={leftComp}
searchsAd={<h1>1111</h1>}
searchsAd={getSearchs(form, toJS(condition), 2)}
showSearchAd={showSearchAd}
setShowSearchAd={bool => this.setState({ showSearchAd: bool })}
onAdReset={() => form.resetForm()}
onAdSearch={onAdSearch}
onSearch={onAdSearch}
onSearchChange={(v) => form.updateFields({ username: v })}
searchsBaseValue={form.getFormParams().username}
/>
<div className="dataContent">
<WeaNewScroll height="100%">{children}</WeaNewScroll>
{/*导入弹框*/}
<ImportModal
needimportSelected //下载模板需要带上导入所选项
columns={modalColumns}
params={importOpts}
step={step}
setStep={onImportSetStep}
importResult={importResult}
onFinish={() => onCancel(true)}
slideDataSource={slideDataSource}
previewImport={onPreviewImport}
importFile={onImportFile}
templateLink={"/api/bs/hrmsalary/addUpDeduction/downloadTemplate"}
renderFormComponent={() => importFormComponent}
visiable={importVisiable}
onCancel={onCancel}
/>
{/* 新增-编辑-详情弹框 */}
<WeaSlideModal
className="slideOuterWrapper"
visible={visible}
top={0}
measureT="%"
width={800}
width={1000}
measureX="px"
height={100}
measureY="%"
@ -73,9 +117,9 @@ class Layout extends Component {
subtitle={subtitle}
loading={slideLoading}
onSave={onSave}
editable={true}
editable={subtitle.length <= 2}
showOperateBtn={showOperateBtn}
customOperate={[]}
customOperate={subtitle.length <= 2 ? [] : detailOptBtns}
/>
}
content={slideChildren}