diff --git a/pc4mobx/hrmSalary/apis/payroll.js b/pc4mobx/hrmSalary/apis/payroll.js index 1f9b1d64..6f48f359 100644 --- a/pc4mobx/hrmSalary/apis/payroll.js +++ b/pc4mobx/hrmSalary/apis/payroll.js @@ -375,6 +375,10 @@ export const sendMobileCode = (params) => { export const payrollCheckType = params => { return WeaTools.callApi("/api/bs/hrmsalary/salaryBill/payrollCheckType", "GET", params); }; +//工资单-确认 +export const confirmSalaryBill = params => { + return WeaTools.callApi("/api/bs/hrmsalary/salaryBill/confirmSalaryBill", "GET", params); +}; // 工资单基础设置-获取设置列表 export const getSalaryBillBaseSetForm = (id) => { diff --git a/pc4mobx/hrmSalary/apis/ruleconfig.js b/pc4mobx/hrmSalary/apis/ruleconfig.js index 2e3c0c4f..c041b4d3 100644 --- a/pc4mobx/hrmSalary/apis/ruleconfig.js +++ b/pc4mobx/hrmSalary/apis/ruleconfig.js @@ -63,3 +63,7 @@ export const reportStatisticsReportSave = (params) => { export const reportGetForm = params => { return WeaTools.callApi("/api/bs/hrmsalary/report/statistics/report/getForm", "GET", params); }; +//工资单反馈 +export const saveSalarySendFeedback = (params) => { + return postFetch("/api/bs/hrmsalary/sys/saveSalarySendFeedback", params); +}; diff --git a/pc4mobx/hrmSalary/pages/mobilePayroll/index.js b/pc4mobx/hrmSalary/pages/mobilePayroll/index.js index 5a41f8ac..d18e87b5 100644 --- a/pc4mobx/hrmSalary/pages/mobilePayroll/index.js +++ b/pc4mobx/hrmSalary/pages/mobilePayroll/index.js @@ -8,9 +8,10 @@ import ComputerTemplate from "../payroll/templatePreview/computerTemplate"; import PhoneTemplate from "../payroll/templatePreview/phoneTemplate"; import "../payroll/templatePreview/index.less"; import * as API from "../../apis/mySalaryBenefits"; -import { payrollCheckType } from "../../apis/payroll"; +import { confirmSalaryBill, payrollCheckType } from "../../apis/payroll"; import CaptchaModal from "../../components/captchaModal"; import PassSetDialog from "./passSetDialog"; +import { ConfirmBtns } from "../mySalary/mySalaryView"; import "./index.less"; const getLabel = WeaLocaleProvider.getLabel; @@ -113,6 +114,22 @@ export default class MobilePayroll extends React.Component { } return params; }; + confirmSalaryBill = () => { + confirmSalaryBill({ salaryInfoId: getQueryString("id") }).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(30700, "操作成功")); + this.getMySalaryBill(getQueryString("id")); + } else { + message.error(errormsg || getLabel(30651, "操作失败")); + } + }); + }; + handleGoFeedback = () => { + const { mySalaryBillData } = this.state; + const { salaryTemplate } = mySalaryBillData; + const { feedbackUrl } = salaryTemplate; + window.open(`${window.ecologyContentPath || ""}${feedbackUrl}`); + }; render() { const { mySalaryStore: { clearLoading, pwdForm } } = this.props; @@ -156,7 +173,15 @@ export default class MobilePayroll extends React.Component { isPreview salaryTemplateShowSet={JSON.stringify(mySalaryBillData.salaryTemplate)} salaryItemSet={!_.isEmpty(salaryGroups) ? JSON.stringify([employeeInformation, ...salaryGroups]) : []} - /> + > + { + (_.isNil(mySalaryBillData.confirmStatus) || mySalaryBillData.confirmStatus === "0") && + + } + @@ -169,7 +194,15 @@ export default class MobilePayroll extends React.Component { isPreview salaryTemplateShowSet={JSON.stringify(mySalaryBillData.salaryTemplate)} salaryItemSet={!_.isEmpty(salaryGroups) ? JSON.stringify([employeeInformation, ...salaryGroups]) : JSON.stringify([])} - /> + > + { + (_.isNil(mySalaryBillData.confirmStatus) || mySalaryBillData.confirmStatus === "0") && + + } + diff --git a/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js b/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js index bda458fb..c614c952 100644 --- a/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js +++ b/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js @@ -6,12 +6,16 @@ */ import React, { Component } from "react"; import { inject, observer } from "mobx-react"; +import { Button, message } from "antd"; +import { WeaLocaleProvider } from "ecCom"; import Authority from "./authority"; import ComputerTemplate from "../payroll/templatePreview/computerTemplate"; -import { payrollCheckType } from "../../apis/payroll"; +import { confirmSalaryBill, payrollCheckType } from "../../apis/payroll"; import CaptchaModal from "../../components/captchaModal"; import "../payroll/templatePreview/index.less"; +const { getLabel } = WeaLocaleProvider; + @inject("mySalaryStore") @observer class MySalaryView extends Component { @@ -37,6 +41,26 @@ class MySalaryView extends Component { } } + confirmSalaryBill = () => { + const { mySalaryStore: { getMySalaryBill }, params: { salaryInfoId } } = this.props; + confirmSalaryBill({ salaryInfoId }).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(30700, "操作成功")); + getMySalaryBill(Number(salaryInfoId)).then(data => { + this.setState({ mySalaryStore: data }); + }); + } else { + message.error(errormsg || getLabel(30651, "操作失败")); + } + }); + }; + handleGoFeedback = () => { + const { mySalaryStore } = this.state; + const { salaryTemplate } = mySalaryStore; + const { feedbackUrl } = salaryTemplate; + window.open(`${window.ecologyContentPath || ""}${feedbackUrl}`); + }; + render() { const { captchaVisible, mySalaryStore } = this.state; const { params: { salaryInfoId } } = this.props; @@ -56,7 +80,15 @@ class MySalaryView extends Component { isPreview isMsgPreview salaryTemplateShowSet={salaryTemplateShowSet ? JSON.stringify(salaryTemplateShowSet) : []} salaryItemSet={!_.isEmpty(salaryGroups) ? JSON.stringify([employeeInformation, ...salaryGroups]) : []} - /> + > + { + (_.isNil(mySalaryStore.confirmStatus) || mySalaryStore.confirmStatus === "0") && + + } + @@ -71,3 +103,10 @@ class MySalaryView extends Component { } export default MySalaryView; + +export const ConfirmBtns = (props) => { + return
+ + +
; +}; diff --git a/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js b/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js index 947db8db..b81e1f6e 100644 --- a/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js +++ b/pc4mobx/hrmSalary/pages/payroll/SalarySendList.js @@ -21,10 +21,7 @@ export default class SalarySendList extends React.Component { // 发放回调 handleGrant(record) { - window.open( - "/spa/hrmSalary/static/index.html#/main/hrmSalary/payrollGrant?id=" + - record.id - ); + window.open(`/spa/hrmSalary/static/index.html#/main/hrmSalary/payrollGrant?id=${record.id}&ackFeedbackStatus=${record.ackFeedbackStatus}`); } // 查看详情 diff --git a/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js b/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js index 0be427d5..9582c550 100644 --- a/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/payrollGrant/index.js @@ -25,6 +25,7 @@ export default class PayrollGrant extends React.Component { selectedKey: "0", progressVisible: false, progress: 0, + showFeedbackColumn: false, payrollPartModalParams: { visible: false, title: "工资单发放", @@ -39,7 +40,10 @@ export default class PayrollGrant extends React.Component { componentWillMount() { const { selectedKey } = this.state; let id = getQueryString("id"); - this.setState({ currentId: id }); + this.setState({ + currentId: id, + showFeedbackColumn: getQueryString("ackFeedbackStatus") === "1" + }); const { payrollStore: { getPayrollInfo, getInfoList, getPaySa } } = this.props; @@ -299,11 +303,12 @@ export default class PayrollGrant extends React.Component { }; getColumns = () => { + const { selectedKey, showFeedbackColumn } = this.state; const { payrollStore } = this.props; const { salaryGrantTableStore: columns, salarySendDetailBaseInfo } = payrollStore; const notShowGrantOrWithdraw = salarySendDetailBaseInfo.haveBackCalc === 1 && salarySendDetailBaseInfo.salaryAcctType === "0"; return _.map([ - ...toJS(columns), + ..._.filter(toJS(columns), it => ((selectedKey === "0" && it.dataIndex !== "billReadStatus" && it.dataIndex !== "billConfirmStatus") || (selectedKey === "1" && !showFeedbackColumn && it.dataIndex !== "billReadStatus" && it.dataIndex !== "billConfirmStatus") || (selectedKey === "1" && showFeedbackColumn))), { title: "操作", key: "", @@ -602,6 +607,7 @@ export default class PayrollGrant extends React.Component { { this.state.progressVisible && { this.setState({ progressVisible: false, progress: 0 }); diff --git a/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js b/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js index 5cd3f6f1..7cb231ec 100644 --- a/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js +++ b/pc4mobx/hrmSalary/pages/payroll/stepForm/baseInformForm.js @@ -1,5 +1,14 @@ import React from "react"; -import { WeaCheckbox, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup, WeaSelect, WeaTimePicker } from "ecCom"; +import { + WeaCheckbox, + WeaFormItem, + WeaInput, + WeaInputNumber, + WeaLocaleProvider, + WeaSearchGroup, + WeaSelect, + WeaTimePicker, +} from "ecCom"; import { inject, observer } from "mobx-react"; import { getReplenishRuleSetOptions } from "../../../apis/payroll"; import { commonEnumList } from "../../../apis/payrollFiles"; @@ -91,17 +100,8 @@ export default class BaseInformForm extends React.Component { render() { const { request, options, replenishRuleOptions, salaryMonthOptions } = this.state; const { - salarySob, - name, - description, - replenishName, - replenishRule, - reissueRule, - msgStatus, - emailStatus, - autoSendStatus, - autoSendDayOfMonth, - autoSendTimeOfDay, + salarySob, name, description, replenishName, replenishRule, reissueRule, msgStatus, emailStatus, + ackFeedbackStatus, autoAckDays, feedbackUrl, autoSendStatus, autoSendDayOfMonth, autoSendTimeOfDay, autoSendCycleType } = request; @@ -220,6 +220,34 @@ export default class BaseInformForm extends React.Component { } + + + this.hanldeChange({ + ackFeedbackStatus: value === "1", + autoAckDays: 7, + feedbackUrl: "/" + })}/> + + { + ackFeedbackStatus && + + + this.hanldeChange({ autoAckDays })} + /> + + + this.hanldeChange({ feedbackUrl })} + /> + + + } + ); } diff --git a/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js b/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js index 742fa874..08b4e813 100644 --- a/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js +++ b/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js @@ -5,8 +5,16 @@ * Date: 2023/6/12 */ import React, { Component } from "react"; -import { WeaCheckbox, WeaFormItem, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom"; -import { message } from "antd"; +import { + WeaCheckbox, + WeaFormItem, + WeaInput, + WeaInputNumber, + WeaLocaleProvider, + WeaSearchGroup, + WeaSelect +} from "ecCom"; +import { message, Modal } from "antd"; import { getSalaryBillBaseSetForm, salaryBillBaseSetSave } from "../../apis/payroll"; import WaterMarkSetModal from "./components/waterMarkSetModal"; import "./index.less"; @@ -22,6 +30,11 @@ class TemplateBaseSettings extends Component { wmSetting: null, watermarkSet: { visible: false, watermarkSetting: null + }, + ackFeedbackSetting: { + ackStatus: "0", + autoAckDays: 7, + feedBackUrl: "" } }; } @@ -34,9 +47,10 @@ class TemplateBaseSettings extends Component { const { watermarkSet } = this.state; getSalaryBillBaseSetForm().then(({ status, data }) => { if (status) { - const { watermarkStatus, watermark = "DEFAULT", watermarkSetting } = data; + const { watermarkStatus, watermark = "DEFAULT", watermarkSetting, ackFeedbackSetting } = data; this.setState({ - watermark, watermarkStatus: watermarkStatus ? "1" : "0", + watermark, watermarkStatus: watermarkStatus ? "1" : "0", ackFeedbackSetting, + wmSetting: { wmSetting: watermarkSetting }, watermarkSet: { ...watermarkSet, watermarkSetting @@ -46,8 +60,16 @@ class TemplateBaseSettings extends Component { }); }; salaryBillBaseSetSave = () => { - const { watermark, watermarkStatus, wmSetting } = this.state; - let payload = { watermarkStatus: watermarkStatus === "1" }; + const { watermark, watermarkStatus, wmSetting, ackFeedbackSetting } = this.state; + const { feedBackUrl } = ackFeedbackSetting; + if (!feedBackUrl) { + Modal.warning({ + title: getLabel(111, "信息确认"), + content: getLabel(111, "必要信息不完整,红色*为必填项!") + }); + return; + } + let payload = { watermarkStatus: watermarkStatus === "1", ackFeedbackSetting: { ...ackFeedbackSetting } }; if (watermarkStatus === "1") payload = { ...payload, watermark }; if (!_.isNil(wmSetting)) payload = { ...payload, watermark, ...wmSetting }; this.props.onChangeLoading(true); @@ -63,40 +85,76 @@ class TemplateBaseSettings extends Component { }; render() { - const { watermarkStatus, watermark, watermarkSet } = this.state; + const { watermarkStatus, watermark, watermarkSet, ackFeedbackSetting } = this.state; + const { ackStatus, autoAckDays, feedBackUrl } = ackFeedbackSetting; 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 })} - /> + + + + 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 })} + /> + + } + + + + this.setState({ + ackFeedbackSetting: { + ...ackFeedbackSetting, ackStatus, autoAckDays: 7 + } + })}/> + + { + ackStatus === "1" && + + + this.setState({ + ackFeedbackSetting: { + ...ackFeedbackSetting, autoAckDays + } + })}/> + + + this.setState({ + ackFeedbackSetting: { + ...ackFeedbackSetting, feedBackUrl + } + })}/> + + + } + + ); } } diff --git a/pc4mobx/hrmSalary/pages/payroll/templatePreview/computerTemplate/index.js b/pc4mobx/hrmSalary/pages/payroll/templatePreview/computerTemplate/index.js index 6f2e68c2..0c4c8c07 100644 --- a/pc4mobx/hrmSalary/pages/payroll/templatePreview/computerTemplate/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/templatePreview/computerTemplate/index.js @@ -109,6 +109,7 @@ export default class ComputerTemplate extends React.Component { salaryTemplateShowSet.textContentPosition == 2 && salaryTemplateShowSet.textContent } + {this.props.children} ); } diff --git a/pc4mobx/hrmSalary/pages/payroll/templatePreview/index.less b/pc4mobx/hrmSalary/pages/payroll/templatePreview/index.less index 52517511..0d2d5dda 100644 --- a/pc4mobx/hrmSalary/pages/payroll/templatePreview/index.less +++ b/pc4mobx/hrmSalary/pages/payroll/templatePreview/index.less @@ -85,7 +85,8 @@ margin: 10px; background-color: #FFF; padding: 10px; - .descript-title{ + + .descript-title { display: flex; align-items: center; margin-bottom: 10px; @@ -100,15 +101,18 @@ border: 1px solid #fafafa; border-bottom: none; } - .descriptions-view{ + + .descriptions-view { width: 100%; - table{ + + table { table-layout: fixed; border-collapse: collapse; width: 100%; - border: 1px solid rgba(0,0,0,.06); - .descriptions-row{ - .descriptions-item-label{ + border: 1px solid rgba(0, 0, 0, .06); + + .descriptions-row { + .descriptions-item-label { background-color: #fafafa; padding: 16px 24px; color: #000000d9; @@ -116,11 +120,12 @@ font-size: 12px; line-height: 1.5715; text-align: start; - border: 1px solid rgba(0,0,0,.06); + border: 1px solid rgba(0, 0, 0, .06); min-width: 100px; max-width: 100px; } - .descriptions-item-content{ + + .descriptions-item-content { padding: 16px 24px; display: table-cell; flex: 1; @@ -130,10 +135,20 @@ word-break: break-word; overflow-wrap: break-word; border-collapse: collapse; - border: 1px solid rgba(0,0,0,.06); + border: 1px solid rgba(0, 0, 0, .06); } } } } } + + .space { + display: flex; + align-items: center; + justify-content: flex-end; + + .ant-btn { + margin-right: 10px; + } + } } diff --git a/pc4mobx/hrmSalary/pages/payroll/templatePreview/phoneTemplate/index.js b/pc4mobx/hrmSalary/pages/payroll/templatePreview/phoneTemplate/index.js index 0f85d51d..2a572966 100644 --- a/pc4mobx/hrmSalary/pages/payroll/templatePreview/phoneTemplate/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/templatePreview/phoneTemplate/index.js @@ -100,6 +100,7 @@ export default class PhoneTemplate extends React.Component { salaryTemplateShowSet.textContentPosition == 2 && salaryTemplateShowSet.textContent } + {this.props.children} ); } diff --git a/pc4mobx/hrmSalary/pages/ruleConfig/index.js b/pc4mobx/hrmSalary/pages/ruleConfig/index.js index 1de2e589..30d2d1be 100644 --- a/pc4mobx/hrmSalary/pages/ruleConfig/index.js +++ b/pc4mobx/hrmSalary/pages/ruleConfig/index.js @@ -344,8 +344,8 @@ export default class Index extends Component { onChange={val => this.handleChange("confValue", val)}/> - - + + this.handleChange("matchRule", val)} />