diff --git a/config/routes.js b/config/routes.js
index e1ea3f6..3f53f1a 100644
--- a/config/routes.js
+++ b/config/routes.js
@@ -29,6 +29,12 @@ export default [
path: '/topnavbar00/business/basic',
name: 'basic',
component: './business_basic/basic',
+ },
+ // 计划管理
+ {
+ path: '/topnavbar00/business/planmanage',
+ name: 'planmanage',
+ component: './business_planmanage/PlanManage',
}
],
},
diff --git a/src/assets/img/icon2.svg b/src/assets/img/icon2.svg
new file mode 100644
index 0000000..9f9baf6
--- /dev/null
+++ b/src/assets/img/icon2.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/pages/business_basic/components/CustomerInfoManagement.js b/src/pages/business_basic/components/CustomerInfoManagement.js
index 0e66b33..a858afe 100644
--- a/src/pages/business_basic/components/CustomerInfoManagement.js
+++ b/src/pages/business_basic/components/CustomerInfoManagement.js
@@ -98,8 +98,8 @@ const CustomerInfoManagement = () => {
barWidth: 26,
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
- { offset: 0, color: '#7FC8B6' },
- { offset: 1, color: '#008F8E' },
+ { offset: 0, color: 'rgba(4, 95, 94, 0.6)' },
+ { offset: 1, color: 'rgba(4, 95, 94, 0.5)' },
]),
// barBorderRadius: [6, 6, 0, 0],
shadowColor: 'rgba(0,0,0,0.08)',
diff --git a/src/pages/business_basic/components/CustomerInfoManagement.less b/src/pages/business_basic/components/CustomerInfoManagement.less
index 79dad47..aa54f80 100644
--- a/src/pages/business_basic/components/CustomerInfoManagement.less
+++ b/src/pages/business_basic/components/CustomerInfoManagement.less
@@ -92,9 +92,9 @@
.activityCard {
flex: 1;
background: #F3F9F8;
- border-radius: 8px;
+ border-radius: 4px;
padding: 16px;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+ box-shadow: 0 4px 6px rgba(118, 194, 181, 0.3);
border: 1px solid #76C2B5;
.chartHeader {
diff --git a/src/pages/business_planmanage/PlanManage.js b/src/pages/business_planmanage/PlanManage.js
new file mode 100644
index 0000000..05da653
--- /dev/null
+++ b/src/pages/business_planmanage/PlanManage.js
@@ -0,0 +1,55 @@
+import React, { useState } from 'react';
+import { Card, Row, Col, Statistic, Progress, Button, Space } from 'antd';
+import styles from './PlanManage.less';
+import BusinessPlanManagement from './components/BusinessPlanManagement';
+import ProductionPlanManagement from './components/ProductionPlanManagement';
+import PlanApprovalProcess from './components/PlanApprovalProcess';
+
+const PlanManage = () => {
+ const [activeModule, setActiveModule] = useState('businessPlan');
+
+ const handleModuleClick = (module) => {
+ setActiveModule(module)
+ }
+
+ const renderModule = () => {
+ switch (activeModule) {
+ case 'businessPlan':
+ return ;
+ case 'productionPlan':
+ return ;
+ case 'planApprovalProcess':
+ return ;
+ default:
+ return ;
+ }
+ };
+
+
+ return (
+
+
+
+
+
+
+
+ {renderModule()}
+
+
+ );
+};
+
+export default PlanManage;
diff --git a/src/pages/business_planmanage/PlanManage.less b/src/pages/business_planmanage/PlanManage.less
new file mode 100644
index 0000000..1d5e7ea
--- /dev/null
+++ b/src/pages/business_planmanage/PlanManage.less
@@ -0,0 +1,65 @@
+.container {
+ width: 100%;
+ height: 89vh;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+
+ .TopButton {
+ background-color: #FFFFFF;
+ width: 100%;
+ padding: 10px 30px;
+ display: flex;
+ gap: 24px;
+ margin-left: 6px;
+
+ .TopButtonItem {
+ background-color: transparent !important;
+ color: #333333 !important;
+ font-family: 'PingFang SC', sans-serif !important;
+ font-weight: 500 !important;
+ font-size: 14px !important;
+ line-height: 100% !important;
+ border-radius: 8px !important;
+ padding: 6px 10px !important;
+ height: auto !important;
+ border: none !important;
+ box-shadow: none !important;
+ position: relative !important;
+
+ &:hover {
+ color: #333333 !important;
+ border: none !important;
+ }
+
+ &:focus {
+ color: #006665 !important;
+ border: none !important;
+ }
+
+ &.active {
+ color: #006665 !important;
+
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ right: 0;
+ width: 100%;
+ height: 4px;
+ background-color: #006665;
+ border-radius: 0;
+ opacity: 1;
+ }
+ }
+ }
+ }
+
+ .content {
+ // ======== 内容区域样式 ========
+ flex: 1; // ======== 占据剩余空间 ========
+ overflow-y: auto; // ======== 允许垂直滚动 ========
+ padding: 0; // ======== 无内边距 ========
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_planmanage/components/BusinessPlanManagement.js b/src/pages/business_planmanage/components/BusinessPlanManagement.js
new file mode 100644
index 0000000..370e0a3
--- /dev/null
+++ b/src/pages/business_planmanage/components/BusinessPlanManagement.js
@@ -0,0 +1,297 @@
+import React, { useState, useMemo, useLayoutEffect } from 'react';
+import styles from './BusinessPlanManagement.less';
+import { Select, Space, Button, Input } from 'antd';
+import { PlusOutlined, SearchOutlined, ReloadOutlined } from '@ant-design/icons';
+import StandardTable from '@/components/StandardTable';
+import topIcon from '@/assets/business_basic/top_icon1.svg';
+import topIcon2 from '@/assets/business_basic/top_icon2.svg';
+import topIcon3 from '@/assets/business_basic/top_icon3.svg';
+import topIcon4 from '@/assets/business_basic/top_icon4.svg';
+const BusinessPlanManagement = () => {
+ const [searchKeyword, setSearchKeyword] = useState('');
+ const [selectedRows, setSelectedRows] = useState([]);
+ const [currentPage, setCurrentPage] = useState(1);
+ const [pageSize, setPageSize] = useState(10);
+ // 列表筛选与数据(演示数据,可替换为接口)
+ const [filters, setFilters] = useState({
+ customerType: '',
+ customerGrade: '',
+ cooperationStatus: '',
+ });
+ // 新增:详情页面切换状态
+ const [showDetail, setShowDetail] = useState(false);
+ const [detailData, setDetailData] = useState(null);
+ const [prevScrollY, setPrevScrollY] = useState(0);
+
+
+ // KPI数据
+ const kpiData = {
+ totalCustomers: 389,
+ highValueCustomers: 180,
+ inCooperation: 360,
+ newThisMonth: 8,
+ };
+
+
+ // 返回列表时恢复滚动位置,确保布局稳定后再滚动
+ useLayoutEffect(() => {
+ if (!showDetail) {
+ // 等待本帧布局完成
+ requestAnimationFrame(() => {
+ window.scrollTo(0, prevScrollY || 0);
+ });
+ }
+ }, [showDetail]);
+
+
+ // 表格数据
+ const tableData = [
+ {
+ id: 'CUST-2023-001',
+ customerName: '中国石化销售股份有限公司',
+ contact: '钱亚男',
+ phone: '18901563341',
+ classification: '高价值',
+ monthlyAmount: 1250000,
+ cooperationStatus: '合作中',
+ satisfaction: 4.5,
+ },
+ {
+ id: 'CUST-2023-002',
+ customerName: '中石化华东分公司',
+ contact: '郑宇雅',
+ phone: '15341731282',
+ classification: '常规客户',
+ monthlyAmount: 1250000,
+ cooperationStatus: '合作中',
+ satisfaction: 4.0,
+ },
+ {
+ id: 'CUST-2023-003',
+ customerName: '海南石油贸易有限公司',
+ contact: '孙向明',
+ phone: '13252257033',
+ classification: '高价值',
+ monthlyAmount: 850000,
+ cooperationStatus: '合作中',
+ satisfaction: 4.5,
+ },
+ {
+ id: 'CUST-2023-004',
+ customerName: '东莞石化有限公司',
+ contact: '何思颖',
+ phone: '18931788771',
+ classification: '高价值',
+ monthlyAmount: 980000,
+ cooperationStatus: '合作中',
+ satisfaction: 4.5,
+ },
+ {
+ id: 'CUST-2023-005',
+ customerName: '中国石油化工集团有限公司',
+ contact: '钱佳仪',
+ phone: '13743378254',
+ classification: '常规客户',
+ monthlyAmount: 980000,
+ cooperationStatus: '暂停合作',
+ satisfaction: 4.0,
+ },
+ ];
+
+ // 列配置(用于 StandardTable)
+ const columns = useMemo(() => {
+ return [
+ { title: '客户名称', dataIndex: 'customerName', key: 'customerName', width: 220 },
+ { title: '联系人', dataIndex: 'contact', key: 'contact', width: 120 },
+ { title: '联系电话', dataIndex: 'phone', key: 'phone', width: 140 },
+ {
+ title: '分类', dataIndex: 'classification', key: 'classification', width: 110,
+ render: (val) => (
+ {val}
+ )
+ },
+ {
+ title: '交易额度(月)', dataIndex: 'monthlyAmount', key: 'monthlyAmount', width: 150,
+ render: (v) => `¥${Number(v).toLocaleString()}`
+ },
+ {
+ title: '合作状态', dataIndex: 'cooperationStatus', key: 'cooperationStatus', width: 110,
+ render: (val) => (
+ {val}
+ )
+ },
+ {
+ title: '满意度', dataIndex: 'satisfaction', key: 'satisfaction', width: 120,
+ },
+ {
+ title: '操作', key: 'action', fixed: 'right', width: 200,
+ render: (_, row) => (
+
+
+
+
+
+ )
+ },
+ ];
+ }, []);
+
+ // 处理选择
+ const handleSelectRow = (id) => {
+ if (selectedRows.includes(id)) {
+ setSelectedRows(selectedRows.filter(rowId => rowId !== id));
+ } else {
+ setSelectedRows([...selectedRows, id]);
+ }
+ };
+
+ return (
+
+
+ {/* KPI卡片区域 */}
+
+
+
+
{kpiData.totalCustomers}
+
总客户数
+
+

+
+
+
+
{kpiData.highValueCustomers}
+
高价值客户
+
+

+
+
+
+
{kpiData.inCooperation}
+
合作中
+
+

+
+
+
+
{kpiData.newThisMonth}
+
本月新增
+
+

+
+
+ {/* 客户列表区域 */}
+
+
+
+ 客户列表
+
+
+
+ setSearchKeyword(e.target.value)}
+ onSearch={(val) => setSearchKeyword(val)}
+ style={{ minWidth: 150 }}
+ />
+
+
+ 客户类型:
+
+
+ 客户等级:
+
+
+ 合作状态:
+
+
+ }
+ className={styles.queryBtn}
+ >
+ 查询
+
+ }
+ className={styles.resetBtn}
+ >
+ 重置
+
+
+
+ }
+ className={styles.addBtn}
+ >
+ 新增客户
+
+ }
+ className={styles.exportBtn}
+ >
+ 批量导出
+
+
+
+
+ `共 ${total} 条`,
+ },
+ }}
+ selectionType="checkbox"
+ selectedRowKeys={selectedRows}
+ onSelectRow={(row) => handleSelectRow(row.id)}
+ onSelectAll={(checked) => checked ? setSelectedRows(tableData.map(i => i.id)) : setSelectedRows([])}
+ onChangePage={(page) => setCurrentPage(page)}
+ onChangePageSize={(size) => { setPageSize(size); setCurrentPage(1); }}
+ />
+
+
+
+
+ );
+};
+
+export default BusinessPlanManagement;
diff --git a/src/pages/business_planmanage/components/BusinessPlanManagement.less b/src/pages/business_planmanage/components/BusinessPlanManagement.less
new file mode 100644
index 0000000..95e81e7
--- /dev/null
+++ b/src/pages/business_planmanage/components/BusinessPlanManagement.less
@@ -0,0 +1,344 @@
+.container {
+ padding: 10px 5px;
+ background: #f5f5f5;
+ min-height: 100vh;
+
+ .mainCard {
+ background: #fff;
+ border-radius: 0px;
+ // box-shadow: 0 4px 16px rgba(0,0,0,0.08);
+ // border: 1px solid #eaeaea;
+ padding: 16px;
+ }
+
+ // KPI卡片区域(改为贴近截图样式)
+ .kpiGrid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 16px;
+ margin-bottom: 20px;
+
+ .kpiCard {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-radius: 6px;
+ background: linear-gradient(180deg, #A1DED4 0%, #CBEDE74D 70%);
+ // border: 1px solid transparent;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+ transition: border-color 0.2s, box-shadow 0.2s;
+
+ &.kpiCardActive {
+ border-color: #1890ff;
+ box-shadow: 0 0 0 3px rgba(24, 144, 255, 0.2);
+ }
+
+ &:hover {
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+ }
+
+ .kpiText {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ }
+
+ .kpiValue {
+ font-size: 24px;
+ font-weight: 600;
+ color: #333;
+ }
+
+ .kpiTitle {
+ font-size: 12px;
+ color: #4E5856;
+ }
+
+ .kpiIconBox {
+ width: 40px;
+ height: 40px;
+ border-radius: 8px;
+ background: #1D6E6A;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ flex-shrink: 0;
+ border: 1px solid rgba(0, 0, 0, 0.06);
+ }
+
+ .kpiIcon {
+ font-size: 20px;
+ line-height: 1;
+ }
+
+ .kpiIconImg {
+ width: 40px;
+ height: 40px;
+ display: block;
+ object-fit: contain;
+ }
+ }
+ }
+
+ // 图表和活动区域(已移除对应样式)
+
+ // 底部区域 - 客户列表
+ .bottomSection {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ // border: 1px solid @section-border;
+ background: #fff;
+ padding: 5px 10px;
+
+ // 区域头部
+ .sectionHeader {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 15px;
+
+ // 装饰条
+ .sectionBar {
+ width: 2px;
+ height: 16px;
+ background: rgba(0, 102, 101, 1);
+ border-radius: 1px;
+ }
+
+ // 标题
+ .sectionTitle {
+ font-size: 18px;
+ font-weight: 600;
+ color: #333;
+ }
+ }
+
+ // 筛选内容区域
+ .filterContent {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+ // justify-content: space-between;
+
+ // 筛选项
+ .filterItem {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+
+ // 筛选标签
+ .filterLabel {
+ color: #333;
+ font-size: 14px;
+ }
+
+ :global {
+
+ // 统一 Input.Search 边框颜色为绿主题
+ .ant-input-affix-wrapper {
+ border-radius: 0px !important;
+ border-color: rgba(44, 158, 157, 1) !important;
+ }
+
+ .ant-input-search-button {
+ border-radius: 0px !important;
+ border-color: rgba(44, 158, 157, 1) !important;
+ }
+
+ .ant-select {
+ min-width: 90px;
+
+ // 选择框样式
+ .ant-select-selector {
+ border-color: rgba(44, 158, 157, 1) !important;
+ border-radius: 2px !important;
+ }
+
+ &:hover .ant-select-selector {
+ border-color: rgba(44, 158, 157, 1) !important;
+ }
+
+ &.ant-select-focused .ant-select-selector {
+ border-color: rgba(44, 158, 157, 1) !important;
+ box-shadow: 0 0 0 2px rgba(44, 158, 157, 0.2) !important;
+ }
+ }
+ }
+ }
+
+ // 筛选按钮组
+ .filterButtons {
+ display: flex;
+ gap: 12px;
+
+ .queryBtn {
+ background-image: url('@/assets/business_basic/Bt_bg1.png');
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ border: none;
+ }
+
+ .resetBtn {
+ background-image: url('@/assets/business_basic/Bt_bg2.png');
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ border: none;
+ color: #006665;
+ }
+ }
+
+ // 右侧按钮组
+ .filterButtonsRight {
+ display: flex;
+ gap: 12px;
+ margin-left: auto;
+
+ .addBtn {
+ background-image: url('@/assets/business_basic/Bt_bg1.png');
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ border: none;
+ }
+
+ .exportBtn {
+ background-image: url('@/assets/business_basic/Bt_bg2.png');
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ border: none;
+ color: #006665;
+ }
+ }
+ }
+
+ // 表格包装器
+ .tableWrapper {
+ flex: 1;
+ min-height: 0;
+ display: flex;
+ flex-direction: column;
+
+ :global(.ant-table-wrapper) {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ }
+
+ // 表头样式
+ :global {
+ .ant-table-thead>tr>th {
+ color: rgba(51, 51, 51, 1) !important;
+ font-weight: 450 !important;
+ background-color: rgba(240, 247, 247, 1) !important;
+ text-align: center !important;
+ }
+
+ // 表体样式
+ .ant-table-tbody>tr>td {
+ color: rgba(78, 88, 86, 1) !important;
+ font-weight: 400 !important;
+ text-align: center !important;
+ }
+
+ // 操作列按钮样式
+ .viewDetailBtn {
+ color: rgba(0, 102, 101, 1) !important;
+
+ &:hover {
+ color: rgba(0, 102, 101, 1) !important;
+ }
+ }
+
+ .editBtn {
+ color: rgba(45, 158, 157, 1) !important;
+
+ &:hover {
+ color: rgba(45, 158, 157, 1) !important;
+ }
+ }
+
+ .deleteBtn {
+ color: rgba(255, 130, 109, 1) !important;
+
+ &:hover {
+ color: rgba(255, 130, 109, 1) !important;
+ }
+ }
+
+ // 状态列 Switch 样式
+ .statusSwitch {
+
+ // 启用状态背景色
+ &.ant-switch-checked {
+ background-color: rgba(20, 106, 89, 1) !important;
+ }
+
+ // 停用状态背景色
+ &:not(.ant-switch-checked) {
+ background-color: rgba(153, 153, 153, 1) !important;
+ }
+ }
+
+ // 复选框样式
+ .ant-checkbox-inner {
+ border-color: rgba(0, 102, 101, 1) !important;
+ &::after {
+ background-color: rgba(0, 102, 101, 1) !important;
+ }
+ }
+
+ .ant-checkbox-wrapper:hover .ant-checkbox-inner,
+ .ant-checkbox:hover .ant-checkbox-inner {
+ border-color: rgba(0, 102, 101, 1) !important;
+ }
+
+ .ant-checkbox-checked .ant-checkbox-inner {
+ background-color: rgba(0, 102, 101, 1) !important;
+ border-color: rgba(0, 102, 101, 1) !important;
+ }
+
+ // 分页样式(绿色主题)
+ // .ant-pagination {
+ // .ant-pagination-total-text {
+ // color: rgba(78, 88, 86, 1) !important;
+ // }
+ // .ant-pagination-item {
+ // border-radius: 2px;
+ // border-color: rgba(44, 158, 157, 1) !important;
+ // }
+ // .ant-pagination-item a {
+ // color: rgba(78, 88, 86, 1) !important;
+ // }
+ // .ant-pagination-item-active {
+ // border-color: rgba(0, 102, 101, 1) !important;
+ // background: rgba(240, 247, 247, 1) !important;
+ // }
+ // .ant-pagination-item-active a {
+ // color: rgba(0, 102, 101, 1) !important;
+ // }
+ // .ant-pagination-item:hover {
+ // border-color: rgba(0, 102, 101, 1) !important;
+ // }
+ // .ant-pagination-prev .ant-pagination-item-link,
+ // .ant-pagination-next .ant-pagination-item-link {
+ // border-radius: 2px;
+ // border-color: rgba(44, 158, 157, 1) !important;
+ // color: rgba(78, 88, 86, 1) !important;
+ // }
+ // .ant-select-selector {
+ // border-color: rgba(44, 158, 157, 1) !important;
+ // border-radius: 2px !important;
+ // }
+ // }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/pages/business_planmanage/models/PlanManage.js b/src/pages/business_planmanage/models/PlanManage.js
new file mode 100644
index 0000000..19c7916
--- /dev/null
+++ b/src/pages/business_planmanage/models/PlanManage.js
@@ -0,0 +1,319 @@
+import { deleteByPrimaryKeyForProUser, selectByPrimaryKeyForProUser, insertForProUser, updateForProUser, deleteByMapForProUser,updateByMapForProUser, getOneForProUser,getAllForProUser,queryPageForProUser, countForProUser, insertBatchForProUser, deleteBatchForProUser,updateBatchForProUser, resetPwdForProUser } from '@/services/system/api_prouser';
+
+export default {
+ namespace: 'PlanManage',
+
+ state: {
+ params: {},
+ data: {
+ list: [],
+ pagination: {},
+ },
+ },
+
+ effects: {
+ *delete_by_primarykey_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(deleteByPrimaryKeyForProUser, payload)
+ yield put({
+ type: 'deleteByPrimaryKeyForProUser',
+ payload: response
+ })
+
+ if (!response.success) {
+ callback && callback(response)
+ return
+ }
+
+ const params = yield select(state => state.prouser.params)
+ const responseData = yield call(queryPageForProUser, params)
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responseData
+ })
+
+ if (callback) callback(response)
+ },
+ *select_by_primarykey_for_prouser({ payload, callback }, { call, put }) {
+ const response = yield call(selectByPrimaryKeyForProUser, payload)
+ yield put({
+ type: 'selectByPrimaryKeyForProUser',
+ payload: response
+ })
+
+ if (callback) callback(response)
+ },
+ *insert_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(insertForProUser, payload)
+ yield put({
+ type: 'insertForProUser',
+ payload: response
+ })
+
+ if (!response.success) {
+ callback && callback(response)
+ return
+ }
+
+ const params = yield select(state => state.prouser.params)
+ const responseData = yield call(queryPageForProUser, params)
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responseData
+ })
+
+ if (callback) callback(response)
+ },
+ *update_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(updateForProUser, payload)
+ yield put({
+ type: 'updateForProUser',
+ payload: response
+ })
+
+ if (!response.success) {
+ callback && callback(response)
+ return
+ }
+
+ const params = yield select(state => state.prouser.params)
+ const responseData = yield call(queryPageForProUser, params)
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responseData
+ })
+
+ if (callback) callback(response)
+ },
+ *delete_by_map_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(deleteByMapForProUser, payload);
+ yield put({
+ type: 'deleteByMapForProUser',
+ payload: response,
+ });
+
+ const params = yield select(state => state.prouser.params);
+ const responsedata = yield call(queryPageForProUser, params);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responsedata,
+ });
+
+ if (callback) callback(response);
+ },
+ *update_by_map_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(updateByMapForProUser, payload);
+ yield put({
+ type: 'updateByMapForProUser',
+ payload: response,
+ });
+
+ const params = yield select(state => state.prouser.params);
+ const responsedata = yield call(queryPageForProUser, params);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responsedata,
+ });
+
+ if (callback) callback(response);
+ },
+ *get_one_for_prouser({ payload, callback }, { call, put }) {
+ const response = yield call(getOneForProUser, payload);
+ yield put({
+ type: 'getOneForProUser',
+ payload: response,
+ });
+
+ if (callback) callback(response);
+ },
+ *get_all_for_prouser({ payload, callback }, { call, put }) {
+ const response = yield call(getAllForProUser, payload);
+ yield put({
+ type: 'getAllForProUser',
+ payload: response,
+ });
+
+ if (callback) callback(response);
+ },
+ *query_page_for_prouser({ payload, callback }, { select, call, put }) {
+ const params = yield select(state => state.prouser.params);
+ const newParams = payload?.resetFlag ? payload : {...params, ...payload};
+ yield put({
+ type: 'setQueryPageByParams',
+ payload: newParams,
+ });
+ const response = yield call(queryPageForProUser, newParams);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: response,
+ });
+
+ if (callback) callback(response);
+ },
+ *count_for_prouser({ payload, callback }, { call, put }) {
+ const response = yield call(countForProUser, payload);
+ yield put({
+ type: 'countForProUser',
+ payload: response,
+ });
+
+ if (callback) callback(response);
+ },
+ *insert_batch_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(insertBatchForProUser, payload);
+ yield put({
+ type: 'insertBatchForProUser',
+ payload: response,
+ });
+
+ const params = yield select(state => state.prouser.params);
+ const responsedata = yield call(queryPageForProUser, params);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responsedata,
+ });
+
+ if (callback) callback(response);
+ },
+ *delete_batch_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(deleteBatchForProUser, payload);
+ yield put({
+ type: 'deleteBatchForProUser',
+ payload: response,
+ });
+
+ const params = yield select(state => state.prouser.params);
+ const responsedata = yield call(queryPageForProUser, params);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responsedata,
+ });
+
+ if (callback) callback(response);
+ },
+ *update_batch_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(updateBatchForProUser, payload);
+ yield put({
+ type: 'updateBatchForProUser',
+ payload: response,
+ });
+
+ const params = yield select(state => state.prouser.params);
+ const responsedata = yield call(queryPageForProUser, params);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responsedata,
+ });
+
+ if (callback) callback(response);
+ },
+ *resetpwd_for_prouser({ payload, callback }, { select, call, put }) {
+ const response = yield call(resetPwdForProUser, payload);
+ yield put({
+ type: 'resetPwdForProUser',
+ payload: response,
+ });
+
+ const params = yield select(state => state.prouser.params);
+ const responsedata = yield call(queryPageForProUser, params);
+ yield put({
+ type: 'queryPageForProUser',
+ payload: responsedata,
+ });
+
+ if (callback) callback(response);
+ },
+ },
+
+ reducers: {
+ setQueryPageByParams(state, { payload }) {
+ return {
+ ...state,
+ params: {...payload},
+ };
+ },
+ deleteByPrimaryKeyForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ selectByPrimaryKeyForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ insertForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ updateForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ deleteByMapForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ updateByMapForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ getOneForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ getAllForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ queryPageForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ countForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ insertBatchForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ deleteBatchForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ updateBatchForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ resetPwdForProUser(state, action) {
+ return {
+ ...state,
+ data: action.payload,
+ };
+ },
+ },
+};
diff --git a/src/pages/nav_system_content/SystemContentList.js b/src/pages/nav_system_content/SystemContentList.js
index ad7c97a..6be8540 100644
--- a/src/pages/nav_system_content/SystemContentList.js
+++ b/src/pages/nav_system_content/SystemContentList.js
@@ -21,6 +21,7 @@ import license from '@/assets/img/license.svg'
import people from '@/assets/img/people.svg'
import risk from '@/assets/img/risk.svg'
import icon1 from '@/assets/img/icon1.svg'
+import icon2 from '@/assets/img/icon2.svg'
import { CustomBreadcrumb } from '@/components/GlobalComponent'
@@ -95,7 +96,7 @@ const SystemContentList = (props) => {
path: '/topnavbar00/business/basic',
icon:
{
}}
/>,
key: "/topnavbar00/business/basic",
- "label": "信息管理"
+ "label": "基础信息"
+ },
+ {
+ path: '/topnavbar00/business/planmanage',
+ icon:
,
+ key: "/topnavbar00/business/planmanage",
+ "label": "计划管理"
},
]
setMenuItems(fixedMenuItems)
diff --git a/src/pages/topnavbar/TopNavBar.js b/src/pages/topnavbar/TopNavBar.js
index 3b19822..f6fc3b2 100644
--- a/src/pages/topnavbar/TopNavBar.js
+++ b/src/pages/topnavbar/TopNavBar.js
@@ -9,9 +9,13 @@ import { userInfo } from '@/utils/globalCommon'
const menuItem = [
{
- label: '信息管理',
+ label: '基础信息',
key: '/topnavbar00/business/basic',
},
+ {
+ label: '计划管理',
+ key: '/topnavbar00/business/planmanage',
+ },
]
const TopNavBar = (props) => {