Merge branch 'master' into hotfix/2.8.3.2307.02

This commit is contained in:
黎永顺 2023-07-14 15:32:06 +08:00
commit 98a4de233b
31 changed files with 895 additions and 421 deletions

View File

@ -31,6 +31,15 @@ export const mySalaryBill = params => {
export const isNeedSecondPwdVerify = params => {
return WeaTools.callApi("/api/encrypt/secondauthsetting/isNeedSecondAuth", "POST", params);
};
export const getSecondAuthForm = params => {
return WeaTools.callApi("/api/encrypt/secondauthsetting/getSecondAuthForm", "POST", params);
};
export const doSecondAuth = params => {
return WeaTools.callApi("/api/encrypt/secondauthsetting/doSecondAuth", "POST", params);
};
export const checkPassword = params => {
return WeaTools.callApi("/api/hrm/secondarypwd/checkPassword", "POST", params);
};
export const saveSecondaryPwd = params => {
return WeaTools.callApi("/api/hrm/secondarypwd/saveSecondaryPwd", "POST", 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

@ -43,6 +43,14 @@ export const getEncryptProgress = params => {
export const 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);

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

@ -1,8 +1,8 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, DatePicker, Dropdown, Menu, message, Modal, Tag } from "antd";
import { WeaInputSearch, WeaNewScroll, WeaTop } from "ecCom";
import { renderNoright } from "../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import { WeaInputSearch, WeaLocaleProvider, WeaNewScroll, WeaTop } from "ecCom";
import { renderNoright } from "../../util";
import CustomTab from "../../components/customTab";
import moment from "moment";
import BaseFormModal from "./baseFormModal";
@ -10,6 +10,7 @@ import CustomPaginationTable from "../../components/customPaginationTable";
import ProgressModal from "../../components/progressModal";
import "./index.less";
const { getLabel } = WeaLocaleProvider;
const MonthPicker = DatePicker.MonthPicker;
@inject("calculateStore", "taxAgentStore")
@ -185,16 +186,11 @@ export default class Calculate extends React.Component {
</div>;
};
}
if (item.title == "操作" && showOperateBtn) {
if (item.dataIndex === "operate" && showOperateBtn) {
item.width = 150;
item.render = (text, record) => {
const accountBtn = _.filter(
record.operate,
it => it.text == "核算" || it.text == "重新核算"
);
const notAccountBtn = _.filter(
record.operate,
it => it.text != "核算" && it.text != "重新核算"
);
const accountBtn = _.take(record.operate, 2);
const notAccountBtn = _.drop(record.operate, 2);
let operateBtn = [];
if (!_.isEmpty(accountBtn)) {
operateBtn.push(
@ -206,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 == "核算" || it.text == "重新核算") {
it.text == "核算"
? this.handleAccount(record)
: this.handleReaccount(record);
}
}}>
style={(idx === 1 && it.text.length === 2) ? { padding: "0 12px" } : {}}
onClick={() => this.handleOperateClick(it.index, record)}>
{it.text}
</a>
</div>
@ -228,31 +219,14 @@ export default class Calculate extends React.Component {
{notAccountBtn.map(cz =>
<Menu.Item>
<a
onClick={() => {
if (cz.text == "核算") {
this.handleAccount(record);
} else if (cz.text == "删除") {
this.handleDeleteItem(record);
} else if (cz.text == "归档") {
this.handleFile(record);
} else if (cz.text == "重新核算") {
this.handleReaccount(record);
} else if (cz.text == "查看") {
this.handleDetail(record);
} else if (cz.text == "回算") {
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>
);
}
@ -260,7 +234,23 @@ export default class Calculate extends React.Component {
};
}
});
return showOperateBtn ? columns : _.filter(columns, it => it.title != "操作");
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);
}
};
// 分页
@ -290,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: "显示列定制",
onClick: this.showColumn
}
];
const collectParams = {
// 收藏功能配置
favname: "薪资核算",
favouritetype: 1,
objid: 0,
link: "wui/index.html#/ns_demo03/index",
importantlevel: 1
};
const adBtn = [
// 高级搜索内部按钮
<Button type="primary" onClick={doSearch}>
搜索
</Button>,
<Button type="ghost" onClick={() => form.resetForm()}>
重置
</Button>,
<Button type="ghost" onClick={() => setShowSearchAd(false)}>
取消
</Button>
];
const renderRightOperation = () => {
const { startDate, endDate } = this.state;
return (
@ -393,13 +340,10 @@ export default class Calculate extends React.Component {
<div className="mySalaryBenefitsWrapper">
{/* 收藏功能: 配置之后显示 收藏、帮助、显示页面地址 这3个功能 */}
<WeaTop
title="薪资核算" // 文字
icon={<i className="icon-coms-fa"/>} // 左侧图标
iconBgcolor="#F14A2D" // 左侧图标背景色
showDropIcon={false} // 是否显示下拉按钮
dropMenuDatas={rightMenu} // 下拉菜单(和页面的右键菜单相同)
dropMenuProps={{ collectParams }}>
{/* 收藏功能: 配置之后显示 收藏、帮助、显示页面地址 这3个功能 */}
title="薪资核算"
icon={<i className="icon-coms-fa"/>}
iconBgcolor="#F14A2D"
showDropIcon={false}>
<CustomTab searchOperationItem={renderRightOperation()}/>
<div className="tableWrapper">
<WeaNewScroll height="100%">

View File

@ -4,6 +4,12 @@
}
.formItem {
display: flex;
.ant-col-8 {
line-height: 30px;
}
.wea-select, .ant-select {
width: 100%;
}

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

@ -101,19 +101,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)}>查看明细</a>
<a href="javaScript:void(0);" style={{ marginRight: 12 }}
onClick={() => onTableOperate({ key: "handleAddData" }, record)}>编辑</a>
<a href="javaScript:void(0);" style={{ marginRight: 12 }}
onClick={() => onViewDetails(record)}>查看明细</a>
{
showOperateBtn &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => onTableOperate(e, record)}>
<Menu.Item key="handleAddData">编辑</Menu.Item>
<Menu.Item key="deleteSelectAddUpDeduction">删除</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>
@ -127,7 +130,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)}>编辑</a>
<a href="javaScript:void(0);"
onClick={() => onTableOperate({ key: "deleteSelectAddUpDeduction" }, record)}>删除</a>

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

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

