Merge branch 'feature/230701-工资单定时发送任务' into release/2.8.3.2307.01

This commit is contained in:
黎永顺 2023-07-10 10:04:02 +08:00
commit 448bde008f
4 changed files with 144 additions and 18 deletions

View File

@ -1,6 +1,6 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { message, Tag } from "antd";
import { Dropdown, Menu, message, Tag } from "antd";
import moment from "moment";
import CustomPaginationTable from "../../components/customPaginationTable";
import "../calculate/index.less";
@ -91,6 +91,7 @@ export default class SalarySendList extends React.Component {
{
title: "操作",
key: "operate",
width: 150,
render: (text, record) => {
const { sendNum, sendTotal, salaryAcctType, haveBackCalc, canSeeDetail } = record;
//显示发放
@ -106,7 +107,14 @@ export default class SalarySendList extends React.Component {
}
{
sendNum !== sendTotal && !showGrant &&
<a href="javascript:void(0);" onClick={() => this.handleUpdateTemplate(record)}>更新模板</a>
<Dropdown
overlay={
<Menu onClick={() => this.handleUpdateTemplate(record)}>
<Menu.Item key="delete">更新模板</Menu.Item>
</Menu>
}>
<i className="icon-coms-more more"/>
</Dropdown>
}
</React.Fragment>
);

View File

@ -1,10 +1,13 @@
import React from "react";
import { WeaCheckbox, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom";
import { WeaCheckbox, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup, WeaSelect, WeaTimePicker } from "ecCom";
import { inject, observer } from "mobx-react";
import { getReplenishRuleSetOptions } from "../../../apis/payroll";
import { commonEnumList } from "../../../apis/payrollFiles";
import moment from "moment";
import { toJS } from "mobx";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
@inject("payrollStore")
@observer
@ -15,6 +18,7 @@ export default class BaseInformForm extends React.Component {
inited: false,
options: [],
replenishRuleOptions: [],
salaryMonthOptions: [],
request: {}
};
}
@ -23,6 +27,7 @@ export default class BaseInformForm extends React.Component {
const { payrollStore } = this.props;
const { getPayrollBaseForm } = payrollStore;
const templateBaseData = window.localStorage.getItem("template-basedata") || "{}";
this.commonEnumList();
getPayrollBaseForm(this.props.id).then(data => {
this.setState(
{
@ -35,7 +40,9 @@ export default class BaseInformForm extends React.Component {
...data.templateBaseData,
msgStatus: !this.props.id ? "1" : data.templateBaseData.msgStatus,
reissueRule: data.templateBaseData.replenishRule ? "1" : "0",
...JSON.parse(templateBaseData)
...JSON.parse(templateBaseData),
sendEmail: "",
autoSendStatus: !_.isNil(data.templateBaseData.autoSendStatus) ? data.templateBaseData.autoSendStatus : false
}
}, () => {
this.props.onChange && this.props.onChange(this.state.request);
@ -48,7 +55,7 @@ export default class BaseInformForm extends React.Component {
JSON.parse(templateBaseData).salarySob && this.getReplenishRuleSetOptions({ salarySobId: JSON.parse(templateBaseData).salarySob });
}
hanldeChange = (params) => {
handleChange = (params) => {
let request = { ...this.state.request, ...params };
this.setState({
request
@ -70,10 +77,33 @@ export default class BaseInformForm extends React.Component {
}
});
};
commonEnumList = () => {
commonEnumList({ enumClass: "com.engine.salary.enums.salarysend.SalaryAutoSendCycleTypeEnum" })
.then(({ status, data }) => {
if (status && !_.isEmpty(data)) {
this.setState({
salaryMonthOptions: _.map(data, it => ({ key: it.value.toString(), showname: it.defaultLabel }))
});
}
});
};
render() {
const { request, options, replenishRuleOptions } = this.state;
const { salarySob, name, description, replenishName, replenishRule, reissueRule, msgStatus, emailStatus } = request;
const { request, options, replenishRuleOptions, salaryMonthOptions } = this.state;
const {
salarySob,
name,
description,
replenishName,
replenishRule,
reissueRule,
msgStatus,
emailStatus,
autoSendStatus,
autoSendDayOfMonth,
autoSendTimeOfDay,
autoSendCycleType
} = request;
return (
<React.Fragment>
@ -90,7 +120,7 @@ export default class BaseInformForm extends React.Component {
options={options}
value={salarySob ? salarySob : ""}
style={{ width: 200 }}
onChange={value => this.hanldeChange({ salarySob: value })}/>
onChange={value => this.handleChange({ salarySob: value })}/>
}
</WeaFormItem>
<WeaFormItem
@ -101,7 +131,7 @@ export default class BaseInformForm extends React.Component {
<WeaInput
value={name}
viewAttr={3}
onChange={value => this.hanldeChange({ name: value })}
onChange={value => this.handleChange({ name: value })}
/>
</WeaFormItem>
<WeaFormItem
@ -112,7 +142,7 @@ export default class BaseInformForm extends React.Component {
<WeaInput
value={replenishName}
viewAttr={3}
onChange={value => this.hanldeChange({ replenishName: value })}
onChange={value => this.handleChange({ replenishName: value })}
/>
</WeaFormItem>
<WeaFormItem
@ -125,7 +155,7 @@ export default class BaseInformForm extends React.Component {
value={reissueRule}
detailtype={3}
viewAttr={3}
onChange={value => this.hanldeChange({ reissueRule: value })}
onChange={value => this.handleChange({ reissueRule: value })}
/>
</WeaFormItem>
{
@ -139,7 +169,7 @@ export default class BaseInformForm extends React.Component {
options={replenishRuleOptions}
value={replenishRule}
viewAttr={3}
onChange={value => this.hanldeChange({ replenishRule: value })}
onChange={value => this.handleChange({ replenishRule: value })}
/>
</WeaFormItem>
}
@ -150,7 +180,7 @@ export default class BaseInformForm extends React.Component {
>
<WeaInput
value={description}
onChange={value => this.hanldeChange({ description: value })}
onChange={value => this.handleChange({ description: value })}
/>
</WeaFormItem>
</WeaSearchGroup>
@ -158,14 +188,80 @@ export default class BaseInformForm extends React.Component {
className="payrollBaseInfoWrapper">
<WeaFormItem label={getLabel(111, "系统消息")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaCheckbox value={msgStatus ? "1" : "0"} display="switch"
onChange={value => this.hanldeChange({ msgStatus: value === "1" })}/>
onChange={value => this.handleChange({ msgStatus: value === "1" })}/>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "邮件")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaCheckbox value={emailStatus ? "1" : "0"} display="switch"
onChange={value => this.hanldeChange({ emailStatus: value === "1" })}/>
onChange={value => this.handleChange({ emailStatus: value === "1" })}/>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "定时发送")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaCheckbox value={autoSendStatus ? "1" : "0"} display="switch"
onChange={value => {
this.handleChange({
autoSendStatus: value === "1",
autoSendDayOfMonth: value === "1" ? "1" : null,
autoSendTimeOfDay: value === "1" ? "09:00" : null,
autoSendCycleType: value === "1" ? 1 : null,
});
}}/>
</WeaFormItem>
{
autoSendStatus &&
<WeaFormItem label={getLabel(111, "发送时间")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<SendTimeComp
salaryMonthOptions={salaryMonthOptions}
value={{
autoSendDayOfMonth,
autoSendTimeOfDay,
autoSendCycleType
}}
onChange={this.handleChange}
/>
</WeaFormItem>
}
</WeaSearchGroup>
</React.Fragment>
);
}
}
const SendTimeComp = (props) => {
const { value, onChange, salaryMonthOptions } = props;
const { autoSendDayOfMonth, autoSendTimeOfDay, autoSendCycleType } = value;
const handleChangeSendtime = (key, val) => {
onChange({ autoSendDayOfMonth, autoSendTimeOfDay, autoSendCycleType, [key]: val });
};
return <div className="customTimeCompWrapper">
<div>
<span>{getLabel(542604, "薪资所属月")}</span>
<WeaSelect
value={autoSendCycleType.toString()}
options={salaryMonthOptions}
onChange={v => handleChangeSendtime("autoSendCycleType", Number(v))}
/>
<WeaSelect
value={!_.isNil(autoSendDayOfMonth) ? autoSendDayOfMonth : "1"}
options={_.map(getDay(autoSendCycleType), item => ({ key: item, showname: item }))}
onChange={v => handleChangeSendtime("autoSendDayOfMonth", v)}
/>
<span>{getLabel(16992, "号")}</span>
</div>
<WeaTimePicker value={!_.isNil(autoSendTimeOfDay) ? autoSendTimeOfDay : "09:00"} size="small"
onChange={v => handleChangeSendtime("autoSendTimeOfDay", v)}/>
</div>;
};
const getDay = (num = 1) => {
let days = [];
let day = getDaysInMonth(moment().year(), moment().month() + num);
for (let i = 1; i <= day; i++) {
days.push(i);
}
return days;
};
const getDaysInMonth = (year, month) => {
month = parseInt(month, 10);
let d = new Date(year, month, 0);
return d.getDate();
};

View File

@ -234,4 +234,20 @@
border-bottom: 1px solid #e5e5e5;
}
}
.customTimeCompWrapper {
display: flex;
justify-content: flex-start;
& > div {
margin-right: 10px;
display: flex;
align-items: center;
.wea-select {
width: 80px;
margin: 0 10px;
}
}
}
}

View File

@ -2,7 +2,7 @@ import React from "react";
import { inject, observer } from "mobx-react";
import { WeaLocaleProvider, WeaTable } from "ecCom";
import { toJS } from "mobx";
import { Radio, Spin } from "antd";
import { Dropdown, Menu, Radio, Spin } from "antd";
const getLabel = WeaLocaleProvider.getLabel;
@inject("payrollStore")
@ -93,8 +93,14 @@ export default class TemplateSettingList extends React.Component {
onClick={() => this.onOperatesClick(record, "0")}>{getLabel(501169, "编辑")}</a>
<a href="javascript:void(0);" style={{ marginRight: 10 }}
onClick={() => this.onOperatesClick(record, "1")}>{getLabel(77, "复制")}</a>
<a href="javascript:void(0);"
onClick={() => this.onOperatesClick(record, "2")}>{getLabel(535052, "删除")}</a>
<Dropdown
overlay={
<Menu onClick={() => this.onOperatesClick(record, "2")}>
<Menu.Item key="delete">{getLabel(535052, "删除")}</Menu.Item>
</Menu>
}>
<i className="icon-coms-more more"/>
</Dropdown>
</React.Fragment>;
}
}