salary-management-front/pc4mobx/hrmSalary/pages/calculate/index.js

392 lines
12 KiB
JavaScript

import React from "react";
import { inject, observer } from "mobx-react";
import { Button, DatePicker, Dropdown, Menu, message, Modal, Tag } from "antd";
import { WeaInputSearch, WeaLocaleProvider, WeaNewScroll, WeaTop } from "ecCom";
import { renderNoright } from "../../util";
import CustomTab from "../../components/customTab";
import moment from "moment";
import BaseFormModal from "./baseFormModal";
import CustomPaginationTable from "../../components/customPaginationTable";
import ProgressModal from "../../components/progressModal";
import "./index.less";
const { getLabel } = WeaLocaleProvider;
const MonthPicker = DatePicker.MonthPicker;
@inject("calculateStore", "taxAgentStore")
@observer
export default class Calculate extends React.Component {
constructor(props) {
super(props);
this.state = {
progressVisible: false,
progress: 0,
value: "",
selectedKey: "0",
searchValue: "",
startDate: moment(new Date()).startOf("year").format("YYYY-MM"),
endDate: moment(new Date()).startOf("month").format("YYYY-MM"),
current: 1
};
this.pageInfo = { current: 1, pageSize: 10 };
}
componentWillMount() {
const { calculateStore } = this.props;
const { getSalaryAcctList } = calculateStore;
getSalaryAcctList({
name: "",
startMonthStr: this.state.startDate,
endMonthStr: this.state.endDate
});
}
// 搜索
handleSearch = (value, extra = {}) => {
const { calculateStore } = this.props;
const { getSalaryAcctList } = calculateStore;
getSalaryAcctList({
name: value,
startMonthStr: this.state.startDate,
endMonthStr: this.state.endDate,
current: this.state.current,
...extra
});
};
handleRangePickerChange(type, value) {
const { calculateStore: { getSalaryAcctList } } = this.props;
this.setState({
[type]: value ? moment(value).format("YYYY-MM") : moment().format("YYYY-MM")
}, () => {
const { startDate: startMonthStr, endDate: endMonthStr } = this.state;
getSalaryAcctList({
name: this.state.searchValue,
startMonthStr,
endMonthStr
});
});
}
// 列表项核算回调
handleAccount(record) {
window.open(
"/spa/hrmSalary/static/index.html#/main/hrmSalary/calculateDetail?id=" +
record.id
);
}
// 列表项删除回调
handleDeleteItem(record) {
Modal.confirm({
title: "信息确认",
content: "确认删除本条数据吗?",
onOk: () => {
const { calculateStore: { deleteSalaryacct } } = this.props;
deleteSalaryacct([record.id]).then(() => {
this.handleSearch(this.state.searchValue);
});
},
onCancel: () => {
}
});
}
// 列表项归档回调
handleFile(record) {
const { calculateStore: { fileSalaryAcct } } = this.props;
this.setState({
progressVisible: true
}, () => {
this.timer = setInterval(() => {
if (this.state.progress !== 100) {
this.setState({
progress: this.state.progress + 1
});
} else {
clearInterval(this.timer);
this.setState({
progressVisible: false,
progress: 0
}, () => {
message.success("归档成功");
this.handleSearch(this.state.searchValue);
});
}
}, 800);
});
fileSalaryAcct(record.id).then(() => {
clearInterval(this.timer);
this.setState({
progressVisible: false,
progress: 0
}, () => {
message.success("归档成功");
this.handleSearch(this.state.searchValue);
});
}).catch(() => {
clearInterval(this.timer);
this.setState({
progressVisible: false,
progress: 0
});
});
}
// 重新核算
handleReaccount(record) {
const { calculateStore: { reAccounting } } = this.props;
reAccounting(record.id).then(() => {
this.handleSearch(this.state.searchValue);
});
}
// 回算
handleBackCalculate = (record) => {
Modal.confirm({
title: "信息确认",
content: "确定回算吗?\n 回算后,正常核算的数据会被覆盖,正常核算的工资单不能继续发放或撤回!",
onOk: () => {
const { calculateStore: { backCalculate } } = this.props;
backCalculate(record.id).then(() => {
this.handleSearch(this.state.searchValue);
});
}
});
};
// 查看详情回调
handleDetail(record) {
window.open(
"/spa/hrmSalary/static/index.html#/main/hrmSalary/placeOnFileDetail?id=" +
record.id
);
}
// 获取列表
getColumns = () => {
const {
calculateStore: { salaryListColumns },
taxAgentStore: { showOperateBtn }
} = this.props;
let columns = [...salaryListColumns].filter(item => item.dataIndex !== "backCalcStatus" && item.dataIndex !== "acctTimes");
columns.map(item => {
if (item.dataIndex === "salarySobName") {
item.width = 300;
item.render = (text, record) => {
return <div className="salarySobNameWrapper">
<span>{text}</span>
<div className="salarySobNameTagWrapper">
{
record.backCalcStatus === 1 &&
<i className="icon-coms-Refresh" title="回算"/>
}
<Tag color="blue">{`${record.acctTimes}`}</Tag>
</div>
</div>;
};
}
if (item.dataIndex === "operate" && showOperateBtn) {
item.width = 150;
item.render = (text, record) => {
const accountBtn = _.take(record.operate, 2);
const notAccountBtn = _.drop(record.operate, 2);
let operateBtn = [];
if (!_.isEmpty(accountBtn)) {
operateBtn.push(
_.map(accountBtn, (it, idx) => {
return (
<div
className="linkWapper"
key={idx}
style={{ display: "inline-block", marginRight: 8 }}>
<a
href="javascript:void(0);"
style={(idx === 1 && it.text.length === 2) ? { padding: "0 12px" } : {}}
onClick={() => this.handleOperateClick(it.index, record)}>
{it.text}
</a>
</div>
);
})
);
}
if (!_.isEmpty(notAccountBtn)) {
operateBtn.push(
<Dropdown
overlay={
<Menu>
{notAccountBtn.map(cz =>
<Menu.Item>
<a
onClick={() => this.handleOperateClick(cz.index, record)}>
{cz.text}
</a>
</Menu.Item>
)}
</Menu>
}>
<a href="javascript:void(0);"><i className="icon-coms-more"/></a>
</Dropdown>
);
}
return operateBtn;
};
}
});
return showOperateBtn ? columns : _.filter(columns, it => it.title !== "操作");
};
handleOperateClick = (index, record) => {
if (index === "0") {
this.handleAccount(record);
} else if (index === "1") {
this.handleDeleteItem(record);
} else if (index === "2") {
this.handleFile(record);
} else if (index === "4") {
this.handleReaccount(record);
} else if (index === "3") {
this.handleDetail(record);
} else if (index === "5") {
this.handleBackCalculate(record);
}
};
// 分页
handleDataPageChange(value) {
this.setState({ current: value });
this.pageInfo.current = value;
const { calculateStore } = this.props;
const { getSalaryAcctList } = calculateStore;
getSalaryAcctList({
name: this.state.searchValue,
startMonthStr: this.state.startDate,
endMonthStr: this.state.endDate,
current: value
});
}
handleShowSizeChange(pageInfo) {
const { calculateStore } = this.props;
const { getSalaryAcctList } = calculateStore;
getSalaryAcctList({
name: this.state.searchValue,
startMonthStr: this.state.startDate,
endMonthStr: this.state.endDate,
...pageInfo
});
}
render() {
const { calculateStore, taxAgentStore: { showOperateBtn } } = this.props;
const { salaryListDataSource, loading, hasRight, salaryListPageInfo } = calculateStore;
const { modalParam } = this.state;
if (!hasRight && !loading) {
// 无权限处理
return renderNoright();
}
const renderRightOperation = () => {
const { startDate, endDate } = this.state;
return (
<div style={{ display: "inline-block" }}>
{showOperateBtn &&
<Button
type="primary"
style={{ marginRight: "10px" }}
// onClick={() => window.open("/spa/hrmSalary/static/index.html#/main/hrmSalary/calculateDetail")}
onClick={() => {
this.setState({ baseFormVisible: true });
}}>
核算
</Button>}
<div
style={{ display: "inline-block", position: "relative", top: 2 }}>
<MonthPicker
value={startDate}
format="YYYY-MM"
disabledDate={(current) => {
return current && endDate && current.getTime() > new Date(endDate).getTime();
}}
onChange={(val) => this.handleRangePickerChange("startDate", val)}
/>
<span className="to" style={{ margin: "0 10px" }}></span>
<MonthPicker
value={endDate}
format="YYYY-MM"
disabledDate={(current) => {
return current && startDate && current.getTime() < new Date(startDate).getTime();
}}
onChange={(val) => this.handleRangePickerChange("endDate", val)}
/>
</div>
<WeaInputSearch
style={{ marginLeft: "10px" }}
value={this.state.searchValue}
placeholder={"请输入薪资账套名称"}
onChange={value => {
this.setState({ searchValue: value });
}}
onSearch={value => {
this.handleSearch(value, { current: 1 });
}}
/>
</div>
);
};
return (
<div className="mySalaryBenefitsWrapper">
{/* 收藏功能: 配置之后显示 收藏、帮助、显示页面地址 这3个功能 */}
<WeaTop
title="薪资核算"
icon={<i className="icon-coms-fa"/>}
iconBgcolor="#F14A2D"
showDropIcon={false}>
<CustomTab searchOperationItem={renderRightOperation()}/>
<div className="tableWrapper">
<WeaNewScroll height="100%">
<CustomPaginationTable
loading={loading}
columns={this.getColumns()}
dataSource={salaryListDataSource}
total={salaryListPageInfo.total}
current={salaryListPageInfo.pageNum}
pageSize={this.pageInfo.pageSize}
onPageChange={value => {
this.handleDataPageChange(value);
}}
onShowSizeChange={(current, pageSize) => {
this.pageInfo = { current, pageSize };
this.handleShowSizeChange(this.pageInfo);
}}
/>
</WeaNewScroll>
</div>
</WeaTop>
{/*归档进度条*/}
{
this.state.progressVisible &&
<ProgressModal
title="正在归档请稍后"
visible={this.state.progressVisible}
onCancel={() => {
this.setState({ progressVisible: false, progress: 0 });
}}
progress={this.state.progress}
/>
}
{this.state.baseFormVisible &&
<BaseFormModal
visible={this.state.baseFormVisible}
onRefresh={() => this.handleSearch(this.state.searchValue)}
onCancel={() => {
this.setState({ baseFormVisible: false });
}}
/>}
</div>
);
}
}