diff --git a/pc4mobx/hrmSalary/apis/standingBook.js b/pc4mobx/hrmSalary/apis/standingBook.js index bcc24408..745b3706 100644 --- a/pc4mobx/hrmSalary/apis/standingBook.js +++ b/pc4mobx/hrmSalary/apis/standingBook.js @@ -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); +}; diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustTable.js b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustTable.js new file mode 100644 index 00000000..a15527d0 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustTable.js @@ -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 ( + this.handleChangeTableItem("target", v, index)} + /> + ); + } + } + ]; + break; + case "welfareType": + item.com = [ + { + width: 220, + type: "custom", + key: "welfareType", + render: (text, record, index, onEdit) => ( + this.handleChangeTableItem("welfareType", v, index)} + /> + ) + } + ]; + break; + case "categoryType": + item.com = [ + { + width: 220, + type: "custom", + key: "categoryType", + render: (text, record, index, onEdit) => ( + this.handleChangeTableItem("categoryType", v, index)} + /> + ) + } + ]; + break; + case "countryTotal": + item.com = [ + { + width: 220, + type: "custom", + key: "countryTotal", + render: (text, record, index, onEdit) => ( + this.handleChangeTableItem("countryTotal", v, index)} + /> + ) + } + ]; + break; + case "companyTotal": + item.com = [ + { + width: 220, + type: "custom", + key: "companyTotal", + render: (text, record, index, onEdit) => ( + this.handleChangeTableItem("companyTotal", v, index)} + /> + ) + } + ]; + break; + case "adjustmentTotal": + item.title = + {item.title} + + ; + item.com = [ + { + width: 220, + type: "custom", + key: "adjustmentTotal", + render: (text, record, index, onEdit) => ( + this.handleChangeTableItem("adjustmentTotal", v, index)} + /> + ) + } + ]; + break; + case "adjustTo": + item.com = [ + { + width: 220, + type: "custom", + key: "adjustTo", + render: (text, record, index, onEdit) => { + return ( + 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 ( + { + const { status } = record; + return this.handleClick(record)}>{status ? "撤回" : "保存"}; + } + } + ] + } + datas={dataSource} + onChange={this.handleChangeCom} + selectedRowKeys={selectedRowKeys} + getRowSelection={this.getRowSelection} + tableProps={{ x: 800 }} + /> + ); + } +} + +export default AdjustTable; diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustmentSlide.js b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustmentSlide.js index 3fda39bf..a7fdc244 100644 --- a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustmentSlide.js +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/adjustmentSlide.js @@ -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 [ - , - , - + ]; }; render() { const { title, visible, onCancel, taxAgentStore: { showOperateBtn } } = this.props; + const { loading } = this.state; return ( } - content={ -
- table -
- } + content={ this.adjustTableRef = dom}/>} onClose={onCancel} /> ); diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/index.less b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/index.less index a8a378d9..c3f0ab99 100644 --- a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/index.less +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBookDetail/components/index.less @@ -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) {