View File

@ -38,10 +38,10 @@ class LedgerTable extends Component {
}
componentWillReceiveProps(nextProps, nextContext) {
if (nextProps.doSearch !== this.props.doSearch) this.getLedgerList({current: 1});
if (nextProps.doSearch !== this.props.doSearch) this.getLedgerList({ current: 1 });
}
getLedgerList = (extra={}) => {
getLedgerList = (extra = {}) => {
const { name } = this.props;
const { pageInfo } = this.state;
const payload = { name, ...pageInfo, ...extra };
@ -74,17 +74,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 ? "编辑" : "查看"}</a>
<a href="javascript:void(0);" className="mr10"
onClick={() => onEditLedger(record)}>{showOperateBtn ? "编辑" : "查看"}</a>
{
showOperateBtn &&
<a href="javascript:void(0);" className="mr10"
onClick={() => this.handleMenuClick({ key: "copy" }, record)}>复制</a>
}
{
showOperateBtn &&
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => this.handleMenuClick(e, record)}>
<Menu.Item key="copy">复制</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>

View File

@ -1,7 +1,7 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { getQueryString } from "../../util/url";
import { WeaDialog, WeaError, WeaInput } from "ecCom";
import { WeaDialog, WeaError, WeaInput, WeaLocaleProvider } from "ecCom";
import { Button, message } from "antd";
import Authority from "../mySalary/authority";
import ComputerTemplate from "../payroll/templatePreview/computerTemplate";
@ -9,8 +9,11 @@ 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";
import PassSetDialog from "./passSetDialog";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
@inject("mySalaryStore")
@observer
@ -18,9 +21,11 @@ export default class MobilePayroll extends React.Component {
constructor(props) {
super(props);
this.state = {
pwdSetVisible: false,
visible: false,
captchaVisible: false,
authCode: "",
notSetting: false,
mySalaryBillData: {
employeeInformation: {},
salaryTemplate: []
@ -49,7 +54,11 @@ export default class MobilePayroll extends React.Component {
// if (window.em) {
API.isNeedSecondPwdVerify({ mouldCode: "HRM", itemCode: "SALARY" }).then(({ status, isNeedSecondAuth }) => {
if (status && isNeedSecondAuth) {
this.setState({ visible: true });
this.setState({ visible: true }, () => {
API.getSecondAuthForm({ mouldCode: "HRM", itemCode: "SALARY" }).then(({ status, notSetting }) => {
this.setState({ notSetting });
});
});
} else {
this.getMySalaryBill(getQueryString("id"));
setInitEmVerify();
@ -106,8 +115,8 @@ export default class MobilePayroll extends React.Component {
};
render() {
const { mySalaryStore: { clearLoading } } = this.props;
const { mySalaryBillData, visible, captchaVisible } = this.state;
const { mySalaryStore: { clearLoading, pwdForm } } = this.props;
const { mySalaryBillData, visible, captchaVisible, notSetting, pwdSetVisible } = this.state;
const type = getQueryString("type");
const employeeInformation = mySalaryBillData.employeeInformation ? mySalaryBillData.employeeInformation : {};
const salaryGroups = mySalaryBillData.salaryGroups ? mySalaryBillData.salaryGroups : [];
@ -126,9 +135,17 @@ export default class MobilePayroll extends React.Component {
]}
>
<WeaError tipPosition="bottom" ref="weaError" error="此项必填">
<WeaInput value={this.state.authCode} onChange={authCode => this.setState({ authCode })}/>
<WeaInput value={this.state.authCode} viewAttr={3} onChange={authCode => this.setState({ authCode })}/>
</WeaError>
{
notSetting &&
<div style={{ clear: "both", paddingTop: 10 }} >
{getLabel("514970", "您还未设置二次验证密码,点击")}
<a href="javascript:void(0);" onClick={() => this.setState({ pwdSetVisible: true })}>{getLabel("30747", "设置")}</a>
</div>
}
</WeaDialog>
<PassSetDialog form={pwdForm} visible={pwdSetVisible} onCancel={() => this.setState({ pwdSetVisible: false })}/>
{
type === "phone" ?
<Authority ecId={`${this && this.props && this.props.ecId || ""}_Authority@lulowc`}

View File

@ -15,3 +15,27 @@
}
}
}
.pwdSetWrapper {
.ant-modal-content {
width: 80vw !important;
.wea-dialog-body, .wea-new-scroll {
height: 195px !important;
.wea-search-group .wea-form-cell {
padding: 0 !important;
}
}
}
.validatecodeWrapper {
display: flex;
align-items: center;
.wea-input-normal {
width: 50% !important;
margin-right: 20px;
}
}
}

View File

@ -0,0 +1,141 @@
/*
* Author: 黎永顺
* name: 二次验证密码设置
* Description:
* Date: 2023/7/7
*/
import React, { Component } from "react";
import { WeaDialog, WeaFormItem, WeaLocaleProvider, WeaSearchGroup } from "ecCom";
import { WeaSwitch } from "comsMobx";
import { condition, loginCondition } from "./pwdCondtion";
import { Button, message } from "antd";
import { RSAEcrypt } from "../../util/RSAUtil";
import { checkPassword, saveSecondaryPwd } from "../../apis/mySalaryBenefits";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
class PassSetDialog extends Component {
constructor(props) {
super(props);
this.state = {
src: (window.ecologyContentPath || "") + "/weaver/weaver.file.MakeValidateCode?notneedvalidate=1&isView=1&validatetype=0&validatenum=4",
num: 0,
isPassLoginPassword: false
};
}
componentDidMount() {
this.props.form.initFormFields(loginCondition);
this.props.form.initFormFields(condition);
}
getSearchs = (form, condition) => {
const { isFormInit } = form, formParams = form.getFormParams();
let group = [];
isFormInit && condition && condition.map(c => {
let items = [];
c.items.map(fields => {
items.push({
com: (
<WeaFormItem
label={`${fields.label}`} labelCol={{ span: `${fields.labelcol}` }}
wrapperCol={{ span: `${fields.fieldcol}` }} error={form.getError(fields)}
tipPosition="bottom"
>
{
fields.domkey[0] === "validatecode" ?
<div className="validatecodeWrapper">
<WeaSwitch fieldConfig={fields} form={form} formParams={formParams}/>
<img
style={{ height: 30, cursor: "pointer" }}
src={this.state.src}
onClick={() => {
this.setState({ num: this.state.num + 1 }, () => {
this.setState({ src: `${window.ecologyContentPath || ""}/weaver/weaver.file.MakeValidateCode?notneedvalidate=1&isView=1&validatetype=0&validatenum=4&seriesnum_=${this.state.num}` });
});
}}
alt=""
/>
</div>
: <WeaSwitch fieldConfig={fields} form={form} formParams={formParams}/>
}
</WeaFormItem>),
colSpan: 1
});
});
group.push(
<WeaSearchGroup
col={1} needTigger={false} title={c.title}
showGroup={c.defaultshow} items={items}
/>);
});
return group;
};
saveSecondaryPassword = () => {
const { isPassLoginPassword } = this.state;
const { form } = this.props;
const { secondaryPwd1, secondaryPwd2, validatecode, password } = form.getFormParams();
if (isPassLoginPassword) {
if (!validatecode || !secondaryPwd1 || !secondaryPwd2) {
message.error(getLabel(518702, "必要信息不完整,红色*为必填项!"));
return;
}
if (secondaryPwd1 !== secondaryPwd2) {
message.error(getLabel("504376", "密码确认不正确!"));
return;
}
} else {
if (!password) {
message.error(getLabel(518702, "必要信息不完整,红色*为必填项!"));
return;
}
}
const params = isPassLoginPassword ? { secondaryPwd1, secondaryPwd2 } : { password };
RSAEcrypt("1", params).then(RSAParam => {
isPassLoginPassword ?
saveSecondaryPwd({ ...RSAParam, validatecode }).then(({ sign, message: msg }) => {
if (sign === "1") {
message.success(msg);
this.props.onCancel();
form.resetForm();
} else {
message.warning(msg);
this.setState({ num: this.state.num + 1 }, () => {
this.setState({ src: `${window.ecologyContentPath || ""}/weaver/weaver.file.MakeValidateCode?notneedvalidate=1&isView=1&validatetype=0&validatenum=4&seriesnum_=${this.state.num}` });
});
}
}) :
checkPassword({ ...RSAParam }).then(({ result }) => {
if (result) {
this.setState({ isPassLoginPassword: true });
form.resetForm();
} else {
message.error(getLabel(504343, "登录密码错误"));
}
});
});
};
render() {
const { isPassLoginPassword } = this.state;
return (
<WeaDialog
onCancel={this.props.onCancel}
title={isPassLoginPassword ? getLabel(504332, "二次验证密码设置") : getLabel(504331, "请先输入登录密码")}
visible={this.props.visible}
initLoadCss className="pwdSetWrapper" hasScroll buttons={[
<Button type="primary" size="small" onClick={this.saveSecondaryPassword}>{getLabel(537558, "保存")}</Button>
]}
>
{
isPassLoginPassword ?
this.getSearchs(this.props.form, condition) :
this.getSearchs(this.props.form, loginCondition)
}
</WeaDialog>
);
}
}
export default PassSetDialog;

View File

@ -0,0 +1,69 @@
import { WeaLocaleProvider } from "ecCom";
const { getLabel } = WeaLocaleProvider;
export const loginCondition = [
{
items: [
{
colSpan: 1,
checkbox: false,
checkboxValue: false,
conditionType: "INPUT",
domkey: ["password"],
fieldcol: 18,
label: getLabel(388431, "登录密码"),
labelcol: 6,
detailtype: 3,
rules: "required|string",
type: "password",
viewAttr: 3
}
],
title: "",
defaultshow: true
}
];
export const condition = [
{
items: [
{
colSpan: 1,
checkbox: false,
checkboxValue: false,
conditionType: "INPUT",
domkey: ["secondaryPwd1"],
fieldcol: 18,
label: getLabel(409, "密码"),
labelcol: 6,
detailtype: 3,
rules: "required|string",
viewAttr: 3,
type: "password"
},
{
colSpan: 1,
conditionType: "INPUT",
domkey: ["secondaryPwd2"],
fieldcol: 18,
label: getLabel(511112, "确认密码"),
labelcol: 6,
rules: "required|string",
viewAttr: 3,
type: "password"
},
{
colSpan: 1,
conditionType: "INPUT",
domkey: ["validatecode"],
fieldcol: 18,
label: getLabel(511113, "验证码"),
labelcol: 6,
value: "",
rules: "required|string",
viewAttr: 3
}
],
title: "",
defaultshow: true
}
];

View File

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

View File

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

View File

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

View File

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

View File

@ -14,6 +14,7 @@ import {
WeaFormItem,
WeaHelpfulTip,
WeaInput,
WeaLocaleProvider,
WeaPopoverHrm,
WeaSearchGroup,
WeaSelect,
@ -32,6 +33,7 @@ import SalaryFileViewSlide from "../salaryFile/saralyFileViewSlide";
import ChangeSalaryModal from "../salaryFile/changeSalaryModal";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
const WeaTableComx = WeaTableNew.WeaTable;
@inject("payrollFilesStore", "taxAgentStore", "salaryFileStore")
@ -83,7 +85,8 @@ class Index extends Component {
paysetParams: {
payStartDate: "",
payEndDate: ""
}
},
salaryArchiveDelete: "" //待定薪、停薪员工 是否允许删除薪资档案 0 否, 1
};
}
@ -164,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
@ -198,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
dataSource, columns, showSum, pageInfo, showOperateBtn, selectedKey, selectedRowKeys, salaryArchiveDelete
}), "*");
};
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: "",
@ -217,7 +222,8 @@ class Index extends Component {
userStatusList: [..._.map(userStatusList, it => ({
key: String(it.value),
showname: it.defaultLabel
}))]
}))],
salaryArchiveDelete
}, () =>
this.getImportTypes());
};
@ -288,6 +294,9 @@ class Index extends Component {
commonEnumList = (params) => {
return API.commonEnumList(params);
};
salaryArchiveDelete = () => {
return API.salaryArchiveDelete();
};
getImportTypes = () => {
API.getImportTypes().then(({ data, status }) => {
if (status) {
@ -496,7 +505,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
@ -546,6 +555,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 头部操作按钮

View File

@ -25,7 +25,9 @@ export default class Index extends Component {
rule: "",
enctry: "",
operateTaxDeclaration: "",
matchRule: ""
matchRule: "",
confValue: "0",
withDrawTaxDeclaration: "0"
},
showEncryptOperationButton: "",
progressVisible: false,
@ -53,7 +55,8 @@ export default class Index extends Component {
showEncryptOperationButton,
isOpenEncrypt: enctry,
isOpenTaxDeclaration: operateTaxDeclaration,
salaryAcctEmployeeRule: matchRule
salaryAcctEmployeeRule: matchRule,
salaryArchiveDelete: confValue, withDrawTaxDeclaration
}
} = appSettings;
this.setState({
@ -61,7 +64,7 @@ export default class Index extends Component {
showEncryptOperationButton,
saveParams: {
...saveParams,
ascOrDesc, orderRule, rule, enctry, operateTaxDeclaration, matchRule
ascOrDesc, orderRule, rule, enctry, operateTaxDeclaration, matchRule, confValue, withDrawTaxDeclaration
}
});
}
@ -197,6 +200,26 @@ export default class Index extends Component {
}
});
};
saveArchiveDelete = () => {
API.saveArchiveDelete(_.pick(this.state.saveParams, ["confValue"]))
.then(({ status, errormsg }) => {
if (status) {
message.success(getLabel(22619, "保存成功!"));
} else {
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, "保存失败!"));
}
});
};
handleChange = (key, val) => {
const { saveParams } = this.state;
@ -227,6 +250,12 @@ export default class Index extends Component {
case "enctry":
this.saveEncryptSetting();
break;
case "confValue":
this.saveArchiveDelete();
break;
case "withDrawTaxDeclaration":
this.withDrawTaxDeclaration();
break;
default:
break;
}
@ -252,7 +281,16 @@ export default class Index extends Component {
employeeOptions,
showEncryptOperationButton
} = this.state;
const { orderRule, ascOrDesc, rule, enctry, operateTaxDeclaration, matchRule } = saveParams;
const {
orderRule,
ascOrDesc,
rule,
enctry,
operateTaxDeclaration,
matchRule,
confValue,
withDrawTaxDeclaration
} = saveParams;
return (
<div className="ruleWrapper">
<WeaTop
@ -295,6 +333,16 @@ export default class Index extends Component {
<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 }}>

View File

@ -1,7 +1,7 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, Dropdown, Menu, message, Modal, Switch } from "antd";
import { WeaInputSearch, WeaNewScroll, WeaSlideModal, WeaTop } from "ecCom";
import { WeaInputSearch, WeaLocaleProvider, WeaNewScroll, WeaSlideModal, WeaTop } from "ecCom";
import { renderLoading } from "../../util";
import CustomTab from "../../components/customTab";
import SystemSalaryItemModal from "./systemSalaryItemModal";
@ -11,6 +11,7 @@ import CustomSalaryItemSlide from "./customSalaryItemSlide";
import CustomPaginationTable from "../../components/customPaginationTable";
import "../socialSecurityBenefits/programme/index.less";
const { getLabel } = WeaLocaleProvider;
@inject("salaryItemStore", "taxAgentStore", "salaryFileStore")
@observer
export default class SalaryItem extends React.Component {
@ -112,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 }}/>;
}
@ -124,37 +125,22 @@ export default class SalaryItem extends React.Component {
columns.push({
key: "operate",
title: "操作",
width: 120,
render: (text, record) => {
return (
<a onClick={() => {
this.onEditItem(record, true);
}}>{(showSalaryItemBtn || showOperateBtn) ? "编辑" : "查看"}</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);
}}>删除</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

@ -2,7 +2,7 @@ import React from "react";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { Button, Dropdown, Menu, message, Modal, Popover } from "antd";
import { WeaHelpfulTip, WeaNewScroll, WeaSlideModal, WeaTab, WeaTop } from "ecCom";
import { WeaHelpfulTip, WeaLocaleProvider, WeaNewScroll, WeaSlideModal, WeaTab, WeaTop } from "ecCom";
import { getSearchs, renderLoading } from "../../../util";
import BaseForm from "./baseForm";
import SlideModalTitle from "../../../components/slideModalTitle";
@ -15,8 +15,10 @@ import ImportModal from "../../../components/importModal";
import TipLabel from "../../../components/TipLabel";
import UnifiedTable from "../../../components/UnifiedTable";
import { convertToUrlString } from "../../../util/url";
import { salaryArchiveDelete } from "../../../apis/payrollFiles";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
@inject("archivesStore", "taxAgentStore")
@observer
export default class Archives extends React.Component {
@ -50,7 +52,8 @@ export default class Archives extends React.Component {
current: 1,
pageSize: 10,
total: 0
}
},
salaryArchiveDelete: "" //待定薪、停薪员工 是否允许删除薪资档案 0 否, 1
};
this.record = {};
}
@ -58,6 +61,7 @@ export default class Archives extends React.Component {
componentDidMount() {
const { archivesStore: { doInit } } = this.props;
doInit();
this.salaryArchiveDelete();
this.queryList({ runStatuses: ["1"] });
}
@ -93,6 +97,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 +117,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 +132,68 @@ export default class Archives extends React.Component {
return tmpV.length > 0 ? [
...tmpV, {
title: "操作",
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") ? "编辑" : "查看"}</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: "信息确认",
content: `确定要删除该条待办人员吗?`,
onOk: () => this.deleteTodoList({ runStatus: "4", ids: [record.baseInfo] })
});
}
}}>
<Menu.Item key="addMember">增员</Menu.Item>
<Menu.Item key="stopSalary">删除待办</Menu.Item>
</Menu>} title="">
content={
salaryArchiveDelete === "1" ?
<Menu onClick={({ key }) => {
if (key === "deleteAchives") {
this.deleteSocialArchive([record.baseInfo]);
} else {
Modal.warning({
title: "信息确认",
content: `确定要删除该条待办人员吗?`,
onOk: () => this.deleteTodoList({ runStatus: "4", ids: [record.baseInfo] })
});
}
}}>
<Menu.Item key="deleteAchives">删除档案</Menu.Item>
<Menu.Item key="stopSalary">删除待办</Menu.Item>
</Menu> :
<Menu onClick={({ key }) => {
if (key === "deleteAchives") {
this.deleteSocialArchive([record.baseInfo]);
} else {
Modal.warning({
title: "信息确认",
content: `确定要删除该条待办人员吗?`,
onOk: () => this.deleteTodoList({ runStatus: "4", ids: [record.baseInfo] })
});
}
}}>
<Menu.Item key="stopSalary">删除待办</Menu.Item>
</Menu>
} title="">
<i className="icon-coms-more"/>
</Popover>
}
@ -159,18 +209,15 @@ export default class Archives extends React.Component {
content: `确定要删除该条待办人员吗?`,
onOk: () => this.cancelStayDel({ runStatus: "3", ids: [record.baseInfo] })
});
} else {
this.stayDelToStop([record.baseInfo]);
}
}}>
<Menu.Item key="stayDelToStop">减员</Menu.Item>
<Menu.Item key="stopSalary">删除待办</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 +475,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

