diff --git a/pc4mobx/hrmSalary/components/custom-title/weaReqTitle/index.js b/pc4mobx/hrmSalary/components/custom-title/weaReqTitle/index.js index 69766076..7ff800ce 100644 --- a/pc4mobx/hrmSalary/components/custom-title/weaReqTitle/index.js +++ b/pc4mobx/hrmSalary/components/custom-title/weaReqTitle/index.js @@ -7,7 +7,7 @@ class Index extends Component { render() { return ( } iconBgcolor="#F14A2D" + title={this.props.title || getLabel(111, "编辑账套")} icon={} iconBgcolor="#F14A2D" showDropIcon={false} tabDatas={this.props.tabDatas} {...this.props} /> ); diff --git a/pc4mobx/hrmSalary/components/custom-title/weaTopTitle/index.js b/pc4mobx/hrmSalary/components/custom-title/weaTopTitle/index.js index d265c8eb..0e90c2e2 100644 --- a/pc4mobx/hrmSalary/components/custom-title/weaTopTitle/index.js +++ b/pc4mobx/hrmSalary/components/custom-title/weaTopTitle/index.js @@ -6,7 +6,7 @@ const getLabel = WeaLocaleProvider.getLabel; class Index extends Component { render() { return ( - } + } iconBgcolor="#F14A2D" {...this.props}/> ); } diff --git a/pc4mobx/hrmSalary/index.js b/pc4mobx/hrmSalary/index.js index 7b5cf863..96d4af12 100644 --- a/pc4mobx/hrmSalary/index.js +++ b/pc4mobx/hrmSalary/index.js @@ -28,7 +28,7 @@ import PayrollDetail from "./pages/payroll/payrollDetail/payrollDetail"; // import Declare from "./pages/declare"; import Declare from "./pages/declare/declare"; //重构的个税申报表 import TaxRate from "./pages/taxRate"; -import TaxAgent from "./pages/taxAgent"; +import TaxAgent from "./pages/salary/taxAgent"; import CalculateDetail from "./pages/calculateDetail"; import PlaceOnFileDetail from "./pages/calculateDetail/placeOnFileDetail"; import CompareDetail from "./pages/calculateDetail/compareDetail"; diff --git a/pc4mobx/hrmSalary/pages/roleManagement/index.less b/pc4mobx/hrmSalary/pages/roleManagement/index.less index e911681c..8de15ad5 100644 --- a/pc4mobx/hrmSalary/pages/roleManagement/index.less +++ b/pc4mobx/hrmSalary/pages/roleManagement/index.less @@ -2,7 +2,7 @@ .rolemanagement-content { height: 100%; overflow-y: auto; - padding: 16px 16px 0; + padding: 8px 16px 0; background: rgb(246, 246, 246); .wea-new-table { diff --git a/pc4mobx/hrmSalary/pages/salary/components/baseSettings.js b/pc4mobx/hrmSalary/pages/salary/components/baseSettings.js new file mode 100644 index 00000000..a534feb0 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/baseSettings.js @@ -0,0 +1,48 @@ +/* + * Author: 黎永顺 + * name: 基础设置 + * Description: + * Date: 2022/11/29 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { decentralizationConditions, editConditions } from "../../taxAgent/editConditions"; +import { getSearchs } from "../../../util"; + +@inject("taxAgentStore") +@observer +class BaseSettings extends Component { + + componentDidMount() { + + } + + render() { + const { taxAgentStore: { salarytaxAgentForm }, decentralization, isChief } = this.props; + return ( +
+ { + decentralization === "0" ? + getSearchs(salarytaxAgentForm, convertConditon(decentralizationConditions, !isChief), 1, false) : + getSearchs(salarytaxAgentForm, convertConditon(editConditions, !isChief), 1, false) + } +
+ ); + } +} + +export default BaseSettings; + +export const convertConditon = (condition, bool) => { + return _.map(condition, item => { + return { + ...item, + items: _.map(item.items, child => { + return { + ...child, + viewAttr: bool ? 1 : child.viewAttr + }; + }) + }; + }); +}; diff --git a/pc4mobx/hrmSalary/pages/salary/components/comHint.js b/pc4mobx/hrmSalary/pages/salary/components/comHint.js new file mode 100644 index 00000000..aea13257 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/comHint.js @@ -0,0 +1,46 @@ +/* + * Author: 黎永顺 + * name: 个税扣缴义务人小提示组件 + * Description: + * Date: 2022/11/22 + */ +import React, { Component } from "react"; +import { WeaLocaleProvider } from "ecCom"; +import "./index.less"; + +const { getLabel } = WeaLocaleProvider; + +class ComHint extends Component { + /* + * Author: 黎永顺 + * Description: 提示语注释 + * Params: isChief=总管理员 + * Date: 2022/11/22 + */ + renderTips = () => { + const { isChief = true } = this.props; + if (isChief) { + return [ +

{getLabel(111, "1、个税扣缴义务人与档案中的个税扣缴义务人匹配,修改个税扣缴义务人名称,薪资档案的个税扣缴义务人数据同步更新;")}

, +

{getLabel(111, "2、删除个税扣缴义务人需先确认档案里无人员使用该个税扣缴义务人,否则不予删除;")}

, +

{getLabel(111, "3、只有薪酬总管理员能够操作个税扣缴义务人的增减和开启/关闭分权;")}

, +

{getLabel(111, "4、开启分权,需维护个税扣缴义务人的管理员;当前总管理员默认有管理员的权限;")}

+ ]; + } else { + return []; + } + }; + + render() { + return ( +
+
{getLabel(111, "小提示")}
+
+ {this.renderTips()} +
+
+ ); + } +} + +export default ComHint; diff --git a/pc4mobx/hrmSalary/pages/salary/components/constants.js b/pc4mobx/hrmSalary/pages/salary/components/constants.js new file mode 100644 index 00000000..dc2422a0 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/constants.js @@ -0,0 +1,440 @@ +export const fieldList = [ + { + key: "name", + label: "名称", + lanId: 33439, + type: "TEXT", + viewAttr: 1 + }, + { + key: "taxCode", + label: "税号", + lanId: 111, + type: "TEXT", + viewAttr: 3 + }, + { + key: "city", + label: "报税所属区域", + lanId: 111, + type: "SELECT", + viewAttr: 3 + }, + { + key: "areaCode", + label: "行政区划代码", + lanId: 111, + type: "TEXT", + viewAttr: 3 + }, + { + key: "passwordType", + label: "密码校验类型", + lanId: 111, + type: "RADIO", + viewAttr: 3, + options: [ + { + key: "TAX_NET_PASSWORD", + showname: "个税网报密码", + lanId: 111 + }, + { + key: "REAL_NAME_PASSWORD", + showname: "实名账号密码", + lanId: 111 + } + ] + }, + { + key: "account", + label: "实名账号", + lanId: 111, + type: "TEXT", + viewAttr: 3 + }, + { + key: "realNamePassword", + label: "实名账号密码", + lanId: 111, + type: "PASSWORD", + viewAttr: 3 + }, + { + key: "netPassword", + label: "个税网报密码", + lanId: 111, + type: "PASSWORD", + viewAttr: 3 + }, + { + key: "taxRegistrationNumber", + label: "登记序号", + type: "TEXT", + lanId: 111, + viewAttr: 1 + }, + { + key: "departmentCode", + label: "部门编码", + lanId: 111, + type: "TEXT", + viewAttr: 1 + }, + { + key: "checkStatus", + label: "报税信息验证状态", + lanId: 111, + type: "TEXT", + viewAttr: 1 + } +]; + +export const taxFillCondition = [ + { + items: [ + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["taxAgentName"], + fieldcol: 14, + label: "个税扣缴义务人", + lanId: 537996, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["taxRegistrationNumber"], + fieldcol: 14, + label: "登记序号", + lanId: 545138, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["taxpayerStatus"], + fieldcol: 14, + label: "纳税人状态", + lanId: 545139, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["legalPersonName"], + fieldcol: 14, + label: "法人姓名", + lanId: 545140, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["mobile"], + fieldcol: 14, + label: "联系电话", + lanId: 545141, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["businessAddress"], + fieldcol: 14, + label: "生产经营地址", + lanId: 545142, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["industryName"], + fieldcol: 14, + label: "行业名称", + lanId: 545143, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["taxAuthorities"], + fieldcol: 14, + label: "主管税务机关", + lanId: 545144, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["taxBranch"], + fieldcol: 14, + label: "主管税务科所", + lanId: 545145, + labelcol: 6, + value: "", + viewAttr: 1 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["divideFiling"], + fieldcol: 14, + label: "是否分部门备案", + lanId: 111, + labelcol: 6, + value: "", + viewAttr: 1 + } + ], + defaultshow: true + } +]; +export const deptFillCondition = [ + { + items: [ + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["departmentName"], + fieldcol: 14, + label: "部门名称", + lanId: 536641, + labelcol: 6, + value: "", + rules: "required|string", + viewAttr: 3 + }, + { + colSpan: 1, + conditionType: "INPUT", + domkey: ["departmentCode"], + fieldcol: 14, + label: "部门编码", + lanId: 111, + labelcol: 6, + value: "", + rules: "required|string", + viewAttr: 3 + } + ], + defaultshow: true + } +]; +export const taxFillColumns = [ + { + dataIndex: "taxCode", + title: "税号", + titleId: "", + fixed: "left" + }, + { + dataIndex: "taxAgentName", + title: "个税扣缴义务人", + titleId: "537996" + }, + { + dataIndex: "taxRegistrationNumber", + title: "登记序号", + titleId: "545138" + }, + { + dataIndex: "taxpayerStatus", + title: "纳税人状态", + titleId: "545139" + }, + { + dataIndex: "taxAuthorities", + title: "主管税务机关", + titleId: "545144" + }, + { + dataIndex: "taxBranch", + title: "主管税务科所", + titleId: "545145" + }, + { + dataIndex: "businessAddress", + title: "生产经营地址", + titleId: "545142" + }, + { + dataIndex: "industryName", + title: "行业名称", + titleId: "545143" + }, + { + dataIndex: "legalPersonName", + title: "法人姓名", + titleId: "545140" + }, + { + dataIndex: "mobile", + title: "联系电话", + titleId: "545141" + } +]; +export const personScopeConditions = [ + { + items: [ + { + conditionType: "SELECT_LINKAGE", + domkey: ["targetType"], + fieldcol: 18, + label: "对象类型", + lanId: 111, + labelcol: 6, + options: [], + viewAttr: 3, + rules: "selectLinkageRequired", + selectLinkageDatas: {} + }, + { + conditionType: "SELECT", + domkey: ["employeeStatus"], + fieldcol: 18, + label: "选择员工状态", + lanId: 111, + labelcol: 6, + value: "", + detailtype: "2", + rules: "required", + viewAttr: 3 + }, + ], + defaultshow: true + } +]; +export const scopeSelectLinkageDatas = { + EMPLOYEE:{ + browserConditionParam: { + completeParams: {}, + dataParams: {}, + hasAddBtn: false, + hasAdvanceSerach: true, + isAutoComplete: 1, + isDetail: 0, + isMultCheckbox: false, + isSingle: false, + pageSize: 10, + linkUrl: "", + type: "17", + viewAttr: 3, + rules:'required', + title: "" + }, + conditionType: "BROWSER", + domkey: ["target"], + fieldcol: 24, + label: "", + labelcol: 0, + value: "", + rules: "required", + viewAttr: 3 + }, + DEPT:{ + browserConditionParam: { + completeParams: {}, + dataParams: {}, + hasAddBtn: false, + hasAdvanceSerach: true, + isAutoComplete: 1, + isDetail: 0, + isMultCheckbox: false, + isSingle: false, + pageSize: 10, + linkUrl: "", + type: "57", + viewAttr: 3, + rules:'required', + title: "" + }, + conditionType: "BROWSER", + domkey: ["target"], + fieldcol: 24, + label: "", + labelcol: 0, + value: "", + rules: "required", + viewAttr: 3 + }, + SUBCOMPANY:{ + browserConditionParam: { + completeParams: {}, + dataParams: {}, + hasAddBtn: false, + hasAdvanceSerach: true, + isAutoComplete: 1, + isDetail: 0, + isMultCheckbox: false, + isSingle: false, + pageSize: 10, + linkUrl: "", + type: "164", + viewAttr: 3, + rules:'required', + title: "" + }, + conditionType: "BROWSER", + domkey: ["target"], + fieldcol: 24, + label: "", + labelcol: 0, + value: "", + rules: "required", + viewAttr: 3 + }, + POSITION:{ + browserConditionParam: { + completeParams: {}, + dataParams: {}, + hasAddBtn: false, + hasAdvanceSerach: true, + isAutoComplete: 1, + isDetail: 0, + isMultCheckbox: false, + isSingle: false, + pageSize: 10, + linkUrl: "", + type: "278", + viewAttr: 3, + rules:'required', + title: "" + }, + conditionType: "BROWSER", + domkey: ["target"], + fieldcol: 24, + label: "", + labelcol: 0, + value: "", + rules: "required", + viewAttr: 3 + }, + SQL: { + conditionType: "TEXTAREA", + domkey: ["target"], + fieldcol: 24, + label: "", + labelcol: 0, + value: "", + rules: "required", + viewAttr: 3 + } +}; diff --git a/pc4mobx/hrmSalary/pages/salary/components/index.less b/pc4mobx/hrmSalary/pages/salary/components/index.less new file mode 100644 index 00000000..9eed4669 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/index.less @@ -0,0 +1,165 @@ +.taxAgentSlideContent { + height: 100%; + background: #F6F6F6; + + .ant-steps { + margin: 0 0 20px 0 !important; + padding-top: 20px; + } + + .personal-scope { + padding: 8px 16px; + height: 100%; + + .wea-tab, .wea-new-table { + background: #FFF; + } + + .icon-refresh { + display: flex; + justify-content: center; + align-items: center; + width: 20px; + height: 20px; + color: #fff; + background: #55a1f8; + cursor: pointer; + border-radius: 3px; + } + } + + .baseSettingWrapper, .taxDeclarationInfoWrapper { + padding: 12px 12px 12px 20px; + + .wea-search-group { + padding: 0; + border: 1px solid #e5e5e5; + border-bottom: none; + + .wea-content { + padding: 0; + + .wea-form-cell, .wea-form-item { + border-bottom: 1px solid #e5e5e5; + padding: 5px 10px 5px 30px; + + .wea-form-item { + padding: 0 !important; + border-bottom: none !important; + } + } + } + } + } +} + +.comHint { + width: 100%; + margin: 16px 0; + border: 1px solid #e5e5e5; + background: #FFF; + + .hintHeader { + background: #f6f6f6; + height: 40px; + border-bottom: 1px solid #e5e5e5; + padding-left: 16px; + line-height: 40px; + } + + .hintTips { + width: 100%; + color: #999; + line-height: 20px; + padding: 0 16px; + display: inline-block; + + p { + margin: 1rem 0; + } + } +} + +.slideOuterWrapper { + .wea-slide-modal-title { + height: initial; + line-height: initial; + text-align: left; + } + + .rodal-close { + z-index: 99; + top: 10px !important; + } + +} + +@media (min-width: 1260px) { + .slideOuterWrapper { + .reqTopWrapper .wea-new-top-req-title > div:first-child > div { + max-width: 100% !important; + } + } +} + +@media screen and (min-width: 1060px) and (max-width: 1260px) { + .slideOuterWrapper { + .reqTopWrapper .wea-new-top-req-title > div:first-child > div { + max-width: calc(100% - 96px) !important; + } + } +} + +//添加关联人员弹框中的下拉框样式 +.personalScopeModalWrapper { + .wea-select, .ant-select-selection, .ant-select { + width: 100%; + } + + .wea-select { + display: inline-block; + position: relative; + } + + .ant-select-selection { + height: 30px; + border-radius: 0; + } +} + +.taxfillingDialog { + .ant-modal-title { + .text-elli { + color: #111; + font-weight: 700; + } + } + + .taxfillingDialogContent { + height: 100%; + padding: 16px; + background: #f6f6f6; + overflow-y: auto; + + .wea-search-group { + padding: 0; + background: #FFF; + border: 1px solid #e5e5e5; + border-bottom: 0; + + .ant-row, .wea-form-cell { + padding: 0; + } + + .wea-form-item { + padding: 5px 16px; + border-bottom: 1px solid #e5e5e5; + } + } + + .wea-new-table { + background: #FFF; + } + + } +} diff --git a/pc4mobx/hrmSalary/pages/salary/components/personalScope.js b/pc4mobx/hrmSalary/pages/salary/components/personalScope.js new file mode 100644 index 00000000..451fbda8 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/personalScope.js @@ -0,0 +1,231 @@ +/* + * Author: 黎永顺 + * name: 人员范围 + * Description: + * Date: 2022/11/30 + */ +import React, { Component } from "react"; +import { message, Modal } from "antd"; +import { inject, observer } from "mobx-react"; +import { WeaButtonIcon, WeaInputSearch, WeaLocaleProvider, WeaTab } from "ecCom"; +import { + taxAgentRangeDelete, + taxAgentRangeExtDelete, + taxAgentRangeExtSave, + taxAgentRangeImportData +} from "../../../apis/taxAgent"; +import { sysinfo } from "../../../apis/ruleconfig"; +import PersonalScopeTable from "./personalScopeTable"; +import PersonalScopeModal from "./personalScopeModal"; +import ImportDialog from "../../../components/importDialog"; +import ExternalPersonModal from "../../../components/externalPersonModal"; + +const getLabel = WeaLocaleProvider.getLabel; + +@inject("taxAgentStore") +@observer +class PersonalScope extends Component { + constructor(props) { + super(props); + this.state = { + searchValue: "", selectedKey: "listInclude", rowKeys: [], loading: false, + extEmpsWitch: "1", //非系统人员开关, 1: 开启, 0:关闭 + personalAddModal: { visible: false, externalVisible: false, title: getLabel(111, "关联人员"), includeType: "" }, + importParams: { + visible: false, title: getLabel(111, "数据导入"), nextloading: false, importResult: {}, imageId: "", + link: `/api/bs/hrmsalary/taxAgent/range/downloadTemplate?taxAgentId=${props.taxAgentId}`, + previewUrl: "/api/bs/hrmsalary/taxAgent/range/preview" + } + }; + this.personalScopeTableRef = null; + } + + componentDidMount() { + const { taxAgentStore: { hasIconInTax } } = this.props; + hasIconInTax(); + this.getSysinfo(); + } + + /* + * Author: 黎永顺 + * Description:非系统人员开关查询 + * Params: + * Date: 2023/11/9 + */ + getSysinfo = () => { + sysinfo().then(({ status, data }) => { + if (status) this.setState({ extEmpsWitch: data.extEmpsWitch }); + }); + }; + /* + * Author: 黎永顺 + * Description: 删除人员范围 + * Params: + * Date: 2022/11/30 + */ + taxAgentRangeDelete = () => { + Modal.confirm({ + title: "信息确认", + content: "确认要删除吗?", + onOk: () => { + const { selectedKey } = this.state; + const API = selectedKey === "listExt" ? taxAgentRangeExtDelete : taxAgentRangeDelete; + API(this.state.rowKeys).then(({ status, errormsg }) => { + if (status) { + message.success("删除成功"); + this.setState({ rowKeys: [] }, () => { + this.personalScopeTableRef.clearRowkeys(); + }); + } else { + message.error(errormsg || "删除失败"); + } + }); + } + }); + }; + /* + * Author: 黎永顺 + * Description:新增人员范围 + * Params: + * Date: 2022/11/30 + */ + handleAddPersonal = () => { + const { personalAddModal, selectedKey } = this.state; + this.setState({ + personalAddModal: { + ...personalAddModal, + visible: selectedKey !== "listExt", + externalVisible: selectedKey === "listExt", + includeType: selectedKey === "listInclude" ? 1 : 0 + } + }); + }; + handleImportFile = (params) => { + const { taxAgentId } = this.props, { importParams } = this.state; + this.setState({ importParams: { ...importParams, nextloading: true } }); + taxAgentRangeImportData({ ...params, taxAgentId }).then(({ status, errormsg, data }) => { + this.setState({ importParams: { ...importParams, nextloading: false } }); + if (status) { + this.setState({ importParams: { ...importParams, importResult: data } }); + } else { + message.warning(errormsg); + } + }); + }; + /* + * Author: 黎永顺 + * Description: 保存非系统人员 + * Params: + * Date: 2023/11/9 + */ + handleSaveExtPersons = (payload = {}) => { + const { taxAgentId } = this.props; + const { personalAddModal } = this.state; + this.setState({ loading: false }); + taxAgentRangeExtSave({ taxAgentId, ...payload }).then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success("新增成功"); + this.setState({ + personalAddModal: { + ...personalAddModal, + externalVisible: false + } + }, () => this.personalScopeTableRef.getPersonalScopeList()); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ loading: false })); + }; + + render() { + const { selectedKey, searchValue, rowKeys, personalAddModal, importParams, extEmpsWitch, loading } = this.state; + const { taxAgentStore: { PageAndOptAuth }, taxAgentId } = this.props; + const showOperateBtn = PageAndOptAuth.opts.includes("admin"); + const topTab = [ + { + title: "管理范围", + viewcondition: "listInclude" + }, + { + title: "从范围中排除", + viewcondition: "listExclude" + }, + { + title: "非系统人员范围", + viewcondition: "listExt" + } + ]; + const btns = showOperateBtn ? [ + { + this.setState({ importParams: { ...importParams, visible: true } }); + }}>, + , + , + this.setState({ searchValue })} + placeholder="请输入对象" + onSearch={() => this.personalScopeTableRef.getPersonalScopeList(selectedKey, 1)} + /> + ] : [ this.setState({ searchValue })} + placeholder="请输入对象" + onSearch={() => this.personalScopeTableRef.getPersonalScopeList(selectedKey, 1)} + />]; + (selectedKey === "listExclude" || selectedKey === "listExt") && btns.shift(); + return ( +
+ this.setState({ selectedKey })} + /> + this.personalScopeTableRef = dom} + taxAgentId={taxAgentId} + tabActive={selectedKey} + searchValue={searchValue} + onChangeSelectKey={rowKeys => this.setState({ rowKeys })} + /> + {/*非系统人员添加*/} + this.setState({ personalAddModal: { ...personalAddModal, externalVisible: false } })} + onExternalPersonSave={this.handleSaveExtPersons} + /> + this.personalScopeTableRef.getPersonalScopeList()} + onCancel={(callback) => + this.setState({ + personalAddModal: { ...personalAddModal, visible: false, includeType: "" } + }, () => callback && callback()) + } + /> + this.setState({ importParams: { ...importParams, imageId } })} + nextUplaodCallback={imageId => this.handleImportFile({ imageId })} + onResetImportResult={() => this.setState(({ + importParams: { ...importParams, importResult: {}, imageId: "" } + }))} + onCancel={(callback) => this.setState({ + importParams: { ...importParams, visible: false } + }, () => callback && this.personalScopeTableRef.getPersonalScopeList(selectedKey, 1))}/> +
+ ); + } +} + +export default PersonalScope; diff --git a/pc4mobx/hrmSalary/pages/salary/components/personalScopeModal.js b/pc4mobx/hrmSalary/pages/salary/components/personalScopeModal.js new file mode 100644 index 00000000..3e649880 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/personalScopeModal.js @@ -0,0 +1,135 @@ +/* + * Author: 黎永顺 + * name: 新增人员范围弹框 + * Description: + * Date: 2022/11/30 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaSwitch } from "comsMobx"; +import { WeaCheckbox, WeaDialog, WeaFormItem, WeaLocaleProvider, WeaSearchGroup, WeaTools } from "ecCom"; +import { Button, message } from "antd"; +import { getTaxAgentRangeForm, taxAgentRangeSave } from "../../../apis/taxAgent"; +import { personScopeConditions, scopeSelectLinkageDatas } from "./constants"; + +const getKey = WeaTools.getKey; +const getLabel = WeaLocaleProvider.getLabel; + +@inject("taxAgentStore") +@observer +class PersonalScopeModal extends Component { + constructor(props) { + super(props); + this.state = { + loading: false, conditions: [], employeeStatus: [] + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible && nextProps.visible) this.getTaxAgentRangeForm(); + if (nextProps.visible !== this.props.visible && !nextProps.visible) this.props.taxAgentStore.initPersonScopeForm(); + } + + getTaxAgentRangeForm = () => { + getTaxAgentRangeForm().then(({ status, data }) => { + if (status) { + const { employeeStatus, targetTypeList } = data; + this.setState({ + employeeStatus, conditions: _.map(personScopeConditions, item => ({ + ...item, items: _.map(item.items, o => { + if (getKey(o) === "employeeStatus") { + return { + ...o, label: getLabel(o.lanId, o.label), + options: _.map(employeeStatus, it => ({ key: it.id, showname: it.name })) + }; + } + return { + ...o, label: getLabel(o.lanId, o.label), + options: _.map(targetTypeList, it => ({ + key: it.id, showname: it.name, selected: it.id === "EMPLOYEE" + })), + selectLinkageDatas: { ...scopeSelectLinkageDatas } + }; + }) + })) + }, () => this.props.taxAgentStore.personScopeForm.initFormFields(this.state.conditions)); + } + }); + }; + taxAgentRangeSave = () => { + const { taxAgentStore: { personScopeForm } } = this.props; + personScopeForm.validateForm().then(f => { + if (f.isValid) { + const { employeeStatus, targetType, target } = personScopeForm.getFormParams(); + const { includeType, taxAgentId } = this.props; + const payload = { + includeType, taxAgentId, employeeStatus: employeeStatus.split(","), + targetParams: _.map(target.split(","), it => ({ + targetType, targetId: targetType === "SQL" ? "0" : it, + target: targetType === "SQL" ? target : "" + })) + }; + this.setState({ loading: true }); + taxAgentRangeSave(payload).then(({ status, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(111, "操作成功!")); + this.props.onCancel(this.props.onSuccess); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ loading: true })); + } else { + f.showErrors(); + } + }); + }; + renderForm = () => { + const { taxAgentStore: { personScopeForm } } = this.props; + const { conditions, employeeStatus } = this.state, { isFormInit } = personScopeForm, + formParams = personScopeForm.getFormParams(); + const checked = formParams.employeeStatus && _.every(_.map(employeeStatus, o => o.id), k => formParams.employeeStatus.indexOf(k) !== -1); + let group = []; + isFormInit && conditions.map(c => { + let items = []; + c.items.map(fields => { + items.push({ + com: ( + + { + getKey(fields) === "employeeStatus" && + + } + + ), + hide: fields.hide + }); + }); + group.push(); + }); + return group; + }; + handleChangeAll = (val) => { + const { taxAgentStore: { personScopeForm } } = this.props, { employeeStatus } = this.state; + val === "1" ? personScopeForm.updateFields({ employeeStatus: { value: _.map(employeeStatus, o => o.id).join(",") } }) : + personScopeForm.updateFields({ employeeStatus: { value: "" } }); + }; + + render() { + const { title, taxAgentStore: { personScopeForm } } = this.props, { loading } = this.state; + const buttons = [ + , + + ]; + return ( + +
{this.renderForm()}
+
+ ); + } +} + +export default PersonalScopeModal; diff --git a/pc4mobx/hrmSalary/pages/salary/components/personalScopeTable.js b/pc4mobx/hrmSalary/pages/salary/components/personalScopeTable.js new file mode 100644 index 00000000..87bf46cb --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/personalScopeTable.js @@ -0,0 +1,136 @@ +/* + * Author: 黎永顺 + * name: 人员范围列表数据 + * Description: + * Date: 2022/11/30 + */ +import React, { Component } from "react"; +import { WeaTable } from "ecCom"; +import { getTaxAgentRangeListExclude, getTaxAgentRangeListInclude, taxAgentRangelistExt } from "../../../apis/taxAgent"; +import "./index.less"; +import { calcPageNo } from "../../../util"; + +const APIFox = { + listInclude: getTaxAgentRangeListInclude, + listExclude: getTaxAgentRangeListExclude, + listExt: taxAgentRangelistExt +}; + +class PersonalScopeTable extends Component { + constructor(props) { + super(props); + this.state = { + loading: { + query: false + }, + dataSource: [], + columns: [], + selectedRowKeys: [], + pageInfo: { + current: 1, + pageSize: 10, + total: 0 + } + }; + } + + componentDidMount() { + this.getPersonalScopeList(); + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.tabActive !== this.props.tabActive) { + this.setState({ selectedRowKeys: [] }, () => { + this.getPersonalScopeList(nextProps.tabActive); + nextProps.onChangeSelectKey([]); + }); + } + } + + getPersonalScopeList = (tabActive = this.props.tabActive, current) => { + const { searchValue, taxAgentId } = this.props; + const { pageInfo, loading } = this.state; + const payload = { + taxAgentId, targetName: searchValue, ...pageInfo, current: current || pageInfo.current + }; + this.setState({ loading: { ...loading, query: true } }); + APIFox[tabActive](payload).then(({ status, data }) => { + this.setState({ loading: { ...loading, query: false } }); + if (status) { + const { pageNum: current, pageSize, total, columns, list: dataSource } = data; + this.setState({ + pageInfo: { ...pageInfo, current, pageSize, total }, + dataSource, + columns: _.map(columns, item => { + return { + ...item, + render: (text) => { + return {text}; + } + }; + }) + }); + } + }).catch(() => { + this.setState({ loading: { ...loading, query: false } }); + }); + }; + + /* + * Author: 黎永顺 + * Description: 清空选中项 + * Params: + * Date: 2022/11/30 + */ + clearRowkeys = () => { + const { pageInfo, selectedRowKeys } = this.state; + this.setState({ + selectedRowKeys: [], + pageInfo: { + ...pageInfo, + current: calcPageNo(pageInfo.total, pageInfo.current, 10, selectedRowKeys.length) + } + }, () => { + this.getPersonalScopeList(); + }); + }; + + render() { + const { dataSource, columns, pageInfo, loading, selectedRowKeys } = this.state; + const { onChangeSelectKey } = this.props; + const pagination = { + ...pageInfo, + showTotal: total => `共 ${total} 条`, + showQuickJumper: true, + pageSizeOptions: ["10", "20", "50", "100"], + onChange: current => { + this.setState({ + pageInfo: { ...pageInfo, current } + }, () => { + this.getPersonalScopeList(); + }); + } + }; + const rowSelection = { + selectedRowKeys, + onChange: (selectedRowKeys) => { + this.setState({ selectedRowKeys }, () => { + onChangeSelectKey(this.state.selectedRowKeys); + }); + } + }; + return ( + + ); + } +} + +export default PersonalScopeTable; diff --git a/pc4mobx/hrmSalary/pages/salary/components/taxAgentSlide.js b/pc4mobx/hrmSalary/pages/salary/components/taxAgentSlide.js new file mode 100644 index 00000000..28085d47 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/taxAgentSlide.js @@ -0,0 +1,303 @@ +/* + * Author: 黎永顺 + * name: 新增/编辑个税扣缴义务人 + * Description: + * Date: 2022/11/29 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { Button, message, Modal } from "antd"; +import { WeaLocaleProvider, WeaSlideModal, WeaSteps } from "ecCom"; +import { decentralizationConditions, editConditions } from "../../taxAgent/editConditions"; +import BaseSettings, { convertConditon } from "./baseSettings"; +import PersonalScope from "./personalScope"; +import TaxDeclarationInfo from "./taxDeclarationInfo"; +import TaxFilingInfoDialofg from "./taxFillingInfoDialog"; +import WeaTopTitle from "../../../components/custom-title/weaTopTitle"; +import WeaReqTitle from "../../../components/custom-title/weaReqTitle"; +import * as API from "../../../apis/taxAgent"; +import { registrationCheck } from "../../../apis/taxAgent"; +import "./index.less"; + +const { getLabel } = WeaLocaleProvider; +const Step = WeaSteps.Step; + +@inject("taxAgentStore") +@observer +class TaxAgentSlide extends Component { + constructor(props) { + super(props); + this.state = { + current: 0, loading: false, verifyLoading: false, taxAgentId: "", + taxFilingInfoDialofg: { + visible: false, title: "", checkPayload: {}, + isEdit: false, jumpAll: false, loading: false, + taxAgentTaxReturnCheckFormDTO: null + } + }; + this.taxInfoRef = null; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (nextProps.visible !== this.props.visible || nextProps.decentralization !== this.props.decentralization) { + const { taxAgentStore: { salarytaxAgentForm }, decentralization, isChief } = nextProps; + decentralization === "0" ? + salarytaxAgentForm.setCondition(convertConditon(decentralizationConditions, !isChief), true) : + salarytaxAgentForm.setCondition(convertConditon(editConditions, !isChief), true); + this.setState({ current: nextProps.current, taxAgentId: nextProps.taxAgentId }, () => { + if (this.state.taxAgentId) this.getTaxAgentForm(); + }); + } + if (nextProps.visible !== this.props.visible && !nextProps.visible) this.props.taxAgentStore.setSalarytaxAgentForm(); + } + + getTaxAgentForm = () => { + const { taxAgentId } = this.state; + const { taxAgentStore: { salarytaxAgentForm } } = this.props; + API.getTaxAgentForm({ id: taxAgentId }).then(({ status, data }) => { + if (status) { + const { name, description, adminUserIds, sortedIndex } = data; + salarytaxAgentForm.updateFields({ + name: { value: name }, + adminUserIds: { + value: _.map(adminUserIds, it => it.id.toString()).join(","), + valueSpan: _.map(adminUserIds, it => it.content).join(",") + }, + sortedIndex: { value: sortedIndex }, + description: { value: description } + }); + } + }); + }; + /* + * Author: 黎永顺 + * Description: 保存个税扣缴义务人 + * Params: + * Date: 2022/12/1 + */ + saveTaxAgent = (payload) => { + const { onOk, salaryOn } = this.props; + const { current } = this.state; + this.setState({ loading: true }); + API.saveTaxAgent(payload).then(({ status, data, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(22619, "保存成功")); + this.setState({ + current: !salaryOn ? current + 2 : current + 1, + taxAgentId: data + }, () => onOk()); + } else { + message.error(errormsg || getLabel(22620, "保存失败")); + } + }).catch(() => this.setState({ loading: false })); + }; + /* + * Author: 黎永顺 + * Description: 编辑个税扣缴义务人 + * Params: + * Date: 2022/12/1 + */ + updateTaxAgent = (payload) => { + const { onCancel } = this.props; + this.setState({ loading: true }); + API.updateTaxAgent(payload).then(({ status, data, errormsg }) => { + this.setState({ loading: false }); + if (status) { + message.success(getLabel(31439, "更新成功")); + onCancel(true); + } else { + message.error(errormsg || getLabel(31825, "更新失败")); + } + }).catch(() => this.setState({ loading: false })); + }; + handleSave = () => { + const { taxAgentStore: { salarytaxAgentForm } } = this.props; + const { taxAgentId } = this.state; + salarytaxAgentForm.validateForm().then((f) => { + if (f.isValid) { + const formData = salarytaxAgentForm.getFormParams(); + const payload = { + ...formData, + adminUserIds: formData.adminUserIds ? formData.adminUserIds.split(",") : [] + }; + taxAgentId ? this.updateTaxAgent({ ...payload, id: taxAgentId }) : this.saveTaxAgent(payload); + } else { + f.showErrors(); + } + }); + }; + handleSaveAndVerify = (jumpAll = false) => { + const { isEdit } = this.props, { taxAgentId, taxFilingInfoDialofg } = this.state; + const { fieldForm, fieldItem } = this.taxInfoRef.state; + const { city: cityStr, cityVal = [], netPassword, realNamePassword, ...extra } = fieldForm; + const boolean = _.every(_.filter(fieldItem, item => item.viewAttr === 3), it => fieldForm[it.key]); + if (!boolean) { + Modal.warning({ + title: getLabel(131329, "信息确认"), + content: getLabel(518702, "必要信息不完整,红色*为必填项!") + }); + return; + } + const [nation, province, city] = cityStr ? cityStr.split("-") : []; + const proBool = _.every(cityStr ? cityStr.split("-") : [], it => it !== "undefined"); + if (!proBool) { + Modal.warning({ + title: getLabel(131329, "信息确认"), + content: getLabel(111, "请展开选择报税所属区域!") + }); + return; + } + // requestType: 1:保存并验证 2:保存 + const payload = { + ...extra, nation, province, city, + taxAgentId, requestType: 1, password: netPassword || realNamePassword, + cityname: !_.isEmpty(cityVal) ? _.head(cityVal).name : "" + }; + this.setState({ verifyLoading: true }); + API.saveAndCheck(_.omitBy(payload, val => _.isNil(val))).then(({ status, data, errormsg }) => { + this.setState({ verifyLoading: false }); + if (status) { + message.success(getLabel(22619, "保存成功!")); + this.setState({ + taxFilingInfoDialofg: { + ...taxFilingInfoDialofg, visible: true, + isEdit, jumpAll, title: fieldForm.name, checkPayload: payload, + taxAgentTaxReturnCheckFormDTO: data.TaxAgentTaxReturnCheckFormDTO || data.table.list + } + }); + } else { + message.error(errormsg || getLabel(22620, "保存失败!")); + } + }).catch(() => this.setState({ verifyLoading: false })); + }; + handleSubmit = (selectKey) => { + const { taxFilingInfoDialofg, taxAgentId } = this.state; + const { fieldForm } = this.taxInfoRef.state; + const { city: cityStr, cityVal = [], netPassword, realNamePassword, ...extra } = fieldForm; + const [nation, province, city] = cityStr ? cityStr.split("-") : []; + const { taxAgentTaxReturnCheckFormDTO } = taxFilingInfoDialofg; + this.setState({ + taxFilingInfoDialofg: { ...taxFilingInfoDialofg, loading: true } + }); + registrationCheck({ + ...extra, nation, province, city, + taxAgentId, password: netPassword || realNamePassword, + cityname: !_.isEmpty(cityVal) ? _.head(cityVal).name : "", + ..._.find(taxAgentTaxReturnCheckFormDTO, it => it.index === selectKey) + }).then(({ status, data, errormsg }) => { + this.setState({ + taxFilingInfoDialofg: { ...taxFilingInfoDialofg, loading: false } + }); + if (status) { + message.success(getLabel(22619, "保存成功!")); + this.setState({ + taxFilingInfoDialofg: { + ...taxFilingInfoDialofg, + taxAgentTaxReturnCheckFormDTO: data.TaxAgentTaxReturnCheckFormDTO + } + }); + } else { + message.error(errormsg || getLabel(22620, "保存失败!")); + } + }).catch(() => { + this.setState({ + taxFilingInfoDialofg: { ...taxFilingInfoDialofg, loading: false } + }); + }); + }; + + render() { + const { + isEdit, title, visible, onCancel, salaryOn, decentralization, isChief, taxAgentStore: { PageAndOptAuth } + } = this.props; + const { current, taxAgentId, taxFilingInfoDialofg, loading, verifyLoading } = this.state; + let tabs = [ + { + key: 0, title: getLabel(82751, "基础设置"), + createBtns: [ + + ], + editBtns: [ + + ], + children: + }, + { + key: 1, title: getLabel(544342, "报税信息"), + createBtns: [ + , + + ], + editBtns: [ + + ], + children: this.taxInfoRef = dom} taxAgentId={taxAgentId} isChief={isChief}/> + }, + { + key: 2, title: getLabel(124810, "人员范围"), + createBtns: [ + + ], + editBtns: [], + children: + } + ]; + tabs = !salaryOn ? _.filter(tabs, it => it.key !== 1) : tabs; + const showOperateBtn = PageAndOptAuth.opts.includes("admin"); + return ( + current === o.key).createBtns}/> : + current === o.key).editBtns : []} + tabDatas={tabs} selectedKey={String(current)} title={title} + onChange={cur => this.setState({ current: parseInt(cur) })}/> + } + content={ +
+ { + !isEdit && + + { + _.map(tabs, item => { + const { key, title } = item; + return ; + }) + } + + } + {_.find(tabs, o => current === o.key).children} + { + const { jumpAll } = taxFilingInfoDialofg; + this.setState({ + current: jumpAll ? this.state.current + 1 : this.state.current, + taxFilingInfoDialofg: { + ...taxFilingInfoDialofg, visible: false, + taxAgentTaxReturnCheckFormDTO: null + } + }, () => { + isRefresh && this.taxInfoRef.taxReturnGetForm(); + jumpAll && this.props.onCancel(true); + }); + }} + /> +
+ } + onClose={() => onCancel()} + /> + ); + } +} + +export default TaxAgentSlide; diff --git a/pc4mobx/hrmSalary/pages/salary/components/taxAgentTable.js b/pc4mobx/hrmSalary/pages/salary/components/taxAgentTable.js new file mode 100644 index 00000000..5658e479 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/taxAgentTable.js @@ -0,0 +1,137 @@ +/* + * Author: 黎永顺 + * name: 个税扣缴义务人列表 + * Description: + * Date: 2022/11/29 + */ +import React, { Component } from "react"; +import { WeaLocaleProvider, WeaTable } from "ecCom"; +import { Dropdown, Menu } from "antd"; +import * as API from "../../../apis/taxAgent"; +import "./index.less"; + +const { getLabel } = WeaLocaleProvider; + +class TaxAgentTable extends Component { + constructor(props) { + super(props); + this.state = { + loading: { + query: false + }, + dataSource: [], + columns: [], + pageInfo: { + current: 1, + pageSize: 10, + total: 0 + } + }; + } + + componentDidMount() { + this.getTaxAgentList(); + } + + getTaxAgentList = () => { + const { pageInfo, loading } = this.state; + const { searchValue, onOperate } = this.props; + const payload = { + name: searchValue, + ...pageInfo + }; + this.setState({ loading: { ...loading, query: true } }); + API.getTaxAgentList(payload).then(({ status, data }) => { + this.setState({ loading: { ...loading, query: false } }); + if (status) { + const { pageNum: current, pageSize, total, columns, list: dataSource } = data; + this.setState({ + pageInfo: { ...pageInfo, current, pageSize, total }, + dataSource, + columns: _.map(columns, item => { + if (item.dataIndex === "employeeRange") { + return { + ...item, + render: (text, record) => { + return onOperate("edit", record.id, 2)}>{text}; + } + }; + } + return { + ...item, + render: (text) => { + return {text}; + } + }; + }) + }); + } + }).catch(() => { + this.setState({ loading: { ...loading, query: false } }); + }); + }; + + render() { + const { dataSource, columns, pageInfo, loading } = this.state; + const { onOperate, isChief } = this.props; + const pagination = { + ...pageInfo, + showTotal: total => `${getLabel(18609, "共")} ${total} ${getLabel(18256, "条")}`, + showSizeChanger: true, + showQuickJumper: true, + pageSizeOptions: ["10", "20", "50", "100"], + onShowSizeChange: (current, pageSize) => { + this.setState({ + pageInfo: { ...pageInfo, current, pageSize } + }, () => { + this.getTaxAgentList(); + }); + }, + onChange: current => { + this.setState({ + pageInfo: { ...pageInfo, current } + }, () => { + this.getTaxAgentList(); + }); + } + }; + return ( + + + } + ]} + /> + ); + } +} + +export default TaxAgentTable; diff --git a/pc4mobx/hrmSalary/pages/salary/components/taxDeclarationInfo.js b/pc4mobx/hrmSalary/pages/salary/components/taxDeclarationInfo.js new file mode 100644 index 00000000..11f5e4d3 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/taxDeclarationInfo.js @@ -0,0 +1,146 @@ +/* + * Author: 黎永顺 + * name: 报税信息 + * Description: + * Date: 2022/12/1 + */ +import React, { Component } from "react"; +import { WeaBrowser, WeaFormItem, WeaInput, WeaLocaleProvider, WeaSearchGroup, WeaSelect } from "ecCom"; +import { fieldList } from "./constants"; +import { taxReturnGetForm } from "../../../apis/taxAgent"; + +const { getLabel } = WeaLocaleProvider; + +class TaxDeclarationInfo extends Component { + constructor(props) { + super(props); + this.state = { + fieldForm: { + name: "", + taxCode: "", + city: "", + cityVal: [], + areaCode: null, + passwordType: "TAX_NET_PASSWORD", + account: "", + realNamePassword: "", + netPassword: null, + taxRegistrationNumber: "", + departmentCode: "", + checkStatus: "" + }, + fieldItem: [] + }; + } + + componentDidMount() { + this.setState({ + fieldItem: _.filter(_.map(fieldList, item => ({ + ...item, + label: getLabel(item.lanId, item.label), + viewAttr: this.props.isChief ? item.viewAttr : 1 + })), it => it.key !== "account" && it.key !== "realNamePassword") + }, () => { + this.taxReturnGetForm(); + }); + } + + taxReturnGetForm = () => { + const { taxAgentId } = this.props; + taxReturnGetForm({ taxAgentId }).then(({ status, data }) => { + if (status) { + const { fieldForm } = this.state; + this.setState({ + fieldForm: { + ...fieldForm, + ..._.reduce(_.keys(fieldForm), (pre, cur) => { + if (cur !== "city") { + if (cur === "checkStatus") { + const checkStatusMap = { + "NOT_COMMIT": getLabel(111, "未验证"), + "SUCCESS": getLabel(111, "成功"), + "FAIL": getLabel(111, "失败") + }; + return { ...pre, [cur]: checkStatusMap[data[cur]] }; + } + return { ...pre, [cur]: data[cur] }; + } + return { + ...pre, + [cur]: `${data["nation"]}-${data["province"]}-${data[cur]}` + }; + }, {}), + cityVal: (data["city"] && data["cityName"]) ? [{ id: data["city"], name: data["cityName"] }] : [] + } + }); + } + }); + }; + handleChangeValue = (key, value, cityVal = []) => { + const { fieldForm } = this.state; + this.setState({ + fieldForm: !_.isEmpty(cityVal) ? { + ...fieldForm, [key]: value, cityVal + } : { ...fieldForm, [key]: value } + }, () => { + if (key === "passwordType" && this.state.fieldForm.passwordType === "REAL_NAME_PASSWORD") { + this.setState({ + fieldItem: _.filter(fieldList, it => it.key !== "netPassword"), + fieldForm: { ...this.state.fieldForm, account: null, realNamePassword: null, netPassword: null } + }); + } else if (key === "passwordType" && this.state.fieldForm.passwordType === "TAX_NET_PASSWORD") { + this.setState({ + fieldItem: _.filter(fieldList, it => it.key !== "account" && it.key !== "realNamePassword"), + fieldForm: { ...this.state.fieldForm, netPassword: null, account: null, realNamePassword: null } + }); + } + }); + }; + + render() { + const { fieldItem, fieldForm } = this.state; + return ( +
+ + { + _.map(fieldItem, item => { + const { key, label, type, viewAttr, options = [] } = item; + return + { + (type === "TEXT" || type === "PASSWORD") && + this.handleChangeValue(key, v)}/> + } + { + type === "SELECT" && + { + if (!_.isEmpty(datas)) { + this.handleChangeValue(key, `1-${datas[0].pid}-${datas[0].id}`, _.map(datas, it => ({ + id: it.id, + name: it.name + }))); + } else { + this.handleChangeValue(key, "", []); + } + }} + /> + } + { + type === "RADIO" && + ({ ...it, showname: getLabel(it.lanId, it.showname) }))} + viewAttr={viewAttr} + onChange={(v) => this.handleChangeValue(key, v)}/> + } + ; + }) + } + +
+ ); + } +} + +export default TaxDeclarationInfo; diff --git a/pc4mobx/hrmSalary/pages/salary/components/taxFillingInfoDialog.js b/pc4mobx/hrmSalary/pages/salary/components/taxFillingInfoDialog.js new file mode 100644 index 00000000..3a02b4b7 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/components/taxFillingInfoDialog.js @@ -0,0 +1,132 @@ +/* + * Author: 黎永顺 + * name: 个税申报-异常、失败详情 + * Description: + * Date: 2023/8/18 + */ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { WeaDialog, WeaLocaleProvider, WeaTable } from "ecCom"; +import { Button, message } from "antd"; +import { deptFillCondition, taxFillColumns, taxFillCondition } from "./constants"; +import { getSearchs } from "../../../util"; +import { saveDepartmentCodeAndCheck } from "../../../apis/taxAgent"; + +const { getLabel } = WeaLocaleProvider; + +@inject("taxAgentStore") +@observer +class TaxFilingInfoDialofg extends Component { + constructor(props) { + super(props); + this.state = { + selectedRowKeys: [], checkLoading: false + }; + } + + componentWillReceiveProps(nextProps, nextContext) { + if (!_.isEmpty(nextProps.taxAgentTaxReturnCheckFormDTO) && + Object.prototype.toString.call(nextProps.taxAgentTaxReturnCheckFormDTO) === "[object Object]" + ) { + const { taxAgentTaxReturnCheckFormDTO, taxAgentStore: { taxfillInfoForm, deptfillInfoForm } } = nextProps; + taxfillInfoForm.initFormFields(taxFillCondition); + deptfillInfoForm.initFormFields(deptFillCondition); + const fields = _.map(taxFillCondition[0].items, it => { + return it.domkey[0]; + }); + fields.map(item => { + taxfillInfoForm.updateFields({ + [item]: item !== "divideFiling" ? (taxAgentTaxReturnCheckFormDTO[item] || "") : (taxAgentTaxReturnCheckFormDTO[item] === "ON" ? getLabel(538048, "是") : getLabel(30587, "否")) + }); + }); + } + if (nextProps.visible !== this.props.visible && !nextProps.visible) { + const { taxAgentStore: { setTaxfillInfoForm, initDeptfillInfoForm } } = nextProps; + setTaxfillInfoForm(); + initDeptfillInfoForm(); + } + } + + handleSaveOrKnow = () => { + const { taxAgentStore: { taxfillInfoForm, deptfillInfoForm }, checkPayload } = this.props; + if (taxfillInfoForm.getFormParams().divideFiling === getLabel(538048, "是")) { + deptfillInfoForm.validateForm().then(f => { + if (f.isValid) { + this.setState({ checkLoading: true }); + saveDepartmentCodeAndCheck(_.omitBy({ ...checkPayload, ...deptfillInfoForm.getFormParams() }, val => _.isNil(val))) + .then(({ status, errormsg }) => { + this.setState({ checkLoading: false }); + if (status) { + message.success(getLabel(30700, "操作成功!")); + this.props.onCancel(true); + } else { + message.error(errormsg); + } + }).catch(() => this.setState({ checkLoading: false })); + } else { + f.showErrors(); + } + }); + } else { + this.props.onCancel(); + } + }; + + render() { + const { selectedRowKeys, checkLoading } = this.state; + const { taxAgentStore: { taxfillInfoForm, deptfillInfoForm }, taxAgentTaxReturnCheckFormDTO, loading } = this.props; + const rowSelection = { + type: "radio", + selectedRowKeys, + onChange: selectedRowKeys => this.setState({ selectedRowKeys }) + }; + return ( + + {taxfillInfoForm.getFormParams().divideFiling === getLabel(538048, "是") ? getLabel(537558, "保存") : getLabel(545147, "知道了")} + + ] : [ + + ] + } + style={{ + width: 850, + height: 480, + minHeight: 200, + minWidth: 380, + maxHeight: "50%", + maxWidth: "50%", + overflow: "hidden", + transform: "translate(0px, 0px)" + }} + > +
+ { + Object.prototype.toString.call(taxAgentTaxReturnCheckFormDTO) === "[object Object]" ? + + {getSearchs(taxfillInfoForm, taxFillCondition, 1)} + {taxfillInfoForm.getFormParams().divideFiling === getLabel(538048, "是") && getSearchs(deptfillInfoForm, deptFillCondition, 1)} + : + ({ + dataIndex: o.dataIndex, + width: 200, + title: getLabel(o.titleId, o.title) + }))} + scroll={{ x: 1200 }} rowSelection={rowSelection} + /> + } +
+
+ ); + } +} + +export default TaxFilingInfoDialofg; diff --git a/pc4mobx/hrmSalary/pages/salary/index.less b/pc4mobx/hrmSalary/pages/salary/index.less new file mode 100644 index 00000000..e6dacf00 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/index.less @@ -0,0 +1,101 @@ +.salaryAgentWrapper { + .wea-new-top-content { + background: #f6f6f6; + padding: 8px 16px 0; + } + + .wea-new-top { + .wea-input-focus { + height: 31.36px; + line-height: 0; + } + } + + .comContent { + .wea-search-group:first-child { + margin-bottom: 16px; + } + + .wea-search-group { + padding: 0; + background: #fff; + + .wea-title { + padding: 0 10px; + } + + .wea-content { + padding: 0; + + .wea-form-item { + padding-left: 18px; + } + } + } + + .customTitleWrapper { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + + .ant-btn { + margin-left: 10px; + border-radius: 0; + padding: 0; + background: transparent; + border: none; + font-size: 20px; + line-height: 20px; + } + + .ant-btn.ant-btn-primary[disabled] { + color: #d8d8d8; + } + + .ant-btn.ant-btn-primary { + color: #55a1f8; + } + } + + .tdEllipsis { + display: inline-block; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + .ant-col-10 { + span:nth-child(2) { + //margin-top: -6px; + } + } + + .taxAgentSlide { + .wea-slide-modal-title { + height: auto; + line-height: normal; + text-align: left; + background: #FFF; + + .wea-new-top .ant-col-10 { + padding-right: 45px !important; + } + } + + .rodal-close { + z-index: 99; + top: 10px !important; + } + + .wea-new-top-req-wapper .wea-new-top-req-title > div:last-child { + right: 45px !important; + } + + .wea-slide-modal-content { + height: 100%; + } + } +} diff --git a/pc4mobx/hrmSalary/pages/salary/taxAgent.js b/pc4mobx/hrmSalary/pages/salary/taxAgent.js new file mode 100644 index 00000000..300037c3 --- /dev/null +++ b/pc4mobx/hrmSalary/pages/salary/taxAgent.js @@ -0,0 +1,236 @@ +import React, { Component } from "react"; +import { inject, observer } from "mobx-react"; +import { Button, message, Modal } from "antd"; +import { WeaCheckbox, WeaFormItem, WeaInputSearch, WeaLocaleProvider, WeaSearchGroup, WeaTop } from "ecCom"; +import ComHint from "./components/comHint"; +import TaxAgentTable from "./components/taxAgentTable"; +import TaxAgentSlide from "./components/taxAgentSlide"; +import LogDialog from "../../components/logViewModal"; +import * as API from "../../apis/taxAgent"; +import "./index.less"; + +const { getLabel } = WeaLocaleProvider; + +@inject("taxAgentStore") +@observer +class TaxAgent extends Component { + constructor(props) { + super(props); + this.state = { + syncLoading: false, //同步人员范围loading + searchValue: "", + decentralization: "0", //启用分权 + taxAgentSlideProps: { + isEdit: false, visible: false, title: getLabel(543629, "新增个税扣缴义务人"), + taxAgentId: "", current: 0, salaryOn: false + }, + logDialogVisible: false, + filterConditions: "[]" + }; + this.taxAgentTableRef = null; + } + + componentDidMount() { + this.getTaxAgentBaseForm(); + } + + getTaxAgentBaseForm = () => { + API.getTaxAgentBaseForm().then(({ status, data }) => { + if (status) { + const { devolutionStatus } = data; + this.setState({ decentralization: String(devolutionStatus || 0) }); + } + }); + }; + /* + * Author: 黎永顺 + * Description:开启关闭个税扣缴义务人开关 + * Params: + * Date: 2022/11/29 + */ + taxAgentBaseSave = devolutionStatus => { + this.setState({ decentralization: this.state.decentralization }, () => { + Modal.confirm({ + title: getLabel(131329, "信息确认"), + content: `${getLabel(33703, "确认")}${devolutionStatus === "0" ? getLabel(26471, "停用") : getLabel(26472, "启用")}${getLabel(524044, "分权")}?`, + onOk: () => { + const paylaod = { devolutionStatus }; + const { taxAgentStore } = this.props; + const { taxAgentBaseSave, setSalarytaxAgentForm } = taxAgentStore; + taxAgentBaseSave(paylaod).then(({ status, errormsg }) => { + if (status) { + message.success(`${devolutionStatus === "0" ? "停用" : "启用"}分权成功`); + this.getTaxAgentBaseForm(); + this.taxAgentTableRef.getTaxAgentList(); + setSalarytaxAgentForm(); + } else { + message.error(errormsg || `${devolutionStatus === "0" ? "停用" : "启用"}分权失败`); + } + }); + } + }); + }); + }; + /* + * Author: 黎永顺 + * Description: + * Params:添加个税扣缴义务人 + * Date: 2022/11/29 + */ + handleAddTaxAgent = () => { + this.setState({ + taxAgentSlideProps: { + ...this.state.taxAgentSlideProps, + visible: true, current: 0 + } + }); + }; + /* + * Author: 黎永顺 + * Description:启用分权 + * Params: + * Date: 2022/12/1 + */ + taxAgentRangeSync = () => { + const { taxAgentStore } = this.props; + const { taxAgentRangeSync } = taxAgentStore; + this.setState({ syncLoading: true }); + taxAgentRangeSync({}).then(({ status, data, errormsg }) => { + this.setState({ syncLoading: false }); + if (status) { + message.success(data || getLabel(30700, "操作成功")); + this.taxAgentTableRef.getTaxAgentList(); + } else { + message.error(data || errormsg || getLabel(30651, "操作失败")); + } + }); + }; + handelResetSlide = (isUpdate = false) => { + const { taxAgentStore } = this.props; + const { salarytaxAgentForm } = taxAgentStore; + this.setState({ + taxAgentSlideProps: { + ...this.state.taxAgentSlideProps, + isEdit: false, + visible: false, + title: getLabel(543629, "新增个税扣缴义务人"), + taxAgentId: "", + current: 0 + } + }, () => { + isUpdate && this.taxAgentTableRef.getTaxAgentList(); + salarytaxAgentForm.resetForm(); + }); + }; + handleOperate = (type, itemId, current = 0) => { + switch (type) { + case "edit": + this.setState({ + taxAgentSlideProps: { + ...this.state.taxAgentSlideProps, + visible: true, title: getLabel(543632, "编辑个税扣缴义务人"), + taxAgentId: itemId, current, isEdit: true + } + }); + break; + case "delete": + Modal.confirm({ + title: getLabel(131329, "信息确认"), + content: getLabel(388758, "确认要删除吗?"), + onOk: () => { + API.deleteTaxAgent([itemId]).then(({ status, errormsg }) => { + if (status) { + message.success(getLabel(502230, "删除成功")); + this.taxAgentTableRef.getTaxAgentList(); + } else { + message.error(errormsg || getLabel(20462, "删除失败")); + } + }); + } + }); + break; + case "log": + this.setState({ + logDialogVisible: true, + filterConditions: itemId ? `[{\"connectCondition\":\"AND\",\"columIndex\":\"targetid\",\"type\":\"=\",\"value\":\"${itemId}\"}]` : "[]" + }); + break; + default: + break; + } + }; + + render() { + const { taxAgentStore: { PageAndOptAuth: permission } } = this.props; + const { + searchValue, decentralization, taxAgentSlideProps, syncLoading, logDialogVisible, filterConditions + } = this.state; + const btns = [ + , + this.setState({ searchValue })} + placeholder={getLabel(543634, "请输入个税扣缴义务人名称")} + onSearch={() => this.taxAgentTableRef.getTaxAgentList()} + /> + ]; + const customTitle =
+ {getLabel(537996, "个税扣缴义务人")} + { + permission.isChief && + + } +
; + const showOperateBtn = permission.opts.includes("admin"); + return ( +
+ } + iconBgcolor="#F14A2D" + buttons={showOperateBtn ? btns : btns.slice(1)} + showDropIcon onDropMenuClick={key => this.handleOperate(key)} + dropMenuDatas={[ + { + key: "log", icon: , + content: getLabel(545781, "操作日志") + } + ]} + > +
+ { + permission.isChief && + + + + + + } + + this.taxAgentTableRef = dom}/> + +
+ + this.taxAgentTableRef.getTaxAgentList()} + onCancel={(isUpdate = false) => this.handelResetSlide(isUpdate)} + /> + {/*操作日志*/} + this.setState({ logDialogVisible: false })}/> +
+
+ ); + } +} + +export default TaxAgent; diff --git a/pc4mobx/hrmSalary/stores/taxAgent.js b/pc4mobx/hrmSalary/stores/taxAgent.js index 94d9898f..45fe8041 100644 --- a/pc4mobx/hrmSalary/stores/taxAgent.js +++ b/pc4mobx/hrmSalary/stores/taxAgent.js @@ -9,6 +9,13 @@ import { PAGE } from "../config"; const { TableStore } = WeaTableNew; export class TaxAgentStore { + @observable salarytaxAgentForm = new WeaForm(); //新版个税扣缴义务人表单实体 + @observable taxfillInfoForm = new WeaForm(); //报税信息查看form + @action setTaxfillInfoForm = () => this.taxfillInfoForm = new WeaForm(); //报税信息form初始化 + @observable personScopeForm = new WeaForm(); //个税扣缴义务人新增人员form + @action initPersonScopeForm = () => this.personScopeForm = new WeaForm(); //个税扣缴义务人新增人员form初始化 + @observable deptfillInfoForm = new WeaForm(); //报税信息部门备案form + @action initDeptfillInfoForm = () => this.deptfillInfoForm = new WeaForm(); //报税信息部门备案form初始化 @observable advanceForm = new WeaForm(); //权限-角色高级搜索form表单 @observable roleForm = new WeaForm(); //权限-角色form表单 @action initRoleForm = () => this.roleForm = new WeaForm(); @@ -52,6 +59,8 @@ export class TaxAgentStore { @action setStatisticsReportBtn = bool => (this.statisticsReportBtn = bool);//薪酬统计报表权限 @action setPayrollPermission = bool => (this.payrollPermission = bool);// 薪资核算页面权限 + @action setSalarytaxAgentForm = () => (this.salarytaxAgentForm = new WeaForm());//薪资项目权限 + // 初始化操作 @action doInit = params => {