diff --git a/pc4mobx/hrmSalary/apis/payroll.js b/pc4mobx/hrmSalary/apis/payroll.js index eaf11a11..1f9b1d64 100644 --- a/pc4mobx/hrmSalary/apis/payroll.js +++ b/pc4mobx/hrmSalary/apis/payroll.js @@ -367,3 +367,24 @@ export const getAvailableSalaryItemSet = (params) => { export const salaryBillSendSum = (params) => { return postFetch("/api/bs/hrmsalary/salaryBill/send/sum", params); }; +//工资单发放-发送短信验证码 +export const sendMobileCode = (params) => { + return postFetch("/api/bs/hrmsalary/salaryBill/sendMobileCode", params); +}; +//工资单-验证方式 +export const payrollCheckType = params => { + return WeaTools.callApi("/api/bs/hrmsalary/salaryBill/payrollCheckType", "GET", params); +}; + +// 工资单基础设置-获取设置列表 +export const getSalaryBillBaseSetForm = (id) => { + return WeaTools.callApi("/api/bs/hrmsalary/salaryBill/baseSet/getForm", "get", {}); +}; +//工资单基础设置-保存工资单基础设置(设置水印) +export const salaryBillBaseSetSave = (params) => { + return postFetch("/api/bs/hrmsalary/salaryBill/baseSet/save", params); +}; +//工资单基础设置-保存工资单基础设置(水印预览) +export const salaryBillBaseSetPreviewWaterMark = (params) => { + return postFetch("/api/bs/hrmsalary/salaryBill/baseSet/previewWaterMark", params); +}; diff --git a/pc4mobx/hrmSalary/apis/ruleconfig.js b/pc4mobx/hrmSalary/apis/ruleconfig.js index b0639647..7ff084ce 100644 --- a/pc4mobx/hrmSalary/apis/ruleconfig.js +++ b/pc4mobx/hrmSalary/apis/ruleconfig.js @@ -1,53 +1,57 @@ -import { WeaTools } from 'ecCom'; -import { postFetch } from '../util/request'; +import { WeaTools } from "ecCom"; +import { postFetch } from "../util/request"; //通用字典表 {enumClass:""} export const commonEnumList = (params) => { - return WeaTools.callApi('/api/bs/hrmsalary/common/enum/list', 'GET', params); -} + return WeaTools.callApi("/api/bs/hrmsalary/common/enum/list", "GET", params); +}; export const sysOrderRule = params => { - return WeaTools.callApi('/api/bs/hrmsalary/sys/orderRule', 'GET', params); -} + return WeaTools.callApi("/api/bs/hrmsalary/sys/orderRule", "GET", params); +}; //保存排序规则 export const updateOrderRule = (params) => { - return postFetch('/api/bs/hrmsalary/sys/updateOrderRule', params); -} + return postFetch("/api/bs/hrmsalary/sys/updateOrderRule", params); +}; //导入规则详情信息 export const sysConfCodeRule = params => { - return WeaTools.callApi('/api/bs/hrmsalary/sys/conf/code', 'GET', params); -} + return WeaTools.callApi("/api/bs/hrmsalary/sys/conf/code", "GET", params); +}; //保存导入规则 export const saveMatchEmployeeModeRule = (params) => { - return postFetch('/api/bs/hrmsalary/sys/saveMatchEmployeeModeRule', params); -} + return postFetch("/api/bs/hrmsalary/sys/saveMatchEmployeeModeRule", params); +}; //应用配置查询 export const queryAppsetting = (params) => { - return WeaTools.callApi('/api/bs/hrmsalary/sys/app/setting', 'GET', params); -} + return WeaTools.callApi("/api/bs/hrmsalary/sys/app/setting", "GET", params); +}; //加密配置保存 export const saveEncryptSetting = (params) => { - return postFetch('/api/bs/hrmsalary/sys/app/setting/saveEncryptSetting', params); -} + return postFetch("/api/bs/hrmsalary/sys/app/setting/saveEncryptSetting", params); +}; //加密配置保存 export const appSettingSave = (params) => { - return postFetch('/api/bs/hrmsalary/sys/app/setting/save', params); -} + return postFetch("/api/bs/hrmsalary/sys/app/setting/save", params); +}; //获取加密进度条 export const getEncryptProgress = params => { - return WeaTools.callApi('/api/bs/hrmsalary/sys/app/getEncryptProgress', 'GET', params); -} + return WeaTools.callApi("/api/bs/hrmsalary/sys/app/getEncryptProgress", "GET", params); +}; //保存报税规则 export const operateTaxDeclarationFunction = (params) => { - return postFetch('/api/bs/hrmsalary/sys/operateTaxDeclarationFunction', params); -} + return postFetch("/api/bs/hrmsalary/sys/operateTaxDeclarationFunction", params); +}; +//保存匹配规则 +export const saveSalaryAcctEmployeeRule = (params) => { + return postFetch("/api/bs/hrmsalary/sys/saveSalaryAcctEmployeeRule", params); +}; //保存薪酬统计报表 export const reportStatisticsReportSave = (params) => { - return postFetch('/api/bs/hrmsalary/report/statistics/report/save', params); -} + return postFetch("/api/bs/hrmsalary/report/statistics/report/save", params); +}; //薪酬统计维度下拉列表 export const reportGetForm = params => { - return WeaTools.callApi('/api/bs/hrmsalary/report/statistics/report/getForm', 'GET', params); -} + return WeaTools.callApi("/api/bs/hrmsalary/report/statistics/report/getForm", "GET", params); +}; diff --git a/pc4mobx/hrmSalary/components/captchaModal/index.js b/pc4mobx/hrmSalary/components/captchaModal/index.js new file mode 100644 index 00000000..35661772 --- /dev/null +++ b/pc4mobx/hrmSalary/components/captchaModal/index.js @@ -0,0 +1,94 @@ +/* + * Author: 黎永顺 + * name: 验证码弹框 + * Description: + * Date: 2023/6/16 + */ +import React, { Component } from "react"; +import { WeaDialog, WeaError, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup } from "ecCom"; +import { sendMobileCode } from "../../apis/payroll"; +import { Button } from "antd"; +import "./index.less"; + +const { getLabel } = WeaLocaleProvider; + +class Index extends Component { + constructor(props) { + super(props); + this.state = { + captcha: "", + time: 60 + }; + this.timeRef = null; + } + + componentWillUnmount() { + clearInterval(this.timeRef); + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && !nextProps.visible) { + clearInterval(this.timeRef); + this.setState({ captcha: "", time: 60 }); + } + } + + handleSendCaptcha = () => { + sendMobileCode({ id: this.props.id }).then(({ status, data }) => { + if (status) { + console.log(data); + this.timeRef = setInterval(() => { + const { time } = this.state; + this.setState({ time: time - 1 }, () => { + if (this.state.time === -1) { + clearInterval(this.timeRef); + this.setState({ time: 60 }); + } + }); + }, 1000); + } + }); + }; + handleConfirm = () => { + if (!this.state.captcha) { + this.refs.weaError.showError(); + // return + } + this.props.onCancel(); + this.props.onConfirm(); + }; + + render() { + const { captcha, time } = this.state; + return ( + {getLabel(826, "确定")} + ]} + > + + + +
+ this.setState({ captcha })}/> + +
+
+
+
+
+ ); + } +} + +export default Index; diff --git a/pc4mobx/hrmSalary/components/captchaModal/index.less b/pc4mobx/hrmSalary/components/captchaModal/index.less new file mode 100644 index 00000000..4f8d23b7 --- /dev/null +++ b/pc4mobx/hrmSalary/components/captchaModal/index.less @@ -0,0 +1,29 @@ +.captchaWrapper { + .wea-dialog-body { + padding: 30px 20px; + + .wea-form-item-wrapper { + .wea-error { + width: 100%; + + .captchaInputBox { + display: flex; + align-items: center; + + .wea-input-normal { + flex: 1; + } + + button { + padding: 8px 10px; + border-radius: 0; + min-width: 80px; + text-align: center; + height: 30px; + line-height: 15px; + } + } + } + } + } +} diff --git a/pc4mobx/hrmSalary/components/upload/index.js b/pc4mobx/hrmSalary/components/upload/index.js new file mode 100644 index 00000000..fd7cdd57 --- /dev/null +++ b/pc4mobx/hrmSalary/components/upload/index.js @@ -0,0 +1,84 @@ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaTools, WeaUpload } from "ecCom"; +import { Icon, Modal } from "antd"; +import "./index.less"; + +const getLabel = WeaLocaleProvider.getLabel; +const { viewer } = WeaTools; + +class ImageUploadList extends Component { + constructor(props) { + super(props); + this.state = { + imageUrl: "" + }; + } + + componentDidMount() { + const { wmImg } = this.props; + if (!_.isEmpty(wmImg)) { + this.setState({ + imageUrl: wmImg[0].imgSrc + }); + } + } + + handleChange = (ids, list) => { + this.setState({ + imageUrl: list[0].imgSrc + }, () => this.props.onChange([{ imgSrc: this.state.imageUrl }])); + }; + handleDelete = () => { + Modal.confirm({ + title: getLabel(111, "信息确认"), + content: getLabel(111, "确认要删除吗?"), + onOk: () => { + this.setState({ + imageUrl: "" + }, () => this.props.onChange(null)); + } + }); + }; + + + render() { + const { imageUrl } = this.state; + const uploadProps = { + uploadUrl: "/api/doc/upload/uploadFile", + listType: "img", + limitType: "jpg,jpeg,png,gif", + category: "string", + maxFilesNumber: 1, + onChange: this.handleChange + }; + const imgPreviewProps = { + src: imageUrl, + width: 100, + height: 100 + }; + return ( +
+ { + imageUrl && +
+ +
+ +
+
+ } + { + !imageUrl && + +
+ +
{getLabel(111, "上传图片")}
+
+
+ } +
+ ); + } +} + +export default ImageUploadList; diff --git a/pc4mobx/hrmSalary/components/upload/index.less b/pc4mobx/hrmSalary/components/upload/index.less new file mode 100644 index 00000000..577de7c7 --- /dev/null +++ b/pc4mobx/hrmSalary/components/upload/index.less @@ -0,0 +1,68 @@ +.textSetting { + .uploadWrapper { + display: flex; + align-items: center; + position: relative; + + .previewWrapper { + border: 1px solid #d9d9d9 !important; + + img { + width: 100%; + height: 100%; + margin-left: 0 !important; + cursor: pointer; + } + + .operateWrapper { + display: none; + } + } + + .previewWrapper:hover { + .operateWrapper { + display: flex; + position: absolute; + align-items: center; + justify-content: flex-end; + width: 30px; + height: 20px; + background-color: rgba(0, 0, 0, 0.3); + bottom: 4px; + right: 13px; + border-radius: 3px; + padding-right: 4px; + } + } + } + + .upload-select-picture-card, .previewWrapper { + border: 1px dashed #d9d9d9; + width: 96px; + height: 96px; + padding: 0; + border-radius: 6px; + background-color: #fbfbfb; + text-align: center; + cursor: pointer; + -webkit-transition: border-color .3s ease; + -o-transition: border-color .3s ease; + transition: border-color .3s ease; + display: flex; + flex-direction: column; + justify-content: center; + margin-right: 8px; + margin-bottom: 8px; + + span.rc-upload { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + } + + .upload-select-picture-card:hover { + border-color: #2db7f5; + } +} diff --git a/pc4mobx/hrmSalary/index.js b/pc4mobx/hrmSalary/index.js index 024d2217..6c0597da 100644 --- a/pc4mobx/hrmSalary/index.js +++ b/pc4mobx/hrmSalary/index.js @@ -35,6 +35,8 @@ import FieldManagement from "./pages/fieldManagement"; import AnalysisOfSalaryStatistics from "./pages/analysisOfSalaryStatistics"; import EmployeeList from "./pages/employeeView"; import ReportView from "./pages/reportView"; +import MySalaryView from "./pages/mySalary/mySalaryView"; +import WatermarkPreview from "./pages/payroll/watermarkPreview"; import stores from "./stores"; import "./style/index"; @@ -53,6 +55,7 @@ const SocialSecurityBenefits = (props) => props.children; const DataAcquisition = (props) => props.children; // mySalary 我的薪资福利 +// mySalaryView 我的薪资福利-查看工资单 // socialSecurityBenefits 社保福利 // programme 社保福利方案 // archives 社保福利档案 @@ -91,6 +94,7 @@ const Routes = ( onEnter={getLocaleLabel} component={Home}> + + { @@ -96,7 +106,7 @@ export default class MobilePayroll extends React.Component { render() { const { mySalaryStore: { clearLoading } } = this.props; - const { mySalaryBillData, visible } = this.state; + const { mySalaryBillData, visible, captchaVisible } = this.state; const type = getQueryString("type"); const employeeInformation = mySalaryBillData.employeeInformation ? mySalaryBillData.employeeInformation : {}; const salaryGroups = mySalaryBillData.salaryGroups ? mySalaryBillData.salaryGroups : []; @@ -148,6 +158,11 @@ export default class MobilePayroll extends React.Component { } + this.setState({ captchaVisible: false })} + onConfirm={() => this.props.mySalaryStore.setInitEmVerify()} + /> ); } diff --git a/pc4mobx/hrmSalary/pages/mySalary/index.js b/pc4mobx/hrmSalary/pages/mySalary/index.js index 6902836e..3b7ad55d 100644 --- a/pc4mobx/hrmSalary/pages/mySalary/index.js +++ b/pc4mobx/hrmSalary/pages/mySalary/index.js @@ -1,15 +1,15 @@ import React from "react"; import { inject, observer } from "mobx-react"; import { DatePicker } from "antd"; -import { WeaNewScroll, WeaTop } from "ecCom"; +import { WeaLocaleProvider, WeaNewScroll, WeaTop } from "ecCom"; import { renderNoright } from "../../util"; // 渲染form数据的方法:因为多个页面都会使用,所以抽的公共方法在util中 import CustomTab from "../../components/customTab"; import moment from "moment"; import PayrollModal from "./payrollModal"; -import Authority from "./authority"; import CustomPaginationTable from "../../components/customPaginationTable"; import "./index.less"; +const { getLabel } = WeaLocaleProvider; const { RangePicker } = DatePicker; @inject("mySalaryStore") @@ -28,9 +28,9 @@ export default class MySalary extends React.Component { this.historyPageInfo = { current: 1, pageSize: 10 }; } - componentWillMount() { - const { mySalaryStore: { init } } = this.props; - init(); + componentDidMount() { + const { mySalaryStore: { mySalaryBillList } } = this.props; + mySalaryBillList([moment().startOf("year").format("YYYY-MM"), moment().format("YYYY-MM")]); } // 查看工资单 @@ -61,9 +61,8 @@ export default class MySalary extends React.Component { dataIndex: "operate", render: (text, record) => { return ( - { - this.handleView(record); - }}>查看 + {getLabel(33564, "查看")} ); } }); @@ -114,7 +113,6 @@ export default class MySalary extends React.Component { myBillPageInfo } = mySalaryStore; const { salaryBillVisible, salaryInfoId, salaryRange } = this.state; - if (!hasRight && !loading) return renderNoright(); const topTab = [ { @@ -141,64 +139,62 @@ export default class MySalary extends React.Component { }; return (
- - } // 左侧图标 - iconBgcolor="#F14A2D" // 左侧图标背景色 - showDropIcon={false} // 是否显示下拉按钮 - > - { - this.handleTabChange(v); - this.setState({ selectedKey: v }); - }} - /> -
- - { - this.state.selectedKey === "0" && - { - this.pageInfo.current = value; - this.handlePageChange(); - }} - onShowSizeChange={(current, pageSize) => { - this.pageInfo = { current, pageSize }; - this.handlePageChange(); - }} - /> - } - { - this.state.selectedKey === "2" && - { - this.historyPageInfo.current = value; - this.handleHistoryPageChange(); - }} - onShowSizeChange={(current, pageSize) => { - this.historyPageInfo = { current, pageSize }; - this.handleHistoryPageChange(); - }} - /> - } - -
-
-
+ } // 左侧图标 + iconBgcolor="#F14A2D" // 左侧图标背景色 + showDropIcon={false} // 是否显示下拉按钮 + > + { + this.handleTabChange(v); + this.setState({ selectedKey: v }); + }} + /> +
+ + { + this.state.selectedKey === "0" && + { + this.pageInfo.current = value; + this.handlePageChange(); + }} + onShowSizeChange={(current, pageSize) => { + this.pageInfo = { current, pageSize }; + this.handlePageChange(); + }} + /> + } + { + this.state.selectedKey === "2" && + { + this.historyPageInfo.current = value; + this.handleHistoryPageChange(); + }} + onShowSizeChange={(current, pageSize) => { + this.historyPageInfo = { current, pageSize }; + this.handleHistoryPageChange(); + }} + /> + } + +
+
{ salaryBillVisible && + +
+
+ +
+
+
+ this.setState({ captchaVisible: false })} + onConfirm={() => mySalaryStore.setInitEmVerify()} + /> + + ); + } +} + +export default MySalaryView; diff --git a/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js b/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js index 79752acc..2b98919b 100644 --- a/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js +++ b/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js @@ -92,7 +92,7 @@ export default class SalarySendList extends React.Component { title: "操作", key: "operate", render: (text, record) => { - const { sendNum, sendTotal, salaryAcctType, haveBackCalc } = record; + const { sendNum, sendTotal, salaryAcctType, haveBackCalc, canSeeDetail } = record; //显示发放 const showGrant = haveBackCalc === 1 && salaryAcctType === 0; return ( @@ -100,7 +100,7 @@ export default class SalarySendList extends React.Component { this.handleGrant(record)} style={{ marginRight: 10 }}>发放 { - !showGrant && + canSeeDetail && this.handleShowDetail(record)} style={{ marginRight: 10 }}>查看详情 } diff --git a/pc4mobx/hrmSalary/pages/payroll/components/config.js b/pc4mobx/hrmSalary/pages/payroll/components/config.js new file mode 100644 index 00000000..47e1801b --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/components/config.js @@ -0,0 +1,14 @@ +import { WeaLocaleProvider } from "ecCom"; + +const getLabel = WeaLocaleProvider.getLabel; +export const commonVariables = [ + { id: "HRM_Name", name: getLabel(111, "当前操作者姓名")}, + { id: "HRM_Num", name: getLabel(111, "当前操作者编号")}, + { id: "HRM_Mobile", name: getLabel(111, "当前操作者移动电话")}, + { id: "HRM_Email", name: getLabel(111, "当前操作者电子邮件")}, + { id: "HRM_CurrentOperatorId", name: getLabel(111, "当前操作者人员id")}, + { id: "HRM_Department", name: getLabel(111, "当前操作者部门")}, + { id: "HRM_SecondDepartment", name: getLabel(111, "分部")}, + { id: "HRM_CurrentDate", name: getLabel(111, "当前日期")}, + { id: "HRM_CurrentTime", name: getLabel(111, "当前时间")}, +]; diff --git a/pc4mobx/hrmSalary/pages/payroll/components/index.less b/pc4mobx/hrmSalary/pages/payroll/components/index.less index 38191bdb..51e742e6 100644 --- a/pc4mobx/hrmSalary/pages/payroll/components/index.less +++ b/pc4mobx/hrmSalary/pages/payroll/components/index.less @@ -46,3 +46,124 @@ } } } + +.waterMarkSetWrapper, .wmContentWrapper { + .rodal { + .rodal-dialog { + & > div:nth-child(2) { + height: calc(100% - 52px) !important; + padding-bottom: 0 !important; + } + } + } + + .waterMark-select-header { + padding: 0 5px; + + } + + .wea-transfer-list-wrapper { + .transfer-tree { + li { + cursor: pointer; + margin: 10px 0; + } + } + } + + .wea-slide-modal-content { + padding-bottom: 65px; + } + + .wmTitle { + float: left; + margin-left: 16px; + } + + .slideBottom { + display: flex; + justify-content: flex-end; + padding: 16px 25px; + border-top: 1px solid #e5e5e5; + position: absolute; + width: 100%; + bottom: 0; + background: #f4f4f4; + + button:first-child { + margin-right: 16px; + } + } + + .waterMarkWrapper { + padding-top: 16px; + } + + .wmContGroup { + .wea-title { + border: 1px solid #e5e5e5; + border-bottom: none; + } + + .wea-content { + padding-top: 0; + } + + .content-box { + padding: 16px; + + .ant-col-18 { + height: 319px; + } + } + + .wea-form-cell-wrapper { + border-bottom: none; + } + } + + .mt16 { + .wea-form-cell-wrapper { + border: 1px solid #e5e5e5; + } + } + + .wea-form-cell-wrapper { + border: 1px solid #e5e5e5; + border-bottom: none; + } + + .wea-form-item { + padding: 5px 16px; + border-bottom: 1px solid #e5e5e5; + } + + .textSetting { + display: flex; + align-items: center; + margin-top: 7px; + min-width: 200px; + + .icon-coms-Flow-setting { + font-size: 16px; + color: #666; + cursor: pointer; + } + + img { + margin-left: 5px; + } + } + + .previewBtn { + cursor: pointer; + color: #2db7f5; + position: relative; + margin-left: 10px; + } + + .txtPrew { + margin-left: 20px !important; + } + +} diff --git a/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js b/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js new file mode 100644 index 00000000..927e1fbd --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js @@ -0,0 +1,201 @@ +/* + * Author: 黎永顺 + * name: 水印设置-弹框 + * Description: + * Date: 2023/6/13 + */ +import React, { Component } from "react"; +import { + WeaError, + WeaFormItem, + WeaHelpfulTip, + WeaInputNumber, + WeaLocaleProvider, + WeaSearchGroup, + WeaSelect, + WeaSlideModal +} from "ecCom"; +import { Button } from "antd"; +import ImageUploadList from "../../../components/upload"; +import WmContentSetModal from "./wmContentSetModal"; +import "./index.less"; + +const getLabel = WeaLocaleProvider.getLabel; + +class WaterMarkSetModal extends Component { + constructor(props) { + super(props); + this.state = { + wmClassify: "text", wmNoTransparent: 0, + wmRotate: 0, wmImg: null, wmcontSet: { + visible: false, textSet: {} + } + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) { + const { watermarkSetting } = nextProps; + const { + wmClassify = "text", + wmNoTransparent = 0, + wmRotate = 0, + wmImg, + wmOriginText, + wmHeight, + wmWidth, + pureWmText, + wmSelectedFieldIds, + wmText + } = watermarkSetting; + if (wmClassify === "text") { + this.setState({ + wmClassify, wmNoTransparent, wmRotate, + wmcontSet: { + ...this.state.wmcontSet, textSet: wmOriginText ? { + wmOriginText, wmHeight, wmWidth, pureWmText, wmSelectedFieldIds, wmText + } : {} + } + }); + } else { + this.setState({ + wmClassify, wmNoTransparent, wmRotate, wmImg + }); + } + } + } + + handleCustomSave = () => { + const { wmClassify, wmImg, wmRotate, wmNoTransparent, wmcontSet } = this.state; + if ((wmClassify === "text" && _.isEmpty(wmcontSet.textSet)) || (wmClassify !== "text" && !wmImg)) { + this.refs.watermarkContError.showError(); + return; + } + if (wmClassify === "text") { + this.props.onChange({ + wmSetting: { + wmClassify, ...wmcontSet.textSet, + wmNoTransparent, wmRotate + } + }); + } else { + this.props.onChange({ + wmSetting: { + wmClassify, wmImg, + wmNoTransparent, wmRotate + } + }); + } + this.props.onClose(); + }; + + render() { + const { wmClassify, wmNoTransparent, wmRotate, wmImg, wmcontSet } = this.state; + return ( + {getLabel(111, "水印设置")}} + direction="right" top={0} width={800} height={100} + measureT="%" measureX="px" measureY="%" + content={ + + + +
+ this.setState({ wmClassify })} + /> + +
+
+ + { + wmClassify === "text" ? + +
+ this.setState({ wmcontSet: { ...wmcontSet, visible: true } })}/> + { + _.isEmpty(wmcontSet.textSet) ? : + { + window.open(`${window.location.origin}/spa/hrmSalary/static/index.html#/main/hrmSalary/payroll/watermark/preview`, "_blank"); + }} + > + + 预览 + + } +
+
: + +
+ this.setState({ wmImg }, () => { + window.localStorage.setItem("wmSetting", JSON.stringify({ + wmSetting: { + wmClassify, wmRotate, wmNoTransparent, + ...this.state.wmImg + } + })); + })} wmImg={wmImg}/> + { + !wmImg ? : + { + window.open(`${window.location.origin}/spa/hrmSalary/static/index.html#/main/hrmSalary/payroll/watermark/preview`, "_blank"); + }}>预览 + } +
+
+ } +
+ + this.setState({ wmNoTransparent })} + /> + + + this.setState({ wmRotate })} + /> + +
+
+ + +
+ {/* 水印内容设置弹框*/} + this.setState({ + wmcontSet: { + ...wmcontSet, + visible: false, + textSet + } + }, () => { + window.localStorage.setItem("wmSetting", JSON.stringify({ + wmSetting: { + wmClassify, wmRotate, wmNoTransparent, + ...this.state.wmcontSet.textSet + } + })); + })} + /> +
+ } + /> + ); + } +} + +export default WaterMarkSetModal; diff --git a/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js b/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js new file mode 100644 index 00000000..d6fecd53 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js @@ -0,0 +1,188 @@ +/* + * Author: 黎永顺 + * name: 水印内容设置 + * Description: + * Date: 2023/6/14 + */ +import React, { Component } from "react"; +import { + WeaFormItem, + WeaHelpfulTip, + WeaInputNumber, + WeaInputSearch, + WeaLocaleProvider, + WeaRichText, + WeaSearchGroup, + WeaSlideModal, + WeaTransfer +} from "ecCom"; +import { Button, Col, message, Row } from "antd"; +import { commonVariables } from "./config"; +import "./index.less"; + +const getLabel = WeaLocaleProvider.getLabel; +const WeaTransferList = WeaTransfer.list; + +class WmContentSetModal extends Component { + constructor(props) { + super(props); + this.state = { + wmWidth: 100, + wmHeight: 100, + wmOriginText: "", + searchV: "" + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible) { + this.setState({ + wmWidth: nextProps.textSet.wmWidth || 100, + wmHeight: nextProps.textSet.wmHeight || 100, + wmOriginText: nextProps.textSet.wmOriginText || "" + }); + } else { + this.setState({ + wmWidth: 100, + wmHeight: 100, + wmOriginText: "", + searchV: "" + }); + } + } + + handleSaveWMContent = () => { + const html = this.refs.TextContentRichText.getData().replace(/\n/ig, ""); + if (!html) { + message.warning(getLabel(111, "请输入水印内容!")); + return; + } + const { wmWidth, wmHeight } = this.state; + this.props.onClose({ + wmWidth, wmHeight, + wmSelectedFieldIds: this.getHtmlAttrVal(html), + pureWmText: this.convertToPlain(html), + wmOriginText: html, wmText: this.convertToWMText(html) + }); + }; + + convertToWMText = (html) => { + _.map(commonVariables, item => { + const { id, name } = item; + const reg = eval("/" + name + "/g"); + html = html.replace(reg, `$${id}`).replace(/ data-id=\"(.*?)\"/g, ""); + }); + return html.replace(/ contenteditable="false"/g, ""); + }; + getHtmlAttrVal = (html) => { + let attrAndValueArr = html.match(/ data-id=\"(.*?)\"/g); + let valueArr = []; // 放所有该属性的值 + if (!_.isEmpty(attrAndValueArr)) { + for (let i = 0; i < attrAndValueArr.length; i++) { + valueArr.push(attrAndValueArr[i].replace(/ data-id=/g, "").replace(/\"/g, "")); + } + } + return valueArr; + }; + convertToPlain = (html) => { + let tempDivElement = document.createElement("div"); + tempDivElement.innerHTML = html; + return tempDivElement.textContent || tempDivElement.innerText || ""; + }; + + renderItem = (item = {}) => { + return {item.name}; + }; + + selectHeader() { + return ( +
+ { + this.setState({ searchV: v }); + }}/> +
+ ); + } + + render() { + const { wmWidth, wmHeight, wmOriginText, searchV } = this.state; + const ckConfig = { + toolbar: [ + { name: "paragraph", items: ["JustifyLeft", "JustifyCenter", "JustifyRight"] }, + { name: "styles", items: ["Font", "FontSize"] }, + { name: "colors", items: ["TextColor"] } + ], + removePlugins: "resize", + height: 280 + }; + const tempOptions = _.filter(commonVariables, (item) => { + const { name } = item; + let flag = true; + if (searchV && name) { + flag = name.indexOf(searchV) > -1; + } + return flag; + }); + return ( + this.props.onClose(this.props.textSet)} + title={{getLabel(111, "水印内容设置")}} + direction="right" top={0} width={800} height={100} + measureT="%" measureX="px" measureY="%" + content={ + + {getLabel(111, "水印格式设置")}} + showGroup needTigger={false} className="waterMarkWrapper wmContGroup"> + + this.setState({ wmWidth })} + /> + + + this.setState({ wmHeight })} + /> + + + + + + + + + { + let result = _.filter(commonVariables, (item) => item.id === keys[0]); + if (result && result.length > 0) { + this.refs.TextContentRichText.insertHTML(` ${result[0].name} `); + } + }} + height={280} + checkedKeys={[]} + /> + + + +
+ + +
+
+ } + /> + ); + } +} + +export default WmContentSetModal; diff --git a/pc4mobx/hrmSalary/pages/payroll/index.js b/pc4mobx/hrmSalary/pages/payroll/index.js index 9297b134..c974b699 100644 --- a/pc4mobx/hrmSalary/pages/payroll/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/index.js @@ -3,8 +3,16 @@ import { inject, observer } from "mobx-react"; import { toJS } from "mobx"; import { Button, DatePicker, message, Modal } from "antd"; import moment from "moment"; -import { WeaHelpfulTip, WeaInputSearch, WeaNewScroll, WeaSelect, WeaSlideModal, WeaTop } from "ecCom"; -import { renderLoading } from "../../util"; // 渲染form数据的方法:因为多个页面都会使用,所以抽的公共方法在util中 +import { + WeaHelpfulTip, + WeaInputSearch, + WeaLocaleProvider, + WeaNewScroll, + WeaSelect, + WeaSlideModal, + WeaTop +} from "ecCom"; +import { renderLoading } from "../../util"; import CustomTab from "../../components/customTab"; import StepSlide from "../../components/stepSlide"; import BaseInformForm from "./stepForm/baseInformForm"; @@ -12,11 +20,13 @@ import ShowSettingForm from "./stepForm/showSettingForm"; import SlideModalTitle from "../../components/slideModalTitle"; import TemplateSettingList from "./templateSettingList"; import TemplateSettingForm from "./stepForm/tmplateSettingForm"; +import TemplateBaseSettings from "./templateBaseSettings"; import CopyModal from "./copyModal"; import SalarySendList from "./SalarySendList"; import { getReplenishForm } from "../../apis/payroll"; import "../dataAcquisition/cumDeduct/index.less"; +const getLabel = WeaLocaleProvider.getLabel; const { MonthPicker } = DatePicker; @inject("payrollStore", "taxAgentStore") @@ -38,7 +48,8 @@ export default class Payroll extends React.Component { templateCurrentId: "", copyModalVisible: false, startDate: moment(new Date()).startOf("year").format("YYYY-MM"), - endDate: moment(new Date()).startOf("month").format("YYYY-MM") + endDate: moment(new Date()).startOf("month").format("YYYY-MM"), + loading: false }; this.recordId = ""; this.salaryYearMonth = [moment(new Date()).startOf("year").format("YYYY-MM"), moment(new Date()).startOf("month").format("YYYY-MM")]; @@ -243,7 +254,15 @@ export default class Payroll extends React.Component { render() { const { payrollStore, taxAgentStore: { showOperateBtn } } = this.props; - const { loading, hasRight, templateStore, deletePayroll, templateBaseData } = payrollStore; + const { + loading, + hasRight, + templateTableSelectedRowKeys, + setTemplateTableSelectedRowKeys, + deletePayroll, + templateBaseData, + setTemplateTablePageInfo + } = payrollStore; const { currentStep, selectedTab, templateSearchValue, templateSelect, startDate, endDate } = this.state; if (!hasRight && !loading) { // 无权限处理 return renderLoading(); @@ -256,6 +275,10 @@ export default class Payroll extends React.Component { { title: "工资单模板设置", viewcondition: "1" + }, + { + title: getLabel(111, "工资单模板基础设置"), + viewcondition: "2" } ]; const renderRightOperation = () => { @@ -302,7 +325,7 @@ export default class Payroll extends React.Component { style={{ marginLeft: 10 }} type="ghost" onClick={() => { - const selectedRowKeys = toJS(templateStore.selectedRowKeys); + const selectedRowKeys = toJS(templateTableSelectedRowKeys); if (!selectedRowKeys.length) { message.info("未选中任何数据!"); return; @@ -328,11 +351,18 @@ export default class Payroll extends React.Component { { this.setState({ templateSearchValue: value }); - }} onSearch={(value) => { - this.handleTemplateSearch(value); - }}/> + }} + onSearch={(value) => { + this.handleTemplateSearch(value); + }} + />
); + } else if (this.state.selectedKey === "2") { + return ; } }; const steps = ["基础设置", "正常核算工资单模板", "补发工资单模版"]; @@ -371,7 +401,14 @@ export default class Payroll extends React.Component { topTab={topTab} searchOperationItem={renderRightOperation()} onChange={(v) => { - this.setState({ selectedKey: v, stepSlideVisible: false, editSlideVisible: false }); + this.setState({ + selectedKey: v, + stepSlideVisible: false, + editSlideVisible: false + }, () => { + setTemplateTablePageInfo({ current: 1 }); + setTemplateTableSelectedRowKeys([]); + }); }} />
@@ -405,6 +442,13 @@ export default class Payroll extends React.Component { onDelete={(record) => this.handleTemplateListDelete(record)} /> } + { + this.state.selectedKey === "2" && + this.baseSetRef = dom} + onChangeLoading={loading => this.setState({ loading })} + /> + }
diff --git a/pc4mobx/hrmSalary/pages/payroll/index.less b/pc4mobx/hrmSalary/pages/payroll/index.less new file mode 100644 index 00000000..f760536f --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/index.less @@ -0,0 +1,22 @@ +.waterMarkWrapper { + .wea-form-cell-wrapper { + border: 1px solid #e5e5e5; + border-bottom: none; + } + + .wea-form-item { + padding: 5px 16px; + border-bottom: 1px solid #e5e5e5; + + .waterMarkTitle { + margin-left: 10px; + cursor: pointer; + color: #2db7f5; + position: absolute; + display: inline-block; + width: 48px; + top: 50%; + margin-top: -10px; + } + } +} diff --git a/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js b/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js index aae01241..0be427d5 100644 --- a/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js @@ -310,7 +310,7 @@ export default class PayrollGrant extends React.Component { dataIndex: "", display: true, render: (text, record) => { - if (record.sendStatus === "1" && !notShowGrantOrWithdraw) { + if (record.sendStatus === "1" && salarySendDetailBaseInfo.canSend) { return ( ); - } else if (!notShowGrantOrWithdraw) { + } else if (salarySendDetailBaseInfo.canSend) { return ( ]; - if (selectedKey === "0" && !notShowGrantOrWithdraw) { + if (selectedKey === "0" && salarySendDetailBaseInfo.canSend) { btnDom = [ , ...btnDom ]; - } else if (selectedKey === "1" && !notShowGrantOrWithdraw) { + } else if (selectedKey === "1" && salarySendDetailBaseInfo.canSend) { btnDom = [ { + const { watermarkSet } = this.state; + getSalaryBillBaseSetForm().then(({ status, data }) => { + if (status) { + const { watermarkStatus, watermark = "DEFAULT", watermarkSetting } = data; + this.setState({ + watermark, watermarkStatus: watermarkStatus ? "1" : "0", + watermarkSet: { + ...watermarkSet, + watermarkSetting + } + }, () => window.localStorage.setItem("wmSetting", JSON.stringify({ wmSetting: watermarkSetting }))); + } + }); + }; + salaryBillBaseSetSave = () => { + const { watermark, watermarkStatus, wmSetting } = this.state; + let payload = { watermarkStatus: watermarkStatus === "1" }; + if (watermarkStatus === "1") payload = { ...payload, watermark }; + if (!_.isNil(wmSetting)) payload = { ...payload, watermark, ...wmSetting }; + this.props.onChangeLoading(true); + salaryBillBaseSetSave(payload).then(({ status, errormsg }) => { + this.props.onChangeLoading(false); + if (status) { + message.success(getLabel(111, "保存成功")); + this.getSalaryBillBaseSetForm(); + } else { + message.error(errormsg || getLabel(111, "保存失败")); + } + }).catch(() => this.props.onChangeLoading(false)); + }; + + render() { + const { watermarkStatus, watermark, watermarkSet } = this.state; + return ( + + + this.setState({ watermarkStatus, watermark: "DEFAULT" })}/> + + { + watermarkStatus === "1" && + + this.setState({ watermark })} + /> + { + watermark === "CUSTOM" && + this.setState({ + watermarkSet: { + ...watermarkSet, + visible: true + } + })}>{getLabel(111, "水印设置")} + } + this.setState({ watermarkSet: { ...watermarkSet, visible: false } })} + onChange={wmSetting => this.setState({ wmSetting })} + /> + + } + + ); + } +} + +export default TemplateBaseSettings; diff --git a/pc4mobx/hrmSalary/pages/payroll/templateSettingList.js b/pc4mobx/hrmSalary/pages/payroll/templateSettingList.js index 1711e103..05d75b27 100644 --- a/pc4mobx/hrmSalary/pages/payroll/templateSettingList.js +++ b/pc4mobx/hrmSalary/pages/payroll/templateSettingList.js @@ -1,10 +1,10 @@ import React from "react"; import { inject, observer } from "mobx-react"; +import { WeaLocaleProvider, WeaTable } from "ecCom"; +import { toJS } from "mobx"; import { Radio, Spin } from "antd"; -import { WeaTableNew } from "comsMobx"; - -const WeaTable = WeaTableNew.WeaTable; +const getLabel = WeaLocaleProvider.getLabel; @inject("payrollStore") @observer export default class TemplateSettingList extends React.Component { @@ -15,23 +15,23 @@ export default class TemplateSettingList extends React.Component { } // 编辑操作按钮 - onEdit(record) { + onEdit = (record) => { this.props.onEdit && this.props.onEdit(record); - } + }; // 复制操作按钮 - onCopy(record) { + onCopy = (record) => { this.props.onCopy && this.props.onCopy(record); - } + }; // 删除操作按钮 - onDelete(record) { + onDelete = (record) => { this.props.onDelete && this.props.onDelete(record); - } + }; // 操作按钮 - onOperatesClick = (record, index, operate, flag) => { - switch (operate.index.toString()) { + onOperatesClick = (record, operate) => { + switch (operate) { case "0": // 编辑 this.onEdit(record); break; @@ -45,21 +45,22 @@ export default class TemplateSettingList extends React.Component { }; // 默认使用配置 - recordItemChange(record) { + recordItemChange = (record) => { const { payrollStore } = this.props; const { changePayrollDefaultUse, getPayrollTemplateList } = payrollStore; changePayrollDefaultUse(record.id).then(() => { getPayrollTemplateList(); }); - } + }; // 增加编辑功能,重写columns绑定事件 - getColumns = columns => { - const { showOperateBtn } = this.props; - let newColumns = ""; - newColumns = columns.map(column => { + getColumns = () => { + const { showOperateBtn, payrollStore } = this.props; + const { templateTableColumns: columns } = payrollStore; + let newColumns = []; + newColumns = _.filter(toJS(columns), item => item.dataIndex !== "id").map(column => { let newColumn = column; - newColumn.render = (text, record, index) => { + newColumn.render = (text, record) => { //前端元素转义 let valueSpan = record[newColumn.dataIndex + "span"] !== undefined @@ -70,10 +71,8 @@ export default class TemplateSettingList extends React.Component { return ( { - this.recordItemChange(record); - }} + checked={record.useType === "1"} + onChange={() => this.recordItemChange(record)} /> ); default: @@ -82,25 +81,73 @@ export default class TemplateSettingList extends React.Component { }; return newColumn; }); - return newColumns; + return [ + ...newColumns, + { + dataIndex: "operate", + title: getLabel(30585, "操作"), + width: 150, + render: (_, record) => { + return + this.onOperatesClick(record, "0")}>{getLabel(501169, "编辑")} + this.onOperatesClick(record, "1")}>{getLabel(77, "复制")} + this.onOperatesClick(record, "2")}>{getLabel(535052, "删除")} + ; + } + } + ]; }; render() { const { payrollStore } = this.props; - const { templateStore, loading } = payrollStore; + const { + templateTableDataSource, + loading, + templateTablePageInfo, + setTemplateTablePageInfo, + getPayrollTemplateList, + templateTableSelectedRowKeys, + setTemplateTableSelectedRowKeys + } = payrollStore; + const pagination = { + ...templateTablePageInfo, + showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`, + showQuickJumper: true, + showSizeChanger: true, + pageSizeOptions: ["10", "20", "50", "100"], + onShowSizeChange: (current, pageSize) => { + setTemplateTablePageInfo({ ...templateTablePageInfo, current, pageSize }, () => { + getPayrollTemplateList(); + }); + }, + onChange: current => { + setTemplateTablePageInfo({ ...templateTablePageInfo, current }, () => { + getPayrollTemplateList(); + }); + } + }; + const rowSelection = { + selectedRowKeys: toJS(templateTableSelectedRowKeys), + onChange: selectedRowKeys => setTemplateTableSelectedRowKeys(selectedRowKeys) + }; return (
- {loading - ?
- -
- : } + { + loading + ?
+ +
+ : + }
); } diff --git a/pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js b/pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js new file mode 100644 index 00000000..4ea21411 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js @@ -0,0 +1,58 @@ +/* + * Author: 黎永顺 + * name: 水印预览 + * Description: + * Date: 2023/6/15 + */ +import React, { Component } from "react"; +import { salaryBillBaseSetPreviewWaterMark } from "../../apis/payroll"; +import { WeaTools } from "ecCom"; + +const { watermark } = WeaTools; + +class WatermarkPreview extends Component { + componentDidMount() { + const wmSetting = window.localStorage.getItem("wmSetting"); + wmSetting && this.salaryBillBaseSetPreviewWaterMark(JSON.parse(wmSetting)); + } + + salaryBillBaseSetPreviewWaterMark = (payload) => { + salaryBillBaseSetPreviewWaterMark(payload).then(({ status, data }) => { + if (status) { + const { wmHeight: height, wmWidth: width, wmNoTransparent, wmRotate } = payload; + watermark({ + text: data, + src: "", + width, height, + rotate: `-${wmRotate || 15}`, + alpha: wmNoTransparent / 100 || 0.15, + interval: 2000, + intervalCheck: true, + clickCheck: true + }); + } + }); + }; + + render() { + return ( +
+

水印预览效果

+

水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果

+

水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果

+

水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果

+

水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果

+

水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果

+

水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果水印预览效果

+
+ ); + } +} + +export default WatermarkPreview; diff --git a/pc4mobx/hrmSalary/pages/ruleConfig/index.js b/pc4mobx/hrmSalary/pages/ruleConfig/index.js index 3d3ac81f..6f088528 100644 --- a/pc4mobx/hrmSalary/pages/ruleConfig/index.js +++ b/pc4mobx/hrmSalary/pages/ruleConfig/index.js @@ -5,107 +5,67 @@ * Date: 2022-09-19 18:15:32 */ import React, { Component } from "react"; -import { WeaFormItem, WeaNewScroll, WeaSearchGroup, WeaSelect, WeaTop } from "ecCom"; -import { CheckBox } from "../appConfig"; -import { Button, message, Modal } from "antd"; +import { WeaCheckbox, WeaFormItem, WeaLocaleProvider, WeaNewScroll, WeaSearchGroup, WeaSelect, WeaTop } from "ecCom"; +import { message, Modal } from "antd"; import * as API from "../../apis/ruleconfig"; import "./index.less"; import ProgressModal from "../../components/progressModal"; -class Index extends Component { +const { getLabel } = WeaLocaleProvider; + +export default class Index extends Component { constructor(props) { super(props); this.state = { items: [], - importItems: [], - enctryItems: [], - declareItems: [], - loading: { - order: false, - employee: false, - encry: false, - declare: false - }, + matchRuleOptions: [], orderOptions: [], ascOptions: [], employeeOptions: [], saveParams: { orderRule: "", ascOrDesc: "", rule: "", enctry: "", - operateTaxDeclaration: "" + operateTaxDeclaration: "", + matchRule: "" }, + showEncryptOperationButton: "", progressVisible: false, progress: 50 }; } - componentDidMount() { - let sysSetting = this.getSysSetting(); + async componentDidMount() { + const { saveParams } = this.state; + const [ + matchRuleEnum, orderRuleEnum, ascOrDescEnum, matchEmployeeModeEnum, + orderRules, codeRule, appSettings + ] = await Promise.all([ + this.matchRuleEnum(), this.orderRuleEnum(), this.ascOrDescEnum(), this.matchEmployeeModeEnum(), + this.sysOrderRule(), this.sysConfCodeRule(), this.queryAppsetting() + ]); + const matchRuleOptions = _.map(matchRuleEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); + const orderOptions = _.map(orderRuleEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); + const ascOptions = _.map(ascOrDescEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); + const employeeOptions = _.map(matchEmployeeModeEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); + const { data: { ascOrDesc, orderRule } } = orderRules; + const { data: rule } = codeRule; + const { + data: { + showEncryptOperationButton, + isOpenEncrypt: enctry, + isOpenTaxDeclaration: operateTaxDeclaration, + salaryAcctEmployeeRule: matchRule + } + } = appSettings; + this.setState({ + matchRuleOptions, orderOptions, ascOptions, employeeOptions, + showEncryptOperationButton, + saveParams: { + ...saveParams, + ascOrDesc, orderRule, rule, enctry, operateTaxDeclaration, matchRule + } + }); } - getSysSetting = async () => { - const [orderRuleEnum, ascOrDescEnum, matchEmployeeModeEnum, sysOrderRule, sysConfCodeRule, queryAppsetting] = await Promise.all([this.orderRuleEnum(), this.ascOrDescEnum(), this.matchEmployeeModeEnum(), this.sysOrderRule(), this.sysConfCodeRule(), this.queryAppsetting()]); - if (orderRuleEnum.status && ascOrDescEnum.status && matchEmployeeModeEnum.status) { - const orderOptions = _.map(orderRuleEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); - const ascOptions = _.map(ascOrDescEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); - const employeeOptions = _.map(matchEmployeeModeEnum.data, it => ({ key: it.value, showname: it.defaultLabel })); - this.setState({ - items: [ - { - com: Select({ - label: "排序字段", - onChange: this.handleChane, - value: sysOrderRule.data.orderRule, - options: orderOptions - }) - }, - { - com: Select({ - label: "正序/倒序", - onChange: this.handleChane, - value: sysOrderRule.data.ascOrDesc, - options: ascOptions - }) - } - ], - importItems: [ - { - com: Select({ - label: "人员字段", - onChange: this.handleChane, - value: sysConfCodeRule.data, - options: employeeOptions - }) - } - ], - enctryItems: queryAppsetting.data.showEncryptOperationButton === "true" ? [ - { - com: CheckBox({ - label: "加密设置", - value: queryAppsetting.data.isOpenEncrypt, - onChange: (data) => this.handleChane({ type: "加密设置", selected: data }) - }) - } - ] : [], - declareItems: [ - { - com: CheckBox({ - label: "个税申报", - value: queryAppsetting.data.isOpenTaxDeclaration, - onChange: (data) => this.handleChane({ type: "个税申报", selected: data }) - }) - } - ], - saveParams: { - ...this.state.saveParams, - orderRule: sysOrderRule.data.orderRule, - ascOrDesc: sysOrderRule.data.ascOrDesc, - rule: sysConfCodeRule.data, - enctry: queryAppsetting.data.isOpenEncrypt, - operateTaxDeclaration: queryAppsetting.data.isOpenTaxDeclaration - } - }); - } - }; sysOrderRule = () => { return API.sysOrderRule(); }; @@ -115,6 +75,12 @@ class Index extends Component { queryAppsetting = () => { return API.queryAppsetting(); }; + matchRuleEnum = () => { + const payload = { + enumClass: "com.engine.salary.sys.enums.SalaryAcctEmployeeRuleEnum" + }; + return API.commonEnumList(payload); + }; orderRuleEnum = () => { const payload = { enumClass: "com.engine.salary.sys.enums.OrderRuleEnum" @@ -133,199 +99,214 @@ class Index extends Component { }; return API.commonEnumList(payload); }; - handleSave = (type) => { - const { saveParams } = this.state; - if (type === "ORDER") { - if (_.isEmpty(saveParams.orderRule) || _.isEmpty(saveParams.ascOrDesc)) { - Modal.warning({ - title: "信息确认", - content: "必要信息不完整,红色*为必填项!" - }); - return; - } - this.setState({ loading: { ...this.state.loading, order: true } }); - API.updateOrderRule(_.pick(saveParams, ["orderRule", "ascOrDesc"])).then(({ status, errormsg }) => { - this.setState({ loading: { ...this.state.loading, order: false } }); + updateOrderRule = () => { + API.updateOrderRule(_.pick(this.state.saveParams, ["orderRule", "ascOrDesc"])) + .then(({ status, errormsg }) => { if (status) { - message.success("保存成功!"); - let sysSetting = this.getSysSetting(); + message.success(getLabel(22619, "保存成功!")); } else { - message.error(errormsg || "保存失败!"); + message.error(errormsg || getLabel(22620, "保存失败!")); } }); - } else if (type === "EMPLOYEE") { - if (_.isEmpty(saveParams.rule)) { - Modal.warning({ - title: "信息确认", - content: "必要信息不完整,红色*为必填项!" - }); - return; + }; + saveMatchEmployeeModeRule = () => { + API.saveMatchEmployeeModeRule(_.pick(this.state.saveParams, ["rule"])).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(22619, "保存成功!")); + } else { + message.error(errormsg || getLabel(22620, "保存失败!")); } - this.setState({ loading: { ...this.state.loading, employee: true } }); - API.saveMatchEmployeeModeRule(_.pick(saveParams, ["rule"])).then(({ status, errormsg }) => { - this.setState({ loading: { ...this.state.loading, employee: false } }); + }); + }; + saveSalaryAcctEmployeeRule = () => { + API.saveSalaryAcctEmployeeRule({ rule: this.state.saveParams.matchRule }) + .then(({ status, errormsg }) => { if (status) { - message.success("保存成功!"); - let sysSetting = this.getSysSetting(); + message.success(getLabel(22619, "保存成功!")); } else { - message.error(errormsg || "保存失败!"); + message.error(errormsg || getLabel(22620, "保存失败!")); } }); - } else if (type === "ENCRYTION") { - Modal.confirm({ - title: "信息确认", - content: "开启/关闭加密前请做好数据库备份!!!逆向解密会花费几分钟时间,请耐心等待!!!", - onOk: () => { - this.setState({ loading: { ...this.state.loading, encry: true } }); - API.saveEncryptSetting({ isOpenEncrypt: saveParams.enctry }).then(({ data, status, errormsg }) => { - this.setState({ loading: { ...this.state.loading, encry: false } }); - if (status) { - const { isSuccess, progressId, msg } = data; - if (!isSuccess) { - message.error(errormsg || msg || "保存失败!"); - return; - } - this.setState({ - progressVisible: true, - progress: 0 - }, () => { - let number = 1; - this.timer && clearInterval(this.timer); - this.timer = setInterval(() => { - API.getEncryptProgress({ progressId }).then(({ status, data, errormsg }) => { - const { progress_statue } = data; - if (progress_statue === "success" && this.timer) { - clearInterval(this.timer); - this.timer = null; - number = 1; - this.setState({ - progress: 100 - }, () => { - this.setState({ - progressVisible: false - }); - }); - message.success("保存成功"); - } else if (progress_statue === "in_progress" && this.timer) { - if (this.state.progress >= 90) { - this.setState({ - progress: this.state.progress + (0.001 * this.state.progress) - }); - } else { - this.setState({ - progress: 10 * number - }, () => number++); - } - } else if (!status || (progress_statue === "fail" && this.timer)) { - clearInterval(this.timer); - this.timer = null; - number = 1; - this.setState({ - progress: 100 - }, () => { - this.setState({ - progressVisible: false - }); - }); - message.error(errormsg || "保存失败!"); - } + }; + operateTaxDeclarationFunction = () => { + API.operateTaxDeclarationFunction(_.pick(this.state.saveParams, ["operateTaxDeclaration"])) + .then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(22619, "保存成功!")); + } else { + message.error(errormsg || getLabel(22620, "保存失败!")); + } + }); + }; + saveEncryptSetting = () => { + API.saveEncryptSetting({ isOpenEncrypt: this.state.saveParams.enctry }) + .then(({ data, status, errormsg }) => { + if (status) { + const { isSuccess, progressId, msg } = data; + if (!isSuccess) { + message.error(errormsg || msg || getLabel(22620, "保存失败!")); + return; + } + this.setState({ + progressVisible: true, + progress: 0 + }, () => { + let number = 1; + this.timer && clearInterval(this.timer); + this.timer = setInterval(() => { + API.getEncryptProgress({ progressId }).then(({ status, data, errormsg }) => { + const { progress_statue } = data; + if (progress_statue === "success" && this.timer) { + clearInterval(this.timer); + this.timer = null; + number = 1; + this.setState({ + progress: 100 + }, () => { + this.setState({ + progressVisible: false + }); }); - }, 1000); + message.success(getLabel(22619, "保存成功!")); + } else if (progress_statue === "in_progress" && this.timer) { + if (this.state.progress >= 90) { + this.setState({ + progress: this.state.progress + (0.001 * this.state.progress) + }); + } else { + this.setState({ + progress: 10 * number + }, () => number++); + } + } else if (!status || (progress_statue === "fail" && this.timer)) { + clearInterval(this.timer); + this.timer = null; + number = 1; + this.setState({ + progress: 100 + }, () => { + this.setState({ + progressVisible: false + }); + }); + message.error(errormsg || getLabel(22620, "保存失败!")); + } }); - } + }, 1000); }); - }, - onCancel: () => { } }); - } else if (type === "DECLARATION") { - this.setState({ loading: { ...this.state.loading, declare: true } }); - API.operateTaxDeclarationFunction(_.pick(saveParams, ["operateTaxDeclaration"])).then(({ status, errormsg }) => { - this.setState({ loading: { ...this.state.loading, declare: false } }); - if (status) { - message.success("保存成功!"); - let sysSetting = this.getSysSetting(); - } else { - message.error(errormsg || "保存失败!"); - } - }); - } }; - handleChane = (data) => { - const { type, selected } = data; - if (type === "排序字段") { - this.setState({ - saveParams: { ...this.state.saveParams, orderRule: selected } - }); - } else if (type === "正序/倒序") { - this.setState({ - saveParams: { ...this.state.saveParams, ascOrDesc: selected } - }); - } else if (type === "人员字段") { - this.setState({ - saveParams: { ...this.state.saveParams, rule: selected } - }); - } else if (type === "加密设置") { - this.setState({ - saveParams: { ...this.state.saveParams, enctry: selected } - }); - } else if (type === "个税申报") { - this.setState({ - saveParams: { ...this.state.saveParams, operateTaxDeclaration: selected } - }); - } + handleChange = (key, val) => { + const { saveParams } = this.state; + Modal.confirm({ + title: getLabel(131329, "信息确认"), + content: getLabel(111, "确认要保存吗?"), + onOk: () => { + this.setState({ + saveParams: { + ...saveParams, + [key]: val + } + }, () => { + switch (key) { + case "orderRule": + case "ascOrDesc": + this.updateOrderRule(); + break; + case "rule": + this.saveMatchEmployeeModeRule(); + break; + case "matchRule": + this.saveSalaryAcctEmployeeRule(); + break; + case "operateTaxDeclaration": + this.operateTaxDeclarationFunction(); + break; + case "enctry": + this.saveEncryptSetting(); + break; + default: + break; + } + }); + }, + onCancel: () => { + this.setState({ + saveParams: { + ...saveParams, + [key]: saveParams[key] + } + }); + } + }); }; render() { - const { items, importItems, enctryItems, declareItems, loading } = this.state; + const { + saveParams, + matchRuleOptions, + orderOptions, + ascOptions, + employeeOptions, + showEncryptOperationButton + } = this.state; + const { orderRule, ascOrDesc, rule, enctry, operateTaxDeclaration, matchRule } = saveParams; return (
规则配置} + title={{getLabel(543355, "规则配置")}} icon={} iconBgcolor="#F14A2D" buttons={[]} /> - - 排序规则 - -
- } showGroup center items={items}/> - - 人员校验规则 - - - } showGroup center items={importItems}/> + + + this.handleChange("orderRule", val)} + /> + + + this.handleChange("ascOrDesc", val)} + /> + + + + + this.handleChange("rule", val)} + /> + + { - !_.isEmpty(enctryItems) && - - 加密规则 - - - } showGroup center items={enctryItems}/> + showEncryptOperationButton === "true" && + + + this.handleChange("enctry", val)}/> + + } - - 报税规则 - - - } showGroup center items={declareItems}/> + + + this.handleChange("operateTaxDeclaration", val)}/> + + + + + this.handleChange("matchRule", val)} + /> + + { this.state.progressVisible && { this.setState({ progressVisible: false, progress: 0 }); @@ -339,8 +320,6 @@ class Index extends Component { } } -export default Index; - export const Select = payload => { const { label, @@ -354,7 +333,7 @@ export const Select = payload => { } = payload; return ( - (this.replenishSalaryTemplateSalaryItemSet = replenishSalaryTemplateSalaryItemSet); @@ -80,6 +88,14 @@ export class payrollStore { @action setSalaryItemSet = salaryItemSet => (this.salaryItemSet = salaryItemSet); + @action("工资单模板分页信息修改") + setTemplateTablePageInfo = (pageInfo, callback) => { + this.templateTablePageInfo = { ...this.templateTablePageInfo, ...pageInfo }; + callback && callback(); + }; + @action("工资单模板复选框选择") + setTemplateTableSelectedRowKeys = (selectedRowKeys) => this.templateTableSelectedRowKeys = selectedRowKeys; + // 初始化操作 @action doInit = () => { @@ -136,9 +152,15 @@ export class payrollStore { @action getPayrollTemplateList = (params = {}) => { this.loading = true; - API.getPayrollTemplateList(params).then(res => { + API.getPayrollTemplateList({ ...this.templateTablePageInfo, ...params }).then(res => { if (res.status) { - this.templateStore.getDatas(res.data.datas); + this.templateTableColumns = res.data.columns; + this.templateTableDataSource = res.data.list; + this.setTemplateTablePageInfo({ + current: res.data.pageNum, + pageSize: res.data.pageSize, + total: res.data.total + }); } else { message.error(res.errormsg || "获取失败"); } @@ -149,9 +171,7 @@ export class payrollStore { // 工资单模板-获取工资单模板基础设置表单 @action getPayrollBaseForm = (id = "") => { - let params = { - id - }; + let params = { id }; return new Promise((resolve, reject) => { API.getPayrollBaseForm(params).then(res => { if (res.status) { @@ -354,6 +374,7 @@ export class payrollStore { API.deletePayroll(ids).then(res => { if (res.status) { message.success("删除成功"); + this.setTemplateTableSelectedRowKeys([]); this.getPayrollTemplateList(); } else { message.error(res.errormsg || "删除失败"); @@ -525,7 +546,7 @@ export class payrollStore { reject(); } }).catch(() => { - this.btnLoading = false + this.btnLoading = false; // WeaLoadingGlobal.end(); // WeaLoadingGlobal.destroy(); }); @@ -553,7 +574,7 @@ export class payrollStore { reject(); } }).catch(() => { - this.btnLoading = false + this.btnLoading = false; WeaLoadingGlobal.end(); WeaLoadingGlobal.destroy(); });