Merge branch 'develop' into feature/V2-dev合并多语言

# Conflicts:
#	pc4mobx/hrmSalary/pages/calculate/index.js
#	pc4mobx/hrmSalary/pages/calculateDetail/compareDetail.js
#	pc4mobx/hrmSalary/pages/dataAcquisition/dataTables.js
#	pc4mobx/hrmSalary/pages/declare/generateModal.js
#	pc4mobx/hrmSalary/pages/declare/index.js
#	pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerBaseSetting.js
#	pc4mobx/hrmSalary/pages/ledgerPage/components/ledgerTable.js
#	pc4mobx/hrmSalary/pages/mySalary/index.js
#	pc4mobx/hrmSalary/pages/payroll/SalarySendList.js
#	pc4mobx/hrmSalary/pages/payroll/index.js
#	pc4mobx/hrmSalary/pages/payrollFiles/index.js
#	pc4mobx/hrmSalary/pages/reportView/index.js
#	pc4mobx/hrmSalary/pages/ruleConfig/index.js
#	pc4mobx/hrmSalary/pages/salaryItem/index.js
#	pc4mobx/hrmSalary/pages/socialSecurityBenefits/archives/index.js
#	pc4mobx/hrmSalary/pages/socialSecurityBenefits/programme/index.js
#	pc4mobx/hrmSalary/pages/socialSecurityBenefits/standingBook/index.js
#	pc4mobx/hrmSalary/pages/taxAgent/index.js
This commit is contained in:
黎永顺 2023-07-04 10:50:53 +08:00
commit 6e832fe873
69 changed files with 2498 additions and 958 deletions

View File

@ -564,3 +564,7 @@ export const cacheImportField = (params) => {
body: JSON.stringify(params)
}).then(res => res.json());
};
//薪资核算-页面查看权限
export const salaryacctAcctresultCheckAuth = params => {
return WeaTools.callApi("/api/bs/hrmsalary/salaryacct/acctresult/checkAuth", "GET", params);
};

View File

