计划管理-经营计划管理页面

main
jiangxucong 1 month ago
parent c7c5181dec
commit 63bd22df44

@ -29,6 +29,12 @@ export default [
path: '/topnavbar00/business/basic', path: '/topnavbar00/business/basic',
name: 'basic', name: 'basic',
component: './business_basic/basic', component: './business_basic/basic',
},
// 计划管理
{
path: '/topnavbar00/business/planmanage',
name: 'planmanage',
component: './business_planmanage/PlanManage',
} }
], ],
}, },

@ -0,0 +1,3 @@
<svg width="14" height="16" viewBox="0 0 14 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.625 15.7125H1.05C0.475 15.7125 0 15.2375 0 14.6625V3.1375C0 2.5625 0.475 2.0875 1.05 2.0875H1.575V3.6625C1.575 4.2375 2.05 4.7125 2.625 4.7125H11.0375C11.6125 4.7125 12.0875 4.2375 12.0875 3.6625V2.0875H12.6125C13.1875 2.0875 13.6625 2.5625 13.6625 3.1375V14.6625C13.675 15.2375 13.2 15.7125 12.625 15.7125ZM10.275 8.5875C9.9625 8.2875 9.4625 8.2875 9.15 8.5875L6.3375 11.2625L5.025 10.0125C4.7125 9.7125 4.2125 9.7125 3.9 10.0125C3.5875 10.3125 3.5875 10.7875 3.9 11.075L5.775 12.85C6.0875 13.15 6.5875 13.15 6.9 12.85L10.275 9.65C10.5875 9.3625 10.5875 8.8875 10.275 8.5875ZM9.4625 3.6625H4.2125C3.6375 3.6625 3.1625 3.1875 3.1625 2.6125V2.0875C5.2625 0.55 5.2875 0.525 5.8375 0H7.925C8.4375 0.4875 8.425 0.55 10.5125 2.0875V2.6125C10.5125 3.2 10.05 3.6625 9.4625 3.6625ZM6.8375 1.05C6.2625 1.05 5.7875 1.525 5.7875 2.1C5.7875 2.675 6.2625 3.15 6.8375 3.15C7.4125 3.15 7.8875 2.675 7.8875 2.1C7.8875 1.5125 7.4125 1.05 6.8375 1.05Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -98,8 +98,8 @@ const CustomerInfoManagement = () => {
barWidth: 26, barWidth: 26,
itemStyle: { itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#7FC8B6' }, { offset: 0, color: 'rgba(4, 95, 94, 0.6)' },
{ offset: 1, color: '#008F8E' }, { offset: 1, color: 'rgba(4, 95, 94, 0.5)' },
]), ]),
// barBorderRadius: [6, 6, 0, 0], // barBorderRadius: [6, 6, 0, 0],
shadowColor: 'rgba(0,0,0,0.08)', shadowColor: 'rgba(0,0,0,0.08)',

@ -92,9 +92,9 @@
.activityCard { .activityCard {
flex: 1; flex: 1;
background: #F3F9F8; background: #F3F9F8;
border-radius: 8px; border-radius: 4px;
padding: 16px; 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; border: 1px solid #76C2B5;
.chartHeader { .chartHeader {

@ -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 <BusinessPlanManagement />;
case 'productionPlan':
return <ProductionPlanManagement />;
case 'planApprovalProcess':
return <PlanApprovalProcess />;
default:
return <BusinessPlanManagement />;
}
};
return (
<div className={styles.container}>
<div className={styles.TopButton}>
<Button
className={`${styles.TopButtonItem} ${activeModule === "businessPlan" ? styles.active : ""}`}
onClick={() => handleModuleClick("businessPlan")}
>经营计划管理
</Button>
<Button
className={`${styles.TopButtonItem} ${activeModule === "productionPlan" ? styles.active : ""}`}
onClick={() => handleModuleClick("productionPlan")}
>生产计划管理
</Button>
<Button
className={`${styles.TopButtonItem} ${activeModule === "planApprovalProcess" ? styles.active : ""}`}
onClick={() => handleModuleClick("planApprovalProcess")}
>计划审批流程
</Button>
</div>
<div className={styles.content}>
{renderModule()}
</div>
</div>
);
};
export default PlanManage;

@ -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; // ======== 无内边距 ========
}
}

