调差功能完成保存功能
This commit is contained in:
parent
a6150192f0
commit
672e697170
|
|
@ -269,8 +269,34 @@ export const getPaymentById = ({ id }) => {
|
|||
}
|
||||
}).then(res => res.json());
|
||||
};
|
||||
//获取社保福利项列表
|
||||
export const compensationCategoryType = ({ id }) => {
|
||||
return fetch(`/api/bs/hrmsalary/siaccount/compensationCategoryType?id=${id}`, {
|
||||
method: "GET",
|
||||
mode: "cors",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
}).then(res => res.json());
|
||||
};
|
||||
|
||||
//获取调差列表
|
||||
export const getCompensationList = (params) => {
|
||||
return postFetch("/api/bs/hrmsalary/siaccount/compensationList", params);
|
||||
};
|
||||
//获取可调差的人员列表
|
||||
export const getEmployeeListToCompensation = (params) => {
|
||||
return postFetch("/api/bs/hrmsalary/siaccount/getEmployeeListToCompensation", params);
|
||||
};
|
||||
//获取当前调差行-公司方支出总计
|
||||
export const getCompensationComTotal = (params) => {
|
||||
return postFetch("/api/bs/hrmsalary/siaccount/compensationComTotal", params);
|
||||
};
|
||||
//社保调差保存
|
||||
export const compensationSave = (params) => {
|
||||
return postFetch("/api/bs/hrmsalary/siaccount/compensationSave", params);
|
||||
};
|
||||
//撤回调差数据
|
||||
export const compensationBack = (params) => {
|
||||
return postFetch("/api/bs/hrmsalary/siaccount/compensationBack", params);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -0,0 +1,428 @@
|
|||
/*
|
||||
* Author: 黎永顺
|
||||
* name: 调差列表
|
||||
* Description:
|
||||
* Date: 2022/12/5
|
||||
*/
|
||||
import React, { Component } from "react";
|
||||
import { WeaHelpfulTip, WeaInputNumber, WeaSelect, WeaTableEdit } from "ecCom";
|
||||
import { message, Modal } from "antd";
|
||||
import {
|
||||
compensationBack,
|
||||
compensationCategoryType,
|
||||
compensationSave,
|
||||
getCompensationComTotal,
|
||||
getCompensationList,
|
||||
getEmployeeListToCompensation
|
||||
} from "../../../../apis/standingBook";
|
||||
import { getQueryString } from "../../../../util/url";
|
||||
import "./index.less";
|
||||
|
||||
class AdjustTable extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
loading: {
|
||||
query: false
|
||||
},
|
||||
dataSource: [],
|
||||
columns: [],
|
||||
selectedRowKeys: [],
|
||||
targetOptions: []
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.getCompensationList().then(r => {
|
||||
});
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps, nextContext) {
|
||||
}
|
||||
|
||||
getCompensationList = async () => {
|
||||
const { pageInfo, loading } = this.state;
|
||||
const billMonth = getQueryString("billMonth");
|
||||
const paymentOrganization = getQueryString("paymentOrganization");
|
||||
const [adjustmentObjEnum] = await Promise.all([this.getEmployeeListToCompensation()]);
|
||||
const { status, data: list } = adjustmentObjEnum;
|
||||
this.setState({ targetOptions: list });
|
||||
const targetOptions = status ? _.map(list, it => ({
|
||||
key: it.employeeId.toString(),
|
||||
showname: it.username
|
||||
})) : [];
|
||||
const payload = {
|
||||
paymentOrganization,
|
||||
billMonth,
|
||||
...pageInfo
|
||||
};
|
||||
this.setState({ loading: { ...loading, query: true } });
|
||||
getCompensationList(payload).then(({ status, data }) => {
|
||||
this.setState({ loading: { ...loading, query: false } });
|
||||
if (status) {
|
||||
const { columns, data: dataSource } = data;
|
||||
this.setState({
|
||||
dataSource: _.map(dataSource, it => {
|
||||
return {
|
||||
...it,
|
||||
welfareType: it.welfareType.toString(),
|
||||
target: it.employeeId.toString(),
|
||||
adjustTo: it.adjustTo.toString(),
|
||||
adjustToOptions: _.map(it.categoryTypeOptions, child => ({ key: child.id, showname: child.content })),
|
||||
categoryTypeOptions: _.map(it.categoryTypeOptions, child => ({ key: child.id, showname: child.content })),
|
||||
targetOptions: _.map(it.targetOptions, child => ({ key: child.id, showname: child.name }))
|
||||
};
|
||||
}),
|
||||
columns: _.map(columns, item => {
|
||||
const { dataIndex } = item;
|
||||
switch (dataIndex) {
|
||||
case "target":
|
||||
item.com = [
|
||||
{
|
||||
type: "custom",
|
||||
key: "target",
|
||||
width: 220,
|
||||
render: (text, record, index, onEdit) => {
|
||||
return (
|
||||
<WeaSelect
|
||||
showSearch
|
||||
optionFilterProp="children"
|
||||
options={targetOptions}
|
||||
value={record.target}
|
||||
style={{ width: "100%" }}
|
||||
viewAttr={3}
|
||||
onChange={v => this.handleChangeTableItem("target", v, index)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
];
|
||||
break;
|
||||
case "welfareType":
|
||||
item.com = [
|
||||
{
|
||||
width: 220,
|
||||
type: "custom",
|
||||
key: "welfareType",
|
||||
render: (text, record, index, onEdit) => (
|
||||
<WeaSelect
|
||||
options={[{ key: "1", showname: "社保" }]}
|
||||
value={record.welfareType}
|
||||
viewAttr={3}
|
||||
onChange={v => this.handleChangeTableItem("welfareType", v, index)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
];
|
||||
break;
|
||||
case "categoryType":
|
||||
item.com = [
|
||||
{
|
||||
width: 220,
|
||||
type: "custom",
|
||||
key: "categoryType",
|
||||
render: (text, record, index, onEdit) => (
|
||||
<WeaSelect
|
||||
multiple
|
||||
options={record.categoryTypeOptions || []}
|
||||
value={record.categoryType}
|
||||
viewAttr={3}
|
||||
onChange={v => this.handleChangeTableItem("categoryType", v, index)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
];
|
||||
break;
|
||||
case "countryTotal":
|
||||
item.com = [
|
||||
{
|
||||
width: 220,
|
||||
type: "custom",
|
||||
key: "countryTotal",
|
||||
render: (text, record, index, onEdit) => (
|
||||
<WeaInputNumber
|
||||
precision={2}
|
||||
value={record.countryTotal}
|
||||
viewAttr={3}
|
||||
onChange={v => this.handleChangeTableItem("countryTotal", v, index)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
];
|
||||
break;
|
||||
case "companyTotal":
|
||||
item.com = [
|
||||
{
|
||||
width: 220,
|
||||
type: "custom",
|
||||
key: "companyTotal",
|
||||
render: (text, record, index, onEdit) => (
|
||||
<WeaInputNumber
|
||||
precision={2}
|
||||
disabled
|
||||
value={record.companyTotal}
|
||||
onChange={v => this.handleChangeTableItem("companyTotal", v, index)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
];
|
||||
break;
|
||||
case "adjustmentTotal":
|
||||
item.title = <span>
|
||||
<span>{item.title}</span>
|
||||
<WeaHelpfulTip
|
||||
width={200}
|
||||
title="国家核算金额(单位) - 公司核算金额(单位)"
|
||||
placement="topLeft"
|
||||
/>
|
||||
</span>;
|
||||
item.com = [
|
||||
{
|
||||
width: 220,
|
||||
type: "custom",
|
||||
key: "adjustmentTotal",
|
||||
render: (text, record, index, onEdit) => (
|
||||
<WeaInputNumber
|
||||
precision={2}
|
||||
disabled
|
||||
value={record.adjustmentTotal}
|
||||
onChange={v => this.handleChangeTableItem("adjustmentTotal", v, index)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
];
|
||||
break;
|
||||
case "adjustTo":
|
||||
item.com = [
|
||||
{
|
||||
width: 220,
|
||||
type: "custom",
|
||||
key: "adjustTo",
|
||||
render: (text, record, index, onEdit) => {
|
||||
return (
|
||||
<WeaSelect
|
||||
options={record.adjustToOptions || []}
|
||||
value={record.adjustTo}
|
||||
viewAttr={3}
|
||||
onChange={v => this.handleChangeTableItem("adjustTo", v, index)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return { ...item, display: true, width: "20%" };
|
||||
})
|
||||
});
|
||||
}
|
||||
}).catch(() => {
|
||||
this.setState({ loading: { ...loading, query: false } });
|
||||
});
|
||||
};
|
||||
compensationCategoryType = (id, index) => {
|
||||
const { dataSource } = this.state;
|
||||
compensationCategoryType({ id }).then(({ status, data }) => {
|
||||
if (status) {
|
||||
this.setState({
|
||||
dataSource: _.map(dataSource, (item, idx) => {
|
||||
if (index === idx) {
|
||||
return {
|
||||
...item,
|
||||
adjustTo: "",
|
||||
adjustToOptions: [],
|
||||
categoryType: "",
|
||||
categoryTypeOptions: _.map(data, child => ({ key: child.id, showname: child.content }))
|
||||
};
|
||||
} else {
|
||||
return { ...item };
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
getEmployeeListToCompensation = () => {
|
||||
const billMonth = getQueryString("billMonth");
|
||||
const paymentOrganization = getQueryString("paymentOrganization");
|
||||
const payload = {
|
||||
billMonth, paymentOrganization,
|
||||
pageNum: 1, pageSize: 100
|
||||
};
|
||||
return getEmployeeListToCompensation(payload);
|
||||
};
|
||||
getCompensationComTotal = (payload, index, categoryType) => {
|
||||
const { dataSource } = this.state;
|
||||
getCompensationComTotal(payload).then(({ status, data }) => {
|
||||
if (status && !_.isEmpty(data)) {
|
||||
this.setState({
|
||||
dataSource: _.map(dataSource, (item, idx) => {
|
||||
if (index === idx) {
|
||||
return {
|
||||
...item,
|
||||
companyTotal: data[0].totalNum,
|
||||
adjustToOptions: categoryType ? _.map(categoryType.split(","), tmpV => {
|
||||
return _.find(item.categoryTypeOptions, tmpJ => tmpJ.key === tmpV);
|
||||
}) : []
|
||||
};
|
||||
} else {
|
||||
return { ...item };
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
handleChangeCom = (dataSource) => {
|
||||
this.setState({ dataSource });
|
||||
};
|
||||
handleChangeTableItem = (filedItemkey, value, index) => {
|
||||
const { dataSource, targetOptions } = this.state;
|
||||
this.setState({
|
||||
dataSource: _.map(dataSource, (item, idx) => {
|
||||
if (index === idx) {
|
||||
return { ...item, [filedItemkey]: value };
|
||||
} else {
|
||||
return { ...item };
|
||||
}
|
||||
})
|
||||
}, () => {
|
||||
const paymentOrganization = getQueryString("paymentOrganization");
|
||||
if (filedItemkey === "target") {
|
||||
this.compensationCategoryType(_.find(targetOptions, it => it.employeeId == value).target, index);
|
||||
} else if (filedItemkey === "categoryType") {
|
||||
_.map(this.state.dataSource, (it, itdx) => {
|
||||
const bool = it.target && it.categoryType;
|
||||
if (bool && itdx === index) {
|
||||
const payload = {
|
||||
paymentOrganization,
|
||||
target: _.find(targetOptions, child => child.employeeId == it.target).target,
|
||||
employeeId: it.target,
|
||||
categoryType: it.categoryType
|
||||
};
|
||||
this.getCompensationComTotal([payload], itdx, it.categoryType);
|
||||
}
|
||||
});
|
||||
} else if (filedItemkey === "countryTotal") {
|
||||
this.setState({
|
||||
dataSource: _.map(this.state.dataSource, (child, childidx) => {
|
||||
if (index === childidx) {
|
||||
return {
|
||||
...child,
|
||||
adjustmentTotal: (Number(child.countryTotal) - Number(child.companyTotal)).toFixed(2)
|
||||
};
|
||||
} else {
|
||||
return { ...child };
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
handleClick = (record) => {
|
||||
const { status, id, paymentOrganization, billMonth } = record;
|
||||
const { targetOptions } = this.state;
|
||||
if (status) {
|
||||
Modal.confirm({
|
||||
title: "信息确认",
|
||||
content: "确定撤回吗?撤回后该笔调差将失效!",
|
||||
onOk: () => {
|
||||
const payload = { id, paymentOrganization, billMonth };
|
||||
compensationBack(payload).then(({ status, data, errormsg }) => {
|
||||
if (status) {
|
||||
message.success(data || "撤回成功");
|
||||
this.getCompensationList().then(r => {
|
||||
});
|
||||
} else {
|
||||
message.error(errormsg || "撤回失败");
|
||||
}
|
||||
});
|
||||
},
|
||||
onCancel: () => {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
Modal.confirm({
|
||||
title: "信息确认",
|
||||
content: "确定保存吗?保存后数据将即时更新到台账!",
|
||||
onOk: () => {
|
||||
const { adjustToOptions, categoryTypeOptions, key, target, ...extraParams } = record;
|
||||
const month = getQueryString("billMonth");
|
||||
const paymentOrg = getQueryString("paymentOrganization");
|
||||
const bool = _.every(Object.keys(record), child => !!record[child]);
|
||||
if (!bool) {
|
||||
Modal.warning({
|
||||
title: "信息确认",
|
||||
content: "必要信息不完整,红色*为必填项!"
|
||||
});
|
||||
return;
|
||||
}
|
||||
const payload = {
|
||||
...extraParams,
|
||||
employeeId: target,
|
||||
target: _.find(targetOptions, child => child.employeeId == target).target,
|
||||
billMonth: month,
|
||||
paymentOrganization: paymentOrg
|
||||
};
|
||||
compensationSave([payload]).then(({ status, data, errormsg }) => {
|
||||
if (status) {
|
||||
const { data: dataMsg } = data;
|
||||
message.success(dataMsg || "保存成功");
|
||||
this.getCompensationList().then(r => {
|
||||
});
|
||||
} else {
|
||||
message.error(errormsg || "保存失败");
|
||||
}
|
||||
});
|
||||
},
|
||||
onCancel: () => {
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
getRowSelection = (rowSelection) => {
|
||||
let sel = { ...rowSelection };
|
||||
sel.getCheckboxProps = (record) => {
|
||||
return { disabled: record.status };
|
||||
};
|
||||
return sel;
|
||||
};
|
||||
|
||||
render() {
|
||||
const { dataSource, columns, selectedRowKeys } = this.state;
|
||||
|
||||
return (
|
||||
<WeaTableEdit
|
||||
deleteConfirm
|
||||
showCopy={false}
|
||||
columns={
|
||||
[
|
||||
...columns,
|
||||
{
|
||||
dataIndex: "operate",
|
||||
title: "操作",
|
||||
key: "operate",
|
||||
width: 80,
|
||||
render: (text, record) => {
|
||||
const { status } = record;
|
||||
return <a href="javascript: void(0);"
|
||||
onClick={() => this.handleClick(record)}>{status ? "撤回" : "保存"}</a>;
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
datas={dataSource}
|
||||
onChange={this.handleChangeCom}
|
||||
selectedRowKeys={selectedRowKeys}
|
||||
getRowSelection={this.getRowSelection}
|
||||
tableProps={{ x: 800 }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default AdjustTable;
|
||||
|
|
@ -6,10 +6,13 @@
|
|||
*/
|
||||
import React, { Component } from "react";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import { WeaButtonIcon, WeaSlideModal } from "ecCom";
|
||||
import { Button } from "antd";
|
||||
import { WeaSlideModal } from "ecCom";
|
||||
import { Button, message, Modal } from "antd";
|
||||
import SlideModalTitle from "../../../../components/slideModalTitle";
|
||||
import AdjustTable from "./adjustTable";
|
||||
import "./index.less";
|
||||
import { getQueryString } from "../../../../util/url";
|
||||
import { compensationSave } from "../../../../apis/standingBook";
|
||||
|
||||
|
||||
@inject("taxAgentStore")
|
||||
|
|
@ -22,6 +25,7 @@ class AdjustmentSlide extends Component {
|
|||
loading: false,
|
||||
taxAgentId: ""
|
||||
};
|
||||
this.adjustTableRef = null;
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps, nextContext) {
|
||||
|
|
@ -29,25 +33,66 @@ class AdjustmentSlide extends Component {
|
|||
}
|
||||
}
|
||||
|
||||
handleSave = () => {
|
||||
let { dataSource, targetOptions } = this.adjustTableRef.state;
|
||||
dataSource = _.filter(dataSource, it => !it.id);
|
||||
const billMonth = getQueryString("billMonth");
|
||||
const paymentOrganization = getQueryString("paymentOrganization");
|
||||
let bool = true;
|
||||
_.map(dataSource, item => {
|
||||
bool = _.every(Object.keys(item), child => !!item[child]);
|
||||
});
|
||||
if (_.isEmpty(dataSource)) {
|
||||
Modal.warning({
|
||||
title: "信息确认",
|
||||
content: "请添加调差项!"
|
||||
});
|
||||
return;
|
||||
} else if (!bool) {
|
||||
Modal.warning({
|
||||
title: "信息确认",
|
||||
content: "必要信息不完整,红色*为必填项!"
|
||||
});
|
||||
return;
|
||||
}
|
||||
const payload = _.map(dataSource, item => {
|
||||
const { adjustToOptions, categoryTypeOptions, target, ...extraParams } = item;
|
||||
return {
|
||||
...extraParams,
|
||||
employeeId: target,
|
||||
target: _.find(targetOptions, child => child.employeeId == target).target,
|
||||
billMonth,
|
||||
paymentOrganization
|
||||
};
|
||||
});
|
||||
this.setState({ loading: true });
|
||||
compensationSave(payload).then(({ status, data, errormsg }) => {
|
||||
this.setState({ loading: false });
|
||||
if (status) {
|
||||
const { data: dataMsg } = data;
|
||||
message.success(dataMsg || "保存成功");
|
||||
this.adjustTableRef.getCompensationList().then(r => {
|
||||
});
|
||||
} else {
|
||||
message.error(errormsg || "保存失败");
|
||||
}
|
||||
}).catch(() => this.setState({ loading: false }));
|
||||
};
|
||||
renderCustomOperate = () => {
|
||||
return [
|
||||
<WeaButtonIcon
|
||||
buttonType="del"
|
||||
type="primary"
|
||||
/>,
|
||||
<WeaButtonIcon buttonType="add" type="primary"/>,
|
||||
<Button type="primary">保存全部</Button>
|
||||
<Button type="primary" onClick={this.handleSave}>保存全部</Button>
|
||||
];
|
||||
};
|
||||
|
||||
render() {
|
||||
const { title, visible, onCancel, taxAgentStore: { showOperateBtn } } = this.props;
|
||||
const { loading } = this.state;
|
||||
return (
|
||||
<WeaSlideModal
|
||||
className="adjustmentWrapper"
|
||||
visible={visible}
|
||||
top={0}
|
||||
width={50}
|
||||
width={100}
|
||||
height={100}
|
||||
direction="right"
|
||||
measure="%"
|
||||
|
|
@ -55,17 +100,13 @@ class AdjustmentSlide extends Component {
|
|||
<SlideModalTitle
|
||||
subtitle={title}
|
||||
tabs={[]}
|
||||
loading={false}
|
||||
loading={loading}
|
||||
showOperateBtn={showOperateBtn}
|
||||
editable={false}
|
||||
customOperate={this.renderCustomOperate()}
|
||||
/>
|
||||
}
|
||||
content={
|
||||
<div>
|
||||
table
|
||||
</div>
|
||||
}
|
||||
content={<AdjustTable ref={dom => this.adjustTableRef = dom}/>}
|
||||
onClose={onCancel}
|
||||
/>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -93,8 +93,9 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//退差人员选择框
|
||||
.regSelectWrapper{
|
||||
.regSelectWrapper {
|
||||
}
|
||||
|
||||
//调差抽屉
|
||||
|
|
@ -110,6 +111,15 @@
|
|||
top: 10px !important;
|
||||
}
|
||||
|
||||
.wea-table-edit table {
|
||||
table-layout: fixed;
|
||||
|
||||
.text-elli {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (min-width: 1260px) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue