测试表格固定

This commit is contained in:
黎永顺 2023-02-17 10:59:04 +08:00
parent d2590ecf8f
commit 2b6157788d
2 changed files with 898 additions and 836 deletions

View File

@ -1,855 +1,62 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { Button, Col, Dropdown, Menu, message, Modal, Popover, Row } from "antd";
import { WeaDatePicker, WeaHelpfulTip, WeaSelect, WeaSlideModal, WeaTab, WeaTable, WeaTop, WeaNewScroll } from "ecCom";
import moment from "moment";
import { getSearchs, renderLoading } from "../../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import ImportModal from "../../../components/importModal";
import { dataCollectCondition, modalColumns } from "./columns";
import { optionAddAll } from "../../../util/options";
import SlideModalTitle from "../../../components/slideModalTitle";
import EditSlideContent from "./components/editSlideContent";
import AddItems from "../addItems";
import * as API from "../../../apis/cumDeduct";
import "./index.less";
import React, { Component } from "react";
import { getCumDeductList } from "../../../apis/cumDeduct";
import { WeaTable } from "ecCom";
@inject("cumDeductStore", "taxAgentStore")
@observer
export default class CumDeduct extends React.Component {
class Index extends Component {
constructor(props) {
super(props);
this.state = {
addVisible: false,
editId: {},
saveLoading: false,
addAllLoading: false,
value: "",
selectedKey: [],
slideSelectedKey: [], //详情表格的选中项
visiable: false,
monthValue: moment(new Date()).format("YYYY-MM"),
taxAgentId: "All",
datetime: "",
inited: false,
modalParam: {
declareMonth: "",
taxAgentId: ""
}
columns: [], dataSource: []
};
}
componentWillMount() {
// 初始化渲染页面
const {
cumDeductStore: { doInit, addForm },
taxAgentStore: { fetchTaxAgentOption, getTaxAgentSelectListAsAdmin }
} = this.props;
addForm.initFormFields(dataCollectCondition);
doInit({ declareMonth: [this.state.monthValue], taxAgentId: "" });
getTaxAgentSelectListAsAdmin();
fetchTaxAgentOption().then((res) => {
componentDidMount() {
this.getCumDeductList();
}
getCumDeductList = () => {
getCumDeductList({ declareMonth: ["2023-02"], taxAgentId: "" }).then(res => {
this.setState({
inited: true
});
});
}
getSearchsAdQuick() {
const { monthValue, taxAgentId } = this.state;
const {
taxAgentStore: { taxAgentOption },
cumDeductStore: { form, getTableDatas }
} = this.props;
return (
<div className="searchConditionWrapper">
<div className="searchConditionItem">
<span className="conditionFormLabel">税款所属期:</span>
<WeaDatePicker
value={monthValue}
format="YYYY-MM"
width={200}
onChange={v => {
this.setState({ monthValue: v });
let params = {};
if (taxAgentId == "All") {
params.taxAgentId = "";
} else {
params.taxAgentId = taxAgentId;
}
if (v != null && v != "") {
params.declareMonth = [v];
}
getTableDatas(params);
}}
/>
</div>
<div className="helperWrapper">
<WeaHelpfulTip
title="<div>提示:默认显示本年截至当前月所有员工申报的累计专项附加及其他扣除额</div>"
placement="bottom"
width={200}
/>
</div>
<div className="searchConditionItem">
<span className="conditionFormLabel">个税扣缴义务人:</span>
{
this.state.inited && <WeaSelect
showSearch // 设置select可搜索
style={{ width: 200 }}
options={optionAddAll(taxAgentOption)}
value={taxAgentId}
onChange={v => {
let params = {};
if (v == "All") {
params.taxAgentId = "";
} else {
params.taxAgentId = v;
}
if (monthValue != null && monthValue != "") {
params.declareMonth = [monthValue];
}
getTableDatas(params);
this.setState({ taxAgentId: v });
}}
/>
columns: _.map(res.data.columns, item => {
if (item.dataIndex === "username") {
return {
...item,
fixed: "left",
width: "20%"
};
}
</div>
</div>
);
}
renderFormComponent() {
const { modalParam } = this.state;
const {
taxAgentStore: { taxAgentAdminOption }
} = this.props;
return (
<Row>
<Col span={12}>
<span
className="formLabel"
style={{ lineHeight: "30px", marginRight: "10px" }}>
税款所属期
</span>
<WeaDatePicker
format="yyyy-MM"
value={modalParam.declareMonth}
onChange={(value) =>
this.setState({
modalParam: { ...modalParam, declareMonth: value }
})
}
/>
</Col>
<Col span={12}>
<span
className="formLabel"
style={{ lineHeight: "30px", marginRight: "10px" }}>
个税扣缴义务人
</span>
<WeaSelect
showSearch // 设置select可搜索
style={{ width: 200, display: "inline-block" }}
options={taxAgentAdminOption}
value={modalParam.taxAgentId}
onChange={(v) => {
this.setState({ modalParam: { ...modalParam, taxAgentId: v } });
}}
/>
</Col>
</Row>
);
}
onEdit = (record) => {
const {
cumDeductStore: {
slideVisiable,
setSlideVisiable,
getCumDeductDetailList,
setCurrentRecord
}
} = this.props;
setSlideVisiable(true);
setCurrentRecord(record);
getCumDeductDetailList(record.id, { taxAgentId: record.taxAgentId });
};
// 增加编辑功能重写columns绑定事件
getColumns = (columns) => {
let newColumns = "";
newColumns = columns.map((column) => {
let newColumn = column;
newColumn.render = (text, record, index) => {
//前端元素转义
let valueSpan =
record[newColumn.dataIndex + "span"] !== undefined
? record[newColumn.dataIndex + "span"]
: record[newColumn.dataIndex];
switch (newColumn.dataIndex) {
case "username":
return (
<a
onClick={() => {
this.onEdit(record);
}}>
{text}
</a>
);
case "operate":
return (
<a
onClick={() => {
this.onEdit(record);
}}>
查看明细
</a>
);
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
}
};
return newColumn;
});
return newColumns;
};
handleCancel() {
const { cumDeductStore } = this.props;
const { modalVisiable, setModalVisiable, setStep } = cumDeductStore;
setModalVisiable(false);
setStep(0);
}
onOperatesClick = (record, index, operate, flag) => {
switch (operate.index.toString()) {
case "0": // 查看明细
this.onEdit(record);
break;
}
};
showColumn = () => {
const {
cumDeductStore: { tableStore }
} = this.props;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
};
// 初始化导入参数
handleInitModal() {
const {
cumDeductStore: { setSlideDataSource, setImportResult }
} = this.props;
setSlideDataSource([]);
setImportResult({});
}
onSelectChange = (val) => {
this.setState({
selectedKey: val
});
};
handleSearch = () => {
const { cumDeductStore: { getTableDatas } } = this.props;
const { monthValue, taxAgentId } = this.state;
let params = {};
if (monthValue != null && monthValue !== "") {
params.declareMonth = [monthValue];
}
if (taxAgentId != null && taxAgentId !== "" && taxAgentId !== "All") {
params.taxAgentId = taxAgentId;
}
getTableDatas({ ...params, current: 1 });
};
//新功能
handleSaveDeduction = (payload) => {
const { editId } = this.state;
this.setState({ saveLoading: true });
if (!_.isEmpty(editId)) {
API.editAddUpDeduction({ ...payload, id: editId.id }).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("编辑成功");
this.setState({
addVisible: false,
editId: {}
}, () => {
const { cumDeductStore: { doSearch, addForm } } = this.props;
const { monthValue, taxAgentId } = this.state;
doSearch({
declareMonth: [monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
addForm.resetForm();
});
} else {
message.error(errormsg || "编辑失败");
}
});
} else {
API.createAddUpDeduction(payload).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("新增成功");
this.setState({
addVisible: false,
editId: {}
}, () => {
const { cumDeductStore: { doSearch, addForm } } = this.props;
const { monthValue, taxAgentId } = this.state;
doSearch({
declareMonth: [monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
addForm.resetForm();
});
} else {
message.error(errormsg || "新增失败");
}
});
}
};
deleteSelectAddUpDeduction = () => {
const { monthValue: declareMonth, taxAgentId, selectedKey } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
if (selectedKey.length === 0) {
message.warning("未选择条目");
return;
}
const payload = {
declareMonth,
ids: selectedKey
};
Modal.confirm({
title: "信息确认",
content: "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。",
onOk: () => {
API.deleteSelectAddUpDeduction(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
if (item.dataIndex === "taxAgentName") {
return {
...item,
fixed: "left",
width: "25%"
};
}
});
},
onCancel: () => {
}
});
};
deleteAllAddUpDeduction = () => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
const payload = {
declareMonth,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
};
Modal.confirm({
title: "信息确认",
content: `确定清空税款所属期为${declareMonth}的所有累计专项附加扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
API.deleteAllAddUpDeduction(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
if (item.dataIndex === "operate") {
return {
...item,
fixed: "right",
width: "100px"
};
}
});
}
});
};
handleOperate = ({ key }, row) => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
if (key === "edit") {
this.setState({
addVisible: true
}, () => {
API.getAddUpDeduction({ id: row.id }).then(({ status, data }) => {
if (status) {
this.setState({ editId: data });
}
});
});
} else if (key === "delete") {
const payload = {
declareMonth,
ids: [row.id]
};
Modal.confirm({
title: "信息确认",
content: `确定删除${row.departmentName}${row.username}(税款所属期:${declareMonth})的累计专项附加扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
API.deleteSelectAddUpDeduction(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
}
});
}
};
autoAddAll = () => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
this.setState({ addAllLoading: true });
API.autoAddAll({ yearMonth: declareMonth }).then(({ status, data, errormsg }) => {
this.setState({ addAllLoading: false });
if (status) {
message.success(data || "操作成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "操作失败");
}
}).catch(() => this.setState({ addAllLoading: false }));
};
handleButtonClick = () => {
if (!this.handleChangeDebounce) {
this.handleChangeDebounce = _.debounce(this.handleChange, 500);
}
this.handleChangeDebounce();
};
handleChange = e => {
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/export?ids=&declareMonth=${this.state.monthValue}&taxAgentId=${this.state.taxAgentId == "All"
? ""
: this.state.taxAgentId}`;
window.open(url, "_self");
};
handleExportAllDetailClick = () => {
if (!this.handleChangeDebounce) {
const {
cumDeductStore: { currentRecord }
} = this.props;
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/exportDetail?accumulatedSpecialAdditionalDeductionId=${currentRecord.id}&ids=&taxAgentId=${currentRecord.taxAgentId}`;
window.open(url, "_self");
}
this.handleChangeDebounce();
return {
...item,
width: "25%"
};
}),
dataSource: res.data.list
});
});
};
render() {
const {
modalParam,
slideSelectedKey,
monthValue,
taxAgentId,
addVisible,
editId,
saveLoading,
addAllLoading
} = this.state;
const { cumDeductStore, taxAgentStore } = this.props;
const {
loading,
dataSource,
columns,
pageObj,
addForm,
form,
condition,
tableStore,
showSearchAd,
getTableDatas,
doSearch,
setShowSearchAd,
previewImport,
importFile
} = cumDeductStore;
const { taxAgentOption, showOperateBtn } = taxAgentStore;
const {
slideVisiable,
setSlideVisiable,
modalVisiable,
setModalVisiable,
slideTableStore,
step,
setStep,
slideDataSource,
importResult,
setPageObj
} = cumDeductStore;
const selectedRowKeys = toJS(tableStore.selectedRowKeys) || [];
const detailSelectedRowKeys = toJS(slideTableStore.selectedRowKeys) || [];
const rightMenu = [
// 右键菜单
// {
// key: "BTN_COLUMN",
// icon: <i className="icon-coms-Custom" />,
// content: "显示列定制",
// onClick: this.showColumn,
// },
];
const adBtn = [
// 高级搜索内部按钮
<Button type="primary" onClick={() => doSearch({
declareMonth: [this.state.monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
})}>
搜索
</Button>,
<Button type="ghost" onClick={() => form.resetForm()}>
重置
</Button>,
<Button type="ghost" onClick={() => setShowSearchAd(false)}>
取消
</Button>
];
const topTab = [];
const renderSearchOperationItem = () => {
return <div></div>;
};
const handleMenuClick = () => {
if (this.state.selectedKey.length == 0) {
message.warning("未选择条目");
return;
}
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/export?ids=${this.state.selectedKey.join(
","
)}&declareMonth=${this.state.monthValue}&taxAgentId=${this.state.taxAgentId == "All"
? ""
: this.state.taxAgentId}`;
window.open(url, "_self");
};
const handleBtnImport = () => {
const {
cumDeductStore: { setModalVisiable, setStep }
} = this.props;
setStep(0);
setModalVisiable(true);
};
const btns = [
<Button
type="primary"
onClick={() => {
handleBtnImport();
}}>
导入
</Button>,
<Dropdown.Button
onClick={this.handleButtonClick}
overlay={
<Menu onClick={handleMenuClick}>
<Menu.Item key="1">导出选中</Menu.Item>
</Menu>
}
type="ghost">
导出全部
</Dropdown.Button>,
<Button
type="primary"
onClick={() => {
this.setState({
addVisible: true,
editId: {}
}, () => addForm.resetForm());
}}>
新建
</Button>,
<Dropdown.Button
onClick={this.deleteAllAddUpDeduction}
overlay={
<Menu onClick={this.deleteSelectAddUpDeduction}>
<Menu.Item key="1">删除所选</Menu.Item>
</Menu>
}
type="ghost">
一键清空
</Dropdown.Button>,
<Button
type="primary"
loading={addAllLoading}
onClick={this.autoAddAll}>
一键累计
</Button>
];
const handleExportSelectedDetailClick = () => {
if (this.state.slideSelectedKey.length === 0) {
message.warning("未选择条目");
return;
}
const {
cumDeductStore: { currentRecord }
} = this.props;
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/exportDetail?accumulatedSpecialAdditionalDeductionId=${currentRecord.id}&ids=${this.state.slideSelectedKey.join(",")}&taxAgentId=${currentRecord.taxAgentId}`;
window.open(url, "_self");
};
const renderBtns = () => {
return [
<Dropdown.Button
onClick={this.handleExportAllDetailClick}
overlay={
<Menu onClick={handleExportSelectedDetailClick}>
<Menu.Item key="1">导出选中</Menu.Item>
</Menu>
}
type="primary">
导出全部
</Dropdown.Button>
];
};
const pagination = {
total: pageObj.total,
showTotal: (total) => `${total}`,
pageSizeOptions: ["10", "20", "50", "100"],
showSizeChanger: true,
onShowSizeChange(current, pageSize) {
setPageObj({ ...pageObj, current, pageSize });
getTableDatas({
current,
pageSize,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId,
declareMonth: monthValue && [monthValue]
});
},
onChange(current) {
setPageObj({ ...pageObj, current, pageSize: pageObj.pageSize });
getTableDatas({
current,
pageSize: pageObj.pageSize,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId,
declareMonth: monthValue && [monthValue]
});
}
};
const rowSelection = {
selectedRowKeys: this.state.selectedKey,
onChange: this.onSelectChange
};
const newColumns = _.map([...columns], (item) => {
if (item.dataIndex === "username") {
return {
...item,
width: 100,
fixed: "left",
render: (text, record) => (
<div className="linkWapper">
<a href="javaScript:void(0);" onClick={() => this.onEdit(record)}>
{text}
</a>
</div>
)
};
} else if (item.dataIndex === "taxAgentName") {
return {
...item,
width: 180,
fixed: "left"
};
} else if (item.dataIndex === "operate") {
return {
...item,
width: 120,
fixed: "right",
render: (text, record) => (
<div className="linkWapper">
<a href="javaScript:void(0);" onClick={() => this.onEdit(record)}>
查看明细
</a>
{
showOperateBtn &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => this.handleOperate(e, record)}>
<Menu.Item key="edit">编辑</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>
</Popover>
}
</div>
)
};
} else {
return { ...item, width: 150 };
}
});
if (_.isEmpty(newColumns)) {
return renderLoading();
}
const { columns, dataSource } = this.state;
return (
<div className="cumDeductWrapper">
<WeaTop
title="累计专项附加扣除" // 文字
icon={<i className="icon-coms-fa"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
dropMenuDatas={rightMenu} // 下拉菜单(和页面的右键菜单相同)
buttons={showOperateBtn ? btns : []}
>
<div className="weaTabWrapper">
<WeaTab
searchType={["base", "advanced"]} // base基础搜索框 advanced显示高级搜索按钮
searchsBasePlaceHolder="请输入姓名"
showSearchAd={showSearchAd} // 是否展开高级搜索面板
setShowSearchAd={(bool) => setShowSearchAd(bool)} //高级搜索面板受控
searchsAd={getSearchs(form, toJS(condition), 2)} // 高级搜索内部数据
buttonsAd={adBtn} // 高级搜索内部按钮
onSearch={() => this.handleSearch()} // 点搜索按钮时的回调
searchsAdQuick={this.getSearchsAdQuick()}
onSearchChange={(v) => form.updateFields({ username: v })} // 在搜索框中输入的文字改变时的回调: 这里需要同步高级搜索和外部搜索框的值
searchsBaseValue={form.getFormParams().username} // 外部input搜索值受控: 这里和高级搜索的requestname同步
/>
</div>
<div className="tableWrapper">
<WeaNewScroll height="100%">
<WeaTable
rowKey="id"
rowSelection={rowSelection}
columns={newColumns}
dataSource={dataSource}
pagination={pagination}
loading={loading}
scroll={{ x: 1300 }}
/>
</WeaNewScroll>
</div>
</WeaTop>
{modalVisiable && (
<ImportModal
needimportSelected //下载模板需要带上导入所选项
init={() => {
this.handleInitModal();
}}
onValidate={() => {
this.handleValidate();
}}
params={modalParam}
columns={modalColumns}
step={step}
setStep={setStep}
slideDataSource={slideDataSource}
importResult={importResult}
onFinish={() => {
setModalVisiable(false);
setStep(0);
doSearch({
declareMonth: this.state.monthValue ? [this.state.monthValue] : "",
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
}}
previewImport={(params) => {
previewImport(params);
}}
importFile={(params) => {
importFile(params);
}}
templateLink={"/api/bs/hrmsalary/addUpDeduction/downloadTemplate"}
renderFormComponent={() => this.renderFormComponent()}
visiable={modalVisiable}
onCancel={() => {
this.handleCancel();
}}
/>
)}
{(slideVisiable || addVisible) && (
<WeaSlideModal
className="slideOuterWrapper"
visible={slideVisiable || addVisible}
top={0}
width={60}
height={100}
direction="right"
measure="%"
title={
<SlideModalTitle
subtitle={addVisible ? (!_.isEmpty(editId) ? "编辑" : "新建") : "累计专项附加扣除记录"}
loading={saveLoading}
onSave={() => {
const { baseInfo } = this.addItemRef.state;
const bool = _.every(_.pick(baseInfo, ["declareMonth", "taxAgentId", "employeeId"]), v => !_.isEmpty(v));
if (!bool && _.isEmpty(editId)) {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
return;
}
const payload = {
..._.pick(baseInfo, ["declareMonth", "taxAgentId", "employeeId", "taxAgentName"]),
...addForm.getFormParams()
};
this.handleSaveDeduction(payload);
}}
editable={!!addVisible}
showOperateBtn={showOperateBtn}
customOperate={(showOperateBtn && !addVisible) ? renderBtns() : []}
/>
}
content={
addVisible ?
<AddItems
ref={(dom) => this.addItemRef = dom}
taxAgentOption={taxAgentOption}
form={addForm}
editId={editId}
condition={dataCollectCondition}
/> :
<EditSlideContent
slideSelectedKey={slideSelectedKey}
onChangeSlideSelectKey={(val) =>
this.setState({ slideSelectedKey: val })
}
/>
}
onClose={() => {
setSlideVisiable(false);
this.setState({
addVisible: false,
editId: {}
});
}}
showMask={true}
closeMaskOnClick={() => {
setSlideVisiable(false);
this.setState({
addVisible: false,
editId: {}
});
}}
/>
)}
</div>
<WeaTable columns={columns} dataSource={dataSource} scroll={{ x: 800 }}/>
);
}
}
export default Index;

View File

@ -0,0 +1,855 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { Button, Col, Dropdown, Menu, message, Modal, Popover, Row } from "antd";
import { WeaDatePicker, WeaHelpfulTip, WeaSelect, WeaSlideModal, WeaTab, WeaTable, WeaTop, WeaNewScroll } from "ecCom";
import moment from "moment";
import { getSearchs, renderLoading } from "../../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import ImportModal from "../../../components/importModal";
import { dataCollectCondition, modalColumns } from "./columns";
import { optionAddAll } from "../../../util/options";
import SlideModalTitle from "../../../components/slideModalTitle";
import EditSlideContent from "./components/editSlideContent";
import AddItems from "../addItems";
import * as API from "../../../apis/cumDeduct";
import "./index.less";
@inject("cumDeductStore", "taxAgentStore")
@observer
export default class CumDeduct extends React.Component {
constructor(props) {
super(props);
this.state = {
addVisible: false,
editId: {},
saveLoading: false,
addAllLoading: false,
value: "",
selectedKey: [],
slideSelectedKey: [], //详情表格的选中项
visiable: false,
monthValue: moment(new Date()).format("YYYY-MM"),
taxAgentId: "All",
datetime: "",
inited: false,
modalParam: {
declareMonth: "",
taxAgentId: ""
}
};
}
componentWillMount() {
// 初始化渲染页面
const {
cumDeductStore: { doInit, addForm },
taxAgentStore: { fetchTaxAgentOption, getTaxAgentSelectListAsAdmin }
} = this.props;
addForm.initFormFields(dataCollectCondition);
doInit({ declareMonth: [this.state.monthValue], taxAgentId: "" });
getTaxAgentSelectListAsAdmin();
fetchTaxAgentOption().then((res) => {
this.setState({
inited: true
});
});
}
getSearchsAdQuick() {
const { monthValue, taxAgentId } = this.state;
const {
taxAgentStore: { taxAgentOption },
cumDeductStore: { form, getTableDatas }
} = this.props;
return (
<div className="searchConditionWrapper">
<div className="searchConditionItem">
<span className="conditionFormLabel">税款所属期:</span>
<WeaDatePicker
value={monthValue}
format="YYYY-MM"
width={200}
onChange={v => {
this.setState({ monthValue: v });
let params = {};
if (taxAgentId == "All") {
params.taxAgentId = "";
} else {
params.taxAgentId = taxAgentId;
}
if (v != null && v != "") {
params.declareMonth = [v];
}
getTableDatas(params);
}}
/>
</div>
<div className="helperWrapper">
<WeaHelpfulTip
title="<div>提示:默认显示本年截至当前月所有员工申报的累计专项附加及其他扣除额</div>"
placement="bottom"
width={200}
/>
</div>
<div className="searchConditionItem">
<span className="conditionFormLabel">个税扣缴义务人:</span>
{
this.state.inited && <WeaSelect
showSearch // 设置select可搜索
style={{ width: 200 }}
options={optionAddAll(taxAgentOption)}
value={taxAgentId}
onChange={v => {
let params = {};
if (v == "All") {
params.taxAgentId = "";
} else {
params.taxAgentId = v;
}
if (monthValue != null && monthValue != "") {
params.declareMonth = [monthValue];
}
getTableDatas(params);
this.setState({ taxAgentId: v });
}}
/>
}
</div>
</div>
);
}
renderFormComponent() {
const { modalParam } = this.state;
const {
taxAgentStore: { taxAgentAdminOption }
} = this.props;
return (
<Row>
<Col span={12}>
<span
className="formLabel"
style={{ lineHeight: "30px", marginRight: "10px" }}>
税款所属期
</span>
<WeaDatePicker
format="yyyy-MM"
value={modalParam.declareMonth}
onChange={(value) =>
this.setState({
modalParam: { ...modalParam, declareMonth: value }
})
}
/>
</Col>
<Col span={12}>
<span
className="formLabel"
style={{ lineHeight: "30px", marginRight: "10px" }}>
个税扣缴义务人
</span>
<WeaSelect
showSearch // 设置select可搜索
style={{ width: 200, display: "inline-block" }}
options={taxAgentAdminOption}
value={modalParam.taxAgentId}
onChange={(v) => {
this.setState({ modalParam: { ...modalParam, taxAgentId: v } });
}}
/>
</Col>
</Row>
);
}
onEdit = (record) => {
const {
cumDeductStore: {
slideVisiable,
setSlideVisiable,
getCumDeductDetailList,
setCurrentRecord
}
} = this.props;
setSlideVisiable(true);
setCurrentRecord(record);
getCumDeductDetailList(record.id, { taxAgentId: record.taxAgentId });
};
// 增加编辑功能重写columns绑定事件
getColumns = (columns) => {
let newColumns = "";
newColumns = columns.map((column) => {
let newColumn = column;
newColumn.render = (text, record, index) => {
//前端元素转义
let valueSpan =
record[newColumn.dataIndex + "span"] !== undefined
? record[newColumn.dataIndex + "span"]
: record[newColumn.dataIndex];
switch (newColumn.dataIndex) {
case "username":
return (
<a
onClick={() => {
this.onEdit(record);
}}>
{text}
</a>
);
case "operate":
return (
<a
onClick={() => {
this.onEdit(record);
}}>
查看明细
</a>
);
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
}
};
return newColumn;
});
return newColumns;
};
handleCancel() {
const { cumDeductStore } = this.props;
const { modalVisiable, setModalVisiable, setStep } = cumDeductStore;
setModalVisiable(false);
setStep(0);
}
onOperatesClick = (record, index, operate, flag) => {
switch (operate.index.toString()) {
case "0": // 查看明细
this.onEdit(record);
break;
}
};
showColumn = () => {
const {
cumDeductStore: { tableStore }
} = this.props;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
};
// 初始化导入参数
handleInitModal() {
const {
cumDeductStore: { setSlideDataSource, setImportResult }
} = this.props;
setSlideDataSource([]);
setImportResult({});
}
onSelectChange = (val) => {
this.setState({
selectedKey: val
});
};
handleSearch = () => {
const { cumDeductStore: { getTableDatas } } = this.props;
const { monthValue, taxAgentId } = this.state;
let params = {};
if (monthValue != null && monthValue !== "") {
params.declareMonth = [monthValue];
}
if (taxAgentId != null && taxAgentId !== "" && taxAgentId !== "All") {
params.taxAgentId = taxAgentId;
}
getTableDatas({ ...params, current: 1 });
};
//新功能
handleSaveDeduction = (payload) => {
const { editId } = this.state;
this.setState({ saveLoading: true });
if (!_.isEmpty(editId)) {
API.editAddUpDeduction({ ...payload, id: editId.id }).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("编辑成功");
this.setState({
addVisible: false,
editId: {}
}, () => {
const { cumDeductStore: { doSearch, addForm } } = this.props;
const { monthValue, taxAgentId } = this.state;
doSearch({
declareMonth: [monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
addForm.resetForm();
});
} else {
message.error(errormsg || "编辑失败");
}
});
} else {
API.createAddUpDeduction(payload).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("新增成功");
this.setState({
addVisible: false,
editId: {}
}, () => {
const { cumDeductStore: { doSearch, addForm } } = this.props;
const { monthValue, taxAgentId } = this.state;
doSearch({
declareMonth: [monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
addForm.resetForm();
});
} else {
message.error(errormsg || "新增失败");
}
});
}
};
deleteSelectAddUpDeduction = () => {
const { monthValue: declareMonth, taxAgentId, selectedKey } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
if (selectedKey.length === 0) {
message.warning("未选择条目");
return;
}
const payload = {
declareMonth,
ids: selectedKey
};
Modal.confirm({
title: "信息确认",
content: "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。",
onOk: () => {
API.deleteSelectAddUpDeduction(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
},
onCancel: () => {
}
});
};
deleteAllAddUpDeduction = () => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
const payload = {
declareMonth,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
};
Modal.confirm({
title: "信息确认",
content: `确定清空税款所属期为${declareMonth}的所有累计专项附加扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
API.deleteAllAddUpDeduction(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
}
});
};
handleOperate = ({ key }, row) => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
if (key === "edit") {
this.setState({
addVisible: true
}, () => {
API.getAddUpDeduction({ id: row.id }).then(({ status, data }) => {
if (status) {
this.setState({ editId: data });
}
});
});
} else if (key === "delete") {
const payload = {
declareMonth,
ids: [row.id]
};
Modal.confirm({
title: "信息确认",
content: `确定删除${row.departmentName}${row.username}(税款所属期:${declareMonth})的累计专项附加扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
API.deleteSelectAddUpDeduction(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
}
});
}
};
autoAddAll = () => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { cumDeductStore: { doSearch } } = this.props;
this.setState({ addAllLoading: true });
API.autoAddAll({ yearMonth: declareMonth }).then(({ status, data, errormsg }) => {
this.setState({ addAllLoading: false });
if (status) {
message.success(data || "操作成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "操作失败");
}
}).catch(() => this.setState({ addAllLoading: false }));
};
handleButtonClick = () => {
if (!this.handleChangeDebounce) {
this.handleChangeDebounce = _.debounce(this.handleChange, 500);
}
this.handleChangeDebounce();
};
handleChange = e => {
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/export?ids=&declareMonth=${this.state.monthValue}&taxAgentId=${this.state.taxAgentId == "All"
? ""
: this.state.taxAgentId}`;
window.open(url, "_self");
};
handleExportAllDetailClick = () => {
if (!this.handleChangeDebounce) {
const {
cumDeductStore: { currentRecord }
} = this.props;
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/exportDetail?accumulatedSpecialAdditionalDeductionId=${currentRecord.id}&ids=&taxAgentId=${currentRecord.taxAgentId}`;
window.open(url, "_self");
}
this.handleChangeDebounce();
};
render() {
const {
modalParam,
slideSelectedKey,
monthValue,
taxAgentId,
addVisible,
editId,
saveLoading,
addAllLoading
} = this.state;
const { cumDeductStore, taxAgentStore } = this.props;
const {
loading,
dataSource,
columns,
pageObj,
addForm,
form,
condition,
tableStore,
showSearchAd,
getTableDatas,
doSearch,
setShowSearchAd,
previewImport,
importFile
} = cumDeductStore;
const { taxAgentOption, showOperateBtn } = taxAgentStore;
const {
slideVisiable,
setSlideVisiable,
modalVisiable,
setModalVisiable,
slideTableStore,
step,
setStep,
slideDataSource,
importResult,
setPageObj
} = cumDeductStore;
const selectedRowKeys = toJS(tableStore.selectedRowKeys) || [];
const detailSelectedRowKeys = toJS(slideTableStore.selectedRowKeys) || [];
const rightMenu = [
// 右键菜单
// {
// key: "BTN_COLUMN",
// icon: <i className="icon-coms-Custom" />,
// content: "显示列定制",
// onClick: this.showColumn,
// },
];
const adBtn = [
// 高级搜索内部按钮
<Button type="primary" onClick={() => doSearch({
declareMonth: [this.state.monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
})}>
搜索
</Button>,
<Button type="ghost" onClick={() => form.resetForm()}>
重置
</Button>,
<Button type="ghost" onClick={() => setShowSearchAd(false)}>
取消
</Button>
];
const topTab = [];
const renderSearchOperationItem = () => {
return <div></div>;
};
const handleMenuClick = () => {
if (this.state.selectedKey.length == 0) {
message.warning("未选择条目");
return;
}
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/export?ids=${this.state.selectedKey.join(
","
)}&declareMonth=${this.state.monthValue}&taxAgentId=${this.state.taxAgentId == "All"
? ""
: this.state.taxAgentId}`;
window.open(url, "_self");
};
const handleBtnImport = () => {
const {
cumDeductStore: { setModalVisiable, setStep }
} = this.props;
setStep(0);
setModalVisiable(true);
};
const btns = [
<Button
type="primary"
onClick={() => {
handleBtnImport();
}}>
导入
</Button>,
<Dropdown.Button
onClick={this.handleButtonClick}
overlay={
<Menu onClick={handleMenuClick}>
<Menu.Item key="1">导出选中</Menu.Item>
</Menu>
}
type="ghost">
导出全部
</Dropdown.Button>,
<Button
type="primary"
onClick={() => {
this.setState({
addVisible: true,
editId: {}
}, () => addForm.resetForm());
}}>
新建
</Button>,
<Dropdown.Button
onClick={this.deleteAllAddUpDeduction}
overlay={
<Menu onClick={this.deleteSelectAddUpDeduction}>
<Menu.Item key="1">删除所选</Menu.Item>
</Menu>
}
type="ghost">
一键清空
</Dropdown.Button>,
<Button
type="primary"
loading={addAllLoading}
onClick={this.autoAddAll}>
一键累计
</Button>
];
const handleExportSelectedDetailClick = () => {
if (this.state.slideSelectedKey.length === 0) {
message.warning("未选择条目");
return;
}
const {
cumDeductStore: { currentRecord }
} = this.props;
const url = `${window.location
.origin}/api/bs/hrmsalary/addUpDeduction/exportDetail?accumulatedSpecialAdditionalDeductionId=${currentRecord.id}&ids=${this.state.slideSelectedKey.join(",")}&taxAgentId=${currentRecord.taxAgentId}`;
window.open(url, "_self");
};
const renderBtns = () => {
return [
<Dropdown.Button
onClick={this.handleExportAllDetailClick}
overlay={
<Menu onClick={handleExportSelectedDetailClick}>
<Menu.Item key="1">导出选中</Menu.Item>
</Menu>
}
type="primary">
导出全部
</Dropdown.Button>
];
};
const pagination = {
total: pageObj.total,
showTotal: (total) => `${total}`,
pageSizeOptions: ["10", "20", "50", "100"],
showSizeChanger: true,
onShowSizeChange(current, pageSize) {
setPageObj({ ...pageObj, current, pageSize });
getTableDatas({
current,
pageSize,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId,
declareMonth: monthValue && [monthValue]
});
},
onChange(current) {
setPageObj({ ...pageObj, current, pageSize: pageObj.pageSize });
getTableDatas({
current,
pageSize: pageObj.pageSize,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId,
declareMonth: monthValue && [monthValue]
});
}
};
const rowSelection = {
selectedRowKeys: this.state.selectedKey,
onChange: this.onSelectChange
};
const newColumns = _.map([...columns], (item) => {
if (item.dataIndex === "username") {
return {
...item,
width: 100,
fixed: "left",
render: (text, record) => (
<div className="linkWapper">
<a href="javaScript:void(0);" onClick={() => this.onEdit(record)}>
{text}
</a>
</div>
)
};
} else if (item.dataIndex === "taxAgentName") {
return {
...item,
width: 180,
fixed: "left"
};
} else if (item.dataIndex === "operate") {
return {
...item,
width: 120,
fixed: "right",
render: (text, record) => (
<div className="linkWapper">
<a href="javaScript:void(0);" onClick={() => this.onEdit(record)}>
查看明细
</a>
{
showOperateBtn &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => this.handleOperate(e, record)}>
<Menu.Item key="edit">编辑</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>
</Popover>
}
</div>
)
};
} else {
return { ...item, width: 150 };
}
});
if (_.isEmpty(newColumns)) {
return renderLoading();
}
return (
<div className="cumDeductWrapper">
<WeaTop
title="累计专项附加扣除" // 文字
icon={<i className="icon-coms-fa"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
dropMenuDatas={rightMenu} // 下拉菜单(和页面的右键菜单相同)
buttons={showOperateBtn ? btns : []}
>
<div className="weaTabWrapper">
<WeaTab
searchType={["base", "advanced"]} // base基础搜索框 advanced显示高级搜索按钮
searchsBasePlaceHolder="请输入姓名"
showSearchAd={showSearchAd} // 是否展开高级搜索面板
setShowSearchAd={(bool) => setShowSearchAd(bool)} //高级搜索面板受控
searchsAd={getSearchs(form, toJS(condition), 2)} // 高级搜索内部数据
buttonsAd={adBtn} // 高级搜索内部按钮
onSearch={() => this.handleSearch()} // 点搜索按钮时的回调
searchsAdQuick={this.getSearchsAdQuick()}
onSearchChange={(v) => form.updateFields({ username: v })} // 在搜索框中输入的文字改变时的回调: 这里需要同步高级搜索和外部搜索框的值
searchsBaseValue={form.getFormParams().username} // 外部input搜索值受控: 这里和高级搜索的requestname同步
/>
</div>
<div className="tableWrapper">
<WeaNewScroll height="100%">
<WeaTable
rowKey="id"
rowSelection={rowSelection}
columns={newColumns}
dataSource={dataSource}
pagination={pagination}
loading={loading}
scroll={{ x: 1300 }}
/>
</WeaNewScroll>
</div>
</WeaTop>
{modalVisiable && (
<ImportModal
needimportSelected //下载模板需要带上导入所选项
init={() => {
this.handleInitModal();
}}
onValidate={() => {
this.handleValidate();
}}
params={modalParam}
columns={modalColumns}
step={step}
setStep={setStep}
slideDataSource={slideDataSource}
importResult={importResult}
onFinish={() => {
setModalVisiable(false);
setStep(0);
doSearch({
declareMonth: this.state.monthValue ? [this.state.monthValue] : "",
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
}}
previewImport={(params) => {
previewImport(params);
}}
importFile={(params) => {
importFile(params);
}}
templateLink={"/api/bs/hrmsalary/addUpDeduction/downloadTemplate"}
renderFormComponent={() => this.renderFormComponent()}
visiable={modalVisiable}
onCancel={() => {
this.handleCancel();
}}
/>
)}
{(slideVisiable || addVisible) && (
<WeaSlideModal
className="slideOuterWrapper"
visible={slideVisiable || addVisible}
top={0}
width={60}
height={100}
direction="right"
measure="%"
title={
<SlideModalTitle
subtitle={addVisible ? (!_.isEmpty(editId) ? "编辑" : "新建") : "累计专项附加扣除记录"}
loading={saveLoading}
onSave={() => {
const { baseInfo } = this.addItemRef.state;
const bool = _.every(_.pick(baseInfo, ["declareMonth", "taxAgentId", "employeeId"]), v => !_.isEmpty(v));
if (!bool && _.isEmpty(editId)) {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
return;
}
const payload = {
..._.pick(baseInfo, ["declareMonth", "taxAgentId", "employeeId", "taxAgentName"]),
...addForm.getFormParams()
};
this.handleSaveDeduction(payload);
}}
editable={!!addVisible}
showOperateBtn={showOperateBtn}
customOperate={(showOperateBtn && !addVisible) ? renderBtns() : []}
/>
}
content={
addVisible ?
<AddItems
ref={(dom) => this.addItemRef = dom}
taxAgentOption={taxAgentOption}
form={addForm}
editId={editId}
condition={dataCollectCondition}
/> :
<EditSlideContent
slideSelectedKey={slideSelectedKey}
onChangeSlideSelectKey={(val) =>
this.setState({ slideSelectedKey: val })
}
/>
}
onClose={() => {
setSlideVisiable(false);
this.setState({
addVisible: false,
editId: {}
});
}}
showMask={true}
closeMaskOnClick={() => {
setSlideVisiable(false);
this.setState({
addVisible: false,
editId: {}
});
}}
/>
)}
</div>
);
}
}