diff --git a/pc4mobx/hrmSalary/apis/item.js b/pc4mobx/hrmSalary/apis/item.js index ab4ff6c2..180b22d0 100644 --- a/pc4mobx/hrmSalary/apis/item.js +++ b/pc4mobx/hrmSalary/apis/item.js @@ -1,5 +1,5 @@ import { WeaTools } from "ecCom"; -import { postFetch } from "../util/request"; +import { postExportFetch, postFetch } from "../util/request"; // 薪资项目-获取列表 export const getItemList = params => { @@ -84,3 +84,19 @@ export const getSalarySobBySalaryItem = params => { export const syncSalaryItemToSalarySobItem = params => { return postFetch("/api/bs/hrmsalary/salaryitem/syncSalaryItemToSalarySobItem", params); }; + +// 导出薪资项目 +export const exportSalaryitem = (params) => { + return postExportFetch("/api/bs/hrmsalary/salaryitem/export", params); +}; +// 下载模板 +export const downloadTemplate = (params) => { + return postExportFetch("/api/bs/hrmsalary/salaryitem/downloadTemplate", params); +}; + +// 导入薪资项目 +export const importSalaryitem = (params) => { + return postFetch("/api/bs/hrmsalary/salaryitem/import", params); +}; + + diff --git a/pc4mobx/hrmSalary/apis/ruleconfig.js b/pc4mobx/hrmSalary/apis/ruleconfig.js index f52953bb..eebd320f 100644 --- a/pc4mobx/hrmSalary/apis/ruleconfig.js +++ b/pc4mobx/hrmSalary/apis/ruleconfig.js @@ -79,3 +79,11 @@ export const saveSalarySendFeedback = (params) => { export const exportDataReport = (params) => { return postExportFetch("/api/bs/hrmsalary/report/statistics/report/exportData", params); }; +//迁入配置 +export const uploadConfig = (params) => { + return postFetch("/api/bs/hrmsalary/sys/uploadConfig", params); +}; +//迁入配置 +export const downloadConfig = (params) => { + return postExportFetch("/api/bs/hrmsalary/sys/downloadConfig", params); +}; diff --git a/pc4mobx/hrmSalary/apis/variableSalary.js b/pc4mobx/hrmSalary/apis/variableSalary.js new file mode 100644 index 00000000..8cd818b5 --- /dev/null +++ b/pc4mobx/hrmSalary/apis/variableSalary.js @@ -0,0 +1,53 @@ +import { WeaTools } from "ecCom"; +import { postExportFetch, postFetch } from "../util/request"; + +//浮动薪酬项目列表 +export const getVariableSalaryItemList = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/listPage", params); +}; +//删除浮动薪酬项目 +export const deleteVariableSalaryItem = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/delete", params); +}; +//获取浮动薪酬项目详情 +export const getVariableSalaryItemDetail = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/getDetail", params); +}; +//保存/更新 浮动薪酬项目 +export const saveVariableSalaryItem = params => { + return postFetch("/api/bs/hrmsalary/variableSalaryItem/save", params); +}; + +//创建浮动薪酬档案时获取项目信息 +export const getCreateForm = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/getCreateForm", params); +}; +//创建浮动薪酬档案 +export const createVariableSalary = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/createData", params); +}; +//创建浮动薪酬档案 +export const getVariableSalaryList = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/list", params); +}; +//导入浮动薪酬档案 +export const importVariableSalary = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/importData", params); +}; +//删除浮动薪酬档案 +export const deleteVariableSalary = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/deleteSelectData", params); +}; +//获取浮动薪酬档案明细 +export const getVariableSalaryDetail = params => { + return postFetch("/api/bs/hrmsalary/variableSalary/getDetail", params); +}; +// 获取当前管理员下的所有的个税扣缴义务人 +export const getAdminTaxAgentList = () => { + return WeaTools.callApi("/api/bs/hrmsalary/siaccount/getAdminTaxAgentList", "get", {}); +}; +// 浮动薪酬档案导出 +export const exportVariableSalary = (params) => { + return postExportFetch("/api/bs/hrmsalary/variableSalary/export", params); +}; + diff --git a/pc4mobx/hrmSalary/components/importDialog/components/impStep1.js b/pc4mobx/hrmSalary/components/importDialog/components/impStep1.js index 209125fb..b2ac42b0 100644 --- a/pc4mobx/hrmSalary/components/importDialog/components/impStep1.js +++ b/pc4mobx/hrmSalary/components/importDialog/components/impStep1.js @@ -33,7 +33,8 @@ class ImpStep1 extends Component { multiple: false, action: "/api/doc/upload/uploadFile", fileList, - onChange: this.handleChange + onChange: this.handleChange, + ...this.props.customDragger }; return (
@@ -45,7 +46,7 @@ class ImpStep1 extends Component { {this.props.importParams}
} -
{getLabel(543202, "导入Excel")}
+ {_.isEmpty(this.props.customDragger) &&
{getLabel(543202, "导入Excel")}
}

