diff --git a/pc4mobx/hrmSalary/apis/payroll.js b/pc4mobx/hrmSalary/apis/payroll.js index 80011331..8cf120c9 100644 --- a/pc4mobx/hrmSalary/apis/payroll.js +++ b/pc4mobx/hrmSalary/apis/payroll.js @@ -350,3 +350,11 @@ export const sendRangeSave = (params) => { export const sendRangeDelete = (params) => { return postFetch('/api/bs/hrmsalary/salaryBill/send/range/delete', params); } +//工资单模板-获取模板可用的分组 +export const getAvailableSalaryGroupSet = (params) => { + return postFetch('/api/bs/hrmsalary/salaryBill/template/getAvailableSalaryGroupSet', params); +} +//工资单模板-获取模板分组下可用的薪资项目 +export const getAvailableSalaryItemSet = (params) => { + return postFetch('/api/bs/hrmsalary/salaryBill/template/getAvailableSalaryItemSet', params); +} diff --git a/pc4mobx/hrmSalary/pages/payroll/index.js b/pc4mobx/hrmSalary/pages/payroll/index.js index f026277b..e098f240 100644 --- a/pc4mobx/hrmSalary/pages/payroll/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/index.js @@ -101,7 +101,7 @@ export default class Payroll extends React.Component { // 模板搜索 handleTemplateSearch() { const { templateSearchValue, templateSelect } = this.state; - let params = { name: templateSearchValue, salarySobId: templateSelect,current: 1 }; + let params = { name: templateSearchValue, salarySobId: templateSelect, current: 1 }; const { payrollStore: { getPayrollTemplateList } } = this.props; getPayrollTemplateList(params); } @@ -344,8 +344,8 @@ export default class Payroll extends React.Component { }); return; } - if(templateBaseData.replenishName === templateBaseData.name){ - message.error("工资单模板名称和补发工资单模板名称不可相同") + if (templateBaseData.replenishName === templateBaseData.name) { + message.error("工资单模板名称和补发工资单模板名称不可相同"); return; } this.setState({ diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less b/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less index 7a704b62..6c8e324c 100644 --- a/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/index.less @@ -62,4 +62,143 @@ } } } + + .salarySetTitle { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + } +} + +//拖拽列表 +.salaryItemSettingWrapper { + & > ul { + border: 1px solid #e5e5e5; + + .wea-sortable-salary-item { + padding: 0; + margin: 0; + border: none; + cursor: default; + + .salaryItemWrapper { + width: 100%; + + .salaryItemHeader { + display: flex; + align-items: center; + justify-content: space-between; + height: 32px; + line-height: 32px; + background: #f5f5f5; + border-bottom: 1px solid #f2f2f2; + padding: 0 12px; + + .icon-coms-Add-to { + cursor: pointer; + color: #5d9cec; + position: relative; + z-index: 999; + } + + .titleWrapper { + display: flex; + align-items: center; + + .salaryClassTitle { + font-weight: 400; + font-size: 12px; + color: #111; + vertical-align: middle; + } + + .iconWrapper { + display: none; + align-items: center; + + i { + padding-left: 8px; + color: #666; + cursor: pointer; + position: relative; + z-index: 999; + } + } + } + } + + .salaryItemHeader:hover { + .iconWrapper { + display: flex; + } + } + + .salaryItemContent { + padding: 4px 16px; + background: #fff; + min-height: 52px; + + & > ul { + display: flex; + width: 100%; + flex-wrap: wrap; + + li { + width: 25%; + + .salaryItemList { + width: 100%; + + .salaryItem:hover { + i.anticon-cross { + display: block; + } + } + + .salaryItem { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + min-height: 40px; + color: #000; + font-size: 12px; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0 8px; + + .salaryItemName { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + i.anticon-cross { + display: none; + cursor: pointer; + } + } + } + } + } + + .empty { + width: 100%; + height: 44px; + line-height: 44px; + text-align: center; + } + } + } + } + } +} +.salaryItemModalWrapper{ + .modalContent{ + padding: 16px; + } } diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/salaryItemModal.js b/pc4mobx/hrmSalary/pages/payroll/stepForm/salaryItemModal.js new file mode 100644 index 00000000..7a6e5557 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/salaryItemModal.js @@ -0,0 +1,35 @@ +/* + * Author: 黎永顺 + * name: 工资单模板-新增编辑薪资项目项 + * Description: + * Date: 2023/2/2 + */ +import React, { Component } from "react"; +import { WeaDialog } from "ecCom"; +import { Button } from "antd"; + +class SalaryItemModal extends Component { + render() { + const { visible, title, onCancel, onConfirm } = this.props; + const buttons = [ + , + + ]; + return ( + + {this.props.children} + + ); + } +} + +export default SalaryItemModal; diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/salaryItemSettings.js b/pc4mobx/hrmSalary/pages/payroll/stepForm/salaryItemSettings.js new file mode 100644 index 00000000..b2865829 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/salaryItemSettings.js @@ -0,0 +1,287 @@ +/* + * Author: 黎永顺 + * name: 工资单模板-薪资项目设置 + * Description: + * Date: 2023/2/2 + */ +import React, { Component } from "react"; +import { toJS } from "mobx"; +import { WeaFormItem, WeaInput, WeaSelect, WeaSortable } from "ecCom"; +import { Icon, Modal } from "antd"; +import SalaryItemModal from "./salaryItemModal"; +import { getAvailableSalaryGroupSet, getAvailableSalaryItemSet } from "../../../apis/payroll"; + +class SalaryItemSettings extends Component { + constructor(props) { + super(props); + this.state = { + dataList: [], + checkedValue: "", + modalPayload: { + visible: false, + title: "", + groupId: "", + groupName: "", + options: [] + } + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.dataSource !== this.props.dataSource) { + this.setState({ + dataList: _.map(toJS(nextProps.dataSource), item => { + return { + ...item, + id: item.groupId + }; + }) + }); + } + } + + /* + * Author: 黎永顺 + * Description:删除薪资项目大类 + * Params: + * Date: 2023/2/2 + */ + handleDeleteClick = (group) => { + Modal.confirm({ + title: "信息确认", + content: "确认删除", + onOk: () => { + let resultSalaryItemSet = [...this.state.dataList]; + resultSalaryItemSet.map((sourceGroup, index) => { + if (sourceGroup.groupId === group.groupId) { + resultSalaryItemSet.splice(index, 1); + } + }); + this.setState({ + dataList: resultSalaryItemSet + }, () => { + this.props.onChangeSalaryItem(resultSalaryItemSet); + }); + } + }); + }; + /* + * Author: 黎永顺 + * Description: 删除薪资项目项 + * Params: + * Date: 2023/2/2 + */ + handleDeleteSalaryItem = (group, item) => { + let resultSalaryItemSet = [...this.state.dataList]; + resultSalaryItemSet.map(sourceGroup => { + if (sourceGroup.groupId === group.groupId) { + sourceGroup.items.map((sourceItem, index) => { + if (sourceItem.id === item.id) { + sourceGroup.items.splice(index, 1); + } + }); + } + }); + this.setState({ + dataList: resultSalaryItemSet + }, () => { + this.props.onChangeSalaryItem(resultSalaryItemSet); + }); + }; + handleCloseModal = () => { + const { modalPayload } = this.state; + this.setState({ + checkedValue: "", + modalPayload: { + ...modalPayload, + visible: false, + title: "", + groupId: "", + groupName: "", + options: [] + } + }); + }; + handleOpenModal = (record, title, isItem) => { + if (title === "分类名称编辑") { + const { modalPayload } = this.state; + this.setState({ + modalPayload: { + ...modalPayload, + visible: true, + title, + groupId: record.groupId, + groupName: record.groupName + } + }); + } else { + isItem ? this.getAvailableSalaryItemSet(record, title) : this.getAvailableSalaryGroupSet(record, title); + } + }; + getAvailableSalaryItemSet = (record, title) => { + const payload = { + salarySobId: this.props.salarySobId, + existSalaryItemIds: _.map(record.items, it => it.id), + groupId: record.groupId, + isReplenish: this.props.isReplenish + }; + getAvailableSalaryItemSet(payload).then(({ status, data }) => { + if (status) { + const { modalPayload } = this.state; + this.setState({ + modalPayload: { + ...modalPayload, + visible: true, + title, + groupId: record.groupId, + options: _.map(data, it => ({ ...it, showname: it.name, key: it.salaryItemId })) + } + }); + } + }); + }; + getAvailableSalaryGroupSet = (salarySobId, title) => { + const { dataList } = this.state; + const payload = { + salarySobId, + existSalaryGroupIds: _.map(dataList, it => it.groupId), + isReplenish: this.props.isReplenish + }; + getAvailableSalaryGroupSet(payload).then(({ status, data }) => { + if (status) { + const { modalPayload } = this.state; + this.setState({ + modalPayload: { + ...modalPayload, + visible: true, + title, + options: _.map(data, it => ({ ...it, showname: it.groupName, key: it.groupId })) + } + }); + } + }); + }; + handleChangeClassName = (groupName) => { + const { modalPayload } = this.state; + this.setState({ + modalPayload: { + ...modalPayload, + groupName + } + }); + }; + /* + * Author: 黎永顺 + * Description:添加薪资项目项 + * Params: + * Date: 2023/2/2 + */ + handleConfirm = () => { + const { modalPayload, checkedValue, dataList } = this.state; + const { options = [], groupId, groupName } = modalPayload; + if (groupName) { + this.setState({ + dataList: _.map(dataList, it => { + if (it.groupId === groupId) { + return { + ...it, + groupName + }; + } + return { ...it }; + }) + }, () => { + this.props.onChangeSalaryItem(this.state.dataList); + this.handleCloseModal(); + }); + } else { + this.setState({ + dataList: groupId ? _.map(dataList, it => { + if (it.groupId === groupId) { + return { + ...it, + items: [...it.items, ..._.filter(options, child => checkedValue.split(",").includes(child.salaryItemId))] + }; + } + return { ...it }; + }) : [...dataList, ..._.filter(options, child => checkedValue.split(",").includes(child.groupId))] + }, () => { + this.props.onChangeSalaryItem(this.state.dataList); + this.handleCloseModal(); + }); + } + }; + + render() { + const { onChangeSalaryItem } = this.props; + const { dataList, modalPayload, checkedValue } = this.state; + return ( +
+ onChangeSalaryItem(list)} + renderNodeItem={(item) => { + return
+
+ + {item.groupName} + + this.handleOpenModal(item, "分类名称编辑")}/> + this.handleDeleteClick(item)}/> + + + this.handleOpenModal(item, "请选择薪资项目", true)}/> +
+
+ { + !_.isEmpty(item.items) ? + onChangeSalaryItem( + _.map(dataList, child => { + if (child.id === item.id) { + return { ...child, items }; + } + return { ...child }; + }) + )} + renderNodeItem={(filed) => { + return
+
+
{filed.name}
+ this.handleDeleteSalaryItem(item, filed)}/> +
+
; + }} + className="wea-sortable-salary-item" + /> : +
暂无数据
+ } +
+
; + }} + className="wea-sortable-salary-item" + /> + +
+ { + modalPayload.title === "分类名称编辑" ? + + + + : this.setState({ checkedValue: v })} + /> + } +
+
+
+ ); + } +} + +export default SalaryItemSettings; diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/showSettingForm.js b/pc4mobx/hrmSalary/pages/payroll/stepForm/showSettingForm.js index ef34deed..cec7f7d2 100644 --- a/pc4mobx/hrmSalary/pages/payroll/stepForm/showSettingForm.js +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/showSettingForm.js @@ -1,8 +1,10 @@ import React from "react"; -import { Icon, Modal, Radio, Switch } from "antd"; -import { WeaFormItem, WeaInput, WeaSearchGroup } from "ecCom"; +import { Radio, Switch } from "antd"; +import { WeaButtonIcon, WeaFormItem, WeaInput, WeaSearchGroup } from "ecCom"; import { inject, observer } from "mobx-react"; +import { toJS } from "mobx"; import BackgroundUpload from "../components/backgroundUpload"; +import SalaryItemSettings from "./salaryItemSettings"; import "./index.less"; @@ -21,6 +23,7 @@ export default class ShowSettingForm extends React.Component { const { payrollStore: { salaryTemplateShowSet, setSalaryTemplateShowSet } } = this.props; let request = { ...salaryTemplateShowSet, ...params }; setSalaryTemplateShowSet(request); + window.localStorage.setItem("salary-showset", JSON.stringify(request)); }; // 工资单主题 插入变量 @@ -30,61 +33,19 @@ export default class ShowSettingForm extends React.Component { let request = { ...salaryTemplateShowSet }; request.theme = (request.theme ? request.theme : "") + param; setSalaryTemplateShowSet(request); + window.localStorage.setItem("salary-showset", JSON.stringify(request)); }; - handleDownClick = (index) => { - const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props; - let downItem = salaryItemSet[index + 1]; - let thisItem = salaryItemSet[index]; - let resultSet = [...salaryItemSet]; - resultSet[index] = downItem; - resultSet[index + 1] = thisItem; + handleChangeSalaryItem = (resultSet) => { + const { payrollStore: { setSalaryItemSet } } = this.props; setSalaryItemSet(resultSet); }; - handleUpClick = (index) => { - const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props; - let upItem = salaryItemSet[index - 1]; - let thisItem = salaryItemSet[index]; - let resultSet = [...salaryItemSet]; - resultSet[index] = upItem; - resultSet[index - 1] = thisItem; - setSalaryItemSet(resultSet); - }; - - handleDeleteItem = (group, item) => { - const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props; - let resultSalaryItemSet = [...salaryItemSet]; - resultSalaryItemSet.map(sourceGroup => { - if (sourceGroup.id == group.id) { - sourceGroup.items.map((sourceItem, index) => { - if (sourceItem.id == item.id) { - sourceGroup.items.splice(index, 1); - } - }); - } - }); - setSalaryItemSet(resultSalaryItemSet); - }; - - handleDeleteClick = (index) => { - Modal.confirm({ - title: "信息确认", - content: "确认删除", - onOk: () => { - const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props; - let resultSalaryItemSet = [...salaryItemSet]; - resultSalaryItemSet.splice(index, 1); - setSalaryItemSet(resultSalaryItemSet); - } - }); - }; - render() { const { payrollStore, id } = this.props; - const salaryTemplateShowSetStorage = id ? "{}" : window.localStorage.getItem("salary-showset") || "{}"; + const salaryTemplateShowSetStorage = (id ? "{}" : window.localStorage.getItem("salary-showset") || "{}"); const { salaryTemplateShowSet } = payrollStore; - const { salaryItemSet } = payrollStore; + const { salaryItemSet, templateBaseData } = payrollStore; const { theme, background, @@ -164,54 +125,23 @@ export default class ShowSettingForm extends React.Component { - - { - salaryItemSet.map((group, index) => ( -
-
{group.groupName} - { - index < salaryItemSet.length - 1 && - { - this.handleDownClick(index); - }} - /> - } - { - index > 0 && - { - this.handleUpClick(index); - }} - /> - } - { - this.handleDeleteClick(index); - }} - /> -
-
- {group.items.map(item => ( - {item.name} - { - this.handleDeleteItem(group, item); - }} - /> - - ))} -
-
- )) + + 薪资项目设置 + this.salaryItemSettingsRef.handleOpenModal(toJS(templateBaseData).salarySob, "添加分类")}/> + } + items={[]} needTigger showGroup + > + this.salaryItemSettingsRef = dom} + dataSource={salaryItemSet} + onChangeSalaryItem={this.handleChangeSalaryItem} + salarySobId={toJS(templateBaseData).salarySob} + isReplenish={true} + /> ); diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/tmplateSettingForm.js b/pc4mobx/hrmSalary/pages/payroll/stepForm/tmplateSettingForm.js index af2ea5de..ad0fabfe 100644 --- a/pc4mobx/hrmSalary/pages/payroll/stepForm/tmplateSettingForm.js +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/tmplateSettingForm.js @@ -1,119 +1,40 @@ import React from "react"; -import { Icon, Modal } from "antd"; -import { WeaSearchGroup } from "ecCom"; +import { WeaButtonIcon, WeaSearchGroup } from "ecCom"; import { inject, observer } from "mobx-react"; import { toJS } from "mobx"; import "./index.less"; +import SalaryItemSettings from "./salaryItemSettings"; @inject("payrollStore") @observer export default class TemplateSettingForm extends React.Component { - - handleDownClick = (index) => { - const { payrollStore: { replenishSalaryTemplateSalaryItemSet, setReplenishSalaryTemplateSalaryItemSet } } = this.props; - let downItem = replenishSalaryTemplateSalaryItemSet[index + 1]; - let thisItem = replenishSalaryTemplateSalaryItemSet[index]; - let resultSet = [...replenishSalaryTemplateSalaryItemSet]; - resultSet[index] = downItem; - resultSet[index + 1] = thisItem; + handleChangeSalaryItem = (resultSet) => { + const { payrollStore: { setReplenishSalaryTemplateSalaryItemSet } } = this.props; setReplenishSalaryTemplateSalaryItemSet(resultSet); }; - handleUpClick = (index) => { - const { payrollStore: { replenishSalaryTemplateSalaryItemSet, setReplenishSalaryTemplateSalaryItemSet } } = this.props; - let upItem = replenishSalaryTemplateSalaryItemSet[index - 1]; - let thisItem = replenishSalaryTemplateSalaryItemSet[index]; - let resultSet = [...replenishSalaryTemplateSalaryItemSet]; - resultSet[index] = upItem; - resultSet[index - 1] = thisItem; - setReplenishSalaryTemplateSalaryItemSet(resultSet); - }; - - handleDeleteItem = (group, item) => { - const { payrollStore: { replenishSalaryTemplateSalaryItemSet, setReplenishSalaryTemplateSalaryItemSet } } = this.props; - let resultSalaryItemSet = [...replenishSalaryTemplateSalaryItemSet]; - resultSalaryItemSet.map(sourceGroup => { - if (sourceGroup.id === group.id) { - sourceGroup.items.map((sourceItem, index) => { - if (sourceItem.id === item.id) { - sourceGroup.items.splice(index, 1); - } - }); - } - }); - setReplenishSalaryTemplateSalaryItemSet(resultSalaryItemSet); - }; - - handleDeleteClick = (index) => { - Modal.confirm({ - title: "信息确认", - content: "确认删除", - onOk: () => { - const { payrollStore: { replenishSalaryTemplateSalaryItemSet, setReplenishSalaryTemplateSalaryItemSet } } = this.props; - let resultSalaryItemSet = [...replenishSalaryTemplateSalaryItemSet]; - resultSalaryItemSet.splice(index, 1); - setReplenishSalaryTemplateSalaryItemSet(resultSalaryItemSet); - }, - onCancel: () => { - } - }); - }; - render() { const { payrollStore } = this.props; - const { replenishSalaryTemplateSalaryItemSet } = payrollStore; + const { replenishSalaryTemplateSalaryItemSet, templateBaseData } = payrollStore; return (
- - { - !_.isEmpty(toJS(replenishSalaryTemplateSalaryItemSet)) && - replenishSalaryTemplateSalaryItemSet.map((group, index) => ( -
-
{group.groupName} - { - index < replenishSalaryTemplateSalaryItemSet.length - 1 && - { - this.handleDownClick(index); - }} - /> - } - { - index > 0 && - { - this.handleUpClick(index); - }} - /> - } - { - this.handleDeleteClick(index); - }} - /> -
-
- {group.items.map(item => ( - {item.name} - { - this.handleDeleteItem(group, item); - }} - /> - - ))} -
-
- )) + + 薪资项目设置 + this.salaryItemSettingsRef.handleOpenModal(toJS(templateBaseData).salarySob, "添加分类")}/> +
} + items={[]} needTigger showGroup> + this.salaryItemSettingsRef = dom} + dataSource={replenishSalaryTemplateSalaryItemSet} + onChangeSalaryItem={this.handleChangeSalaryItem} + salarySobId={toJS(templateBaseData).salarySob} + isReplenish={true} + />
);