From 797cb912a293fc3dbd7daee4057f586c4c75f12c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Tue, 13 Jun 2023 09:10:23 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BA=A7=E5=93=81-=E5=B7=A5=E8=B5=84?= =?UTF-8?q?=E5=8D=95=E6=A8=A1=E6=9D=BF=E5=9F=BA=E7=A1=80=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=B0=B4=E5=8D=B0=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/pages/payroll/index.js | 24 ++++++++- pc4mobx/hrmSalary/pages/payroll/index.less | 22 ++++++++ .../pages/payroll/templateBaseSettings.js | 52 +++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 pc4mobx/hrmSalary/pages/payroll/index.less create mode 100644 pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js diff --git a/pc4mobx/hrmSalary/pages/payroll/index.js b/pc4mobx/hrmSalary/pages/payroll/index.js index 9297b134..1a6307d7 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") @@ -256,6 +266,10 @@ export default class Payroll extends React.Component { { title: "工资单模板设置", viewcondition: "1" + }, + { + title: getLabel(111, "工资单模板基础设置"), + viewcondition: "2" } ]; const renderRightOperation = () => { @@ -333,6 +347,8 @@ export default class Payroll extends React.Component { }}/> ); + } else if (this.state.selectedKey === "2") { + return ; } }; const steps = ["基础设置", "正常核算工资单模板", "补发工资单模版"]; @@ -405,6 +421,10 @@ export default class Payroll extends React.Component { onDelete={(record) => this.handleTemplateListDelete(record)} /> } + { + this.state.selectedKey === "2" && + + } 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/templateBaseSettings.js b/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js new file mode 100644 index 00000000..e7ca064b --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js @@ -0,0 +1,52 @@ +/* + * Author: 黎永顺 + * name: 工资单模板基础设置 + * Description: + * Date: 2023/6/12 + */ +import React, { Component } from "react"; +import { WeaCheckbox, WeaFormItem, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom"; +import "./index.less"; + +const getLabel = WeaLocaleProvider.getLabel; + +class TemplateBaseSettings extends Component { + constructor(props) { + super(props); + this.state = { + watermarkStatus: "0", + watermark: "DEFAULT" + }; + } + + render() { + const { watermarkStatus, watermark } = this.state; + return ( + + + this.setState({ watermarkStatus, watermark: "DEFAULT" })}/> + + { + watermarkStatus === "1" && + + this.setState({ watermark })} + /> + { + watermark === "CUSTOM" && + {getLabel(111, "水印设置")} + } + + } + + ); + } +} + +export default TemplateBaseSettings; From 92c73b846a1555b296a8465b0f394a1d967bb0ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Thu, 15 Jun 2023 18:28:06 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BA=A7=E5=93=81-=E5=B7=A5=E8=B5=84?= =?UTF-8?q?=E5=8D=95=E6=B0=B4=E5=8D=B0=E8=AE=BE=E7=BD=AE=E4=B8=8E=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=AD=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/apis/payroll.js | 13 ++ pc4mobx/hrmSalary/components/upload/index.js | 84 ++++++++ .../hrmSalary/components/upload/index.less | 68 +++++++ pc4mobx/hrmSalary/index.js | 5 + pc4mobx/hrmSalary/pages/mySalary/index.js | 8 +- .../hrmSalary/pages/mySalary/mySalaryView.js | 39 ++++ .../pages/payroll/components/config.js | 14 ++ .../pages/payroll/components/index.less | 127 ++++++++++++ .../payroll/components/waterMarkSetModal.js | 191 ++++++++++++++++++ .../payroll/components/wmContentSetModal.js | 188 +++++++++++++++++ pc4mobx/hrmSalary/pages/payroll/index.js | 13 +- .../pages/payroll/templateBaseSettings.js | 58 +++++- .../pages/payroll/watermarkPreview.js | 56 +++++ pc4mobx/hrmSalary/stores/mySalary.js | 42 +++- 14 files changed, 895 insertions(+), 11 deletions(-) create mode 100644 pc4mobx/hrmSalary/components/upload/index.js create mode 100644 pc4mobx/hrmSalary/components/upload/index.less create mode 100644 pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js create mode 100644 pc4mobx/hrmSalary/pages/payroll/components/config.js create mode 100644 pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js create mode 100644 pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js create mode 100644 pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js diff --git a/pc4mobx/hrmSalary/apis/payroll.js b/pc4mobx/hrmSalary/apis/payroll.js index eaf11a11..e133c537 100644 --- a/pc4mobx/hrmSalary/apis/payroll.js +++ b/pc4mobx/hrmSalary/apis/payroll.js @@ -367,3 +367,16 @@ export const getAvailableSalaryItemSet = (params) => { export const salaryBillSendSum = (params) => { return postFetch("/api/bs/hrmsalary/salaryBill/send/sum", 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/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}> + + { return ( - { - this.handleView(record); - }}>查看 + {getLabel(33564, "查看")} ); } }); diff --git a/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js b/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js new file mode 100644 index 00000000..9872affc --- /dev/null +++ b/pc4mobx/hrmSalary/pages/mySalary/mySalaryView.js @@ -0,0 +1,39 @@ +/* + * Author: 黎永顺 + * name: 查看我的薪资-工资单 + * Description: + * Date: 2023/6/14 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { toJS } from "mobx"; +import ComputerTemplate from "../payroll/templatePreview/computerTemplate"; +import "../payroll/templatePreview/index.less"; + +@inject("mySalaryStore") +@observer +class MySalaryView extends Component { + componentDidMount() { + const { mySalaryStore: { getMySalaryBill }, params: { salaryInfoId } } = this.props; + getMySalaryBill(Number(salaryInfoId)); + } + + render() { + const { mySalaryStore: { mySalaryBill } } = this.props; + const employeeInformation = mySalaryBill.employeeInformation && toJS(mySalaryBill.employeeInformation); + const salaryGroups = mySalaryBill.salaryGroups && toJS(mySalaryBill.salaryGroups); + return ( +
+
+ +
+
+ ); + } +} + +export default MySalaryView; 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..ee7666e9 100644 --- a/pc4mobx/hrmSalary/pages/payroll/components/index.less +++ b/pc4mobx/hrmSalary/pages/payroll/components/index.less @@ -46,3 +46,130 @@ } } } + +.waterMarkSetWrapper { + & > .rodal { + right: 25% !important; + } +} + +.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..48c6658d --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js @@ -0,0 +1,191 @@ +/* + * Author: 黎永顺 + * name: 水印设置-弹框 + * Description: + * Date: 2023/6/13 + */ +import React, { Component } from "react"; +import { + WeaError, + WeaFormItem, + 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={20} width={800} height={400} + measureT={"%"} measureX="px" measureY="px" + 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..beea8bdd --- /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={-10} width={800} height={480} + measureT={"%"} measureX="px" measureY="px" + 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 1a6307d7..960fbfa9 100644 --- a/pc4mobx/hrmSalary/pages/payroll/index.js +++ b/pc4mobx/hrmSalary/pages/payroll/index.js @@ -48,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")]; @@ -348,7 +349,10 @@ export default class Payroll extends React.Component { ); } else if (this.state.selectedKey === "2") { - return ; + return ; } }; const steps = ["基础设置", "正常核算工资单模板", "补发工资单模版"]; @@ -423,7 +427,10 @@ export default class Payroll extends React.Component { } { this.state.selectedKey === "2" && - + this.baseSetRef = dom} + onChangeLoading={loading => this.setState({ loading })} + /> } diff --git a/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js b/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js index e7ca064b..742fa874 100644 --- a/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js +++ b/pc4mobx/hrmSalary/pages/payroll/templateBaseSettings.js @@ -6,6 +6,9 @@ */ import React, { Component } from "react"; import { WeaCheckbox, WeaFormItem, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom"; +import { message } from "antd"; +import { getSalaryBillBaseSetForm, salaryBillBaseSetSave } from "../../apis/payroll"; +import WaterMarkSetModal from "./components/waterMarkSetModal"; import "./index.less"; const getLabel = WeaLocaleProvider.getLabel; @@ -15,12 +18,52 @@ class TemplateBaseSettings extends Component { super(props); this.state = { watermarkStatus: "0", - watermark: "DEFAULT" + watermark: "DEFAULT", + wmSetting: null, + watermarkSet: { + visible: false, watermarkSetting: null + } }; } + componentDidMount() { + this.getSalaryBillBaseSetForm(); + } + + getSalaryBillBaseSetForm = () => { + 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 } = this.state; + const { watermarkStatus, watermark, watermarkSet } = this.state; return ( @@ -40,8 +83,17 @@ class TemplateBaseSettings extends Component { /> { watermark === "CUSTOM" && - {getLabel(111, "水印设置")} + this.setState({ + watermarkSet: { + ...watermarkSet, + visible: true + } + })}>{getLabel(111, "水印设置")} } + this.setState({ watermarkSet: { ...watermarkSet, visible: false } })} + onChange={wmSetting => this.setState({ wmSetting })} + /> } diff --git a/pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js b/pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js new file mode 100644 index 00000000..12d3e2ff --- /dev/null +++ b/pc4mobx/hrmSalary/pages/payroll/watermarkPreview.js @@ -0,0 +1,56 @@ +/* + * 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) { + watermark({ + text: data, + src: "", + rotate: `-15`, + alpha: 0.15, + interval: 2000, + intervalCheck: true, + clickCheck: true + }); + } + }); + }; + + render() { + return ( +
+

水印预览效果

+

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

+

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

+

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

+

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

+

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

+

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

+
+ ); + } +} + +export default WatermarkPreview; diff --git a/pc4mobx/hrmSalary/stores/mySalary.js b/pc4mobx/hrmSalary/stores/mySalary.js index ef50b397..a4ec964f 100644 --- a/pc4mobx/hrmSalary/stores/mySalary.js +++ b/pc4mobx/hrmSalary/stores/mySalary.js @@ -1,11 +1,12 @@ import { action, observable } from "mobx"; import { message } from "antd"; import { WeaForm, WeaLogView, WeaTableNew } from "comsMobx"; -import { WeaLocaleProvider } from "ecCom"; +import { WeaLocaleProvider, WeaTools } from "ecCom"; import moment from "moment"; import * as API from "../apis/mySalaryBenefits"; +const { watermark } = WeaTools; const { LogStore } = WeaLogView; const getLabel = WeaLocaleProvider.getLabel; const { TableStore } = WeaTableNew; @@ -165,6 +166,45 @@ export class MySalaryStore { return new Promise((resolve, reject) => { API.mySalaryBill(payload).then(res => { if (res.status) { + const { salaryTemplate } = res.data; + const { salaryWatermark } = salaryTemplate; + if (watermark && salaryWatermark) { + const { wmSetting } = JSON.parse(salaryWatermark); + const { + wmText, + wmHeight: height, + wmWidth: width, + wmNoTransparent, + wmRotate, + wmImg, + wmClassify + } = wmSetting; + if (wmClassify === "text") { + watermark({ + text: wmText, + width, + height, + src: "", + rotate: `-${wmRotate || 15}`, + alpha: wmNoTransparent / 100 || 0.15, + interval: 2000, + intervalCheck: true, + clickCheck: true + }); + } else { + watermark({ + text: "", + width, + height, + src: wmImg[0].imgSrc, + rotate: `-${wmRotate || 15}`, + alpha: wmNoTransparent / 100 || 0.15, + interval: 2000, + intervalCheck: true, + clickCheck: true + }); + } + } this.mySalaryBill = res.data; resolve(res.data); } else { From 7d07af3a22bcc9204650a6ee2f73f6bed899f306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E6=B0=B8=E9=A1=BA?= <971387674@qq.com> Date: Fri, 16 Jun 2023 11:30:11 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BA=A7=E5=93=81-=E5=B7=A5=E8=B5=84?= =?UTF-8?q?=E5=8D=95=E6=B0=B4=E5=8D=B0=E8=AE=BE=E7=BD=AE=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=BC=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc4mobx/hrmSalary/pages/payroll/components/index.less | 6 ------ .../pages/payroll/components/waterMarkSetModal.js | 4 ++-- .../pages/payroll/components/wmContentSetModal.js | 4 ++-- pc4mobx/hrmSalary/stores/mySalary.js | 7 ++++--- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/pc4mobx/hrmSalary/pages/payroll/components/index.less b/pc4mobx/hrmSalary/pages/payroll/components/index.less index ee7666e9..51e742e6 100644 --- a/pc4mobx/hrmSalary/pages/payroll/components/index.less +++ b/pc4mobx/hrmSalary/pages/payroll/components/index.less @@ -47,12 +47,6 @@ } } -.waterMarkSetWrapper { - & > .rodal { - right: 25% !important; - } -} - .waterMarkSetWrapper, .wmContentWrapper { .rodal { .rodal-dialog { diff --git a/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js b/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js index 48c6658d..baaafa6c 100644 --- a/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js +++ b/pc4mobx/hrmSalary/pages/payroll/components/waterMarkSetModal.js @@ -94,8 +94,8 @@ class WaterMarkSetModal extends Component { {getLabel(111, "水印设置")}} - direction="right" top={20} width={800} height={400} - measureT={"%"} measureX="px" measureY="px" + direction="right" top={0} width={800} height={100} + measureT="%" measureX="px" measureY="%" content={ diff --git a/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js b/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js index beea8bdd..d6fecd53 100644 --- a/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js +++ b/pc4mobx/hrmSalary/pages/payroll/components/wmContentSetModal.js @@ -127,8 +127,8 @@ class WmContentSetModal extends Component { this.props.onClose(this.props.textSet)} title={{getLabel(111, "水印内容设置")}} - direction="right" top={-10} width={800} height={480} - measureT={"%"} measureX="px" measureY="px" + direction="right" top={0} width={800} height={100} + measureT="%" measureX="px" measureY="%" content={ { API.mySalaryBill(payload).then(res => { if (res.status) { + this.mySalaryBill = res.data; + resolve(res.data); const { salaryTemplate } = res.data; const { salaryWatermark } = salaryTemplate; if (watermark && salaryWatermark) { - const { wmSetting } = JSON.parse(salaryWatermark); + const { wmSetting, watermarkStatus } = JSON.parse(salaryWatermark); + if (!watermarkStatus) return; const { wmText, wmHeight: height, @@ -205,8 +208,6 @@ export class MySalaryStore { }); } } - this.mySalaryBill = res.data; - resolve(res.data); } else { message.error(res.errormsg || "获取失败"); reject("获取失败");