Merge branch 'hotfix/v2-工资单模板添加1208' into develop

# Conflicts:
#	pc4mobx/hrmSalary/apis/payroll.js
#	pc4mobx/hrmSalary/pages/payroll/index.js
#	pc4mobx/hrmSalary/stores/payroll.js
This commit is contained in:
黎永顺 2022-12-07 15:43:35 +08:00
commit aac9b4580e
10 changed files with 428 additions and 142 deletions

View File

@ -315,6 +315,29 @@ export const grantProxy = params => {
}).then(res => res.json());
};
// 工资单发放-新建时获取补发工资单模板薪资项目设置
export const getReplenishForm = params => {
return fetch("/api/bs/hrmsalary/salaryBill/template/getReplenishForm", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// 工资单发放-获取规则设置下拉框
export const getReplenishRuleSetOptions = ({ salarySobId }) => {
return fetch(`/api/bs/hrmsalary/salaryBill/template/getReplenishRuleSetOptions?salarySobId=${salarySobId}`, {
method: "GET",
mode: "cors",
headers: {
"Content-Type": "application/json"
}
}).then(res => res.json());
};
//添加发送和撤回人员范围列表
export const sendRangeList = (params) => {
return postFetch('/api/bs/hrmsalary/salaryBill/send/range/list', params);

View File

@ -1,28 +1,29 @@
import React from 'react';
import { WeaSteps } from 'ecCom'
import React from "react";
import { WeaSteps } from "ecCom";
import "./index.less";
const Step = WeaSteps.Step;
import "./index.less"
export default class StepSlideHeader extends React.Component {
render() {
return (
<div className="stepSlideHeader">
<div className="headerWrapper">
<WeaSteps current={this.props.current}>
{
this.props.steps && this.props.steps.map(item =>
(
<Step description={item} />
)
)
}
</WeaSteps>
</div>
<div className="contentWrapper">
{this.props.children}
</div>
</div>
)
}
}
render() {
return (
<div className="stepSlideHeader">
<div className="headerWrapper">
<WeaSteps current={this.props.current}>
{
this.props.steps && this.props.steps.map(item =>
(
<Step description={item}/>
)
)
}
</WeaSteps>
</div>
<div className="contentWrapper">
{this.props.children}
</div>
</div>
);
}
}

View File

@ -6,14 +6,17 @@ import moment from "moment";
import { WeaHelpfulTip, WeaInputSearch, WeaSelect, WeaSlideModal, WeaTop } from "ecCom";
import { renderLoading } from "../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import CustomTab from "../../components/customTab";
import { columns, tempateColumns } from "./columns";
import StepSlide from "../../components/stepSlide";
import BaseInformForm from "./stepForm/baseInformForm";
import ShowSettingForm from "./stepForm/showSettingForm";
import SlideModalTitle from "../../components/slideModalTitle";
import TemplateSettingList from "./templateSettingList";
import { notNull } from "../../util/validate";
import TemplateSettingForm from "./stepForm/tmplateSettingForm";
import CopyModal from "./copyModal";
import SalarySendList from "./SalarySendList";
import { getReplenishForm } from "../../apis/payroll";
import "../dataAcquisition/cumDeduct/index.less";
const { MonthPicker } = DatePicker;
@ -28,7 +31,7 @@ export default class Payroll extends React.Component {
selectedKey: "0",
currentStep: 0,
stepSlideVisible: false,
selectedTab: "0",
selectedTab: 0,
editSlideVisible: false,
initSelected: false,
ledgerOptions: [],
@ -60,11 +63,37 @@ export default class Payroll extends React.Component {
setTemplateBaseData(request);
};
getReplenishForm = (isEdit = false, params = {}) => {
const { payrollStore } = this.props;
const { templateBaseData, salaryTemplateShowSet, setReplenishSalaryTemplateSalaryItemSet } = payrollStore;
if (!salaryTemplateShowSet.theme && !isEdit) {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
return;
}
getReplenishForm({ salarySobId: templateBaseData.salarySob, ...params }).then(({ status, data }) => {
if (status) {
if (!isEdit) {
this.setState({ currentStep: this.state.currentStep + 1 }, () => {
setReplenishSalaryTemplateSalaryItemSet(data.replenishSalaryTemplateSalaryItemSet);
window.localStorage.setItem("salaryTemplateShowSet", JSON.stringify(salaryTemplateShowSet));
});
} else {
setReplenishSalaryTemplateSalaryItemSet(data.replenishSalaryTemplateSalaryItemSet);
window.localStorage.setItem("salaryTemplateShowSet", JSON.stringify(salaryTemplateShowSet));
}
}
});
};
// 新建保存
handleSave = () => {
const { payrollStore } = this.props;
const { fetchSavePayroll } = payrollStore;
fetchSavePayroll().then(() => {
window.localStorage.removeItem("templateBaseData");
window.localStorage.removeItem("salaryTemplateShowSet");
this.setState({ currentStep: 0, stepSlideVisible: false });
});
};
@ -102,7 +131,7 @@ export default class Payroll extends React.Component {
const { getPayrollShowForm } = payrollStore;
this.recordId = record.id;
getPayrollShowForm(record.id);
this.setState({ templateCurrentId: record.id, selectedTab: "0" }, () => {
this.setState({ templateCurrentId: record.id, selectedTab: 0 }, () => {
this.setState({ editSlideVisible: true });
});
}
@ -137,9 +166,6 @@ export default class Payroll extends React.Component {
content: "确认删除",
onOk: () => {
deletePayroll([record.id]);
},
onCancel: () => {
}
});
}
@ -167,8 +193,29 @@ export default class Payroll extends React.Component {
// 更新保存
handleUpdateSave = () => {
const { selectedTab } = this.state;
const { payrollStore } = this.props;
const { fetchUpdatePayroll } = payrollStore;
if (selectedTab === 0) {
if (!this.validateStep1()) {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
return;
}
} else if (selectedTab === 1) {
const { salaryTemplateShowSet } = payrollStore;
if (!salaryTemplateShowSet.theme) {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
return;
}
}
fetchUpdatePayroll(this.recordId).then(() => {
this.setState({
editSlideVisible: false,
@ -191,6 +238,18 @@ export default class Payroll extends React.Component {
getPayrollList({ salaryYearMonth: this.salaryYearMonth, ...pageInfo });
}
validateStep1 = () => {
const { payrollStore: { templateBaseData } } = this.props;
const { reissueRule = "0" } = templateBaseData;
const validList = reissueRule === "0" ? ["name", "replenishName", "salarySob"] : ["name", "replenishName", "salarySob", "replenishRule"];
if (_.every(validList, it => !!templateBaseData[it])) {
window.localStorage.setItem("templateBaseData", JSON.stringify(templateBaseData));
} else {
window.localStorage.removeItem("templateBaseData");
}
return _.every(validList, it => !!templateBaseData[it]);
};
render() {
const { payrollStore, taxAgentStore: { showOperateBtn } } = this.props;
const { loading, hasRight, templateStore, deletePayroll } = payrollStore;
@ -285,20 +344,15 @@ export default class Payroll extends React.Component {
);
}
};
const steps = ["基础设置", "显示设置"];
const validateStep1 = () => {
const { payrollStore: { templateBaseData } } = this.props;
if (!notNull(templateBaseData.name) || !notNull(templateBaseData.salarySob)) {
const steps = ["基础设置", "正常核算工资单模板", "补发工资单模版"];
const nextStep = () => {
if (!this.validateStep1()) {
Modal.warning({
title: "信息确认",
content: "必要信息不完整,红色*为必填项!"
});
return false;
return;
}
return true;
};
const nextStep = () => {
if (!validateStep1()) return;
this.setState({
currentStep: this.state.currentStep + 1
});
@ -359,6 +413,8 @@ export default class Payroll extends React.Component {
currentStep={currentStep}
steps={steps}
onCancel={() => {
window.localStorage.removeItem("templateBaseData");
window.localStorage.removeItem("salaryTemplateShowSet");
this.setState({ stepSlideVisible: false });
}}
customOperate={
@ -367,23 +423,33 @@ export default class Payroll extends React.Component {
nextStep();
}}>下一步</Button>
] : currentStep === 1 ? [
<Button type="default" style={{ marginRight: 10 }} onClick={() => {
<Button type="default" onClick={() => {
prevStep();
}}>上一步</Button>,
<Button type="primary" onClick={this.handleSave}>保存</Button>,
<Button type="default" style={{ marginLeft: 10 }} onClick={this.handlePreview}>预览</Button>
] : []
<Button type="primary" onClick={() => this.getReplenishForm()}>下一步</Button>,
<Button type="default" onClick={() => {
this.handlePreview();
}}>预览</Button>
] : currentStep === 2 ? [
<Button type="default" onClick={() => {
prevStep();
}}>上一步</Button>,
<Button type="primary" onClick={this.handleSave}>保存</Button>
] :
[]
}
title="新建工资单模板"
content={
<div>
{
currentStep === 0 &&
<BaseInformForm onChange={this.handleBaseInfoChange}/>
currentStep === 0 && <BaseInformForm onChange={(request) => this.handleBaseInfoChange(request)}/>
}
{
currentStep === 1 && <ShowSettingForm/>
}
{
currentStep === 2 && <TemplateSettingForm/>
}
</div>
}
/>
@ -397,42 +463,61 @@ export default class Payroll extends React.Component {
top={0}
width={50}
height={100}
direction={"right"}
measure={"%"}
direction="right"
measure="%"
title={
<SlideModalTitle
subtitle="编辑工资单模板"
tabs={[{ title: "基础设置", key: "0" }, { title: "显示设置", key: "1" }]}
tabs={[
{ title: "基础设置", key: 0 },
{ title: "正常核算工资单模板", key: 1 },
{ title: "补发工资单模版", key: 2 }
]}
editable={false}
selectedTab={selectedTab}
showOperateBtn={showOperateBtn}
customOperate={
selectedTab === "0" ? [
<Button type="primary" onClick={this.handleUpdateSave}>保存</Button>
] : selectedTab === "1" ? [
<Button type="primary" onClick={this.handleUpdateSave} style={{ marginRight: 10 }}>保存</Button>,
selectedTab === 0 ? [
<Button type="primary" onClick={() => {
this.handleUpdateSave();
}}>保存</Button>
] : selectedTab === 1 ? [
<Button type="primary" onClick={() => {
this.handleUpdateSave();
}}>保存</Button>,
<Button type="default" onClick={this.handlePreview}>预览</Button>
] : []
}
subItemChange={
(selectedTab) => {
this.setState({ selectedTab });
}
] : [
<Button type="primary" onClick={() => {
this.handleUpdateSave();
}}>保存</Button>
]
}
subItemChange={(selectedTab) => {
this.setState({ selectedTab: Number(selectedTab) }, () => {
if (this.state.selectedTab === 2) this.getReplenishForm(true, { id: this.state.templateCurrentId });
});
}}
/>
}
content={<div>
{
selectedTab === "0" &&
<BaseInformForm id={this.state.templateCurrentId} onChange={this.handleBaseInfoChange}/>
selectedTab === 0 &&
<BaseInformForm id={this.state.templateCurrentId}
onChange={(request) => this.handleBaseInfoChange(request)}/>
}
{
selectedTab === "1" && <ShowSettingForm id={this.state.templateCurrentId}/>
selectedTab === 1 && <ShowSettingForm id={this.state.templateCurrentId}/>
}
{
selectedTab === 2 && <TemplateSettingForm id={this.state.templateCurrentId}/>
}
</div>}
onClose={() => this.setState({ editSlideVisible: false }, () => this.setState({ selectedTab: 0 }))}
showMask={true}
closeMaskOnClick={() => this.setState({ editSlideVisible: false }, () => this.setState({ selectedTab: 0 }))}/>
onClose={() => this.setState({ editSlideVisible: false }, () => {
window.localStorage.removeItem("templateBaseData");
window.localStorage.removeItem("salaryTemplateShowSet");
this.setState({ selectedTab: 0 });
})}
/>
}
{
this.state.copyModalVisible &&

View File

@ -1,6 +1,7 @@
import React from "react";
import { WeaFormItem, WeaInput, WeaSearchGroup, WeaSelect } from "ecCom";
import { inject, observer } from "mobx-react";
import { getReplenishRuleSetOptions } from "../../../apis/payroll";
import { toJS } from "mobx";
@inject("payrollStore")
@ -11,6 +12,7 @@ export default class BaseInformForm extends React.Component {
this.state = {
inited: false,
options: [],
replenishRuleOptions: [],
request: {}
};
}
@ -18,37 +20,60 @@ export default class BaseInformForm extends React.Component {
componentWillMount() {
const { payrollStore } = this.props;
const { getPayrollBaseForm } = payrollStore;
const templateBaseData = window.localStorage.getItem("templateBaseData") || "{}";
getPayrollBaseForm(this.props.id).then(data => {
this.setState(
{
replenishRuleOptions: _.map(data.replenishRuleSetOption, it => ({ key: it.id, showname: it.content })),
options: _.isEmpty(toJS(data.salarySobOptions)) ? [{ key: "", showname: "" }] : [{
key: "",
showname: ""
}, ...toJS(data.salarySobOptions)],
request: data.templateBaseData
},
() => {
request: {
...data.templateBaseData,
reissueRule: data.templateBaseData.replenishRule ? "1" : "0",
...JSON.parse(templateBaseData)
}
}, () => {
this.props.onChange && this.props.onChange(this.state.request);
this.setState({
inited: true
});
}
);
});
JSON.parse(templateBaseData).salarySob && this.getReplenishRuleSetOptions({ salarySobId: JSON.parse(templateBaseData).salarySob });
}
hanldeChange(params) {
hanldeChange = (params) => {
let request = { ...this.state.request, ...params };
this.setState({
request
}, () => {
if (this.state.request.reissueRule === "1" && this.state.request.salarySob) {
// TODO获取规则设置枚举项
this.getReplenishRuleSetOptions();
}
});
this.props.onChange && this.props.onChange(request);
}
};
getReplenishRuleSetOptions = (params = {}) => {
const { request } = this.state;
getReplenishRuleSetOptions({ salarySobId: request.salarySob, ...params }).then(({ status, data }) => {
if (status && !_.isEmpty(data)) {
this.setState({
replenishRuleOptions: _.map(data, it => ({ key: it.id, showname: it.content }))
});
}
});
};
render() {
const { request, options } = this.state;
const { salarySob, name, description } = request;
const { request, options, replenishRuleOptions } = this.state;
const { salarySob, name, description, replenishName, replenishRule, reissueRule } = request;
return (
<WeaSearchGroup title="基础信息" items={[]} needTigger showGroup center>
<WeaSearchGroup title="基础信息" items={[]} needTigger showGroup col={1}>
<WeaFormItem
label="薪资账套"
labelCol={{ span: 6 }}
@ -75,6 +100,45 @@ export default class BaseInformForm extends React.Component {
onChange={value => this.hanldeChange({ name: value })}
/>
</WeaFormItem>
<WeaFormItem
label="补发工资单模板名称"
labelCol={{ span: 6 }}
wrapperCol={{ span: 18 }}
>
<WeaInput
value={replenishName}
viewAttr={3}
onChange={value => this.hanldeChange({ replenishName: value })}
/>
</WeaFormItem>
<WeaFormItem
label="补发工资单名单生成规则"
labelCol={{ span: 6 }}
wrapperCol={{ span: 18 }}
>
<WeaSelect
options={[{ key: "0", showname: "全部" }, { key: "1", showname: "按规则" }]}
value={reissueRule}
detailtype={3}
viewAttr={3}
onChange={value => this.hanldeChange({ reissueRule: value })}
/>
</WeaFormItem>
{
reissueRule !== "0" &&
<WeaFormItem
label="规则设置"
labelCol={{ span: 6 }}
wrapperCol={{ span: 18 }}
>
<WeaSelect
options={replenishRuleOptions}
value={replenishRule}
viewAttr={3}
onChange={value => this.hanldeChange({ replenishRule: value })}
/>
</WeaFormItem>
}
<WeaFormItem
label="备注"
labelCol={{ span: 6 }}

View File

@ -23,7 +23,6 @@
}
.showSettingForm {
padding: 10px 20px;
.settingItemWrapper {
.itemTitle {

View File

@ -3,7 +3,7 @@ import { Icon, Modal, Radio, Switch } from "antd";
import { WeaFormItem, WeaInput, WeaSearchGroup } from "ecCom";
import { inject, observer } from "mobx-react";
import BackgroundUpload from "../components/backgroundUpload";
import './index.less';
import "./index.less";
@inject("payrollStore")
@ -17,22 +17,22 @@ export default class ShowSettingForm extends React.Component {
}
// form 字段变化时的回调
handleChange(params) {
handleChange = (params) => {
const { payrollStore: { salaryTemplateShowSet, setSalaryTemplateShowSet } } = this.props;
let request = { ...salaryTemplateShowSet, ...params };
setSalaryTemplateShowSet(request);
}
};
// 工资单主题 插入变量
handleThemeNameCllck(param) {
handleThemeNameCllck = (param) => {
const { payrollStore } = this.props;
const { salaryTemplateShowSet, setSalaryTemplateShowSet } = payrollStore;
let request = { ...salaryTemplateShowSet };
request.theme = (request.theme ? request.theme : "") + param;
setSalaryTemplateShowSet(request);
}
};
handleDownClick(index) {
handleDownClick = (index) => {
const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props;
let downItem = salaryItemSet[index + 1];
let thisItem = salaryItemSet[index];
@ -40,9 +40,9 @@ export default class ShowSettingForm extends React.Component {
resultSet[index] = downItem;
resultSet[index + 1] = thisItem;
setSalaryItemSet(resultSet);
}
};
handleUpClick(index) {
handleUpClick = (index) => {
const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props;
let upItem = salaryItemSet[index - 1];
let thisItem = salaryItemSet[index];
@ -50,11 +50,10 @@ export default class ShowSettingForm extends React.Component {
resultSet[index] = upItem;
resultSet[index - 1] = thisItem;
setSalaryItemSet(resultSet);
}
};
handleDeleteItem(group, item) {
handleDeleteItem = (group, item) => {
const { payrollStore: { salaryItemSet, setSalaryItemSet } } = this.props;
console.log("item:", item);
let resultSalaryItemSet = [...salaryItemSet];
resultSalaryItemSet.map(sourceGroup => {
if (sourceGroup.id == group.id) {
@ -66,9 +65,9 @@ export default class ShowSettingForm extends React.Component {
}
});
setSalaryItemSet(resultSalaryItemSet);
}
};
handleDeleteClick(index) {
handleDeleteClick = (index) => {
Modal.confirm({
title: "信息确认",
content: "确认删除",
@ -77,14 +76,13 @@ export default class ShowSettingForm extends React.Component {
let resultSalaryItemSet = [...salaryItemSet];
resultSalaryItemSet.splice(index, 1);
setSalaryItemSet(resultSalaryItemSet);
},
onCancel: () => {
}
});
}
};
render() {
const { payrollStore } = this.props;
const { payrollStore, id } = this.props;
const salaryTemplateShowSetStorage = id ? "{}" : window.localStorage.getItem("salaryTemplateShowSet") || "{}";
const { salaryTemplateShowSet } = payrollStore;
const { salaryItemSet } = payrollStore;
const {
@ -94,7 +92,7 @@ export default class ShowSettingForm extends React.Component {
textContentPosition,
salaryItemNullStatus,
salaryItemZeroStatus
} = salaryTemplateShowSet;
} = { ...salaryTemplateShowSet, ...JSON.parse(salaryTemplateShowSetStorage) };
return (
<div className="showSettingForm">
<WeaSearchGroup title="主题及其他设置" items={[]} needTigger showGroup center>

View File

@ -0,0 +1,121 @@
import React from "react";
import { Icon, Modal } from "antd";
import { WeaSearchGroup } from "ecCom";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import "./index.less";
@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;
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;
return (
<div className="showSettingForm">
<WeaSearchGroup title="薪资项目设置" items={[]} needTigger showGroup>
{
!_.isEmpty(toJS(replenishSalaryTemplateSalaryItemSet)) &&
replenishSalaryTemplateSalaryItemSet.map((group, index) => (
<div className="configItemWrapper">
<div className="configTitle">{group.groupName}
{
index < replenishSalaryTemplateSalaryItemSet.length - 1 &&
<Icon
type="caret-down"
style={{ marginLeft: "10px", cursor: "pointer", color: "#666" }}
onClick={() => {
this.handleDownClick(index);
}}
/>
}
{
index > 0 &&
<Icon
type="caret-up"
style={{ marginLeft: "10px", cursor: "pointer", color: "#666" }}
onClick={() => {
this.handleUpClick(index);
}}
/>
}
<i
className="icon-coms-Delete"
style={{ cursor: "pointer", color: "#666", marginLeft: "10px" }}
onClick={() => {
this.handleDeleteClick(index);
}}
/>
</div>
<div className="configContent">
{group.items.map(item => (
<span className="editItem">{item.name}
<Icon
type="cross" style={{ cursor: "pointer" }}
onClick={() => {
this.handleDeleteItem(group, item);
}}
/>
</span>
))}
</div>
</div>
))
}
</WeaSearchGroup>
</div>
);
}
}

View File

@ -10,6 +10,8 @@ export default class FormalFormModal extends React.Component {
constructor(props) {
super(props);
this.state = {
validateType: "",
returnType: "",
value: "",
extendParam: {
sqlReturnKey: "",
@ -35,7 +37,9 @@ export default class FormalFormModal extends React.Component {
if (this.props.formulaId) {
detailFormual(this.props.formulaId).then(data => {
this.setState({
value: data.formula
value: data.formula,
validateType: data.validateType,
returnType: data.returnType,
});
this.parameters = data.parameters;
this.referenceType = data.referenceType;
@ -185,8 +189,8 @@ export default class FormalFormModal extends React.Component {
description: "备注",
module: "salary",
useFor: "salaryitem",
returnType: this.props.dataType,
validateType: this.props.dataType,
returnType: this.props.dataType || this.state.returnType,
validateType: this.props.dataType|| this.state.validateType,
extendParam: JSON.stringify(this.state.extendParam),
formula: this.state.value,
parameters: this.parameters,

View File

@ -1,26 +1,26 @@
import React from 'react';
import ReactDOM from 'react-dom';
import React from "react";
import ReactDOM from "react-dom";
import { createHashHistory } from 'History';
import { createHashHistory } from "History";
import { Router, Route, useRouterHistory, IndexRedirect } from 'react-router';
import { IndexRedirect, Route, Router, useRouterHistory } from "react-router";
import { syncHistoryWithStore, RouterStore } from 'mobx-react-router';
import { RouterStore, syncHistoryWithStore } from "mobx-react-router";
import { Provider } from 'mobx-react';
import { Provider } from "mobx-react";
import Module from 'weaHrmSalary';
import Module from "weaHrmSalary";
const routing = new RouterStore();
const allStore = {
routing,
...Module.store,
...Module.store
};
const browserHistory = useRouterHistory(createHashHistory)({
queryKey: '_key',
basename: '/',
queryKey: "_key",
basename: "/"
});
const history = syncHistoryWithStore(browserHistory, allStore.routing);
@ -31,21 +31,24 @@ class Root extends React.Component {
componentWillMount() {
top.$(".ant-message").remove();
allStore.taxAgentStore.getPermission();
window.localStorage.removeItem("templateBaseData");
window.localStorage.removeItem("salaryTemplateShowSet");
}
render() {
return (
<Provider {...allStore}>
<Router history={history}>
<Route name='root' breadcrumbName='根路由' path='/' component={Home}>
<IndexRedirect to='main/hrmSalary/index' />
<Route name='main' breadcrumbName='入口' path='/main' component={Home}>
{ Module.Route }
<Route name="root" breadcrumbName="根路由" path="/" component={Home}>
<IndexRedirect to="main/hrmSalary/index"/>
<Route name="main" breadcrumbName="入口" path="/main" component={Home}>
{Module.Route}
</Route>
</Route>
</Router>
</Provider>
)
);
}
}
ReactDOM.render(<Root />, document.getElementById('container'));
ReactDOM.render(<Root/>, document.getElementById("container"));

View File

@ -1,9 +1,8 @@
import { action, observable } from "mobx";
import { action, observable, toJS } from "mobx";
import { message } from "antd";
import { WeaForm, WeaTableNew } from "comsMobx";
import * as API from "../apis/payroll"; // 引入API接口文件
import { notNull } from "../util/validate";
import { removePropertyCondition } from "../util/response";
const { TableStore } = WeaTableNew;
@ -23,6 +22,7 @@ export class payrollStore {
@observable salarySobOptions = []; // 账套列表
// 显示设置表单
@observable salaryTemplateShowSet = {}; // 显示设置基础表单
@observable replenishSalaryTemplateSalaryItemSet = []; // 补发工资单模版基础表单
@observable salaryItemSet = []; // 显示设置薪资项
// **** 工资单页面 ****
@ -53,6 +53,10 @@ export class payrollStore {
@observable canWidthdrawColumns = []; // 可以撤回的列表列名
@observable canWithdrawPageInfo = {}; // 可以撤回列表分页对象
@action
setReplenishSalaryTemplateSalaryItemSet = replenishSalaryTemplateSalaryItemSet =>
(this.replenishSalaryTemplateSalaryItemSet = replenishSalaryTemplateSalaryItemSet);
@action
setGrantListShowSearchAd = grantListShowSearchAd =>
(this.grantListShowSearchAd = grantListShowSearchAd);
@ -64,8 +68,7 @@ export class payrollStore {
// 基础信息表单数据
@action
setTemplateBaseData = templateBaseData =>
(this.templateBaseData = templateBaseData);
setTemplateBaseData = templateBaseData => (this.templateBaseData = templateBaseData);
// 显示设置基础表单
@action
@ -168,6 +171,7 @@ export class payrollStore {
})
: [];
resolve({
replenishRuleSetOption: res.data.replenishRuleSetOption,
templateBaseData: this.templateBaseData,
salarySobOptions: this.salarySobOptions
});
@ -182,15 +186,14 @@ export class payrollStore {
// 工资单模板-获取工资单模板显示设置表单
@action
getPayrollShowForm = (id = "") => {
let params = {
id
};
const params = { id };
const salaryTemplateShowSetStorage = window.localStorage.getItem("salaryTemplateShowSet") || "{}";
API.getPayrollShowForm(params).then(res => {
if (res.status) {
if (id !== "") {
this.salaryItemSet = res.data.salaryTemplateSalaryItemSet;
}
this.salaryTemplateShowSet = res.data.salaryTemplateShowSet.data;
this.salaryTemplateShowSet = { ...res.data.salaryTemplateShowSet.data, ...JSON.parse(salaryTemplateShowSetStorage) };
} else {
message.error(res.errormsg || "获取失败");
}
@ -216,23 +219,15 @@ export class payrollStore {
@action
initShowSettingForm = (id = "") => {
this.getPayrollShowForm(id);
if (id == "") {
if (id === "") {
this.getPayrollItemList(this.templateBaseData.salarySob);
}
};
// 校验显示设置表单
validateSalaryTemplateShowSet = () => {
if (!notNull(this.salaryTemplateShowSet.theme)) {
message.warning("工资单主题不能为空");
return false;
}
return true;
};
// 拼装保存参数
convertParams = () => {
let params = { ...this.templateBaseData, ...this.salaryTemplateShowSet };
params.replenishRule = (!params.replenishRule || params.reissueRule === "0") ? "ALL" : params.replenishRule;
params.salarySobId = params.salarySob;
params.emailStatus = params.emailStatus ? params.emailStatus : false;
params.msgStatus = params.msgStatus ? params.msgStatus : false;
@ -242,19 +237,16 @@ export class payrollStore {
params.salaryItemZeroStatus = params.salaryItemZeroStatus
? params.salaryItemZeroStatus
: false;
params.salaryItemSetting = this.salaryItemSet;
params.salaryItemSetting = toJS(this.salaryItemSet);
params.replenishSalaryItemSetting = toJS(this.replenishSalaryTemplateSalaryItemSet);
return params;
};
// 工资单模板-新建工资单模板
@action
fetchSavePayroll = () => {
let params = this.convertParams();
return new Promise((resolve, reject) => {
if (!this.validateSalaryTemplateShowSet()) {
reject();
return false;
}
const params = this.convertParams();
API.savePayroll(params).then(res => {
if (res.status) {
message.success("保存成功");
@ -264,20 +256,16 @@ export class payrollStore {
message.error(res.errormsg || "保存失败");
reject();
}
});
}).catch(() => reject());
});
};
// 工资单模板-更新工资单模板
@action
fetchUpdatePayroll = id => {
let params = this.convertParams();
params.id = id;
return new Promise((resolve, reject) => {
if (!this.validateSalaryTemplateShowSet()) {
reject();
return false;
}
let params = this.convertParams();
params.id = id;
API.updatePayroll(params).then(res => {
if (res.status) {
message.success("保存成功");