Merge branch 'release/2.9.42309.01' into custom-艾志工业-合并个税

# Conflicts:
#	pc4mobx/hrmSalary/components/importDialog/components/impStep1.js
#	pc4mobx/hrmSalary/components/importDialog/index.js
#	pc4mobx/hrmSalary/components/importDialog/index.less
#	pc4mobx/hrmSalary/util/index.js
This commit is contained in:
黎永顺 2023-09-12 11:21:12 +08:00
commit 74fa42adb0
32 changed files with 1112 additions and 421 deletions

View File

@ -1,4 +1,4 @@
import { WeaTools } from 'ecCom';
import { WeaTools } from "ecCom";
/**
* 薪资项目api
@ -7,171 +7,171 @@ import { WeaTools } from 'ecCom';
// 薪资项目-获取列表
export const getItemList = params => {
return fetch('/api/bs/hrmsalary/salaryitem/list', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
return fetch("/api/bs/hrmsalary/salaryitem/list", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//薪资项目的高级搜索
export const getSaCondition = params => {
return WeaTools.callApi('/api/bs/hrmsalary/salaryitem/getSearchCondition', 'GET', params);
return WeaTools.callApi("/api/bs/hrmsalary/salaryitem/getSearchCondition", "GET", params);
};
//数据源列表字典项
export const formulaDatasourceList = params => {
return WeaTools.callApi('/api/bs/hrmsalary/formula/datasource/list', 'GET', params);
return WeaTools.callApi("/api/bs/hrmsalary/formula/datasource/list", "GET", params);
};
//薪资项目-系统薪资项目列表
export const getSysItemList = params => {
return fetch('/api/bs/hrmsalary/salaryitem/sysList', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
return fetch("/api/bs/hrmsalary/salaryitem/sysList", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//系统薪资项目的高级搜索
export const getSysSaCondition = params => {
return WeaTools.callApi('/api/bs/hrmsalary/salaryitem/getSysSearchCondition', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/salaryitem/getSysSearchCondition", "GET", params);
};
//薪资项目-批量删除薪资项目
export const deleteItem = params => {
return fetch('/api/bs/hrmsalary/salaryitem/delete', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/salaryitem/delete", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//薪资项目-批量删除列表
export const deleteItemList = params => {
return fetch('/api/bs/hrmsalary/salaryitem/listCanDelete', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/salaryitem/listCanDelete", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//薪资项目-新增薪资项目
export const saveItem = params => {
delete params.formulaContent
return fetch('/api/bs/hrmsalary/salaryitem/save', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
delete params.formulaContent;
return fetch("/api/bs/hrmsalary/salaryitem/save", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//薪资项目-更新薪资项目
export const updateItem = params => {
return WeaTools.callApi('/api/bs/hrmsalary/salaryitem/update', 'POST', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/salaryitem/update", "POST", params);
};
//薪资项目-薪资项目详情
export const getItemForm = params => {
return WeaTools.callApi('/api/bs/hrmsalary/salaryitem/getSalaryForm', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/salaryitem/getSalaryForm", "GET", params);
};
//薪资项目-添加系统薪资项目
export const saveSysItem = params => {
return fetch('/api/bs/hrmsalary/salaryitem/saveSys', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/salaryitem/saveSys", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//获取薪资项目可选的类型(与属性有联动)
export const getItemTypeOption = params => {
return WeaTools.callApi('/api/bs/hrmsalary/salaryitem/listSalaryItemTypeOption', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/salaryitem/listSalaryItemTypeOption", "GET", params);
};
//获取公式描述
export const getFormulaDes = params => {
return WeaTools.callApi('/api/bs/hrmsalary/formula/des', 'GET', params);
}
return WeaTools.callApi("/api/bs/hrmsalary/formula/des", "GET", params);
};
// *** 公式 start ***
// 获取公式变量类型
export const formualSearchGroup = params => {
return fetch('/api/bs/hrmsalary/formula/search/group', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/formula/search/group", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//获取公式变量字段
export const formualSearchField = params => {
return fetch('/api/bs/hrmsalary/formula/search/field', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/formula/search/field", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// /api/bs/hrmsalary/formula/save
// 保存公式
export const saveFormual = params => {
return fetch('/api/bs/hrmsalary/formula/save', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/formula/save", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// 公式测试
export const testFormual = params => {
return fetch('/api/bs/hrmsalary/formula/mock', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/formula/mock", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// 根据id获取formual
export const detailFormual = params => {
return fetch('/api/bs/hrmsalary/formula/detail', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/formula/detail", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
// *** 公式 end ***
@ -179,14 +179,28 @@ export const detailFormual = params => {
// 列出可以删除的薪资项目
export const listCanDelete = params => {
return fetch('/api/bs/hrmsalary/salaryitem/listCanDelete', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
}).then(res => res.json())
}
return fetch("/api/bs/hrmsalary/salaryitem/listCanDelete", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};
//获取哪些账套中使用了该薪资项目
export const getSalarySobBySalaryItem = params => {
return WeaTools.callApi("/api/bs/hrmsalary/salaryitem/getSalarySobBySalaryItem", "GET", params);
};
// 同步到薪资账套
export const syncSalaryItemToSalarySobItem = params => {
return fetch("/api/bs/hrmsalary/salaryitem/syncSalaryItemToSalarySobItem ", {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(params)
}).then(res => res.json());
};

View File

@ -13,6 +13,10 @@ export const getCondition = params => {
export const queryList = (params) => {
return postFetch("/api/bs/hrmsalary/archives/getTable", params);
};
//社保福利档案_非系统人员列表
export const getExtTable = (params) => {
return postFetch("/api/bs/hrmsalary/archives/getExtTable", params);
};
//社保福利档案列表
export const queryInsuranceTabTotal = (params) => {
return WeaTools.callApi("/api/bs/hrmsalary/archives/queryInsuranceTabTotal", params);

View File

@ -21,8 +21,8 @@ class ImpStep1 extends Component {
handleChange = (data) => {
const { fileList, file } = data;
if (file.response && typeof (file.response) != "undefined") message.success(getLabel(111, "上传成功"));
this.setState({ fileList });
if (file.response && typeof (file.response) != "undefined" && file.status !== "removed") message.success(getLabel(111, "上传成功"));
this.setState({ fileList: fileList.slice(-1) });
};
render() {
@ -62,7 +62,8 @@ class ImpStep1 extends Component {
<p>
<span>{`1. ${getLabel(30907, "第一步")},${getLabel(543205, "请选择导出的Excel文件或")}`}</span>&nbsp;&nbsp;
<a href={this.props.link} className="weapp-salary-link"
target="_blank">{getLabel(543207, "点击这里下载模板")}</a>
target="_blank">{getLabel(543207, "点击这里下载模板")}</a>&nbsp;&nbsp;
{this.props.exportDataDom}
</p>
<p>{`2. ${getLabel(543211, "第二步")},${getLabel(543212, "请一定要确定Excel文档中的格式是模板中的格式")},${getLabel(543213, "没有被修改掉")}`}</p>
<p>{`3. ${getLabel(543216, "第三步")},${getLabel(543215, "选择填写好的Excel文档")},${getLabel(543214, "点击“下一步”按钮进行数据预览")}`}</p>

View File

@ -0,0 +1,49 @@
/*
* Author: 黎永顺
* name: 导入-步骤二
* Description:
* Date: 2023/9/5
*/
import React, { Component } from "react";
import { WeaTable } from "ecCom";
import { postFetch } from "../../../util/request";
class ImpStep2 extends Component {
constructor(props) {
super(props);
this.state = {
loading: false, columns: [], dataSource: []
};
}
componentDidMount() {
this.init();
}
init = () => {
const { previewUrl, imageId } = this.props;
const payload = { imageId };
this.setState({ loading: true });
postFetch(previewUrl, payload).then(({ status, data }) => {
this.setState({ loading: false });
if (status) {
const { headers, list } = data;
this.setState({
columns: _.map(headers, (item, index) => ({ title: item, dataIndex: index + "", width: 120 })),
dataSource: _.map(list, item => {
return _.reduce(item, (pre, cur, key) => (_.assign(pre, { [key]: cur })), {});
})
});
}
}).catch(() => this.setState({ loading: false }));
};
render() {
const { dataSource, columns, loading } = this.state;
return (
<WeaTable dataSource={dataSource} columns={columns} pagination={false} loading={loading} scroll={{ x: 800 }}/>
);
}
}
export default ImpStep2;

