feature/2.15.1.2407.01-薪资项目以及字段管理页面改造

This commit is contained in:
黎永顺 2024-09-24 10:53:41 +08:00
parent efa75925ad
commit fd067b653f
5 changed files with 179 additions and 171 deletions

View File

@ -145,13 +145,14 @@ export const salaryItemConditions = [
viewAttr: 3
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["defaultValue"],
fieldcol: 14,
label: "默认值",
lanId: 111,
labelcol: 8,
value: "",
otherParams: { precision: 2 },
viewAttr: 2
},
{
@ -162,7 +163,19 @@ export const salaryItemConditions = [
lanId: 111,
labelcol: 8,
value: "",
viewAttr: 1
viewAttr: 3,
hide: true
},
{
conditionType: "INPUT",
domkey: ["formulaId"],
fieldcol: 14,
label: "公式",
lanId: 111,
labelcol: 8,
value: "",
viewAttr: 3,
hide: true
},
{
conditionType: "INPUTNUMBER",
@ -194,6 +207,31 @@ export const salaryItemConditions = [
value: "",
viewAttr: 2,
otherParams: { minRows: 3 }
},
{
conditionType: "SWITCH",
domkey: ["useInEmployeeSalary"],
fieldcol: 14,
label: "薪资档案引用",
lanId: 111,
labelcol: 8,
value: "0",
viewAttr: 2,
tipLanId: 111,
tip: "提示:开启后,该薪资项目不可删除或设为无效,取值方式会默认置为输入",
hide: true
},
{
conditionType: "SWITCH",
domkey: ["systemType"],
fieldcol: 14,
label: "是否系统默认",
lanId: 111,
labelcol: 8,
value: "0",
viewAttr: 2,
hide: true
}
],
title: "",

View File

@ -2,12 +2,12 @@ import React from "react";
import { inject, observer } from "mobx-react";
import { WeaFormItem, WeaHelpfulTip, WeaLocaleProvider, WeaSearchGroup, WeaSlideModal, WeaTools } from "ecCom";
import { WeaSwitch } from "comsMobx";
import FormalFormModal from "./formalFormModal";
import { salaryItemConditions } from "./columns";
import { commonEnumList } from "../../apis/archive";
import { postFetch } from "../../util/request";
import { getItemForm } from "../../apis/item";
// import FormalFormModal from "./formalFormModal";
// import SalaryItemForm from "./salaryItemForm";
const getLabel = WeaLocaleProvider.getLabel;
@ -19,11 +19,7 @@ export default class CustomSalaryItemSlide extends React.Component {
constructor(props) {
super(props);
this.state = {
conditions: [],
showForm: false,
formalModalVisible: false,
salaryItemName: ""
conditions: [], visible: false
};
}
@ -37,20 +33,16 @@ export default class CustomSalaryItemSlide extends React.Component {
}
}
handleChange = (params) => {
this.props.onChange({ ...this.props.request, ...params });
handleChange = (data) => {
const { salaryItemStore: { itemsForm: form } } = this.props;
form.updateFields({ formulaContent: { value: data["formula"] }, formulaId: { value: data["id"] } });
};
handleShowFormal = (salaryItemName) => {
this.setState({
formalModalVisible: true,
salaryItemName
});
};
initForm = async (props) => {
const { data: salaryItemForm } = props.id ?
await getItemForm({ id: props.id }) : { data: { sharedType: "0", useDefault: "0", hideDefault: "0" } };
await getItemForm({ id: props.id }) :
{
data: { sharedType: "0", useDefault: "0", hideDefault: "0", pattern: 2, dataType: "number", valueType: "1" }
};
const [{ data: sharedTypeList }, { data: taxAgentList }] = await Promise.all([
commonEnumList({ enumClass: "com.engine.salary.enums.sicategory.SharedTypeEnum" }),
postFetch("/api/bs/hrmsalary/taxAgent/listAuth", { filterType: "ADMIN_DATA" })
@ -71,16 +63,41 @@ export default class CustomSalaryItemSlide extends React.Component {
break;
case "taxAgentIds":
fields = {
...fields, options: _.map(taxAgentList, o => ({ key: String(o.id), showname: o.name }))
...fields, options: _.map(taxAgentList, o => ({ key: String(o.id), showname: o.name })),
hide: String(salaryItemForm["sharedType"]) === "0" || !_.isNil(salaryItemForm["sharedType"])
};
break;
case "dataType":
case "valueType":
case "roundingMode":
fields = {
...fields, options: _.map(fields.options, o => ({ ...o, showname: getLabel(o.lanId, o.showname) }))
};
break;
case "roundingMode":
fields = {
...fields, options: _.map(fields.options, o => ({ ...o, showname: getLabel(o.lanId, o.showname) })),
hide: String(salaryItemForm["dataType"]) === "string"
};
break;
case "pattern":
fields = {
...fields, hide: String(salaryItemForm["dataType"]) === "string"
};
break;
case "defaultValue":
const otherParams = String(salaryItemForm["dataType"]) === "number" ? { precision: Number(salaryItemForm["pattern"]) } : {};
fields = {
...fields, otherParams,
conditionType: String(salaryItemForm["dataType"]) === "string" ? "INPUT" : "INPUTNUMBER",
hide: String(salaryItemForm["valueType"]) !== "1"
};
break;
case "formulaContent":
fields = {
...fields, hide: String(salaryItemForm["valueType"]) === "1",
label: String(salaryItemForm["valueType"]) === "2" ? getLabel(111, "公式") : getLabel(111, "SQL")
};
break;
default:
break;
}
@ -93,20 +110,38 @@ export default class CustomSalaryItemSlide extends React.Component {
});
};
handleChangeFormItem = (res) => {
const { salaryItemStore: { itemsForm: form } } = this.props;
const { conditions } = this.state, [key] = _.keys(res), value = res[key].value;
this.setState({
conditions: _.map(conditions, c => {
return {
...c, items: _.map(c.items, fields => {
if (key === "sharedType" && getKey(fields) === "taxAgentIds") {
fields = { ...fields, viewAttr: value === "0" ? 2 : 3, hide: value === "0" };
} else if (key === "dataType" && (getKey(fields) === "roundingMode" || getKey(fields) === "pattern")) {
fields = { ...fields, hide: value === "string" };
} else if ((key === "dataType" || key === "pattern") && getKey(fields) === "defaultValue") {
const otherParams = form.getFormParams().dataType === "number" ? { precision: Number(form.getFormParams().pattern) } : {};
fields = {
...fields, viewAttr: value === "0" ? 2 : 3, hide: value === "0"
...fields, otherParams, conditionType: value === "string" ? "INPUT" : "INPUTNUMBER",
hide: form.getFormParams().valueType !== "1"
};
} else if (key === "valueType" && (getKey(fields) === "formulaContent" || getKey(fields) === "defaultValue")) {
fields = {
...fields,
label: getKey(fields) === "defaultValue" ? fields.label : form.getFormDatas().valueType.valueSpan,
hide: (getKey(fields) === "formulaContent" && value === "1") || (getKey(fields) === "defaultValue" && value !== "1")
};
}
return fields;
})
};
})
}, () => {
form.getFormParams().valueType === "1" &&
form.updateFields({ formulaContent: { value: "" }, formulaId: { value: "" } });
(form.getFormParams().valueType === "2" || form.getFormParams().valueType === "3") &&
form.updateFields({ defaultValue: { value: "" } });
});
};
renderForm = () => {
@ -121,6 +156,10 @@ export default class CustomSalaryItemSlide extends React.Component {
<WeaFormItem label={`${fields.label}`} labelCol={{ span: `${fields.labelcol}` }}
wrapperCol={{ span: `${fields.fieldcol}` }} error={form.getError(fields)} tipPosition="bottom">
<WeaSwitch fieldConfig={fields} form={form} formParams={formParams} onChange={this.handleChangeFormItem}/>
{
getKey(fields) === "formulaContent" && form.getFormParams().valueType !== "1" &&
<div className="formula_input_div" onClick={() => this.setState({ visible: true })}/>
}
{
fields.tip && <WeaHelpfulTip
style={{ marginLeft: 16 }} width={350} title={getLabel(fields.tipLanId, fields.tip)}
@ -146,33 +185,30 @@ export default class CustomSalaryItemSlide extends React.Component {
};
render() {
const { request, onClose } = this.props;
const { onClose, salaryItemStore: { itemsForm: form } } = this.props;
// const { valueType, dataType, formulaId } = request;
// const { formalModalVisible, salaryItemName } = this.state;
const { visible, salaryItemName } = this.state;
return (<WeaSlideModal
className="custom_salaryItemSlide"{...this.props}
top={0} width={800} height={100} measureT="%" measureX="px" measureY="%"
direction="right" title={this.renderTitle()} onClose={() => onClose()}
content={<div className="form-dialog-layout">{this.renderForm()}</div>}/>
content={<div className="form-dialog-layout">
{this.renderForm()}
{visible &&
<FormalFormModal
formulaId={form.getFormParams().formulaId}
visible={visible}
name={form.getFormParams().name}
valueType={form.getFormParams().valueType}
dataType={form.getFormParams().dataType}
onSaveFormal={this.handleChange}
onCancel={() => this.setState({ visible: false })}
/>
}
</div>}/>
// <div className="customSalaryItemSlide">
// <SalaryItemForm {...this.props} onChangeFieldsItem={this.handleChange} onShowFormal={this.handleShowFormal}/>
// {formalModalVisible &&
// <FormalFormModal
// name={salaryItemName}
// formulaId={formulaId}
// visible={formalModalVisible}
// valueType={valueType}
// dataType={dataType}
// onSaveFormal={data => {
// this.handleSaveFormal(data);
// }}
// onCancel={() =>
// this.setState({
// formalModalVisible: false,
// salaryItemName: ""
// })}
// />}
// </div>
);
}

View File

@ -1,6 +1,6 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, Dropdown, Menu, message, Modal, Switch } from "antd";
import { Button, Dropdown, Menu, message, Modal } from "antd";
import { WeaInputSearch, WeaLocaleProvider, WeaTop } from "ecCom";
import * as API from "../../apis/item";
import SalaryItemsTable from "./salaryItemsTable";
@ -69,9 +69,10 @@ export default class SalaryItem extends React.Component {
});
};
handleDeleteItem = () => {
handleDeleteItem = (recordId) => {
const { selectedRowKeys, isQuery } = this.state;
if (_.isEmpty(selectedRowKeys)) {
const params = recordId ? [recordId] : selectedRowKeys;
if (_.isEmpty(params)) {
message.warning(getLabel(111, "请勾选数据!"));
return;
}
@ -79,7 +80,7 @@ export default class SalaryItem extends React.Component {
title: getLabel(131329, "信息确认"),
content: getLabel(111, "确认删除吗?"),
onOk: () => {
API.deleteItem(selectedRowKeys).then(({ status, errormsg }) => {
API.deleteItem(params).then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(111, "操作成功!"));
this.setState({ isQuery: !isQuery });
@ -87,118 +88,56 @@ export default class SalaryItem extends React.Component {
message.error(errormsg);
}
});
},
onCancel: () => {
}
});
};
getColumns = () => {
const { salaryItemStore, taxAgentStore: { showSalaryItemBtn, showOperateBtn } } = this.props;
const { tableColumns } = salaryItemStore;
let columns = tableColumns.map(column => {
let newColumn = column;
newColumn.render = (text, record, index) => { //前端元素转义
let valueSpan = record[newColumn.dataIndex + "span"] !== undefined ? record[newColumn.dataIndex + "span"] : record[newColumn.dataIndex];
switch (newColumn.dataIndex) {
case "name":
return <a onClick={() => {
this.onEditItem(record, false);
}}>{text}</a>;
case "useDefault":
case "hideDefault":
case "useInEmployeeSalary":
return <Switch checked={text === 1} disabled/>;
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
}
};
return newColumn;
handleValidateForm = () => {
return new Promise((resolve) => {
const { salaryItemStore: { itemsForm: form } } = this.props;
const { formulaId, valueType, sharedType, taxAgentIds } = form.getFormParams();
let taxAgentValidate = true, formulaValidate = true;
if (sharedType === "1" && !taxAgentIds) taxAgentValidate = false;
if (valueType !== "1" && !formulaId) formulaValidate = false;
resolve({ taxAgentValidate, formulaValidate });
});
columns.push({
key: "operate",
title: "操作",
width: 185,
render: (text, record) => {
return (
<React.Fragment>
<a
onClick={() => this.onEditItem(record, true)}>{(showSalaryItemBtn || showOperateBtn) ? "编辑" : "查看"}</a>
{
(record.canDelete && (showSalaryItemBtn || showOperateBtn)) &&
<a href="javascript:void(0)" style={{ marginLeft: 10 }}
onClick={() => this.handleDeleteItem(record)}
>{getLabel(535052, "删除")}</a>
}
<Dropdown
overlay={
<Menu>
<Menu.Item>
<a href="javascript:void(0);"
onClick={() => this.onDropMenuClick("log", record.id)}>{getLabel(545781, "操作日志")}</a>
</Menu.Item>
</Menu>
}>
<a href="javascript:void(0)" style={{ marginLeft: 10 }}><i className="icon-coms-more"/></a>
</Dropdown>
</React.Fragment>
);
}
});
return [
// {
// title: "序号",
// dataIndex: "index",
// align: "left",
// width: 60,
// render: (text, record, index) => {
// const { current, pageSize } = this.state.searchParams;
// return (current - 1) * pageSize + index + 1;
// }
// },
...columns];
};
handleSearch(value) {
const { salaryItemStore: { getTableDatas } } = this.props;
getTableDatas({ ...this.state.searchParams, current: 1, name: value }).then(res => {
this.setState({
searchParams: {
...this.state.searchParams,
current: 1,
total: res.total
}
});
});
}
handlePageChange(value) {
const { salaryItemStore: { getTableDatas } } = this.props;
getTableDatas({ ...this.state.searchParams, name: this.state.searchValue, current: value }).then(res => {
this.setState({
searchParams: {
...this.state.searchParams,
current: value,
total: res.total
}
});
});
}
handleShowSizeChange(searchParams) {
const { salaryItemStore: { getTableDatas } } = this.props;
getTableDatas({ ...searchParams });
}
handleSalaryItem = (type) => {
const { customItemDialog: { id }, isQuery } = this.state;
const { salaryItemStore: { itemsForm: form } } = this.props;
form.validateForm().then(f => {
if (f.isValid) {
console.log(form.getFormParams());
} else {
f.showErrors();
}
});
Promise.all([form.validateForm(), this.handleValidateForm()])
.then(([f1, f2]) => {
if (f1.isValid && f2.taxAgentValidate && f2.formulaValidate) {
const { formulaContent, valueType, dataType, defaultValue, pattern, ...formData } = form.getFormParams();
const key = valueType === "2" ? "originFormulaContent" : valueType === "3" ? "originSqlContent" : "formulaContent";
this.setState({ loading: true });
API.saveItem({
...formData, valueType, dataType, pattern, [key]: formulaContent, id,
defaultValue: dataType === "number" ? toDecimal_n(defaultValue, parseInt(pattern)) : defaultValue
}).then(({ status, errormsg }) => {
this.setState({ loading: false });
if (status) {
this.setState({ isQuery: !isQuery }, () => {
message.success(getLabel(111, "操作成功"));
type === "SAVECREATE" && form.updateFields({
name: { value: "" }, formulaContent: { value: "" }, formulaId: { value: "" }
});
type !== "SAVECREATE" && this.setState({
customItemDialog: { ...this.state.customItemDialog, visible: false, id: "" }
});
});
} else {
message.error(errormsg);
}
});
} else {
!f1.isValid && f1.showErrors();
!f2.taxAgentValidate && f1.showError("taxAgentIds", getLabel(111, "\"可见性范围\"未填写"));
!f2.formulaValidate && f1.showError("formulaId", getLabel(111, `\"${form.getFormDatas().valueType.valueSpan}\"未填写`));
this.forceUpdate();
}
});
};
onDropMenuClick = (key, targetid = "") => {
switch (key) {
@ -229,6 +168,9 @@ export default class SalaryItem extends React.Component {
}
});
break;
case "delete":
this.handleDeleteItem(targetid);
break;
case "sysAdd":
break;
default:
@ -274,7 +216,7 @@ export default class SalaryItem extends React.Component {
let buttons = [
<Dropdown.Button overlay={menu} type="primary"
onClick={() => this.onDropMenuClick("customAdd")}>{getLabel(111, "新增自定义薪资项")}</Dropdown.Button>,
<Button type="ghost" onClick={this.handleDeleteItem}>{getLabel(32136, "批量删除")}</Button>,
<Button type="ghost" onClick={() => this.handleDeleteItem()}>{getLabel(32136, "批量删除")}</Button>,
<WeaInputSearch value={name} onChange={val => this.setState({ name: val })}
placeholder={getLabel(111, "请输入名称")} onSearch={() => this.setState({ isQuery: !isQuery })}/>
];
@ -390,7 +332,7 @@ export default class SalaryItem extends React.Component {
{/*新增编辑自定义薪资项目*/}
<CustomSalaryItemSlide {...customItemDialog} onSearch={() => this.setState({ isQuery: !isQuery })}
onClose={callback => this.setState({
customItemDialog: { ...customItemDialog, visible: false }
customItemDialog: { ...customItemDialog, visible: false, id: "" }
}, () => callback && callback())}/>
{/*{*/}
{/* editSlideVisible &&*/}

View File

@ -28,6 +28,16 @@
.wea-form-item-wrapper {
display: block !important;
.formula_input_div {
cursor: pointer;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 2;
}
}
}

View File

@ -9,7 +9,7 @@
*/
import React, { Component } from "react";
import { WeaCheckbox, WeaLocaleProvider, WeaTable } from "ecCom";
import { Dropdown, Menu, message, Modal } from "antd";
import { Dropdown, Menu } from "antd";
import * as API from "../../apis/item";
const getLabel = WeaLocaleProvider.getLabel;
@ -54,24 +54,6 @@ class SalaryItemsTable extends Component {
}
});
};
handleDeleteItem = (record) => {
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: getLabel(111, "确认删除吗?"),
onOk: () => {
API.deleteItem(selectedRowKeys).then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(111, "操作成功!"));
this.getItemList(this.props);
} else {
message.error(errormsg);
}
});
},
onCancel: () => {
}
});
};
render() {
const { dataSource, columns, pageInfo, loading } = this.state;
@ -111,7 +93,7 @@ class SalaryItemsTable extends Component {
{
(showOperateBtn || showSalaryItemBtn) && record.canDelete &&
<a style={{ marginRight: 8 }} href="javascript:void(0);"
onClick={() => this.handleDeleteItem(record)}>{getLabel(111, "删除")}</a>
onClick={() => onDropMenuClick("delete", record.id)}>{getLabel(111, "删除")}</a>
}
<Dropdown overlay={
<Menu>