@ -1,4 +1,5 @@
import { WeaTools } from 'ecCom';
import { postFetch } from '../util/request';
//个税申报表-个税申报表列表
export const getDeclareList = params => {
@ -7,7 +8,7 @@ export const getDeclareList = params => {
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
},
body: JSON.stringify(params)
}).then(res => res.json())
}
@ -24,7 +25,7 @@ export const saveDeclare = params => {
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
},
body: JSON.stringify(params)
}).then(res => res.json())
}
@ -41,7 +42,7 @@ export const getDetailList = params => {
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
},
body: JSON.stringify(params)
}).then(res => res.json())
}
@ -52,13 +53,16 @@ export const exportSalaryArchive = (id = "") => {
fetch('/api/bs/hrmsalary/taxdeclaration/export?taxDeclarationId=' + id).then(res => res.blob().then(blob => {
var filename=`个税申报表.xlsx`
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))
}
//个税申报表-撤回申报
export const withDrawTaxDeclaration = (params) => {
return postFetch('/api/bs/hrmsalary/taxdeclaration/withDrawTaxDeclaration', params);
}

View File

@ -367,3 +367,24 @@ export const getAvailableSalaryItemSet = (params) => {
export const salaryBillSendSum = (params) => {
return postFetch("/api/bs/hrmsalary/salaryBill/send/sum", params);
};
//工资单发放-发送短信验证码
export const sendMobileCode = (params) => {
return postFetch("/api/bs/hrmsalary/salaryBill/sendMobileCode", params);
};
//工资单-验证方式
export const payrollCheckType = params => {
return WeaTools.callApi("/api/bs/hrmsalary/salaryBill/payrollCheckType", "GET", params);
};
// 工资单基础设置-获取设置列表
export const getSalaryBillBaseSetForm = (id) => {
return WeaTools.callApi("/api/bs/hrmsalary/salaryBill/baseSet/getForm", "get", {});
};
//工资单基础设置-保存工资单基础设置(设置水印)
export const salaryBillBaseSetSave = (params) => {
return postFetch("/api/bs/hrmsalary/salaryBill/baseSet/save", params);
};
//工资单基础设置-保存工资单基础设置(水印预览)
export const salaryBillBaseSetPreviewWaterMark = (params) => {
return postFetch("/api/bs/hrmsalary/salaryBill/baseSet/previewWaterMark", params);
};

View File

@ -65,3 +65,11 @@ export const deletePendingTodo = (params) => {
export const deleteSuspendTodo = (params) => {
return postFetch('/api/bs/hrmsalary/salaryArchive/deleteSuspendTodo', params);
}
// 待定薪、停薪员工 是否允许删除薪资档案
export const salaryArchiveDelete = (params) => {
return WeaTools.callApi('/api/bs/hrmsalary/sys/conf/code?code=salaryArchiveDelete', 'GET', params);
}
// 删除薪资档案
export const deleteSalaryArchive = (params) => {
return postFetch('/api/bs/hrmsalary/salaryArchive/deleteSalaryArchive', params);
}

View File

@ -1,53 +1,65 @@
import { WeaTools } from 'ecCom';
import { postFetch } from '../util/request';
import { WeaTools } from "ecCom";
import { postFetch } from "../util/request";
//通用字典表 {enumClass:""}
export const commonEnumList = (params) => {
return WeaTools.callApi('/api/bs/hrmsalary/common/enum/list', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/common/enum/list", "GET", params);
};
export const sysOrderRule = params => {
return WeaTools.callApi('/api/bs/hrmsalary/sys/orderRule', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/sys/orderRule", "GET", params);
};
//保存排序规则
export const updateOrderRule = (params) => {
return postFetch('/api/bs/hrmsalary/sys/updateOrderRule', params);
}
return postFetch("/api/bs/hrmsalary/sys/updateOrderRule", params);
};
//导入规则详情信息
export const sysConfCodeRule = params => {
return WeaTools.callApi('/api/bs/hrmsalary/sys/conf/code', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/sys/conf/code", "GET", params);
};
//保存导入规则
export const saveMatchEmployeeModeRule = (params) => {
return postFetch('/api/bs/hrmsalary/sys/saveMatchEmployeeModeRule', params);
}
return postFetch("/api/bs/hrmsalary/sys/saveMatchEmployeeModeRule", params);
};
//应用配置查询
export const queryAppsetting = (params) => {
return WeaTools.callApi('/api/bs/hrmsalary/sys/app/setting', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/sys/app/setting", "GET", params);
};
//加密配置保存
export const saveEncryptSetting = (params) => {
return postFetch('/api/bs/hrmsalary/sys/app/setting/saveEncryptSetting', params);
}
return postFetch("/api/bs/hrmsalary/sys/app/setting/saveEncryptSetting", params);
};
//加密配置保存
export const appSettingSave = (params) => {
return postFetch('/api/bs/hrmsalary/sys/app/setting/save', params);
}
return postFetch("/api/bs/hrmsalary/sys/app/setting/save", params);
};
//获取加密进度条
export const getEncryptProgress = params => {
return WeaTools.callApi('/api/bs/hrmsalary/sys/app/getEncryptProgress', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/sys/app/getEncryptProgress", "GET", params);
};
//保存报税规则
export const operateTaxDeclarationFunction = (params) => {
return postFetch('/api/bs/hrmsalary/sys/operateTaxDeclarationFunction', params);
}
return postFetch("/api/bs/hrmsalary/sys/operateTaxDeclarationFunction", params);
};
//保存档案删除规则
export const saveArchiveDelete = (params) => {
return postFetch("/api/bs/hrmsalary/sys/saveArchiveDelete", params);
};
//保存个税申报撤回规则
export const saveWithDrawTaxDeclaration = (params) => {
return postFetch("/api/bs/hrmsalary/sys/saveWithDrawTaxDeclaration", params);
};
//保存匹配规则
export const saveSalaryAcctEmployeeRule = (params) => {
return postFetch("/api/bs/hrmsalary/sys/saveSalaryAcctEmployeeRule", params);
};
//保存薪酬统计报表
export const reportStatisticsReportSave = (params) => {
return postFetch('/api/bs/hrmsalary/report/statistics/report/save', params);
}
return postFetch("/api/bs/hrmsalary/report/statistics/report/save", params);
};
//薪酬统计维度下拉列表
export const reportGetForm = params => {
return WeaTools.callApi('/api/bs/hrmsalary/report/statistics/report/getForm', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/report/statistics/report/getForm", "GET", params);
};

View File

@ -1,146 +1,150 @@
import { WeaTools } from 'ecCom';
import { WeaTools } from "ecCom";
import { postFetch } from "../util/request";
export const tips = params => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/tips', 'get', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/tips", "get", params);
};
export const getCondition = params => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/getSearchCondition', 'get', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/getSearchCondition", "get", params);
};
//社保福利档案列表
export const queryList = (params) => {
return postFetch('/api/bs/hrmsalary/archives/getTable', params);
return postFetch("/api/bs/hrmsalary/archives/getTable", params);
};
//社保福利档案列表
export const queryInsuranceTabTotal = (params) => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/queryInsuranceTabTotal', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/queryInsuranceTabTotal", params);
};
//删除待办-待增员
export const updateRunStatus = (params) => {
return postFetch('/api/bs/hrmsalary/archives/updateRunStatus', params);
return postFetch("/api/bs/hrmsalary/archives/updateRunStatus", params);
};
//删除待办-待减员
export const cancelStayDel = (params) => {
return postFetch('/api/bs/hrmsalary/archives/cancelStayDel', params);
return postFetch("/api/bs/hrmsalary/archives/cancelStayDel", params);
};
//全量增员
export const allStayAddToPay = (params) => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/allStayAddToPay', 'GET', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/allStayAddToPay", "GET", params);
};
//全量减员
export const allStayDelToStop = (params) => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/allStayDelToStop', 'GET', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/allStayDelToStop", "GET", params);
};
//增员
export const stayAddToPay = (params) => {
return postFetch('/api/bs/hrmsalary/archives/stayAddToPay', params);
return postFetch("/api/bs/hrmsalary/archives/stayAddToPay", params);
};
//减员
export const stayDelToStop = (params) => {
return postFetch('/api/bs/hrmsalary/archives/stayDelToStop', params);
return postFetch("/api/bs/hrmsalary/archives/stayDelToStop", params);
};
//删除社保档案
export const deleteArchive = (params) => {
return postFetch("/api/bs/hrmsalary/archives/deleteArchive", params);
};
//取消停缴
export const cancelStopPayment = (params) => {
return postFetch('/api/bs/hrmsalary/archives/cancelStopPayment', params);
return postFetch("/api/bs/hrmsalary/archives/cancelStopPayment", params);
};
export const getTable = params => {
return fetch('/api/bs/hrmsalary/archives/getTable', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
return fetch("/api/bs/hrmsalary/archives/getTable", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
export const getBaseForm = params => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/getBaseForm', 'get', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/getBaseForm", "get", params);
};
export const getPaymentForm = params => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/getPaymentForm', 'get', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/getPaymentForm", "get", params);
};
// 保存
export const save = params => {
return fetch('/api/bs/hrmsalary/archives/save', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
return fetch("/api/bs/hrmsalary/archives/save", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// 导出档案
export const exportDocument = params => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/export', 'get', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/export", "get", params);
};
// 导入档案 - 获取组件的一些前置参数
export const getImportDocumentParams = params => {
return WeaTools.callApi('/api/bs/hrmsalary/archives/getImportParams', 'get', params);
return WeaTools.callApi("/api/bs/hrmsalary/archives/getImportParams", "get", params);
};
// 导入档案- 导出现有数据
export const exportCurData = params => {
fetch('/api/bs/hrmsalary/scheme/template/export',{
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.blob().then(blob => {
var filename=`社保福利档案模板.xlsx`
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))
fetch("/api/bs/hrmsalary/scheme/template/export", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.blob().then(blob => {
var filename = `社保福利档案模板.xlsx`;
var a = document.createElement("a");
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}));
};
// 导入档案-预览
export const previewCurData = (params) => {
return fetch('/api/bs/hrmsalary/scheme/preview', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/scheme/preview", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// 档案导入
export const importBatch = (params) => {
return fetch('/api/bs/hrmsalary/scheme/importBatch', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/scheme/importBatch", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// 导出档案
export const exportArchives = (ids) => {
fetch('/api/bs/hrmsalary/scheme/export?ids=' + ids).then(res => res.blob().then(blob => {
var filename=`社保福利档案.xlsx`
var a = document.createElement('a');
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}))
}
fetch("/api/bs/hrmsalary/scheme/export?ids=" + ids).then(res => res.blob().then(blob => {
var filename = `社保福利档案.xlsx`;
var a = document.createElement("a");
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
}));
};

View File

@ -13,7 +13,7 @@ class Index extends Component {
return { ...item, fixed: "left", width: 176 };
}
if (item.dataIndex === "operate") {
return { ...item, fixed: "right", width: "120px" };
return { ...item, fixed: "right", width: item.width || "120px" };
}
return { ...item, width: "33%" };
});

View File

@ -8,17 +8,17 @@
}
.linkWapper {
a {
color: #4d7ad8;
margin-right: 8px;
}
//a {
// color: #4d7ad8;
// margin-right: 8px;
//}
i {
cursor: pointer;
}
a:hover {
text-decoration: none;
}
//a:hover {
// text-decoration: none;
//}
}
}

View File

@ -0,0 +1,94 @@
/*
* Author: 黎永顺
* name: 验证码弹框
* Description:
* Date: 2023/6/16
*/
import React, { Component } from "react";
import { WeaDialog, WeaError, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup } from "ecCom";
import { sendMobileCode } from "../../apis/payroll";
import { Button } from "antd";
import "./index.less";
const { getLabel } = WeaLocaleProvider;
class Index extends Component {
constructor(props) {
super(props);
this.state = {
captcha: "",
time: 60
};
this.timeRef = null;
}
componentWillUnmount() {
clearInterval(this.timeRef);
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.visible !== this.props.visible && !nextProps.visible) {
clearInterval(this.timeRef);
this.setState({ captcha: "", time: 60 });
}
}
handleSendCaptcha = () => {
sendMobileCode({ id: this.props.id }).then(({ status, data }) => {
if (status) {
console.log(data);
this.timeRef = setInterval(() => {
const { time } = this.state;
this.setState({ time: time - 1 }, () => {
if (this.state.time === -1) {
clearInterval(this.timeRef);
this.setState({ time: 60 });
}
});
}, 1000);
}
});
};
handleConfirm = () => {
if (!this.state.captcha) {
this.refs.weaError.showError();
// return
}
this.props.onCancel();
this.props.onConfirm();
};
render() {
const { captcha, time } = this.state;
return (
<WeaDialog
initLoadCss {...this.props} style={{ width: 550 }}
className="captchaWrapper" title={getLabel(111, "验证码验证")}
buttons={[
<Button type="primary" onClick={this.handleConfirm}>{getLabel(826, "确定")}</Button>
]}
>
<WeaSearchGroup needTigger={false} title="" showGroup>
<WeaFormItem
label={getLabel(111, "验证码")}
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
>
<WeaError tipPosition="bottom" ref="weaError" error={getLabel(826, "验证码未填写")}>
<div className="captchaInputBox">
<WeaInput value={captcha} onChange={captcha => this.setState({ captcha })}/>
<Button type="primary" onClick={this.handleSendCaptcha} disabled={time !== 60}>
{
time === 60 ? getLabel(111, "发送验证码") : `${time}S`
}
</Button>
</div>
</WeaError>
</WeaFormItem>
</WeaSearchGroup>
</WeaDialog>
);
}
}
export default Index;

View File

@ -0,0 +1,29 @@
.captchaWrapper {
.wea-dialog-body {
padding: 30px 20px;
.wea-form-item-wrapper {
.wea-error {
width: 100%;
.captchaInputBox {
display: flex;
align-items: center;
.wea-input-normal {
flex: 1;
}
button {
padding: 8px 10px;
border-radius: 0;
min-width: 80px;
text-align: center;
height: 30px;
line-height: 15px;
}
}
}
}
}
}

View File

@ -0,0 +1,84 @@
import React, { Component } from "react";
import { WeaLocaleProvider, WeaTools, WeaUpload } from "ecCom";
import { Icon, Modal } from "antd";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
const { viewer } = WeaTools;
class ImageUploadList extends Component {
constructor(props) {
super(props);
this.state = {
imageUrl: ""
};
}
componentDidMount() {
const { wmImg } = this.props;
if (!_.isEmpty(wmImg)) {
this.setState({
imageUrl: wmImg[0].imgSrc
});
}
}
handleChange = (ids, list) => {
this.setState({
imageUrl: list[0].imgSrc
}, () => this.props.onChange([{ imgSrc: this.state.imageUrl }]));
};
handleDelete = () => {
Modal.confirm({
title: getLabel(111, "信息确认"),
content: getLabel(111, "确认要删除吗?"),
onOk: () => {
this.setState({
imageUrl: ""
}, () => this.props.onChange(null));
}
});
};
render() {
const { imageUrl } = this.state;
const uploadProps = {
uploadUrl: "/api/doc/upload/uploadFile",
listType: "img",
limitType: "jpg,jpeg,png,gif",
category: "string",
maxFilesNumber: 1,
onChange: this.handleChange
};
const imgPreviewProps = {
src: imageUrl,
width: 100,
height: 100
};
return (
<div className="uploadWrapper">
{
imageUrl &&
<div className="previewWrapper">
<img data-imgsrc={imgPreviewProps.src} {...imgPreviewProps} onClick={viewer} alt=""/>
<div className="operateWrapper">
<i className="icon-coms-Delete operateIcon" onClick={this.handleDelete}/>
</div>
</div>
}
{
!imageUrl &&
<WeaUpload {...uploadProps}>
<div className="upload-select-picture-card">
<Icon type="plus"/>
<div className="uploadText">{getLabel(111, "上传图片")}</div>
</div>
</WeaUpload>
}
</div>
);
}
}
export default ImageUploadList;

View File

@ -0,0 +1,68 @@
.textSetting {
.uploadWrapper {
display: flex;
align-items: center;
position: relative;
.previewWrapper {
border: 1px solid #d9d9d9 !important;
img {
width: 100%;
height: 100%;
margin-left: 0 !important;
cursor: pointer;
}
.operateWrapper {
display: none;
}
}
.previewWrapper:hover {
.operateWrapper {
display: flex;
position: absolute;
align-items: center;
justify-content: flex-end;
width: 30px;
height: 20px;
background-color: rgba(0, 0, 0, 0.3);
bottom: 4px;
right: 13px;
border-radius: 3px;
padding-right: 4px;
}
}
}
.upload-select-picture-card, .previewWrapper {
border: 1px dashed #d9d9d9;
width: 96px;
height: 96px;
padding: 0;
border-radius: 6px;
background-color: #fbfbfb;
text-align: center;
cursor: pointer;
-webkit-transition: border-color .3s ease;
-o-transition: border-color .3s ease;
transition: border-color .3s ease;
display: flex;
flex-direction: column;
justify-content: center;
margin-right: 8px;
margin-bottom: 8px;
span.rc-upload {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
.upload-select-picture-card:hover {
border-color: #2db7f5;
}
}

View File

@ -35,6 +35,8 @@ import FieldManagement from "./pages/fieldManagement";
import AnalysisOfSalaryStatistics from "./pages/analysisOfSalaryStatistics";
import EmployeeList from "./pages/employeeView";
import ReportView from "./pages/reportView";
import MySalaryView from "./pages/mySalary/mySalaryView";
import WatermarkPreview from "./pages/payroll/watermarkPreview";
import stores from "./stores";
import "./style/index";
@ -53,6 +55,7 @@ const SocialSecurityBenefits = (props) => props.children;
const DataAcquisition = (props) => props.children;
// mySalary 我的薪资福利
// mySalaryView 我的薪资福利-查看工资单
// socialSecurityBenefits 社保福利
// programme 社保福利方案
// archives 社保福利档案
@ -91,6 +94,7 @@ const Routes = (
onEnter={getLocaleLabel}
component={Home}>
<Route key="mySalary" path="mySalary" component={MySalary}/>
<Route key="mySalaryView" path="mySalary/:salaryInfoId" component={MySalaryView}/>
<Route
key="socialSecurityBenefits"
path="socialSecurityBenefits"
@ -135,6 +139,7 @@ const Routes = (
/>
<Route key="compareDetail" path="compareDetail" component={CompareDetail}/>
<Route key="payroll" path="payroll" component={Payroll}/>
<Route key="watermarkPreview" path="payroll/watermark/preview" component={WatermarkPreview}/>
<Route key="payrollGrant" path="payrollGrant" component={PayrollGrant}/>
<Route key="payrollDetail" path="payrollDetail" component={PayrollDetail}/>
<Route

View File

@ -1,7 +1,7 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, DatePicker, Dropdown, Menu, message, Modal, Tag } from "antd";
import { WeaInputSearch, WeaNewScroll, WeaTop, WeaLocaleProvider } from "ecCom";
import { WeaInputSearch, WeaLocaleProvider, WeaNewScroll, WeaTop } from "ecCom";
import { renderNoright } from "../../util";
import CustomTab from "../../components/customTab";
import moment from "moment";
@ -10,9 +10,9 @@ import CustomPaginationTable from "../../components/customPaginationTable";
import ProgressModal from "../../components/progressModal";
import "./index.less";
const { getLabel } = WeaLocaleProvider;
const MonthPicker = DatePicker.MonthPicker;
const getLabel = WeaLocaleProvider.getLabel;
@inject("calculateStore", "taxAgentStore")
@observer
export default class Calculate extends React.Component {
@ -186,16 +186,11 @@ export default class Calculate extends React.Component {
</div>;
};
}
if (item.title == getLabel(30585, "操作") && showOperateBtn) {
if (item.dataIndex === "operate" && showOperateBtn) {
item.width = 150;
item.render = (text, record) => {
const accountBtn = _.filter(
record.operate,
it => it.text == getLabel(538780, "核算") || it.text == getLabel(542637, "重新核算")
);
const notAccountBtn = _.filter(
record.operate,
it => it.text != getLabel(538780, "核算") && it.text != getLabel(542637, "重新核算")
);
const accountBtn = _.take(record.operate, 2);
const notAccountBtn = _.drop(record.operate, 2);
let operateBtn = [];
if (!_.isEmpty(accountBtn)) {
operateBtn.push(
@ -207,13 +202,8 @@ export default class Calculate extends React.Component {
style={{ display: "inline-block", marginRight: 8 }}>
<a
href="javascript:void(0);"
onClick={() => {
if (it.text == getLabel(538780, "核算") || it.text == getLabel(542637, "重新核算")) {
it.text == getLabel(538780, "核算")
? this.handleAccount(record)
: this.handleReaccount(record);
}
}}>
style={it.index !== "4" ? { padding: "0 12px" } : {}}
onClick={() => this.handleOperateClick(it.index, record)}>
{it.text}
</a>
</div>
@ -229,31 +219,14 @@ export default class Calculate extends React.Component {
{notAccountBtn.map(cz =>
<Menu.Item>
<a
onClick={() => {
if (cz.text == getLabel(538780, "核算")) {
this.handleAccount(record);
} else if (cz.text == getLabel(535052, "删除")) {
this.handleDeleteItem(record);
} else if (cz.text == getLabel(251, "归档")) {
this.handleFile(record);
} else if (cz.text == getLabel(542637, "重新核算")) {
this.handleReaccount(record);
} else if (cz.text == getLabel(33564, "查看")) {
this.handleDetail(record);
} else if (cz.text == getLabel(542638, "回算")) {
this.handleBackCalculate(record);
}
}}>
onClick={() => this.handleOperateClick(cz.index, record)}>
{cz.text}
</a>
</Menu.Item>
)}
</Menu>
}>
<i
className="icon-coms-more"
style={{ color: "#4d7ad8", cursor: "pointer" }}
/>
<a href="javascript:void(0);"><i className="icon-coms-more"/></a>
</Dropdown>
);
}
@ -261,7 +234,23 @@ export default class Calculate extends React.Component {
};
}
});
return showOperateBtn ? columns : _.filter(columns, it => it.title != getLabel(30585, "操作"));
return showOperateBtn ? columns : _.filter(columns, it => it.title !== "操作");
};
handleOperateClick = (index, record) => {
if (index === "0") {
this.handleAccount(record);
} else if (index === "1") {
this.handleDeleteItem(record);
} else if (index === "2") {
this.handleFile(record);
} else if (index === "4") {
this.handleReaccount(record);
} else if (index === "3") {
this.handleDetail(record);
} else if (index === "5") {
this.handleBackCalculate(record);
}
};
// 分页
@ -291,56 +280,13 @@ export default class Calculate extends React.Component {
render() {
const { calculateStore, taxAgentStore: { showOperateBtn } } = this.props;
const {
salaryListDataSource,
salaryListColumns,
loading,
hasRight,
form,
condition,
tableStore,
showSearchAd,
getTableDatas,
doSearch,
setShowSearchAd,
salaryListPageInfo
} = calculateStore;
const { salaryListDataSource, loading, hasRight, salaryListPageInfo } = calculateStore;
const { modalParam } = this.state;
if (!hasRight && !loading) {
// 无权限处理
return renderNoright();
}
const rightMenu = [
// 右键菜单
{
key: "BTN_COLUMN",
icon: <i className="icon-coms-Custom"/>,
content: getLabel(32535, "显示列定制"),
onClick: this.showColumn
}
];
const collectParams = {
// 收藏功能配置
favname: getLabel(538011, "薪资核算"),
favouritetype: 1,
objid: 0,
link: "wui/index.html#/ns_demo03/index",
importantlevel: 1
};
const adBtn = [
// 高级搜索内部按钮
<Button type="primary" onClick={doSearch}>
{getLabel(388113, "搜索")}
</Button>,
<Button type="ghost" onClick={() => form.resetForm()}>
{getLabel(2022, "重置")}
</Button>,
<Button type="ghost" onClick={() => setShowSearchAd(false)}>
{getLabel(31129, "取消")}
</Button>
];
const renderRightOperation = () => {
const { startDate, endDate } = this.state;
return (
@ -394,13 +340,10 @@ export default class Calculate extends React.Component {
<div className="mySalaryBenefitsWrapper">
{/* 收藏功能: 配置之后显示 收藏、帮助、显示页面地址 这3个功能 */}
<WeaTop
title={getLabel(538011, "薪资核算")} // 文字
icon={<i className="icon-coms-fa"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
dropMenuDatas={rightMenu} // 下拉菜单(和页面的右键菜单相同)
dropMenuProps={{ collectParams }}>
{/* 收藏功能: 配置之后显示 收藏、帮助、显示页面地址 这3个功能 */}
title={getLabel(538011, "薪资核算")}
icon={<i className="icon-coms-fa"/>}
iconBgcolor="#F14A2D"
showDropIcon={false}>
<CustomTab searchOperationItem={renderRightOperation()}/>
<div className="tableWrapper">
<WeaNewScroll height="100%">

View File

@ -6,9 +6,11 @@ import CustomTab from "../../components/customTab";
import { inject, observer } from "mobx-react";
import CompareDetailImportModal from "./compareDetailImportModal";
import CustomPaginationTable from "../../components/customPaginationTable";
import { salaryacctAcctresultCheckAuth } from "../../apis/calculate";
import Authority from "../mySalary/authority";
const getLabel = WeaLocaleProvider.getLabel;
@inject("calculateStore")
@inject("calculateStore", "taxAgentStore")
@observer
export default class CompareDetail extends React.Component {
constructor(props) {
@ -18,7 +20,8 @@ export default class CompareDetail extends React.Component {
onlyDiffEmployee: true,
onlyDiffSalaryItem: true,
importModalVisible: false,
searchValue: ""
searchValue: "",
calculateAuth: false
};
this.pageInfo = { current: 1, pageSize: 10 };
}
@ -34,8 +37,23 @@ export default class CompareDetail extends React.Component {
current: 1
};
fetchComparisonResultList(params);
this.salaryacctAcctresultCheckAuth({ salaryAcctRecordId: getQueryString("id") })
}
salaryacctAcctresultCheckAuth = (params) => {
const { taxAgentStore: { getPermission } } = this.props;
getPermission().then(({ data }) => {
const { isOpenDevolution } = data;
if (isOpenDevolution) {
salaryacctAcctresultCheckAuth(params).then(({ status, data }) => {
this.setState({ calculateAuth: data && status });
});
} else {
this.setState({ calculateAuth: true });
}
});
};
getColumns = (columns) => {
let newColumns = [...columns];
newColumns.map(item => {
@ -170,7 +188,7 @@ export default class CompareDetail extends React.Component {
comparisonResultColumns
}
} = this.props;
const { importModalVisible, searchValue } = this.state;
const { importModalVisible, searchValue, calculateAuth } = this.state;
const renderRightOperation = () => {
return (
<div style={{ display: "inline-block" }}>
@ -204,60 +222,63 @@ export default class CompareDetail extends React.Component {
);
};
return (
<div className="compareDetail">
<CustomTab
searchOperationItem={
renderRightOperation()
}
leftOperation={
renderLeftOperation()
}
/>
<div className="titleBarWrapper">
<div className="titleBar">
<span className="leftTitle">{getLabel(18125, "公式")}=</span>
<span className="rightTitle">{getLabel(543280, "系统值")}{getLabel(543281, "线下值")}<span style={{ color: "red" }}>{getLabel(543282, "差值")}</span></span>
<Authority ecId={`${this && this.props && this.props.ecId || ""}_Authority@lulowc`}
store={{ loading: false, hasRight: calculateAuth }}>
<div className="compareDetail">
<CustomTab
searchOperationItem={
renderRightOperation()
}
leftOperation={
renderLeftOperation()
}
/>
<div className="titleBarWrapper">
<div className="titleBar">
<span className="leftTitle">{getLabel(18125, "公式")}=</span>
<span className="rightTitle">{getLabel(543280, "系统值")}{getLabel(543281, "线下值")}<span style={{ color: "red" }}>{getLabel(543282, "差值")}</span></span>
</div>
</div>
</div>
<div className="tableWrapper">
<CustomPaginationTable
loading={loading}
dataSource={comparisonResultPageInfo.list ? comparisonResultPageInfo.list : []}
columns={this.getColumns(comparisonResultColumns ? comparisonResultColumns : [])}
scroll={{
x: this.getColumns(comparisonResultColumns ? comparisonResultColumns : []).length * 150,
y: `calc(100vh - 199px)`
}}
total={comparisonResultPageInfo.total}
current={comparisonResultPageInfo.pageNum}
pageSize={this.pageInfo.pageSize}
onPageChange={(value) => {
this.pageInfo.current = value;
this.handleDataPageChange(value);
}}
onShowSizeChange={(current, pageSize) => {
this.pageInfo = { current, pageSize };
this.handleShowSizeChange(this.pageInfo);
}}
/>
</div>
<div className="tableWrapper">
<CustomPaginationTable
loading={loading}
dataSource={comparisonResultPageInfo.list ? comparisonResultPageInfo.list : []}
columns={this.getColumns(comparisonResultColumns ? comparisonResultColumns : [])}
scroll={{
x: this.getColumns(comparisonResultColumns ? comparisonResultColumns : []).length * 150,
y: `calc(100vh - 199px)`
}}
total={comparisonResultPageInfo.total}
current={comparisonResultPageInfo.pageNum}
pageSize={this.pageInfo.pageSize}
onPageChange={(value) => {
this.pageInfo.current = value;
this.handleDataPageChange(value);
}}
onShowSizeChange={(current, pageSize) => {
this.pageInfo = { current, pageSize };
this.handleShowSizeChange(this.pageInfo);
}}
/>
</div>
{
importModalVisible && <CompareDetailImportModal
visiable={importModalVisible}
id={this.id}
onFinish={() => {
this.handleComparisonFinish();
}}
onCancel={() => {
this.setState({
importModalVisible: false
});
}}
/>
}
</div>
{
importModalVisible && <CompareDetailImportModal
visiable={importModalVisible}
id={this.id}
onFinish={() => {
this.handleComparisonFinish();
}}
onCancel={() => {
this.setState({
importModalVisible: false
});
}}
/>
}
</div>
</Authority>
);
}
}

View File

@ -17,8 +17,10 @@ import {
import { convertToUrlString, getQueryString } from "../../util/url";
import AcctResultImportModal from "./acctResult/importModal/acctResultImportModal";
import ProgressModal from "../../components/progressModal";
import { salaryacctAcctresultCheckAuth } from "../../apis/calculate";
import Authority from "../mySalary/authority";
const { ButtonSelect } = WeaDropdown;
const getLabel = WeaLocaleProvider.getLabel;
@inject("calculateStore", "salaryFileStore", "taxAgentStore")
@ -43,23 +45,39 @@ export default class CalculateDetail extends React.Component {
progressVisible: false,
progress: 0,
accountIds: [],
accountExceptInfo: ""
accountExceptInfo: "",
calculateAuth: false
};
this.id = "";
this.timer = null;
}
componentWillMount() {
async componentWillMount() {
let id = getQueryString("id");
this.id = id;
const { calculateStore: { checkTaxAgent }, salaryFileStore } = this.props;
const { commonEnumList } = salaryFileStore;
this.salaryacctAcctresultCheckAuth({ salaryAcctRecordId: id });
checkTaxAgent(this.id);
let modalParam = { ...this.state.modalParam, salaryAcctRecordId: id };
this.setState({ modalParam });
commonEnumList("user", { enumClass: "com.engine.salary.enums.salarysob.SalaryEmployeeStatusEnum" });
}
salaryacctAcctresultCheckAuth = (params) => {
const { taxAgentStore: { getPermission } } = this.props;
getPermission().then(({ data }) => {
const { isOpenDevolution } = data;
if (isOpenDevolution) {
salaryacctAcctresultCheckAuth(params).then(({ status, data }) => {
this.setState({ calculateAuth: data && status });
});
} else {
this.setState({ calculateAuth: true });
}
});
};
Input = (value, key) => {
const { employeeName, workcode } = this.state.searchItemsValue;
return (
@ -273,7 +291,7 @@ export default class CalculateDetail extends React.Component {
};
render() {
const { selectedKey, acctResultImportVisiable, showSearchAd } = this.state;
const { selectedKey, acctResultImportVisiable, showSearchAd, calculateAuth } = this.state;
const { taxAgentStore: { payrollPermission } } = this.props;
const menu = (
<Menu onClick={this.handleMenuClick.bind(this)}>
@ -356,7 +374,7 @@ export default class CalculateDetail extends React.Component {
return (
<Authority ecId={`${this && this.props && this.props.ecId || ""}_Authority@lulowc`}
store={{ loading: false, hasRight: payrollPermission }}>
store={{ loading: false, hasRight: payrollPermission && calculateAuth }}>
<div style={{ overflowY: "hidden", height: "100%" }}>
<WeaTab
datas={topTab}

View File

@ -18,6 +18,7 @@ export default class SalaryDetail extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false,
progressVisible: false,
progress: 0,
columnIndex: "",
@ -179,13 +180,12 @@ export default class SalaryDetail extends React.Component {
}
// 侧边栏保存
handleEditSlideSave() {
handleEditSlideSave = () => {
const { calculateStore } = this.props;
const { saveAcctResult } = calculateStore;
this.setState({
slideVisiable: false
});
this.setState({ loading: true });
saveAcctResult(this.recordId).then(() => {
this.setState({ loading: false });
const childFrameObj = document.getElementById("atdTable");
const salaryAcctRecordId = getQueryString("id");
const payload = {
@ -200,11 +200,11 @@ export default class SalaryDetail extends React.Component {
childFrameObj.contentWindow.postMessage(JSON.stringify(payload), "*");
// acctResultList({ salaryAcctRecordId: this.id });
});
}
};
render() {
const { slideVisiable, columnIndex } = this.state;
const { slideVisiable, columnIndex, loading } = this.state;
const { calculateStore, taxAgentStore: { showOperateBtn } } = this.props;
const { baseSalarySobCycle, columnDescList } = calculateStore;
@ -273,7 +273,8 @@ export default class SalaryDetail extends React.Component {
subtitle={getLabel(543559, "编辑薪资")}
editable={true}
showOperateBtn={showOperateBtn}
onSave={() => this.handleEditSlideSave()}
onSave={this.handleEditSlideSave}
loading={loading}
/>
}
content={<EditSalaryDetail id={this.recordId}/>}

View File

@ -104,8 +104,8 @@ class AttendanceDataViewSlide extends Component {
className="attendanceSlideWrapper"
top={0}
measureT="%"
width={800}
measureX="px"
width={80}
measureX="%"
height={100}
measureY="%"
direction="right"
@ -133,7 +133,7 @@ class AttendanceDataViewSlide extends Component {
dataSource={dataSource}
pagination={pagination}
loading={loading.query}
xWidth={columns.length * 120}
xWidth={columns.length * 180}
/>
</div>
}

View File

@ -2,12 +2,12 @@
.accumulated {
.wea-form-cell-wrapper {
& > div:first-child {
width: 10% !important;
height: 46px !important;
line-height: 46px;
}
& > div:nth-child(2) {
width: 40% !important;
//width: 40% !important;
.wea-form-item-wrapper {
display: flex !important;
@ -20,7 +20,7 @@
}
& > div:last-child {
width: 40% !important;
//width: 40% !important;
}
}
}

View File

@ -19,6 +19,7 @@ class TableRecord extends Component {
loading: {
query: false
},
width: 0,
dataSource: [],
columns: [],
selectedRowKeys: [],
@ -38,13 +39,23 @@ class TableRecord extends Component {
}
componentDidMount() {
this.setState({ width: window.innerWidth });
this.convertData(this.props);
window.addEventListener("resize", this.resizeWidth);
}
componentWillUnmount() {
window.removeEventListener("resize", this.resizeWidth);
}
componentWillReceiveProps(nextProps, nextContext) {
this.convertData(nextProps);
}
resizeWidth = (e) => {
this.setState({ width: e.target.innerWidth });
};
convertData = (props) => {
const { recordPayload } = this.state;
const { record, screenParams } = props;
@ -59,7 +70,7 @@ class TableRecord extends Component {
},
pageInfo: {
current: 1, pageSize: 10, total: 0
},
}
}, () => this.getTableRecordData());
};
@ -117,7 +128,7 @@ class TableRecord extends Component {
render() {
const { className, screenParams, taxAgentOption, record } = this.props;
const { columns, dataSource, loading, selectedRowKeys, pageInfo, recordPayload } = this.state;
const { columns, dataSource, loading, selectedRowKeys, pageInfo, recordPayload, width } = this.state;
const rowSelection = {
selectedRowKeys,
onChange: (selectedRowKeys) => this.setState({ selectedRowKeys })
@ -173,7 +184,7 @@ class TableRecord extends Component {
<div className="tableRecordWrapper">
{
!_.isEmpty(screenParams) &&
<WeaSearchGroup className={className} showGroup needTigger={false} items={items} col={3}/>
<WeaSearchGroup className={className} showGroup needTigger={false} items={items} col={width > 1280 ? 3 : 2}/>
}
<UnifiedTable
rowKey="id"
@ -187,6 +198,7 @@ class TableRecord extends Component {
dataSource={dataSource}
pagination={pagination}
loading={loading.query}
xWidth={columns.length * 180}
/>
</div>
);

View File

@ -402,66 +402,73 @@ export const dataCollectCondition = [
{
items: [
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpChildEducation"],
fieldcol: 14,
label: getLabel(542158, "累计子女教育"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpContinuingEducation"],
fieldcol: 14,
label: getLabel(542159, "累计继续教育"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpHousingLoanInterest"],
fieldcol: 14,
label: getLabel(542160, "累计住房贷款利息"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpHousingRent"],
fieldcol: 14,
label: getLabel(542161, "累计住房租金"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpSupportElderly"],
fieldcol: 14,
label: getLabel(542162, "累计赡养老人"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpIllnessMedical"],
fieldcol: 14,
label: getLabel(542163, "累计大病医疗"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpInfantCare"],
fieldcol: 14,
label: getLabel(537990, "累计婴幼儿照护"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
}
],

View File

@ -45,18 +45,18 @@
}
.linkWapper {
a {
color: #4d7ad8;
margin-right: 8px;
}
//a {
// color: #4d7ad8;
// margin-right: 8px;
//}
i {
cursor: pointer;
}
a:hover {
text-decoration: none;
}
//a:hover {
// text-decoration: none;
//}
}
}

View File

@ -72,156 +72,173 @@ export const dataCollectCondition = [
{
items: [
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpIncome"],
fieldcol: 14,
label: getLabel(542230, "累计收入额"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpSubtraction"],
fieldcol: 14,
label: getLabel(542231, "累计减除费用"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpSocialSecurityTotal"],
fieldcol: 14,
label: getLabel(542232, "累计社保个人合计"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpAccumulationFundTotal"],
fieldcol: 14,
label: getLabel(542233, "累计公积金个人合计"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpChildEducation"],
fieldcol: 14,
label: getLabel(542158, "累计子女教育"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpContinuingEducation"],
fieldcol: 14,
label: getLabel(542159, "累计继续教育"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpHousingLoanInterest"],
fieldcol: 14,
label: getLabel(542160, "累计住房贷款利息"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpHousingRent"],
fieldcol: 14,
label: getLabel(542161, "累计住房租金"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpSupportElderly"],
fieldcol: 14,
label: getLabel(542162, "累计赡养老人"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpIllnessMedical"],
fieldcol: 14,
label: getLabel(542163, "累计大病医疗"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpEnterpriseAndOther"],
fieldcol: 14,
label: getLabel(542234, "累计企业(职业)年金及其他福利"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpOtherDeduction"],
fieldcol: 14,
label: getLabel(543361, "累计其他免税扣除"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpTaxExemptIncome"],
fieldcol: 14,
label: getLabel(542236, "累计免税收入"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpAllowedDonation"],
fieldcol: 14,
label: getLabel(542237, "累计准予扣除的捐赠额"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpTaxSavings"],
fieldcol: 14,
label: getLabel(542238, "累计减免税额"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpAdvanceTax"],
fieldcol: 14,
label: getLabel(542239, "累计已预扣预缴税额"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["addUpInfantCare"],
fieldcol: 14,
label: getLabel(537990, "累计婴幼儿照护"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
}
],

View File

@ -104,19 +104,22 @@ class DataTables extends Component {
} else if (dataIndex === "operate") {
return {
...item,
width: 150,
render: (text, record) => (
<div className="linkWapper">
{
!isSpecial &&
<React.Fragment>
<a href="javaScript:void(0);" onClick={() => onViewDetails(record)}>{getLabel(382624, "查看明细")}</a>
<a href="javaScript:void(0);" style={{ marginRight: 12 }}
onClick={() => onTableOperate({ key: "handleAddData" }, record)}>{getLabel(501169, "编辑")}</a>
<a href="javaScript:void(0);" style={{ marginRight: 12 }}
onClick={() => onViewDetails(record)}>{getLabel(382624, "查看明细")}</a>
{
showOperateBtn &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => onTableOperate(e, record)}>
<Menu.Item key="handleAddData">{getLabel(501169, "编辑")}</Menu.Item>
<Menu.Item key="deleteSelectAddUpDeduction">{getLabel(535052, "删除")}</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>
@ -130,7 +133,7 @@ class DataTables extends Component {
{
showOperateBtn &&
<React.Fragment>
<a href="javaScript:void(0);"
<a href="javaScript:void(0);" style={{ marginRight: 12 }}
onClick={() => onTableOperate({ key: "handleAddData" }, record)}>{getLabel(501169, "编辑")}</a>
<a href="javaScript:void(0);"
onClick={() => onTableOperate({ key: "deleteSelectAddUpDeduction" }, record)}>{getLabel(535052, "删除")}</a>
@ -157,7 +160,7 @@ class DataTables extends Component {
dataSource={dataSource}
pagination={pagination}
loading={loading.query}
xWidth={getColumns.length * 150}
xWidth={getColumns.length * 160}
/>;
}
}

View File

@ -106,8 +106,8 @@ class Layout extends Component {
visible={visible}
top={0}
measureT="%"
width={1000}
measureX="px"
width={80}
measureX="%"
height={100}
measureY="%"
direction="right"

View File

@ -72,48 +72,53 @@ export const dataCollectCondition = [
{
items: [
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["businessHealthyInsurance"],
fieldcol: 14,
label: getLabel(542292, "商业健康保险"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["taxDelayEndowmentInsurance"],
fieldcol: 14,
label: getLabel(542293, "税延养老保险"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["otherDeduction"],
fieldcol: 14,
label: getLabel(25740, "其他"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["deductionAllowedDonation"],
fieldcol: 14,
label: getLabel(542294, "准予扣除的捐赠额"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["privatePension"],
fieldcol: 14,
label: getLabel(542295, "个人养老金"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
}
],

View File

@ -11,18 +11,18 @@
}
.linkWapper {
a {
color: #4d7ad8;
margin-right: 8px;
}
//a {
// color: #4d7ad8;
// margin-right: 8px;
//}
i {
cursor: pointer;
}
a:hover {
text-decoration: none;
}
//a:hover {
// text-decoration: none;
//}
}
}

View File

@ -5,66 +5,73 @@ export const condition = [
{
items: [
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["childrenEducation"],
fieldcol: 14,
label: getLabel(503173, "子女教育"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["continuingEducation"],
fieldcol: 14,
label: getLabel(503174, "继续教育"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["housingLoanInterest"],
fieldcol: 14,
label: getLabel(503175, "住房贷款利息"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["housingRent"],
fieldcol: 14,
label: getLabel(503176, "住房租金"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["supportingElder"],
fieldcol: 14,
label: getLabel(503177, "赡养老人"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["seriousIllnessTreatment"],
fieldcol: 14,
label: getLabel(542550, "大病医疗"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
},
{
conditionType: "INPUT",
conditionType: "INPUTNUMBER",
domkey: ["infantCare"],
fieldcol: 14,
label: getLabel(537983, "婴幼儿照护"),
labelcol: 8,
value: "",
precision: 2,
viewAttr: 2
}
],

View File

@ -1,5 +1,14 @@
import React from "react";
import { WeaDatePicker, WeaDialog, WeaError, WeaFormItem, WeaHelpfulTip, WeaLocaleProvider, WeaSelect } from "ecCom";
import {
WeaDatePicker,
WeaDialog,
WeaError,
WeaFormItem,
WeaHelpfulTip,
WeaLocaleProvider,
WeaSelect,
WeaTextarea
} from "ecCom";
import { Button } from "antd";
import { inject, observer } from "mobx-react";
import "./index.less";
@ -13,6 +22,7 @@ export default class GenerateModal extends React.Component {
this.state = {
date: "",
taxAgentId: "",
description: "",
loading: false
};
}
@ -20,7 +30,7 @@ export default class GenerateModal extends React.Component {
// 生成申报表
handleGenerate = () => {
const { declareStore: { saveDeclare } } = this.props;
const { date, taxAgentId } = this.state;
const { date, taxAgentId, description } = this.state;
if (_.isEmpty(date) && _.isEmpty(taxAgentId)) {
this.refs.weaError.showError();
this.refs.weaError1.showError();
@ -37,7 +47,7 @@ export default class GenerateModal extends React.Component {
return;
}
this.setState({ loading: true });
saveDeclare({ salaryMonthStr: date, taxAgentId }).then(() => {
saveDeclare({ salaryMonthStr: date, taxAgentId, description }).then(() => {
this.setState({ loading: false });
this.props.onGenerate();
}).catch(() => {
@ -117,13 +127,23 @@ export default class GenerateModal extends React.Component {
}}
/>
<WeaHelpfulTip
style={{ position: "absolute", bottom: "8px", right: 0 }}
style={{ position: "absolute", bottom: 8, right: -35 }}
width={200}
title={getLabel(543620, "提示:可选择单个个税扣缴义务人进行申报,若不选择,则批量对管理下的所有个税扣缴义务人进行申报;")}
placement="topLeft"
/>
</WeaError>
</WeaFormItem>
<WeaFormItem
label={getLabel(536726, "备注")}
style={{ marginBottom: 10 }}
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}>
<WeaTextarea
value={this.state.description}
onChange={(description) => this.setState({ description })}
/>
</WeaFormItem>
</div>
</WeaDialog>
);

View File

@ -1,11 +1,12 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, DatePicker } from "antd";
import { Button, DatePicker, message, Modal } from "antd";
import { WeaLocaleProvider, WeaNewScroll, WeaTop } from "ecCom";
import CustomTab from "../../components/customTab";
import CustomTable from "../../components/customTable";
import GenerateModal from "./generateModal";
import { getDeclareList } from "../../apis/declare";
import { getDeclareList, withDrawTaxDeclaration } from "../../apis/declare";
import { sysConfCodeRule } from "../../apis/ruleconfig";
import moment from "moment";
const getLabel = WeaLocaleProvider.getLabel;
@ -16,6 +17,7 @@ export default class Declare extends React.Component {
constructor(props) {
super(props);
this.state = {
showWithDrawBtn: false,
declarationModalVisible: false,
startDate: moment(new Date()).startOf("year").format("YYYY-MM"),
endDate: moment(new Date()).startOf("month").format("YYYY-MM"),
@ -33,6 +35,7 @@ export default class Declare extends React.Component {
componentWillMount() {
const { taxAgentStore: { getTaxAgentSelectListAsAdmin } } = this.props;
this.getDeclareList();
this.sysConfCodeRule();
getTaxAgentSelectListAsAdmin();
}
@ -57,7 +60,21 @@ export default class Declare extends React.Component {
}
}).catch(() => this.setState({ loading: false }));
};
sysConfCodeRule = () => {
sysConfCodeRule({ code: "WITHDRAW_TAX_DECLARATION" }).then(({ status, data }) => {
if (status && data === "1") this.setState({ showWithDrawBtn: data === "1" });
});
};
withDrawTaxDeclaration = (taxDeclarationId) => {
withDrawTaxDeclaration({ taxDeclarationId }).then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(111, "撤回成功"));
this.getDeclareList();
} else {
message.error(errormsg || getLabel(111, "撤回失败"));
}
});
};
// 日期区间改变事件
handleRangePickerChange = (type, value) => {
this.setState({
@ -82,7 +99,7 @@ export default class Declare extends React.Component {
render() {
const { taxAgentStore: { showOperateBtn } } = this.props;
const { loading, columns, dataSource, pageInfo } = this.state;
const { loading, columns, dataSource, pageInfo, showWithDrawBtn } = this.state;
const renderRightOperation = () => {
const { startDate, endDate } = this.state;
return (
@ -136,15 +153,32 @@ export default class Declare extends React.Component {
dataIndex: "operate",
render: (text, record) => {
return (
<a href="javascript:void(0);"
onClick={() => {
window.open(
"/spa/hrmSalary/static/index.html#/main/hrmSalary/generateDeclarationDetail?id=" +
record.id
);
}}>
{getLabel(33564, "查看")}
</a>
<React.Fragment>
<a href="javascript:void(0);"
onClick={() => {
window.open(
"/spa/hrmSalary/static/index.html#/main/hrmSalary/generateDeclarationDetail?id=" +
record.id
);
}}>
{getLabel(33564, "查看")}
</a>
{
showWithDrawBtn &&
<a
href="javascript:void(0);" style={{ marginLeft: 10 }}
onClick={() => {
Modal.confirm({
title: getLabel(111, "信息确认"),
content: getLabel(111, "确认撤回该条数据吗?"),
onOk: () => this.withDrawTaxDeclaration(record.id)
});
}}
>
{getLabel(111, "撤回")}
</a>
}
</React.Fragment>
);
}
}

View File

@ -15,7 +15,7 @@
.wea-select {
.ant-select {
width: 90% !important;
width: 100% !important;
.ant-select-selection {
border-radius: 0 !important;

View File

@ -222,13 +222,13 @@
.mySalaryBenefitsWrapper {
.linkWapper {
a {
color: #4d7ad8;
}
//a {
// color: #4d7ad8;
//}
a:hover {
text-decoration: none;
}
//a:hover {
// text-decoration: none;
//}
}
}

View File

@ -304,7 +304,7 @@ export default class SlideBaseForm extends React.Component {
<WeaCheckbox
value={true}
viewAttr={1}
content="【入职日期≤薪资周期止】且【离职日期≥薪资周期起】"
content="【起薪日期≤薪资周期止】且【最后发薪日期≥薪资周期起】"
/>
</Col>
</Row>

View File

@ -186,9 +186,8 @@ class LedgerBaseSetting extends Component {
type === "CHECKBOX" ?
<React.Fragment>
<WeaCheckbox value={true} viewAttr={1}
content={getLabel(543471, "【入职日期≤薪资周期止】且【离职日期≥薪资周期起】")}/>
<WeaHelpfulTip width={200} title={getLabel(543472, "提示:最后发薪日期为空,默认为无穷大")}
placement="topLeft"/>
content="【起薪日期≤薪资周期止】且【最后发薪日期≥薪资周期起】"/>
<WeaHelpfulTip width={200} title="提示:最后发薪日期为空,默认为无穷大" placement="topLeft"/>
</React.Fragment> :
type === "SELECT" ?
<WeaSelect value={settingBaseInfo[key]}

View File

@ -24,7 +24,7 @@ export default class LedgerSalaryItemPreviewModal extends React.Component {
};
})
};
columns.push(columnItem);
columnItem.children.length > 0 && columns.push(columnItem);
});
return { columns };
};

View File

@ -76,18 +76,22 @@ class LedgerTable extends Component {
/>;
};
} else if (dataIndex === "operate") {
item.width = 120;
item.width = 150;
item.render = (text, record) => {
return <div className="optWrapper">
<a href="javascript:void(0);" className="mr10"
onClick={() => onEditLedger(record)}>{showOperateBtn ? getLabel(501169, "编辑") : getLabel(33564, "查看")}</a>
{
showOperateBtn &&
<a href="javascript:void(0);" className="mr10"
onClick={() => this.handleMenuClick({ key: "copy" }, record)}>{getLabel(77, "复制")}</a>
}
{
showOperateBtn &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => this.handleMenuClick(e, record)}>
<Menu.Item key="copy">{getLabel(77, "复制")}</Menu.Item>
<Menu.Item key="delete">{getLabel(535052, "删除")}</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>

View File

@ -8,7 +8,9 @@ import ComputerTemplate from "../payroll/templatePreview/computerTemplate";
import PhoneTemplate from "../payroll/templatePreview/phoneTemplate";
import "../payroll/templatePreview/index.less";
import * as API from "../../apis/mySalaryBenefits";
import { payrollCheckType } from "../../apis/payroll";
import "./index.less";
import CaptchaModal from "../../components/captchaModal";
const getLabel = WeaLocaleProvider.getLabel;
@inject("mySalaryStore")
@ -18,6 +20,7 @@ export default class MobilePayroll extends React.Component {
super(props);
this.state = {
visible: false,
captchaVisible: false,
authCode: "",
mySalaryBillData: {
employeeInformation: {},
@ -27,28 +30,35 @@ export default class MobilePayroll extends React.Component {
this.id = "";
}
componentWillMount() {
async componentWillMount() {
const type = getQueryString("type");
this.id = getQueryString("id");
const { mySalaryStore: { init } } = this.props;
type !== "phone" && init(false);
const { data, status } = await payrollCheckType();
if (type !== "phone") {
if (status && data === "PWD") {
init(false, () => this.getMySalaryBill(this.id));
} else {
this.setState({ captchaVisible: true });
}
}
type === "phone" && this.initMobile();
this.getMySalaryBill(this.id);
}
initMobile = () => {
const { mySalaryStore: { setInitEmVerify } } = this.props;
if (window.em) {
API.isNeedSecondPwdVerify({ mouldCode: "HRM", itemCode: "SALARY" }).then(({ status, isNeedSecondAuth }) => {
if (status && isNeedSecondAuth) {
this.setState({ visible: true });
} else {
setInitEmVerify();
}
});
} else {
setInitEmVerify();
}
// if (window.em) {
API.isNeedSecondPwdVerify({ mouldCode: "HRM", itemCode: "SALARY" }).then(({ status, isNeedSecondAuth }) => {
if (status && isNeedSecondAuth) {
this.setState({ visible: true });
} else {
this.getMySalaryBill(getQueryString("id"));
setInitEmVerify();
}
});
// } else {
// setInitEmVerify();
// }
};
doSecondAuth = () => {
const { mySalaryStore: { setInitEmVerify } } = this.props;
@ -63,6 +73,7 @@ export default class MobilePayroll extends React.Component {
message.success(checkMsg);
setInitEmVerify();
this.setState({ visible: false });
this.getMySalaryBill(getQueryString("id"));
} else {
message.error(checkMsg);
}
@ -97,7 +108,7 @@ export default class MobilePayroll extends React.Component {
render() {
const { mySalaryStore: { clearLoading } } = this.props;
const { mySalaryBillData, visible } = this.state;
const { mySalaryBillData, visible, captchaVisible } = this.state;
const type = getQueryString("type");
const employeeInformation = mySalaryBillData.employeeInformation ? mySalaryBillData.employeeInformation : {};
const salaryGroups = mySalaryBillData.salaryGroups ? mySalaryBillData.salaryGroups : [];
@ -127,7 +138,6 @@ export default class MobilePayroll extends React.Component {
<div className="contentWrapper">
<PhoneTemplate
isPreview
isMsgPreview
salaryTemplateShowSet={JSON.stringify(mySalaryBillData.salaryTemplate)}
salaryItemSet={!_.isEmpty(salaryGroups) ? JSON.stringify([employeeInformation, ...salaryGroups]) : []}
/>
@ -141,7 +151,6 @@ export default class MobilePayroll extends React.Component {
<div className="contentWrapper">
<ComputerTemplate
isPreview
isMsgPreview
salaryTemplateShowSet={JSON.stringify(mySalaryBillData.salaryTemplate)}
salaryItemSet={!_.isEmpty(salaryGroups) ? JSON.stringify([employeeInformation, ...salaryGroups]) : JSON.stringify([])}
/>
@ -149,6 +158,11 @@ export default class MobilePayroll extends React.Component {
</div>
</Authority>
}
<CaptchaModal
visible={captchaVisible} id={getQueryString("id")}
onCancel={() => this.setState({ captchaVisible: false })}
onConfirm={() => this.props.mySalaryStore.setInitEmVerify()}
/>
</div>
);
}

View File

@ -6,11 +6,10 @@ import { renderNoright } from "../../util"; // 渲染form数据的方法
import CustomTab from "../../components/customTab";
import moment from "moment";
import PayrollModal from "./payrollModal";
import Authority from "./authority";
import CustomPaginationTable from "../../components/customPaginationTable";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
const { getLabel } = WeaLocaleProvider;
const { RangePicker } = DatePicker;
@inject("mySalaryStore")
@ -29,9 +28,9 @@ export default class MySalary extends React.Component {
this.historyPageInfo = { current: 1, pageSize: 10 };
}
componentWillMount() {
const { mySalaryStore: { init } } = this.props;
init();
componentDidMount() {
const { mySalaryStore: { mySalaryBillList } } = this.props;
mySalaryBillList([moment().startOf("year").format("YYYY-MM"), moment().format("YYYY-MM")]);
}
// 查看工资单
@ -62,9 +61,8 @@ export default class MySalary extends React.Component {
dataIndex: "operate",
render: (text, record) => {
return (
<a onClick={() => {
this.handleView(record);
}}>{getLabel(33564, "查看")}</a>
<a target="_blank"
href={`${window.location.origin}/spa/hrmSalary/static/index.html#/main/hrmSalary/mySalary/${record.id}`}>{getLabel(33564, "查看")}</a>
);
}
});
@ -115,7 +113,6 @@ export default class MySalary extends React.Component {
myBillPageInfo
} = mySalaryStore;
const { salaryBillVisible, salaryInfoId, salaryRange } = this.state;
if (!hasRight && !loading) return renderNoright();
const topTab = [
{
@ -142,64 +139,62 @@ export default class MySalary extends React.Component {
};
return (
<div className="mySalaryBenefitsWrapper">
<Authority ecId={`${this && this.props && this.props.ecId || ""}_Authority@lulowc`} store={mySalaryStore}>
<WeaTop
title={getLabel(537998, "我的薪资福利")} // 文字
icon={<i className="icon-coms-fa"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
>
<CustomTab
topTab={topTab}
searchOperationItem={renderSearchOperationItem()}
onChange={(v) => {
this.handleTabChange(v);
this.setState({ selectedKey: v });
}}
/>
<div className="tableWrapper">
<WeaNewScroll height="100%">
{
this.state.selectedKey === "0" &&
<CustomPaginationTable
loading={loading}
columns={this.getColumns()}
dataSource={myBillDataSource ? myBillDataSource : []}
total={myBillPageInfo.total}
current={myBillPageInfo.pageNum}
pageSize={this.pageInfo.pageSize}
onPageChange={(value) => {
this.pageInfo.current = value;
this.handlePageChange();
}}
onShowSizeChange={(current, pageSize) => {
this.pageInfo = { current, pageSize };
this.handlePageChange();
}}
/>
}
{
this.state.selectedKey === "2" &&
<CustomPaginationTable
columns={recordListColumns}
dataSource={recordListDataSource}
total={recordListPageInfo.total}
current={recordListPageInfo.pageNum}
pageSize={this.historyPageInfo.pageSize}
onPageChange={(value) => {
this.historyPageInfo.current = value;
this.handleHistoryPageChange();
}}
onShowSizeChange={(current, pageSize) => {
this.historyPageInfo = { current, pageSize };
this.handleHistoryPageChange();
}}
/>
}
</WeaNewScroll>
</div>
</WeaTop>
</Authority>
<WeaTop
title={getLabel(537998, "我的薪资福利")} // 文字
icon={<i className="icon-coms-fa"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
>
<CustomTab
topTab={topTab}
searchOperationItem={renderSearchOperationItem()}
onChange={(v) => {
this.handleTabChange(v);
this.setState({ selectedKey: v });
}}
/>
<div className="tableWrapper">
<WeaNewScroll height="100%">
{
this.state.selectedKey === "0" &&
<CustomPaginationTable
loading={loading}
columns={this.getColumns()}
dataSource={myBillDataSource ? myBillDataSource : []}
total={myBillPageInfo.total}
current={myBillPageInfo.pageNum}
pageSize={this.pageInfo.pageSize}
onPageChange={(value) => {
this.pageInfo.current = value;
this.handlePageChange();
}}
onShowSizeChange={(current, pageSize) => {
this.pageInfo = { current, pageSize };
this.handlePageChange();
}}
/>
}
{
this.state.selectedKey === "2" &&
<CustomPaginationTable
columns={recordListColumns}
dataSource={recordListDataSource}
total={recordListPageInfo.total}
current={recordListPageInfo.pageNum}
pageSize={this.historyPageInfo.pageSize}
onPageChange={(value) => {
this.historyPageInfo.current = value;
this.handleHistoryPageChange();
}}
onShowSizeChange={(current, pageSize) => {
this.historyPageInfo = { current, pageSize };
this.handleHistoryPageChange();
}}
/>
}
</WeaNewScroll>
</div>
</WeaTop>
{
salaryBillVisible && <PayrollModal
visible={salaryBillVisible}

View File

@ -0,0 +1,73 @@
/*
* Author: 黎永顺
* name: 查看我的薪资-工资单
* Description:
* Date: 2023/6/14
*/
import React, { Component } from "react";
import { inject, observer } from "mobx-react";
import Authority from "./authority";
import ComputerTemplate from "../payroll/templatePreview/computerTemplate";
import { payrollCheckType } from "../../apis/payroll";
import CaptchaModal from "../../components/captchaModal";
import "../payroll/templatePreview/index.less";
@inject("mySalaryStore")
@observer
class MySalaryView extends Component {
constructor(props) {
super(props);
this.state = {
captchaVisible: false,
mySalaryStore: {}
};
}
async componentDidMount() {
const { mySalaryStore: { init, getMySalaryBill }, params: { salaryInfoId } } = this.props;
const { data, status } = await payrollCheckType();
if (status && data === "PWD") {
init(false, () => {
getMySalaryBill(Number(salaryInfoId)).then(data => {
this.setState({ mySalaryStore: data });
});
});
} else {
this.setState({ captchaVisible: true });
}
}
render() {
const { captchaVisible, mySalaryStore } = this.state;
const { params: { salaryInfoId } } = this.props;
if (_.isEmpty(mySalaryStore)) {
return <div></div>;
}
const employeeInformation = !_.isEmpty(mySalaryStore) && mySalaryStore.employeeInformation;
const salaryGroups = !_.isEmpty(mySalaryStore) && mySalaryStore.salaryGroups;
const salaryTemplateShowSet = !_.isEmpty(mySalaryStore) && mySalaryStore.salaryTemplate;
return (
<React.Fragment>
<Authority ecId={`${this && this.props && this.props.ecId || ""}_Authority@lulowc`}
store={this.props.mySalaryStore}>
<div style={{ height: "100%", overflow: "auto" }}>
<div className="templatePreview">
<ComputerTemplate
isPreview isMsgPreview
salaryTemplateShowSet={salaryTemplateShowSet ? JSON.stringify(salaryTemplateShowSet) : []}
salaryItemSet={!_.isEmpty(salaryGroups) ? JSON.stringify([employeeInformation, ...salaryGroups]) : []}
/>
</div>
</div>
</Authority>
<CaptchaModal
visible={captchaVisible} id={salaryInfoId}
onCancel={() => this.setState({ captchaVisible: false })}
onConfirm={() => mySalaryStore.setInitEmVerify()}
/>
</React.Fragment>
);
}
}
export default MySalaryView;

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 { WeaLocaleProvider } from "ecCom";
import moment from "moment";
import CustomPaginationTable from "../../components/customPaginationTable";
@ -93,8 +93,9 @@ export default class SalarySendList extends React.Component {
{
title: getLabel(30585, "操作"),
key: "operate",
width: 150,
render: (text, record) => {
const { sendNum, sendTotal, salaryAcctType, haveBackCalc } = record;
const { sendNum, sendTotal, salaryAcctType, haveBackCalc, canSeeDetail } = record;
//显示发放
const showGrant = haveBackCalc === 1 && salaryAcctType === 0;
return (
@ -102,13 +103,20 @@ export default class SalarySendList extends React.Component {
<a href="javascript:void(0);" onClick={() => this.handleGrant(record)}
style={{ marginRight: 10 }}>{getLabel(542702, "发放")}</a>
{
!showGrant &&
canSeeDetail &&
<a href="javascript:void(0);" onClick={() => this.handleShowDetail(record)}
style={{ marginRight: 10 }}>{getLabel(83110, "查看详情")}</a>
}
{
sendNum !== sendTotal && !showGrant &&
<a href="javascript:void(0);" onClick={() => this.handleUpdateTemplate(record)}>{getLabel(543603, "更新模板")}</a>
<Dropdown
overlay={
<Menu onClick={() => this.handleUpdateTemplate(record)}>
<Menu.Item key="delete">{getLabel(543603, "更新模板")}</Menu.Item>
</Menu>
}>
<i className="icon-coms-more more"/>
</Dropdown>
}
</React.Fragment>
);

View File

@ -0,0 +1,14 @@
import { WeaLocaleProvider } from "ecCom";
const getLabel = WeaLocaleProvider.getLabel;
export const commonVariables = [
{ id: "HRM_Name", name: getLabel(111, "当前操作者姓名")},
{ id: "HRM_Num", name: getLabel(111, "当前操作者编号")},
{ id: "HRM_Mobile", name: getLabel(111, "当前操作者移动电话")},
{ id: "HRM_Email", name: getLabel(111, "当前操作者电子邮件")},
{ id: "HRM_CurrentOperatorId", name: getLabel(111, "当前操作者人员id")},
{ id: "HRM_Department", name: getLabel(111, "当前操作者部门")},
{ id: "HRM_SecondDepartment", name: getLabel(111, "分部")},
{ id: "HRM_CurrentDate", name: getLabel(111, "当前日期")},
{ id: "HRM_CurrentTime", name: getLabel(111, "当前时间")},
];

View File

@ -46,3 +46,124 @@
}
}
}
.waterMarkSetWrapper, .wmContentWrapper {
.rodal {
.rodal-dialog {
& > div:nth-child(2) {
height: calc(100% - 52px) !important;
padding-bottom: 0 !important;
}
}
}
.waterMark-select-header {
padding: 0 5px;
}
.wea-transfer-list-wrapper {
.transfer-tree {
li {
cursor: pointer;
margin: 10px 0;
}
}
}
.wea-slide-modal-content {
padding-bottom: 65px;
}
.wmTitle {
float: left;
margin-left: 16px;
}
.slideBottom {
display: flex;
justify-content: flex-end;
padding: 16px 25px;
border-top: 1px solid #e5e5e5;
position: absolute;
width: 100%;
bottom: 0;
background: #f4f4f4;
button:first-child {
margin-right: 16px;
}
}
.waterMarkWrapper {
padding-top: 16px;
}
.wmContGroup {
.wea-title {
border: 1px solid #e5e5e5;
border-bottom: none;
}
.wea-content {
padding-top: 0;
}
.content-box {
padding: 16px;
.ant-col-18 {
height: 319px;
}
}
.wea-form-cell-wrapper {
border-bottom: none;
}
}
.mt16 {
.wea-form-cell-wrapper {
border: 1px solid #e5e5e5;
}
}
.wea-form-cell-wrapper {
border: 1px solid #e5e5e5;
border-bottom: none;
}
.wea-form-item {
padding: 5px 16px;
border-bottom: 1px solid #e5e5e5;
}
.textSetting {
display: flex;
align-items: center;
margin-top: 7px;
min-width: 200px;
.icon-coms-Flow-setting {
font-size: 16px;
color: #666;
cursor: pointer;
}
img {
margin-left: 5px;
}
}
.previewBtn {
cursor: pointer;
color: #2db7f5;
position: relative;
margin-left: 10px;
}
.txtPrew {
margin-left: 20px !important;
}
}

View File

@ -0,0 +1,201 @@
/*
* Author: 黎永顺
* name: 水印设置-弹框
* Description:
* Date: 2023/6/13
*/
import React, { Component } from "react";
import {
WeaError,
WeaFormItem,
WeaHelpfulTip,
WeaInputNumber,
WeaLocaleProvider,
WeaSearchGroup,
WeaSelect,
WeaSlideModal
} from "ecCom";
import { Button } from "antd";
import ImageUploadList from "../../../components/upload";
import WmContentSetModal from "./wmContentSetModal";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
class WaterMarkSetModal extends Component {
constructor(props) {
super(props);
this.state = {
wmClassify: "text", wmNoTransparent: 0,
wmRotate: 0, wmImg: null, wmcontSet: {
visible: false, textSet: {}
}
};
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.visible !== this.props.visible && nextProps.visible) {
const { watermarkSetting } = nextProps;
const {
wmClassify = "text",
wmNoTransparent = 0,
wmRotate = 0,
wmImg,
wmOriginText,
wmHeight,
wmWidth,
pureWmText,
wmSelectedFieldIds,
wmText
} = watermarkSetting;
if (wmClassify === "text") {
this.setState({
wmClassify, wmNoTransparent, wmRotate,
wmcontSet: {
...this.state.wmcontSet, textSet: wmOriginText ? {
wmOriginText, wmHeight, wmWidth, pureWmText, wmSelectedFieldIds, wmText
} : {}
}
});
} else {
this.setState({
wmClassify, wmNoTransparent, wmRotate, wmImg
});
}
}
}
handleCustomSave = () => {
const { wmClassify, wmImg, wmRotate, wmNoTransparent, wmcontSet } = this.state;
if ((wmClassify === "text" && _.isEmpty(wmcontSet.textSet)) || (wmClassify !== "text" && !wmImg)) {
this.refs.watermarkContError.showError();
return;
}
if (wmClassify === "text") {
this.props.onChange({
wmSetting: {
wmClassify, ...wmcontSet.textSet,
wmNoTransparent, wmRotate
}
});
} else {
this.props.onChange({
wmSetting: {
wmClassify, wmImg,
wmNoTransparent, wmRotate
}
});
}
this.props.onClose();
};
render() {
const { wmClassify, wmNoTransparent, wmRotate, wmImg, wmcontSet } = this.state;
return (
<WeaSlideModal
{...this.props} className="waterMarkSetWrapper"
title={<span className="wmTitle">{getLabel(111, "水印设置")}</span>}
direction="right" top={0} width={800} height={100}
measureT="%" measureX="px" measureY="%"
content={
<React.Fragment>
<WeaSearchGroup showGroup needTigger={false} className="waterMarkWrapper">
<WeaFormItem label={getLabel(111, "水印类型")} labelCol={{ span: 5 }} wrapperCol={{ span: 10 }}>
<div style={{ display: "flex", alignItems: "center" }}>
<WeaSelect
value={wmClassify} detailtype={3}
options={[
{ key: "text", showname: getLabel(111, "文本") },
{ key: "image", showname: getLabel(111, "图片") }
]}
onChange={wmClassify => this.setState({ wmClassify })}
/>
<WeaHelpfulTip title={getLabel(111, "邮件发送不支持图片水印")} placement="topLeft"
style={{ marginLeft: 10 }}/>
</div>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "水印类型")} labelCol={{ span: 5 }} wrapperCol={{ span: 10 }}>
{
wmClassify === "text" ?
<WeaError tipPosition="bottom" ref="watermarkContError" error={getLabel(385869, "此项必填")}>
<div className="textSetting">
<i className="icon-coms-Flow-setting"
onClick={() => this.setState({ wmcontSet: { ...wmcontSet, visible: true } })}/>
{
_.isEmpty(wmcontSet.textSet) ? <img src="/images/BacoError_wev9.png" alt=""/> :
<span className="previewBtn txtPrew"
onClick={() => {
window.open(`${window.location.origin}/spa/hrmSalary/static/index.html#/main/hrmSalary/payroll/watermark/preview`, "_blank");
}}
>
<i className="icon-coms-Selected" style={{
"color": "#093",
"marginRight": "5px"
}}/>
预览
</span>
}
</div>
</WeaError> :
<WeaError tipPosition="bottom" ref="watermarkContError" error={getLabel(385869, "此项必填")}>
<div className="textSetting">
<ImageUploadList onChange={wmImg => this.setState({ wmImg }, () => {
window.localStorage.setItem("wmSetting", JSON.stringify({
wmSetting: {
wmClassify, wmRotate, wmNoTransparent,
...this.state.wmImg
}
}));
})} wmImg={wmImg}/>
{
!wmImg ? <img src="/images/BacoError_wev9.png" alt=""/> :
<span className="previewBtn" onClick={() => {
window.open(`${window.location.origin}/spa/hrmSalary/static/index.html#/main/hrmSalary/payroll/watermark/preview`, "_blank");
}}>预览</span>
}
</div>
</WeaError>
}
</WeaFormItem>
<WeaFormItem label={getLabel(111, "不透明(百分比)")} labelCol={{ span: 5 }} wrapperCol={{ span: 10 }}>
<WeaInputNumber
min={0} max={80} precision={2} value={wmNoTransparent}
onChange={wmNoTransparent => this.setState({ wmNoTransparent })}
/>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "旋转角度(逆时针)")} labelCol={{ span: 5 }} wrapperCol={{ span: 10 }}>
<WeaInputNumber
min={0} max={360} precision={2} value={wmRotate}
onChange={wmRotate => this.setState({ wmRotate })}
/>
</WeaFormItem>
</WeaSearchGroup>
<div className="slideBottom">
<Button type="primary" onClick={this.handleCustomSave}>{getLabel(111, "确定")}</Button>
<Button type="ghost" onClick={this.props.onClose}>{getLabel(111, "取消")}</Button>
</div>
{/* 水印内容设置弹框*/}
<WmContentSetModal {...wmcontSet}
onClose={textSet => this.setState({
wmcontSet: {
...wmcontSet,
visible: false,
textSet
}
}, () => {
window.localStorage.setItem("wmSetting", JSON.stringify({
wmSetting: {
wmClassify, wmRotate, wmNoTransparent,
...this.state.wmcontSet.textSet
}
}));
})}
/>
</React.Fragment>
}
/>
);
}
}
export default WaterMarkSetModal;

View File

@ -0,0 +1,188 @@
/*
* Author: 黎永顺
* name: 水印内容设置
* Description:
* Date: 2023/6/14
*/
import React, { Component } from "react";
import {
WeaFormItem,
WeaHelpfulTip,
WeaInputNumber,
WeaInputSearch,
WeaLocaleProvider,
WeaRichText,
WeaSearchGroup,
WeaSlideModal,
WeaTransfer
} from "ecCom";
import { Button, Col, message, Row } from "antd";
import { commonVariables } from "./config";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
const WeaTransferList = WeaTransfer.list;
class WmContentSetModal extends Component {
constructor(props) {
super(props);
this.state = {
wmWidth: 100,
wmHeight: 100,
wmOriginText: "",
searchV: ""
};
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.visible !== this.props.visible) {
this.setState({
wmWidth: nextProps.textSet.wmWidth || 100,
wmHeight: nextProps.textSet.wmHeight || 100,
wmOriginText: nextProps.textSet.wmOriginText || ""
});
} else {
this.setState({
wmWidth: 100,
wmHeight: 100,
wmOriginText: "",
searchV: ""
});
}
}
handleSaveWMContent = () => {
const html = this.refs.TextContentRichText.getData().replace(/\n/ig, "");
if (!html) {
message.warning(getLabel(111, "请输入水印内容!"));
return;
}
const { wmWidth, wmHeight } = this.state;
this.props.onClose({
wmWidth, wmHeight,
wmSelectedFieldIds: this.getHtmlAttrVal(html),
pureWmText: this.convertToPlain(html),
wmOriginText: html, wmText: this.convertToWMText(html)
});
};
convertToWMText = (html) => {
_.map(commonVariables, item => {
const { id, name } = item;
const reg = eval("/" + name + "/g");
html = html.replace(reg, `$${id}`).replace(/ data-id=\"(.*?)\"/g, "");
});
return html.replace(/ contenteditable="false"/g, "");
};
getHtmlAttrVal = (html) => {
let attrAndValueArr = html.match(/ data-id=\"(.*?)\"/g);
let valueArr = []; // 放所有该属性的值
if (!_.isEmpty(attrAndValueArr)) {
for (let i = 0; i < attrAndValueArr.length; i++) {
valueArr.push(attrAndValueArr[i].replace(/ data-id=/g, "").replace(/\"/g, ""));
}
}
return valueArr;
};
convertToPlain = (html) => {
let tempDivElement = document.createElement("div");
tempDivElement.innerHTML = html;
return tempDivElement.textContent || tempDivElement.innerText || "";
};
renderItem = (item = {}) => {
return <span>{item.name}</span>;
};
selectHeader() {
return (
<div className={"waterMark-select-header"}>
<WeaInputSearch onSearchChange={(v) => {
this.setState({ searchV: v });
}}/>
</div>
);
}
render() {
const { wmWidth, wmHeight, wmOriginText, searchV } = this.state;
const ckConfig = {
toolbar: [
{ name: "paragraph", items: ["JustifyLeft", "JustifyCenter", "JustifyRight"] },
{ name: "styles", items: ["Font", "FontSize"] },
{ name: "colors", items: ["TextColor"] }
],
removePlugins: "resize",
height: 280
};
const tempOptions = _.filter(commonVariables, (item) => {
const { name } = item;
let flag = true;
if (searchV && name) {
flag = name.indexOf(searchV) > -1;
}
return flag;
});
return (
<WeaSlideModal
{...this.props} className="wmContentWrapper" onClose={() => this.props.onClose(this.props.textSet)}
title={<span className="wmTitle">{getLabel(111, "水印内容设置")}</span>}
direction="right" top={0} width={800} height={100}
measureT="%" measureX="px" measureY="%"
content={
<React.Fragment>
<WeaSearchGroup
title={<span><span style={{ marginRight: 10 }}>{getLabel(111, "水印格式设置")}</span><WeaHelpfulTip
title={getLabel(111, "水印最小100px*100px")} placement="topLeft"/></span>}
showGroup needTigger={false} className="waterMarkWrapper wmContGroup">
<WeaFormItem label={getLabel(111, "水印宽度") + "px"} labelCol={{ span: 5 }} wrapperCol={{ span: 10 }}>
<WeaInputNumber
min={100} precision={3} value={wmWidth}
onChange={wmWidth => this.setState({ wmWidth })}
/>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "水印高度") + "px"} labelCol={{ span: 5 }} wrapperCol={{ span: 10 }}>
<WeaInputNumber
min={100} precision={3} value={wmHeight}
onChange={wmHeight => this.setState({ wmHeight })}
/>
</WeaFormItem>
</WeaSearchGroup>
<WeaSearchGroup
title={getLabel(111, "内容")}
showGroup needTigger={false} className="waterMarkWrapper wmContGroup mt16">
<Row className="content-box" gutter={10}>
<Col span={18}>
<WeaRichText ckConfig={ckConfig} value={wmOriginText} ref={"TextContentRichText"}/>
</Col>
<Col span={6}>
<WeaTransferList
header={this.selectHeader()}
data={tempOptions}
renderItem={this.renderItem}
checkedCb={(keys) => {
let result = _.filter(commonVariables, (item) => item.id === keys[0]);
if (result && result.length > 0) {
this.refs.TextContentRichText.insertHTML(`&nbsp;<span contenteditable="false" data-id="${result[0].id}">${result[0].name}</span>&nbsp;`);
}
}}
height={280}
checkedKeys={[]}
/>
</Col>
</Row>
</WeaSearchGroup>
<div className="slideBottom">
<Button type="primary"
onClick={this.handleSaveWMContent}>{getLabel(111, "保存")}</Button>
<Button type="ghost"
onClick={() => this.props.onClose(this.props.textSet)}>{getLabel(111, "取消")}</Button>
</div>
</React.Fragment>
}
/>
);
}
}
export default WmContentSetModal;

View File

@ -3,7 +3,15 @@ import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { Button, DatePicker, message, Modal } from "antd";
import moment from "moment";
import { WeaHelpfulTip, WeaInputSearch, WeaNewScroll, WeaSelect, WeaSlideModal, WeaTop, WeaLocaleProvider } from "ecCom";
import {
WeaHelpfulTip,
WeaInputSearch,
WeaLocaleProvider,
WeaNewScroll,
WeaSelect,
WeaSlideModal,
WeaTop
} from "ecCom";
import { renderLoading } from "../../util";
import CustomTab from "../../components/customTab";
import StepSlide from "../../components/stepSlide";
@ -12,13 +20,15 @@ import ShowSettingForm from "./stepForm/showSettingForm";
import SlideModalTitle from "../../components/slideModalTitle";
import TemplateSettingList from "./templateSettingList";
import TemplateSettingForm from "./stepForm/tmplateSettingForm";
import TemplateBaseSettings from "./templateBaseSettings";
import CopyModal from "./copyModal";
import SalarySendList from "./SalarySendList";
import { getReplenishForm } from "../../apis/payroll";
import "../dataAcquisition/cumDeduct/index.less";
const { MonthPicker } = DatePicker;
const getLabel = WeaLocaleProvider.getLabel;
const { MonthPicker } = DatePicker;
@inject("payrollStore", "taxAgentStore")
@observer
export default class Payroll extends React.Component {
@ -38,7 +48,8 @@ export default class Payroll extends React.Component {
templateCurrentId: "",
copyModalVisible: false,
startDate: moment(new Date()).startOf("year").format("YYYY-MM"),
endDate: moment(new Date()).startOf("month").format("YYYY-MM")
endDate: moment(new Date()).startOf("month").format("YYYY-MM"),
loading: false
};
this.recordId = "";
this.salaryYearMonth = [moment(new Date()).startOf("year").format("YYYY-MM"), moment(new Date()).startOf("month").format("YYYY-MM")];
@ -243,7 +254,15 @@ export default class Payroll extends React.Component {
render() {
const { payrollStore, taxAgentStore: { showOperateBtn } } = this.props;
const { loading, hasRight, templateStore, deletePayroll, templateBaseData } = payrollStore;
const {
loading,
hasRight,
templateTableSelectedRowKeys,
setTemplateTableSelectedRowKeys,
deletePayroll,
templateBaseData,
setTemplateTablePageInfo
} = payrollStore;
const { currentStep, selectedTab, templateSearchValue, templateSelect, startDate, endDate } = this.state;
if (!hasRight && !loading) { // 无权限处理
return renderLoading();
@ -256,6 +275,10 @@ export default class Payroll extends React.Component {
{
title: getLabel(543575, "工资单模板设置"),
viewcondition: "1"
},
{
title: getLabel(111, "工资单模板基础设置"),
viewcondition: "2"
}
];
const renderRightOperation = () => {
@ -302,7 +325,7 @@ export default class Payroll extends React.Component {
style={{ marginLeft: 10 }}
type="ghost"
onClick={() => {
const selectedRowKeys = toJS(templateStore.selectedRowKeys);
const selectedRowKeys = toJS(templateTableSelectedRowKeys);
if (!selectedRowKeys.length) {
message.info(getLabel(543287, "未选中任何数据"));
return;
@ -328,11 +351,18 @@ export default class Payroll extends React.Component {
<WeaInputSearch style={{ marginleft: "10px" }} placeholder={getLabel(543578, "请输入工资单名称")} value={templateSearchValue}
onChange={(value) => {
this.setState({ templateSearchValue: value });
}} onSearch={(value) => {
this.handleTemplateSearch(value);
}}/>
}}
onSearch={(value) => {
this.handleTemplateSearch(value);
}}
/>
</div>
);
} else if (this.state.selectedKey === "2") {
return <Button type="primary"
onClick={() => this.baseSetRef.salaryBillBaseSetSave()}
loading={this.state.loading}
>{getLabel(537558, "保存")}</Button>;
}
};
const steps = [getLabel(82751, "基础设置"), getLabel(543579, "正常核算工资单模板"), getLabel(543580, "补发工资单模版")];
@ -371,7 +401,14 @@ export default class Payroll extends React.Component {
topTab={topTab}
searchOperationItem={renderRightOperation()}
onChange={(v) => {
this.setState({ selectedKey: v, stepSlideVisible: false, editSlideVisible: false });
this.setState({
selectedKey: v,
stepSlideVisible: false,
editSlideVisible: false
}, () => {
setTemplateTablePageInfo({ current: 1 });
setTemplateTableSelectedRowKeys([]);
});
}}
/>
<div className="tableWrapper">
@ -405,6 +442,13 @@ export default class Payroll extends React.Component {
onDelete={(record) => this.handleTemplateListDelete(record)}
/>
}
{
this.state.selectedKey === "2" &&
<TemplateBaseSettings
ref={dom => this.baseSetRef = dom}
onChangeLoading={loading => this.setState({ loading })}
/>
}
</WeaNewScroll>
</div>
</WeaTop>

View File

@ -0,0 +1,22 @@
.waterMarkWrapper {
.wea-form-cell-wrapper {
border: 1px solid #e5e5e5;
border-bottom: none;
}
.wea-form-item {
padding: 5px 16px;
border-bottom: 1px solid #e5e5e5;
.waterMarkTitle {
margin-left: 10px;
cursor: pointer;
color: #2db7f5;
position: absolute;
display: inline-block;
width: 48px;
top: 50%;
margin-top: -10px;
}
}
}

View File

@ -309,7 +309,7 @@ export default class PayrollGrant extends React.Component {
dataIndex: "",
display: true,
render: (text, record) => {
if (record.sendStatus === "1" && !notShowGrantOrWithdraw) {
if (record.sendStatus === "1" && salarySendDetailBaseInfo.canSend) {
return (
<a
href="javascript:void(0);"
@ -317,7 +317,7 @@ export default class PayrollGrant extends React.Component {
{getLabel(32025, "撤回")}
</a>
);
} else if (!notShowGrantOrWithdraw) {
} else if (salarySendDetailBaseInfo.canSend) {
return (
<a
href="javascript:void(0);"
@ -369,7 +369,7 @@ export default class PayrollGrant extends React.Component {
{getLabel(17499, "更多")}
</Dropdown.Button>
];
if (selectedKey === "0" && !notShowGrantOrWithdraw) {
if (selectedKey === "0" && salarySendDetailBaseInfo.canSend) {
btnDom = [
<ButtonSelect
datas={[
@ -383,7 +383,7 @@ export default class PayrollGrant extends React.Component {
/>,
...btnDom
];
} else if (selectedKey === "1" && !notShowGrantOrWithdraw) {
} else if (selectedKey === "1" && salarySendDetailBaseInfo.canSend) {
btnDom = [
<ButtonSelect
datas={[

View File

@ -1,7 +1,8 @@
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 moment from "moment";
import { toJS } from "mobx";
import "./index.less";
@ -35,7 +36,8 @@ 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: ""
}
}, () => {
this.props.onChange && this.props.onChange(this.state.request);
@ -73,7 +75,19 @@ export default class BaseInformForm extends React.Component {
render() {
const { request, options, replenishRuleOptions } = this.state;
const { salarySob, name, description, replenishName, replenishRule, reissueRule, msgStatus, emailStatus } = request;
const {
salarySob,
name,
description,
replenishName,
replenishRule,
reissueRule,
msgStatus,
emailStatus,
autoSendStatus,
autoSendDayOfMonth,
autoSendTimeOfDay
} = request;
return (
<React.Fragment>
@ -164,8 +178,61 @@ export default class BaseInformForm extends React.Component {
<WeaCheckbox value={emailStatus ? "1" : "0"} display="switch"
onChange={value => this.hanldeChange({ emailStatus: value === "1" })}/>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "定时发送")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaCheckbox value={autoSendStatus ? "1" : "0"} display="switch"
onChange={value => this.hanldeChange({ autoSendStatus: value === "1" })}/>
</WeaFormItem>
{
autoSendStatus &&
<WeaFormItem label={getLabel(111, "发送时间")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<SendTimeComp
value={{
autoSendDayOfMonth,
autoSendTimeOfDay
}}
onChange={this.hanldeChange}
/>
</WeaFormItem>
}
</WeaSearchGroup>
</React.Fragment>
);
}
}
const SendTimeComp = (props) => {
const { value, onChange } = props;
const { autoSendDayOfMonth, autoSendTimeOfDay } = value;
const handleChangeSendtime = (key, val) => {
onChange({ autoSendDayOfMonth, autoSendTimeOfDay, [key]: val });
};
return <div className="customTimeCompWrapper">
<div>
<span>{getLabel(111, "每月")}</span>
<WeaSelect
value={!_.isNil(autoSendDayOfMonth) ? autoSendDayOfMonth : "1"}
options={_.map(getDay(), 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 = () => {
let days = [];
let day = getDaysInMonth(moment().year(), moment().month() + 1);
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

@ -0,0 +1,104 @@
/*
* Author: 黎永顺
* name: 工资单模板基础设置
* Description:
* Date: 2023/6/12
*/
import React, { Component } from "react";
import { WeaCheckbox, WeaFormItem, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom";
import { message } from "antd";
import { getSalaryBillBaseSetForm, salaryBillBaseSetSave } from "../../apis/payroll";
import WaterMarkSetModal from "./components/waterMarkSetModal";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
class TemplateBaseSettings extends Component {
constructor(props) {
super(props);
this.state = {
watermarkStatus: "0",
watermark: "DEFAULT",
wmSetting: null,
watermarkSet: {
visible: false, watermarkSetting: null
}
};
}
componentDidMount() {
this.getSalaryBillBaseSetForm();
}
getSalaryBillBaseSetForm = () => {
const { watermarkSet } = this.state;
getSalaryBillBaseSetForm().then(({ status, data }) => {
if (status) {
const { watermarkStatus, watermark = "DEFAULT", watermarkSetting } = data;
this.setState({
watermark, watermarkStatus: watermarkStatus ? "1" : "0",
watermarkSet: {
...watermarkSet,
watermarkSetting
}
}, () => window.localStorage.setItem("wmSetting", JSON.stringify({ wmSetting: watermarkSetting })));
}
});
};
salaryBillBaseSetSave = () => {
const { watermark, watermarkStatus, wmSetting } = this.state;
let payload = { watermarkStatus: watermarkStatus === "1" };
if (watermarkStatus === "1") payload = { ...payload, watermark };
if (!_.isNil(wmSetting)) payload = { ...payload, watermark, ...wmSetting };
this.props.onChangeLoading(true);
salaryBillBaseSetSave(payload).then(({ status, errormsg }) => {
this.props.onChangeLoading(false);
if (status) {
message.success(getLabel(111, "保存成功"));
this.getSalaryBillBaseSetForm();
} else {
message.error(errormsg || getLabel(111, "保存失败"));
}
}).catch(() => this.props.onChangeLoading(false));
};
render() {
const { watermarkStatus, watermark, watermarkSet } = this.state;
return (
<WeaSearchGroup title={getLabel(111, "水印设置")} showGroup needTigger className="waterMarkWrapper">
<WeaFormItem label={getLabel(111, "启用水印")} labelCol={{ span: 2 }} wrapperCol={{ span: 4 }}>
<WeaCheckbox value={watermarkStatus} display="switch"
onChange={watermarkStatus => this.setState({ watermarkStatus, watermark: "DEFAULT" })}/>
</WeaFormItem>
{
watermarkStatus === "1" &&
<WeaFormItem label={getLabel(111, "水印类型")} labelCol={{ span: 2 }} wrapperCol={{ span: 4 }}>
<WeaSelect
value={watermark}
options={[
{ key: "DEFAULT", showname: getLabel(111, "系统默认水印") },
{ key: "CUSTOM", showname: getLabel(111, "自定义水印") }
]}
onChange={watermark => this.setState({ watermark })}
/>
{
watermark === "CUSTOM" &&
<span className="waterMarkTitle" onClick={() => this.setState({
watermarkSet: {
...watermarkSet,
visible: true
}
})}>{getLabel(111, "水印设置")}</span>
}
<WaterMarkSetModal {...watermarkSet}
onClose={() => this.setState({ watermarkSet: { ...watermarkSet, visible: false } })}
onChange={wmSetting => this.setState({ wmSetting })}
/>
</WeaFormItem>
}
</WeaSearchGroup>
);
}
}
export default TemplateBaseSettings;

View File

@ -31,7 +31,7 @@ export default class ComputerTemplate extends React.Component {
}
componentDidMount() {
if(this.props.isMsgPreview && this.props.salaryItemSet){
if (this.props.isMsgPreview && this.props.salaryItemSet) {
this.setState({
salaryItemSet: JSON.parse(this.props.salaryItemSet),
salaryTemplateShowSet: JSON.parse(this.props.salaryTemplateShowSet)
@ -55,7 +55,7 @@ export default class ComputerTemplate extends React.Component {
const rowNum = 3;
const sumRows = len % rowNum;
const sumRowMod = len / rowNum;
const rows = (sumRows == 0 ? sumRowMod : sumRowMod + 1);
const rows = (sumRows == 0 ? sumRowMod : parseInt(sumRowMod.toString()) + 1);
for (let j = 0; j < rows; j++) {
let iLen = (j + 1) * rowNum;
iLen = iLen > len ? len : iLen;
@ -86,7 +86,7 @@ export default class ComputerTemplate extends React.Component {
<div className="sobItemDiv" style={{ margin: "20px 10px" }}>
{
salaryTemplateShowSet.textContentPosition === "1" && salaryTemplateShowSet.textContent
salaryTemplateShowSet.textContentPosition == 1 && salaryTemplateShowSet.textContent
}
</div>
@ -106,7 +106,7 @@ export default class ComputerTemplate extends React.Component {
</div>
<div style={{ margin: "20px 10px" }}>
{
salaryTemplateShowSet.textContentPosition === "2" && salaryTemplateShowSet.textContent
salaryTemplateShowSet.textContentPosition == 2 && salaryTemplateShowSet.textContent
}
</div>
</div>

View File

@ -33,7 +33,8 @@ export default class PhoneTemplate extends React.Component {
}
componentDidMount() {
if (this.props.isMsgPreview && this.props.salaryItemSet && window.em) {
// && window.em
if (this.props.isMsgPreview && this.props.salaryItemSet) {
this.setState({
salaryItemSet: JSON.parse(this.props.salaryItemSet),
salaryTemplateShowSet: JSON.parse(this.props.salaryTemplateShowSet)

View File

@ -1,10 +1,10 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Radio, Spin } from "antd";
import { WeaTableNew } from "comsMobx";
const WeaTable = WeaTableNew.WeaTable;
import { WeaLocaleProvider, WeaTable } from "ecCom";
import { toJS } from "mobx";
import { Dropdown, Menu, Radio, Spin } from "antd";
const getLabel = WeaLocaleProvider.getLabel;
@inject("payrollStore")
@observer
export default class TemplateSettingList extends React.Component {
@ -15,23 +15,23 @@ export default class TemplateSettingList extends React.Component {
}
// 编辑操作按钮
onEdit(record) {
onEdit = (record) => {
this.props.onEdit && this.props.onEdit(record);
}
};
// 复制操作按钮
onCopy(record) {
onCopy = (record) => {
this.props.onCopy && this.props.onCopy(record);
}
};
// 删除操作按钮
onDelete(record) {
onDelete = (record) => {
this.props.onDelete && this.props.onDelete(record);
}
};
// 操作按钮
onOperatesClick = (record, index, operate, flag) => {
switch (operate.index.toString()) {
onOperatesClick = (record, operate) => {
switch (operate) {
case "0": // 编辑
this.onEdit(record);
break;
@ -45,21 +45,22 @@ export default class TemplateSettingList extends React.Component {
};
// 默认使用配置
recordItemChange(record) {
recordItemChange = (record) => {
const { payrollStore } = this.props;
const { changePayrollDefaultUse, getPayrollTemplateList } = payrollStore;
changePayrollDefaultUse(record.id).then(() => {
getPayrollTemplateList();
});
}
};
// 增加编辑功能重写columns绑定事件
getColumns = columns => {
const { showOperateBtn } = this.props;
let newColumns = "";
newColumns = columns.map(column => {
getColumns = () => {
const { showOperateBtn, payrollStore } = this.props;
const { templateTableColumns: columns } = payrollStore;
let newColumns = [];
newColumns = _.filter(toJS(columns), item => item.dataIndex !== "id").map(column => {
let newColumn = column;
newColumn.render = (text, record, index) => {
newColumn.render = (text, record) => {
//前端元素转义
let valueSpan =
record[newColumn.dataIndex + "span"] !== undefined
@ -70,10 +71,8 @@ export default class TemplateSettingList extends React.Component {
return (
<Radio
disabled={!showOperateBtn}
checked={record.useType == "1"}
onChange={value => {
this.recordItemChange(record);
}}
checked={record.useType === "1"}
onChange={() => this.recordItemChange(record)}
/>
);
default:
@ -82,25 +81,79 @@ export default class TemplateSettingList extends React.Component {
};
return newColumn;
});
return newColumns;
return [
...newColumns,
{
dataIndex: "operate",
title: getLabel(30585, "操作"),
width: 150,
render: (_, record) => {
return <React.Fragment>
<a href="javascript:void(0);" style={{ marginRight: 10 }}
onClick={() => this.onOperatesClick(record, "0")}>{getLabel(501169, "编辑")}</a>
<a href="javascript:void(0);" style={{ marginRight: 10 }}
onClick={() => this.onOperatesClick(record, "1")}>{getLabel(77, "复制")}</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>;
}
}
];
};
render() {
const { payrollStore } = this.props;
const { templateStore, loading } = payrollStore;
const {
templateTableDataSource,
loading,
templateTablePageInfo,
setTemplateTablePageInfo,
getPayrollTemplateList,
templateTableSelectedRowKeys,
setTemplateTableSelectedRowKeys
} = payrollStore;
const pagination = {
...templateTablePageInfo,
showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`,
showQuickJumper: true,
showSizeChanger: true,
pageSizeOptions: ["10", "20", "50", "100"],
onShowSizeChange: (current, pageSize) => {
setTemplateTablePageInfo({ ...templateTablePageInfo, current, pageSize }, () => {
getPayrollTemplateList();
});
},
onChange: current => {
setTemplateTablePageInfo({ ...templateTablePageInfo, current }, () => {
getPayrollTemplateList();
});
}
};
const rowSelection = {
selectedRowKeys: toJS(templateTableSelectedRowKeys),
onChange: selectedRowKeys => setTemplateTableSelectedRowKeys(selectedRowKeys)
};
return (
<div>
{loading
? <div style={{ width: "100%", textAlign: "center" }}>
<Spin/>
</div>
: <WeaTable // table内部做了loading加载处理页面就不需要再加了
comsWeaTableStore={templateStore} // table store
hasOrder={true} // 是否启用排序
needScroll={true} // 是否启用table内部列表滚动将自适应到父级高度
getColumns={this.getColumns}
onOperatesClick={this.onOperatesClick.bind(this)}
/>}
{
loading
? <div style={{ width: "100%", textAlign: "center" }}>
<Spin/>
</div>
: <WeaTable
rowKey="id"
rowSelection={rowSelection}
columns={this.getColumns()}
dataSource={toJS(templateTableDataSource)}
pagination={pagination}
/>
}
</div>
);
}

View File

@ -0,0 +1,58 @@
/*
* Author: 黎永顺
* name: 水印预览
* Description:
* Date: 2023/6/15
*/
import React, { Component } from "react";
import { salaryBillBaseSetPreviewWaterMark } from "../../apis/payroll";
import { WeaTools } from "ecCom";
const { watermark } = WeaTools;
class WatermarkPreview extends Component {
componentDidMount() {
const wmSetting = window.localStorage.getItem("wmSetting");
wmSetting && this.salaryBillBaseSetPreviewWaterMark(JSON.parse(wmSetting));
}
salaryBillBaseSetPreviewWaterMark = (payload) => {
salaryBillBaseSetPreviewWaterMark(payload).then(({ status, data }) => {
if (status) {
const { wmSetting: { wmHeight: height, wmWidth: width, wmNoTransparent, wmRotate } } = payload;
watermark({
text: data,
src: "",
width, height,
rotate: `-${wmRotate || 15}`,
alpha: wmNoTransparent / 100 || 0.15,
interval: 2000,
intervalCheck: true,
clickCheck: true
});
}
});
};
render() {
return (
<div style={{ display: "flex", alignItems: "center", flexDirection: "column" }}>
<h1 style={{ textAlign: "center" }}>水印预览效果</h1>
<p
style={{ fontSize: 14 }}>水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果</p>
<p
style={{ fontSize: 14 }}>水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果</p>
<p
style={{ fontSize: 14 }}>水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果</p>
<p
style={{ fontSize: 14 }}>水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果</p>
<p
style={{ fontSize: 14 }}>水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果</p>
<p
style={{ fontSize: 14 }}>水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果</p>
</div>
);
}
}
export default WatermarkPreview;

View File

@ -86,7 +86,8 @@ class Index extends Component {
paysetParams: {
payStartDate: "",
payEndDate: ""
}
},
salaryArchiveDelete: "" //待定薪、停薪员工 是否允许删除薪资档案 0 否, 1
};
}
@ -166,7 +167,7 @@ class Index extends Component {
const { payrollFilesStore: { tableStore }, taxAgentStore: { showOperateBtn } } = this.props;
const columns = _.map(_.filter(toJS(tableStore.columns), (item) => item.display === "true"), (it, idx) => ({
dataIndex: it.dataIndex,
width: (it.dataIndex === "username" || it.dataIndex === "operate") ? 120 : it.dataIndex === "taxAgentName" ? 176 : 150,
width: (it.dataIndex === "username" || it.dataIndex === "operate") ? 150 : it.dataIndex === "taxAgentName" ? 176 : 150,
title: it.title, align: "left",
fixed: (idx === 0 || idx === 1 || idx === 2) ? "left" : it.dataIndex === "operate" ? "right" : "",
ellipsis: true
@ -200,14 +201,16 @@ class Index extends Component {
postMessageToChild = (payload) => {
const childFrameObj = document.getElementById("atdTable");
const { dataSource, columns, showSum, pageInfo, showOperateBtn, selectedKey, selectedRowKeys } = payload;
const { salaryArchiveDelete } = this.state;
childFrameObj && childFrameObj.contentWindow.postMessage(JSON.stringify({
dataSource, columns, showSum, pageInfo, showOperateBtn, selectedKey, selectedRowKeys, i18n
dataSource, columns, showSum, pageInfo, showOperateBtn, selectedKey, selectedRowKeys, salaryArchiveDelete, i18n
}), "*");
};
init = async () => {
const { data: archiveStatusList } = await this.commonEnumList({ enumClass: "com.engine.salary.enums.salaryarchive.ArchiveStatusEnum" });
const { data: userStatusList } = await this.commonEnumList({ enumClass: "com.engine.salary.enums.UserStatusEnum" });
const { data: salaryArchiveDelete } = await this.salaryArchiveDelete();
this.setState({
archiveStatusList: [{
key: "",
@ -222,7 +225,8 @@ class Index extends Component {
}, ..._.map(userStatusList, it => ({
key: String(it.value),
showname: it.defaultLabel
}))]
}))],
salaryArchiveDelete
}, () =>
this.getImportTypes());
};
@ -250,7 +254,7 @@ class Index extends Component {
});
queryList(payload, searchItemsValue, url).then(({ data, status }) => {
this.setState({ loading: { ...loading, query: false } });
if (status) {
if (status && selectedKey === _.lowerCase(data.listType)) {
const { pageInfo: paganition } = data;
const { list: dataSource, total, pageNum: current, pageSize } = paganition;
this.setState({
@ -293,6 +297,9 @@ class Index extends Component {
commonEnumList = (params) => {
return API.commonEnumList(params);
};
salaryArchiveDelete = () => {
return API.salaryArchiveDelete();
};
getImportTypes = () => {
API.getImportTypes().then(({ data, status }) => {
if (status) {
@ -502,7 +509,7 @@ class Index extends Component {
const { payrollFilesStore: { tableStore }, taxAgentStore: { showOperateBtn } } = this.props;
const columns = _.map(_.filter(toJS(tableStore.columns), (item) => item.display === "true"), (it, idx) => ({
dataIndex: it.dataIndex,
width: (it.dataIndex === "username" || it.dataIndex === "operate") ? 120 : it.dataIndex === "taxAgentName" ? 176 : 150,
width: (it.dataIndex === "username" || it.dataIndex === "operate") ? 150 : it.dataIndex === "taxAgentName" ? 176 : 150,
title: it.title, align: "left",
fixed: (idx === 0 || idx === 1 || idx === 2) ? "left" : it.dataIndex === "operate" ? "right" : "",
ellipsis: true
@ -552,6 +559,21 @@ class Index extends Component {
this.deleteSuspendTodo([id]);
} else if (key === "view") {
this.handleEdit(id);
} else if (key === "deleteAchives") {
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: getLabel(388758, "确认要删除吗?"),
onOk: () => {
API.deleteSalaryArchive([id]).then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(30700, "操作成功"));
this.query();
} else {
message.error(errormsg || getLabel(30651, "操作失败"));
}
});
}
});
}
};
// 查看 Slide 头部操作按钮
@ -564,7 +586,7 @@ class Index extends Component {
arrList.push(<Button type="primary" onClick={() => {
const linkUrl = url.indexOf("http") !== -1 ? url : `${window.location.origin}${url}`;
window.open(`${linkUrl}&salaryArchiveId=${id}`);
}}>{getLabel(543310, "发起调薪")}</Button>);
}}>发起调薪</Button>);
}
if (showOperateBtn && selectedKey === "fixed") {
arrList.push(<Button type="primary" onClick={() => {
@ -746,7 +768,7 @@ class Index extends Component {
this.query();
});
}} // 点搜索按钮时的回调this.handleSearch()
searchsBasePlaceHolder={getLabel(26919, "请输入姓名")}
searchsBasePlaceHolder={"请输入姓名"}
onSearchChange={(v) => this.setState({
searchItemsValue: {
...this.state.searchItemsValue,

View File

@ -87,7 +87,7 @@ class ReportContent extends Component {
this.setState({ loading: true });
reportStatisticsReportGetData(payload).then(({ status, data }) => {
this.setState({ loading: false });
if (status) {
if (status && id.toString() === data.reportId.toString()) {
const { countResult, columns, pageInfo: { list } } = data;
this.setState({
countResult,

View File

@ -31,9 +31,9 @@ class Index extends Component {
}
componentDidMount() {
const { taxAgentStore: { getTaxAgentSelectListAsAdmin } } = this.props;
const { taxAgentStore: { fetchTaxAgentOption } } = this.props;
this.reportGetForm();
getTaxAgentSelectListAsAdmin();
fetchTaxAgentOption();
}
reportGetForm = () => {
@ -98,7 +98,7 @@ class Index extends Component {
render() {
const { report, dimensionList, statisticalPayload } = this.state;
const { attendanceStore: { settingForm }, taxAgentStore: { taxAgentAdminOption } } = this.props;
const { attendanceStore: { settingForm }, taxAgentStore: { taxAgentOption } } = this.props;
return (
<WeaTop
title={getLabel(20829, "报表查看")}
@ -135,16 +135,22 @@ class Index extends Component {
<i
className="icon-coms02-currency"
title={getLabel(543389, "统计数据范围及规则设置")}
onClick={() => this.setState({
statisticalPayload: { visible: true, id: report.id, dimension: report.dimensionId }
})}
onClick={() => {
if (this.reportRef.state.loading) {
message.info(getLabel(111, "列表正在加载中,请稍后"));
} else {
this.setState({
statisticalPayload: { visible: true, id: report.id, dimension: report.dimensionId }
});
}
}}
/>
<i className="icon-coms-export" onClick={this.exportData} title={getLabel(17416, "导出")}/>
</div>
{/*统计数据范围及规则设置弹框*/}
<StatisticalMicroSettingsSlide
{...statisticalPayload} form={settingForm}
taxAgentAdminOption={taxAgentAdminOption}
taxAgentAdminOption={taxAgentOption}
onClose={(isRefresh) => this.setState({
statisticalPayload: { visible: false, id: "", dimension: "" }
}, () => isRefresh && this.reportRef.reportStatisticsReportGetData(report.id, report.dimensionId))}

View File

@ -5,109 +5,70 @@
* Date: 2022-09-19 18:15:32
*/
import React, { Component } from "react";
import { WeaFormItem, WeaLocaleProvider, WeaNewScroll, WeaSearchGroup, WeaSelect, WeaTop } from "ecCom";
import { CheckBox } from "../appConfig";
import { Button, message, Modal } from "antd";
import { WeaCheckbox, WeaFormItem, WeaLocaleProvider, WeaNewScroll, WeaSearchGroup, WeaSelect, WeaTop } from "ecCom";
import { message, Modal } from "antd";
import * as API from "../../apis/ruleconfig";
import "./index.less";
import ProgressModal from "../../components/progressModal";
const getLabel = WeaLocaleProvider.getLabel;
const { getLabel } = WeaLocaleProvider;
class Index extends Component {
export default class Index extends Component {
constructor(props) {
super(props);
this.state = {
items: [],
importItems: [],
enctryItems: [],
declareItems: [],
loading: {
order: false,
employee: false,
encry: false,
declare: false
},
matchRuleOptions: [], orderOptions: [], ascOptions: [], employeeOptions: [],
saveParams: {
orderRule: "",
ascOrDesc: "",
rule: "",
enctry: "",
operateTaxDeclaration: ""
operateTaxDeclaration: "",
matchRule: "",
confValue: "0",
withDrawTaxDeclaration: "0"
},
showEncryptOperationButton: "",
progressVisible: false,
progress: 50
};
}
componentDidMount() {
let sysSetting = this.getSysSetting();
async componentDidMount() {
const { saveParams } = this.state;
const [
matchRuleEnum, orderRuleEnum, ascOrDescEnum, matchEmployeeModeEnum,
orderRules, codeRule, appSettings
] = await Promise.all([
this.matchRuleEnum(), this.orderRuleEnum(), this.ascOrDescEnum(), this.matchEmployeeModeEnum(),
this.sysOrderRule(), this.sysConfCodeRule(), this.queryAppsetting()
]);
const matchRuleOptions = _.map(matchRuleEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
const orderOptions = _.map(orderRuleEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
const ascOptions = _.map(ascOrDescEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
const employeeOptions = _.map(matchEmployeeModeEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
const { data: { ascOrDesc, orderRule } } = orderRules;
const { data: rule } = codeRule;
const {
data: {
showEncryptOperationButton,
isOpenEncrypt: enctry,
isOpenTaxDeclaration: operateTaxDeclaration,
salaryAcctEmployeeRule: matchRule,
salaryArchiveDelete: confValue, withDrawTaxDeclaration
}
} = appSettings;
this.setState({
matchRuleOptions, orderOptions, ascOptions, employeeOptions,
showEncryptOperationButton,
saveParams: {
...saveParams,
ascOrDesc, orderRule, rule, enctry, operateTaxDeclaration, matchRule, confValue, withDrawTaxDeclaration
}
});
}
getSysSetting = async () => {
const [orderRuleEnum, ascOrDescEnum, matchEmployeeModeEnum, sysOrderRule, sysConfCodeRule, queryAppsetting] = await Promise.all([this.orderRuleEnum(), this.ascOrDescEnum(), this.matchEmployeeModeEnum(), this.sysOrderRule(), this.sysConfCodeRule(), this.queryAppsetting()]);
if (orderRuleEnum.status && ascOrDescEnum.status && matchEmployeeModeEnum.status) {
const orderOptions = _.map(orderRuleEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
const ascOptions = _.map(ascOrDescEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
const employeeOptions = _.map(matchEmployeeModeEnum.data, it => ({ key: it.value, showname: it.defaultLabel }));
this.setState({
items: [
{
com: Select({
label: getLabel(15512, "排序字段"),
onChange: this.handleChane,
value: sysOrderRule.data.orderRule,
options: orderOptions
})
},
{
com: Select({
label: getLabel(543351, "正序/倒序"),
onChange: this.handleChane,
value: sysOrderRule.data.ascOrDesc,
options: ascOptions
})
}
],
importItems: [
{
com: Select({
label: getLabel(543352, "人员字段"),
onChange: this.handleChane,
value: sysConfCodeRule.data,
options: employeeOptions
})
}
],
enctryItems: queryAppsetting.data.showEncryptOperationButton === "true" ? [
{
com: CheckBox({
label: getLabel(526997, "加密设置"),
value: queryAppsetting.data.isOpenEncrypt,
onChange: (data) => this.handleChane({ type: getLabel(526997, "加密设置"), selected: data })
})
}
] : [],
declareItems: [
{
com: CheckBox({
label: getLabel(543353, "个税申报"),
value: queryAppsetting.data.isOpenTaxDeclaration,
onChange: (data) => this.handleChane({ type: getLabel(543353, "个税申报"), selected: data })
})
}
],
saveParams: {
...this.state.saveParams,
orderRule: sysOrderRule.data.orderRule,
ascOrDesc: sysOrderRule.data.ascOrDesc,
rule: sysConfCodeRule.data,
enctry: queryAppsetting.data.isOpenEncrypt,
operateTaxDeclaration: queryAppsetting.data.isOpenTaxDeclaration
}
});
}
};
sysOrderRule = () => {
return API.sysOrderRule();
};
@ -117,6 +78,12 @@ class Index extends Component {
queryAppsetting = () => {
return API.queryAppsetting();
};
matchRuleEnum = () => {
const payload = {
enumClass: "com.engine.salary.sys.enums.SalaryAcctEmployeeRuleEnum"
};
return API.commonEnumList(payload);
};
orderRuleEnum = () => {
const payload = {
enumClass: "com.engine.salary.sys.enums.OrderRuleEnum"
@ -135,152 +102,195 @@ class Index extends Component {
};
return API.commonEnumList(payload);
};
handleSave = (type) => {
const { saveParams } = this.state;
if (type === "ORDER") {
if (_.isEmpty(saveParams.orderRule) || _.isEmpty(saveParams.ascOrDesc)) {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: getLabel(384146, "必要信息不完整,红色*为必填项!")
});
return;
}
this.setState({ loading: { ...this.state.loading, order: true } });
API.updateOrderRule(_.pick(saveParams, ["orderRule", "ascOrDesc"])).then(({ status, errormsg }) => {
this.setState({ loading: { ...this.state.loading, order: false } });
updateOrderRule = () => {
API.updateOrderRule(_.pick(this.state.saveParams, ["orderRule", "ascOrDesc"]))
.then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功"));
let sysSetting = this.getSysSetting();
message.success(getLabel(22619, "保存成功!"));
} else {
message.error(errormsg || getLabel(22620, "保存失败"));
message.error(errormsg || getLabel(22620, "保存失败!"));
}
});
} else if (type === "EMPLOYEE") {
if (_.isEmpty(saveParams.rule)) {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: getLabel(384146, "必要信息不完整,红色*为必填项!")
});
return;
};
saveMatchEmployeeModeRule = () => {
API.saveMatchEmployeeModeRule(_.pick(this.state.saveParams, ["rule"])).then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功!"));
} else {
message.error(errormsg || getLabel(22620, "保存失败!"));
}
this.setState({ loading: { ...this.state.loading, employee: true } });
API.saveMatchEmployeeModeRule(_.pick(saveParams, ["rule"])).then(({ status, errormsg }) => {
this.setState({ loading: { ...this.state.loading, employee: false } });
});
};
saveSalaryAcctEmployeeRule = () => {
API.saveSalaryAcctEmployeeRule({ rule: this.state.saveParams.matchRule })
.then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功"));
let sysSetting = this.getSysSetting();
message.success(getLabel(22619, "保存成功!"));
} else {
message.error(errormsg || getLabel(22620, "保存失败"));
message.error(errormsg || getLabel(22620, "保存失败!"));
}
});
} else if (type === "ENCRYTION") {
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: getLabel(543354, "开启/关闭加密前请做好数据库备份!!!逆向解密会花费几分钟时间,请耐心等待!!!"),
onOk: () => {
this.setState({ loading: { ...this.state.loading, encry: true } });
API.saveEncryptSetting({ isOpenEncrypt: saveParams.enctry }).then(({ data, status, errormsg }) => {
this.setState({ loading: { ...this.state.loading, encry: false } });
if (status) {
const { isSuccess, progressId, msg } = data;
if (!isSuccess) {
message.error(errormsg || msg || getLabel(22620, "保存失败"));
return;
}
this.setState({
progressVisible: true,
progress: 0
}, () => {
let number = 1;
this.timer && clearInterval(this.timer);
this.timer = setInterval(() => {
API.getEncryptProgress({ progressId }).then(({ status, data, errormsg }) => {
const { progress_statue } = data;
if (progress_statue === "success" && this.timer) {
clearInterval(this.timer);
this.timer = null;
number = 1;
this.setState({
progress: 100
}, () => {
this.setState({
progressVisible: false
});
});
message.success(getLabel(22619, "保存成功"));
} else if (progress_statue === "in_progress" && this.timer) {
if (this.state.progress >= 90) {
this.setState({
progress: this.state.progress + (0.001 * this.state.progress)
});
} else {
this.setState({
progress: 10 * number
}, () => number++);
}
} else if (!status || (progress_statue === "fail" && this.timer)) {
clearInterval(this.timer);
this.timer = null;
number = 1;
this.setState({
progress: 100
}, () => {
this.setState({
progressVisible: false
});
});
message.error(errormsg || getLabel(22620, "保存失败"));
}
};
operateTaxDeclarationFunction = () => {
API.operateTaxDeclarationFunction(_.pick(this.state.saveParams, ["operateTaxDeclaration"]))
.then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功!"));
} else {
message.error(errormsg || getLabel(22620, "保存失败!"));
}
});
};
saveEncryptSetting = () => {
API.saveEncryptSetting({ isOpenEncrypt: this.state.saveParams.enctry })
.then(({ data, status, errormsg }) => {
if (status) {
const { isSuccess, progressId, msg } = data;
if (!isSuccess) {
message.error(errormsg || msg || getLabel(22620, "保存失败!"));
return;
}
this.setState({
progressVisible: true,
progress: 0
}, () => {
let number = 1;
this.timer && clearInterval(this.timer);
this.timer = setInterval(() => {
API.getEncryptProgress({ progressId }).then(({ status, data, errormsg }) => {
const { progress_statue } = data;
if (progress_statue === "success" && this.timer) {
clearInterval(this.timer);
this.timer = null;
number = 1;
this.setState({
progress: 100
}, () => {
this.setState({
progressVisible: false
});
});
}, 1000);
message.success(getLabel(22619, "保存成功!"));
} else if (progress_statue === "in_progress" && this.timer) {
if (this.state.progress >= 90) {
this.setState({
progress: this.state.progress + (0.001 * this.state.progress)
});
} else {
this.setState({
progress: 10 * number
}, () => number++);
}
} else if (!status || (progress_statue === "fail" && this.timer)) {
clearInterval(this.timer);
this.timer = null;
number = 1;
this.setState({
progress: 100
}, () => {
this.setState({
progressVisible: false
});
});
message.error(errormsg || getLabel(22620, "保存失败!"));
}
});
}
}, 1000);
});
},
onCancel: () => {
}
});
} else if (type === "DECLARATION") {
this.setState({ loading: { ...this.state.loading, declare: true } });
API.operateTaxDeclarationFunction(_.pick(saveParams, ["operateTaxDeclaration"])).then(({ status, errormsg }) => {
this.setState({ loading: { ...this.state.loading, declare: false } });
};
saveArchiveDelete = () => {
API.saveArchiveDelete(_.pick(this.state.saveParams, ["confValue"]))
.then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功"));
let sysSetting = this.getSysSetting();
message.success(getLabel(22619, "保存成功!"));
} else {
message.error(errormsg || getLabel(22620, "保存失败"));
message.error(errormsg || getLabel(22620, "保存失败!"));
}
});
};
withDrawTaxDeclaration = () => {
API.saveWithDrawTaxDeclaration({ confValue: _.pick(this.state.saveParams, ["withDrawTaxDeclaration"]).withDrawTaxDeclaration })
.then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功!"));
} else {
message.error(errormsg || getLabel(22620, "保存失败!"));
}
});
}
};
handleChane = (data) => {
const { type, selected } = data;
if (type === getLabel(15512, "排序字段")) {
this.setState({
saveParams: { ...this.state.saveParams, orderRule: selected }
});
} else if (type === getLabel(543351, "正序/倒序")) {
this.setState({
saveParams: { ...this.state.saveParams, ascOrDesc: selected }
});
} else if (type === getLabel(543352, "人员字段")) {
this.setState({
saveParams: { ...this.state.saveParams, rule: selected }
});
} else if (type === getLabel(526997, "加密设置")) {
this.setState({
saveParams: { ...this.state.saveParams, enctry: selected }
});
} else if (type === getLabel(543353, "个税申报")) {
this.setState({
saveParams: { ...this.state.saveParams, operateTaxDeclaration: selected }
});
}
handleChange = (key, val) => {
const { saveParams } = this.state;
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: getLabel(111, "确认要保存吗?"),
onOk: () => {
this.setState({
saveParams: {
...saveParams,
[key]: val
}
}, () => {
switch (key) {
case "orderRule":
case "ascOrDesc":
this.updateOrderRule();
break;
case "rule":
this.saveMatchEmployeeModeRule();
break;
case "matchRule":
this.saveSalaryAcctEmployeeRule();
break;
case "operateTaxDeclaration":
this.operateTaxDeclarationFunction();
break;
case "enctry":
this.saveEncryptSetting();
break;
case "confValue":
this.saveArchiveDelete();
break;
case "withDrawTaxDeclaration":
this.withDrawTaxDeclaration();
break;
default:
break;
}
});
},
onCancel: () => {
this.setState({
saveParams: {
...saveParams,
[key]: saveParams[key]
}
});
}
});
};
render() {
const { items, importItems, enctryItems, declareItems, loading } = this.state;
const {
saveParams,
matchRuleOptions,
orderOptions,
ascOptions,
employeeOptions,
showEncryptOperationButton
} = this.state;
const {
orderRule,
ascOrDesc,
rule,
enctry,
operateTaxDeclaration,
matchRule,
confValue,
withDrawTaxDeclaration
} = saveParams;
return (
<div className="ruleWrapper">
<WeaTop
@ -290,41 +300,57 @@ class Index extends Component {
buttons={[]}
/>
<WeaNewScroll height={`calc(100% - 46px)`}>
<WeaSearchGroup
title={
<div className="titleWrapper">
<span>{getLabel(543356, "排序规则")}</span>
<Button type="primary" onClick={() => this.handleSave("ORDER")}
loading={loading.order}>{getLabel(537558, "保存")}</Button>
</div>
} showGroup center items={items}/>
<WeaSearchGroup
title={
<div className="titleWrapper">
<span>{getLabel(543357, "人员校验规则")}</span>
<Button type="primary" onClick={() => this.handleSave("EMPLOYEE")}
loading={loading.employee}>{getLabel(537558, "保存")}</Button>
</div>
} showGroup center items={importItems}/>
<WeaSearchGroup title={getLabel(543356, "排序规则")} showGroup center>
<WeaFormItem label={getLabel(15512, "排序字段")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaSelect options={orderOptions} value={orderRule}
onChange={val => this.handleChange("orderRule", val)}
/>
</WeaFormItem>
<WeaFormItem label={getLabel(543351, "正序/倒序")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaSelect options={ascOptions} value={ascOrDesc}
onChange={val => this.handleChange("ascOrDesc", val)}
/>
</WeaFormItem>
</WeaSearchGroup>
<WeaSearchGroup title={getLabel(543357, "人员校验规则")} showGroup center>
<WeaFormItem label={getLabel(543352, "人员字段")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaSelect options={employeeOptions} value={rule}
onChange={val => this.handleChange("rule", val)}
/>
</WeaFormItem>
</WeaSearchGroup>
{
!_.isEmpty(enctryItems) &&
<WeaSearchGroup
title={
<div className="titleWrapper">
<span>{getLabel(543358, "加密规则")}</span>
<Button type="primary" onClick={() => this.handleSave("ENCRYTION")}
loading={loading.encry}>{getLabel(537558, "保存")}</Button>
</div>
} showGroup center items={enctryItems}/>
showEncryptOperationButton === "true" &&
<WeaSearchGroup title={getLabel(543358, "加密规则")} showGroup center>
<WeaFormItem label={getLabel(526997, "加密设置")} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }}>
<WeaCheckbox display="switch" value={enctry}
onChange={val => this.handleChange("enctry", val)}/>
</WeaFormItem>
</WeaSearchGroup>
}
<WeaSearchGroup
title={
<div className="titleWrapper">
<span>{getLabel(543359, "报税规则")}</span>
<Button type="primary" onClick={() => this.handleSave("DECLARATION")}
loading={loading.declare}>{getLabel(537558, "保存")}</Button>
</div>
} showGroup center items={declareItems}/>
<WeaSearchGroup title={getLabel(543359, "报税规则")} showGroup center>
<WeaFormItem label={getLabel(543353, "个税申报")} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }}>
<WeaCheckbox display="switch" value={operateTaxDeclaration}
onChange={val => this.handleChange("operateTaxDeclaration", val)}/>
</WeaFormItem>
<WeaFormItem label={getLabel(111, "允许个税申报撤回")} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }}>
<WeaCheckbox display="switch" value={withDrawTaxDeclaration}
onChange={val => this.handleChange("withDrawTaxDeclaration", val)}/>
</WeaFormItem>
</WeaSearchGroup>
<WeaSearchGroup title={getLabel(111, "档案删除规则")} showGroup center>
<WeaFormItem label={getLabel(111, "允许删除档案")} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }}>
<WeaCheckbox display="switch" value={confValue}
onChange={val => this.handleChange("confValue", val)}/>
</WeaFormItem>
</WeaSearchGroup>
<WeaSearchGroup title={getLabel(111, "薪资核算人员匹配规则")} showGroup center>
<WeaFormItem label={getLabel(111, "匹配规则")} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaSelect options={matchRuleOptions} value={matchRule}
onChange={val => this.handleChange("matchRule", val)}
/>
</WeaFormItem>
</WeaSearchGroup>
{
this.state.progressVisible &&
<ProgressModal
@ -342,8 +368,6 @@ class Index extends Component {
}
}
export default Index;
export const Select = payload => {
const {
label,
@ -357,7 +381,7 @@ export const Select = payload => {
} = payload;
return (
<WeaFormItem label={label} labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}>
<WeaSelect options={multiple ? options : [{ key: "", showname: "" }, ...options]} viewAttr={viewAttr}
<WeaSelect options={multiple ? options : [...options]} viewAttr={viewAttr}
detailtype={detailtype}
value={value}
multiple={multiple}

View File

@ -11,7 +11,7 @@ import CustomSalaryItemSlide from "./customSalaryItemSlide";
import CustomPaginationTable from "../../components/customPaginationTable";
import "../socialSecurityBenefits/programme/index.less";
const getLabel = WeaLocaleProvider.getLabel;
const { getLabel } = WeaLocaleProvider;
@inject("salaryItemStore", "taxAgentStore", "salaryFileStore")
@observer
export default class SalaryItem extends React.Component {
@ -113,9 +113,9 @@ export default class SalaryItem extends React.Component {
this.onEditItem(record, false);
}}>{text}</a>;
case "useInEmployeeSalary":
return <Switch checked={text == 1} disabled/>;
return <Switch checked={text === 1} disabled/>;
case "useDefault":
return <Switch checked={text == 1} disabled/>;
return <Switch checked={text === 1} disabled/>;
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
}
@ -125,37 +125,22 @@ export default class SalaryItem extends React.Component {
columns.push({
key: "operate",
title: getLabel(30585, "操作"),
width: 120,
render: (text, record) => {
return (
<a onClick={() => {
this.onEditItem(record, true);
}}>{(showSalaryItemBtn || showOperateBtn) ? getLabel(501169, "编辑") : getLabel(33564, "查看")}</a>
<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>
}
</React.Fragment>
);
}
});
columns.push({
title: "",
key: "moreOperate",
dataIndex: "moreOperate",
render: (text, record) => {
if (record.canDelete && (showSalaryItemBtn || showOperateBtn)) {
return (
<Dropdown overlay={<Menu>
<Menu.Item>
<a href="javascript: void(0);" onClick={() => {
this.handleDeleteItem(record);
}}>{getLabel(535052, "删除")}</a>
</Menu.Item>
</Menu>}>
<a href="javascript:void(0)" style={{ textDecoration: "none" }}><i className="icon-coms-more"
style={{ fontSize: 18 }}></i></a>
</Dropdown>
);
} else {
return "";
}
}
});
return [
// {
// title: "序号",

View File

@ -34,7 +34,15 @@ export default class SystemSalaryItemModal extends React.Component {
if (status) {
const { columns, list: dataSource, pageNum: current, pageSize, total } = data;
this.setState({
columns, dataSource,
columns: _.map(columns, item => {
return {
...item,
render: (text) => {
return <span className="ellipsis" title={text}>{text}</span>;
}
};
}),
dataSource,
pageInfo: { ...pageInfo, current, pageSize, total }
});
}

View File

@ -14,6 +14,7 @@ import * as API from "../../../apis/welfareArchive";
import ImportModal from "../../../components/importModal";
import TipLabel from "../../../components/TipLabel";
import UnifiedTable from "../../../components/UnifiedTable";
import { salaryArchiveDelete } from "../../../apis/payrollFiles";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
@ -50,7 +51,8 @@ export default class Archives extends React.Component {
current: 1,
pageSize: 10,
total: 0
}
},
salaryArchiveDelete: "" //待定薪、停薪员工 是否允许删除薪资档案 0 否, 1
};
this.record = {};
}
@ -58,6 +60,7 @@ export default class Archives extends React.Component {
componentDidMount() {
const { archivesStore: { doInit } } = this.props;
doInit();
this.salaryArchiveDelete();
this.queryList({ runStatuses: ["1"] });
}
@ -93,6 +96,15 @@ export default class Archives extends React.Component {
}
});
};
salaryArchiveDelete = () => {
salaryArchiveDelete().then(({ status, data }) => {
if (status) {
this.setState({
salaryArchiveDelete: data
});
}
});
};
handleEdit = (record) => {
this.record = record;
@ -104,7 +116,7 @@ export default class Archives extends React.Component {
};
getColumns = () => {
const { columns, pageInfo, selectedKey } = this.state;
const { columns, salaryArchiveDelete, selectedKey } = this.state;
const { taxAgentStore: { showOperateBtn } } = this.props;
let tmpV = _.map(columns.filter(item => item.display === "TRUE"), item => {
return {
@ -119,31 +131,68 @@ export default class Archives extends React.Component {
return tmpV.length > 0 ? [
...tmpV, {
title: getLabel(30585, "操作"),
width: 150,
dataIndex: "operate",
render: (text, record) => {
return (
<div className="optWrapper">
<a href="javascript:void(0);" className="mr10"
onClick={() => this.handleEdit(record)}>{(showOperateBtn && selectedKey !== "stop") ? getLabel(501169, "编辑") : getLabel(33564, "查看")}</a>
{
showOperateBtn && selectedKey === "pending" &&
<a href="javascript:void(0);" className="mr10"
onClick={() => this.stayAddToPay([record.baseInfo])}>增员</a>
}
{
showOperateBtn && selectedKey === "suspend" &&
<a href="javascript:void(0);" className="mr10"
onClick={() => this.stayDelToStop([record.baseInfo])}>减员</a>
}
{
showOperateBtn && selectedKey === "stop" && salaryArchiveDelete === "1" &&
<a href="javascript:void(0);" className="mr10"
onClick={() => this.deleteSocialArchive([record.baseInfo])}>删除档案</a>
}
{
showOperateBtn && selectedKey === "stop" && salaryArchiveDelete !== "1" &&
<a href="javascript:void(0);"
onClick={() => this.cancelStopPayment([record.baseInfo])}>取消停缴</a>
}
{
showOperateBtn && selectedKey === "pending" &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={({ key }) => {
if (key === "addMember") {
this.stayAddToPay([record.baseInfo]);
} else {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: `${getLabel(543179, "确定要删除该条待办人员吗")}`,
onOk: () => this.deleteTodoList({ runStatus: "4", ids: [record.baseInfo] })
});
}
}}>
<Menu.Item key="addMember">{getLabel(543180, "增员")}</Menu.Item>
<Menu.Item key="stopSalary">{getLabel(543181, "删除待办")}</Menu.Item>
</Menu>} title="">
content={
salaryArchiveDelete === "1" ?
<Menu onClick={({ key }) => {
if (key === "deleteAchives") {
this.deleteSocialArchive([record.baseInfo]);
} else {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: `${getLabel(543179, "确定要删除该条待办人员吗")}`,
onOk: () => this.deleteTodoList({ runStatus: "4", ids: [record.baseInfo] })
});
}
}}>
<Menu.Item key="deleteAchives">{getLabel(111, "删除档案")}</Menu.Item>
<Menu.Item key="stopSalary">{getLabel(543181, "删除待办")}</Menu.Item>
</Menu> :
<Menu onClick={({ key }) => {
if (key === "deleteAchives") {
this.deleteSocialArchive([record.baseInfo]);
} else {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: `${getLabel(543179, "确定要删除该条待办人员吗")}`,
onOk: () => this.deleteTodoList({ runStatus: "4", ids: [record.baseInfo] })
});
}
}}>
<Menu.Item key="stopSalary">{getLabel(543181, "删除待办")}</Menu.Item>
</Menu>
} title="">
<i className="icon-coms-more"/>
</Popover>
}
@ -159,18 +208,15 @@ export default class Archives extends React.Component {
content: `${getLabel(543179, "确定要删除该条待办人员吗")}`,
onOk: () => this.cancelStayDel({ runStatus: "3", ids: [record.baseInfo] })
});
} else {
this.stayDelToStop([record.baseInfo]);
}
}}>
<Menu.Item key="stayDelToStop">{getLabel(543182, "减员")}</Menu.Item>
<Menu.Item key="stopSalary">{getLabel(543181, "删除待办")}</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>
</Popover>
}
{
showOperateBtn && selectedKey === "stop" &&
showOperateBtn && selectedKey === "stop" && salaryArchiveDelete === "1" &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
@ -428,7 +474,23 @@ export default class Archives extends React.Component {
}
});
};
//删除社保档案
deleteSocialArchive = (params) => {
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: getLabel(388758, "确认要删除吗?"),
onOk: () => {
API.deleteArchive(params).then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(30700, "操作成功"));
this.query();
} else {
message.error(errormsg || getLabel(30651, "操作失败"));
}
});
}
});
};
//取消停缴
cancelStopPayment = (payload) => {
API.cancelStopPayment(payload).then(({ status, errormsg }) => {

View File

@ -3,8 +3,7 @@ import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { Button, Dropdown, Menu, message, Modal } from "antd";
import { WeaLocaleProvider, WeaNewScroll, WeaSelect, WeaSlideModal, WeaTop } from "ecCom";
import { WeaTableNew } from "comsMobx";
import { renderNoright } from "../../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import { renderNoright } from "../../../util";
import CustomTab from "../../../components/customTab";
import SlideModalTitle from "../../../components/slideModalTitle";
import TipLabel from "../../../components/TipLabel";
@ -14,12 +13,11 @@ import { paymentScopeEnum, welfareTypeEnum } from "./enum";
import CustomPaginationTable from "../../../components/customPaginationTable";
import TwoColContent from "../../../components/twoColContent";
import CopySchemaModal from "./copySchemaModal";
import "./index.less";
import CustomBenefitsTable from "./customBenefitsTable";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
const WeaMobxTable = WeaTableNew.WeaTable;
const { getLabel } = WeaLocaleProvider;
@inject("programmeStore", "taxAgentStore", "salaryFileStore")
@observer
export default class Programme extends React.Component {
@ -58,25 +56,17 @@ export default class Programme extends React.Component {
newColumns = newColumns.map(column => {
let newColumn = column;
newColumn.render = (text, record, index) => {
newColumn.render = (text, record) => {
//前端元素转义
let valueSpan =
record[newColumn.dataIndex + "span"] !== undefined
? record[newColumn.dataIndex + "span"]
: record[newColumn.dataIndex];
if (newColumn.dataIndex == "id") {
newColumn.display = false;
}
if (newColumn.dataIndex === "id") newColumn.display = false;
switch (newColumn.dataIndex) {
case "operate":
return (
<a
href="javascript: void(0);"
onClick={() => {
this.onEdit(record);
}}>
{getLabel(93, "编辑")}
</a>
<a href="javascript: void(0);" onClick={() => this.onEdit(record)}>{getLabel(93, "编辑")}</a>
);
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
@ -88,59 +78,38 @@ export default class Programme extends React.Component {
newColumns.push({
title: getLabel(30585, "操作"),
dataIndex: "operate",
width: 120,
render: (text, record) => {
return (
<a
href="javascript:void(0);"
onClick={() => {
this.onEdit(record);
}}>
{showOperateBtn ? getLabel(93, "编辑") : getLabel(33564, "查看")}
</a>
);
}
});
showOperateBtn && newColumns.push({
key: "moreOperate",
dataIndex: "moreOperate",
render: (text, record) => {
return (
<Dropdown
overlay={
<Menu>
<Menu.Item>
<a
onClick={() => {
this.onCopy(record);
}}>
{getLabel(77, "复制")}
</a>
</Menu.Item>
{/*暂时隐藏*/}
<Menu.Item>
<a
onClick={() => {
this.onDelete(record);
}}>
{getLabel(91, "删除")}
</a>
</Menu.Item>
</Menu>
}>
<a href="javascript:void(0)" style={{ textDecoration: "none" }}>
<i
className="icon-coms-more"
style={{ fontSize: 18 }}>
</i>
</a>
</Dropdown>
<React.Fragment>
<a href="javascript:void(0);" onClick={() => this.onEdit(record)}
style={{ marginRight: 10 }}>{showOperateBtn ? getLabel(93, "编辑") : getLabel(33564, "查看")}</a>
{
showOperateBtn &&
<a href="javascript:void(0)" onClick={() => this.onCopy(record)}
style={{ marginRight: 10 }}>{getLabel(77, "复制")}</a>
}
{
showOperateBtn &&
<Dropdown
overlay={
<Menu>
<Menu.Item>
<a href="javascript:void(0)" onClick={() => this.onDelete(record)}>{getLabel(535052, "删除")}</a>
</Menu.Item>
</Menu>
}>
<a href="javascript:void(0)"><i className="icon-coms-more"/></a>
</Dropdown>
}
</React.Fragment>
);
}
});
return newColumns;
};
onEdit(record) {
onEdit = (record) => {
let id = record.id;
const { programmeStore } = this.props;
const { getForm, selectedKey } = programmeStore;
@ -150,15 +119,15 @@ export default class Programme extends React.Component {
}).then(() => {
this.setState({ slideVisiable: true, customEdit: true, currentOperate: "update" });
});
}
};
onCopy(record) {
onCopy = (record) => {
this.setState({
copyId: record.id,
copyModalValue: record.schemeName,
copyModalVisible: true
});
}
};
onDelete = (record) => {
const { programmeStore: { deleteScheme, deleteLoading, selectedKey } } = this.props;
@ -384,7 +353,7 @@ export default class Programme extends React.Component {
style={{ width: "150px" }}
onChange={v => {
setCustomSelectkey(v);
this.customBenefitsTableRef.getCustomCategoryList({ curren: 1, welfareTypeEnum: v });
this.customBenefitsTableRef.getCustomCategoryList({ current: 1, welfareTypeEnum: v });
}}
/>}
</div>
@ -410,13 +379,6 @@ export default class Programme extends React.Component {
welfareTypeEnum={customSelectkey}
onCustomEdit={this.onCustomEdit}
/>
// <WeaMobxTable // table内部做了loading加载处理页面就不需要再加了
// comsWeaTableStore={tableStore} // table store
// hasOrder={true} // 是否启用排序
// needScroll={true} // 是否启用table内部列表滚动将自适应到父级高度
// getColumns={this.getCustomColumns}
// onOperatesClick={this.onCustomOperatesClick.bind(this)}
// />
}
rightContent={renderCustomRightContent()}
/>

View File

@ -12,8 +12,8 @@ import { getCalculateProgress } from "../../../apis/calculate";
import "./index.less";
import UnifiedTable from "../../../components/UnifiedTable";
const { getLabel } = WeaLocaleProvider;
const MonthPicker = DatePicker.MonthPicker;
const getLabel = WeaLocaleProvider.getLabel;
@inject("standingBookStore", "taxAgentStore")
@observer
@ -140,28 +140,54 @@ export default class StandingBook extends React.Component {
{
title: getLabel(30585, "操作"),
dataIndex: "operate",
width: 150,
key: "operate",
render: (text, r) => {
const { billStatus, billMonth, creator } = r;
return (
<React.Fragment>
{billStatus === getLabel(17999, "未归档") && (
{billStatus === "0" && (
<a
href="javascript:void(0);"
className="linkTo"
style={{ padding: "0 12px" }}
onClick={() => this.handleGoDetail(billMonth, "", r.paymentOrganizationId, creator)}>
{getLabel(538780, "核算")}
</a>
)}
{billStatus === getLabel(18800, "已归档") && (
{billStatus === "0" && (
<a
href="javascript:void(0);"
style={{ padding: "0 12px" }}
onClick={() => this.handleOperate({
key: "archive",
billMonth,
paymentOrganizationId: r.paymentOrganizationId,
creator
})}>
归档
</a>
)}
{billStatus === "1" && (
<a
href="javascript:void(0);"
style={{ padding: "0 12px" }}
onClick={() => this.handleOperate({
key: "view",
billMonth,
paymentOrganizationId: r.paymentOrganizationId,
creator
})}>
查看
</a>
)}
{billStatus === "1" && (
<a
href="javascript:void(0);"
className="linkTo"
onClick={() => this.socialSecurityBenefitsRecalculate({ id: r.id })}>
{getLabel(542637, "重新核算")}
</a>
)}
{billStatus === getLabel(17999, "未归档") && (
{billStatus === "0" && (
<Dropdown
overlay={
<Menu
@ -173,31 +199,10 @@ export default class StandingBook extends React.Component {
creator
})
}>
<Menu.Item key="archive">{getLabel(251, "归档")}</Menu.Item>
{/* <Menu.Item key="detail">异常详情</Menu.Item> */}
<Menu.Item key="delete">{getLabel(535052, "删除")}</Menu.Item>
{/* <Menu.Item key="operate">操作日志</Menu.Item> */}
</Menu>
}>
<i className="icon-coms-more more"/>
</Dropdown>
)}
{billStatus === getLabel(18800, "已归档") && (
<Dropdown
overlay={
<Menu
onClick={({ key }) =>
this.handleOperate({
key,
billMonth,
paymentOrganizationId: r.paymentOrganizationId,
creator
})
}>
<Menu.Item key="view">{getLabel(33564, "查看")}</Menu.Item>
</Menu>
}>
<i className="icon-coms-more more"/>
<i className="icon-coms-more" style={{ marginLeft: 10 }}/>
</Dropdown>
)}
</React.Fragment>
@ -442,7 +447,6 @@ export default class StandingBook extends React.Component {
</Button>
];
const pagination = {
...this.pageInfo,
total: total,
showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`,
@ -492,14 +496,24 @@ export default class StandingBook extends React.Component {
<UnifiedTable
loading={loading}
columns={_.filter(columns, (it) => it.dataIndex !== "id").map(item => {
if (item.dataIndex !== "operate") {
if (item.dataIndex !== "operate" && item.dataIndex !== "billStatus") {
return {
...item,
width:150,
render: (text) => {
return <span className="ellipsis" title={text}>{text}</span>;
}
};
}
if (item.dataIndex === "billStatus") {
return {
...item,
render: (_, record) => {
return <span
className="ellipsis">{record.billStatus === "1" ? getLabel(18800, "已归档") : getLabel(17999, "未归档")}</span>;
}
};
}
return { ...item };
})}
dataSource={list}

View File

@ -57,7 +57,7 @@ export const editConditions = [
conditionType: "INPUTNUMBER",
domkey: ["sortedIndex"],
fieldcol: 14,
label: "序",
label: "显示顺序",
labelcol: 6,
value: "",
viewAttr: 2,
@ -95,7 +95,7 @@ export const decentralizationConditions = [
conditionType: "INPUTNUMBER",
domkey: ["sortedIndex"],
fieldcol: 14,
label: "序",
label: "显示顺序",
labelcol: 6,
value: "",
viewAttr: 2,

View File

@ -1,8 +1,8 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, Col, Dropdown, Menu, message, Modal, Row, Switch } from "antd";
import { WeaFormItem, WeaInputSearch, WeaLocaleProvider, WeaSearchGroup, WeaTable, WeaTop } from "ecCom";
import { renderNoright } from "../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import { Button, Col, message, Modal, Row, Switch } from "antd";
import { WeaFormItem, WeaInputSearch, WeaSearchGroup, WeaTable, WeaTop, WeaLocaleProvider } from "ecCom";
import { renderNoright } from "../../util";
import EditModal from "./editModal";
import TipLabel from "../../components/TipLabel";
import { decentralizationConditions, editConditions } from "./editConditions";
@ -200,7 +200,7 @@ export default class TaxAgent extends React.Component {
}
});
if (status) {
message.success(getLabel(528075, "新增成功"));
message.success("新增成功");
this.setState({
editModalProps: {
...editModalProps,
@ -358,22 +358,11 @@ export default class TaxAgent extends React.Component {
onClick={() => this.showEditModal(record.id)}>
{getLabel(501169, "编辑")}
</a>
<Dropdown
overlay={
<Menu>
<Menu.Item key="0">
<a
href="javaScript:void(0);"
onClick={() => this.deleteTaxAgent(record.id)}>
{getLabel(535052, "删除")}
</a>
</Menu.Item>
</Menu>
}>
<a className="ant-dropdown-link" href="javaScript:void(0);">
<i className="icon-coms-more"/>
</a>
</Dropdown>
<a
href="javaScript:void(0);"
onClick={() => this.deleteTaxAgent(record.id)}>
{getLabel(535052, "删除")}
</a>
</div>
}
],

View File

@ -39,12 +39,13 @@
.operationWapper,
.employeeRangeWapper {
a {
color: #4d7ad8;
//color: #4d7ad8;
margin-right: 10px;
}
a:hover {
text-decoration: none;
}
//a:hover {
// text-decoration: none;
//}
a.ant-dropdown-link {
margin-left: 18px;

View File

@ -1,11 +1,12 @@
import { action, observable } from "mobx";
import { message } from "antd";
import { WeaForm, WeaLogView, WeaTableNew } from "comsMobx";
import { WeaLocaleProvider } from "ecCom";
import { WeaLocaleProvider, WeaTools } from "ecCom";
import moment from "moment";
import * as API from "../apis/mySalaryBenefits";
const { watermark } = WeaTools;
const { LogStore } = WeaLogView;
const getLabel = WeaLocaleProvider.getLabel;
const { TableStore } = WeaTableNew;
@ -48,29 +49,30 @@ export class MySalaryStore {
@action setMySalaryBill = (mySalaryBill) => {
this.mySalaryBill = mySalaryBill;
};
@action init = async (isRoot = true) => {
@action init = async (isRoot = true, callback) => {
this.clear();
//1.check is need second verify
if (window.doCheckSecondaryVerify4ec) {
window.doCheckSecondaryVerify4ec({ mouldCode: "HRM", itemCode: "SALARY" }, (data) => this.getData({
...data,
isRoot
isRoot, callback
}));
} else {
//4.loaddata
this.getData({ status: "1", token: "", isRoot });
this.getData({ status: "1", token: "", isRoot, callback });
}
};
@action
getData = async (params = {}) => {
if (_.isEmpty(params)) return;
const { status, isRoot, token } = params;
const { status, isRoot, token, callback } = params;
if (status == "1") {
// Object.assign(this._reqParams, { token });
// this.getFormData({ viewAttr: 1 });
this.hasRight = true;
isRoot && this.mySalaryBillList([moment().startOf("year").format("YYYY-MM"), moment().format("YYYY-MM")]);
callback && callback();
} else {
this.hasRight = false;
}
@ -167,6 +169,46 @@ export class MySalaryStore {
if (res.status) {
this.mySalaryBill = res.data;
resolve(res.data);
const { salaryTemplate } = res.data;
const { salaryWatermark } = salaryTemplate;
if (watermark && salaryWatermark) {
const { wmSetting, watermarkStatus } = JSON.parse(salaryWatermark);
if (!watermarkStatus) return;
const {
wmText,
wmHeight: height,
wmWidth: width,
wmNoTransparent,
wmRotate,
wmImg,
wmClassify
} = wmSetting;
if (wmClassify === "text") {
watermark({
text: wmText,
width,
height,
src: "",
rotate: `-${wmRotate || 15}`,
alpha: wmNoTransparent / 100 || 0.15,
interval: 2000,
intervalCheck: true,
clickCheck: true
});
} else {
watermark({
text: "",
width,
height,
src: wmImg[0].imgSrc,
rotate: `-${wmRotate || 15}`,
alpha: wmNoTransparent / 100 || 0.15,
interval: 2000,
intervalCheck: true,
clickCheck: true
});
}
}
} else {
message.error(res.errormsg || "获取失败");
reject("获取失败");

View File

@ -55,6 +55,14 @@ export class payrollStore {
@observable canWidthdrawColumns = []; // 可以撤回的列表列名
@observable canWithdrawPageInfo = {}; // 可以撤回列表分页对象
// **** 工资单模板 ****
@observable templateTableColumns = []; // 工资单模板columns
@observable templateTableDataSource = []; // 工资单模板dataSource
@observable templateTablePageInfo = {
current: 1, pageSize: 10, total: 0
}; // 工资单模板pageInfo
@observable templateTableSelectedRowKeys = []; // 工资单模板复选框
@action
setReplenishSalaryTemplateSalaryItemSet = replenishSalaryTemplateSalaryItemSet =>
(this.replenishSalaryTemplateSalaryItemSet = replenishSalaryTemplateSalaryItemSet);
@ -80,6 +88,14 @@ export class payrollStore {
@action
setSalaryItemSet = salaryItemSet => (this.salaryItemSet = salaryItemSet);
@action("工资单模板分页信息修改")
setTemplateTablePageInfo = (pageInfo, callback) => {
this.templateTablePageInfo = { ...this.templateTablePageInfo, ...pageInfo };
callback && callback();
};
@action("工资单模板复选框选择")
setTemplateTableSelectedRowKeys = (selectedRowKeys) => this.templateTableSelectedRowKeys = selectedRowKeys;
// 初始化操作
@action
doInit = () => {
@ -136,9 +152,15 @@ export class payrollStore {
@action
getPayrollTemplateList = (params = {}) => {
this.loading = true;
API.getPayrollTemplateList(params).then(res => {
API.getPayrollTemplateList({ ...this.templateTablePageInfo, ...params }).then(res => {
if (res.status) {
this.templateStore.getDatas(res.data.datas);
this.templateTableColumns = res.data.columns;
this.templateTableDataSource = res.data.list;
this.setTemplateTablePageInfo({
current: res.data.pageNum,
pageSize: res.data.pageSize,
total: res.data.total
});
} else {
message.error(res.errormsg || "获取失败");
}
@ -149,9 +171,7 @@ export class payrollStore {
// 工资单模板-获取工资单模板基础设置表单
@action
getPayrollBaseForm = (id = "") => {
let params = {
id
};
let params = { id };
return new Promise((resolve, reject) => {
API.getPayrollBaseForm(params).then(res => {
if (res.status) {
@ -354,6 +374,7 @@ export class payrollStore {
API.deletePayroll(ids).then(res => {
if (res.status) {
message.success("删除成功");
this.setTemplateTableSelectedRowKeys([]);
this.getPayrollTemplateList();
} else {
message.error(res.errormsg || "删除失败");
@ -525,7 +546,7 @@ export class payrollStore {
reject();
}
}).catch(() => {
this.btnLoading = false
this.btnLoading = false;
// WeaLoadingGlobal.end();
// WeaLoadingGlobal.destroy();
});
@ -553,7 +574,7 @@ export class payrollStore {
reject();
}
}).catch(() => {
this.btnLoading = false
this.btnLoading = false;
WeaLoadingGlobal.end();
WeaLoadingGlobal.destroy();
});

View File

@ -147,7 +147,8 @@ export class TaxAgentStore {
this.setSalaryItemBtn((isOpenDevolution && (isChief || isAdminEnable)));
//薪酬统计报表权限
this.setStatisticsReportBtn(!isOpenDevolution ? true : !!(isAdminEnable || isChief));
this.setPayrollPermission(isAdminEnable && isOpenDevolution);
//薪资核算详情页面查看权限
this.setPayrollPermission(isAdminEnable && isOpenDevolution || !isOpenDevolution);
resolve({ status, data });
} else {
reject();