View File

@ -8,6 +8,7 @@ import React, { Component } from "react";
import { Button, message, Modal } from "antd";
import { WeaDialog, WeaLocaleProvider, WeaSteps } from "ecCom";
import ImpStep1 from "./components/impStep1";
import ImpStep2 from "./components/impStep2";
import ImpStep3 from "./components/impStep3";
import "./index.less";
@ -23,7 +24,7 @@ class Index extends Component {
}
componentWillReceiveProps(nextProps, nextContext) {
if (JSON.stringify(nextProps.importResult) !== JSON.stringify(this.props.importResult)) {
if (JSON.stringify(nextProps.importResult) !== JSON.stringify(this.props.importResult) && !_.isEmpty(nextProps.importResult)) {
this.setState({
current: this.state.current + 1
});
@ -33,20 +34,21 @@ class Index extends Component {
renderChildren = () => {
const { current } = this.state;
const { importParams, link, excludeKey, importResult } = this.props;
const { importParams, link, excludeKey, importResult, exportDataDom = null } = this.props;
let CurrentDom = null;
switch (current) {
case 0:
CurrentDom = <ImpStep1 importParams={importParams} link={link} ref={dom => this.step1Ref = dom}/>;
CurrentDom = <ImpStep1 importParams={importParams} link={link} exportDataDom={exportDataDom}
ref={dom => this.step1Ref = dom}/>;
break;
case 1:
CurrentDom = null;
CurrentDom = <ImpStep2 {...this.props}/>;
if (excludeKey) {
CurrentDom = <ImpStep3 importResult={importResult}/>;
}
break;
case 2:
CurrentDom = null;
CurrentDom = <ImpStep3 importResult={importResult}/>;
break;
default:
CurrentDom = null;
@ -54,7 +56,19 @@ class Index extends Component {
}
return CurrentDom;
};
/*
* Author: 黎永顺
* Description: 上一步
* Params:
* Date: 2023/9/5
*/
handlePreviousStep = () => {
Modal.confirm({
title: getLabel(131329, "信息确认"),
content: getLabel(111, "是否放弃已上传的文件?"),
onOk: () => this.setState({ current: this.state.current - 1 }, () => this.props.onResetImportResult())
});
};
/*
* Author: 黎永顺
* Description: 下一步
@ -62,24 +76,28 @@ class Index extends Component {
* Date: 2023/8/11
*/
handleNext = () => {
const { params } = this.props;
const { fileList } = this.step1Ref.state;
if (!_.isEmpty(params)) {
if (!Object.values(params).every(o => !!o)) {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: getLabel(518702, "必要信息不完整,红色*为必填项!")
});
const { params, importResult } = this.props;
if (_.isEmpty(importResult)) {
const { fileList } = this.step1Ref.state;
if (!_.isEmpty(params)) {
if (!Object.values(params).every(o => !!o)) {
Modal.warning({
title: getLabel(131329, "信息确认"),
content: getLabel(518702, "必要信息不完整,红色*为必填项!")
});
return;
}
}
if (_.isEmpty(fileList)) {
message.warning(getLabel(111, "请先上传EXCEL文件"));
return;
}
const [file] = fileList;
const { response } = file;
this.props.nextCallback(response.data.fileid);
} else {
this.setState({ current: this.state.current + 1 });
}
if (_.isEmpty(fileList)) {
message.error(getLabel(111, "请先上传EXCEL文件"));
return;
}
const [file] = fileList;
const { response } = file;
this.props.nextCallback(response.data.fileid);
};
render() {
@ -90,7 +108,7 @@ class Index extends Component {
{ key: 2, label: getLabel(502835, "导入数据") }
];
const btns = [
<Button type="ghost">{getLabel(1876, "上一步")}</Button>,
<Button type="ghost" onClick={this.handlePreviousStep}>{getLabel(1876, "上一步")}</Button>,
<Button type="primary" onClick={this.handleNext}
loading={this.props.nextloading}>{getLabel(1402, "下一步")}</Button>,
<Button type="primary" onClick={() => this.props.onCancel(true)}>{getLabel(555, "完成")}</Button>

View File

@ -131,8 +131,6 @@
justify-content: center;
align-items: center;
flex-direction: column;
padding-top: 80px;
padding-bottom: 80px;
text-align: center;
p {

View File

@ -93,7 +93,7 @@ export default class MobilePayroll extends React.Component {
const params = this.getUrlkey();
const payload = {
salaryInfoId,
..._.omit(params, ["id", "_key", "type"])
..._.pick(params, ["recipient"])
};
getMySalaryBill(payload).then(result => {
this.setState({

View File

@ -133,7 +133,7 @@ export default class PayrollDetail extends React.Component {
<Button type="ghost" onClick={() => setDetailListShowSearchAd(false)}>取消</Button>
];
return (
<div className="payrollGrant">
<div className="payrollDetail">
<WeaTab
searchType={["base", "advanced"]} searchsBasePlaceHolder="请输入姓名"
buttons={[<Button type="primary" onClick={this.handleExportAll}>导出全部</Button>]}

View File

@ -1,12 +1,17 @@
.payrollGrant {
.payrollDetail {
display: flex;
flex-direction: column;
height: 100%;
background: #f6f6f6;
.wea-tab .wea-tab-right, .wea-input-focus {
background: #f6f6f6;
}
.titleBar {
height: 47px;
line-height: 47px;
padding: 0 10px;
padding: 0 16px;
.titleBarLeft {
float: left;
@ -19,6 +24,7 @@
.tableWrapper {
flex: 1;
padding: 0 16px;
.ant-spin-nested-loading, .ant-spin-container {
height: 100%;

View File

@ -595,6 +595,7 @@ export default class PayrollGrant extends React.Component {
this.pageInfo = { current, pageSize };
this.handleShowSizeChange(this.pageInfo);
}}
scroll={{ y: `calc(100vh - 236px)` }}
/> : renderLoading()
}
</div>

View File

@ -1,8 +1,15 @@
.payrollGrant_new {
background: #f6f6f6;
height: 100%;
.wea-tab .wea-tab-right, .wea-input-focus {
background: #f6f6f6;
}
.titleBar {
height: 47px;
line-height: 47px;
padding: 0 10px;
padding: 0 16px;
.titleBarLeft {
float: left;
@ -14,8 +21,11 @@
}
.tableWrapper {
height: calc(100vh - 180.22px);
overflow: auto;
padding: 0 16px;
.wea-new-table {
background: #FFF;
}
}
}

View File

@ -86,9 +86,11 @@ class SalaryItemSettings extends Component {
}
});
this.setState({
dataList: resultSalaryItemSet
dataList: resultSalaryItemSet,
itemShowNamesetting: _.filter(this.state.itemShowNamesetting, it => it.salaryItemId !== item.id)
}, () => {
this.props.onChangeSalaryItem(resultSalaryItemSet);
this.props.onChangeSalaryItemShowNamesetting(this.state.itemShowNamesetting);
});
};
handleCloseModal = () => {

View File

@ -30,8 +30,8 @@ import AllWithoutPay from "./components/allWithoutPay";
import BatchSuspendsPay from "./components/batchSuspendsPay";
import SlideModalTitle from "../../components/slideModalTitle";
import SalaryFileViewSlide from "../salaryFile/saralyFileViewSlide";
import ChangeSalaryModal from "../salaryFile/changeSalaryModal";
import { sysinfo } from "../../apis/ruleconfig";
import SalaryArchiveEditAdjLogRecord from "../salaryFile/salaryArchiveEditAdjLogRecord";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
@ -77,7 +77,9 @@ class Index extends Component {
subcompanyIds: ""
},
salaryAdjustmentInfo: {},
changeSalaryVisible: false,
adjLogRecordDialog: {
visible: false, title: "", id: "", salaryArchiveId: ""
},
noPayDate: "",
slideParams: {
visible: false,
@ -624,7 +626,12 @@ class Index extends Component {
}
if (showOperateBtn && (selectedKey === "fixed" || selectedKey === "ext")) {
arrList.push(<Button type="primary" onClick={() => {
this.setState({ changeSalaryVisible: true });
this.setState({
adjLogRecordDialog: {
...this.state.adjLogRecordDialog,
visible: true, title: getLabel(542686, "调薪"), salaryArchiveId: this.state.slideParams.id
}
});
}}>调薪</Button>);
}
selectedKey !== "stop" && arrList.push(<Button type="primary" onClick={this.handleSave}>保存</Button>);
@ -719,7 +726,7 @@ class Index extends Component {
pageInfo,
showSearchAd,
slideParams,
changeSalaryVisible,
adjLogRecordDialog,
paysetParams,
extEmpsWitch
} = this.state;
@ -884,15 +891,14 @@ class Index extends Component {
}}
/>
)}
{changeSalaryVisible && (
<ChangeSalaryModal
currentId={slideParams.id}
visible={changeSalaryVisible}
onCancel={() => {
this.setState({ changeSalaryVisible: false });
}}
/>
)}
<SalaryArchiveEditAdjLogRecord
{...adjLogRecordDialog}
onCancel={() => this.setState({
adjLogRecordDialog: {
adjLogRecordDialog, visible: false, title: "", id: "", salaryArchiveId: ""
}
})}
/>
</div>
);
}

View File

@ -23,7 +23,7 @@ export default class Index extends Component {
orderRule: "",
ascOrDesc: "",
rule: "",
enctry: "",
enctry: "1",
operateTaxDeclaration: "1",
matchRule: "",
confValue: "0",
@ -56,7 +56,7 @@ export default class Index extends Component {
ascOrDesc = "", orderRule = "", showEncryptOperationButton, matchEmployeeMode: rule = "",
taxDeclarationFunction: operateTaxDeclaration = "1", salaryArchiveDelete: confValue,
salaryAcctEmployeeRule: matchRule, WITHDRAW_TAX_DECLARATION: withDrawTaxDeclaration = "0",
OPEN_APPLICATION_ENCRYPT: enctry = "0", extEmpsWitch = "0"
OPEN_APPLICATION_ENCRYPT: enctry = "1", extEmpsWitch = "0"
}
} = sysInfo;
// const { data: { ascOrDesc, orderRule } } = orderRules;

View File

@ -1,175 +1,203 @@
export const columns = [
{
title: "姓名",
dataIndex: 'title',
key: 'title',
},
{
title: "个税扣缴义务人",
dataIndex: 'title',
key: 'title',
},
{
title: "部门",
dataIndex: 'title',
key: 'title',
},
{
title: "手机号",
dataIndex: 'title',
key: 'title',
},
{
title: "员工状态",
dataIndex: 'title',
key: 'title',
},
{
title: "基本工资",
dataIndex: 'title',
key: 'title',
},
{
title: "操作",
dataIndex: 'cz',
key: 'cz',
}
]
{
title: "姓名",
dataIndex: "title",
key: "title"
},
{
title: "个税扣缴义务人",
dataIndex: "title",
key: "title"
},
{
title: "部门",
dataIndex: "title",
key: "title"
},
{
title: "手机号",
dataIndex: "title",
key: "title"
},
{
title: "员工状态",
dataIndex: "title",
key: "title"
},
{
title: "基本工资",
dataIndex: "title",
key: "title"
},
{
title: "操作",
dataIndex: "cz",
key: "cz"
}
];
export const changeSalaryModalColumns = [
{
title: '薪资项目',
dataIndex: 'title',
key: 'title'
},
{
title: '调整前',
dataIndex: 'title',
key: 'title'
},
{
title: '调整后',
dataIndex: 'title',
key: 'title'
}
]
export const adjCondition = [
{
items: [
{
colSpan: 1,
conditionType: "DATEPICKER",
domkey: ["effectiveTime"],
fieldcol: 18,
label: "生效日期",
lanId: 19548,
labelcol: 6,
rules: "required",
value: "",
viewAttr: 3
},
{
colSpan: 1,
checkbox: false,
checkboxValue: false,
conditionType: "SELECT",
domkey: ["adjustReason"],
fieldcol: 18,
label: "调整原因",
lanId: 1897,
labelcol: 6,
options: [],
rules: "required",
viewAttr: 3
},
{
colSpan: 1,
conditionType: "INPUT",
domkey: ["description"],
fieldcol: 18,
label: "说明",
lanId: 25734,
labelcol: 6,
value: "",
viewAttr: 2
}
],
title: "调薪信息",
defaultshow: true
}
];
export const slideSalaryItemColumns = [
{
title: "姓名",
dataIndex: 'title',
key: 'title'
},
{
title: "员工状态",
dataIndex: 'title',
key: 'title'
},
{
title: "部门",
dataIndex: 'title',
key: 'title'
},
{
title: "薪资项目",
dataIndex: 'title',
key: 'title'
},
{
title: "调整前",
dataIndex: 'title',
key: 'title'
},
{
title: "调整后",
dataIndex: 'title',
key: 'title'
},
{
title: "调整原因",
dataIndex: 'title',
key: 'title'
},
{
title: "生效日期",
dataIndex: 'title',
key: 'title'
},
{
title: "操作人",
dataIndex: 'title',
key: 'title'
},
{
title: "操作日期",
dataIndex: 'title',
key: 'title'
},
{
title: "说明",
dataIndex: 'title',
key: 'title'
}
]
{
title: "姓名",
dataIndex: "title",
key: "title"
},
{
title: "员工状态",
dataIndex: "title",
key: "title"
},
{
title: "部门",
dataIndex: "title",
key: "title"
},
{
title: "薪资项目",
dataIndex: "title",
key: "title"
},
{
title: "调整前",
dataIndex: "title",
key: "title"
},
{
title: "调整后",
dataIndex: "title",
key: "title"
},
{
title: "调整原因",
dataIndex: "title",
key: "title"
},
{
title: "生效日期",
dataIndex: "title",
key: "title"
},
{
title: "操作人",
dataIndex: "title",
key: "title"
},
{
title: "操作日期",
dataIndex: "title",
key: "title"
},
{
title: "说明",
dataIndex: "title",
key: "title"
}
];
export const slieAgentColumns = [
{
title: "姓名",
dataIndex: 'title',
key: 'title'
},
{
title: "员工状态",
dataIndex: 'title',
key: 'title'
},
{
title: "部门",
dataIndex: 'title',
key: 'title'
},
{
title: "调整前",
dataIndex: 'title',
key: 'title'
},
{
title: "调整后",
dataIndex: 'title',
key: 'title'
},
{
title: "调整原因",
dataIndex: 'title',
key: 'title'
},
{
title: "生效日期",
dataIndex: 'title',
key: 'title'
},
{
title: "操作人",
dataIndex: 'title',
key: 'title'
},
{
title: "操作日期",
dataIndex: 'title',
key: 'title'
},
{
title: "说明",
dataIndex: 'title',
key: 'title'
}
]
{
title: "姓名",
dataIndex: "title",
key: "title"
},
{
title: "员工状态",
dataIndex: "title",
key: "title"
},
{
title: "部门",
dataIndex: "title",
key: "title"
},
{
title: "调整前",
dataIndex: "title",
key: "title"
},
{
title: "调整后",
dataIndex: "title",
key: "title"
},
{
title: "调整原因",
dataIndex: "title",
key: "title"
},
{
title: "生效日期",
dataIndex: "title",
key: "title"
},
{
title: "操作人",
dataIndex: "title",
key: "title"
},
{
title: "操作日期",
dataIndex: "title",
key: "title"
},
{
title: "说明",
dataIndex: "title",
key: "title"
}
];
export const dataSource = [
{
title: "测试"
}
{
title: "测试"
}
];

View File

@ -73,7 +73,6 @@
}
}
.salaryFileSlide {
padding: 10px 20px;
@ -125,7 +124,6 @@
}
}
.salaryFileTabWrapper {
.searchPanel {
position: absolute;
@ -169,3 +167,55 @@
}
}
}
.adjustItem-layout {
.ant-table-fixed td {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.adjLogRecordDialogContent {
background: #f6f6f6;
padding: 16px;
height: 100%;
overflow-y: auto;
.empty {
text-align: center;
background: transparent;
margin-bottom: 20px;
padding: 30px 50px;
}
.wea-search-group:first-child {
margin-bottom: 16px;
}
.wea-search-group {
background: #FFF;
padding: 0;
border: 1px solid #e5e5e5;
border-bottom: none;
}
.wea-content, .wea-form-cell {
padding: 0;
}
.wea-form-item {
padding: 5px 16px;
border-bottom: 1px solid #e5e5e5;
}
.wea-select, .ant-select {
width: 100%;
}
.ant-select-selection {
width: 100%;
height: 30px;
border-radius: 0;
}
}

View File

@ -0,0 +1,221 @@
/*
* Author: 黎永顺
* name: 薪资档案-调薪
* Description:
* Date: 2023/9/4
*/
import React, { Component } from "react";
import { WeaDialog, WeaLocaleProvider, WeaSearchGroup, WeaTableEdit, WeaTools } from "ecCom";
import { Button, message, Spin } from "antd";
import {
editSingleSalaryItem,
getSalaryItemAdjustBeforeValue,
getSalaryItemForm,
getSingleSalaryItemInfo,
saveSalaryItem
} from "../../apis/archive";
import { inject, observer } from "mobx-react";
import { adjCondition } from "./columns";
import { getDomkes, getSearchs } from "../../util";
import moment from "moment";
const { getLabel } = WeaLocaleProvider;
const getKey = WeaTools.getKey;
const APIFox = {
save: saveSalaryItem,
edit: editSingleSalaryItem,
saveForm: getSalaryItemForm,
editForm: getSingleSalaryItemInfo
};
@inject("salaryFileStore")
@observer
class SalaryArchiveEditAdjLogRecordDialog extends Component {
constructor(props) {
super(props);
this.state = {
conditions: [], loading: false, saveLoading: false,
salaryArchiveItemDetail: {}, canOperator: false
};
}
componentWillReceiveProps(nextProps, nextContext) {
const { id, visible, salaryFileStore: { adjForm, initAdjForm } } = nextProps;
if (nextProps.visible !== this.props.visible && visible) {
this.getSingleSalaryItemInfo(nextProps);
} else {
adjForm.resetForm();
initAdjForm();
}
}
getSingleSalaryItemInfo = (props) => {
const { salaryFileStore: { adjForm }, id, salaryArchiveId: salaryArchiveItemId } = props;
this.setState({ loading: true });
APIFox[id ? "editForm" : "saveForm"](id ? { id } : { salaryArchiveItemId })
.then(({ status, data }) => {
this.setState({ loading: false });
if (status) {
const { salaryArchiveItemForm, salaryArchiveItemDetail, canOperator } = data;
const { adjustReasonList } = salaryArchiveItemForm;
this.setState({
canOperator, salaryArchiveItemDetail,
conditions: _.map(adjCondition, item => {
return {
...item,
title: getLabel(111, "调薪信息"),
items: _.map(item.items, o => {
if (getKey(o) === "adjustReason") {
return {
...o,
options: _.map(adjustReasonList, it => ({ key: it.id, showname: it.content }))
};
}
return { ...o };
})
};
})
}, () => {
adjForm.initFormFields(this.state.conditions);
_.map(getDomkes(this.state.conditions), domkey => {
adjForm.updateFields({
[domkey]: salaryArchiveItemForm[domkey] || ""
});
});
});
}
}).catch(() => this.setState({ loading: false }));
};
getSalaryItemAdjustBeforeValue = (salaryItemId) => {
const payload = {
salaryArchiveId: this.props.salaryArchiveId,
salaryItemId
};
getSalaryItemAdjustBeforeValue(payload).then(({ status, data }) => {
if (status) {
const { salaryArchiveItemDetail } = this.state;
const { list } = salaryArchiveItemDetail;
this.setState({
salaryArchiveItemDetail: {
...salaryArchiveItemDetail,
list: _.map(list, o => {
if (o.salaryItem === salaryItemId) {
return { ...o, salaryBefore: data };
}
return { ...o };
})
}
});
}
});
};
save = () => {
const { salaryFileStore: { adjForm, fetchSingleSalaryItemList, getArchiveForm } } = this.props;
const { pass } = this.tableEdit.refs.edit.doRequiredCheck();
adjForm.validateForm().then(f => {
if (f.isValid) {
if (!pass) return;
const { salaryArchiveId, id: salaryArchiveItemId } = this.props;
const { salaryArchiveItemDetail, canOperator } = this.state;
const { list } = salaryArchiveItemDetail;
let payload = {
...adjForm.getFormParams(), salaryArchiveId,
effectiveTime: moment(new Date(adjForm.getFormParams().effectiveTime)).format("YYYY-MM-DD"),
salaryArchiveItems: _.map(list, o => ({ salaryItemId: o.salaryItem, adjustValue: o.adjustAfter }))
};
if (salaryArchiveItemId) {
payload = { ...payload, canOperator, salaryArchiveItemId };
}
this.setState({ saveLoading: true });
APIFox[salaryArchiveItemId ? "edit" : "save"](payload).then(({ status, errormsg }) => {
this.setState({ saveLoading: false });
if (status) {
message.success(getLabel(22619, "保存成功!"));
this.props.onCancel();
fetchSingleSalaryItemList({ salaryArchiveId });
getArchiveForm(salaryArchiveId);
} else {
message.error(errormsg);
}
}).catch(() => this.setState({ saveLoading: false }));
} else {
f.showErrors();
}
});
};
render() {
const { salaryFileStore: { adjForm }, id } = this.props;
const { loading, saveLoading, salaryArchiveItemDetail, conditions } = this.state;
const { salaryItemList, list } = salaryArchiveItemDetail;
const adjColumns = [
{
title: "薪资项目",
dataIndex: "salaryItem",
key: "salaryItem",
com: [{
options: _.map(salaryItemList, o => ({ key: o.id, showname: o.content })),
type: "SELECT", viewAttr: id ? 1 : 3, key: "salaryItem",
onChange: (v) => this.getSalaryItemAdjustBeforeValue(v)
}],
colSpan: 1,
width: "40%"
},
{
title: getLabel(111, "调整前"),
dataIndex: "salaryBefore",
key: "salaryBefore",
com: [{ label: "", type: "INPUT", viewAttr: 1, key: "salaryBefore" }],
colSpan: 1,
width: "30%"
},
{
title: getLabel(111, "调整后"),
dataIndex: "adjustAfter",
key: "adjustAfter",
com: [{ label: "", type: "INPUTNUMBER", otherParams: { precision: 3 }, viewAttr: 3, key: "adjustAfter" }],
colSpan: 1,
width: "30%"
}
];
return (
<WeaDialog
{...this.props}
scalable hasScroll className="declareResultDialog" initLoadCss
style={{
width: 800,
height: 406.6,
minHeight: 200,
minWidth: 380,
maxHeight: "80%",
maxWidth: "80%",
overflow: "hidden",
transform: "translate(0px, 0px)"
}}
buttons={[<Button type="primary" onClick={this.save} loading={saveLoading}>{getLabel(537558, "保存")}</Button>]}
>
<div className="adjLogRecordDialogContent">
{
!loading ? <React.Fragment>
{getSearchs(adjForm, conditions, 1)}
<WeaSearchGroup title={getLabel(543333, "调薪明细")} showGroup needTigger={false}>
<WeaTableEdit
ref={dom => this.tableEdit = dom} deleteConfirm
columns={adjColumns} datas={list} showCopy={false}
showAdd={!id} showDelete={!id}
onChange={o => this.setState({
salaryArchiveItemDetail: {
...salaryArchiveItemDetail, list: o
}
})}
/>
</WeaSearchGroup>
</React.Fragment> : <div className="empty"><Spin/></div>
}
</div>
</WeaDialog>
);
}
}
export default SalaryArchiveEditAdjLogRecordDialog;

View File

@ -1,10 +1,11 @@
import React from "react";
import { Menu, message, Modal, Popover } from "antd";
import { message, Modal } from "antd";
import { WeaLocaleProvider, WeaTable } from "ecCom";
import { inject, observer } from "mobx-react";
import ChangeSalaryModal from "./changeSalaryModal";
import { deleteSalaryItem } from "../../apis/archive";
import UnifiedTable from "../../components/UnifiedTable";
import SalaryArchiveEditAdjLogRecord from "./salaryArchiveEditAdjLogRecord";
const { getLabel } = WeaLocaleProvider;
@inject("salaryFileStore")
@observer
export default class SalaryItemChangeList extends React.Component {
@ -12,6 +13,9 @@ export default class SalaryItemChangeList extends React.Component {
super(props);
this.state = {
changeSalaryVisible: false,
adjLogRecordDialog: {
visible: false, title: "", id: "", salaryArchiveId: ""
},
recordId: ""
};
this.searchParams = {};
@ -25,11 +29,11 @@ export default class SalaryItemChangeList extends React.Component {
handleEdit = (record) => {
this.setState({
recordId: record.id
}, () => {
this.setState({
changeSalaryVisible: true
});
adjLogRecordDialog: {
...this.state.adjLogRecordDialog,
visible: true, title: getLabel(542686, "调薪"), id: record.id,
salaryArchiveId: this.props.id
}
});
};
deleteSalaryItem = (salaryArchiveItemId) => {
@ -58,22 +62,35 @@ export default class SalaryItemChangeList extends React.Component {
const { salaryFileStore: { singleSalaryItemList }, selectedKey } = this.props;
let columns = [];
if (singleSalaryItemList.columns) {
columns = [...singleSalaryItemList.columns];
columns = _.map([...singleSalaryItemList.columns], o => {
const { dataIndex } = o;
if (dataIndex === "adjustItem") {
return { ...o, width: 100, fixed: "left", render: text => (<span title={text}>{text}</span>) };
}
let width = "";
switch (o) {
case "adjustBefore":
case "adjustAfter":
case "operateTime":
width = "20%";
break;
case "effectiveTime":
width = "15%";
break;
default:
width = "10%";
break;
}
return { ...o, width, render: text => (<span title={text}>{text}</span>) };
});
if (selectedKey === "fixed") {
columns = [...columns, {
dataIndex: "operate",
title: "操作",
dataIndex: "operate", fixed: "right", width: 120, title: "操作",
render: (text, record) => {
return <div className="optWrapper">
<a href="javascript:void(0);" className="mr10" onClick={() => this.handleEdit(record)}>编辑</a>
<Popover
overlayClassName="moreIconWrapper"
placement="bottomRight"
content={<Menu onClick={(e) => this.deleteSalaryItem(record.id)}>
<Menu.Item key="delete">删除</Menu.Item>
</Menu>} title="">
<i className="icon-coms-more"/>
</Popover>
<a href="javascript:void(0);"
onClick={() => this.deleteSalaryItem(record.id)}>{getLabel(535052, "删除")}</a>
</div>;
}
}];
@ -90,45 +107,29 @@ export default class SalaryItemChangeList extends React.Component {
}
render() {
const { salaryFileStore } = this.props;
const { salaryFileStore } = this.props, { adjLogRecordDialog } = this.state;
const { singleSalaryItemList } = salaryFileStore;
const pageInfo = { current: singleSalaryItemList.pageNum, pageSize: 10, total: singleSalaryItemList.total };
const pagination = {
...pageInfo,
showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`,
showQuickJumper: true,
onChange: current => this.handlePageChange(current)
};
return (
<div>
<UnifiedTable
columns={
_.map(this.getColumns(), item => {
if (item.dataIndex !== "operate") {
return {
...item,
render: (text) => {
return <span className="ellipsis" title={text}>{text}</span>;
}
};
}
return { ...item };
})
}
dataSource={singleSalaryItemList.list ? singleSalaryItemList.list : []}
pagination={{
onChange: (value) => {
this.handlePageChange(value);
},
total: singleSalaryItemList.total,
showTotal: (total) => `${total}`,
current: singleSalaryItemList.pageNum
}}
xWidth={this.getColumns().length * 100}
<WeaTable
columns={this.getColumns()} dataSource={singleSalaryItemList.list ? singleSalaryItemList.list : []}
pagination={pagination} scroll={{ x: 800 }} className="adjustItem-layout"
/>
<SalaryArchiveEditAdjLogRecord
{...adjLogRecordDialog}
onCancel={() => this.setState({
adjLogRecordDialog: {
adjLogRecordDialog, visible: false, title: "", id: "", salaryArchiveId: ""
}
})}
/>
{
this.state.changeSalaryVisible && <ChangeSalaryModal
currentId={this.props.id}
recordId={this.state.recordId}
visible={this.state.changeSalaryVisible}
onCancel={() => {
this.setState({ changeSalaryVisible: false });
}}
/>
}
</div>
);
}

View File

@ -155,6 +155,27 @@ export const valTakeOptions = [
{ key: "2", showname: "公式" },
{ key: "3", showname: "SQL" }
];
export const salarySetConditions = [
{
items: [{
colSpan: 1,
checkbox: false,
checkboxValue: false,
conditionType: "SELECT",
domkey: ["salarySobIds"],
fieldcol: 18,
label: "薪资账套",
lanId: 538010,
labelcol: 6,
options: [],
rules: "required|string",
multiple: true,
viewAttr: 3
}],
title: "",
defaultshow: true
}
];

View File

@ -9,6 +9,7 @@ import { columns } from "./columns";
import SlideModalTitle from "../../components/slideModalTitle";
import CustomSalaryItemSlide from "./customSalaryItemSlide";
import CustomPaginationTable from "../../components/customPaginationTable";
import SyncToSalaryAccountSetDialog from "./syncToSalaryAccountSetDialog";
import "../socialSecurityBenefits/programme/index.less";
const { getLabel } = WeaLocaleProvider;
@ -25,7 +26,8 @@ export default class SalaryItem extends React.Component {
searchValue: "",
formalModalVisible: false,
searchParams: { current: 1, pageSize: 10, total: 0 },
selectedRowKeys: []
selectedRowKeys: [],
syncSalarySetDialog: { visible: false, title: "", id: "" }
};
columns.map(item => {
if (item.dataIndex == "refere") {
@ -69,7 +71,10 @@ export default class SalaryItem extends React.Component {
onEditItem = (record, isedit) => {
this.record = record;
const { salaryItemStore: { getItemForm, setEditSlideVisible } } = this.props;
this.setState({ editable: isedit, isAdd: false });
this.setState({
editable: isedit, isAdd: false,
syncSalarySetDialog: { ...this.state.syncSalarySetDialog, id: record.id }
});
getItemForm(record.id).then(() => {
setEditSlideVisible(true);
}).catch(({ errormsg }) => {
@ -308,6 +313,15 @@ export default class SalaryItem extends React.Component {
];
} else if (this.state.editable) {
arrList = [
<Button type="ghost"
onClick={() => this.setState({
syncSalarySetDialog: {
...this.state.syncSalarySetDialog,
visible: true,
title: getLabel(111, "请选择薪资账套")
}
})}
>{getLabel(111, "同步到薪资账套")}</Button>,
<Button type="primary" onClick={() => {
handleSlideSave(false);
}}>保存</Button>
@ -365,6 +379,15 @@ export default class SalaryItem extends React.Component {
</WeaNewScroll>
</div>
</WeaTop>
<SyncToSalaryAccountSetDialog
{...this.state.syncSalarySetDialog}
onCancel={() => this.setState({
syncSalarySetDialog: {
...this.state.syncSalarySetDialog,
visible: false, id: "", title: ""
}
})}
/>
{
systemItemVisible &&

View File

@ -102,3 +102,43 @@
}
}
}
.salarySetDialog {
.salarySetDialogContent {
.wea-select, .ant-select, .ant-select-selection {
width: 100%;
}
.wea-select .wea-select-input .arrow {
position: absolute;
right: 4px;
top: 8px;
color: #666;
}
.wea-select .wdb {
word-break: break-all !important;
word-wrap: break-word !important;
}
.wea-select .wea-select-input {
height: 30px;
white-space: nowrap;
min-width: 100px;
max-width: 345px;
width: 100%;
display: inline-block;
padding: 4px 17px 4px 4px;
position: relative;
min-height: 30px;
border: 1px solid #d9d9d9;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;
overflow: hidden;
}
}
}

View File

@ -36,7 +36,6 @@ class SalaryItemForm extends Component {
const { key } = item;
switch (key) {
case "useDefault":
case "sortedIndex":
case "dataType":
case "description":
return {
@ -44,6 +43,8 @@ class SalaryItemForm extends Component {
viewAttr: (!isLedger && ((editable && record.canEdit) || isAdd)) ? 2 : 1,
display: !isLedger
};
case "sortedIndex":
return { ...item };
case "useInEmployeeSalary":
return {
...item,

View File

@ -0,0 +1,95 @@
/*
* Author: 黎永顺
* name: 同步到薪资账套
* Description:
* Date: 2023/8/31
*/
import React, { Component } from "react";
import { inject, observer } from "mobx-react";
import { WeaDialog, WeaLocaleProvider } from "ecCom";
import { Button, message } from "antd";
import { getSearchs } from "../../util";
import { getSalarySobBySalaryItem, syncSalaryItemToSalarySobItem } from "../../apis/item";
import { salarySetConditions } from "./columns";
const getLabel = WeaLocaleProvider.getLabel;
@inject("salaryItemStore")
@observer
class SyncToSalaryAccountSetDialog extends Component {
constructor(props) {
super(props);
this.state = {
loading: false,
conditions: []
};
}
componentWillReceiveProps(nextProps, nextContext) {
const { salaryItemStore: { salarySetform } } = nextProps;
if (nextProps.visible !== this.props.visible && nextProps.visible) this.getSalarySobBySalaryItem(nextProps);
if (nextProps.visible !== this.props.visible && !nextProps.visible) salarySetform.resetForm();
}
getSalarySobBySalaryItem = (props) => {
const { id, salaryItemStore: { salarySetform } } = props;
getSalarySobBySalaryItem({ id }).then(({ status, data }) => {
if (status) {
this.setState({
conditions: _.map(salarySetConditions, item => {
return {
...item,
items: _.map(item.items, o => ({
...o,
options: _.map(data, it => ({ key: it.id, showname: it.content }))
}))
};
})
}, () => {
salarySetform.initFormFields(this.state.conditions);
});
}
});
};
save = () => {
const { salaryItemStore: { salarySetform }, id: salaryItemId } = this.props;
salarySetform.validateForm().then(f => {
if (f.isValid) {
const { salarySobIds } = salarySetform.getFormParams();
this.setState({ loading: true });
syncSalaryItemToSalarySobItem({ salaryItemId, salarySobIds: salarySobIds.split(",") })
.then(({ status, errormsg }) => {
this.setState({ loading: false });
if (status) {
message.success(getLabel(38462, "同步成功!"));
this.props.onCancel();
} else {
message.error(errormsg || getLabel(81556, "同步失败!"));
}
}).catch(() => this.setState({ loading: false }));
} else {
f.showErrors();
}
});
};
render() {
const { salaryItemStore: { salarySetform } } = this.props;
const { conditions } = this.state;
return (
<WeaDialog
{...this.props} className="salarySetDialog" initLoadCss
style={{ width: 550 }}
buttons={[<Button type="primary" onClick={this.save}
loading={this.state.loading}>{getLabel(537558, "确定")}</Button>]}
>
<div className="salarySetDialogContent">
{getSearchs(salarySetform, conditions, 1)}
</div>
</WeaDialog>
);
}
}
export default SyncToSalaryAccountSetDialog;

View File

@ -26,5 +26,12 @@ export const tabCondition = [
showcount: true,
title: "停缴员工",
viewcondition: "stop"
}
},
{
color: "#000000",
groupid: "ext",
showcount: true,
title: "非系统人员",
viewcondition: "ext"
},
];

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, WeaLocaleProvider, WeaNewScroll, WeaSlideModal, WeaTab, WeaTop } from "ecCom";
import { WeaCheckbox, WeaHelpfulTip, WeaLocaleProvider, WeaNewScroll, WeaSlideModal, WeaTab, WeaTop } from "ecCom";
import { getSearchs, renderLoading } from "../../../util";
import BaseForm from "./baseForm";
import SlideModalTitle from "../../../components/slideModalTitle";
@ -14,11 +14,16 @@ import * as API from "../../../apis/welfareArchive";
import ImportModal from "../../../components/importModal";
import TipLabel from "../../../components/TipLabel";
import UnifiedTable from "../../../components/UnifiedTable";
import { convertToUrlString } from "../../../util/url";
import { convertToUrlString, getURLParameters } from "../../../util/url";
import { salaryArchiveDelete } from "../../../apis/payrollFiles";
import ImportDialog from "../../../components/importDialog";
import "./index.less";
const getLabel = WeaLocaleProvider.getLabel;
const APILIST = {
runStatuses: API["queryList"],
extWelArchiveList: API["getExtTable"]
};
@inject("archivesStore", "taxAgentStore")
@observer
export default class Archives extends React.Component {
@ -46,14 +51,20 @@ export default class Archives extends React.Component {
stayAdd: 0,
paying: 0,
stayDel: 0,
stopPay: 0
stopPay: 0,
ext: 0
},
pageInfo: {
current: 1,
pageSize: 10,
total: 0
},
salaryArchiveDelete: "" //待定薪、停薪员工 是否允许删除薪资档案 0 否, 1
salaryArchiveDelete: "", //待定薪、停薪员工 是否允许删除薪资档案 0 否, 1
importDialog: {
visible: false, title: "", nextloading: false,
link: "", importResult: {}, imageId: "",
previewUrl: "/api/bs/hrmsalary/scheme/preview"
}
};
this.record = {};
}
@ -78,7 +89,7 @@ export default class Archives extends React.Component {
const formParams = form.getFormParams() || {};
const payload = { ...pageInfo };
this.setState({ loading: { ...loading, query: true } });
API.queryList({ ...formParams, ...payload, ...params }).then(({ data, status }) => {
APILIST[_.keys(params)[0]]({ ...formParams, ...payload, ...params }).then(({ data, status }) => {
this.setState({ loading: { ...loading, query: false } });
if (status) {
const { pageInfo: paganition, columns, datas: dataSource } = data;
@ -309,8 +320,19 @@ export default class Archives extends React.Component {
// 导入
handleImport = (params) => {
const { archivesStore: { importBatch } } = this.props;
const { runStatus } = this.state;
importBatch({ ...params, runStatus });
const { runStatus, importDialog } = this.state;
this.setState(({
importDialog: {
...importDialog, nextloading: true, ...params
}
}));
importBatch({ ...params, runStatus }).then(({ status, data }) => {
this.setState(({
importDialog: {
...importDialog, nextloading: false, importResult: data, ...params
}
}));
});
};
// 导入完成
@ -375,9 +397,12 @@ export default class Archives extends React.Component {
case "suspend":
this.queryList({ runStatuses: ["3"] });
break;
default:
case "stop":
this.queryList({ runStatuses: ["4", "5"] });
break;
default:
this.queryList({ extWelArchiveList: true });
break;
}
};
handleMenuBtnClick = () => {
@ -564,13 +589,15 @@ export default class Archives extends React.Component {
{/*<div>4、数据进入【待减员】规则的第四种情况下若还需要在当前个税扣缴义务人下进行缴纳的话当前该员工的【待减员】数据进行【删除待办】操作即可若不在该个税扣缴义务人下继续缴纳维护好最后缴纳月后进行【减员】操作员工进入【停缴员工】</div>*/}
</div>;
break;
default:
case "stop":
dom = <div>
<div>1不需要缴纳社保福利的员工保存在停缴员工</div>
{/*<div>2、【停缴员工】点击取消停缴数据会回退到上次的位置从【待减员】减员到停缴员工的点击停缴返回到【在缴员工】不返回到【待减员】</div>*/}
{/*<div>3、若员工的社保福利从一个个税扣缴义务人下转到另一个个税扣缴义务人下去缴纳则在转后的个税扣缴义务人的【待增员】中进行增员操作成功后员工进入待【在缴员工】而在原个税扣缴义务人下的【停缴员工】中该员工数据将会被删除是否开启分权员工的档案数据都只保存一份</div>*/}
</div>;
break;
default:
break;
}
return dom;
};
@ -584,7 +611,8 @@ export default class Archives extends React.Component {
dataSource: dataSourceActive,
pageInfo,
tabCount,
loading
loading,
importDialog
} = this.state;
const {
form, condition, showSearchAd, setShowSearchAd,
@ -719,7 +747,7 @@ export default class Archives extends React.Component {
} type="ghost">
导出全部
</Dropdown.Button>
] : [
] : selectedKey === "stop" ? [
<WeaHelpfulTip
width={300}
title={<CancelHelpfulDiv/>}
@ -733,6 +761,15 @@ export default class Archives extends React.Component {
} type="ghost">
导出全部
</Dropdown.Button>
] : [<Button type="primary"
onClick={() => this.setState(({
runStatus: "2",
importDialog: {
...importDialog,
visible: true, title: getLabel(111, "非系统人员导入"),
link: "/api/bs/hrmsalary/scheme/template/export?extWelArchiveList=true"
}
}))}>导入</Button>
];
const pagination = {
@ -775,6 +812,7 @@ export default class Archives extends React.Component {
keyParam="viewcondition" //主键
selectedKey={selectedKey}
onChange={this.handleChangeTab}
autoCalculateWidth
searchType={["base", "advanced"]} // base基础搜索框 advanced显示高级搜索按钮
showSearchAd={showSearchAd} // 是否展开高级搜索面板
setShowSearchAd={bool => setShowSearchAd(bool)} //高级搜索面板受控
@ -807,7 +845,7 @@ export default class Archives extends React.Component {
xWidth={this.getColumns().length * 120}
/>
{
!_.isEmpty(this.getColumns()) &&
!_.isEmpty(this.getColumns()) && selectedKey !== "ext" &&
<TipLabel>{this.getTipChildren()}</TipLabel>
}
</WeaNewScroll>
@ -878,6 +916,36 @@ export default class Archives extends React.Component {
this.setState({ selectedTab: "0" });
})}/>
}
<ImportDialog
{...importDialog}
onCancel={(isFresh) => this.setState({
importDialog: {
...importDialog,
visible: false, title: "", nextloading: false,
link: "", importResult: {}, imageId: ""
}
}, () => isFresh && this.query())}
onResetImportResult={() => this.setState(({
importDialog: { ...importDialog, importResult: {}, imageId: "" }
}))}
exportDataDom={
<WeaCheckbox content={getLabel(543208, "导出现有数据")}
value={getURLParameters(importDialog.link).exportData === "true" ? "1" : "0"}
helpfulTip={getLabel(111, "提示:建议先导出现有最新数据,修改后再导入")}
onChange={val => {
const formParams = form.getFormParams() || {};
const payload = { exportData: val === "1", ...formParams };
this.setState(({
importDialog: {
...importDialog,
link: `/api/bs/hrmsalary/scheme/template/export?extWelArchiveList=true&${convertToUrlString(payload)}`
}
}));
}}
/>
}
nextCallback={imageId => this.handleImport({ imageId })}
/>
{
this.state.importVisible && <ImportModal
init={() => {

View File

@ -4,10 +4,6 @@
height: 100%;
background: #f6f6f6;
.wea-new-top-req-wapper .wea-new-top-req-main {
background: #f6f6f6 !important;
}
.wea-new-top-req-wapper .wea-new-top-req {
z-index: 0 !important;
}

View File

@ -336,7 +336,7 @@ export class ArchivesStore {
API.importBatch(params).then(res => {
if (res.status) {
this.importResult = res.data;
resolve();
resolve(res);
} else {
message.error(res.errormsg || "导入失败", 1);
reject();

View File

@ -3,6 +3,7 @@ import { message } from "antd";
import { WeaForm, WeaTableNew } from "comsMobx";
import * as API from "../apis/calculate";
import { toDecimal_n } from "../util";
const { TableStore } = WeaTableNew;
@ -492,7 +493,7 @@ export class calculateStore {
..._.map(cur.salaryItems, it => {
return {
salaryItemId: it.salaryItemId,
resultValue: it.resultValue
resultValue: (it.dataType === "number" && !!it.resultValue) ? toDecimal_n(it.resultValue, it.pattern || 2) : it.resultValue
};
})
];
@ -501,7 +502,7 @@ export class calculateStore {
const issuedAndReissueItems = this.acctresultDetailForm.issuedAndReissueItems.map(item => {
let record = {};
record.salaryItemId = item.salaryItemId;
record.resultValue = item.resultValue;
record.resultValue = (item.dataType === "number" && !!item.resultValue) ? toDecimal_n(item.resultValue, item.pattern || 2) : item.resultValue;
return record;
});

View File

@ -9,6 +9,9 @@ import { notNull } from "../util/validate";
const { TableStore } = WeaTableNew;
export class salaryFileStore {
@observable adjForm = new WeaForm(); // 调薪form
@observable tableStore = new TableStore(); // new table
@observable form = new WeaForm(); // nrew 一个form
@observable condition = []; // 存储后台得到的form数据
@ -41,6 +44,8 @@ export class salaryFileStore {
setSalaryIncreaseUrl = data => (this.salaryIncreaseUrl = data);
@action("设置薪资档案项")
setAdjustSalaryItems = data => (this.adjustSalaryItems = data);
@action("调薪初始化form")
initAdjForm = () => (this.adjForm = new WeaForm());
// ** 设置导入参数 start **
@action
setPreviewDataSource = (previewDataSource) => {

View File

@ -8,6 +8,8 @@ import { notNull } from "../util/validate";
const { TableStore } = WeaTableNew;
export class SalaryItemStore {
@observable salarySetform = new WeaForm(); //同步薪资账套form
@observable tableStore = new TableStore(); // new table
@observable sysListTableStore = new TableStore();
@observable form = new WeaForm(); // nrew 一个form

View File

@ -107,6 +107,30 @@ export const format_with_regex = (number) => {
});
};
export const getDomkes = (conditions) => {
return _.map(conditions[0].items, it => it.domkey[0]);
};
export const padding0 = (num, length) => {
for (let len = ("" + num).length; len < length; len++) {
num = "0" + num;
}
return "0." + num;
};
export const toDecimal_n = (x, num) => {
if (isNaN(parseFloat(x))) return false;
let f = Math.round(x * 100) / 100;
let s = f.toString();
let rs = s.indexOf(".");
if (rs < 0) {
rs = s.length;
s += ".";
}
while (s.length <= rs + num) {
s += "0";
}
return s;
};
/**
* 打印指定dom内容
* @param printParams

View File

@ -1,11 +1,10 @@
// export const getQueryString = (name) => {
// let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
// let r = window.location.hash.split("?")[1].match(reg);
// if (r != null) {
// return decodeURIComponent(r[2]);
// };
// return null;
// }
export const getURLParameters = (url) =>
(url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
(a, v) => (
(a[v.slice(0, v.indexOf("="))] = v.slice(v.indexOf("=") + 1)), a
),
{}
);
export const getQueryString = (variable) => {
let split = window.location.hash.split("?");