From a193ed669015a180eb9d9c496d0b87e6d9aa428d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Tue, 13 Dec 2022 16:10:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=AA=E8=B5=84=E8=B4=A6=E5=A5=97=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/ledger.js | 14 ++ .../LedgerBackCalculatedSalaryItemTable.js | 102 +++++++++ .../pages/ledgerPage/components/index.less | 40 +++- .../components/ledgerAdjustRuleAddModal.js | 75 +++++-- .../components/ledgerBackCalcEditSlide.js | 196 ++++++++++++++++++ .../ledgerBackCalculatedSalaryItem.js | 104 ++++++++++ .../components/ledgerSalaryAdjustmentRules.js | 95 ++++++++- .../ledgerPage/components/ledgerSlide.js | 45 +++- pc4mobx/hrmSalary/pages/ledgerPage/config.js | 88 ++++++++ .../pages/salaryItem/formalFormModal.js | 8 +- 10 files changed, 734 insertions(+), 33 deletions(-) create mode 100644 pc4mobx/hrmSalary/pages/ledgerPage/components/LedgerBackCalculatedSalaryItemTable.js create mode 100644 pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerBackCalcEditSlide.js create mode 100644 pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerBackCalculatedSalaryItem.js diff --git a/pc4mobx/hrmSalary/apis/ledger.js b/pc4mobx/hrmSalary/apis/ledger.js index 2d411cd3..254c4643 100644 --- a/pc4mobx/hrmSalary/apis/ledger.js +++ b/pc4mobx/hrmSalary/apis/ledger.js @@ -268,3 +268,17 @@ export const listAdjustmentRule = params => { body: JSON.stringify(params) }).then(res => res.json()); }; + +//获取回算薪资项目 +export const getAggregate = params => { + return WeaTools.callApi("/api/bs/hrmsalary/salarysob/backitem/getAggregate", "GET", params); +}; + +//编辑回算薪资项目详情 +export const getBackitemForm = params => { + return WeaTools.callApi("/api/bs/hrmsalary/salarysob/backitem/getForm", "GET", params); +}; +//保存回算薪资项目详情 +export const salarysobBackitemSave = params => { + return postFetch("/api/bs/hrmsalary/salarysob/backitem/save", params); +}; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/LedgerBackCalculatedSalaryItemTable.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/LedgerBackCalculatedSalaryItemTable.js new file mode 100644 index 00000000..5fa8bfdd --- /dev/null +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/LedgerBackCalculatedSalaryItemTable.js @@ -0,0 +1,102 @@ +/* + * Author: 黎永顺 + * name: 回算薪资项目表格数据 + * Description: + * Date: 2022/12/13 + */ +import React, { Component } from "react"; +import { WeaTable } from "ecCom"; +import { inject, observer } from "mobx-react"; +import LedgerBackCalcEditSlide from "./ledgerBackCalcEditSlide"; + +@inject("taxAgentStore") +@observer +class LedgerBackCalculatedSalaryItemTable extends Component { + constructor(props) { + super(props); + this.state = { + backCalcEditSlide: { + visible: false, + title: "编辑薪资项目", + id: "", + salaryItemId: "" + } + }; + } + + handleEditBackCalc = (record) => { + const { id, salaryItemId } = record; + const { backCalcEditSlide } = this.state; + this.setState({ + backCalcEditSlide: { + ...backCalcEditSlide, + visible: true, + id, + salaryItemId + } + }); + }; + handleClose = (isRefresh = false) => { + const { backCalcEditSlide } = this.state; + const { onRefresh } = this.props; + this.setState({ + backCalcEditSlide: { + ...backCalcEditSlide, + visible: false, + id: "", + salaryItemId: "" + } + }, () => { + isRefresh && onRefresh(); + }); + }; + + render() { + const { backCalcEditSlide } = this.state; + const { taxAgentStore: { showOperateBtn }, dataSource, editId } = this.props; + const columns = [ + { + dataIndex: "name", + title: "薪资项目", + render: (text) => { + return {text}; + } + }, + { + dataIndex: "formulaContent", + title: "核算公式", + render: (text, record) => { + return {text}; + } + }, + { + dataIndex: "", + title: "操作", + width: 80, + render: (text, record, index) => { + const { canEdit } = record; + return (showOperateBtn && canEdit) ? + this.handleEditBackCalc(record)}>编辑 : ; + } + } + ]; + return ( +
+ + +
+ ); + } +} + +export default LedgerBackCalculatedSalaryItemTable; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/index.less b/pc4mobx/hrmSalary/pages/ledgerPage/components/index.less index f11be705..0fc0fb8d 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/index.less +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/index.less @@ -88,10 +88,11 @@ } } - .adjustRuleDetailWrapper{ + .adjustRuleDetailWrapper { display: flex; flex-direction: column; - .adjustSalaryFlex{ + + .adjustSalaryFlex { display: flex; align-items: center; margin-bottom: 10px; @@ -112,3 +113,38 @@ border-radius: 0; } } + +// 回算薪资项目 +.ledgerBackCalculatedSalaryItemWrapper { + .titleWrapper { + display: flex; + align-items: center; + + & > span { + margin-right: 8px; + } + } +} + +//回算薪资项目编辑弹框 +.backCalcSlideWrapper { + .backCalcSlideCol { + border: 1px solid #ebedf0; + border-bottom: none; + margin: 10px; + + .wea-form-item { + padding: 4px 10px; + border-bottom: 1px solid #ebedf0; + } + } + + .textareaBox { + position: relative; + z-index: 1; + + & > .wea-textarea-normal { + z-index: -11; + } + } +} diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAdjustRuleAddModal.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAdjustRuleAddModal.js index a557844d..220ff5e2 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAdjustRuleAddModal.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAdjustRuleAddModal.js @@ -6,7 +6,7 @@ */ import React, { Component } from "react"; import { WeaDialog, WeaFormItem, WeaHelpfulTip, WeaSearchGroup, WeaSelect } from "ecCom"; -import { Button, Radio } from "antd"; +import { Button, Modal, Radio } from "antd"; import { monthDays } from "../config"; import { listSalarySobItem } from "../../../apis/ledger"; import "./index.less"; @@ -15,7 +15,7 @@ class LedgerAdjustRuleAddModal extends Component { constructor(props) { super(props); this.state = { - beforeAdjustmentType: 4, + beforeAdjustmentType: 2, afterAdjustmentType: 1, salaryItemId: "", salaryItemName: "", @@ -25,11 +25,10 @@ class LedgerAdjustRuleAddModal extends Component { } componentWillReceiveProps(nextProps, nextContext) { - if (nextProps.visible !== this.props.visible && nextProps.salarySobId) this.listSalarySobItem(); + if (nextProps.visible !== this.props.visible && nextProps.salarySobId) this.listSalarySobItem(nextProps.salarySobId); } - listSalarySobItem = () => { - const { salarySobId } = this.props; + listSalarySobItem = (salarySobId) => { const payload = { excludeSalaryItemIds: [], salarySobId @@ -37,11 +36,42 @@ class LedgerAdjustRuleAddModal extends Component { listSalarySobItem(payload).then(({ status, data }) => { if (status) { this.setState({ - salaryItemOptions: _.map(data, it => ({ key: it.id, showname: it.content })) + salaryItemOptions: _.map(data, it => ({ key: it.salaryItemId.toString(), showname: it.salaryItemName })) }); } }); }; + handleSave = () => { + const { salaryRuleItemsList, onSave } = this.props; + const { salaryItemOptions, ...extraItems } = this.state; + if (_.isEmpty(extraItems.salaryItemId)) { + Modal.warning({ + title: "信息确认", + content: "必要信息不完整,红色*为必填项!" + }); + return; + } + const items = { + ...extraItems, + salaryItemName: this.state.salaryItemName, + }; + this.handleReset(); + onSave([...salaryRuleItemsList, items]); + }; + handleReset = () => { + this.setState({ + beforeAdjustmentType: 2, + afterAdjustmentType: 1, + salaryItemId: "", + salaryItemName: "", + dayOfMonth: "1", + salaryItemOptions: [] + }, () => { + const { onCancel } = this.props; + onCancel(); + }); + }; + render() { const { @@ -51,34 +81,37 @@ class LedgerAdjustRuleAddModal extends Component { beforeAdjustmentType, afterAdjustmentType } = this.state; - const { onCancel, title, visible } = this.props; - const buttons = []; + const { title, visible } = this.props; + const buttons = []; return ( - - + + this.setState({ salaryItemId, salaryItemName })} /> - } labelCol={{ span: 8 }} wrapperCol={{ span: 16 }} colon={false}> + } labelCol={{ span: 4 }} wrapperCol={{ span: 20 }} colon={false}>
如果:调薪生效日期在 this.setState({ dayOfMonth })} @@ -87,9 +120,8 @@ class LedgerAdjustRuleAddModal extends Component {
计薪规则为: - { - console.log(value); - }} value={beforeAdjustmentType}> + this.setState({ beforeAdjustmentType: e.target.value })} + value={beforeAdjustmentType}> 取调整后薪资 分段计薪
-
否则:调薪生效日期在{dayOfMonth}号之后
+
否则:调薪生效日期在{dayOfMonth}号之后
计薪规则为: - { - console.log(value); - }} value={afterAdjustmentType}> + this.setState({ afterAdjustmentType: e.target.value })} + value={afterAdjustmentType}> 取调整前薪资 分段计薪 { + getBackitemForm({ id }).then(({ status, data }) => { + if (status) { + this.setState({ ...data }); + } + }); + }; + handleChange = (type, value) => { + this.setState({ + ...this.state, + [type]: value + }); + }; + handleSaveBackCalcItems = () => { + const { salaryItem, loading, backCalcEditFormulModal, ...extra } = this.state; + const { salaryItemId, editId: salarySobId, onCancle } = this.props; + if (extra.valueType === "FORMULA" && _.isEmpty(extra.formulaContent)) { + Modal.warning({ + title: "信息确认", + content: "必要信息不完整,红色*为必填项!" + }); + return; + } + const payload = { ...extra, salarySobId, salaryItemId }; + this.setState({ loading: true }); + salarysobBackitemSave(payload).then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success("保存成功"); + onCancle(true); + } else { + message.error(errormsg || "保存失败"); + } + }).catch(() => this.setState({ loading: false })); + }; + handleEditFormnul = () => { + const { backCalcEditFormulModal, valueType, dataType } = this.state; + this.setState({ + backCalcEditFormulModal: { + ...backCalcEditFormulModal, + visible: true, + valueType, + dataType: _.lowerCase(dataType) + } + }); + }; + handleCloseEditFormnul = () => { + const { backCalcEditFormulModal } = this.state; + this.setState({ + backCalcEditFormulModal: { + ...backCalcEditFormulModal, + visible: false, + valueType: "", + dataType: "" + } + }); + }; + + render() { + const { title, visible, showOperateBtn, onCancle } = this.props; + const { + valueType, + dataType, + roundingMode, + pattern, + salaryItem = [], + loading, + formulaContent, + backCalcEditFormulModal + } = this.state; + const salaryItemName = salaryItem[0] ? salaryItem[0].name : ""; + return ( + + } + content={ +
+ + + + + + + + + + + + this.handleChange("roundingMode", v)} + /> + + + + + this.handleChange("pattern", v)} + /> + + + + + this.handleChange("valueType", v)} + /> + + { + valueType === "FORMULA" && + +
+ +
+ {/*公式弹框*/} + { + backCalcEditFormulModal.visible && + this.setState({ + ...this.state, + formulaId: data.id, + formulaContent: data.formula + })} + onCancel={this.handleCloseEditFormnul} + /> + } +
+ } + +
+
+ } + onClose={onCancle} + /> + ); + } +} + +export default LedgerBackCalcEditSlide; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerBackCalculatedSalaryItem.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerBackCalculatedSalaryItem.js new file mode 100644 index 00000000..e7382646 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerBackCalculatedSalaryItem.js @@ -0,0 +1,104 @@ +/* + * Author: 黎永顺 + * name: 回算薪资项目 + * Description: + * Date: 2022/12/13 + */ +import React, { Component } from "react"; +import { WeaHelpfulTip, WeaSearchGroup } from "ecCom"; +import LedgerBackCalculatedSalaryItemTable from "./LedgerBackCalculatedSalaryItemTable"; +import { getAggregate } from "../../../apis/ledger"; +import "./index.less"; + +class LedgerBackCalculatedSalaryItem extends Component { + constructor(props) { + super(props); + this.state = { + backCalcItems: [ + { + key: "issuedItems", + label: "已发项目设置", + dataSource: [], + helpContent: [ + "核算时,已发项目的公式中各项目值均取该项目在该账套核算中的最后一次核算值;", + "已发项目的公式设置,只可在【取最后一次核算值的项目】中选择;" + ] + }, + { + key: "reissueItems", + label: "补发项目设置", + dataSource: [], + helpContent: [ + "系统内置补发项目【补发薪资合计】,可新增其他的项目,如【补发备注】等;", + "公式取值为当次回算的核算值。" + ] + } + ] + }; + } + + componentDidMount() { + this.getAggregate(); + } + + getAggregate = () => { + const { editId: salarySobId } = this.props; + const { backCalcItems } = this.state; + getAggregate({ salarySobId }).then(({ status, data }) => { + if (status) { + this.setState({ + backCalcItems: _.map(backCalcItems, item => { + const { key } = item; + return { + ...item, + dataSource: data[key] + }; + }) + }); + } + }); + }; + + render() { + const { backCalcItems } = this.state; + return ( +
+ { + _.map(backCalcItems, item => { + const { key, label, helpContent, dataSource } = item; + return ( + + } + showGroup + > + + ); + }) + } +
+ ); + } +} + +export default LedgerBackCalculatedSalaryItem; + +const TitleComp = (props) => { + const helpContent = _.map(props.helpContent, (it, idx) => { + return
{`${idx + 1}、${it}`}
; + }); + return
+ {props.title} + +
; +}; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSalaryAdjustmentRules.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSalaryAdjustmentRules.js index 9ab9f162..706b0ff5 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSalaryAdjustmentRules.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSalaryAdjustmentRules.js @@ -7,7 +7,9 @@ import React, { Component } from "react"; import { inject, observer } from "mobx-react"; import { WeaButtonIcon, WeaTab, WeaTable } from "ecCom"; +import { Modal } from "antd"; import LedgerAdjustRuleAddModal from "./ledgerAdjustRuleAddModal"; +import { listAdjustmentRule } from "../../../apis/ledger"; @inject("taxAgentStore") @observer @@ -16,7 +18,6 @@ class LedgerSalaryAdjustmentRules extends Component { super(props); this.state = { dataSource: [], - columns: [], adjustRuleAddModal: { visible: false, title: "调薪计薪规则项", @@ -25,6 +26,24 @@ class LedgerSalaryAdjustmentRules extends Component { }; } + componentDidMount() { + this.listAdjustmentRule(); + } + + listAdjustmentRule = () => { + const { editId: salarySobId } = this.props; + listAdjustmentRule({ salarySobId }).then(({ status, data }) => { + if (status) { + this.setState({ + dataSource: data + }, () => { + const { onSaveParams } = this.props; + const { dataSource } = this.state; + onSaveParams(dataSource); + }); + } + }); + }; handleAddAdjustRule = () => { const { adjustRuleAddModal } = this.state; const { editId } = this.props; @@ -46,14 +65,73 @@ class LedgerSalaryAdjustmentRules extends Component { } }); }; + handleDelete = (index) => { + const { dataSource } = this.state; + Modal.confirm({ + title: "信息确认", + content: "确认要删除吗?", + onOk: () => { + this.setState({ + dataSource: _.filter(dataSource, (it, idx) => idx !== index) + }, () => { + const { onSaveParams } = this.props; + const { dataSource } = this.state; + onSaveParams(dataSource); + }); + } + }); + }; + convertAdjustmentType = (index) => { + const nameList = { + 1: "取调薪前薪资", + 2: "取调薪后薪资", + 3: "平均值", + 4: "分段计薪" + }; + return nameList[Number(index)]; + }; render() { - const { taxAgentStore: { showOperateBtn }, editId } = this.props; + const { taxAgentStore: { showOperateBtn }, editId, onSaveParams } = this.props; const { adjustRuleAddModal } = this.state; - const { dataSource, columns } = this.state; + const { dataSource } = this.state; const btns = showOperateBtn ? [ ] : []; + const columns = [ + { + title: "序号", + dataIndex: "index", + width: 60, + render: (text, record, index) => { + return index + 1; + } + }, + { + dataIndex: "salaryItemName", + title: "薪资项目", + render: (text) => { + return {text}; + } + }, + { + dataIndex: "salaryCalculationRules", + title: "计薪规则", + render: (text, record) => { + const salaryCalculationRules = `${record.dayOfMonth}号(含)之前调薪,${this.convertAdjustmentType(record.beforeAdjustmentType)};${record.dayOfMonth}号之后调薪,${this.convertAdjustmentType(record.afterAdjustmentType)}`; + return {salaryCalculationRules}; + } + }, + { + dataIndex: "", + title: "操作", + width: 80, + render: (text, record, index) => { + return showOperateBtn ? + this.handleDelete(index)}>删除 : ; + } + } + ]; return (
@@ -65,7 +143,18 @@ class LedgerSalaryAdjustmentRules extends Component { /> { + this.setState({ dataSource }, () => { + const { dataSource } = this.state; + const ruleParams = _.map(dataSource, it => { + const { salaryCalculationRules, ...params } = it; + return { ...params }; + }); + onSaveParams(ruleParams); + }); + }} />
); diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js index 1eb231da..02402512 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js @@ -12,7 +12,8 @@ import SlideModalTitle from "../../../components/slideModalTitle"; import LedgerBaseSetting from "./ledgerBaseSetting"; import LedgerAssociatedPersonnel from "./ledgerAssociatedPersonnel"; import LedgerSalaryAdjustmentRules from "./ledgerSalaryAdjustmentRules"; -import { saveLedgerBasic } from "../../../apis/ledger"; +import LedgerBackCalculatedSalaryItem from "./ledgerBackCalculatedSalaryItem"; +import { saveAdjustmentRule, saveLedgerBasic } from "../../../apis/ledger"; import "./index.less"; const Step = WeaSteps.Step; @@ -32,10 +33,17 @@ class LedgerSlide extends Component { this.state = { current: 0, loading: false, - baseSettingInfo: {} + baseSettingInfo: {}, + adjustRules: [] }; } + /* + * Author: 黎永顺 + * Description: 保存基本信息 + * Params: + * Date: 2022/12/12 + */ saveLedgerBasic = () => { const { baseSettingInfo, current } = this.state; const { editId } = this.props; @@ -61,6 +69,29 @@ class LedgerSlide extends Component { } }).catch(() => this.setState({ loading: false })); }; + /* + * Author: 黎永顺 + * Description: 保存调薪计薪规则 + * Params: + * Date: 2022/12/12 + */ + saveLedgerAdjustRule = () => { + const { adjustRules } = this.state; + const payload = { + salarySobId: this.props.editId, + ruleParams: adjustRules + }; + this.setState({ loading: true }); + saveAdjustmentRule(payload).then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success("保存成功"); + } else { + message.success(errormsg || "保存失败"); + } + }).catch(() => this.setState({ loading: false })); + } + ; handleChangeSlideTab = (current) => { this.setState({ current: Number(current) }); }; @@ -86,8 +117,12 @@ class LedgerSlide extends Component { case 1: CurrentDom = ; break; + case 3: + CurrentDom = ; + break; case 4: - CurrentDom = ; + CurrentDom = + this.setState({ adjustRules })}/>; break; default: CurrentDom = null; @@ -136,9 +171,9 @@ class LedgerSlide extends Component { CurrentDom = !editId ? [ , - + ] : [ - + ]; break; default: diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/config.js b/pc4mobx/hrmSalary/pages/ledgerPage/config.js index 01fb9d44..6bd81428 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/config.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/config.js @@ -666,3 +666,91 @@ export const monthDays = [ showname: "31号" } ]; +export const fieldType = [ + { + key: "STRING", + selected: false, + showname: "字符" + }, + { + key: "NUMBER", + selected: false, + showname: "数值" + } +]; +export const valueTaking = [ + { + key: "INPUT", + selected: false, + showname: "输入" + }, + { + key: "FORMULA", + selected: false, + showname: "公式" + } +]; +export const roundingRules = [ + { + key: "RAW_DATA", + selected: false, + showname: "原始数据" + }, + { + key: "ROUNDING", + selected: false, + showname: "四舍五入" + }, + { + key: "ROUND_UP", + selected: false, + showname: "向上舍入" + }, + { + key: "ROUND_DOWN", + selected: false, + showname: "向下舍入" + }, + { + key: "CEILING", + selected: false, + showname: "见分进角" + }, + { + key: "UP_EVEN", + selected: false, + showname: "向上求偶" + }, +]; +export const keepDecimalPlaces = [ + { + key: "0", + selected: false, + showname: "0" + }, + { + key: "1", + selected: false, + showname: "1" + }, + { + key: "2", + selected: false, + showname: "2" + }, + { + key: "3", + selected: false, + showname: "3" + }, + { + key: "4", + selected: false, + showname: "4" + }, + { + key: "5", + selected: false, + showname: "5" + } +]; diff --git a/pc4mobx/hrmSalary/pages/salaryItem/formalFormModal.js b/pc4mobx/hrmSalary/pages/salaryItem/formalFormModal.js index 3ddf0cad..92de743a 100644 --- a/pc4mobx/hrmSalary/pages/salaryItem/formalFormModal.js +++ b/pc4mobx/hrmSalary/pages/salaryItem/formalFormModal.js @@ -67,6 +67,12 @@ export default class FormalFormModal extends React.Component { let groupParams = {}; if (this.props.valueType == "3") { groupParams = { "referenceType": "sql" }; + } else if (this.props.valueType === "FORMULA") { + groupParams = { "referenceType": "backCalc" }; + this.referenceType = "backCalc"; + this.setState({ + value: this.props.formulaContent + }); } salaryAcctImportTemplateParam(groupParams); } @@ -247,7 +253,7 @@ export default class FormalFormModal extends React.Component { const { value, formulaDatasourceList, extendParam } = this.state; return (