diff --git a/pc4mobx/hrmSalary/apis/payroll.js b/pc4mobx/hrmSalary/apis/payroll.js index 58c2ec3d..eaf11a11 100644 --- a/pc4mobx/hrmSalary/apis/payroll.js +++ b/pc4mobx/hrmSalary/apis/payroll.js @@ -12,6 +12,10 @@ export const getPayrollList = params => { body: JSON.stringify(params) }).then(res => res.json()); }; +// 工资单发放进度条 +export const getPayrollIssuanceProgressBar = (id) => { + return WeaTools.callApi("/api/bs/hrmsalary/progress/getRate?cacheKey=SALARY_GRANT_PROGRESS_" + id, "get", {}); +}; //工资单-获取table提示信息 export const getPayrollInfo = params => { diff --git a/pc4mobx/hrmSalary/apis/statistics.js b/pc4mobx/hrmSalary/apis/statistics.js index e88c8267..f5f4aff6 100644 --- a/pc4mobx/hrmSalary/apis/statistics.js +++ b/pc4mobx/hrmSalary/apis/statistics.js @@ -74,3 +74,7 @@ export const statisticsEmployeeList = (params) => { export const statisticsEmployeeDetailList = (params) => { return postFetch("/api/bs/hrmsalary/report/statistics/employee/detailList", params); }; +//数据透视-列表查询 +export const getDataPerspective = (params) => { + return postFetch("/api/bs/hrmsalary/report/statistics/report/getDataPerspective", params); +}; diff --git a/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js b/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js index 8472895c..55ccc872 100644 --- a/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js @@ -8,7 +8,10 @@ import { getQueryString } from "../../../util/url"; import { getSearchs, renderLoading } from "../../../util"; import CustomPaginationTable from "../../../components/customPaginationTable"; import PayrollPartTable from "./payrollPartTable"; +import { getPayrollIssuanceProgressBar } from "../../../apis/payroll"; +import ProgressModal from "../../../components/progressModal"; +const getLabel = WeaLocaleProvider.getLabel; const { ButtonSelect } = WeaDropdown; const getLabel = WeaLocaleProvider.getLabel; @inject("payrollStore") @@ -20,6 +23,8 @@ export default class PayrollGrant extends React.Component { selectedRowKeys: [], currentId: "", selectedKey: "0", + progressVisible: false, + progress: 0, payrollPartModalParams: { visible: false, title: getLabel(538012, "工资单发放"), @@ -28,6 +33,7 @@ export default class PayrollGrant extends React.Component { } }; this.pageInfo = { current: 1, pageSize: 10 }; + this.timer = null; } componentWillMount() { @@ -66,6 +72,7 @@ export default class PayrollGrant extends React.Component { // 发放 handleGrant = (record) => { + this.setState({ progress: 0 }); const { payrollStore } = this.props; const { currentId, selectedKey } = this.state; const { grantPayroll, getInfoList } = payrollStore; @@ -73,14 +80,39 @@ export default class PayrollGrant extends React.Component { ...record, salarySendId: currentId }).then(() => { - getInfoList({ - salarySendId: currentId, - isGranted: selectedKey !== "0", - current: this.pageInfo.current, - pageSize: this.pageInfo.pageSize + this.setState({ progressVisible: true }); + if (this.timer) clearInterval(this.timer); + this.timer = setInterval(() => { + getPayrollIssuanceProgressBar(currentId).then(({ data, status }) => { + let progress = data.progress; + if (progress === 1 && this.timer) { + clearInterval(this.timer); + this.timer = null; + this.setState({ + progressVisible: false, + progress: 0 + }); + message.success(data.message); + getInfoList({ + salarySendId: currentId, + isGranted: selectedKey !== "0", + current: this.pageInfo.current, + pageSize: this.pageInfo.pageSize - }); - this.handleClose(); + }); + this.handleClose(); + } else if (!data.status) { + clearInterval(this.timer); + this.timer = null; + this.setState({ + progressVisible: false, + progress: 0 + }); + message.error(data.message); + } + this.setState({ progress: Number(progress) * 100 }); + }); + }, 1000); }); }; @@ -159,6 +191,7 @@ export default class PayrollGrant extends React.Component { }; // 全部发送 handleGrantAll = () => { + this.setState({ progress: 0 }); const { payrollStore } = this.props; const { currentId, selectedKey } = this.state; const { grantPayroll, getInfoList } = payrollStore; @@ -166,22 +199,73 @@ export default class PayrollGrant extends React.Component { ids: [], salarySendId: currentId }).then(() => { - getInfoList({ - salarySendId: currentId, - isGranted: selectedKey !== "0" - }); + this.setState({ progressVisible: true }); + if (this.timer) clearInterval(this.timer); + this.timer = setInterval(() => { + getPayrollIssuanceProgressBar(currentId).then(({ data, status }) => { + let progress = data.progress; + if (progress === 1 && this.timer) { + clearInterval(this.timer); + this.timer = null; + this.setState({ + progressVisible: false, + progress: 0 + }); + message.success(data.message); + getInfoList({ + salarySendId: currentId, + isGranted: selectedKey !== "0" + }); + } else if (!data.status) { + clearInterval(this.timer); + this.timer = null; + this.setState({ + progressVisible: false, + progress: 0 + }); + message.error(data.message); + } + this.setState({ progress: Number(progress) * 100 }); + }); + }, 1000); }); }; // 发放所选 fetchGrantPayRoll = (payload) => { + this.setState({ progress: 0 }); const { selectedKey, currentId } = this.state; const { payrollStore: { grantPayroll, getInfoList } } = this.props; grantPayroll(payload).then(() => { - getInfoList({ - salarySendId: currentId, - isGranted: selectedKey !== "0" - }); - this.setState({ selectedRowKeys: [] }); + this.setState({ progressVisible: true }); + if (this.timer) clearInterval(this.timer); + this.timer = setInterval(() => { + getPayrollIssuanceProgressBar(currentId).then(({ data, status }) => { + let progress = data.progress; + if (progress === 1 && this.timer) { + clearInterval(this.timer); + this.timer = null; + this.setState({ + progressVisible: false, + progress: 0 + }); + message.success(data.message); + getInfoList({ + salarySendId: currentId, + isGranted: selectedKey !== "0" + }); + this.setState({ selectedRowKeys: [] }); + } else if (!data.status) { + clearInterval(this.timer); + this.timer = null; + this.setState({ + progressVisible: false, + progress: 0 + }); + message.error(data.message); + } + this.setState({ progress: Number(progress) * 100 }); + }); + }, 1000); }); }; @@ -218,7 +302,7 @@ export default class PayrollGrant extends React.Component { const { payrollStore } = this.props; const { salaryGrantTableStore: columns, salarySendDetailBaseInfo } = payrollStore; const notShowGrantOrWithdraw = salarySendDetailBaseInfo.haveBackCalc === 1 && salarySendDetailBaseInfo.salaryAcctType === "0"; - return [ + return _.map([ ...toJS(columns), { title: getLabel(30585, "操作"), @@ -226,7 +310,7 @@ export default class PayrollGrant extends React.Component { dataIndex: "", display: true, render: (text, record) => { - if (record.sendStatus === getLabel(542605, "已发放") && !notShowGrantOrWithdraw) { + if (record.sendStatus === "1" && !notShowGrantOrWithdraw) { return ( { + if (item.dataIndex === "sendStatus") { + return { + ...item, + render: (text, record) => { + return {record.sendStatus === "0" ? getLabel(111, "未发放") : record.sendStatus === "1" ? getLabel(111, "已发放") : getLabel(111, "已撤回")}; + } + }; + } + return { ...item }; + }); }; getSearchsAdQuick() { @@ -505,6 +599,18 @@ export default class PayrollGrant extends React.Component { onWithdraw={this.handleWithdraw} onGrant={this.handleGrant} /> + { + this.state.progressVisible && + { + this.setState({ progressVisible: false, progress: 0 }); + clearInterval(this.timer); + this.timer = null; + }} + progress={this.state.progress} + /> + } ); } diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js b/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js index 96239454..69ebf94e 100644 --- a/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js @@ -1,8 +1,9 @@ import React from "react"; -import { WeaFormItem, WeaInput, WeaSearchGroup, WeaSelect, WeaLocaleProvider } from "ecCom"; +import { WeaCheckbox, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom"; import { inject, observer } from "mobx-react"; import { getReplenishRuleSetOptions } from "../../../apis/payroll"; import { toJS } from "mobx"; +import "./index.less"; const getLabel = WeaLocaleProvider.getLabel; @inject("payrollStore") @@ -32,6 +33,7 @@ export default class BaseInformForm extends React.Component { }, ...toJS(data.salarySobOptions)], request: { ...data.templateBaseData, + msgStatus: !this.props.id ? "1" : data.templateBaseData.msgStatus, reissueRule: data.templateBaseData.replenishRule ? "1" : "0", ...JSON.parse(templateBaseData) } @@ -71,86 +73,99 @@ export default class BaseInformForm extends React.Component { render() { const { request, options, replenishRuleOptions } = this.state; - const { salarySob, name, description, replenishName, replenishRule, reissueRule } = request; + const { salarySob, name, description, replenishName, replenishRule, reissueRule, msgStatus, emailStatus } = request; return ( - - - { - this.state.inited && - this.hanldeChange({ salarySob: value })}/> - } - - - this.hanldeChange({ name: value })} - /> - - - this.hanldeChange({ replenishName: value })} - /> - - - this.hanldeChange({ reissueRule: value })} - /> - - { - reissueRule !== "0" && + + + { + this.state.inited && + this.hanldeChange({ salarySob: value })}/> + } + + + this.hanldeChange({ name: value })} + /> + + + this.hanldeChange({ replenishName: value })} + /> + + this.hanldeChange({ replenishRule: value })} + onChange={value => this.hanldeChange({ reissueRule: value })} /> - } - - this.hanldeChange({ description: value })} - /> - - + { + reissueRule !== "0" && + + this.hanldeChange({ replenishRule: value })} + /> + + } + + this.hanldeChange({ description: value })} + /> + + + + + this.hanldeChange({ msgStatus: value === "1" })}/> + + + this.hanldeChange({ emailStatus: value === "1" })}/> + + + ); } } diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less b/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less index 64b3892d..4bfbe9d0 100644 --- a/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less @@ -223,3 +223,15 @@ padding: 16px; } } + +.payrollBaseInfoWrapper { + .wea-form-cell-wrapper { + border: 1px solid #e5e5e5; + border-bottom: none; + + .wea-form-item { + padding: 5px 16px; + border-bottom: 1px solid #e5e5e5; + } + } +} diff --git a/pc4mobx/hrmSalary/pages/reportView/components/index.less b/pc4mobx/hrmSalary/pages/reportView/components/index.less index 33c5aed0..322df827 100644 --- a/pc4mobx/hrmSalary/pages/reportView/components/index.less +++ b/pc4mobx/hrmSalary/pages/reportView/components/index.less @@ -48,3 +48,18 @@ align-items: center; } } + +.pivot-wrapper { + .wea-dialog-body { + height: 80vh !important; + padding: 16px; + + .wea-new-scroll { + height: 100% !important; + } + } + + .ant-spin-nested-loading, .ant-spin-container { + height: 100%; + } +} diff --git a/pc4mobx/hrmSalary/pages/reportView/components/povitpivotChartModal.js b/pc4mobx/hrmSalary/pages/reportView/components/povitpivotChartModal.js new file mode 100644 index 00000000..4af04328 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/reportView/components/povitpivotChartModal.js @@ -0,0 +1,136 @@ +/* + * Author: 黎永顺 + * name: 数据透视弹框 + * Description: + * Date: 2023/6/8 + */ +import React, { Component } from "react"; +import { WeaDialog, WeaLocaleProvider } from "ecCom"; +import { WeaTableNew } from "comsMobx"; +import { Spin } from "antd"; +import { toJS } from "mobx"; +import { inject, observer } from "mobx-react"; +import "./index.less"; + +const WeaTableComx = WeaTableNew.WeaTable; +const { getLabel } = WeaLocaleProvider; + +@inject("payrollFilesStore") +@observer +class PovitpivotChartModal extends Component { + constructor(props) { + super(props); + this.state = { + dataSource: [], + loading: false, + pageInfo: { + current: 1, pageSize: 10, total: 0 + } + }; + } + + componentDidMount() { + window.addEventListener("message", this.handleReceive, false); + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) { + const { id, dimensionId, dimensionValue } = nextProps; + this.getDataPerspective({ id, dimensionId, dimensionValue }); + } else { + this.setState({ + dataSource: [], + loading: false, + pageInfo: { + current: 1, pageSize: 10, total: 0 + } + }); + } + } + + componentWillUnmount() { + window.removeEventListener("message", this.handleReceive, false); + } + + handleReceive = ({ data }) => { + const { type, payload: { id, params } = {} } = data; + const { dataSource, pageInfo } = this.state; + if (type === "init") { + const { payrollFilesStore: { pivotTableStore } } = this.props; + const columns = _.filter(toJS(pivotTableStore.columns), (item) => item.display === "true" && item.dataIndex !== "randomFieldId"); + this.postMessageToChild({ + dataSource, showSum: false, pageInfo, columns + }); + } else if (type === "turn") { + if (id === "PAGEINFO") { + const { id, dimensionId, dimensionValue } = this.props; + const { pageNum: current, size: pageSize } = params; + this.setState({ pageInfo: { ...pageInfo, current, pageSize } }, () => + this.getDataPerspective({ + id, + dimensionId, + dimensionValue + })); + } + } + }; + postMessageToChild = (payload) => { + const childFrameObj = document.getElementById("commonTable"); + const { dataSource, showSum = false, pageInfo, columns } = payload; + childFrameObj && childFrameObj.contentWindow.postMessage(JSON.stringify({ + dataSource, columns, showSum, pageInfo + }), "*"); + }; + getDataPerspective = (payload) => { + const { pageInfo } = this.state; + const { payrollFilesStore: { getDataPerspective } } = this.props; + this.setState({ loading: true }); + getDataPerspective({ ...payload, ...pageInfo }).then(({ status, data }) => { + this.setState({ loading: false }); + if (status) { + const { pageInfo: { list, pageNum: current, pageSize, total } } = data; + this.setState({ + dataSource: list || [], + pageInfo: { ...pageInfo, current, pageSize, total } + }); + } + }).catch(() => this.setState({ loading: false })); + }; + getColumns = () => { + const { dataSource, pageInfo } = this.state; + const { payrollFilesStore: { pivotTableStore } } = this.props; + const columns = _.filter(toJS(pivotTableStore.columns), (item) => item.display === "true" && item.dataIndex !== "randomFieldId"); + this.postMessageToChild({ + columns, dataSource, + showSum: false, pageInfo + }); + }; + + render() { + const { loading } = this.state; + const { payrollFilesStore: { pivotTableStore } } = this.props; + return ( + + +