@ -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) => (
<span className={`${styles.tag} ${val === '高价值' ? styles.tagGold : styles.tagBlue}`}>{val}</span>
)
},
{
title: '交易额度(月)', dataIndex: 'monthlyAmount', key: 'monthlyAmount', width: 150,
render: (v) => `¥${Number(v).toLocaleString()}`
},
{
title: '合作状态', dataIndex: 'cooperationStatus', key: 'cooperationStatus', width: 110,
render: (val) => (
<span className={`${styles.tag} ${val === '合作中' ? styles.tagGreen : styles.tagOrange}`}>{val}</span>
)
},
{
title: '满意度', dataIndex: 'satisfaction', key: 'satisfaction', width: 120,
},
{
title: '操作', key: 'action', fixed: 'right', width: 200,
render: (_, row) => (
<Space size={12}>
<Button type="link" size="small" className="viewDetailBtn" onClick={() => {
setPrevScrollY(window.pageYOffset || document.documentElement.scrollTop || 0);
setDetailData(row);
setShowDetail(true);
}}>查看详情</Button>
<Button type="link" size="small" className="editBtn">修改</Button>
<Button type="link" size="small" danger className="deleteBtn">删除</Button>
</Space>
)
},
];
}, []);
// 处理选择
const handleSelectRow = (id) => {
if (selectedRows.includes(id)) {
setSelectedRows(selectedRows.filter(rowId => rowId !== id));
} else {
setSelectedRows([...selectedRows, id]);
}
};
return (
<div className={styles.container}>
<div className={styles.mainCard}>
{/* KPI卡片区域 */}
<div className={styles.kpiGrid}>
<div className={styles.kpiCard}>
<div className={styles.kpiText}>
<div className={styles.kpiValue}>{kpiData.totalCustomers}</div>
<div className={styles.kpiTitle}>总客户数</div>
</div>
<img src={topIcon} alt="icon" className={styles.kpiIconImg} />
</div>
<div className={styles.kpiCard}>
<div className={styles.kpiText}>
<div className={styles.kpiValue}>{kpiData.highValueCustomers}</div>
<div className={styles.kpiTitle}>高价值客户</div>
</div>
<img src={topIcon2} alt="icon" className={styles.kpiIconImg} />
</div>
<div className={styles.kpiCard}>
<div className={styles.kpiText}>
<div className={styles.kpiValue}>{kpiData.inCooperation}</div>
<div className={styles.kpiTitle}>合作中</div>
</div>
<img src={topIcon3} alt="icon" className={styles.kpiIconImg} />
</div>
<div className={styles.kpiCard}>
<div className={styles.kpiText}>
<div className={styles.kpiValue}>{kpiData.newThisMonth}</div>
<div className={styles.kpiTitle}>本月新增</div>
</div>
<img src={topIcon4} alt="icon" className={styles.kpiIconImg} />
</div>
</div>
{/* 客户列表区域 */}
<div className={styles.bottomSection}>
<div className={styles.sectionHeader}>
<span className={styles.sectionBar} />
<span className={styles.sectionTitle}>客户列表</span>
</div>
<div className={styles.filterContent}>
<div className={styles.filterItem}>
<Input.Search
placeholder="搜索关键词"
allowClear
value={searchKeyword}
onChange={(e) => setSearchKeyword(e.target.value)}
onSearch={(val) => setSearchKeyword(val)}
style={{ minWidth: 150 }}
/>
</div>
<div className={styles.filterItem}>
<span className={styles.filterLabel}>客户类型:</span>
<Select
value={filters.customerType}
onChange={(v) => setFilters({ ...filters, customerType: v })}
placeholder="全部"
options={[
{ label: '全部', value: '' },
]}
allowClear
/>
</div>
<div className={styles.filterItem}>
<span className={styles.filterLabel}>客户等级:</span>
<Select
value={filters.customerGrade}
onChange={(v) => setFilters({ ...filters, customerGrade: v })}
placeholder="全部"
options={[
{ label: '全部', value: '' },
]}
allowClear
/>
</div>
<div className={styles.filterItem}>
<span className={styles.filterLabel}>合作状态:</span>
<Select
value={filters.cooperationStatus}
onChange={(v) => setFilters({ ...filters, cooperationStatus: v })}
placeholder="全部"
options={[
{ label: '全部', value: '' },
]}
allowClear
/>
</div>
<Space className={styles.filterButtons}>
<Button
type="primary"
icon={<SearchOutlined />}
className={styles.queryBtn}
>
查询
</Button>
<Button
icon={<ReloadOutlined />}
className={styles.resetBtn}
>
重置
</Button>
</Space>
<Space className={styles.filterButtonsRight}>
<Button
type="primary"
icon={<PlusOutlined />}
className={styles.addBtn}
>
新增客户
</Button>
<Button
// icon={<ExportOutlined />}
className={styles.exportBtn}
>
批量导出
</Button>
</Space>
</div>
<div className={styles.tableWrapper}>
<StandardTable
rowKey="id"
columns={columns}
data={{
list: tableData,
pagination: {
total: tableData.length,
pageSize,
current: currentPage,
showTotal: (total) => `${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); }}
/>
</div>
</div>
</div>
</div>
);
};
export default BusinessPlanManagement;

@ -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;
// }
// }
}
}
}
}

@ -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,
};
},
},
};

@ -21,6 +21,7 @@ import license from '@/assets/img/license.svg'
import people from '@/assets/img/people.svg' import people from '@/assets/img/people.svg'
import risk from '@/assets/img/risk.svg' import risk from '@/assets/img/risk.svg'
import icon1 from '@/assets/img/icon1.svg' import icon1 from '@/assets/img/icon1.svg'
import icon2 from '@/assets/img/icon2.svg'
import { CustomBreadcrumb } from '@/components/GlobalComponent' import { CustomBreadcrumb } from '@/components/GlobalComponent'
@ -95,7 +96,7 @@ const SystemContentList = (props) => {
path: '/topnavbar00/business/basic', path: '/topnavbar00/business/basic',
icon: <img icon: <img
src={icon1} src={icon1}
alt="信息管理" alt="基础信息"
style={{ style={{
width: '16px', width: '16px',
height: '16px', height: '16px',
@ -103,7 +104,21 @@ const SystemContentList = (props) => {
}} }}
/>, />,
key: "/topnavbar00/business/basic", key: "/topnavbar00/business/basic",
"label": "信息管理" "label": "基础信息"
},
{
path: '/topnavbar00/business/planmanage',
icon: <img
src={icon2}
alt="计划管理"
style={{
width: '16px',
height: '16px',
opacity: selectedKey.includes('/topnavbar00/business/planmanage') ? 1 : 0.6
}}
/>,
key: "/topnavbar00/business/planmanage",
"label": "计划管理"
}, },
] ]
setMenuItems(fixedMenuItems) setMenuItems(fixedMenuItems)

@ -9,9 +9,13 @@ import { userInfo } from '@/utils/globalCommon'
const menuItem = [ const menuItem = [
{ {
label: '信息管理', label: '基础信息',
key: '/topnavbar00/business/basic', key: '/topnavbar00/business/basic',
}, },
{
label: '计划管理',
key: '/topnavbar00/business/planmanage',
},
] ]
const TopNavBar = (props) => { const TopNavBar = (props) => {

Loading…
Cancel
Save