From 10e981d0d3d81b2f6026b54430c87ec6a584d706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Thu, 25 Apr 2024 14:26:06 +0800 Subject: [PATCH 001/215] =?UTF-8?q?feature/2.12.1.2404.02-=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E8=B4=A6=E5=A5=97=E9=85=8D=E7=BD=AE=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/ledger.js | 12 ++ .../components/ledgerAccountApprRule.js | 160 ++++++++++++++++++ ...erAccountApprRuleClassifyNameEditDialog.js | 71 ++++++++ .../components/ledgerAccountSalaryItemsSet.js | 134 +++++++++++++++ .../ledgerPage/components/ledgerSlide.js | 78 +++++++-- pc4mobx/hrmSalary/pages/ledgerPage/config.js | 54 ++++++ pc4mobx/hrmSalary/stores/ledger.js | 58 ++++--- 7 files changed, 527 insertions(+), 40 deletions(-) create mode 100644 pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRule.js create mode 100644 pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js create mode 100644 pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js diff --git a/pc4mobx/hrmSalary/apis/ledger.js b/pc4mobx/hrmSalary/apis/ledger.js index 487181bc..d4f64824 100644 --- a/pc4mobx/hrmSalary/apis/ledger.js +++ b/pc4mobx/hrmSalary/apis/ledger.js @@ -155,3 +155,15 @@ export const salarysobRangeImportData = params => { export const getSalaryItemForm = params => { return postFetch("/api/bs/hrmsalary/salarysob/item/getSalaryItemForm", params); }; +//薪资核算规则配置-获取薪资审批规则表单 +export const getSalaryApprovalForm = params => { + return postFetch("/api/bs/hrmsalary/salarysob/salaryApproval/getForm", params); +}; +//薪资核算规则配置-保存薪资审批规则表单 +export const salaryApprovalSaveForm = params => { + return postFetch("/api/bs/hrmsalary/salarysob/salaryApproval/saveForm", params); +}; +//薪资核算规则配置-获取能够添加的项目 +export const getListSalaryItem = params => { + return postFetch("/api/bs/hrmsalary/salarysob/salaryApproval/listSalaryItem", params); +}; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRule.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRule.js new file mode 100644 index 00000000..59990157 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRule.js @@ -0,0 +1,160 @@ +/* + * Author: 黎永顺 + * name: 薪资核算规则配置 + * Description: + * Date: 2024/4/24 + */ +import React, { Component } from "react"; +import { WeaSwitch } from "comsMobx"; +import { inject, observer } from "mobx-react"; +import { WeaFormItem, WeaLocaleProvider, WeaSearchGroup, WeaTools } from "ecCom"; +import LedgerAccountSalaryItemsSet from "./ledgerAccountSalaryItemsSet"; +import * as API from "../../../apis/ledger"; +import { acctApprRulesConditions } from "../config"; + +const getLabel = WeaLocaleProvider.getLabel; +const getKey = WeaTools.getKey; + +@inject("ledgerStore") +@observer +class LedgerAccountApprRule extends Component { + constructor(props) { + super(props); + this.state = { + conditions: [], approvalId: "", approvalItemGroup: [] + }; + } + + componentDidMount() { + this.init(); + } + + init = () => { + const { saveSalarySobId, editId } = this.props; + API.getSalaryApprovalForm({ salarySobId: saveSalarySobId || editId }).then(({ status, data }) => { + if (status) { + this.setState({ + approvalId: data.id, + approvalItemGroup: _.map(data.approvalItemGroup, item => ({ + ...item, id: String(item.sorted), + approvalItems: _.map(item.approvalItems, o => ({ ...o, id: `${String(item.sorted)}-${String(o.sorted)}` })) + })), + conditions: _.map(acctApprRulesConditions, item => ({ + ...item, items: _.map(item.items, o => ({ + ...o, value: getKey(o) === "isOpenApproval" ? (data[getKey(o)] ? "1" : "0") : data[getKey(o)], + viewAttr: getKey(o) === "approvalWorkflowUrl" ? (data["isOpenApproval"] ? 3 : 2) : o.viewAttr, + hide: getKey(o) !== "isOpenApproval" ? !data["isOpenApproval"] : false, + label: getLabel(o.lanId, o.label) + })) + })) + }, () => { + const { ledgerStore: { AARForm } } = this.props; + AARForm.initFormFields(this.state.conditions); + }); + } + }); + }; + + componentWillUnmount() { + const { ledgerStore: { initAARForm } } = this.props; + initAARForm(); + } + + renderForm = (form, conditions) => { + const { saveSalarySobId, editId } = this.props; + const { approvalItemGroup } = this.state; + const { isFormInit } = form; + const formParams = form.getFormParams(); + let group = []; + isFormInit && conditions && conditions.map(c => { + let items = []; + c.items.map(fields => { + if (getKey(fields) !== "approvalItemGroup") { + items.push({ + com: ( + + + ), + hide: fields.hide + }); + } else { + items.push({ + com: ( + + this.setState({ + approvalItemGroup: _.map(approvalItemGroup, o => ({ + ...o, + approvalItems: (groupId === o.id && !_.isEmpty(items)) ? [...o.approvalItems, ..._.map(items, (k, ki) => ({ + salaryItemId: k.id, salaryItemName: k.name, + id: `${String(o.sorted)}-${String(o.approvalItems.length + ki)}` + }))] : o.approvalItems + })) + }, () => form.updateFields({ approvalItemGroup: { value: this.state.approvalItemGroup } }))} + onEdit={(groupName, groupId) => this.setState({ + approvalItemGroup: _.map(approvalItemGroup, o => ({ + ...o, groupName: groupId === o.id ? groupName : o.groupName + })) + }, () => form.updateFields({ approvalItemGroup: { value: this.state.approvalItemGroup } }))} + onDelete={(group, item) => this.setState({ + approvalItemGroup: _.isEmpty(item) ? _.filter(approvalItemGroup, o => o.id !== group.id) : + _.map(approvalItemGroup, o => ({ + ...o, + approvalItems: _.filter(o.approvalItems, oo => oo.id !== item.id) + })) + }, () => form.updateFields({ approvalItemGroup: { value: this.state.approvalItemGroup } }))} + onChange={datas => this.setState({ + approvalItemGroup: datas + }, () => form.updateFields({ approvalItemGroup: { value: datas } }))}/> + ), + hide: fields.hide + }); + } + }); + group.push(); + }); + return group; + }; + convertFormItemViewAttr = (viewAttr) => { + const { ledgerStore: { AARForm } } = this.props; + const { isOpenApproval } = AARForm.getFormParams(); + this.setState({ + conditions: _.map(this.state.conditions, item => ({ + ...item, items: _.map(item.items, o => { + if (getKey(o) === "approvalWorkflowUrl") { + return { ...o, viewAttr, hide: isOpenApproval === "0" }; + } else if (getKey(o) === "approvalItemGroup") { + return { ...o, viewAttr, hide: isOpenApproval === "0" }; + } + return { ...o }; + }) + })) + }); + }; + handleFormItemChange = (value) => { + const { ledgerStore: { AARForm } } = this.props; + const { isOpenApproval } = AARForm.getFormParams(); + if (_.keys(value)[0] === "isOpenApproval") { + this.convertFormItemViewAttr(isOpenApproval === "1" ? 3 : 2); + } + }; + + render() { + const { conditions } = this.state; + const { ledgerStore: { AARForm } } = this.props; + return ( +
+ {this.renderForm(AARForm, conditions)} +
+ ); + } +} + +export default LedgerAccountApprRule; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js new file mode 100644 index 00000000..482f3ea5 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js @@ -0,0 +1,71 @@ +/* + * Author: 黎永顺 + * name:审批规则分类编辑 + * Description: + * Date: 2024/4/25 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaDialog, WeaLocaleProvider, WeaTools } from "ecCom"; +import { Button } from "antd"; +import { getSearchs } from "../../../util"; +import { classifyConditions } from "../config"; + +const getKey = WeaTools.getKey; +const getLabel = WeaLocaleProvider.getLabel; + +@inject("ledgerStore") +@observer +class LedgerAccountApprRuleClassifyNameEditDialog extends Component { + constructor(props) { + super(props); + this.state = { conditions: [] }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) this.init(nextProps); + if (nextProps.visible !== this.props.visible && !nextProps.visible) this.props.ledgerStore.initAARClassifyForm(); + } + + init = (props) => { + const { ledgerStore: { AARClassifyForm }, groupName } = props; + this.setState({ + conditions: _.map(classifyConditions, item => ({ + ...item, + items: _.map(item.items, o => ({ ...o, label: getLabel(o.lanId, o.label) })) + })) + }, () => { + AARClassifyForm.initFormFields(this.state.conditions); + AARClassifyForm.updateFields({ groupName }); + }); + }; + save = () => { + const { ledgerStore: { AARClassifyForm }, groupId } = this.props; + AARClassifyForm.validateForm().then(f => { + if (f.isValid) { + this.props.onCancel(); + this.props.onEdit(AARClassifyForm.getFormParams().groupName, groupId); + } else { + f.showErrors(); + } + }); + }; + + render() { + const { conditions } = this.state; + const { ledgerStore: { AARClassifyForm } } = this.props; + return ( + {getLabel(537558, "保存")} + ]} + > +
{getSearchs(AARClassifyForm, conditions, 1, false)}
+
+ ); + } +} + +export default LedgerAccountApprRuleClassifyNameEditDialog; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js new file mode 100644 index 00000000..7152c7ba --- /dev/null +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js @@ -0,0 +1,134 @@ +/* + * Author: 黎永顺 + * name: 薪资核算规则配置-审批薪资项目 + * Description: + * Date: 2024/4/24 + */ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaSortable, WeaTransfer } from "ecCom"; +import LedgerAccountApprRuleClassifyNameEditDialog from "./ledgerAccountApprRuleClassifyNameEditDialog"; +import * as API from "../../../apis/ledger"; +import { Icon, Modal } from "antd"; +import cs from "classnames"; +import SalaryItemModal from "../../payroll/stepForm/salaryItemModal"; + +const getLabel = WeaLocaleProvider.getLabel; + +class LedgerAccountSalaryItemsSet extends Component { + constructor(props) { + super(props); + this.state = { + editDialog: { visible: false, groupName: "", groupId: "" }, + salaryItemDialog: { visible: false, title: getLabel(111, "薪资项目项"), options: [], groupId: "" } + }; + } + + handleDeleteClick = (group, item = {}) => { + Modal.confirm({ + title: getLabel(131329, "信息确认"), + content: getLabel(543231, "确认删除本条数据吗?"), + onOk: () => this.props.onDelete(group, item) + }); + }; + handleAddSalaryItems = (group) => { + const { salaryItemDialog } = this.state; + const { salarySobId } = this.props; + const payload = { + salarySobId, excludeIds: _.map(group.approvalItems, o => o.salaryItemId) + }; + API.getListSalaryItem(payload).then(({ status, data }) => { + if (status) this.setState({ + salaryItemDialog: { + ...salaryItemDialog, visible: true, options: data, groupId: group.id + } + }); + }); + }; + handleConfirm = () => { + const { salaryItemDialog } = this.state; + this.setState({ + salaryItemDialog: { ...salaryItemDialog, visible: false } + }, () => this.props.onAdd(salaryItemDialog.groupId, _.filter(this.state.salaryItemDialog.options, g => g.checkedSalaryItem))); + }; + + render() { + const { editDialog, salaryItemDialog } = this.state; + const { datas } = this.props; + return ( +
+ this.props.onChange(list)} + renderNodeItem={(item) => { + return
+
+ + {item.groupName} + + this.setState({ + editDialog: { visible: true, groupName: item.groupName, groupId: item.id } + })}/> + this.handleDeleteClick(item)}/> + + + this.handleAddSalaryItems(item)}/> +
+
+ { + !_.isEmpty(item.approvalItems) ? + this.props.onChange( + _.map(datas, child => { + if (child.id === item.id) { + return { ...child, approvalItems: items }; + } + return { ...child }; + }) + )} + renderNodeItem={(filed) => { + return
+
+
{filed.salaryItemName}
+ this.handleDeleteClick(item, filed)}/> +
+
; + }} + className="wea-sortable-salary-item" + /> : +
暂无数据
+ } +
+
; + }} + className="wea-sortable-salary-item" + /> + this.setState({ + editDialog: { ...editDialog, visible: false } + })}/> + this.setState({ + salaryItemDialog: { ...salaryItemDialog, visible: false } + })} onConfirm={this.handleConfirm}> +
+ g.checkedSalaryItem), o => o.id)} + onChange={v => { + this.setState({ + salaryItemDialog: { + ...salaryItemDialog, + options: _.map(salaryItemDialog.options, o => ({ ...o, checkedSalaryItem: _.includes(v, o.id) })) + } + }); + }} + /> +
+
+
+ ); + } +} + +export default LedgerAccountSalaryItemsSet; diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js index 5692c526..07c4cd0d 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js @@ -6,7 +6,7 @@ */ import React, { Component } from "react"; import { inject, observer } from "mobx-react"; -import { WeaSlideModal, WeaSteps } from "ecCom"; +import { WeaLocaleProvider, WeaSlideModal, WeaSteps } from "ecCom"; import { Button, message, Modal } from "antd"; import SlideModalTitle from "../../../components/slideModalTitle"; import LedgerBaseSetting from "./ledgerBaseSetting"; @@ -14,17 +14,12 @@ import LedgerAssociatedPersonnel from "./ledgerAssociatedPersonnel"; import LedgerSalaryAdjustmentRules from "./ledgerSalaryAdjustmentRules"; import LedgerBackCalculatedSalaryItem from "./ledgerBackCalculatedSalaryItem"; import LedgerSalaryItem from "./ledgerSalaryItem"; -import { saveAdjustmentRule, saveLedgerBasic, saveLedgerItem } from "../../../apis/ledger"; +import LedgerAccountApprRule from "./ledgerAccountApprRule"; +import { salaryApprovalSaveForm, saveAdjustmentRule, saveLedgerBasic, saveLedgerItem } from "../../../apis/ledger"; import "./index.less"; const Step = WeaSteps.Step; -const tabs = [ - { key: 0, title: "基础设置" }, - { key: 1, title: "关联人员" }, - { key: 2, title: "薪资项目" }, - { key: 3, title: "回算薪资项目" }, - { key: 4, title: "调薪计薪规则" } -]; +const getLabel = WeaLocaleProvider.getLabel; @inject("taxAgentStore", "ledgerStore") @observer @@ -95,7 +90,6 @@ class LedgerSlide extends Component { this.setState({ loading: false }); if (status) { message.success("保存成功"); - this.handleClose(); } else { message.success(errormsg || "保存失败"); } @@ -166,6 +160,40 @@ class LedgerSlide extends Component { handleSaveSalaryItemParams = (empFields, itemGroups) => { this.setState({ empFields, itemGroups }); }; + handleDefaultSave = () => { + const { saveSalarySobId } = this.state; + const { state: { approvalId } } = this.approRef.wrappedInstance; + const { ledgerStore: { AARForm } } = this.props; + const { approvalItemGroup, isOpenApproval, ...extra } = AARForm.getFormParams(); + const group = _.map(approvalItemGroup, (item, index) => ({ + groupName: item.groupName, sorted: index, + approvalItems: _.map(item.approvalItems, (o, oi) => ({ + salaryItemId: o.salaryItemId, sorted: oi, + salaryItemName: o.salaryItemName + })) + })); + if (isOpenApproval === "1" && _.isEmpty(extra.approvalWorkflowUrl)) { + AARForm.showError("approvalWorkflowUrl", getLabel(111, "\"审批流程地址\"未填写")); + return; + } else if (isOpenApproval === "1" && _.isEmpty(group)) { + AARForm.showError("approvalItemGroup", getLabel(111, "\"审批薪资项目\"未填写")); + return; + } + const payload = { + ...extra, isOpenApproval: isOpenApproval === "1", id: approvalId, + salarySobId: this.props.editId || saveSalarySobId, + approvalItemGroup: group + }; + this.setState({ loading: true }); + salaryApprovalSaveForm(payload).then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(111, "保存成功!")); + } else { + message.error(errormsg); + } + }); + }; renderChildren = () => { const { current, saveSalarySobId } = this.state; let CurrentDom = null; @@ -189,7 +217,8 @@ class LedgerSlide extends Component { onSaveParams={(adjustRules) => this.setState({ adjustRules })}/>; break; default: - CurrentDom = null; + CurrentDom = + this.approRef = dom} saveSalarySobId={saveSalarySobId}/>; break; } return CurrentDom; @@ -245,13 +274,28 @@ class LedgerSlide extends Component { case 4: CurrentDom = !editId ? [ + , , - + ] : [ - + ]; break; default: + CurrentDom = !editId ? + [ + , + + ] : [ + + ]; break; } } @@ -261,6 +305,14 @@ class LedgerSlide extends Component { render() { const { title, visible, editId, taxAgentStore: { showOperateBtn } } = this.props; const { current } = this.state; + const tabs = [ + { key: 0, title: getLabel(82751, "基础设置") }, + { key: 1, title: getLabel(543467, "关联人员") }, + { key: 2, title: getLabel(542362, "薪资项目") }, + { key: 3, title: getLabel(543468, "回算薪资项目") }, + { key: 4, title: getLabel(543469, "调薪计薪规则") }, + { key: 10, title: getLabel(111, "核算审批规则") } + ]; return ( this.AARForm = new WeaForm();//重置核算审批规则form + @action initAARClassifyForm = (v) => this.AARClassifyForm = new WeaForm();//重置审批规则分类编辑form /*******************************************************/ @@ -148,14 +152,14 @@ export class LedgerStore { setItemGroups = itemGroups => { itemGroups = itemGroups ? [...itemGroups] : []; itemGroups && - itemGroups.map(item => { - if (item.items) { - item.items && - item.items.map(i => { - i.key = i.id; - }); - } - }); + itemGroups.map(item => { + if (item.items) { + item.items && + item.items.map(i => { + i.key = i.id; + }); + } + }); this.itemGroups = itemGroups; }; @@ -388,9 +392,9 @@ export class LedgerStore { if (!this.validateBaseFrom(params)) { reject("保存失败"); } - this.saveLoading= true; + this.saveLoading = true; API.saveLedgerBasic(params).then(res => { - this.saveLoading= false; + this.saveLoading = false; if (res.status) { this.salarySobId = res.data; resolve(); @@ -463,9 +467,9 @@ export class LedgerStore { //薪资帐套人员范围(包含)列表 getLedgerPersonRangeInclude = params => { - this.loading= true; + this.loading = true; API.getLedgerPersonRangeInclude(params).then(res => { - this.loading= false; + this.loading = false; if (res.status) { this.setUserTableStore(res.data); } else { @@ -476,9 +480,9 @@ export class LedgerStore { //薪资帐套人员范围(排除)列表 getLedgerPersonRangeExclude = params => { - this.loading= true; + this.loading = true; API.getLedgerPersonRangeExclude(params).then(res => { - this.loading= false; + this.loading = false; if (res.status) { this.setUserTableStore(res.data); } else { @@ -508,12 +512,12 @@ export class LedgerStore { listSalaryItem = (searchValue = "", current = 1) => { let excludeIds = []; this.itemGroups && - this.itemGroups.map(item => { - item.items && - item.items.map(i => { - excludeIds.push(i.salaryItemId); - }); + this.itemGroups.map(item => { + item.items && + item.items.map(i => { + excludeIds.push(i.salaryItemId); }); + }); this.loading = true; API.listSalaryItem({ name: searchValue, excludeIds, current }).then(res => { if (res.status) { @@ -562,7 +566,7 @@ export class LedgerStore { salaryItemId: i.salaryItemId, sortedIndex: index + 1, formulaId: i.formulaId, - itemHide: i.itemHide || "0", + itemHide: i.itemHide || "0" })); return result; } @@ -571,14 +575,14 @@ export class LedgerStore { let params = { salarySobId: this.salarySobId, - empFields: _.map(this.userSelectedList, (it, idx) => ({...it, sortedIndex:idx })), + empFields: _.map(this.userSelectedList, (it, idx) => ({ ...it, sortedIndex: idx })), itemGroups: itemGroups.filter(item => item.id != "default"), items: itemGroups.filter(item => item.id == "default")[0].items }; return new Promise((resolve, reject) => { - this.saveLoading= true; + this.saveLoading = true; API.saveLedgerItem(params).then(res => { - this.saveLoading= false; + this.saveLoading = false; if (res.status) { resolve(); message.success("保存成功"); @@ -626,9 +630,9 @@ export class LedgerStore { ruleParams: this.sobItemRuleDataSource }; return new Promise((resolve, reject) => { - this.saveLoading= true; + this.saveLoading = true; API.saveAdjustmentRule(params).then(res => { - this.saveLoading= false; + this.saveLoading = false; if (res.status) { resolve(); message.success("保存成功"); From 2e5404bee63f1b485bcf4be8e181669f074b00d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Thu, 25 Apr 2024 16:07:04 +0800 Subject: [PATCH 002/215] =?UTF-8?q?feature/2.12.1.2404.02-=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E8=B4=A6=E5=A5=97=E9=85=8D=E7=BD=AE=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/calculate.js | 4 + .../hrmSalary/pages/calculate/doCalc/index.js | 18 ++- .../components/ledgerAccountApprRule.js | 12 +- ...erAccountApprRuleClassifyNameEditDialog.js | 5 +- .../components/ledgerAccountSalaryItemsSet.js | 147 ++++++++++-------- 5 files changed, 109 insertions(+), 77 deletions(-) diff --git a/pc4mobx/hrmSalary/apis/calculate.js b/pc4mobx/hrmSalary/apis/calculate.js index 0abda464..e4431c8a 100644 --- a/pc4mobx/hrmSalary/apis/calculate.js +++ b/pc4mobx/hrmSalary/apis/calculate.js @@ -266,4 +266,8 @@ export const deleteExportTemplate = (params) => { export const getExportTemplateForm = (params) => { return postFetch("/api/bs/hrmsalary/salaryacct/acctresult/getExportTemplateForm", params); }; +//薪资审批-薪资核算页面获取审批信息 +export const getApprovalInfoByRecordId = params => { + return WeaTools.callApi("/api/bs/hrmsalary/salarysob/salaryApproval/getApprovalInfoByRecordId", "GET", params); +}; diff --git a/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js b/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js index d8a8d78e..d7e6dd26 100644 --- a/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js +++ b/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js @@ -9,7 +9,12 @@ import { WeaLocaleProvider, WeaReqTop } from "ecCom"; import { Button, Dropdown, Menu, message, Modal } from "antd"; import { inject, observer } from "mobx-react"; import Layout from "./layout"; -import { acctresultAccounting, getCalculateProgress, getExportField } from "../../../apis/calculate"; +import { + acctresultAccounting, + getApprovalInfoByRecordId, + getCalculateProgress, + getExportField +} from "../../../apis/calculate"; import AdvanceInputBtn from "./components/advanceInputBtn"; import SalaryCalcPersonConfirm from "./components/salaryCalcPersonConfirm"; import SalaryEditCalc from "./components/salaryEditCalc"; @@ -30,6 +35,7 @@ class Index extends Component { selectedKey: "person", progressVisible: false, progress: 0, customExpDialog: { visible: false, salaryAcctRecordId: "", checkItems: [], itemsByGroup: [] }, salaryImpDialog: { visible: false, title: "", salaryAcctRecordId: "" }, + approvalInfo: {},//审批信息, accountExceptInfo: "" //核算报错信息, }; @@ -37,6 +43,14 @@ class Index extends Component { this.timer = null; } + init = () => { + const { routeParams: { salaryAcctRecordId } } = this.props; + getApprovalInfoByRecordId({ salaryAcctRecordId }).then(({ status, data }) => { + if (status) { + console.log(data); + } + }); + }; handleMenuClick = ({ key }) => { switch (key) { case "calc_selected": @@ -196,7 +210,7 @@ class Index extends Component { const { calculateStore: { setOtherConditions } } = this.props; const { selectedKey, progressVisible, progress, customExpDialog, salaryImpDialog } = this.state; return ( - +
{ const { saveSalarySobId, editId } = this.props; - API.getSalaryApprovalForm({ salarySobId: saveSalarySobId || editId }).then(({ status, data }) => { + API.getSalaryApprovalForm({ salarySobId: editId || saveSalarySobId }).then(({ status, data }) => { if (status) { this.setState({ approvalId: data.id, @@ -88,8 +88,8 @@ class LedgerAccountApprRule extends Component { wrapperCol={{ span: `${fields.fieldcol}` }} error={form.getError(fields)} tipPosition="bottom" > - this.setState({ + this.setState({ approvalItemGroup: _.map(approvalItemGroup, o => ({ ...o, approvalItems: (groupId === o.id && !_.isEmpty(items)) ? [...o.approvalItems, ..._.map(items, (k, ki) => ({ @@ -99,9 +99,11 @@ class LedgerAccountApprRule extends Component { })) }, () => form.updateFields({ approvalItemGroup: { value: this.state.approvalItemGroup } }))} onEdit={(groupName, groupId) => this.setState({ - approvalItemGroup: _.map(approvalItemGroup, o => ({ + approvalItemGroup: groupId ? _.map(approvalItemGroup, o => ({ ...o, groupName: groupId === o.id ? groupName : o.groupName - })) + })) : [{ + approvalItems: [], groupName, id: String(approvalItemGroup.length) + }, ...approvalItemGroup] }, () => form.updateFields({ approvalItemGroup: { value: this.state.approvalItemGroup } }))} onDelete={(group, item) => this.setState({ approvalItemGroup: _.isEmpty(item) ? _.filter(approvalItemGroup, o => o.id !== group.id) : diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js index 482f3ea5..9958b727 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountApprRuleClassifyNameEditDialog.js @@ -28,7 +28,7 @@ class LedgerAccountApprRuleClassifyNameEditDialog extends Component { } init = (props) => { - const { ledgerStore: { AARClassifyForm }, groupName } = props; + const { ledgerStore: { AARClassifyForm }, groupName, groupId } = props; this.setState({ conditions: _.map(classifyConditions, item => ({ ...item, @@ -36,7 +36,7 @@ class LedgerAccountApprRuleClassifyNameEditDialog extends Component { })) }, () => { AARClassifyForm.initFormFields(this.state.conditions); - AARClassifyForm.updateFields({ groupName }); + groupId && AARClassifyForm.updateFields({ groupName }); }); }; save = () => { @@ -57,7 +57,6 @@ class LedgerAccountApprRuleClassifyNameEditDialog extends Component { return ( {getLabel(537558, "保存")} ]} diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js index 7152c7ba..1f53c37b 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerAccountSalaryItemsSet.js @@ -5,7 +5,7 @@ * Date: 2024/4/24 */ import React, { Component } from "react"; -import { WeaLocaleProvider, WeaSortable, WeaTransfer } from "ecCom"; +import { WeaButtonIcon, WeaLocaleProvider, WeaSortable, WeaTransfer } from "ecCom"; import LedgerAccountApprRuleClassifyNameEditDialog from "./ledgerAccountApprRuleClassifyNameEditDialog"; import * as API from "../../../apis/ledger"; import { Icon, Modal } from "antd"; @@ -18,7 +18,7 @@ class LedgerAccountSalaryItemsSet extends Component { constructor(props) { super(props); this.state = { - editDialog: { visible: false, groupName: "", groupId: "" }, + editDialog: { visible: false, groupName: "", groupId: "", title: "" }, salaryItemDialog: { visible: false, title: getLabel(111, "薪资项目项"), options: [], groupId: "" } }; } @@ -32,9 +32,11 @@ class LedgerAccountSalaryItemsSet extends Component { }; handleAddSalaryItems = (group) => { const { salaryItemDialog } = this.state; - const { salarySobId } = this.props; + const { salarySobId, datas } = this.props; const payload = { - salarySobId, excludeIds: _.map(group.approvalItems, o => o.salaryItemId) + salarySobId, excludeIds: _.reduce(datas, (pre, cur) => { + return pre.concat(_.map(cur.approvalItems, o => o.salaryItemId)); + }, []) }; API.getListSalaryItem(payload).then(({ status, data }) => { if (status) this.setState({ @@ -48,84 +50,95 @@ class LedgerAccountSalaryItemsSet extends Component { const { salaryItemDialog } = this.state; this.setState({ salaryItemDialog: { ...salaryItemDialog, visible: false } - }, () => this.props.onAdd(salaryItemDialog.groupId, _.filter(this.state.salaryItemDialog.options, g => g.checkedSalaryItem))); + }, () => this.props.onAddItems(salaryItemDialog.groupId, _.filter(this.state.salaryItemDialog.options, g => g.checkedSalaryItem))); }; render() { const { editDialog, salaryItemDialog } = this.state; const { datas } = this.props; return ( -
- this.props.onChange(list)} - renderNodeItem={(item) => { - return
-
+
+
+ this.setState({ + editDialog: { visible: true, title: getLabel(111, "添加分类") } + })}/> + +
+
+ this.props.onChange(list)} + renderNodeItem={(item) => { + return
+
{item.groupName} this.setState({ - editDialog: { visible: true, groupName: item.groupName, groupId: item.id } + editDialog: { + visible: true, groupName: item.groupName, groupId: item.id, title: getLabel(111, "分类名称编辑") + } })}/> this.handleDeleteClick(item)}/> - this.handleAddSalaryItems(item)}/> -
-
- { - !_.isEmpty(item.approvalItems) ? - this.props.onChange( - _.map(datas, child => { - if (child.id === item.id) { - return { ...child, approvalItems: items }; - } - return { ...child }; - }) - )} - renderNodeItem={(filed) => { - return
-
-
{filed.salaryItemName}
- this.handleDeleteClick(item, filed)}/> -
-
; - }} - className="wea-sortable-salary-item" - /> : -
暂无数据
- } -
-
; - }} - className="wea-sortable-salary-item" - /> - this.setState({ - editDialog: { ...editDialog, visible: false } - })}/> - this.setState({ - salaryItemDialog: { ...salaryItemDialog, visible: false } - })} onConfirm={this.handleConfirm}> -
- g.checkedSalaryItem), o => o.id)} - onChange={v => { - this.setState({ - salaryItemDialog: { - ...salaryItemDialog, - options: _.map(salaryItemDialog.options, o => ({ ...o, checkedSalaryItem: _.includes(v, o.id) })) + this.handleAddSalaryItems(item)}/> +
+
+ { + !_.isEmpty(item.approvalItems) ? + this.props.onChange( + _.map(datas, child => { + if (child.id === item.id) { + return { ...child, approvalItems: items }; + } + return { ...child }; + }) + )} + renderNodeItem={(filed) => { + return
+
+
{filed.salaryItemName}
+ this.handleDeleteClick(item, filed)}/> +
+
; + }} + className="wea-sortable-salary-item" + /> : +
暂无数据
} - }); - }} - /> -
-
+
+
; + }} + className="wea-sortable-salary-item" + /> + this.setState({ + editDialog: { ...editDialog, visible: false } + })}/> + this.setState({ + salaryItemDialog: { ...salaryItemDialog, visible: false } + })} onConfirm={this.handleConfirm}> +
+ g.checkedSalaryItem), o => o.id)} + onChange={v => { + this.setState({ + salaryItemDialog: { + ...salaryItemDialog, + options: _.map(salaryItemDialog.options, o => ({ ...o, checkedSalaryItem: _.includes(v, o.id) })) + } + }); + }} + /> +
+
+
); } From ffeb4283b2b1c2e01bf88c92b8ee64aa8ed9b0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Fri, 26 Apr 2024 11:23:19 +0800 Subject: [PATCH 003/215] =?UTF-8?q?feature/2.12.1.2404.02-=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E8=B4=A6=E5=A5=97=E9=85=8D=E7=BD=AE=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/pages/calculate/doCalc/index.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js b/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js index d7e6dd26..c1a24fa8 100644 --- a/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js +++ b/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js @@ -45,10 +45,8 @@ class Index extends Component { init = () => { const { routeParams: { salaryAcctRecordId } } = this.props; - getApprovalInfoByRecordId({ salaryAcctRecordId }).then(({ status, data }) => { - if (status) { - console.log(data); - } + getApprovalInfoByRecordId({ salaryAcctRecordId }).then(({ status, data: approvalInfo }) => { + if (status) this.setState({ approvalInfo }); }); }; handleMenuClick = ({ key }) => { @@ -144,7 +142,9 @@ class Index extends Component { } }; renderReqBtns = () => { - const { selectedKey, accountExceptInfo } = this.state; + const { routeParams: { salaryAcctRecordId } } = this.props; + const { selectedKey, accountExceptInfo, approvalInfo } = this.state; + const { isOpenApproval, approvalWorkflowUrl } = approvalInfo; let reqBtns = []; switch (selectedKey) { case "calc": @@ -169,6 +169,9 @@ class Index extends Component { this.calc.openAdvanceSearch()} onAdvanceSearch={() => this.calc.onAdSearch(false)}/> ]; + isOpenApproval && reqBtns.unshift(); accountExceptInfo && reqBtns.unshift( this.downloadTxtfile(accountExceptInfo)}/>); From e58f5e73e0c362a83e0b107f48f2f345b1c2479c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Sun, 28 Apr 2024 17:53:12 +0800 Subject: [PATCH 004/215] =?UTF-8?q?feature/2.12.1.2404.02-=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E8=B4=A6=E5=A5=97=E9=85=8D=E7=BD=AE=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=20=E6=B7=BB=E5=8A=A0=E8=A7=84=E5=88=99?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ledgerPage/components/ledgerSlide.js | 45 ++++++++---- .../hrmSalary/pages/ruleConfig/conditions.js | 68 +++++++++++++++++++ .../hrmSalary/pages/ruleConfig/ruleConfig.js | 51 ++++++++++++-- 3 files changed, 145 insertions(+), 19 deletions(-) diff --git a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js index 07c4cd0d..e97f89c6 100644 --- a/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js +++ b/pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerSlide.js @@ -16,6 +16,7 @@ import LedgerBackCalculatedSalaryItem from "./ledgerBackCalculatedSalaryItem"; import LedgerSalaryItem from "./ledgerSalaryItem"; import LedgerAccountApprRule from "./ledgerAccountApprRule"; import { salaryApprovalSaveForm, saveAdjustmentRule, saveLedgerBasic, saveLedgerItem } from "../../../apis/ledger"; +import { sysConfCodeRule } from "../../../apis/ruleconfig"; import "./index.less"; const Step = WeaSteps.Step; @@ -32,10 +33,18 @@ class LedgerSlide extends Component { baseSettingInfo: {}, adjustRules: [], empFields: [], itemGroups: [], - saveSalarySobId: "" + saveSalarySobId: "", + salaryApprovalStatus: false }; } + async componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) { + const { data } = await sysConfCodeRule({ code: "SALARY_APPROVAL_STATUS" }); + this.setState({ salaryApprovalStatus: data === "1" }); + } + } + componentWillUnmount() { this.setState({ saveSalarySobId: "" @@ -225,7 +234,7 @@ class LedgerSlide extends Component { }; renderCustomOperate = () => { const { taxAgentStore: { showOperateBtn }, editId } = this.props; - const { current, loading } = this.state; + const { current, loading, salaryApprovalStatus } = this.state; let CurrentDom = []; //管理员操作权限 if (showOperateBtn) { @@ -272,16 +281,25 @@ class LedgerSlide extends Component { ] : []; break; case 4: - CurrentDom = !editId ? - [ - , - , - - ] : [ - - ]; + const btns = salaryApprovalStatus ? [ + , + , + + ] : [ + , + + ]; + CurrentDom = !editId ? btns : [ + + ]; break; default: CurrentDom = !editId ? @@ -304,7 +322,7 @@ class LedgerSlide extends Component { render() { const { title, visible, editId, taxAgentStore: { showOperateBtn } } = this.props; - const { current } = this.state; + const { current, salaryApprovalStatus } = this.state; const tabs = [ { key: 0, title: getLabel(82751, "基础设置") }, { key: 1, title: getLabel(543467, "关联人员") }, @@ -313,6 +331,7 @@ class LedgerSlide extends Component { { key: 4, title: getLabel(543469, "调薪计薪规则") }, { key: 10, title: getLabel(111, "核算审批规则") } ]; + !salaryApprovalStatus && tabs.splice(_.indexOf(tabs, { key: 10 }), 1); return ( ({ - ...item, + ...item, title: getLabel(item.lanId, item.title), items: _.map(item.items, o => { if (getKey(o) === "matchRule" || getKey(o) === "orderRule" || getKey(o) === "ascOrDesc" || getKey(o) === "rule") { - return { ...o, options: _.map(optionsList[getKey(o)], g => ({ key: g.value, showname: g.defaultLabel })) }; + return { + ...o, label: getLabel(o.lanId, o.label), + options: _.map(optionsList[getKey(o)], g => ({ key: g.value, showname: g.defaultLabel })) + }; } else if (getKey(o) === "OPEN_APPLICATION_ENCRYPT") { - return { ...o, viewAttr: sysinfo.showEncryptOperationButton === "true" ? 2 : 1 }; + return { + ...o, label: getLabel(o.lanId, o.label), + viewAttr: sysinfo.showEncryptOperationButton === "true" ? 2 : 1 + }; } else if (getKey(o) === "taxDeclarationFunction") { return { - ...o, + ...o, label: getLabel(o.lanId, o.label), viewAttr: (_.isNil(sysinfo.taxDeclarationFunction) || sysinfo.taxDeclarationFunction !== "0") ? 2 : 1 }; + } else if ( + getKey(o) === "APPROVAL_CAN_MANUAL_FILE_STATUS" || getKey(o) === "APPROVAL_CAN_RE_CALC_STATUS" || getKey(o) === "APPROVAL_CAN_EDIT_RESULT_STATUS" + ) { + return { + ...o, label: getLabel(o.lanId, o.label), + hide: sysinfo["SALARY_APPROVAL_STATUS"] === "0" || _.isNil(sysinfo["SALARY_APPROVAL_STATUS"]) + }; } - return { ...o }; + return { ...o, label: getLabel(o.lanId, o.label) }; }) })) }, async () => { @@ -73,6 +86,10 @@ class RuleConfig extends Component { form.updateFields({ [item]: { value: sysinfo[item] || "1" } }); } else if (item === "OPEN_APPLICATION_ENCRYPT") { form.updateFields({ [item]: { value: _.isNil(sysinfo[item]) ? "1" : (sysinfo[item] || "") } }); + } else if ( + item === "APPROVAL_CAN_MANUAL_FILE_STATUS" || item === "APPROVAL_CAN_RE_CALC_STATUS" || item === "APPROVAL_CAN_EDIT_RESULT_STATUS" + ) { + form.updateFields({ [item]: { value: _.isNil(sysinfo[item]) ? "1" : (sysinfo[item] || "0") } }); } else { form.updateFields({ [item]: { value: sysinfo[item] || "" } }); } @@ -116,6 +133,10 @@ class RuleConfig extends Component { case "taxAgentShowStatus": case "salaryShowStatus": case "adjustShowStatus": + case "SALARY_APPROVAL_STATUS": + case "APPROVAL_CAN_MANUAL_FILE_STATUS": + case "APPROVAL_CAN_RE_CALC_STATUS": + case "APPROVAL_CAN_EDIT_RESULT_STATUS": const confTitle = { welBaseDiffByPerAndCom: getLabel(111, "福利档案基数区分个人和公司"), welBaseAutoAdjust: getLabel(111, "福利档案导入基数不符合要求时自动调整为上限/下限"), @@ -123,7 +144,11 @@ class RuleConfig extends Component { extEmpsWitch: getLabel(544097, "开启非系统人员"), taxAgentShowStatus: getLabel(111, "显示【个税扣缴义务人】信息"), salaryShowStatus: getLabel(111, "显示工资单页签"), - adjustShowStatus: getLabel(111, "显示调薪记录页签") + adjustShowStatus: getLabel(111, "显示调薪记录页签"), + SALARY_APPROVAL_STATUS: getLabel(111, "是否开启薪资审批"), + APPROVAL_CAN_MANUAL_FILE_STATUS: getLabel(111, "开启审批的核算记录允许手动归档"), + APPROVAL_CAN_RE_CALC_STATUS: getLabel(111, "开启审批的核算记录允许重新核算"), + APPROVAL_CAN_EDIT_RESULT_STATUS: getLabel(111, "审批流程发起后允许修改核算数据") }; this.unifiedSettings(key, confTitle[key]); break; @@ -292,6 +317,20 @@ class RuleConfig extends Component { API.saveSysOperate(payload).then(({ status, errormsg }) => { if (status) { message.success(getLabel(22619, "保存成功!")); + if (confKey === "SALARY_APPROVAL_STATUS") { + this.setState({ + conditions: _.map(this.state.conditions, item => ({ + ...item, items: _.map(item.items, o => { + if ( + getKey(o) === "APPROVAL_CAN_MANUAL_FILE_STATUS" || getKey(o) === "APPROVAL_CAN_RE_CALC_STATUS" || getKey(o) === "APPROVAL_CAN_EDIT_RESULT_STATUS" + ) { + return { ...o, hide: form.getFormParams()[confKey] === "0" }; + } + return { ...o }; + }) + })) + }); + } } else { message.error(errormsg || getLabel(22620, "保存失败!")); } From 9476ffb62a8b377d16c5919b56d8f0b78e03bdce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Mon, 29 Apr 2024 16:44:46 +0800 Subject: [PATCH 005/215] =?UTF-8?q?feature/2.12.1.2404.02-=E8=96=AA?= =?UTF-8?q?=E8=B5=84=E8=B4=A6=E5=A5=97=E9=85=8D=E7=BD=AE=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/salaryCalcPersonConfirm/index.js | 15 +++++++++------ pc4mobx/hrmSalary/pages/calculate/doCalc/index.js | 12 +++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/pc4mobx/hrmSalary/pages/calculate/doCalc/components/salaryCalcPersonConfirm/index.js b/pc4mobx/hrmSalary/pages/calculate/doCalc/components/salaryCalcPersonConfirm/index.js index 68b7245f..7e1bece3 100644 --- a/pc4mobx/hrmSalary/pages/calculate/doCalc/components/salaryCalcPersonConfirm/index.js +++ b/pc4mobx/hrmSalary/pages/calculate/doCalc/components/salaryCalcPersonConfirm/index.js @@ -78,6 +78,7 @@ class Index extends Component { renderTabBtns = () => { const { selectedKey, selectedRowKeys } = this.state; + const { calcDetail } = this.props; let tabBtns = []; switch (selectedKey) { case "range": @@ -92,6 +93,7 @@ class Index extends Component { , ]; + calcDetail && tabBtns.splice(0, 2); break; case "add": case "sub": @@ -182,7 +184,7 @@ class Index extends Component { }; render() { - const { calculateStore: { PCSearchForm } } = this.props; + const { calculateStore: { PCSearchForm }, calcDetail } = this.props; const { selectedKey, showSearchAd, searchConditions, pageInfo, loading, selectedRowKeys, columns, dataSource @@ -252,8 +254,8 @@ class Index extends Component { onAdReset={() => PCSearchForm.resetForm()} autoCalculateWidth /> { let width = ""; const { dataIndex } = item; @@ -272,9 +274,10 @@ class Index extends Component { dataIndex: "operate", title: getLabel(30585, "操作"), width: 120, - render: (_, record) => ( - this.handleDeletePCitem([record.id])}>{getLabel(535052, "删除")} + render: (_, record) => ( + {calcDetail ? null : this.handleDeletePCitem([record.id])}>{getLabel(535052, "删除")}} + ) } ]} diff --git a/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js b/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js index c1a24fa8..1455b6a8 100644 --- a/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js +++ b/pc4mobx/hrmSalary/pages/calculate/doCalc/index.js @@ -144,7 +144,7 @@ class Index extends Component { renderReqBtns = () => { const { routeParams: { salaryAcctRecordId } } = this.props; const { selectedKey, accountExceptInfo, approvalInfo } = this.state; - const { isOpenApproval, approvalWorkflowUrl } = approvalInfo; + const { isOpenApproval, approvalWorkflowUrl, canEdit } = approvalInfo; let reqBtns = []; switch (selectedKey) { case "calc": @@ -155,7 +155,7 @@ class Index extends Component { ); const moreMenu = ( - {getLabel(32935, "导入")} + {canEdit && {getLabel(32935, "导入")}} {getLabel(81272, "导出全部")} {getLabel(544270, "自定义导出")} {getLabel(543249, "线下对比")} @@ -169,6 +169,7 @@ class Index extends Component { this.calc.openAdvanceSearch()} onAdvanceSearch={() => this.calc.onAdSearch(false)}/> ]; + !canEdit && reqBtns.splice(0, 1); isOpenApproval && reqBtns.unshift(); @@ -190,14 +191,15 @@ class Index extends Component { element.click(); }; renderContent = () => { - const { selectedKey } = this.state; + const { selectedKey, approvalInfo } = this.state; + const { canEdit } = approvalInfo; let dom = null; switch (selectedKey) { case "person": - dom = ; + dom = ; break; case "calc": - dom = this.calc = dom}/>; + dom = this.calc = dom}/>; break; default: break; From 36d90b35a628297ce7646278550e416762ed7907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Thu, 8 Aug 2024 14:36:11 +0800 Subject: [PATCH 006/215] =?UTF-8?q?feature/2.15.1.2407.01-=E6=B5=AE?= =?UTF-8?q?=E5=8A=A8=E8=96=AA=E9=85=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/variableSalary.js | 10 +++ pc4mobx/hrmSalary/index.js | 11 ++- .../components/advanceInputBtn/index.js | 35 ++++++++ .../components/advanceInputBtn/index.less | 29 +++++++ .../components/salaryItemDialog/index.js | 79 +++++++++++++++++++ .../components/searchPannel/index.js | 70 ++++++++++++++++ .../pages/variableSalary/conditions.js | 52 ++++++++++++ .../hrmSalary/pages/variableSalary/index.js | 71 +++++++++++++++++ .../hrmSalary/pages/variableSalary/index.less | 45 +++++++++++ pc4mobx/hrmSalary/stores/baseTable.js | 26 +++--- 10 files changed, 413 insertions(+), 15 deletions(-) create mode 100644 pc4mobx/hrmSalary/apis/variableSalary.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/searchPannel/index.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/conditions.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/index.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/index.less diff --git a/pc4mobx/hrmSalary/apis/variableSalary.js b/pc4mobx/hrmSalary/apis/variableSalary.js new file mode 100644 index 00000000..cdfdde70 --- /dev/null +++ b/pc4mobx/hrmSalary/apis/variableSalary.js @@ -0,0 +1,10 @@ +import { postFetch } from "../util/request"; + +//浮动薪酬项目列表 +export const getVariableSalaryItemList = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/listPage", params); +}; +//保存/更新 浮动薪酬项目 +export const saveVariableSalaryItem = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/save", params); +}; diff --git a/pc4mobx/hrmSalary/index.js b/pc4mobx/hrmSalary/index.js index fff7a3d1..c11b384c 100644 --- a/pc4mobx/hrmSalary/index.js +++ b/pc4mobx/hrmSalary/index.js @@ -52,6 +52,7 @@ import ExternalPersonManage from "./pages/externalPersonManage"; import AdjustSalaryManage from "./pages/adjustSalaryManage"; import TopologyMap from "./pages/topologyMap"; import SupplementaryCalc from "./pages/supplementaryCalc"; +import VariableSalary from "./pages/variableSalary"; import stores from "./stores"; import "./style/index"; @@ -112,9 +113,10 @@ const DataAcquisition = (props) => props.children; // externalPersonManage 非系统人员管理 // adjustSalaryManage 档案管理 // supplementaryCalc 补算 +// variableSalary 浮动薪酬 const Routes = ( - + @@ -124,8 +126,8 @@ const Routes = ( - - + + @@ -152,7 +154,7 @@ const Routes = ( - + @@ -166,6 +168,7 @@ const Routes = ( + ); diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js new file mode 100644 index 00000000..7e981704 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js @@ -0,0 +1,35 @@ +/* + * Author: 黎永顺 + * name:薪酬统计报表-高级搜索 + * Description: + * Date: 2024/3/26 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { Button } from "antd"; +import { WeaInputSearch, WeaLocaleProvider } from "ecCom"; +import "./index.less"; + +const getLabel = WeaLocaleProvider.getLabel; + +@inject("baseTableStore") +@observer +class Index extends Component { + render() { + const { baseTableStore: { VSalryForm }, searchType } = this.props; + return ( +
+ VSalryForm.updateFields({ keyword: v })} + onSearch={this.props.onAdvanceSearch} + /> + { + searchType === "advance" && + } +
+ ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less new file mode 100644 index 00000000..9081d39f --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less @@ -0,0 +1,29 @@ +.achrive-advance-search { + display: flex; + align-items: center; + position: relative; + top: -1.5px; + + .wea-advanced-search { + top: 2px; + left: -1px; + height: 28px; + line-height: 1; + border-radius: 0; + position: relative; + color: #474747; + padding: 4px 15px; + } + + .wea-advanced-search:hover { + border: 1px solid #dadada; + color: #474747; + } + + .text-elli { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 1px; + } +} diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js new file mode 100644 index 00000000..71eba98b --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js @@ -0,0 +1,79 @@ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaDialog, WeaLocaleProvider, WeaTools } from "ecCom"; +import { Button, message } from "antd"; +import { getSearchs } from "../../../../util"; +import { salaryItemsConditions } from "../../conditions"; +import * as API from "../../../../apis/variableSalary"; + +const getKey = WeaTools.getKey; +const getLabel = WeaLocaleProvider.getLabel; + +@inject("baseTableStore") +@observer +class Index extends Component { + constructor(props) { + super(props); + this.state = { + conditions: [], loading: false + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) this.initForm(nextProps); + if (nextProps.visible !== this.props.visible && !nextProps.visible) this.props.baseTableStore.initVSSalaryItemForm(); + } + + initForm = (props) => { + const { baseTableStore: { VSSalaryItemForm } } = props; + this.setState({ + conditions: _.map(salaryItemsConditions, item => ({ + ...item, + items: _.map(item.items, o => { + if (getKey(o) === "dataType") { + return { ...o, options: _.map(o.options, g => ({ ...g, showname: getLabel(g.lanId, g.showname) })) }; + } + return { ...o, label: getLabel(o.lanId, o.label) }; + }) + })) + }, () => VSSalaryItemForm.initFormFields(this.state.conditions)); + }; + save = () => { + const { baseTableStore: { VSSalaryItemForm }, onSearch } = this.props; + VSSalaryItemForm.validateForm().then(f => { + if (f.isValid) { + const payload = VSSalaryItemForm.getFormParams(); + this.setState({ loading: true }); + API.saveVariableSalaryItem({ ...payload }).then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(30700, "操作成功")); + this.props.onCancel(onSearch()); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ loading: false })); + } else { + f.showErrors(); + } + }); + }; + + render() { + const { conditions, loading } = this.state; + const { baseTableStore: { calculateForm } } = this.props; + return ( + {getLabel(111, "取消")}, + + ]} + > +
{getSearchs(calculateForm, conditions, 1, false)}
+
+ ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/searchPannel/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/searchPannel/index.js new file mode 100644 index 00000000..d5b274a9 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/searchPannel/index.js @@ -0,0 +1,70 @@ +/* + * Author: 黎永顺 + * name:薪酬统计报薪资明细-高级查询 + * Description: + * Date: 2024/3/26 + */ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaTools } from "ecCom"; +import { Button } from "antd"; +import { inject, observer } from "mobx-react"; +import { getSearchs } from "../../../../util"; +import { conditions } from "../../conditions"; + +const getLabel = WeaLocaleProvider.getLabel; +const getKey = WeaTools.getKey; + +@inject("baseTableStore") +@observer +class VariableSalarySearchPannel extends Component { + constructor(props) { + super(props); + this.state = { + searchConditions: [] + }; + } + + componentDidMount() { + this.setState({ + searchConditions: _.map(conditions, item => { + return { + ...item, + items: _.map(item.items, child => { + return { ...child, label: getLabel(child.lanId, child.label) }; + }) + }; + }) + }, () => { + const { baseTableStore: { VSalryForm } } = this.props; + VSalryForm.initFormFields(this.state.searchConditions); + }); + } + + render() { + const { searchConditions } = this.state; + const { baseTableStore: { VSalryForm } } = this.props; + return ( + +
+ {getSearchs(VSalryForm, searchConditions, 2, false)} +
+
+
+ + + + + + + + + +
+
+
+ ); + } +} + +export default VariableSalarySearchPannel; + diff --git a/pc4mobx/hrmSalary/pages/variableSalary/conditions.js b/pc4mobx/hrmSalary/pages/variableSalary/conditions.js new file mode 100644 index 00000000..ae943a2d --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/conditions.js @@ -0,0 +1,52 @@ +export const conditions = [ + { + items: [ + { + conditionType: "INPUT", + domkey: ["dimName"], + fieldcol: 14, + label: "测试", + labelcol: 6, + value: "", + rules: "required|string", + viewAttr: 3 + } + ], + title: "", + defaultshow: true + } +]; +export const salaryItemsConditions = [ + { + items: [ + { + conditionType: "INPUT", + domkey: ["name"], + fieldcol: 14, + label: "名称", + lanId: 111, + labelcol: 6, + value: "", + rules: "required|string", + viewAttr: 3 + }, + { + conditionType: "SELECT", + domkey: ["dataType"], + fieldcol: 14, + label: "字段类型", + lanId: 111, + labelcol: 6, + value: "", + options: [ + { key: "number", showname: "数值", lanId: 111, selected: true }, + { key: "string", showname: "字符", lanId: 111, selected: false } + ], + rules: "required|string", + viewAttr: 3 + } + ], + title: "", + defaultshow: true + } +]; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/index.js b/pc4mobx/hrmSalary/pages/variableSalary/index.js new file mode 100644 index 00000000..abf682d3 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/index.js @@ -0,0 +1,71 @@ +/* + * 浮动薪酬 + * + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaLocaleProvider, WeaReqTop } from "ecCom"; +import AdvanceInputBtn from "./components/advanceInputBtn"; +import SearchPannel from "./components/searchPannel"; +import SalaryItemDialog from "./components/salaryItemDialog"; +import { Button } from "antd"; +import cs from "classnames"; + +const getLabel = WeaLocaleProvider.getLabel; + +@inject("taxAgentStore", "baseTableStore") +@observer +class Index extends Component { + constructor(props) { + super(props); + this.state = { + selectedKey: "salaryFile", isQuery: false, + SIDialog: { visible: false, title: "" } //薪资项目薪资编辑弹框 + }; + } + + handleAdvanceSearch = () => this.setState({ isQuery: !this.state.isQuery }); + + render() { + const { selectedKey, SIDialog } = this.state; + const { taxAgentStore: { showOperateBtn } } = this.props; + const tabs = [ + { + title: getLabel(111, "薪资档案"), key: "salaryFile", + buttons: showOperateBtn ? [] : [] + }, + { + title: getLabel(111, "薪资项目"), key: "salaryItem", + buttons: showOperateBtn ? [ + , + + ] : [] + } + ]; + return ( + } selectedKey={selectedKey} + iconBgcolor="#F14A2D" tabDatas={tabs} className="variable_salary_wrapper" + buttons={_.find(tabs, o => selectedKey === o.key).buttons} buttonSpace={10} + onChange={selectedKey => this.setState({ selectedKey })} + showDropIcon={false} + > +
+ this.setState({ showSearchAd: false })} onAdSearch={this.onAdSearch}/> +
+ this.setState({ + SIDialog: { ...SIDialog, visible: false } + }, () => callback && callback())}/> +
+ ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/index.less b/pc4mobx/hrmSalary/pages/variableSalary/index.less new file mode 100644 index 00000000..a487afd7 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/index.less @@ -0,0 +1,45 @@ +.variable_salary_wrapper { + .searchAdvanced-condition-hide { + display: none; + } + + .searchAdvanced-condition-container { + background: #FFF; + margin-bottom: 10px; + border: 1px solid #e5e5e5; + + .wea-search-buttons { + border-top: 1px solid #dadada; + padding: 15px 0; + } + + .wea-advanced-searchsAd { + height: 155px; + overflow: hidden auto; + + .formItem-delete { + position: absolute; + top: 0; + right: -40px; + } + + .searchAdvanced-commonSelect { + border-top: 1px solid #ebebeb; + margin: 0 25px; + padding: 10px 0; + } + + .custom-advance-largeSpacing { + padding-left: 26px; + + .link { + border: none; + border-radius: 0; + padding: 12px 10px 12px 26px; + color: #2db7f5 + } + } + + } + } +} diff --git a/pc4mobx/hrmSalary/stores/baseTable.js b/pc4mobx/hrmSalary/stores/baseTable.js index cc639b54..75106e3a 100644 --- a/pc4mobx/hrmSalary/stores/baseTable.js +++ b/pc4mobx/hrmSalary/stores/baseTable.js @@ -1,8 +1,8 @@ -import { observable, action, toJS } from 'mobx'; -import { message } from 'antd'; -import { WeaForm, WeaTableNew } from 'comsMobx'; +import { action, observable } from "mobx"; +import { message } from "antd"; +import { WeaForm, WeaTableNew } from "comsMobx"; -import * as API from '../apis'; // 引入API接口文件 +import * as API from "../apis"; // 引入API接口文件 const { TableStore } = WeaTableNew; @@ -14,12 +14,16 @@ export class BaseTableStore { @observable showSearchAd = false; // 高级搜索面板显示 @observable loading = true; // 数据加载状态 + // 浮动薪酬相关 + @observable VSalryForm = new WeaForm(); // 浮动薪酬查询form + @observable VSSalaryItemForm = new WeaForm(); // 新增浮动薪酬项目form + @action initVSSalaryItemForm = () => this.VSSalaryItemForm = new WeaForm(); // 初始化操作 @action doInit = () => { this.getCondition(); this.getTableDatas(); - } + }; // 获得高级搜索表单数据 @action @@ -29,10 +33,10 @@ export class BaseTableStore { this.condition = res.condition; this.form.initFormFields(res.condition); // 渲染高级搜索form表单 } else { - message.error(res.msg || '接口调用失败!') + message.error(res.msg || "接口调用失败!"); } })); - } + }; // 渲染table数据 @action @@ -45,11 +49,11 @@ export class BaseTableStore { this.tableStore.getDatas(res.datas); // table 请求数据 this.hasRight = res.hasRight; } else { - message.error(res.msg || '接口调用失败!') + message.error(res.msg || "接口调用失败!"); } this.loading = false; })); - } + }; @action setShowSearchAd = bool => this.showSearchAd = bool; @@ -58,6 +62,6 @@ export class BaseTableStore { @action doSearch = () => { this.getTableDatas(); this.showSearchAd = false; - } + }; -} \ No newline at end of file +} From 70fe54efb74cf1a6a206e0580db144b278d091c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Thu, 8 Aug 2024 17:32:54 +0800 Subject: [PATCH 007/215] =?UTF-8?q?feature/2.15.1.2407.01-=E6=B5=AE?= =?UTF-8?q?=E5=8A=A8=E8=96=AA=E9=85=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/variableSalary.js | 13 ++ .../components/advanceInputBtn/index.js | 6 +- .../components/advanceInputBtn/index.less | 3 +- .../components/salaryFileDialog/index.js | 112 ++++++++++++++++ .../components/salaryItemDialog/index.js | 31 ++--- .../components/salaryItemList/index.js | 113 ++++++++++++++++ .../pages/variableSalary/conditions.js | 121 +++++++++++++++++- .../hrmSalary/pages/variableSalary/index.js | 49 ++++++- .../hrmSalary/pages/variableSalary/index.less | 64 ++++++++- pc4mobx/hrmSalary/stores/baseTable.js | 5 +- pc4mobx/hrmSalary/style/index.less | 7 + 11 files changed, 491 insertions(+), 33 deletions(-) create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemList/index.js diff --git a/pc4mobx/hrmSalary/apis/variableSalary.js b/pc4mobx/hrmSalary/apis/variableSalary.js index cdfdde70..2f214881 100644 --- a/pc4mobx/hrmSalary/apis/variableSalary.js +++ b/pc4mobx/hrmSalary/apis/variableSalary.js @@ -4,7 +4,20 @@ import { postFetch } from "../util/request"; export const getVariableSalaryItemList = params => { return postFetch("/api/bs/hrmsalary/variableSalaryItem/listPage", params); }; +//删除浮动薪酬项目 +export const deleteVariableSalaryItem = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/delete", params); +}; +//获取浮动薪酬项目详情 +export const getVariableSalaryItemDetail = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/getDetail", params); +}; //保存/更新 浮动薪酬项目 export const saveVariableSalaryItem = params => { return postFetch("/api/bs/hrmsalary/variableSalaryItem/save", params); }; + +//创建浮动薪酬档案时获取项目信息 +export const getCreateForm = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/getCreateForm", params); +}; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js index 7e981704..9ef6b2d2 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js @@ -18,9 +18,9 @@ class Index extends Component { render() { const { baseTableStore: { VSalryForm }, searchType } = this.props; return ( -
- VSalryForm.updateFields({ keyword: v })} +
+ VSalryForm.updateFields({ username: v })} onSearch={this.props.onAdvanceSearch} /> { diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less index 9081d39f..ba4f56fc 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less @@ -1,4 +1,4 @@ -.achrive-advance-search { +.salaryItem-advance-search { display: flex; align-items: center; position: relative; @@ -24,6 +24,5 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - top: 1px; } } diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js new file mode 100644 index 00000000..f29cae1a --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js @@ -0,0 +1,112 @@ +/* + * 浮动薪酬 + * 新建编辑薪资档案 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaLocaleProvider, WeaSlideModal, WeaTools } from "ecCom"; +import { Button, message } from "antd"; +import { getSearchs } from "../../../../util"; +import { salaryFileConditions } from "../../conditions"; +import * as API from "../../../../apis/variableSalary"; + +const getKey = WeaTools.getKey; +const getLabel = WeaLocaleProvider.getLabel; + +@inject("baseTableStore") +@observer +class Index extends Component { + constructor(props) { + super(props); + this.state = { + conditions: [], loading: false + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) { + document.querySelector(".variable_salary_wrapper").classList.add("zIndex0-weaslide-title"); + this.initForm(nextProps); + } else if (nextProps.visible !== this.props.visible && !nextProps.visible) { + document.querySelector(".variable_salary_wrapper").classList.remove("zIndex0-weaslide-title"); + this.props.baseTableStore.initVSSalaryFileForm(); + } + } + + initForm = (props) => { + const { baseTableStore: { VSSalaryFileForm } } = props; + API.getCreateForm().then(({ status, data }) => { + this.setState({ + conditions: [ + ..._.map(salaryFileConditions, item => ({ + ...item, + items: _.map(item.items, o => ({ ...o, label: getLabel(o.lanId, o.label) })) + })), + { + items: _.map(data, o => ({ + conditionType: "INPUT", + domkey: [String(o.id)], + fieldcol: 14, + label: o.name, + labelcol: 6, + value: "", + viewAttr: 2 + })), + title: "", col: 2, + defaultshow: true + } + ] + }, () => VSSalaryFileForm.initFormFields(this.state.conditions)); + }); + }; + save = () => { + const { baseTableStore: { VSSalaryFileForm }, onSearch, id } = this.props; + VSSalaryFileForm.validateForm().then(f => { + if (f.isValid) { + const payload = VSSalaryFileForm.getFormParams(); + this.setState({ loading: true }); + API.saveVariableSalaryItem({ ...payload, id }) + .then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(30700, "操作成功")); + this.props.onCancel(onSearch()); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ loading: false })); + } else { + f.showErrors(); + } + }); + }; + renderTitle = () => { + const { loading } = this.state, { title } = this.props; + return
+
+
+
{title}
+
+
+ +
+
; + }; + + render() { + const { conditions, loading } = this.state; + const { baseTableStore: { VSSalaryFileForm }, onClose } = this.props; + return ( onClose()} + top={0} width={800} height={100} measureT="%" measureX="px" measureY="%" title={this.renderTitle()} + content={
{getSearchs(VSSalaryFileForm, conditions)}
} + />); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js index 71eba98b..cc4d456d 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemDialog/index.js @@ -39,20 +39,21 @@ class Index extends Component { }, () => VSSalaryItemForm.initFormFields(this.state.conditions)); }; save = () => { - const { baseTableStore: { VSSalaryItemForm }, onSearch } = this.props; + const { baseTableStore: { VSSalaryItemForm }, onSearch, id } = this.props; VSSalaryItemForm.validateForm().then(f => { if (f.isValid) { const payload = VSSalaryItemForm.getFormParams(); this.setState({ loading: true }); - API.saveVariableSalaryItem({ ...payload }).then(({ status, errormsg }) => { - this.setState({ loading: false }); - if (status) { - message.success(getLabel(30700, "操作成功")); - this.props.onCancel(onSearch()); - } else { - message.error(errormsg); - } - }).catch(() => this.setState({ loading: false })); + API.saveVariableSalaryItem({ ...payload, id }) + .then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(30700, "操作成功")); + this.props.onCancel(onSearch()); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ loading: false })); } else { f.showErrors(); } @@ -61,16 +62,16 @@ class Index extends Component { render() { const { conditions, loading } = this.state; - const { baseTableStore: { calculateForm } } = this.props; + const { baseTableStore: { VSSalaryItemForm } } = this.props; return ( {getLabel(111, "取消")}, - + , + ]} > -
{getSearchs(calculateForm, conditions, 1, false)}
+
{getSearchs(VSSalaryItemForm, conditions, 1, false)}
); } diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemList/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemList/index.js new file mode 100644 index 00000000..210df203 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryItemList/index.js @@ -0,0 +1,113 @@ +/* + * 浮动薪酬 + * 薪资项目列表 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaTable } from "ecCom"; +import { message, Modal } from "antd"; +import * as API from "../../../../apis/variableSalary"; + +const getLabel = WeaLocaleProvider.getLabel; + +class Index extends Component { + constructor(props) { + super(props); + this.state = { + pageInfo: { current: 1, pageSize: 10, total: 0 }, loading: false, dataSource: [], columns: [] + }; + } + + componentDidMount() { + this.getVariableSalaryItemList(); + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.isQuery !== this.props.isQuery) this.setState({ + pageInfo: { ...this.state.pageInfo, current: 1 } + }, () => this.getVariableSalaryItemList()); + } + + getVariableSalaryItemList = () => { + const { baseTableStore: { VSalryForm } } = this.props; + const { pageInfo } = this.state; + const { username: itemName } = VSalryForm.getFormParams(); + this.setState({ loading: true }); + API.getVariableSalaryItemList({ ...pageInfo, itemName }).then(({ status, data }) => { + this.setState({ loading: false }); + if (status) { + const { list: dataSource, columns, pageNum: current, pageSize, total } = data; + this.setState({ + pageInfo: { ...pageInfo, current, pageSize, total }, dataSource, + columns: [ + ..._.filter(columns, o => o.dataIndex !== "id"), + { + title: getLabel(111, "操作"), dataIndex: "oprate", + render: (__, record) => ( + this.handleEdit(record.id)}>{getLabel(111, "编辑")} + { + record.canDelete && this.handleDelete([record.id])}>{getLabel(111, "删除")} + } + ) + } + ] + } + ); + } + }); + }; + handleEdit = (id) => { + API.getVariableSalaryItemDetail({ id }).then(({ status, data }) => { + if (status) this.props.onEditSalaryItem(data); + }); + }; + handleDelete = (itemIds) => { + Modal.confirm({ + title: getLabel(111, "信息确认"), + content: getLabel(111, "确认删除吗?"), + onOk: () => { + API.deleteVariableSalaryItem({ itemIds }).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(111, "删除成功")); + this.getVariableSalaryItemList(); + } else { + message.error(errormsg); + } + }); + } + }); + }; + + render() { + const { columns, dataSource, loading, pageInfo } = this.state; + const pagination = { + ...pageInfo, + showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`, + showQuickJumper: true, + showSizeChanger: true, + pageSizeOptions: ["10", "20", "50", "100"], + onShowSizeChange: (current, pageSize) => { + this.setState({ + pageInfo: { ...pageInfo, current, pageSize } + }, () => this.getVariableSalaryItemList()); + }, + onChange: current => { + this.setState({ + pageInfo: { ...pageInfo, current } + }, () => this.getVariableSalaryItemList()); + } + }; + return ( + + ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/conditions.js b/pc4mobx/hrmSalary/pages/variableSalary/conditions.js index ae943a2d..49ca43de 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/conditions.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/conditions.js @@ -3,13 +3,75 @@ export const conditions = [ items: [ { conditionType: "INPUT", - domkey: ["dimName"], + domkey: ["itemName"], fieldcol: 14, - label: "测试", + label: "项目名称", + lanId: 111, labelcol: 6, value: "", - rules: "required|string", - viewAttr: 3 + hide: true, + viewAttr: 2 + }, + { + conditionType: "INPUT", + domkey: ["username"], + fieldcol: 14, + label: "名称", + lanId: 111, + labelcol: 6, + value: "", + viewAttr: 2 + }, + { + conditionType: "MONTHPICKER", + domkey: ["salaryMonth"], + fieldcol: 14, + label: "薪资所属月", + lanId: 111, + labelcol: 6, + value: "", + viewAttr: 2 + }, + { + browserConditionParam: { + completeParams: {}, + conditionDataParams: {}, + dataParams: {}, + destDataParams: {}, + hasAddBtn: false, + hasAdvanceSerach: false, + idSeparator: ",", + isAutoComplete: 1, + isDetail: 0, + isMultCheckbox: false, + isSingle: false, + icon: "icon-coms-hrm", + linkUrl: "", + pageSize: 10, + quickSearchName: "", + replaceDatas: [], + title: "", + type: "57", + viewAttr: 2 + }, + conditionType: "BROWSER", + domkey: ["departmentIds"], + fieldcol: 14, + label: "部门", + lanId: 111, + labelcol: 6, + value: "", + viewAttr: 2 + }, + { + conditionType: "INPUT", + domkey: ["workcode"], + fieldcol: 14, + label: "工号", + lanId: 111, + labelcol: 6, + value: "", + viewAttr: 2 } ], title: "", @@ -50,3 +112,54 @@ export const salaryItemsConditions = [ defaultshow: true } ]; +export const salaryFileConditions = [ + { + items: [ + { + conditionType: "MONTHPICKER", + domkey: ["salaryMonth"], + fieldcol: 14, + label: "薪资所属月", + lanId: 111, + labelcol: 6, + value: "", + rules: "required|string", + viewAttr: 3 + }, + { + browserConditionParam: { + completeParams: {}, + conditionDataParams: {}, + dataParams: {}, + destDataParams: {}, + hasAddBtn: false, + hasAdvanceSerach: false, + idSeparator: ",", + isAutoComplete: 1, + isDetail: 0, + isMultCheckbox: false, + isSingle: true, + icon: "icon-coms-hrm", + linkUrl: "", + pageSize: 10, + quickSearchName: "", + replaceDatas: [], + title: "", + type: "1", + viewAttr: 2 + }, + conditionType: "BROWSER", + domkey: ["employeeId"], + fieldcol: 14, + label: "人员", + lanId: 111, + labelcol: 6, + value: "", + rules: "required|string", + viewAttr: 3 + } + ], + title: "", col: 1, + defaultshow: true + } +]; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/index.js b/pc4mobx/hrmSalary/pages/variableSalary/index.js index abf682d3..bc73021f 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/index.js @@ -13,8 +13,11 @@ import { WeaLocaleProvider, WeaReqTop } from "ecCom"; import AdvanceInputBtn from "./components/advanceInputBtn"; import SearchPannel from "./components/searchPannel"; import SalaryItemDialog from "./components/salaryItemDialog"; +import SalaryFileDialog from "./components/salaryFileDialog"; +import SalaryItemList from "./components/salaryItemList"; import { Button } from "antd"; import cs from "classnames"; +import "./index.less"; const getLabel = WeaLocaleProvider.getLabel; @@ -24,29 +27,55 @@ class Index extends Component { constructor(props) { super(props); this.state = { - selectedKey: "salaryFile", isQuery: false, - SIDialog: { visible: false, title: "" } //薪资项目薪资编辑弹框 + selectedKey: "salaryFile", isQuery: false, showSearchAd: false, + SIDialog: { visible: false, title: "", id: "" }, //薪资项目薪资编辑弹框 + SFDialog: { visible: false, title: "", id: "" } //薪资档案编辑弹框 }; } handleAdvanceSearch = () => this.setState({ isQuery: !this.state.isQuery }); + openAdvanceSearch = () => this.setState({ showSearchAd: !this.state.showSearchAd }); + handleOperate = (type) => { + switch (type) { + case "create": + this.setState({ + SFDialog: { visible: true, id: "", title: getLabel(111, "新增薪资档案") } + }); + break; + default: + break; + } + }; render() { - const { selectedKey, SIDialog } = this.state; - const { taxAgentStore: { showOperateBtn } } = this.props; + const { selectedKey, SIDialog, SFDialog, showSearchAd, isQuery } = this.state; + const { taxAgentStore: { showOperateBtn }, baseTableStore: { VSSalaryItemForm } } = this.props; const tabs = [ { title: getLabel(111, "薪资档案"), key: "salaryFile", - buttons: showOperateBtn ? [] : [] + buttons: showOperateBtn ? [ + , + , + , + this.openAdvanceSearch()} + onAdvanceSearch={this.handleAdvanceSearch}/> + ] : [ this.openAdvanceSearch()} + onAdvanceSearch={this.handleAdvanceSearch}/>], + children: null }, { title: getLabel(111, "薪资项目"), key: "salaryItem", buttons: showOperateBtn ? [ , - ] : [] + ] : [], + children: this.setState({ + SIDialog: { visible: true, id: data.id, title: getLabel(111, "编辑薪资项目") } + }, () => VSSalaryItemForm.updateFields({ + name: data.name, dataType: data.dataType + }))}/> } ]; return ( @@ -60,9 +89,15 @@ class Index extends Component {
this.setState({ showSearchAd: false })} onAdSearch={this.onAdSearch}/>
+ {_.find(tabs, o => selectedKey === o.key).children} + {/*薪资项目*/} this.setState({ SIDialog: { ...SIDialog, visible: false } }, () => callback && callback())}/> + {/*薪资档案*/} + this.setState({ + SFDialog: { ...SFDialog, visible: false } + }, () => callback && callback())}/> ); } diff --git a/pc4mobx/hrmSalary/pages/variableSalary/index.less b/pc4mobx/hrmSalary/pages/variableSalary/index.less index a487afd7..1c1dd906 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/index.less +++ b/pc4mobx/hrmSalary/pages/variableSalary/index.less @@ -1,4 +1,17 @@ .variable_salary_wrapper { + .wea-new-top-req-title > div:last-child { + right: 16px !important; + } + + .wea-new-top-req-content { + padding: 16px; + + .wea-new-table { + background: #FFF; + } + + } + .searchAdvanced-condition-hide { display: none; } @@ -14,7 +27,7 @@ } .wea-advanced-searchsAd { - height: 155px; + height: 108px; overflow: hidden auto; .formItem-delete { @@ -42,4 +55,53 @@ } } + + .variable_salary_file_dialog { + .wea-slide-modal-title { + border-bottom: 1px solid #e5e5e5 !important; + } + + .titleDialog { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 46px 0 16px; + + .titleCol { + flex: 1; + display: flex; + align-items: center; + } + + .titleLeftBox { + .titleIcon { + color: #fff; + margin: 0; + width: 40px; + height: 40px; + line-height: 40px; + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + background: #F14A2D; + border-radius: 50%; + } + + .title { + font-size: 14px; + color: #333; + padding-left: 6px; + } + } + + .titleRightBox { + justify-content: flex-end; + + button:last-child { + margin-left: 10px; + } + } + } + } } diff --git a/pc4mobx/hrmSalary/stores/baseTable.js b/pc4mobx/hrmSalary/stores/baseTable.js index 75106e3a..8598d0cb 100644 --- a/pc4mobx/hrmSalary/stores/baseTable.js +++ b/pc4mobx/hrmSalary/stores/baseTable.js @@ -16,8 +16,11 @@ export class BaseTableStore { // 浮动薪酬相关 @observable VSalryForm = new WeaForm(); // 浮动薪酬查询form - @observable VSSalaryItemForm = new WeaForm(); // 新增浮动薪酬项目form + @observable VSSalaryItemForm = new WeaForm(); // 新增编辑浮动薪酬项目form @action initVSSalaryItemForm = () => this.VSSalaryItemForm = new WeaForm(); + @observable VSSalaryFileForm = new WeaForm(); // 新增编辑薪资档案form + @action initVSSalaryFileForm = () => this.VSSalaryFileForm = new WeaForm(); + // 初始化操作 @action doInit = () => { diff --git a/pc4mobx/hrmSalary/style/index.less b/pc4mobx/hrmSalary/style/index.less index 4ce6ef7a..ea74c23c 100644 --- a/pc4mobx/hrmSalary/style/index.less +++ b/pc4mobx/hrmSalary/style/index.less @@ -83,3 +83,10 @@ } +//公共slide框标题样式 +.zIndex0-weaslide-title { + .wea-new-top-req { + z-index: 0 !important; + } +} + From 86de787ed4512759de1355401275a9c823a9e4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Thu, 8 Aug 2024 18:24:45 +0800 Subject: [PATCH 008/215] =?UTF-8?q?feature/2.15.1.2407.01-=E6=B5=AE?= =?UTF-8?q?=E5=8A=A8=E8=96=AA=E9=85=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/variableSalary.js | 8 ++ .../components/salaryFileDialog/index.js | 12 +- .../components/salaryFileList/index.js | 118 ++++++++++++++++++ .../pages/variableSalary/conditions.js | 12 +- .../hrmSalary/pages/variableSalary/index.js | 17 ++- .../hrmSalary/pages/variableSalary/index.less | 4 + 6 files changed, 154 insertions(+), 17 deletions(-) create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js diff --git a/pc4mobx/hrmSalary/apis/variableSalary.js b/pc4mobx/hrmSalary/apis/variableSalary.js index 2f214881..04bbeb02 100644 --- a/pc4mobx/hrmSalary/apis/variableSalary.js +++ b/pc4mobx/hrmSalary/apis/variableSalary.js @@ -21,3 +21,11 @@ export const saveVariableSalaryItem = params => { export const getCreateForm = params => { return postFetch("/api/bs/hrmsalary/variableSalary/getCreateForm", params); }; +//创建浮动薪酬档案 +export const createVariableSalary = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/createData", params); +}; +//创建浮动薪酬档案 +export const getVariableSalaryList = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/list", params); +}; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js index f29cae1a..6297a558 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js @@ -64,13 +64,23 @@ class Index extends Component { }, () => VSSalaryFileForm.initFormFields(this.state.conditions)); }); }; + convertPayload = (payload) => { + return _.reduce(_.keys(payload), (pre, cur) => { + if (!_.isNaN(parseInt(cur))) { + return { ...pre, itemValueList: [{ variableItemId: cur, itemValue: payload[cur] }] }; + } + return { ...pre, [cur]: payload[cur] }; + }, {}); + }; save = () => { const { baseTableStore: { VSSalaryFileForm }, onSearch, id } = this.props; VSSalaryFileForm.validateForm().then(f => { if (f.isValid) { const payload = VSSalaryFileForm.getFormParams(); + console.log(payload); + return; this.setState({ loading: true }); - API.saveVariableSalaryItem({ ...payload, id }) + API.createVariableSalary({ ...payload, id }) .then(({ status, errormsg }) => { this.setState({ loading: false }); if (status) { diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js new file mode 100644 index 00000000..6ec040bb --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js @@ -0,0 +1,118 @@ +/* + * 浮动薪酬 + * 薪资档案列表 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaTable } from "ecCom"; +import { message, Modal } from "antd"; +import * as API from "../../../../apis/variableSalary"; + +const getLabel = WeaLocaleProvider.getLabel; + +class Index extends Component { + constructor(props) { + super(props); + this.state = { + pageInfo: { current: 1, pageSize: 10, total: 0 }, loading: false, dataSource: [], columns: [] + }; + } + + componentDidMount() { + this.getVariableSalaryList(); + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.isQuery !== this.props.isQuery) this.setState({ + pageInfo: { ...this.state.pageInfo, current: 1 } + }, () => this.getVariableSalaryList()); + } + + getVariableSalaryList = () => { + const { baseTableStore: { VSalryForm }, salaryMonth } = this.props; + const { pageInfo } = this.state; + const { departmentIds } = VSalryForm.getFormParams(); + console.log(VSalryForm.getFormParams()); + this.setState({ loading: true }); + API.getVariableSalaryList({ + ...pageInfo, salaryMonth, ...VSalryForm.getFormParams(), + departmentIds: !_.isEmpty(departmentIds) ? departmentIds.split(",") : [] + }) + .then(({ status, data }) => { + this.setState({ loading: false }); + if (status) { + const { list: dataSource, columns, pageNum: current, pageSize, total } = data; + this.setState({ + pageInfo: { ...pageInfo, current, pageSize, total }, dataSource, + columns: [ + ..._.filter(columns, o => o.dataIndex !== "id"), + { + title: getLabel(111, "操作"), dataIndex: "oprate", + render: (__, record) => ( + this.handleEdit(record.id)}>{getLabel(111, "编辑")} + { + record.canDelete && this.handleDelete([record.id])}>{getLabel(111, "删除")} + } + ) + } + ] + } + ); + } + }); + }; + handleEdit = (id) => { + API.getVariableSalaryItemDetail({ id }).then(({ status, data }) => { + if (status) this.props.onEditSalaryItem(data); + }); + }; + handleDelete = (itemIds) => { + Modal.confirm({ + title: getLabel(111, "信息确认"), + content: getLabel(111, "确认删除吗?"), + onOk: () => { + API.deleteVariableSalaryItem({ itemIds }).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(111, "删除成功")); + this.getVariableSalaryItemList(); + } else { + message.error(errormsg); + } + }); + } + }); + }; + + render() { + const { columns, dataSource, loading, pageInfo } = this.state; + const pagination = { + ...pageInfo, + showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`, + showQuickJumper: true, + showSizeChanger: true, + pageSizeOptions: ["10", "20", "50", "100"], + onShowSizeChange: (current, pageSize) => { + this.setState({ + pageInfo: { ...pageInfo, current, pageSize } + }, () => this.getVariableSalaryList()); + }, + onChange: current => { + this.setState({ + pageInfo: { ...pageInfo, current } + }, () => this.getVariableSalaryList()); + } + }; + return ( + + ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/conditions.js b/pc4mobx/hrmSalary/pages/variableSalary/conditions.js index 49ca43de..98ecd684 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/conditions.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/conditions.js @@ -22,16 +22,6 @@ export const conditions = [ value: "", viewAttr: 2 }, - { - conditionType: "MONTHPICKER", - domkey: ["salaryMonth"], - fieldcol: 14, - label: "薪资所属月", - lanId: 111, - labelcol: 6, - value: "", - viewAttr: 2 - }, { browserConditionParam: { completeParams: {}, @@ -145,7 +135,7 @@ export const salaryFileConditions = [ quickSearchName: "", replaceDatas: [], title: "", - type: "1", + type: "17", viewAttr: 2 }, conditionType: "BROWSER", diff --git a/pc4mobx/hrmSalary/pages/variableSalary/index.js b/pc4mobx/hrmSalary/pages/variableSalary/index.js index bc73021f..5035381c 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/index.js @@ -9,12 +9,14 @@ */ import React, { Component } from "react"; import { inject, observer } from "mobx-react"; -import { WeaLocaleProvider, WeaReqTop } from "ecCom"; +import { WeaDatePicker, WeaLocaleProvider, WeaReqTop } from "ecCom"; import AdvanceInputBtn from "./components/advanceInputBtn"; import SearchPannel from "./components/searchPannel"; import SalaryItemDialog from "./components/salaryItemDialog"; import SalaryFileDialog from "./components/salaryFileDialog"; import SalaryItemList from "./components/salaryItemList"; +import SalaryFileList from "./components/salaryFileList"; +import moment from "moment"; import { Button } from "antd"; import cs from "classnames"; import "./index.less"; @@ -28,6 +30,7 @@ class Index extends Component { super(props); this.state = { selectedKey: "salaryFile", isQuery: false, showSearchAd: false, + salaryMonth: moment(new Date()).format("YYYY-MM"), SIDialog: { visible: false, title: "", id: "" }, //薪资项目薪资编辑弹框 SFDialog: { visible: false, title: "", id: "" } //薪资档案编辑弹框 }; @@ -48,7 +51,7 @@ class Index extends Component { }; render() { - const { selectedKey, SIDialog, SFDialog, showSearchAd, isQuery } = this.state; + const { selectedKey, SIDialog, SFDialog, showSearchAd, isQuery, salaryMonth } = this.state; const { taxAgentStore: { showOperateBtn }, baseTableStore: { VSSalaryItemForm } } = this.props; const tabs = [ { @@ -57,11 +60,15 @@ class Index extends Component { , , , + this.setState({ salaryMonth: val })}/>, this.openAdvanceSearch()} onAdvanceSearch={this.handleAdvanceSearch}/> - ] : [ this.openAdvanceSearch()} - onAdvanceSearch={this.handleAdvanceSearch}/>], - children: null + ] : [ + this.setState({ salaryMonth: val })}/>, + this.openAdvanceSearch()} + onAdvanceSearch={this.handleAdvanceSearch}/> + ], + children: }, { title: getLabel(111, "薪资项目"), key: "salaryItem", diff --git a/pc4mobx/hrmSalary/pages/variableSalary/index.less b/pc4mobx/hrmSalary/pages/variableSalary/index.less index 1c1dd906..26e8d09d 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/index.less +++ b/pc4mobx/hrmSalary/pages/variableSalary/index.less @@ -57,6 +57,10 @@ } .variable_salary_file_dialog { + .scroller { + background: #f6f6f6 !important; + } + .wea-slide-modal-title { border-bottom: 1px solid #e5e5e5 !important; } From 9d99557f4b65f04a5e82ef01dfa414c00836e5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Mon, 12 Aug 2024 09:24:11 +0800 Subject: [PATCH 009/215] =?UTF-8?q?feature/2.15.1.2407.01-=E6=B5=AE?= =?UTF-8?q?=E5=8A=A8=E8=96=AA=E9=85=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/variableSalary.js | 13 ++ .../components/salaryFileDialog/index.js | 31 +++- .../salaryFileImportDialog/index.js | 94 +++++++++++ .../components/salaryFileList/index.js | 159 +++++++++++------- .../hrmSalary/pages/variableSalary/index.js | 40 ++++- .../hrmSalary/pages/variableSalary/index.less | 4 + pc4mobx/hrmSalary/stores/baseTable.js | 20 +++ 7 files changed, 288 insertions(+), 73 deletions(-) create mode 100644 pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js diff --git a/pc4mobx/hrmSalary/apis/variableSalary.js b/pc4mobx/hrmSalary/apis/variableSalary.js index 04bbeb02..c3e3f20a 100644 --- a/pc4mobx/hrmSalary/apis/variableSalary.js +++ b/pc4mobx/hrmSalary/apis/variableSalary.js @@ -29,3 +29,16 @@ export const createVariableSalary = params => { export const getVariableSalaryList = params => { return postFetch("/api/bs/hrmsalary/variableSalary/list", params); }; +//导入浮动薪酬档案 +export const importVariableSalary = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/importData", params); +}; +//删除浮动薪酬档案 +export const deleteVariableSalary = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/deleteSelectData", params); +}; +//获取浮动薪酬档案明细 +export const getVariableSalaryDetail = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/getDetail", params); +}; + diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js index 6297a558..f38f45a4 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js @@ -39,13 +39,16 @@ class Index extends Component { } initForm = (props) => { - const { baseTableStore: { VSSalaryFileForm } } = props; + const { baseTableStore: { VSSalaryFileForm }, detail } = props; API.getCreateForm().then(({ status, data }) => { this.setState({ conditions: [ ..._.map(salaryFileConditions, item => ({ ...item, - items: _.map(item.items, o => ({ ...o, label: getLabel(o.lanId, o.label) })) + items: _.map(item.items, o => ({ + ...o, viewAttr: !_.isEmpty(detail) ? 1 : 2, label: getLabel(o.lanId, o.label), + value: detail[getKey(o)] || "" + })) })), { items: _.map(data, o => ({ @@ -54,14 +57,25 @@ class Index extends Component { fieldcol: 14, label: o.name, labelcol: 6, - value: "", - viewAttr: 2 + value: detail[`${String(o.id)}_variableItem`] || "", + viewAttr: !_.isEmpty(detail) ? 1 : 2 })), title: "", col: 2, defaultshow: true } ] - }, () => VSSalaryFileForm.initFormFields(this.state.conditions)); + }, () => { + VSSalaryFileForm.initFormFields(this.state.conditions); + if (!_.isEmpty(detail)) { + VSSalaryFileForm.updateFields({ + employeeId: { + value: detail["employeeId"], + valueSpan: detail["username"], + valueObj: [{ id: detail["employeeId"], name: detail["username"] }] + } + }); + } + }); }); }; convertPayload = (payload) => { @@ -96,14 +110,17 @@ class Index extends Component { }); }; renderTitle = () => { - const { loading } = this.state, { title } = this.props; + const { loading } = this.state, { title, detail } = this.props; return
{title}
- + { + _.isEmpty(detail) && + + }
; }; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js new file mode 100644 index 00000000..5b8f023d --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js @@ -0,0 +1,94 @@ +/* + * 浮动薪酬 + * 薪资档案导入 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaCheckbox, WeaLocaleProvider } from "ecCom"; +import ImportDialog from "../../../../components/importDialog"; +import * as API from "../../../../apis/variableSalary"; +import { convertToUrlString } from "../../../../util/url"; + +const getLabel = WeaLocaleProvider.getLabel; + +class Index extends Component { + constructor(props) { + super(props); + this.state = { + importDialog: { + nextloading: false, link: "/api/bs/hrmsalary/variableSalary/downloadTemplate", + importResult: {}, imageId: "", hasData: false, + previewUrl: "/api/bs/hrmsalary/variableSalary/preview" + } + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + const { importDialog } = this.state; + if (nextProps.visible !== this.props.visible && nextProps.visible) { + const { baseTableStore: { VSalryForm }, salaryMonth } = nextProps; + const payload = { + salaryMonth, ...VSalryForm.getFormParams(), hasData: importDialog.hasData + }; + this.setState({ importDialog: { ...importDialog, link: `${importDialog.link}?${convertToUrlString(payload)}` } }); + } else { + this.setState({ + importDialog: { + nextloading: false, link: "/api/bs/hrmsalary/variableSalary/downloadTemplate", hasData: false, + importResult: {}, imageId: "", previewUrl: "/api/bs/hrmsalary/variableSalary/preview" + } + }); + } + } + + handleImport = (payload) => { + const { salaryMonth } = this.props; + const { importDialog } = this.state; + this.setState({ importDialog: { ...importDialog, nextloading: true } }); + API.importVariableSalary({ ...payload, salaryMonth }).then(({ data, status }) => { + this.setState({ importDialog: { ...importDialog, nextloading: false } }); + if (status) { + this.setState({ + importDialog: { ...importDialog, ...payload, importResult: data } + }); + } + }).catch(() => this.setState({ importDialog: { ...importDialog, nextloading: false } })); + }; + + render() { + const { importDialog } = this.state; + return ( + this.setState({ + importDialog: { ...importDialog, importResult: {}, imageId: "", link: null } + })} + exportDataDom={ + { + const { baseTableStore: { VSalryForm }, salaryMonth } = this.props; + const payload = { salaryMonth, ...VSalryForm.getFormParams(), hasData: val === "1" }; + this.setState({ + importDialog: { + ...importDialog, hasData: val === "1", + link: `/api/bs/hrmsalary/variableSalary/downloadTemplate?${convertToUrlString(payload)}` + } + }); + }} + /> + } + nextCallback={imageId => this.setState({ importDialog: { ...importDialog, imageId } })} + nextUplaodCallback={imageId => this.handleImport({ imageId })} + /> + ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js index 6ec040bb..0756b644 100644 --- a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js @@ -8,10 +8,13 @@ * @description: */ import React, { Component } from "react"; -import { WeaLocaleProvider, WeaTable } from "ecCom"; -import { message, Modal } from "antd"; +import { WeaLocaleProvider } from "ecCom"; +import { WeaTableNew } from "comsMobx"; +import { message, Modal, Spin } from "antd"; import * as API from "../../../../apis/variableSalary"; +import { toJS } from "mobx"; +const WeaTableComx = WeaTableNew.WeaTable; const getLabel = WeaLocaleProvider.getLabel; class Index extends Component { @@ -23,64 +26,78 @@ class Index extends Component { } componentDidMount() { + window.addEventListener("message", this.handleReceive, false); + window.addEventListener("resize", this.handleResize, false); this.getVariableSalaryList(); } + componentWillUnmount() { + window.removeEventListener("message", this.handleReceive, false); + window.removeEventListener("resize", this.handleResize, false); + } + componentWillReceiveProps(nextProps, nextContext) { if (nextProps.isQuery !== this.props.isQuery) this.setState({ pageInfo: { ...this.state.pageInfo, current: 1 } }, () => this.getVariableSalaryList()); } + handleReceive = async ({ data }) => { + const { type, payload: { id, params } = {} } = data; + if (type === "init") { + this.getColumns(); + } else if (type === "turn") { + switch (id) { + case "PAGEINFO": + this.setState({ + pageInfo: { ...this.state.pageInfo, ...params } + }, () => this.getVariableSalaryList()); + break; + case "DEL": + this.handleDelete([params.id]); + break; + case "VIEW": + this.handleView(params.id); + break; + default: + break; + } + } + }; getVariableSalaryList = () => { - const { baseTableStore: { VSalryForm }, salaryMonth } = this.props; + const { baseTableStore: { VSalryForm, getVariableSalaryList }, salaryMonth } = this.props; const { pageInfo } = this.state; const { departmentIds } = VSalryForm.getFormParams(); - console.log(VSalryForm.getFormParams()); this.setState({ loading: true }); - API.getVariableSalaryList({ + getVariableSalaryList({ ...pageInfo, salaryMonth, ...VSalryForm.getFormParams(), departmentIds: !_.isEmpty(departmentIds) ? departmentIds.split(",") : [] - }) - .then(({ status, data }) => { - this.setState({ loading: false }); - if (status) { - const { list: dataSource, columns, pageNum: current, pageSize, total } = data; - this.setState({ - pageInfo: { ...pageInfo, current, pageSize, total }, dataSource, - columns: [ - ..._.filter(columns, o => o.dataIndex !== "id"), - { - title: getLabel(111, "操作"), dataIndex: "oprate", - render: (__, record) => ( - this.handleEdit(record.id)}>{getLabel(111, "编辑")} - { - record.canDelete && this.handleDelete([record.id])}>{getLabel(111, "删除")} - } - ) - } - ] - } - ); - } - }); - }; - handleEdit = (id) => { - API.getVariableSalaryItemDetail({ id }).then(({ status, data }) => { - if (status) this.props.onEditSalaryItem(data); + }).then(({ status, data }) => { + this.setState({ loading: false }); + if (status) { + const { pageInfo: result } = data; + const { list: dataSource, pageNum: current, pageSize, total } = result; + this.setState({ + pageInfo: { ...pageInfo, current, pageSize, total }, dataSource + } + ); + } }); }; - handleDelete = (itemIds) => { + handleView = (id) => { + API.getVariableSalaryDetail({ id }).then(({ status, data }) => { + if (status) this.props.onViewSalaryFile(data.data); + }); + }; + handleDelete = (ids) => { Modal.confirm({ title: getLabel(111, "信息确认"), content: getLabel(111, "确认删除吗?"), onOk: () => { - API.deleteVariableSalaryItem({ itemIds }).then(({ status, errormsg }) => { + API.deleteVariableSalary({ ids }).then(({ status, errormsg }) => { if (status) { message.success(getLabel(111, "删除成功")); - this.getVariableSalaryItemList(); + this.getVariableSalaryList(); } else { message.error(errormsg); } @@ -88,29 +105,57 @@ class Index extends Component { } }); }; + getColumns = () => { + const { baseTableStore: { SFTableStore }, showOperateBtn } = this.props; + const columns = _.map(_.filter(toJS(SFTableStore.columns), (item) => item.display === "true"), (it, idx) => ({ + dataIndex: it.dataIndex, title: it.title, align: "left", + width: 150, ellipsis: true + })); + if (!_.isEmpty(columns)) { + this.postMessageToChild({ + columns, showOperateBtn, dataSource: this.state.dataSource, scrollHeight: 100, + pageInfo: this.state.pageInfo, unitTableType: "variableSalary" + }); + } + return columns; + }; + postMessageToChild = (payload = {}) => { + const i18n = { + "操作": getLabel(30585, "操作"), "查看详情": getLabel(111, "查看详情"), + "共": getLabel(18609, "共"), "条": getLabel(18256, "条"), + "删除": getLabel(111, "删除") + }; + const childFrameObj = document.getElementById("unitTable"); + childFrameObj && childFrameObj.contentWindow.postMessage(JSON.stringify({ ...payload, i18n }), "*"); + }; render() { - const { columns, dataSource, loading, pageInfo } = this.state; - const pagination = { - ...pageInfo, - showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`, - showQuickJumper: true, - showSizeChanger: true, - pageSizeOptions: ["10", "20", "50", "100"], - onShowSizeChange: (current, pageSize) => { - this.setState({ - pageInfo: { ...pageInfo, current, pageSize } - }, () => this.getVariableSalaryList()); - }, - onChange: current => { - this.setState({ - pageInfo: { ...pageInfo, current } - }, () => this.getVariableSalaryList()); - } - }; + const { loading, dataSource } = this.state; + const { baseTableStore: { SFTableStore } } = this.props; + const dom = document.querySelector(".wea-new-top-req-content"); + let height = 280; + if (dom && dataSource.length > 0) { + height = (parseFloat(dom.style.height) > 620 && dataSource.length === 10) ? dataSource.length * 39 + 113 : dataSource.length < 10 ? dataSource.length * 39 + 113 : parseFloat(dom.style.height) - 16; + } return ( - + +
+ +