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

826 lines
26 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.

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 } from "ecCom";
import moment from "moment";
import { getSearchs, renderLoading } from "../../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import ImportModal from "../../../components/importModal";
import { dataCollectCondition, modalColumns } from "./columns";
import AddItems from "../addItems";
import SlideModalTitle from "../../../components/slideModalTitle";
import EditSlideContent from "./editSlideContent";
import { optionAddAll } from "../../../util/options";
import * as API from "../../../apis/otherDeduct";
import "./index.less";
@inject("otherDeductStore", "taxAgentStore")
@observer
export default class OtherDeduct extends React.Component {
constructor(props) {
super(props);
this.state = {
saveLoading: false,
lastLoading: false,
addVisible: false,
editId: {},
value: "",
selectedKey: [],
slideSelectedKey: [], //详情表格的选中项
visiable: false,
monthValue: moment(new Date()).format("YYYY-MM"),
taxAgentId: "All",
inited: false,
modalParam: {
declareMonth: ""
}
};
}
componentWillMount() {
// 初始化渲染页面
const {
otherDeductStore: { doInit, addForm },
taxAgentStore: { fetchTaxAgentOption }
} = this.props;
addForm.initFormFields(dataCollectCondition);
doInit({ declareMonth: [this.state.monthValue], taxAgentId: "" });
fetchTaxAgentOption().then(() => {
this.setState({
inited: true
});
});
}
getSearchsAdQuick() {
const { monthValue, taxAgentId } = this.state;
const {
taxAgentStore: { taxAgentOption },
otherDeductStore: { 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>
);
}
onEdit = record => {
const {
otherDeductStore: {
slideVisiable,
setSlideVisiable,
getOtherDeductDetailList,
setCurrentRecord
}
} = this.props;
setSlideVisiable(true);
setCurrentRecord(record);
getOtherDeductDetailList(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);
}}
dangerouslySetInnerHTML={{ __html: valueSpan }}
/>
);
case "operate":
return (
<a
onClick={() => {
this.onEdit(record);
}}>
查看明细
</a>
);
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
}
};
return newColumn;
});
return newColumns;
};
handleCancel() {
const { otherDeductStore } = this.props;
const { modalVisiable, setModalVisiable, setStep } = otherDeductStore;
setModalVisiable(false);
setStep(0);
}
onOperatesClick = (record, index, operate, flag) => {
switch (operate.index.toString()) {
case "0": // 查看明细
this.onEdit(record);
break;
}
};
renderFormComponent() {
const { modalParam } = this.state;
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: { declareMonth: value } })}
/>
</Col>
</Row>
);
}
showColumn = () => {
const { otherDeductStore: { tableStore } } = this.props;
tableStore.setColSetVisible(true);
tableStore.tableColSet(true);
};
// 初始化导入参数
handleInitImport() {
const {
otherDeductStore: { setSlideDataSource, setImportResult }
} = this.props;
setSlideDataSource([]);
setImportResult({});
}
onSelectChange = val => {
this.setState({
selectedKey: val
});
};
handleSearch = () => {
const { otherDeductStore: { 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});
};
//新功能
handleCreateData = (payload) => {
const { editId } = this.state;
this.setState({ saveLoading: true });
if (!_.isEmpty(editId)) {
API.editData({ ...payload, id: editId.id }).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("编辑成功");
this.setState({
addVisible: false,
editId: {}
}, () => {
const { otherDeductStore: { doSearch, addForm } } = this.props;
const { monthValue, taxAgentId } = this.state;
doSearch({
declareMonth: [monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
addForm.resetForm();
});
} else {
message.error(errormsg || "编辑失败");
}
});
} else {
API.createData(payload).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success("新增成功");
this.setState({
addVisible: false,
editId: {}
}, () => {
const { otherDeductStore: { doSearch, addForm } } = this.props;
const { monthValue, taxAgentId } = this.state;
doSearch({
declareMonth: [monthValue],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
addForm.resetForm();
});
} else {
message.error(errormsg || "新增失败");
}
});
}
};
handleOperate = ({ key }, row) => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { otherDeductStore: { doSearch } } = this.props;
if (key === "edit") {
this.setState({
addVisible: true
}, () => {
API.getData({ 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.deleteSelectData(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
}
});
}
};
deleteSelectData = () => {
const { monthValue: declareMonth, taxAgentId, selectedKey } = this.state;
const { otherDeductStore: { doSearch } } = this.props;
if (selectedKey.length === 0) {
message.warning("未选择条目");
return;
}
const payload = {
declareMonth,
ids: selectedKey
};
Modal.confirm({
title: "信息确认",
content: "确定删除所选数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。",
onOk: () => {
API.deleteSelectData(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
},
onCancel: () => {
}
});
};
deleteAllData = () => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { otherDeductStore: { doSearch } } = this.props;
const payload = {
declareMonth,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
};
Modal.confirm({
title: "信息确认",
content: `确定清空税款所属期为${declareMonth}的所有其他免税扣除数据吗?若数据已参与核算,已参与核算的数据不会受影响,点击核算将会按当前列表最新数据重新核算。`,
onOk: () => {
API.deleteAllData(payload).then(({ status, errormsg }) => {
if (status) {
message.success("删除成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "删除失败");
}
});
}
});
};
//沿用上月
extendToLastMonth = () => {
const { monthValue: declareMonth, taxAgentId } = this.state;
const { otherDeductStore: { doSearch } } = this.props;
const payload = {
declareMonth,
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
};
this.setState({ lastLoading: true });
API.extendToLastMonth(payload).then(({ status, data, errormsg }) => {
this.setState({ lastLoading: false });
if (status) {
message.success(data || "操作成功");
doSearch({
declareMonth: [declareMonth],
taxAgentId: taxAgentId === "All" ? "" : taxAgentId
});
} else {
message.error(errormsg || "操作失败");
}
}).catch(() => this.setState({ lastLoading: false }));
};
handleButtonClick = () => {
if (!this.handleChangeDebounce) {
this.handleChangeDebounce = _.debounce(this.handleChange, 500);
}
this.handleChangeDebounce();
};
handleChange = e => {
const { selectedKey } = this.state;
const url = `${window.location
.origin}/api/bs/hrmsalary/otherDeduction/export?ids=&declareMonth=${this
.state.monthValue}&taxAgentId=${this.state.taxAgentId == "All"
? ""
: this.state.taxAgentId}`;
window.open(url, "_self");
};
handleExportAllDetailClick = () => {
if (!this.handleChangeDebounce) {
const {
otherDeductStore: { currentRecord }
} = this.props;
const url = `${window.location
.origin}/api/bs/hrmsalary/otherDeduction/exportDetail?otherTaxExemptDeductionId=${currentRecord.id}&ids=&taxAgentId=${currentRecord.taxAgentId}`;
window.open(url, "_self");
}
this.handleChangeDebounce();
};
render() {
const { otherDeductStore, taxAgentStore } = this.props;
const {
loading,
dataSource,
columns,
pageObj,
hasRight,
form,
condition,
tableStore,
showSearchAd,
getTableDatas,
doSearch,
setShowSearchAd,
previewImport,
importFile,
addForm
} = otherDeductStore;
const { taxAgentOption, showOperateBtn } = taxAgentStore;
const {
slideVisiable,
setSlideVisiable,
modalVisiable,
setModalVisiable,
slideTableStore,
step,
setStep,
slideDataSource,
importResult,
setPageObj
} = otherDeductStore;
const selectedRowKeys = toJS(tableStore.selectedRowKeys) || [];
const {
modalParam,
monthValue,
taxAgentId,
slideSelectedKey,
addVisible,
editId,
saveLoading,
lastLoading
} = this.state;
const detailSelectedRowKeys = toJS(slideTableStore.selectedRowKeys) || [];
const rightMenu = [
// 右键菜单
// {
// key: "BTN_COLUMN",
// icon: <i className="icon-coms-Custom" />,
// content: "显示列定制",
// onClick: this.showColumn,
// },
];
const collectParams = {
// 收藏功能配置
favname: "其他免税扣除",
favouritetype: 1,
objid: 0,
link: "wui/index.html#/ns_demo03/index",
importantlevel: 1
};
const adBtn = [
// 高级搜索内部按钮
<Button type="primary" onClick={() => doSearch({
taxAgentId: taxAgentId === "All" ? "" : taxAgentId,
declareMonth: monthValue && [monthValue]
})}>
搜索
</Button>,
<Button type="ghost" onClick={() => form.resetForm()}>
重置
</Button>,
<Button type="ghost" onClick={() => setShowSearchAd(false)}>
取消
</Button>
];
const handleMenuClick = () => {
const { selectedKey } = this.state;
if (_.isEmpty(selectedKey)) {
message.warning("未选择条目");
return;
}
const url = `${window.location
.origin}/api/bs/hrmsalary/otherDeduction/export?ids=${selectedKey.join(
","
)}&declareMonth=${this.state.monthValue}&taxAgentId=${this.state
.taxAgentId == "All"
? ""
: this.state.taxAgentId}`;
window.open(url, "_self");
// const {
// otherDeductStore: { exportOtherDeductList },
// } = this.props;
// exportOtherDeductList(selectedKey.join(","));
};
const handleBtnImport = () => {
const { otherDeductStore: { 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.deleteAllData}
overlay={
<Menu onClick={this.deleteSelectData}>
<Menu.Item key="1">删除所选</Menu.Item>
</Menu>
}
type="ghost">
一键清空
</Dropdown.Button>,
<Button
type="primary"
loading={lastLoading}
onClick={this.extendToLastMonth}>
沿用上月
</Button>
];
const handleExportSelectedDetailClick = () => {
if (this.state.slideSelectedKey.length === 0) {
message.warning("未选择条目");
return;
}
const {
otherDeductStore: { currentRecord }
} = this.props;
const url = `${window.location
.origin}/api/bs/hrmsalary/otherDeduction/exportDetail?otherTaxExemptDeductionId=${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 rowSelection = {
selectedRowKeys: this.state.selectedKey,
onChange: this.onSelectChange
};
const pagination = {
total: pageObj.total,
showTotal: total => `${total}`,
showSizeChanger: true,
pageSizeOptions: ["10", "20", "50", "100"],
onShowSizeChange(current, pageSize) {
setPageObj({ ...pageObj, current, pageSize });
getTableDatas({
current,
pageSize,
taxAgentIdL: 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 newColumns = _.map([...columns], item => {
if (item.dataIndex === "username") {
return {
...item,
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
};
} else if (item.dataIndex === "operate") {
return {
...item,
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 };
}
});
if (_.isEmpty(newColumns)) {
return renderLoading();
}
return (
<div className="cumDeductWrapper">
<WeaTop
title="其他免税扣除" // 文字
icon={<i className="icon-coms-meeting"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
dropMenuDatas={rightMenu} // 下拉菜单(和页面的右键菜单相同)
dropMenuProps={{ collectParams }} // 收藏功能: 配置之后显示 收藏、帮助、显示页面地址 这3个功能
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>
<WeaTable
rowKey="id"
rowSelection={rowSelection}
columns={newColumns}
dataSource={dataSource}
pagination={pagination}
loading={loading}
/>
</WeaTop>
{modalVisiable &&
<ImportModal
needimportSelected //下载模板需要带上导入所选项
init={() => {
this.handleInitImport();
}}
templateLink={"/api/bs/hrmsalary/otherDeduction/downloadTemplate"}
params={modalParam}
columns={modalColumns}
step={step}
setStep={setStep}
onFinish={() => {
setModalVisiable(false);
setStep(0);
doSearch({
taxAgentId: taxAgentId === "All" ? "" : taxAgentId,
declareMonth: monthValue && [monthValue]
});
}}
importResult={importResult}
slideDataSource={slideDataSource}
previewImport={params => {
previewImport(params);
}}
importFile={params => {
importFile(params);
}}
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) ? "编辑" : "新建") : "其他免税扣除记录"}
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.handleCreateData(payload);
}}
loading={saveLoading}
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>
);
}
}