@@ -56,36 +57,39 @@ class ImpStep1 extends Component {

+ { + (_.isNil(this.props.customDragger) || this.props.customDragger.showOperateDesc) && + +
+
{getLabel(27577, "操作步骤")}
+

+ {`1. ${getLabel(30907, "第一步")},${getLabel(543205, "请选择导出的Excel文件或")}`}   + { + typeof this.props.link === "string" ? + {getLabel(543207, "点击这里下载模板")} : + {getLabel(543207, "点击这里下载模板")} + } +    + {this.props.exportDataDom} +

+

{`2. ${getLabel(543211, "第二步")},${getLabel(543212, "请一定要确定Excel文档中的格式是模板中的格式")},${getLabel(543213, "没有被修改掉")};`}

+

{`3. ${getLabel(543216, "第三步")},${getLabel(543215, "选择填写好的Excel文档")},${getLabel(543214, "点击“下一步”按钮进行数据预览")};`}

+

+ {`4. ${getLabel(543217, "第四步")},${getLabel(543218, "如果以上步骤和Excel文档正确的话")},${getLabel(543219, "导入成功会有提示")},${getLabel(543220, "数据会被正确导入")}。${getLabel(543221, "如果有问题")},${getLabel(543222, "则会提示Excel文档的错误之处")}。`} +

+
-
-
{getLabel(27577, "操作步骤")}
-

- {`1. ${getLabel(30907, "第一步")},${getLabel(543205, "请选择导出的Excel文件或")}`}   - { - typeof this.props.link === "string" ? - {getLabel(543207, "点击这里下载模板")} : - {getLabel(543207, "点击这里下载模板")} - } -    - {this.props.exportDataDom} -

-

{`2. ${getLabel(543211, "第二步")},${getLabel(543212, "请一定要确定Excel文档中的格式是模板中的格式")},${getLabel(543213, "没有被修改掉")};`}

-

{`3. ${getLabel(543216, "第三步")},${getLabel(543215, "选择填写好的Excel文档")},${getLabel(543214, "点击“下一步”按钮进行数据预览")};`}

-

- {`4. ${getLabel(543217, "第四步")},${getLabel(543218, "如果以上步骤和Excel文档正确的话")},${getLabel(543219, "导入成功会有提示")},${getLabel(543220, "数据会被正确导入")}。${getLabel(543221, "如果有问题")},${getLabel(543222, "则会提示Excel文档的错误之处")}。`} -

-
- -
-
{getLabel(543223, "Excel文件说明")}
-

{`1. ${getLabel(543224, "后缀名为xls或者xlsx")};`}

-

{`2. ${getLabel(543225, "数据请勿放在合并的单元格中")};`}

-

{`3. ${getLabel(543226, "账单月份格式必须为")}:YYYY-MM;`}

-
- +
+
{getLabel(543223, "Excel文件说明")}
+

{`1. ${getLabel(543224, "后缀名为xls或者xlsx")};`}

+

{`2. ${getLabel(543225, "数据请勿放在合并的单元格中")};`}

+

{`3. ${getLabel(543226, "账单月份格式必须为")}:YYYY-MM;`}

+
+
+ } ); } diff --git a/pc4mobx/hrmSalary/components/importDialog/components/impStep3.js b/pc4mobx/hrmSalary/components/importDialog/components/impStep3.js index df9575ef..82ed0adb 100644 --- a/pc4mobx/hrmSalary/components/importDialog/components/impStep3.js +++ b/pc4mobx/hrmSalary/components/importDialog/components/impStep3.js @@ -7,6 +7,7 @@ import React, { Component } from "react"; import { WeaLocaleProvider, WeaTable } from "ecCom"; import successImg from "../../importModal/success.svg"; +import MoveInResult from "./moveInResult"; const getLabel = WeaLocaleProvider.getLabel; @@ -16,32 +17,41 @@ class ImpStep3 extends Component { return (
{ - !_.isEmpty(importResult) ? -
-

-

- {getLabel(389249, "已导入")} - {importResult.successCount}   - {`${getLabel(30690, "条数据")},${getLabel(25009, "失败")}`} - {importResult.errorCount}  {getLabel(30690, "条数据")} -

-
: -
-

{getLabel(111, "导入失败")}

-
- } - { - (!_.isEmpty(importResult.errorNotice) || !_.isEmpty(importResult.errorData)) && - : + { - title: getLabel(25700, "错误信息"), - dataIndex: "message" + !_.isEmpty(importResult) ? +
+

+ { + importResult.successCount && +

+ {getLabel(389249, "已导入")} + {importResult.successCount}   + {`${getLabel(30690, "条数据")},${getLabel(25009, "失败")}`} + {importResult.errorCount}  {getLabel(30690, "条数据")} +

+ } +
: +
+

{getLabel(111, "导入失败")}

+
} - ]} - dataSource={importResult.errorData || importResult.errorNotice} pagination={false} - scroll={{ y: `calc(100vh - 387px)` }} - /> + { + !_.isEmpty(importResult) && (!_.isEmpty(importResult.errorNotice) || !_.isEmpty(importResult.errorData)) && + + } +
}
); diff --git a/pc4mobx/hrmSalary/components/importDialog/components/moveInResult.js b/pc4mobx/hrmSalary/components/importDialog/components/moveInResult.js new file mode 100644 index 00000000..2a6358a6 --- /dev/null +++ b/pc4mobx/hrmSalary/components/importDialog/components/moveInResult.js @@ -0,0 +1,56 @@ +/* + * 薪酬迁入结果展示 + * + * @Author: 黎永顺 + * @Date: 2024/8/16 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaTable } from "ecCom"; + +const getLabel = WeaLocaleProvider.getLabel; + +class MoveInResult extends Component { + downloadTxtfile = (value, type) => { + if (!value) return; + const element = document.createElement("a"); + const file = new Blob([value], { type: "text/plain" }); + element.href = URL.createObjectURL(file); + element.download = `导入${type}信息.txt`; + document.body.appendChild(element); + element.click(); + }; + + render() { + const { dataSource } = this.props; + return ( + ( + this.downloadTxtfile(record.success.join("\n"), getLabel(111, "成功"))}> + {record.success.length} + this.downloadTxtfile(record.warning.join("\n"), getLabel(111, "警告"))}>{record.warning.length} + this.downloadTxtfile(record.error.join("\n"), getLabel(111, "错误"))}>{record.error.length} + ) + } + ]} + dataSource={dataSource} pagination={false} bordered scroll={{ y: `calc(100vh - 333px)` }} + /> + ); + } +} + +export default MoveInResult; diff --git a/pc4mobx/hrmSalary/components/importDialog/index.js b/pc4mobx/hrmSalary/components/importDialog/index.js index 739fbf84..633df0ee 100644 --- a/pc4mobx/hrmSalary/components/importDialog/index.js +++ b/pc4mobx/hrmSalary/components/importDialog/index.js @@ -36,13 +36,17 @@ class Index extends Component { } renderChildren = () => { - const { current } = this.state, { importParams, link, excludeKey, importResult, exportDataDom = null } = this.props; + const { current } = this.state, { + importParams, link, excludeKey, importResult, + exportDataDom = null, customDragger + } = this.props; const scrollHeight = this.importRef ? this.importRef.state.height - 232 : 606.6; let CurrentDom = null; switch (current) { case 0: - CurrentDom = this.step1Ref = dom}/>; + CurrentDom = + this.step1Ref = dom}/>; break; case 1: CurrentDom = ; @@ -99,13 +103,16 @@ class Index extends Component { } const [file] = fileList; const { response } = file; - this.setState({ - current: this.state.current + 1, - fileid: response.data.fileid - }, () => { - !excludeKey && this.props.nextCallback && this.props.nextCallback(this.state.fileid); - excludeKey && this.props.nextUplaodCallback && this.props.nextUplaodCallback(this.state.fileid); - }); + if (!excludeKey) { + this.setState({ + current: this.state.current + 1, + fileid: response.data.fileid + }, () => { + this.props.nextCallback && this.props.nextCallback(this.state.fileid); + }); + } else { + this.props.nextUplaodCallback && this.props.nextUplaodCallback(response.data.fileid); + } } else { this.props.nextUplaodCallback && this.props.nextUplaodCallback(this.state.fileid); } diff --git a/pc4mobx/hrmSalary/index.js b/pc4mobx/hrmSalary/index.js index 8c605118..27bc86f2 100644 --- a/pc4mobx/hrmSalary/index.js +++ b/pc4mobx/hrmSalary/index.js @@ -52,6 +52,7 @@ import ExternalPersonManage from "./pages/externalPersonManage"; import AdjustSalaryManage from "./pages/adjustSalaryManage"; import TopologyMap from "./pages/topologyMap"; import SupplementaryCalc from "./pages/supplementaryCalc"; +import VariableSalary from "./pages/variableSalary"; import Layout from "./layout"; import stores from "./stores"; @@ -113,6 +114,7 @@ const DataAcquisition = (props) => props.children; // externalPersonManage 非系统人员管理 // adjustSalaryManage 档案管理 // supplementaryCalc 补算 +// variableSalary 浮动薪酬 const Routes = ( @@ -167,6 +169,7 @@ const Routes = ( + ); diff --git a/pc4mobx/hrmSalary/pages/appConfig/index.js b/pc4mobx/hrmSalary/pages/appConfig/index.js index a7b3d7ce..e13000eb 100644 --- a/pc4mobx/hrmSalary/pages/appConfig/index.js +++ b/pc4mobx/hrmSalary/pages/appConfig/index.js @@ -5,7 +5,17 @@ * Date: 2022-09-27 18:17:02 */ import React, { Component } from "react"; -import { WeaCheckbox, WeaDatePicker, WeaFormItem, WeaInput, WeaSearchGroup, WeaTop } from "ecCom"; +import { + WeaCheckbox, + WeaDatePicker, + WeaFormItem, + WeaInput, + WeaLoadingGlobal, + WeaLocaleProvider, + WeaSearchGroup, + WeaTop +} from "ecCom"; +import MoveInDialog from "./moveInDialog"; import * as API from "../../apis/ruleconfig"; import { Button, message } from "antd"; import "./index.less"; @@ -18,6 +28,7 @@ const Input = (props) => { ); }; +const getLabel = WeaLocaleProvider.getLabel; class AppConfig extends Component { constructor(props) { @@ -28,7 +39,8 @@ class AppConfig extends Component { isLog: "0", openFormulaForcedEditing: "0", version: "", - loading: false + loading: false, + moveInDialog: { visible: false, title: getLabel(111, "数据迁入") } }; } @@ -62,10 +74,29 @@ class AppConfig extends Component { } }); }; + handleOperate = (type) => { + switch (type) { + case "import": + this.setState({ moveInDialog: { ...this.state.moveInDialog, visible: true } }); + break; + case "export": + WeaLoadingGlobal.start(); + const promise = API.downloadConfig(); + break; + default: + break; + } + }; render() { - const { openAcctResultSum, displayEmpInfoReport, loading, openFormulaForcedEditing, isLog, version } = this.state; - const btns = []; + const { + openAcctResultSum, displayEmpInfoReport, loading, openFormulaForcedEditing, isLog, version, moveInDialog + } = this.state; + const btns = [ + , + , + + ]; const items = [ { com: Input({ @@ -115,6 +146,8 @@ class AppConfig extends Component { buttons={btns} /> + this.setState({ moveInDialog: { ...this.state.moveInDialog, visible: false } })}/> ); } diff --git a/pc4mobx/hrmSalary/pages/appConfig/moveInDialog.js b/pc4mobx/hrmSalary/pages/appConfig/moveInDialog.js new file mode 100644 index 00000000..afdf3765 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/appConfig/moveInDialog.js @@ -0,0 +1,73 @@ +/* + * 数据迁入 + * + * @Author: 黎永顺 + * @Date: 2024/8/12 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaLocaleProvider } from "ecCom"; +import { message } from "antd"; +import ImportDialog from "../../components/importDialog"; +import * as API from "../../apis/ruleconfig"; + +const getLabel = WeaLocaleProvider.getLabel; + +class MoveInDialog extends Component { + constructor(props) { + super(props); + this.state = { + importDialog: { + nextloading: false, importResult: {}, imageId: "", + customDragger: { showOperateDesc: false, accept: ".xml" } + } + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && !nextProps.visible) { + this.setState({ + importDialog: { + ...this.state.importDialog, + importResult: {}, imageId: "", + customDragger: { showOperateDesc: false, accept: ".xml" } + } + }); + } + } + + handleImport = (payload) => { + const { importDialog } = this.state; + this.setState({ importDialog: { ...importDialog, nextloading: true } }); + API.uploadConfig({ ...payload }).then(({ data, status, errormsg }) => { + this.setState({ importDialog: { ...importDialog, nextloading: false } }); + if (status) { + this.setState({ + importDialog: { ...importDialog, ...payload, importResult: data } + }); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ importDialog: { ...importDialog, nextloading: false } })); + }; + + render() { + const { importDialog } = this.state; + return ( + this.setState({ + importDialog: { + ...importDialog, importResult: {}, imageId: "", link: "" + } + })} + nextCallback={imageId => this.setState({ importDialog: { ...importDialog, imageId } })} + nextUplaodCallback={imageId => this.handleImport({ imageId })} + /> + ); + } +} + +export default MoveInDialog; diff --git a/pc4mobx/hrmSalary/pages/calculateDetail/payrollItemsTable.js b/pc4mobx/hrmSalary/pages/calculateDetail/payrollItemsTable.js index 33a90a08..9d2ddfce 100644 --- a/pc4mobx/hrmSalary/pages/calculateDetail/payrollItemsTable.js +++ b/pc4mobx/hrmSalary/pages/calculateDetail/payrollItemsTable.js @@ -40,7 +40,7 @@ class PayrollItemsTable extends Component { const { canEdit, dataType, pattern } = record; return dataType === "number" ? onChangeIssueReissueValue(record.salaryItemId, value, "itemsByGroup", salarySobItemGroupId)} /> : { if (item.dataIndex == "refere") { @@ -213,6 +215,19 @@ export default class SalaryItem extends React.Component { filterConditions: targetid ? `[{\"connectCondition\":\"AND\",\"columIndex\":\"targetid\",\"type\":\"=\",\"value\":\"${targetid}\"}]` : "[]" }); break; + case "export": + WeaLoadingGlobal.start(); + const { selectedRowKeys } = this.state; + const promise = API.exportSalaryitem({ ids: selectedRowKeys }); + WeaLoadingGlobal.destroy(); + break; + case "import": + this.setState({ + salaryItemImpDialog: { + ...this.state.salaryItemImpDialog, visible: true + } + }); + break; default: break; } @@ -220,12 +235,10 @@ export default class SalaryItem extends React.Component { render() { const { - salaryItemStore, - salaryFileStore, - taxAgentStore: { showOperateBtn, showSalaryItemBtn, taxAgentOption } + salaryItemStore, salaryFileStore, taxAgentStore: { showOperateBtn, showSalaryItemBtn, taxAgentOption } } = this.props; const { userStatusList } = salaryFileStore; - const { selectedRowKeys, logDialogVisible, filterConditions } = this.state; + const { selectedRowKeys, logDialogVisible, filterConditions, salaryItemImpDialog } = this.state; const { loading, deleteItemRequest, getTableDatas } = salaryItemStore; const { tableDataSource, @@ -257,51 +270,36 @@ export default class SalaryItem extends React.Component { ); - const renderRightOperation = () => { - return (
- { - (showOperateBtn || showSalaryItemBtn) && - handleMenuClick({ key: "1" })} - style={{ marginRight: "10px" }}>{getLabel(111, "新增自定义薪资项")} + const buttons = [ + handleMenuClick({ key: "1" })}>{getLabel(111, "新增自定义薪资项")}, + - } - { - this.setState({ searchValue: value }); - }} onSearch={(value) => { - this.handleSearch(value); - }}/> -
); - - }; - + }); + } + }); + }}>{getLabel(32136, "批量删除")}, + this.setState({ searchValue: value })} + onSearch={value => this.handleSearch(value)}/> + ]; // 新建和修改保存的回调 const handleSlideSave = (continueFlag) => { const { salaryItemStore: { saveItem, request, getTableDatas } } = this.props; @@ -367,23 +365,31 @@ export default class SalaryItem extends React.Component { }; const rowSelection = { selectedRowKeys, - onChange: (selectedRowKeys) => this.setState({ selectedRowKeys }), - getCheckboxProps: record => ({ - disabled: !record.canDelete // Column configuration not to be checked - }) + onChange: (selectedRowKeys) => this.setState({ selectedRowKeys }) + // getCheckboxProps: record => ({ + // disabled: !record.canDelete // Column configuration not to be checked + // }) }; return (
} iconBgcolor="#F14A2D" showDropIcon onDropMenuClick={this.onDropMenuClick} dropMenuDatas={[ + { + key: "import", + icon: , + content: getLabel(111, "导入") + }, + { + key: "export", + icon: , + content: getLabel(111, "导出") + }, { key: "log", icon: , content: getLabel(545781, "操作日志") } - ]} - > - + ]} buttons={(showOperateBtn || showSalaryItemBtn) ? buttons : buttons.slice(-1)}>
this.setState({ logDialogVisible: false })}/> + {/* 导入*/} + { + this.setState({ + salaryItemImpDialog: { ...salaryItemImpDialog, visible: false } + }, () => callback && this.handleSearch(this.state.searchValue)); + }}/> { systemItemVisible && { + const { importDialog } = this.state; + const { hasData } = importDialog; + WeaLoadingGlobal.start(); + const promise = API.downloadTemplate({ hasData }); + WeaLoadingGlobal.destroy(); + }; + handleImport = (payload) => { + const { importDialog } = this.state, { isExtEmp } = this.props; + const { extraPreview } = importDialog; + this.setState({ importDialog: { ...importDialog, nextloading: true } }); + API.importSalaryitem({ ...payload, ...extraPreview, isExtEmp }).then(({ data, status }) => { + this.setState({ importDialog: { ...importDialog, nextloading: false } }); + if (status) { + this.setState({ + importDialog: { ...importDialog, ...payload, importResult: data } + }); + } + }).catch(() => this.setState({ importDialog: { ...importDialog, nextloading: false } })); + }; + + render() { + const { importDialog } = this.state; + return ( + this.setState({ + importDialog: { ...importDialog, importResult: {}, imageId: "", link: null } + })} + exportDataDom={ + { + this.setState({ importDialog: { ...importDialog, hasData: val === "1" } }); + }} + /> + } + nextCallback={imageId => this.setState({ importDialog: { ...importDialog, imageId } })} + nextUplaodCallback={imageId => this.handleImport({ imageId })} + /> + ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/baseValidateDialog.js b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/baseValidateDialog.js new file mode 100644 index 00000000..631ef2ee --- /dev/null +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/baseValidateDialog.js @@ -0,0 +1,76 @@ +/* + * 方案信息确认 + * 保存并自动修改基数,仅保存方案设置 + * @Author: 黎永顺 + * @Date: 2024/8/19 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaDialog, WeaLocaleProvider, WeaTransfer } from "ecCom"; +import { Alert, Button } from "antd"; + +const getLabel = WeaLocaleProvider.getLabel; +const WeaTransferList = WeaTransfer.list; + +class BaseValidateDialog extends Component { + constructor(props) { + super(props); + this.state = { dataSource: [] }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) { + this.setState({ + dataSource: _.filter(_.map(nextProps.baseChangeInfo.split("\n"), (g, gi) => ({ + id: gi + 1, name: g + })), k => !!k.name) + }); + } + if (nextProps.visible !== this.props.visible && !nextProps.visible) this.setState({ + dataSource: [] + }); + } + + render() { + const { dataSource } = this.state, { onCancel } = this.props; + const scrollHeight = this.baseChangeRef ? this.baseChangeRef.state.height - 118 : 606.6; + const buttons = [ + , + + ]; + return ( + this.baseChangeRef = dom} + title={getLabel(131329, "信息确认")} buttons={buttons} + style={{ + width: 750, height: 606.6, minHeight: 200, minWidth: 380, + maxHeight: "90%", maxWidth: "90%", overflow: "hidden", transform: "translate(0px, 0px)" + }} + > +
+ + { + !_.isEmpty(dataSource) ? (
+
{it.id}
+
{it.name}
+
)} + height={scrollHeight} checkedCb={() => ({})} checkedKeys={[]} + /> :
{getLabel(111, "无数据变更记录")}
+ } +
+
+ ); + } +} + +export default BaseValidateDialog; diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/index.js b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/index.js index d97654e6..da42ac66 100644 --- a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/index.js +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/components/welfarePlanEditSlide/index.js @@ -12,6 +12,7 @@ import { Button, message, Modal } from "antd"; import * as API from "../../../../../apis/welfareScheme"; import { getTaxAgentSelectListAsAdmin } from "../../../../../apis/taxAgent"; import { getConditionDomkeys, getSearchs } from "../../../../../util"; +import BaseValidateDialog from "./baseValidateDialog"; import { planConditons } from "../../config"; import cs from "classnames"; @@ -24,7 +25,10 @@ class Index extends Component { constructor(props) { super(props); this.state = { - loading: false, conditions: [], selectedKey: "2", planDatas: [] + loading: false, conditions: [], selectedKey: "2", planDatas: [], + baseValidateDialog: { + visible: false, baseChangeInfo: [], validatePayload: { validate: true, changeData: false } + } }; } @@ -86,21 +90,37 @@ class Index extends Component { if (planForm.getFormParams().sharedType === "1" && _.isEmpty(planForm.getFormParams().taxAgentIds)) { planForm.showError("taxAgentIds", getLabel(111, "\"可见范围\"未填写")); } else { - const { planDatas } = this.state; - const payload = { + const { planDatas, baseValidateDialog } = this.state; + const { validatePayload } = baseValidateDialog; + let payload = { insuranceScheme: { ...planForm.getFormParams(), welfareType: welfareTypeEnum, id, paymentArea: planForm.getFormParams().paymentType }, insuranceSchemeDetailList: planDatas }; + id && (payload = { ...payload, ...validatePayload }); this.setState({ loading: true }); - API[id ? "updateScheme" : "createScheme"](payload).then(({ status, errormsg }) => { + API[id ? "updateScheme" : "createScheme"](payload).then(({ status, data, errormsg }) => { this.setState({ loading: false }); if (status) { - message.success(getLabel(30700, "操作成功!")); - setHasBeenModify(false); - this.props.onClose(true); + if (id && Object.prototype.toString.call(data) === "[object String]" && data.indexOf("\n") !== -1) { + this.setState({ + baseValidateDialog: { + visible: true, baseChangeInfo: data, + validatePayload: { ...baseValidateDialog.validatePayload, validate: false } + } + }); + } else { + message.success(getLabel(30700, "操作成功!")); + setHasBeenModify(false); + this.props.onClose(true); + this.setState({ + baseValidateDialog: { + ...baseValidateDialog, baseChangeInfo: [], validatePayload: { validate: true, changeData: false } + } + }); + } } else { message.error(errormsg); } @@ -194,7 +214,7 @@ class Index extends Component { render() { - const { conditions, planDatas, selectedKey } = this.state; + const { conditions, planDatas, selectedKey, baseValidateDialog } = this.state; const { programmeStore: { planForm }, showOperateBtn } = this.props; return ( + {/* */} + this.setState({ + baseValidateDialog: { + visible: false, baseChangeInfo: [], + validatePayload: { validate: true, changeData: false, ...validatePayload } + } + }, () => !_.isEmpty(validatePayload) && this.save())}/>
} /> ); diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.js b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.js index 20d50c88..4f7028ad 100644 --- a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.js +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.js @@ -13,7 +13,6 @@ import WelfarePlanList from "./components/welfarePlanList"; import LogDialog from "../../../components/logViewModal"; import cs from "classnames"; import "./index.less"; -import { tabList } from "../welfareArchive/config"; const getLabel = WeaLocaleProvider.getLabel; diff --git a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.less b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.less index 5a057203..5566cc8e 100644 --- a/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.less +++ b/pc4mobx/hrmSalary/pages/socialSecurityBenefits/welfarePlan/index.less @@ -269,3 +269,91 @@ } } + +//方案基数变化 +.baseChangeDialog { + .wea-dialog-body { + overflow-y: hidden; + } + + .baseChangeContent { + background: #F6F6F6; + padding: 16px; + width: 100%; + height: 100%; + + .empty { + width: 100%; + display: flex; + height: 100%; + justify-content: center; + align-items: center; + background: #ffff; + } + + .wea-search-group { + padding: 0; + margin-bottom: 10px; + background: #FFF; + + .wea-form-cell { + padding: 0; + + .wea-form-item { + padding: 10px; + } + } + } + + .logTable { + background: #FFFFFF; + } + + .wea-transfer-list-wrapper { + border: none; + + .ant-tree-switcher { + display: none; + } + + .transfer-tree { + background: #FFF; + border: 1px solid #dadada; + padding: 0; + + & > li:not(:last-child) { + .detailBox .content { + border-bottom: 1px solid #dadada; + } + } + + & > li { + margin: 0 !important; + + .detailBox { + display: flex; + align-items: center; + + .order { + width: 35px; + color: #999; + text-align: center; + } + + .content { + position: relative; + flex: 1; + min-height: 40px; + line-height: 40px; + color: #000; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + } + } + } +} + diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js new file mode 100644 index 00000000..8c0983da --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.js @@ -0,0 +1,35 @@ +/* + * Author: 黎永顺 + * name:薪酬统计报表-高级搜索 + * Description: + * Date: 2024/3/26 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { Button } from "antd"; +import { WeaInputSearch, WeaLocaleProvider } from "ecCom"; +import "./index.less"; + +const getLabel = WeaLocaleProvider.getLabel; + +@inject("baseTableStore") +@observer +class Index extends Component { + render() { + const { baseTableStore: { VSalryForm }, searchType } = this.props; + return ( +
+ VSalryForm.updateFields({ username: v })} + onSearch={this.props.onAdvanceSearch} + /> + { + searchType === "advance" && + } +
+ ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less new file mode 100644 index 00000000..f301e571 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/advanceInputBtn/index.less @@ -0,0 +1,28 @@ +.variable-advance-search { + display: flex; + align-items: center; + position: relative; + top: -1.5px; + + .wea-advanced-search { + top: 1px; + left: -1px; + height: 28px; + line-height: 1; + border-radius: 0; + position: relative; + color: #474747; + padding: 4px 15px; + } + + .wea-advanced-search:hover { + border: 1px solid #dadada; + color: #474747; + } + + .text-elli { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js new file mode 100644 index 00000000..1635c3a4 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileDialog/index.js @@ -0,0 +1,146 @@ +/* + * 浮动薪酬 + * 新建编辑薪资档案 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaLocaleProvider, WeaSlideModal, WeaTools } from "ecCom"; +import { Button, message } from "antd"; +import { getSearchs } from "../../../../util"; +import { salaryFileConditions } from "../../conditions"; +import * as API from "../../../../apis/variableSalary"; + +const getKey = WeaTools.getKey; +const getLabel = WeaLocaleProvider.getLabel; + +@inject("baseTableStore") +@observer +class Index extends Component { + constructor(props) { + super(props); + this.state = { + conditions: [], loading: false + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) { + document.querySelector(".variable_salary_wrapper").classList.add("zIndex0-weaslide-title"); + this.initForm(nextProps); + } else if (nextProps.visible !== this.props.visible && !nextProps.visible) { + document.querySelector(".variable_salary_wrapper").classList.remove("zIndex0-weaslide-title"); + this.props.baseTableStore.initVSSalaryFileForm(); + } + } + + initForm = (props) => { + const { baseTableStore: { VSSalaryFileForm }, detail, taxAgentOption } = props; + API.getCreateForm().then(({ data }) => { + this.setState({ + conditions: [ + ..._.map(salaryFileConditions, item => ({ + ...item, items: _.map(item.items, o => { + if (getKey(o) === "taxAgentIds") { + return { + ...o, viewAttr: !_.isEmpty(detail) ? 1 : 3, label: getLabel(o.lanId, o.label), + options: taxAgentOption, value: detail[getKey(o)] || "" + }; + } + return { + ...o, viewAttr: !_.isEmpty(detail) ? 1 : 3, label: getLabel(o.lanId, o.label), + value: detail[getKey(o)] || "" + }; + }) + })), + { + items: _.map(data, o => ({ + conditionType: "INPUT", + domkey: [String(o.id)], + fieldcol: 14, + label: o.name, + labelcol: 6, + value: detail[`${String(o.id)}_variableItem`] || "", + viewAttr: !_.isEmpty(detail) ? 1 : 2 + })), + title: "", col: 2, + defaultshow: true + } + ] + }, () => { + VSSalaryFileForm.initFormFields(this.state.conditions); + if (!_.isEmpty(detail)) { + VSSalaryFileForm.updateFields({ + employeeId: { + value: detail["employeeId"], + valueSpan: detail["username"], + valueObj: [{ id: detail["employeeId"], name: detail["username"] }] + } + }); + } + }); + }); + }; + convertPayload = (payload) => { + const itemValueList = []; + return _.reduce(_.keys(payload), (pre, cur) => { + if (!_.isNaN(parseInt(cur))) { + itemValueList.push({ variableItemId: cur, itemValue: payload[cur] }); + return { ...pre, itemValueList }; + } + return { ...pre, [cur]: payload[cur] }; + }, {}); + }; + save = () => { + const { baseTableStore: { VSSalaryFileForm }, onSearch, id } = this.props; + VSSalaryFileForm.validateForm().then(f => { + if (f.isValid) { + const payload = VSSalaryFileForm.getFormParams(); + this.setState({ loading: true }); + API.createVariableSalary({ ...this.convertPayload(payload), id }) + .then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(30700, "操作成功")); + this.props.onClose(onSearch()); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ loading: false })); + } else { + f.showErrors(); + } + }); + }; + renderTitle = () => { + const { loading } = this.state, { title, detail } = this.props; + return
+
+
+
{title}
+
+
+ { + _.isEmpty(detail) && + + } +
+
; + }; + + render() { + const { conditions } = this.state; + const { baseTableStore: { VSSalaryFileForm }, onClose } = this.props; + return ( onClose()} + top={0} width={800} height={100} measureT="%" measureX="px" measureY="%" title={this.renderTitle()} + content={
{getSearchs(VSSalaryFileForm, conditions)}
} + />); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js new file mode 100644 index 00000000..c8917e45 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileImportDialog/index.js @@ -0,0 +1,120 @@ +/* + * 浮动薪酬 + * 薪资档案导入 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { WeaCheckbox, WeaDatePicker, WeaFormItem, WeaLocaleProvider } from "ecCom"; +import ImportDialog from "../../../../components/importDialog"; +import * as API from "../../../../apis/variableSalary"; +import { convertToUrlString } from "../../../../util/url"; + +const getLabel = WeaLocaleProvider.getLabel; + +class Index extends Component { + constructor(props) { + super(props); + this.state = { + importDialog: { + nextloading: false, link: "/api/bs/hrmsalary/variableSalary/downloadTemplate", + importResult: {}, imageId: "", hasData: false, salaryMonth: "", + previewUrl: "/api/bs/hrmsalary/variableSalary/preview" + } + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + const { importDialog } = this.state; + if (nextProps.visible !== this.props.visible && nextProps.visible) { + const { baseTableStore: { VSalryForm }, salaryMonth, taxAgentIds } = nextProps; + const payload = { + salaryMonth, taxAgentIds, ...VSalryForm.getFormParams(), hasData: importDialog.hasData + }; + this.setState({ + importDialog: { ...importDialog, salaryMonth, link: `${importDialog.link}?${convertToUrlString(payload)}` } + }); + } else { + this.setState({ + importDialog: { + nextloading: false, link: "/api/bs/hrmsalary/variableSalary/downloadTemplate", hasData: false, + importResult: {}, imageId: "", previewUrl: "/api/bs/hrmsalary/variableSalary/preview", salaryMonth: "" + } + }); + } + } + + handleImport = (payload) => { + const { taxAgentIds } = this.props; + const { importDialog } = this.state; + const { salaryMonth } = importDialog; + this.setState({ importDialog: { ...importDialog, nextloading: true } }); + API.importVariableSalary({ + ...payload, salaryMonth, taxAgentIds: _.isEmpty(taxAgentIds) ? [] : taxAgentIds.split(",") + }).then(({ data, status }) => { + this.setState({ importDialog: { ...importDialog, nextloading: false } }); + if (status) { + this.setState({ + importDialog: { ...importDialog, ...payload, importResult: data } + }); + } + }).catch(() => this.setState({ importDialog: { ...importDialog, nextloading: false } })); + }; + renderFormComponent = () => { + const { baseTableStore: { VSalryForm }, taxAgentIds } = this.props; + const { importDialog } = this.state; + const { salaryMonth: month, hasData } = importDialog; + return
+ + { + const payload = { salaryMonth: val, hasData, taxAgentIds, ...VSalryForm.getFormParams() }; + this.setState({ + importDialog: { + ...importDialog, salaryMonth: val, + link: `/api/bs/hrmsalary/variableSalary/downloadTemplate?${convertToUrlString(payload)}` + } + }); + }}/> + +
; + }; + + render() { + const { importDialog } = this.state; + return ( + this.setState({ + importDialog: { ...importDialog, importResult: {}, imageId: "", link: null } + })} + importParams={this.renderFormComponent()} + exportDataDom={ + { + const { baseTableStore: { VSalryForm }, taxAgentIds } = this.props; + const { salaryMonth } = importDialog; + const payload = { salaryMonth, taxAgentIds, ...VSalryForm.getFormParams(), hasData: val === "1" }; + this.setState({ + importDialog: { + ...importDialog, hasData: val === "1", + link: `/api/bs/hrmsalary/variableSalary/downloadTemplate?${convertToUrlString(payload)}` + } + }); + }} + /> + } + nextCallback={imageId => this.setState({ importDialog: { ...importDialog, imageId } })} + nextUplaodCallback={imageId => this.handleImport({ imageId })} + /> + ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js new file mode 100644 index 00000000..f3b0e52a --- /dev/null +++ b/pc4mobx/hrmSalary/pages/variableSalary/components/salaryFileList/index.js @@ -0,0 +1,162 @@ +/* + * 浮动薪酬 + * 薪资档案列表 + * @Author: 黎永顺 + * @Date: 2024/8/8 + * @Wechat: + * @Email: 971387674@qq.com + * @description: +*/ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaLocaleProvider } from "ecCom"; +import { WeaTableNew } from "comsMobx"; +import { message, Modal, Spin } from "antd"; +import * as API from "../../../../apis/variableSalary"; +import { toJS } from "mobx"; + +const WeaTableComx = WeaTableNew.WeaTable; +const getLabel = WeaLocaleProvider.getLabel; + +@inject("baseTableStore") +@observer +class Index extends Component { + constructor(props) { + super(props); + this.state = { + pageInfo: { current: 1, pageSize: 10, total: 0 }, loading: false, dataSource: [], columns: [] + }; + } + + componentDidMount() { + window.addEventListener("message", this.handleReceive, false); + window.addEventListener("resize", this.handleResize, false); + this.getVariableSalaryList(); + } + + componentWillUnmount() { + window.removeEventListener("message", this.handleReceive, false); + window.removeEventListener("resize", this.handleResize, false); + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.isQuery !== this.props.isQuery) this.setState({ + pageInfo: { ...this.state.pageInfo, current: 1 } + }, () => this.getVariableSalaryList()); + } + + handleReceive = async ({ data }) => { + const { type, payload: { id, params } = {} } = data; + if (type === "init") { + this.getColumns(); + } else if (type === "turn") { + switch (id) { + case "PAGEINFO": + this.setState({ + pageInfo: { ...this.state.pageInfo, ...params } + }, () => this.getVariableSalaryList()); + break; + case "DEL": + this.handleDelete([params.id]); + break; + case "VIEW": + this.handleView(params.id); + break; + default: + break; + } + } + }; + getVariableSalaryList = () => { + const { baseTableStore: { VSalryForm, getVariableSalaryList }, salaryMonth, taxAgentIds } = this.props; + const { pageInfo } = this.state; + const { departmentIds } = VSalryForm.getFormParams(); + this.setState({ loading: true }); + getVariableSalaryList({ + ...pageInfo, salaryMonth, taxAgentIds: _.isEmpty(taxAgentIds) ? [] : taxAgentIds.split(","), + ...VSalryForm.getFormParams(), departmentIds: !_.isEmpty(departmentIds) ? departmentIds.split(",") : [] + }).then(({ status, data }) => { + this.setState({ loading: false }); + if (status) { + const { pageInfo: result } = data; + const { list: dataSource, pageNum: current, pageSize, total } = result; + this.setState({ + pageInfo: { ...pageInfo, current, pageSize, total }, dataSource + } + ); + } + }); + }; + handleView = (id) => { + API.getVariableSalaryDetail({ id }).then(({ status, data }) => { + if (status) this.props.onViewSalaryFile(data.data); + }); + }; + handleDelete = (ids) => { + Modal.confirm({ + title: getLabel(111, "信息确认"), + content: getLabel(111, "确认删除吗?"), + onOk: () => { + API.deleteVariableSalary({ ids }).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(111, "删除成功")); + this.getVariableSalaryList(); + } else { + message.error(errormsg); + } + }); + } + }); + }; + getColumns = () => { + const { baseTableStore: { SFTableStore }, showOperateBtn } = this.props; + const columns = _.map(_.filter(toJS(SFTableStore.columns), (item) => item.display === "true"), (it, idx) => ({ + dataIndex: it.dataIndex, title: it.title, align: "left", + width: 150, ellipsis: true + })); + if (!_.isEmpty(columns)) { + this.postMessageToChild({ + columns, showOperateBtn, dataSource: this.state.dataSource, scrollHeight: 98, + pageInfo: this.state.pageInfo, unitTableType: "variableSalary" + }); + } + return columns; + }; + postMessageToChild = (payload = {}) => { + const i18n = { + "操作": getLabel(30585, "操作"), "查看详情": getLabel(111, "查看详情"), + "共": getLabel(18609, "共"), "条": getLabel(18256, "条"), + "删除": getLabel(111, "删除") + }; + const childFrameObj = document.getElementById("unitTable"); + childFrameObj && childFrameObj.contentWindow.postMessage(JSON.stringify({ ...payload, i18n }), "*"); + }; + + render() { + const { loading, dataSource } = this.state; + const { baseTableStore: { SFTableStore } } = this.props; + const dom = document.querySelector(".wea-new-top-req-content"); + let height = 280; + if (dom && dataSource.length > 0) { + height = (parseFloat(dom.style.height) > 620 && dataSource.length === 10) ? dataSource.length * 46 + 108 : dataSource.length < 10 ? dataSource.length * 46 + 108 : parseFloat(dom.style.height) - 16; + } + return ( + +
+ +