品类管理

This commit is contained in:
sunyu
2025-07-11 09:06:21 +08:00
parent 00e64e8d07
commit 76740bb992
3 changed files with 570 additions and 0 deletions

View File

@ -0,0 +1,233 @@
import React, { useState, useRef, useEffect } from 'react';
import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table';
import { Button, Select, Modal, Form, Input, message, Spin, TreeSelect } from 'antd';
import {getTreeList, addCategory, updateCategory, deleteCategory} from '../service';
import { useLocation } from 'umi';
const CategoryList: React.FC = () => {
const [form] = Form.useForm();
const [searchForm] = Form.useForm();
const [openModal, setOpenModal] = useState(false);
const [currentRecord, setCurrentRecord] = useState<any>(null);
const [treeData, setTreeData] = useState<any[]>([]);
const [loading, setLoading] = useState(true);
const [expandedKeys, setExpandedKeys] = useState<string[]>([]);
const actionRef = useRef<ActionType>();
const location = useLocation();
const versionId = location.state?.versionId;
interface DictType {
value: string;
label: string;
}
const version_status: DictType[] = [
{ value: 1, label: '启用' },
{ value: 0, label: '停用' },
];
useEffect(() => {
fetchData();
}, []);
const fetchData = async () => {
try {
setLoading(true);
const response = await getTreeList({ versionId });
setTreeData(response.data || []);
} catch (error) {
message.error('数据加载失败');
} finally {
setLoading(false);
}
};
const handleSearch = () => {
const values = searchForm.getFieldsValue();
// 实际应传递查询参数,此处简化
fetchData();
};
const handleReset = () => {
searchForm.resetFields();
fetchData();
};
const renderOperation = (_, record) => {
if (record.level === 1) return null; // 一级节点无操作
return (
<>
<Button type="text" onClick={() => handleEdit(record)}></Button>
<Button type="text" onClick={() => handleDelete(record.id)}></Button>
</>
);
};
const handleEdit = (record: any) => {
form.setFieldsValue({
id: record.id,
parentId: record.parentId,
categoryName: record.categoryName,
status: record.status,
code: record.code,
});
setCurrentRecord(record);
setOpenModal(true);
};
const handleAdd = () => {
form.resetFields();
setCurrentRecord(null);
setOpenModal(true);
};
const handleDelete = async (id: string) => {
Modal.confirm({
title: '确认删除?',
onOk: async () => {
await deleteCategory(id).then((r: any) => {
if (r?.code == 200) {
message.success('删除成功');
fetchData();
} else {
message.error('删除失败');
}
})
.finally(() => actionRef.current?.reload());
},
});
};
const handleSubmit = async () => {
try {
console.log("--------------");
console.log(versionId);
const values = await form.validateFields();
values.versionId = versionId;
console.log(values,"")
const isEdit = !!values.id;
const result = isEdit
? await updateCategory(values)
: await addCategory({ ...values });
if (result.code === 200) {
message.success(isEdit ? '编辑成功' : '新增成功');
setOpenModal(false);
fetchData();
}
} catch (error) {
console.log(error);
message.error('操作失败');
}
};
// 构建父节点树形数据(递归生成)
const buildParentTree = (data: any[]): any[] => {
return data.map(node => ({
value: node.id,
title: node.categoryName,
children: node.children && buildParentTree(node.children),
}));
};
return (
<Spin spinning={loading}>
{/* 查询区域:条件靠左,按钮靠右 */}
<div style={{ margin: 16, display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<Form form={searchForm} layout="inline">
<Form.Item name="categoryName" label="品类名称">
<Input placeholder="请输入品类名称" />
</Form.Item>
<Form.Item name="status" label="状态">
<Select placeholder="请选择状态">
<Option value="启用"></Option>
<Option value="停用"></Option>
</Select>
</Form.Item>
</Form>
<div>
<Button type="primary" onClick={handleSearch}></Button>
<Button onClick={handleReset} style={{ marginLeft: 8 }}></Button>
</div>
</div>
{/* 树表格 */}
<ProTable
actionRef={actionRef}
columns={[
{ title: '品类名称', dataIndex: 'categoryName', treeData: true },
{ title: '品类编码', dataIndex: 'code' },
{ title: '状态', dataIndex: 'status',
valueEnum: { '1': { text: '启用', status: '1' }, },
render: (_, record) => {
if (record.status === 1) {
return (<></>)
} else {
return (<></>)
}
}
},
{ title: '更新时间', dataIndex: 'updateDate', valueType: 'dateTime' },
{ title: '操作', valueType: 'option', render: renderOperation }
]}
treeData={true}
dataSource={treeData}
rowKey="id"
expandedRowKeys={expandedKeys}
onExpand={(expanded, record) => {
setExpandedKeys(prev =>
expanded ? [...prev, record.id] : prev.filter(key => key !== record.id)
);
}}
toolBarRender={() => (
<Button type="primary" onClick={handleAdd}></Button>
)}
pagination={false}
/>
{/* 新增/编辑模态框 */}
<Modal
title={currentRecord ? '编辑品类' : '新增品类'}
// open={openModal}
visible={openModal}
onOk={handleSubmit}
onCancel={() => setOpenModal(false)}
width={600}
>
<Form form={form} layout="vertical">
{/* 新增时显示父节点树形选择(支持搜索) */}
<Form.Item name="id" hidden>
</Form.Item>
<Form.Item name="parentId" hidden>
</Form.Item>
{!currentRecord && (
<Form.Item label="请选择上级" name="parentId" rules={[{ required: true }]}>
<TreeSelect
placeholder="请选择上级(支持搜索)"
treeData={buildParentTree(treeData)}
showSearch
treeDefaultExpandAll
style={{ width: '100%' }}
/>
</Form.Item>
)}
<Form.Item label="品类名称" name="categoryName" rules={[{ required: true }]}>
<Input />
</Form.Item>
<Form.Item label="品类编码" name="code" rules={[{ required: true }]}>
<Input placeholder="请输入编码" />
</Form.Item>
<Form.Item label="品类状态" name="status" rules={[{ required: true }]}>
<Select>
{version_status.map((item) => (
<Option key={item.value} value={item.value}>
{item.label}
</Option>
))}
</Select>
</Form.Item>
</Form>
</Modal>
</Spin>
);
};
export default CategoryList;

View File

@ -0,0 +1,238 @@
import React, {useRef, useState} from 'react';
import ProTable, {ActionType, ProColumns} from '@ant-design/pro-table';
import { getPage,getDataById,deleteVersion,addVersion,updateVersion } from './service';
import {Button, Form, Input, message, Modal, PageHeader, Select, Spin} from 'antd';
import { history } from 'umi';
import TextArea from "antd/lib/input/TextArea";
import {getDicData} from "@/utils/session";
const NoticeList: React.FC<{}> = () => {
const [title, setTitle] = useState<string>('');
const [open, setOpen] = useState<boolean>(false);
const [spin, spinSet] = useState<boolean>(false);
const actionRef = useRef<ActionType>();
const [form] = Form.useForm();
//获取字典
const getDict: any = getDicData();
//查询分页数据
const [pageData, pageDataSet] = useState<any>({
pageNo: 1,
pageSize: 10
});
const layout = {
labelCol: { span: 6 },
wrapperCol: { span: 13 },
};
const dictData = JSON.parse(getDict);
interface DictType {
value: string;
label: string;
}
const version_status: DictType[] = [
{ value: 1, label: '启用' },
{ value: 0, label: '停用' },
];
//委托列表
const columns: ProColumns<any>[] = [
{ title: '序号', valueType: 'index', width: 50, },
{ title: '名称', dataIndex: 'name',width: '10%' },//, ellipsis: true
{ title: '版本', dataIndex: 'version', width: '10%' },
{ title: '创建时间', dataIndex: 'createDate', width: '10%', valueType: 'dateTime', search: false },
{ title: '创建人', dataIndex: 'createBy', width: '10%' },
{ title: '最后修改时间', dataIndex: 'updateDate', width: '10%', valueType: 'dateTime', search: false },
{ title: '修改人', dataIndex: 'updateBy', width: '10%'},
{ title: '状态', dataIndex: 'status', width: '10%',
valueEnum: { '1': { text: '启用', status: '1' }, },
render: (_, record) => {
if (record.status === 1) {
return (<></>)
} else {
return (<></>)
}
}
},
{
title: '操作', width: '9%',
valueType: 'option',
render: (_, record) => [
<Button type='text' onClick={() => { handleUpdate(record) }}></Button>,
<Button type='text' onClick={() => { maintainCategory(record) }}></Button>,
<Button type='text' onClick={() => { handleDelete(record.id) }}></Button>
]
},
];
const handleSubmit = async () => {
console.log("提交按钮触发")
try {
const values = await form.validateFields();
if (values.id) {
await updateVersion(values).then((r: any) => {
if (r?.code == 200) {
message.success('修改成功');
} else {
message.error('修改失败');
}
});
} else {
await addVersion(values).then((r: any) => {
if (r?.code == 200) {
message.success('新增成功');
} else {
message.error('新增失败');
}
});
}
closeModal();
} catch (error) {
console.log("错误失败!")
console.error(error);
}
};
const checkSupModal = (
<Modal
title={title}
visible={open}
width="70%"
centered
destroyOnClose={true}
bodyStyle={{ maxHeight: window.innerHeight * 0.96 - 108, overflowY: 'auto', paddingTop: 0 }}
// footer={<Button onClick={() => setOpen(false)}>关闭</Button>}
onOk={handleSubmit}
onCancel={() => closeModal()}
>
<Form form={form} {...layout}>
<Form.Item label="主键id" name="id" hidden>
<Input />
</Form.Item>
<Form.Item label="名称" name="name" rules={[{ required: true }]} >
<Input />
</Form.Item>
<Form.Item label="版本" name="version" rules={[{ required: true }]}>
<Input />
</Form.Item>
<Form.Item label="状态" name="status" rules={[{ required: true }]}>
<Select>
{version_status.map((item) => (
<Option key={item.value} value={item.value}>
{item.label}
</Option>
))}
</Select>
</Form.Item>
<Form.Item label="备注" name="label" >
<TextArea />
</Form.Item>
</Form>
</Modal>
);
const handleUpdate = async (record: any) => {
form.resetFields();
const version = await getDataById(record.id);
console.log("version---------"+version)
form.setFieldsValue({
...version.data,
});
// console.log("version---------"+version)
setOpen(true);
setTitle('修改品类版本');
};
const maintainCategory = async (record: any) => {
const versionId = record.id;
// console.log(versionId,'versionId')
// 使用history.push跳转到新页面并传递id参数
history.push({
pathname: '/categoryMaintenance',
state: { versionId: versionId }
});
};
// 删除操作
const handleDelete = (id: string) => {
Modal.confirm({
title: '确认删除该品类版本?',
onOk: async () => {
await deleteVersion(id).then((r: any) => {
if (r?.code == 200) {
message.success('删除成功');
} else {
message.error('删除失败');
}
})
.finally(() => actionRef.current?.reload());
},
});
};
const handleAdd = async () => {
form.resetFields();
setOpen(true);
setTitle('创建品类版本');
};
const closeModal = async () => {
actionRef.current?.reload();
form.resetFields();
// setCheckedKeys([]);
setOpen(false);
};
return (
<Spin spinning={spin}>
<PageHeader title="创建品类版本" />
<div style={{ maxHeight: innerHeight - 130, height: innerHeight - 130 }} className='xsy-entrust bgCWhite'>
<ProTable<any>
actionRef={actionRef}//action触发后更新表格
columns={columns}//表格
options={false}
bordered={false}
className='tableSearch'
size='small'
search={{ labelWidth: 'auto', span: 6 }}
request={(params) =>
getPage({
...params,
basePageRequest: { pageNo: pageData.pageNo, pageSize: pageData.pageSize },
}).then((res) => {
const result = {
data: res.data.records,
total: res.data.total,
success: res.success,
pageSize: res.data.size,
current: res.data.current
}
return result;
})
}
toolBarRender={() => [
<Button onClick={() => { handleAdd() }} type="primary">
</Button>,
]
}
pagination={{
defaultPageSize: 10,
showSizeChanger: false,
onChange: (page, pageSize) => pageDataSet({ pageNo: page, pageSize: pageSize }),
onShowSizeChange: (current, size) => pageDataSet({ pageNo: current, pageSize: size }),
}}
onReset={() => { pageDataSet({ pageNo: 1, pageSize: 10 }) }}
/>
{checkSupModal}
</div>
{/* 查看 */}
</Spin >
);
}
export default NoticeList;

View File

@ -0,0 +1,99 @@
import request from "@/utils/request";
/**
* 查询数据并分页
* @param params
*/
export async function getPage(params: any) {
return request('/api/sys-manager-ebtp-project/v1/coscocategoryversion/getPage', {
method: 'post',
data: params,
});
}
/**
* 新增品类版本
* @param params
*/
export async function addVersion(params: any) {
return request('/api/sys-manager-ebtp-project/v1/coscocategoryversion', {
method: 'post',
data: params,
});
}
/**
* 修改品类版本
* @param params
*/
export async function updateVersion(params: any) {
return request('/api/sys-manager-ebtp-project/v1/coscocategoryversion/update', {
method: 'post',
data: params,
});
}
/**
* 根据id查询品类版本详情
* @param params
*/
export async function getDataById(id: any) {
return request(`/api/sys-manager-ebtp-project/v1/coscocategoryversion/${id}`, {
method: 'get',
});
}
/**
* 根据id删除品类版本详情
* @param params
*/
export async function deleteVersion(id: any) {
return request(`/api/sys-manager-ebtp-project/v1/coscocategoryversion/delete/${id}`, {
method: 'get',
});
}
/**
* 查询品类维护页面列表数据 树结构
* @param params
*/
export async function getTreeList(params: any) {
return request('/api/sys-manager-ebtp-project/v1/coscocategorymaintenance/getTreeList', {
method: 'post',
data: params,
});
}
/**
* 删除品类维护
* @param params
*/
export async function deleteCategory(id: any) {
return request(`/api/sys-manager-ebtp-project/v1/coscocategorymaintenance/delete/${id}`, {
method: 'get',
});
}
/**
* 新增品类维护
* @param params
*/
export async function addCategory(params: any) {
return request('/api/sys-manager-ebtp-project/v1/coscocategorymaintenance', {
method: 'post',
data: params,
});
}
/**
* 修改品类维护
* @param params
*/
export async function updateCategory(params: any) {
return request('/api/sys-manager-ebtp-project/v1/coscocategorymaintenance/update', {
method: 'post',
data: params,
});
}