@ -1,10 +1,9 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { toJS } from "mobx";
import { Button, Dropdown, Menu, message, Modal, Switch } from "antd";
import { WeaNewScroll, WeaSelect, WeaSlideModal, WeaTop } from "ecCom";
import { WeaTableNew } from "comsMobx";
import { renderNoright } from "../../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import { Button, Dropdown, Menu, message, Modal } from "antd";
import { WeaLocaleProvider, WeaNewScroll, WeaSelect, WeaSlideModal, WeaTop } from "ecCom";
import { renderNoright } from "../../../util";
import CustomTab from "../../../components/customTab";
import SlideModalTitle from "../../../components/slideModalTitle";
import TipLabel from "../../../components/TipLabel";
@ -14,11 +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 WeaMobxTable = WeaTableNew.WeaTable;
const { getLabel } = WeaLocaleProvider;
@inject("programmeStore", "taxAgentStore", "salaryFileStore")
@observer
export default class Programme extends React.Component {
@ -57,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);
}}>
编辑
</a>
<a href="javascript: void(0);" onClick={() => this.onEdit(record)}>编辑</a>
);
default:
return <div dangerouslySetInnerHTML={{ __html: valueSpan }}/>;
@ -87,72 +78,38 @@ export default class Programme extends React.Component {
newColumns.push({
title: "操作",
dataIndex: "operate",
width: 120,
render: (text, record) => {
return (
<a
href="javascript:void(0);"
onClick={() => {
this.onEdit(record);
}}>
{showOperateBtn ? "编辑" : "查看"}
</a>
);
}
});
showOperateBtn && newColumns.push({
key: "moreOperate",
dataIndex: "moreOperate",
render: (text, record) => {
return (
<Dropdown
overlay={
<Menu>
<Menu.Item>
<a
onClick={() => {
this.onCopy(record);
}}>
复制
</a>
</Menu.Item>
{/*暂时隐藏*/}
<Menu.Item>
<a
onClick={() => {
this.onDelete(record);
}}>
删除
</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 ? "编辑" : "查看"}</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;
};
handleCategoryStatusChange(record, value) {
const { programmeStore: { updateCustomCategoryStatus } } = this.props;
Modal.confirm({
title: "信息确认",
content: `确认要${value ? "启用" : "停用"}`,
onOk: () => {
updateCustomCategoryStatus(record.id, value);
},
onCancel: () => {
}
});
}
onEdit(record) {
onEdit = (record) => {
let id = record.id;
const { programmeStore } = this.props;
const { getForm, selectedKey } = programmeStore;
@ -162,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;
@ -422,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

@ -1,7 +1,7 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { Button, DatePicker, Dropdown, Menu, message, Modal } from "antd";
import { WeaNewScroll, WeaTop } from "ecCom";
import { WeaLocaleProvider, WeaNewScroll, WeaTop } from "ecCom";
import { renderNoright } from "../../../util";
import Accountdialog from "./components/accountDialog";
import AbnormalDrawer from "./components/abnormalDrawer";
@ -12,6 +12,7 @@ import { getCalculateProgress } from "../../../apis/calculate";
import "./index.less";
import UnifiedTable from "../../../components/UnifiedTable";
const { getLabel } = WeaLocaleProvider;
const MonthPicker = DatePicker.MonthPicker;
@inject("standingBookStore", "taxAgentStore")
@ -139,28 +140,54 @@ export default class StandingBook extends React.Component {
{
title: "操作",
dataIndex: "operate",
width: 150,
key: "operate",
render: (text, r) => {
const { billStatus, billMonth, creator } = r;
return (
<React.Fragment>
{billStatus === "未归档" && (
{billStatus === "0" && (
<a
href="javascript:void(0);"
className="linkTo"
style={{ marginRight: 10 }}
onClick={() => this.handleGoDetail(billMonth, "", r.paymentOrganizationId, creator)}>
核算
</a>
)}
{billStatus === "已归档" && (
{billStatus === "0" && (
<a
href="javascript:void(0);"
style={{ marginRight: 10 }}
onClick={() => this.handleOperate({
key: "archive",
billMonth,
paymentOrganizationId: r.paymentOrganizationId,
creator
})}>
归档
</a>
)}
{billStatus === "1" && (
<a
href="javascript:void(0);"
style={{ marginRight: 10 }}
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 })}>
重新核算
</a>
)}
{billStatus === "未归档" && (
{billStatus === "0" && (
<Dropdown
overlay={
<Menu
@ -172,31 +199,10 @@ export default class StandingBook extends React.Component {
creator
})
}>
<Menu.Item key="archive">归档</Menu.Item>
{/* <Menu.Item key="detail">异常详情</Menu.Item> */}
<Menu.Item key="delete">删除</Menu.Item>
{/* <Menu.Item key="operate">操作日志</Menu.Item> */}
</Menu>
}>
<i className="icon-coms-more more"/>
</Dropdown>
)}
{billStatus === "已归档" && (
<Dropdown
overlay={
<Menu
onClick={({ key }) =>
this.handleOperate({
key,
billMonth,
paymentOrganizationId: r.paymentOrganizationId,
creator
})
}>
<Menu.Item key="view">查看</Menu.Item>
</Menu>
}>
<i className="icon-coms-more more"/>
<i className="icon-coms-more" style={{ marginLeft: 10 }}/>
</Dropdown>
)}
</React.Fragment>
@ -490,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

@ -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 { Button, Col, message, Modal, Row, Switch } from "antd";
import { WeaFormItem, WeaInputSearch, WeaSearchGroup, WeaTable, WeaTop } from "ecCom";
import { renderNoright } from "../../util"; // 渲染form数据的方法因为多个页面都会使用所以抽的公共方法在util中
import { renderNoright } from "../../util";
import EditModal from "./editModal";
import TipLabel from "../../components/TipLabel";
import { decentralizationConditions, editConditions } from "./editConditions";
@ -357,22 +357,11 @@ export default class TaxAgent extends React.Component {
onClick={() => this.showEditModal(record.id)}>
编辑
</a>
<Dropdown
overlay={
<Menu>
<Menu.Item key="0">
<a
href="javaScript:void(0);"
onClick={() => this.deleteTaxAgent(record.id)}>
删除
</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)}>
删除
</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

@ -14,6 +14,7 @@ const { TableStore } = WeaTableNew;
export class MySalaryStore {
@observable tableStore = new TableStore(); // new table
@observable form = new WeaForm(); // nrew 一个form
@observable pwdForm = new WeaForm(); // new 一个密码验证form
@observable condition = []; // 存储后台得到的form数据
@observable hasRight = false; // 判断用户是有权限查看当前页面: 没有权限渲染无权限页面,有权限渲染数据
@observable showSearchAd = false; // 高级搜索面板显示

View File

@ -0,0 +1,32 @@
import loadjs from "loadjs";
const RSAEcrypt = (openRSA, param) => {
return new Promise((resolve, reject) => {
//异步加载ras文件
loadjs.isDefined("rsa") ? loadjs.ready("rsa", () => {
if (openRSA && openRSA == "1") {
Object.keys(param).forEach(key => {
param[key] = __RSAEcrypt__.rsa_data_encrypt(param[key]);
});
}
resolve(param);
}) : loadjs(["/js/rsa/jsencrypt.js", "/js/rsa/rsa.js"], "rsa", {
async: false,
success: () => {
if (openRSA && openRSA == "1") {
const callback = () => {
Object.keys(param).forEach(key => {
param[key] = __RSAEcrypt__.rsa_data_encrypt(param[key]);
});
resolve(param);
};
__RSAEcrypt__.initRsaCode(callback);
} else {
resolve(param);
}
}
});
});
};
export { RSAEcrypt };