调差功能完成保存功能

This commit is contained in:
黎永顺 2022-12-06 11:34:19 +08:00
parent a6150192f0
commit 672e697170
4 changed files with 521 additions and 16 deletions

View File

@ -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);
};

View File

@ -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;

View File

@ -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}
/>
);

View File

@ -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) {