提交 89bb7a79 作者: 龚洪江

联调:行业方案,品牌,产品管理联调

上级 185fd540
...@@ -7,7 +7,7 @@ VITE_REQUEST_BASE_URL='/api' ...@@ -7,7 +7,7 @@ VITE_REQUEST_BASE_URL='/api'
#VITE_REQUEST_BASE_URL='https://test.iuav.mmcuav.cn' #VITE_REQUEST_BASE_URL='https://test.iuav.mmcuav.cn'
#本地测试 #本地测试
#VITE_REQUEST_BASE_URL='http://192.168.3.22:10001' #VITE_REQUEST_BASE_URL='http://192.168.3.22:10001'
#VITE_REQUEST_BASE_URL='http://192.168.3.22:8099' #VITE_REQUEST_BASE_URL='http://192.168.3.17:8099'
#VITE_REQUEST_BASE_URL='http://192.168.3.23:35150' #VITE_REQUEST_BASE_URL='http://192.168.3.23:35150'
#版本 #版本
NODE_ENV='development' NODE_ENV='development'
......
// 分页通用接口 // 分页通用接口
export interface PaginationProps { export interface PaginationProps {
pageSize?: number; pageSize: number;
pageNo?: number; pageNo: number;
} }
// 通用返回接口(分页) // 通用返回接口(分页)
......
// 分类详情 // 分类详情
import { InterFunction, InterItemFunction } from '~/api/interface';
export interface GoodsInfo { export interface GoodsInfo {
goodsId: number; goodsId: number;
goodsImg: string; goodsImg: string;
...@@ -26,3 +28,27 @@ export interface categoryDec { ...@@ -26,3 +28,27 @@ export interface categoryDec {
id: number; id: number;
sortName: string; sortName: string;
} }
//分类列表类型
type categoryReposeType = {
id: number;
classifyName: string;
icon: string;
createTime: string;
children: categoryReposeType[];
directoryId: number;
remark: string;
};
export type categoryListType = InterItemFunction<
{ directoryId?: number; type?: number },
categoryReposeType[]
>;
//目录列表类型-不分页
export type directoryListType = InterFunction<
{ type: number },
{
id: number;
directoryName: string;
type: number;
}[]
>;
// 行业方案-列表
import { InterFunction, InterItemFunction } from '~/api/interface';
//行业方案-列表
export type listIndustryType = InterItemFunction<
{ categoryId?: number; solutionName?: string },
{
categoryId: number;
categoryName: string;
createTime: string;
description: string;
id: number;
solutionName: string;
}[]
>;
//行业方案-新增
export type industryAddType = InterFunction<
{ categoryId: number; description: string; solutionName: string },
null
>;
//行业方案-编辑
export type industryEditType = InterFunction<
{ categoryId: number; description: string; solutionName: string; id?: number },
null
>;
//行业方案-删除
export type industryDeleteType = InterFunction<{ id: number }, null>;
//行业方案-详情
export type industryDetailType = InterFunction<
{ id: number },
{
categoryId: number;
description: string;
solutionName: string;
categoryName: string;
id: number;
}
>;
//行业方案-方案规格列表
export type industrySpecList = InterItemFunction<{ productSkuId: number }, any>;
//行业方案-方案规格-新增
export type industrySpecAdd = InterFunction<
{
industrySkuId: number;
specImage: string;
specName: string;
productInventoryList: {
productSku: {
id: number;
productName: string;
productBrandId: number;
productBrand: string;
model: string;
goodsTypeId: number;
directoryId: number;
directoryName: string;
};
productSpecList: {
id: number;
partNo: string;
specImage: string;
specName: string;
versionDesc: string;
productSkuId: number;
}[];
select: number;
}[];
},
null
>;
//行业方案-方案规格-删除
export type removeIndustrySpecType = InterFunction<{ id: number }, any>;
//行业方案-方案规格-详情
export type industrySpecDetailType = InterFunction<
{ industrySpecId: number },
{
id: number;
industrySkuId: number;
specImage: string;
specName: string;
productInventoryList: {
productSku: {
id: number;
productName: string;
productBrandId: number;
productBrand: string;
model: string;
goodsTypeId: number;
directoryId: number;
categoryName: string;
};
productSkuId: number;
productSpecList: {
id: number;
partNo: string;
specImage: string;
specName: string;
versionDesc: string;
productSkuId: number;
}[];
select: number;
}[];
}
>;
//行业-方案规格-编辑
export type editIndustrySpecType = InterFunction<
{
id: number;
industrySkuId: number;
specImage: string;
specName: string;
productInventoryList: {
productSku: {
id: number;
productName: string;
productBrandId: number;
productBrand: string;
model: string;
goodsTypeId: number;
directoryId: number;
directoryName: string;
};
productSpecList: {
id: number;
partNo: string;
specImage: string;
specName: string;
versionDesc: string;
productSkuId: number;
}[];
select: number;
}[];
},
null
>;
...@@ -8,3 +8,38 @@ export type MakeListType = InterItemFunction< ...@@ -8,3 +8,38 @@ export type MakeListType = InterItemFunction<
id: number; id: number;
}[] }[]
>; >;
//产品-列表
export type productListType = InterItemFunction<
{ categoryId?: number; directoryId?: number; productName?: string },
{
id: number;
productName: string;
productBrandId: number;
productBrand: string;
model: string;
categoriesId: number;
categoryName: string;
directoryId: number;
directoryName: string;
productSpecList: {
id: number;
partNo: string;
specImage: string;
specName: string;
versionDesc: string;
productSkuId: number;
}[];
}[]
>;
//产品-规格-列表
export type ProductSpecListType = InterItemFunction<
{ productSkuId: number },
{
id: number;
partNo: string;
specImage: string;
specName: string;
versionDesc: string;
productSkuId: number;
}[]
>;
import axios from '../request'; import axios from '../request';
import { PaginationEntity } from '~/common/interface/PaginationEntity'; import { PaginationEntity } from '~/common/interface/PaginationEntity';
import { categoryListType, directoryListType } from '~/api/interface/categoryManage';
export class CategoryManageAPI { export class CategoryManageAPI {
// 分类管理
// 分类目录 // 分类目录
static directoryList = () => { static getDirectoryList: directoryListType = (params) => {
return axios.get('uavgoods/directory/directoryList'); return axios.get('/pms/classify/getDirectoryList', { params });
}; };
// 新增或编辑目录 // 新增或编辑目录
...@@ -24,8 +24,8 @@ export class CategoryManageAPI { ...@@ -24,8 +24,8 @@ export class CategoryManageAPI {
}; };
// 分类列表 // 分类列表
static getListGoodsTypeList = (type: number): any => { static getCategoryList: categoryListType = (data) => {
return axios.get(`uavgoods/mgoods/getGoodsTypeInfoList/${type}`); return axios.post('/pms/classify/getClassificationList', data);
}; };
// PC端-根据分类信息新增自定义规格-下拉选项 (只查产品类型) // PC端-根据分类信息新增自定义规格-下拉选项 (只查产品类型)
......
import axios from '../request'; import axios from '../request';
import {
industryAddType,
industryDeleteType,
industryDetailType,
industryEditType,
industrySpecAdd,
industrySpecDetailType,
industrySpecList,
listIndustryType,
removeIndustrySpecType,
editIndustrySpecType,
} from '~/api/interface/industryManageType';
export class IndustryManageAPI { export class IndustryManageAPI {
// 行业列表 // 行业列表
static getFirstIndustryTypeInfo = (params: unknown) => { static getIndustryList: listIndustryType = (data) => {
return axios.get('uavgoods/appgoods/getFirstGoodsTypeInfo/2', { params }); return axios.post('/pms/industry/spec/listPageIndustrySku', data);
}; };
// 行业sku管理-方案规格管理-分页列表 // 行业-新增
static listPageIndustrySpec = (params: unknown) => { static addIndustryRequest: industryAddType = (data) => {
return axios.get('uavgoods/industry/spec/listPageIndustrySpec', { return axios.post('/pms/industry/spec/addIndustrySku', data);
params,
});
};
// 行业sku管理---分页列表
static listPageIndustrySku = (data: unknown) => {
return axios.post('uavgoods/industry/spec/listPageIndustrySku', data);
}; };
// 行业sku管理---新增行业sku // 行业---编辑
static addIndustrySku = (data: unknown) => { static editIndustryRequest: industryEditType = (data) => {
return axios.post('uavgoods/industry/spec/addIndustrySku', data); return axios.post('/pms/industry/spec/editIndustrySku', data);
}; };
// 行业sku管理---编辑行业sku // 行业--删除
static editIndustrySku = (data: unknown) => { static removeIndustryRequest: industryDeleteType = (params) => {
return axios.post('uavgoods/industry/spec/editIndustrySku', data); return axios.get('/pms/industry/spec/removeIndustrySku', { params });
}; };
// 行业sku管理---删除行业sku // 行业-详情
static removeIndustrySku = (params: unknown) => { static getIndustryDetail: industryDetailType = (params) => {
return axios.get('uavgoods/industry/spec/removeIndustrySku', { params }); return axios.get('/pms/industry/spec/getIndustrySkuDetail', {
params,
});
}; };
// 行业-方案规格-列表
// 行业sku管理-详情-基本信息 static getIndustrySpecList: industrySpecList = (params) => {
static getIndustrySkuDetail = (params: unknown) => { return axios.get('/pms/industry/spec/listPageIndustrySpec', {
return axios.get('uavgoods/industry/spec/getIndustrySkuDetail', {
params, params,
}); });
}; };
// 行业---方案规格管理---新增方案规格
// 行业sku管理---方案规格管理---新增方案规格 static addIndustrySpec: industrySpecAdd = (data) => {
static addIndustrySpec = (data: unknown) => { return axios.post('/pms/industry/spec/addIndustrySpec', data);
return axios.post('uavgoods/industry/spec/addIndustrySpec', data);
}; };
// 行业sku管理---方案规格管理---编辑行业规格 // 行业sku管理---方案规格管理---编辑行业规格
static editIndustrySpec = (data: unknown) => { static editIndustrySpec: editIndustrySpecType = (data) => {
return axios.post('uavgoods/industry/spec/editIndustrySpec', data); return axios.post('/pms/industry/spec/editIndustrySpec', data);
}; };
// 行业sku管理---方案规格管理---删除行业规格 // 行业---方案规格管理---删除行业规格
static removeIndustrySpec = (params: unknown) => { static removeIndustrySpec: removeIndustrySpecType = (params) => {
return axios.get('uavgoods/industry/spec/removeIndustrySpec', { params }); return axios.get('/pms/industry/spec/removeIndustrySpec', { params });
}; };
// 行业sku管理---方案规格管理---获取价格配置信息 (获取价格配置) // 行业sku管理---方案规格管理---获取价格配置信息 (获取价格配置)
...@@ -69,8 +74,8 @@ export class IndustryManageAPI { ...@@ -69,8 +74,8 @@ export class IndustryManageAPI {
}; };
// 行业sku管理---方案规格管理---单个方案规格回显 (查看产品清单) // 行业sku管理---方案规格管理---单个方案规格回显 (查看产品清单)
static getIndustrySpecDetail = (params: unknown) => { static getIndustrySpecDetail: industrySpecDetailType = (params) => {
return axios.get('uavgoods/industry/spec/getIndustrySpecDetail', { return axios.get('/pms/industry/spec/getIndustrySpecDetail', {
params, params,
}); });
}; };
......
import axios from '../request'; import axios from '../request';
import { MakeListType } from '~/api/interface/produceManageType'; import {
MakeListType,
productListType,
ProductSpecListType,
} from '~/api/interface/produceManageType';
export class ProduceManageAPI { export class ProduceManageAPI {
// 产品sku管理-分页列表 // 产品管理-分页列表
static listPageProductSku = (data: unknown) => { static listPageProductSku: productListType = (data) => {
return axios.post('uavgoods/product/spec/listPageProductSku', data); return axios.post('/pms/product/spec/listPageProductSku', data);
}; };
// 产品sku管理-删除产品sku // 产品sku管理-删除产品sku
static removeProductSku = (params: unknown) => { static removeProductSku = (params: unknown) => {
...@@ -41,7 +45,7 @@ export class ProduceManageAPI { ...@@ -41,7 +45,7 @@ export class ProduceManageAPI {
}; };
// 产品sku管理-产品规格管理-分页列表 // 产品sku管理-产品规格管理-分页列表
static listPageProductSpec = (params: unknown) => { static listPageProductSpec: ProductSpecListType = (params) => {
return axios.get('uavgoods/product/spec/listPageProductSpec', { params }); return axios.get('/pms/product/spec/listPageProductSpec', { params });
}; };
} }
/*
* @Author: 龚洪江
* @Date: 2022-07-26 11:43:44
* @LastEditors: 龚洪江
* @LastEditTime: 2022-07-26 11:45:29
* @FilePath: \code\mmc-store\src\common\PaginationEntity\index.ts
* @Description:
*
* Copyright (c) 2022 by 龚洪江 2238959530@qq.com, All Rights Reserved.
*/
export interface PaginationEntity { export interface PaginationEntity {
pageNo: number; pageNo: number;
pageSize: number; pageSize: number;
......
...@@ -112,7 +112,7 @@ export const Uploader: React.FC<PropsType> = (props) => { ...@@ -112,7 +112,7 @@ export const Uploader: React.FC<PropsType> = (props) => {
if (defaultFileList?.length) { if (defaultFileList?.length) {
setFileList(defaultFileList); setFileList(defaultFileList);
} }
}, []); }, [defaultFileList]);
return ( return (
<div className='uploader-view'> <div className='uploader-view'>
{listType === 'text' ? ( {listType === 'text' ? (
......
import React, { FC, useEffect, useState } from 'react';
import { Form, Input, Modal, message, Table, Button, ModalProps } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { InterDataType, PaginationProps } from '~/api/interface';
import { Uploader } from '~/components/uploader';
import { UploadOutlined } from '@ant-design/icons';
import { productListType } from '~/api/interface/produceManageType';
import { IndustryManageAPI } from '~/api';
import { filterObjAttr } from '~/utils';
import { industrySpecDetailType } from '~/api/interface/industryManageType';
//自定义产品返回类型
type selfProduceItemType = InterDataType<productListType>['list'][0] & {
radio?: number;
};
//方案规格详情返回类型
type specDetailType = InterDataType<industrySpecDetailType>;
interface PropsType {
produceSpecList: selfProduceItemType[];
close: () => void;
connectSpecModalShow: () => void;
industrySkuId: number;
handleSuccess: () => void;
specDetail: specDetailType;
}
const AddOrEditSpecModal: FC<ModalProps & PropsType> = ({
open,
produceSpecList,
close,
connectSpecModalShow,
industrySkuId,
specDetail,
handleSuccess,
}) => {
// 表格事件
const [form] = Form.useForm<{ specName: string; specImage: string; list: any }>();
//图片
const [fileList, setFileList] = useState<
{
id: number;
name: string;
uid: number;
url: string;
}[]
>([]);
// 表格结构
const columns: ColumnsType<selfProduceItemType> = [
{
title: '序号',
align: 'center',
render: (text: string, record: selfProduceItemType, index: number) => {
return (pagination.pageNo - 1) * pagination.pageSize + index + 1;
},
},
{ title: '产品名称', dataIndex: 'productName', align: 'center' },
{ title: '产品类型', dataIndex: 'categoryName', align: 'center' },
{ title: '型号', dataIndex: 'model', align: 'center' },
{ title: '产品品牌', dataIndex: 'productBrand', align: 'center' },
{
title: '产品规格',
// align: "left",
width: 300,
ellipsis: true,
render: (record: selfProduceItemType) => {
if (record.radio === 0) {
return '不指定';
}
return record.productSpecList.map((i: any, index: number) => (
<div key={index}>
{i.specName}({i.partNo})
</div>
));
},
onHeaderCell: () => {
return {
style: {
textAlign: 'center',
},
};
},
},
];
// 分页
const [pagination, setPagination] = useState<PaginationProps>({
pageNo: 1,
pageSize: 10,
});
// 关闭弹窗
const handleClosed = async () => {
setFileList([]);
form.resetFields();
close();
};
// 打开关联产品弹窗
const handleConnectSpecModalShow = () => {
connectSpecModalShow();
};
//图片上传成功
const uploadFileSuccess = (
fileList: {
id: number;
name: string;
uid: number;
url: string;
}[],
) => {
form.setFieldsValue({
specImage: fileList[0].url,
});
};
// 触发表单验证
const handleSubmit = () => {
form
.validateFields()
.then((values) => {
const productInventoryList: any = produceSpecList.map((v) => ({
productSku: {
id: v.id,
directoryId: v.directoryId,
goodsTypeId: v.categoriesId,
model: v.model,
productBrand: v.productBrand,
productBrandId: v.productBrandId,
productName: v.productName,
},
select: v.radio,
productSpecList: v.productSpecList,
}));
IndustryManageAPI[specDetail.id ? 'editIndustrySpec' : 'addIndustrySpec']({
...filterObjAttr(values, ['list']),
productInventoryList,
industrySkuId,
id: specDetail.id ? specDetail.id : undefined,
}).then(({ code }) => {
if (code === '200') {
message.success(specDetail.id ? '编辑成功' : '新增成功');
form.resetFields();
handleSuccess();
}
});
})
.catch((err) => {
message.warning(err.errorFields[0].errors[0]).then();
});
};
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
setPagination({ ...pagination });
};
// componentsDidMounted
useEffect(() => {
form.setFieldsValue({
list: produceSpecList.length !== 0 ? produceSpecList : undefined,
});
}, [produceSpecList]);
useEffect(() => {
form.setFieldsValue({
specName: specDetail.specName || undefined,
specImage: specDetail.specImage || undefined,
});
if (specDetail.specImage) {
setFileList([
{
id: Math.random(),
name: 'img',
uid: Math.random(),
url: specDetail.specImage,
},
]);
} else {
setFileList([]);
}
}, [specDetail]);
return (
<>
<Modal
open={open}
title='新增'
onCancel={handleClosed}
onOk={handleSubmit}
destroyOnClose
width={800}
>
<Form name='form' form={form} layout='horizontal'>
<Form.Item
name='specName'
label='规格名称'
rules={[{ required: true, message: '请输入方案产品名称' }]}
>
<Input
placeholder='请输入规格名称'
allowClear
style={{ width: '400px' }}
maxLength={30}
/>
</Form.Item>
<Form.Item
name='specImage'
label='规格图片'
rules={[{ required: true, message: '请上传规格图片' }]}
>
<Uploader
listType='picture-card'
fileUpload
onChange={uploadFileSuccess}
defaultFileList={fileList}
>
<UploadOutlined />
</Uploader>
</Form.Item>
<Form.Item
label='产品清单'
name='list'
rules={[{ required: true, message: '请选择产品清单' }]}
>
<Button type='primary' onClick={handleConnectSpecModalShow}>
添加关联
</Button>
</Form.Item>
<Form.Item>
<Table
size='small'
dataSource={produceSpecList}
columns={columns}
rowKey='id'
style={{ width: '100%' }}
pagination={{
pageSize: pagination.pageSize,
current: pagination.pageNo,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
}}
bordered
/>
</Form.Item>
</Form>
</Modal>
</>
);
};
export default AddOrEditSpecModal;
import React, { FC, useEffect, useState } from 'react';
import { Button, Form, Input, message, Modal, ModalProps, Radio, Select, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { CategoryManageAPI, ProduceManageAPI } from '~/api';
import { InterDataType, PaginationProps } from '~/api/interface';
import { productListType } from '~/api/interface/produceManageType';
import { categoryListType } from '~/api/interface/categoryManage';
//自定义产品返回类型
type selfProduceItemType = InterDataType<productListType>['list'][0] & {
radio?: number;
};
//分类通用类型
type categoryResponseType = InterDataType<categoryListType>['list'];
const { Option } = Select;
interface PropsType {
close: () => void;
data: selfProduceItemType[]; //已被关联产品
connectProduceSubmit: (data: selfProduceItemType[]) => void;
toDesignateSpec: (id: number) => void;
}
// 表单提交
interface FormType {
keyword?: string;
userType?: number;
roleId?: number;
accountStatus?: number;
}
// 当前选择的参数
const ConnectProduceModal: FC<ModalProps & PropsType> = ({
open,
close,
connectProduceSubmit,
data,
toDesignateSpec,
}) => {
// 表格数据
const [tableData, setTableData] = useState<selfProduceItemType[]>([]);
// 所有表格数据
const [allTableData, setAllTableData] = useState<selfProduceItemType[]>([]);
// 产品类型列表
const [productTypeList, setProductTypeList] = useState<categoryResponseType>([]);
// 表格结构
const columns: ColumnsType<selfProduceItemType> = [
{ title: '产品名称', dataIndex: 'productName', align: 'center' },
{
title: '产品类型',
dataIndex: 'categoryName',
align: 'center',
width: '100px',
},
{ title: '型号', dataIndex: 'model', align: 'center' },
{ title: '产品品牌', dataIndex: 'productBrand', align: 'center' },
{
title: '产品规格',
align: 'center',
width: '250px',
render: (record) => {
return (
<div>
<Radio.Group
onChange={(e) => {
const { value } = e.target;
// 通过index生成新tableData
const list = tableData.map((i) => {
if (i.id === record.id) {
return {
...i,
radio: value,
};
}
return i;
});
setTableData(list);
const allList = allTableData.map((i) => {
if (i.id === record.id) {
return {
...i,
radio: value,
};
}
return i;
});
setAllTableData(allList);
}}
value={record.radio}
disabled={getTableDisable(record.id)}
>
<Radio value={0}>不指定</Radio>
<Radio value={1}>指定</Radio>
</Radio.Group>
<Button
disabled={getTableDisable(record.id) || record.radio === 0}
onClick={() => toDesignateSpecClick(record.id)}
type='link'
>
去指定
</Button>
</div>
);
},
},
];
// 表格分页配置
const [pagination, setPagination] = useState<
PaginationProps & { totalCount: number; totalPage: number }
>({
totalCount: 0,
pageSize: 10,
pageNo: 1,
totalPage: 0,
});
// 表格多选
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
// 表格多选事件
const onSelectChange = (newSelectedRowKeys: React.Key[], selectedRows: selfProduceItemType[]) => {
// 新增
const isAdd: boolean = newSelectedRowKeys.some((v: React.Key) => !selectedRowKeys.includes(v));
// 删除
const isDelete: boolean = selectedRowKeys.some(
(v: React.Key) => !newSelectedRowKeys.includes(v),
);
let rowKeys: React.Key[] = [];
if (isAdd) {
const filterList: selfProduceItemType[] = selectedRows.filter(
(v: selfProduceItemType) => !selectedRowKeys.includes(v.id),
);
const obj: selfProduceItemType | undefined = filterList.find(
(v: selfProduceItemType) => !v.productSpecList,
);
const currentKeys: React.Key[] = filterList
.filter((v: selfProduceItemType) => v.productSpecList)
.map((v: selfProduceItemType) => v.id);
rowKeys = [...selectedRowKeys, ...currentKeys];
if (obj) {
message.warning(`请先为产品${obj?.productName}添加规格`);
}
} else if (isDelete) {
rowKeys = selectedRowKeys.filter((v: React.Key) => {
const bol: boolean = tableData.every((i: selfProduceItemType) => i.id !== v);
return bol || newSelectedRowKeys.includes(v);
});
}
setSelectedRowKeys(rowKeys);
};
// 根据id判断是否有操作的权限
const getTableDisable = (id: number) => {
return !selectedRowKeys.includes(id);
};
//获取产品列表
const getListPageProductSku = (value?: any, tip?: string) => {
ProduceManageAPI.listPageProductSku({
pageNo: pagination.pageNo,
pageSize: pagination.pageSize,
...value,
}).then(({ result: { list, totalPage, totalCount } }) => {
pagination.totalCount = totalCount;
pagination.totalPage = totalPage;
setPagination(pagination);
// 设置产品规格默认项
if (!list) {
return setTableData([]);
}
const arr = list.map((i) => {
return {
...i,
radio: 0,
};
});
const brr = arr.map((i) => {
const item = data.find((j) => j.id === i.id);
if (item?.id === i.id) {
return {
...i,
radio: item.radio,
};
}
return i;
});
setTableData(brr);
if (tip === 'all') {
setAllTableData(brr);
}
});
};
// 翻页
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
getListPageProductSku();
};
// 表单提交
const onFinish = (val: FormType) => {
// 在这里对提交的数据做处理,如range转为开始和结束时间
const data = Object.fromEntries(
// 过滤为空项
Object.entries({
...val,
}).filter((i) => i[1] !== '' && i[1] !== undefined && i[1] !== null),
);
getListPageProductSku(data);
};
// 获取产品类型
const getProduceTypeList = () => {
CategoryManageAPI.getCategoryList({ directoryId: 1, type: 4, pageNo: 1, pageSize: 99999 }).then(
({ result }) => {
setProductTypeList(result.list || []);
},
);
};
// 关联产品的数据提交
const handleSubmit = () => {
if (selectedRowKeys.length === 0) {
return message.warning('请选择关联产品');
}
const connectProduceList = allTableData.filter((i) => selectedRowKeys.includes(i.id));
connectProduceSubmit(connectProduceList);
};
// componentsDidMounted
useEffect(() => {
getListPageProductSku();
getListPageProductSku({ pageNo: 1, pageSize: 99999 }, 'all');
getProduceTypeList();
if (data.length !== 0) {
setSelectedRowKeys(data.map((v) => v.id));
}
}, [data]);
//去指定
const toDesignateSpecClick = (id: number) => {
toDesignateSpec(id);
};
return (
<>
<Modal
open={open}
title='关联产品'
onCancel={() => close()}
onOk={handleSubmit}
destroyOnClose
width={860}
>
<Form name='basic' layout='inline' onFinish={onFinish} style={{ marginBottom: '20px' }}>
<Form.Item name='productName' label='产品名称'>
<Input placeholder='请输入产品名称' allowClear />
</Form.Item>
<Form.Item name='goodsTypeId' label='产品类型'>
<Select placeholder='请选择产品类型' allowClear>
{productTypeList.map((i, j) => (
<Option value={i.id} key={j}>
{i.classifyName}
</Option>
))}
</Select>
</Form.Item>
<Form.Item>
<Button type='primary' htmlType='submit'>
搜索
</Button>
</Form.Item>
</Form>
<Table
size='small'
dataSource={tableData}
columns={columns}
rowKey='id'
scroll={{ x: '100%' }}
bordered
rowSelection={{
selectedRowKeys,
onChange: onSelectChange,
}}
pagination={{
total: pagination.totalCount,
pageSize: pagination.pageSize,
current: pagination.pageNo,
showSizeChanger: true,
showQuickJumper: true,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / ${total} 条数据`,
}}
/>
</Modal>
</>
);
};
export default ConnectProduceModal;
import React, { FC, useEffect, useState } from 'react';
import { Image, message, Modal, ModalProps, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { ProduceManageAPI } from '~/api';
import { InterDataType, PaginationProps } from '~/api/interface';
import { ProductSpecListType } from '~/api/interface/produceManageType';
//产品sku返回类型
type produceSpecType = InterDataType<ProductSpecListType>['list'];
interface PropsType {
data: produceSpecType;
produceSpecSelectEvent: (data: produceSpecType) => void;
productId: number;
onCancel: () => void;
}
const DesignateSpecModal: FC<ModalProps & PropsType> = ({
open,
onCancel,
data,
produceSpecSelectEvent,
productId,
}) => {
// 表格多选
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
// 表格多选事件
const onSelectChange = (newSelectedRowKeys: React.Key[]) => {
setSelectedRowKeys(newSelectedRowKeys);
};
// 产品sku列表
const [productSpecList, setProductSpecList] = useState<produceSpecType>([]);
// 表格结构
const columns: ColumnsType<{ id: number }> = [
{ title: '规格名称', dataIndex: 'specName', align: 'center' },
{
title: '规格图片',
dataIndex: 'specImage',
align: 'center',
render: (record) => {
return <Image width={50} height={50} src={record.specImage} alt='图片' />;
},
},
{ title: '版本描述', dataIndex: 'versionDesc', align: 'center' },
{ title: '料号', dataIndex: 'partNo', align: 'center' },
];
// 表格分页配置
const [pagination, setPagination] = useState<
PaginationProps & { totalCount: number; totalPage: number }
>({
totalCount: 0,
pageSize: 5,
pageNo: 1,
totalPage: 0,
});
// 翻页
const paginationChange = (pageNo: number, pageSize: number) => {
pagination.pageNo = pageNo;
pagination.pageSize = pageSize;
getProduceSpecList(productId);
};
// 提交数据到父组件
const handleSubmit = () => {
if (selectedRowKeys.length === 0) {
return message.warning('请选择产品规格');
}
const selectProductSpecList = productSpecList.filter((i) => selectedRowKeys.includes(i.id));
if (selectProductSpecList.length === 0) {
return message.warning('请选择产品规格');
}
produceSpecSelectEvent(selectProductSpecList);
};
//取消
const handleCancel = () => {
setSelectedRowKeys([]);
onCancel();
};
//获取产品-sku
const getProduceSpecList = (productSkuId: number) => {
ProduceManageAPI.listPageProductSpec({
productSkuId,
pageSize: pagination.pageSize,
pageNo: pagination.pageNo,
}).then(({ result }) => {
setProductSpecList(result.list || []);
pagination.totalPage = result.totalPage;
pagination.totalCount = result.totalCount;
setPagination(pagination);
setSelectedRowKeys(data.map((v) => v.id));
});
};
useEffect(() => {
if (productId) {
getProduceSpecList(productId);
}
}, [productId]);
return (
<div>
<Modal
title='指定产品规格'
open={open}
onCancel={handleCancel}
width={768}
zIndex={1010}
onOk={handleSubmit}
>
<Table
dataSource={productSpecList}
columns={columns}
rowKey='id'
style={{ width: '100%' }}
size='small'
bordered
rowSelection={{
selectedRowKeys,
onChange: onSelectChange,
}}
pagination={{
total: pagination.totalCount,
pageSize: pagination.pageSize,
current: pagination.pageNo,
showSizeChanger: true,
showQuickJumper: true,
onChange: (page: number, pageSize: number) => paginationChange(page, pageSize),
showTotal: (total, range) => `当前 ${range[0]}-${range[1]} 条记录 / 共 ${total} 条数据`,
}}
/>
</Modal>
</div>
);
};
export default DesignateSpecModal;
import React, { FC } from 'react';
import { Modal, ModalProps, Table } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { InterDataType } from '~/api/interface';
import { industrySpecDetailType } from '~/api/interface/industryManageType';
//方案规格详情返回类型
type productInventoryListType = InterDataType<industrySpecDetailType>['productInventoryList'];
interface PropsType {
data: productInventoryListType;
onCancel: () => void;
}
const ProductListModal: FC<ModalProps & PropsType> = ({ open, onCancel, data }) => {
// 表格结构
const columns: ColumnsType<productInventoryListType[0]> = [
{
title: '序号',
align: 'center',
width: '50px',
render: (text: string, record: productInventoryListType[0], index: number) => {
return index + 1;
},
},
{
title: '产品名称',
dataIndex: 'productName',
align: 'center',
width: '100px',
render: (text: string, record: productInventoryListType[0]) => {
return record.productSku.productName;
},
},
{
title: '产品类型',
dataIndex: 'typeName',
align: 'center',
width: '100px',
render: (text: string, record: productInventoryListType[0]) => {
return record.productSku.goodsTypeId;
},
},
{
title: '型号',
dataIndex: 'model',
align: 'center',
width: '100px',
render: (text: string, record: productInventoryListType[0]) => {
return record.productSku.model;
},
},
{
title: '产品品牌',
dataIndex: 'productBrand',
align: 'center',
width: '100px',
render: (text: string, record: productInventoryListType[0]) => {
return record.productSku.productName;
},
},
{
title: '产品规格',
// align: "left",
width: '200px',
render: (text: string, record) => {
if (record.select === 0) {
return '不指定';
}
return record.productSpecList.map((i: any, index: number) => (
<div key={index}>
{i.specName}({i.partNo})
</div>
));
},
onHeaderCell: () => {
return {
style: {
textAlign: 'center',
},
};
},
},
];
// 关闭
const onClose = () => {
onCancel();
};
return (
<Modal open={open} title='产品清单' onCancel={onClose} destroyOnClose footer={null} width={800}>
<Table
size='small'
dataSource={data}
columns={columns}
rowKey='id'
style={{ width: '100%' }}
bordered
pagination={false}
/>
</Modal>
);
};
export default ProductListModal;
import React, { useEffect, useState } from 'react'; import React, { FC, useEffect } from 'react';
import { Form, Input, Modal, message, Select } from 'antd'; import { Form, Input, Modal, message, Select, ModalProps } from 'antd';
import { IndustryManageAPI } from '~/api'; import { IndustryManageAPI } from '~/api';
import { IndustrySkuType } from '../../propsType';
import './index.scss'; import './index.scss';
import { InterDataType, InterReqType } from '~/api/interface';
import { categoryListType } from '~/api/interface/categoryManage';
import { industryAddType, listIndustryType } from '~/api/interface/industryManageType';
type categoryResponseType = InterDataType<categoryListType>['list'];
type industryListType = InterDataType<listIndustryType>['list'];
type industryFormType = InterReqType<industryAddType>;
interface PropsType { interface PropsType {
visible: boolean; categoryIndustryList: categoryResponseType;
closed: any; industryItem: Partial<industryListType[0]> | undefined;
data: IndustrySkuType; close: () => void;
addOrEditSuccess: () => void;
} }
const { Option } = Select; const AddOrEditIndustryModal: FC<ModalProps & PropsType> = ({
open,
function AddOrEditIndustryModal(props: PropsType) { categoryIndustryList,
// 父组件传参 industryItem,
const { visible, closed, data } = props; close,
addOrEditSuccess,
}) => {
// 表格事件 // 表格事件
const [form] = Form.useForm(); const [form] = Form.useForm<industryFormType>();
// 所属行业列表
const [industryType, setIndustryType] = useState<{ label: string; val: number }[]>([]);
// 关闭弹窗 // 关闭弹窗
const handleClosed = async () => { const handleClosed = () => {
form.setFieldsValue({ form.resetFields();
goodsTypeId: undefined, close();
description: undefined,
solutionName: undefined,
id: undefined,
});
closed();
};
// 获取所属行业列表
const getFirstIndustryTypeInfo = async () => {
const res: any = await IndustryManageAPI.getFirstIndustryTypeInfo({});
if (res && res.code === '200') {
const arr = res.result.map((i: { goodsMasterType: string; goodsMasterTypeId: number }) => {
return {
label: i.goodsMasterType,
val: i.goodsMasterTypeId,
};
});
setIndustryType(arr);
}
}; };
// 触发表单验证 // 触发表单验证
const handleSubmit = () => { const handleSubmit = () => {
form form
.validateFields() .validateFields()
.then(async (values) => { .then(async (values) => {
const obj = { ...data, ...values }; const res: any = await IndustryManageAPI[
const res: any = await IndustryManageAPI[!obj.id ? 'addIndustrySku' : 'editIndustrySku']( industryItem ? 'editIndustryRequest' : 'addIndustryRequest'
obj, ]({ ...values, id: industryItem ? industryItem.id : undefined });
);
if (res && res.code === '200') { if (res && res.code === '200') {
message.success('操作成功'); message.success('操作成功');
await handleClosed(); handleClosed();
addOrEditSuccess();
} else { } else {
message.warning(res.message); message.warning(res.message);
} }
...@@ -62,19 +52,19 @@ function AddOrEditIndustryModal(props: PropsType) { ...@@ -62,19 +52,19 @@ function AddOrEditIndustryModal(props: PropsType) {
message.warning(err.errorFields[0].errors[0]).then(); message.warning(err.errorFields[0].errors[0]).then();
}); });
}; };
// componentsDidMounted
useEffect(() => { useEffect(() => {
if (!data) return; if (industryItem) {
// console.log("新增编辑弹窗 -->", data); form.setFieldsValue({
form.setFieldsValue({ solutionName: industryItem.solutionName,
...data, categoryId: industryItem.categoryId,
}); description: industryItem.description,
getFirstIndustryTypeInfo().then(); });
}, [data]); }
}, [industryItem]);
return ( return (
<Modal <Modal
open={visible} open={open}
title={data.id ? '修改' : '新增'} title={industryItem ? '修改' : '新增'}
onCancel={handleClosed} onCancel={handleClosed}
onOk={handleSubmit} onOk={handleSubmit}
destroyOnClose destroyOnClose
...@@ -96,15 +86,15 @@ function AddOrEditIndustryModal(props: PropsType) { ...@@ -96,15 +86,15 @@ function AddOrEditIndustryModal(props: PropsType) {
<Input placeholder='请输入方案名称' allowClear maxLength={30} /> <Input placeholder='请输入方案名称' allowClear maxLength={30} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name='goodsTypeId' name='categoryId'
label='所属行业' label='所属行业'
rules={[{ required: true, message: '请选择所属行业' }]} rules={[{ required: true, message: '请选择所属行业' }]}
> >
<Select placeholder='请选择所属行业' allowClear> <Select placeholder='请选择所属行业' allowClear>
{industryType.map((i, j) => ( {categoryIndustryList.map((i, j) => (
<Option value={i.val} key={j}> <Select.Option value={i.id} key={j}>
{i.label} {i.classifyName}
</Option> </Select.Option>
))} ))}
</Select> </Select>
</Form.Item> </Form.Item>
...@@ -124,5 +114,5 @@ function AddOrEditIndustryModal(props: PropsType) { ...@@ -124,5 +114,5 @@ function AddOrEditIndustryModal(props: PropsType) {
</Form> </Form>
</Modal> </Modal>
); );
} };
export default AddOrEditIndustryModal; export default AddOrEditIndustryModal;
// 行业sku管理-分页列表
export interface IndustrySkuType {
goodsTypeId: number | undefined;
description: string;
solutionName: string;
id: number;
createTime: string;
}
// 行业sku管理-行业规格管理-分页列表
export interface IndustrySpecType {
createTime?: string;
productSkuId?: number;
id: number;
industrySkuId?: number;
list: inventoryType[];
specImage: string;
specName: string;
}
// 行业sku管理-行业规格管理-清单列表 // 行业sku管理-行业规格管理-清单列表
export interface inventoryType { export interface inventoryType {
productSku: productSkuType; productSku: productSkuType;
......
import { FC, useEffect } from 'react';
import { Form, Input, Modal, message, ModalProps } from 'antd';
import { MakeManageAPI } from '~/api';
interface selfProps {
makeItem: any;
onOk: () => void;
handleCancel: () => void;
}
const AddOrEditModal: FC<ModalProps & selfProps> = ({
open,
handleCancel,
onOk,
title,
makeItem,
}) => {
const [form] = Form.useForm<{ brandName: string }>();
const submit = () => {
form.validateFields().then((value) => {
MakeManageAPI[makeItem ? 'editBrandInfo' : 'addBrandInfo']({
...value,
id: makeItem?.id,
}).then(({ code, message: msg }) => {
if (code === '200') {
message.success(makeItem ? '编辑成功' : '新增成功');
onOk();
form.resetFields();
} else {
message.error(msg);
}
});
});
};
const onCancel = () => {
form.resetFields();
handleCancel();
};
useEffect(() => {
if (makeItem) {
form.setFieldsValue({
brandName: makeItem.brandName,
});
}
}, [makeItem]);
return (
<Modal open={open} onOk={submit} onCancel={onCancel} title={title}>
<Form form={form}>
<Form.Item
label='品牌名称'
name='brandName'
rules={[{ required: true, message: '请输入品牌名称!' }]}
>
<Input placeholder='请输入品牌名称' maxLength={10} />
</Form.Item>
</Form>
</Modal>
);
};
export default AddOrEditModal;
import { Button, Table } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
import { ColumnsType } from 'antd/es/table';
// import AddOrEditMakeModal from './components/addOrEditMakeModal';
const MakeList = () => {
const columns: ColumnsType<any> = [
{
title: '品牌名称',
align: 'center',
dataIndex: 'brandName',
},
{
title: '创建时间',
align: 'center',
dataIndex: 'createTime',
},
{
title: '操作',
align: 'center',
render: () => (
<>
<Button type='link'>编辑</Button>
<Button type='link' danger>
删除
</Button>
</>
),
},
];
return (
<div className='make-list'>
<div className='make-list-operate'>
<Button type='primary' icon={<PlusOutlined />}>
新增
</Button>
</div>
<div className='make-list-content' style={{ marginTop: '10px' }}>
<Table bordered columns={columns} />
</div>
{/*<AddOrEditMakeModal />*/}
</div>
);
};
export default MakeList;
...@@ -2,7 +2,71 @@ import React from 'react'; ...@@ -2,7 +2,71 @@ import React from 'react';
import { Table, Button } from 'antd'; import { Table, Button } from 'antd';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import './index.scss'; import './index.scss';
import { ColumnsType } from 'antd/es/table';
const columns: ColumnsType<any> = [
{
title: '序号',
align: 'center',
render: () => <div>--</div>,
},
{
title: `产品类型`,
align: 'center',
// dataIndex: "goodsTypeId",
render: () => <div>--</div>,
},
{
title: '规格名称',
align: 'center',
dataIndex: 'goodsSpecName',
},
{
title: `方案`,
align: 'center',
dataIndex: 'skuName',
},
{
title: '选项来源',
align: 'center',
dataIndex: 'specIds',
render: () => <div>--</div>,
},
{
title: '选择方式',
align: 'center',
dataIndex: 'chooseType',
render: () => <div>--</div>,
},
{
title: '是否必选',
align: 'center',
dataIndex: 'must',
render: () => <div>--</div>,
},
{
title: '规格单位',
align: 'center',
dataIndex: 'skuUnitId',
render: () => {
return <div>--</div>;
},
},
{
title: '操作',
align: 'center',
width: '20%',
render: () => {
return (
<div>
<Button type='link' style={{ marginRight: '10px' }}>
编辑
</Button>
<Button type='link'>删除</Button>
</div>
);
},
},
];
const StockSku: React.FC<any> = () => { const StockSku: React.FC<any> = () => {
return ( return (
<div className='stock-sku'> <div className='stock-sku'>
...@@ -13,7 +77,7 @@ const StockSku: React.FC<any> = () => { ...@@ -13,7 +77,7 @@ const StockSku: React.FC<any> = () => {
添加规格 添加规格
</Button> </Button>
</div> </div>
<Table size='small' bordered rowKey='id' pagination={false} /> <Table size='small' bordered rowKey='id' pagination={false} columns={columns} />
</div> </div>
</div> </div>
); );
......
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Form, Input, Modal, message, Select } from 'antd'; import { Form, Input, Modal, message, Select } from 'antd';
import { ProduceManageAPI } from '~/api'; import { CategoryManageAPI, ProduceManageAPI } from '~/api';
import { ProductSkuType, MakeItemEntity } from '../../propsType'; import { ProductSkuType, MakeItemEntity } from '../../propsType';
// import { categoryDec } from '@/api/modules/goods'; import { InterDataType } from '~/api/interface';
import { categoryListType, directoryListType } from '~/api/interface/categoryManage';
//目录返回类型
type directoryType = InterDataType<directoryListType>;
//分类返回类型
type categoryType = InterDataType<categoryListType>['list'];
interface PropsType { interface PropsType {
visible: boolean; visible: boolean;
closed: any; closed: any;
data: ProductSkuType | undefined; data: ProductSkuType | undefined;
makeList: MakeItemEntity[]; makeList: MakeItemEntity[];
decList: any; decList: directoryType;
} }
const { Option } = Select; const { Option } = Select;
...@@ -18,9 +24,7 @@ function AddOrEditProduceModal(props: PropsType) { ...@@ -18,9 +24,7 @@ function AddOrEditProduceModal(props: PropsType) {
// 父组件传参 // 父组件传参
const { visible, closed, data, makeList, decList } = props; const { visible, closed, data, makeList, decList } = props;
// 产品类型下拉列表 // 产品类型下拉列表
const [productTypeSelectList, setProductTypeSelectList] = useState< const [productTypeSelectList, setProductTypeSelectList] = useState<categoryType>([]);
{ label: string; val: number }[]
>([]);
// 表格事件 // 表格事件
const [form] = Form.useForm(); const [form] = Form.useForm();
// 关闭弹窗 // 关闭弹窗
...@@ -46,28 +50,23 @@ function AddOrEditProduceModal(props: PropsType) { ...@@ -46,28 +50,23 @@ function AddOrEditProduceModal(props: PropsType) {
message.warning(err.errorFields[0].errors[0]).then(); message.warning(err.errorFields[0].errors[0]).then();
}); });
}; };
// 获取产品类型列表 //根据目录获取分类
const getListGoodsTypeList = async (type: number) => { const getCategoryListByDirectory = (directoryId: number) => {
const res: any = await ProduceManageAPI.getListGoodsTypeList(type); CategoryManageAPI.getCategoryList({ pageNo: 1, pageSize: 99999, directoryId, type: 4 }).then(
if (res && res.code === '200') { ({ result }) => {
const arr = res.result.map((i: { goodsMasterType: string; goodsMasterTypeId: number }) => { setProductTypeSelectList(result.list || []);
return { },
label: i.goodsMasterType, );
val: i.goodsMasterTypeId,
};
});
setProductTypeSelectList(arr);
}
}; };
// 目录修改 // 目录修改
const decSelectChange = (value: number) => { const decSelectChange = (value: number) => {
form.setFieldValue('goodsTypeId', undefined); form.setFieldValue('goodsTypeId', undefined);
getListGoodsTypeList(value); getCategoryListByDirectory(value);
}; };
// componentsDidMounted // componentsDidMounted
useEffect(() => { useEffect(() => {
if (!data) return; if (!data) return;
getListGoodsTypeList(data.directoryId); getCategoryListByDirectory(data.directoryId);
form.setFieldsValue({ form.setFieldsValue({
...data, ...data,
}); });
...@@ -103,7 +102,7 @@ function AddOrEditProduceModal(props: PropsType) { ...@@ -103,7 +102,7 @@ function AddOrEditProduceModal(props: PropsType) {
<Select placeholder='请选择产品目录' onChange={decSelectChange}> <Select placeholder='请选择产品目录' onChange={decSelectChange}>
{decList.map((v: any, index: number) => ( {decList.map((v: any, index: number) => (
<Select.Option value={v.id} key={index}> <Select.Option value={v.id} key={index}>
{v.sortName} {v.directoryName}
</Select.Option> </Select.Option>
))} ))}
</Select> </Select>
...@@ -122,8 +121,8 @@ function AddOrEditProduceModal(props: PropsType) { ...@@ -122,8 +121,8 @@ function AddOrEditProduceModal(props: PropsType) {
} }
> >
{productTypeSelectList.map((i, j) => ( {productTypeSelectList.map((i, j) => (
<Option value={i.val} key={j}> <Option value={i.id} key={j}>
{i.label} {i.classifyName}
</Option> </Option>
))} ))}
</Select> </Select>
......
...@@ -2,8 +2,73 @@ import React from 'react'; ...@@ -2,8 +2,73 @@ import React from 'react';
import { Table, Button } from 'antd'; import { Table, Button } from 'antd';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import './index.scss'; import './index.scss';
import { ColumnsType } from 'antd/es/table';
const StockSku: React.FC<any> = () => { const StockSku: React.FC<any> = () => {
const columns: ColumnsType<any> = [
{
title: '序号',
align: 'center',
render: () => <div>--</div>,
},
{
title: `产品类型`,
align: 'center',
// dataIndex: "goodsTypeId",
render: () => <div>--</div>,
},
{
title: '规格名称',
align: 'center',
dataIndex: 'goodsSpecName',
},
{
title: `方案`,
align: 'center',
dataIndex: 'skuName',
},
{
title: '选项来源',
align: 'center',
dataIndex: 'specIds',
render: () => <div>--</div>,
},
{
title: '选择方式',
align: 'center',
dataIndex: 'chooseType',
render: () => <div>--</div>,
},
{
title: '是否必选',
align: 'center',
dataIndex: 'must',
render: () => <div>--</div>,
},
{
title: '规格单位',
align: 'center',
dataIndex: 'skuUnitId',
render: () => {
return <div>--</div>;
},
},
{
title: '操作',
align: 'center',
width: '20%',
render: () => {
return (
<div>
<Button type='link' style={{ marginRight: '10px' }}>
编辑
</Button>
<Button type='link'>删除</Button>
</div>
);
},
},
];
return ( return (
<div className='stock-sku'> <div className='stock-sku'>
<div className='stock-sku-title'>库存规格</div> <div className='stock-sku-title'>库存规格</div>
...@@ -13,7 +78,7 @@ const StockSku: React.FC<any> = () => { ...@@ -13,7 +78,7 @@ const StockSku: React.FC<any> = () => {
添加规格 添加规格
</Button> </Button>
</div> </div>
<Table size='small' bordered rowKey='id' pagination={false} /> <Table size='small' bordered rowKey='id' pagination={false} columns={columns} />
</div> </div>
</div> </div>
); );
......
...@@ -62,6 +62,7 @@ const ProduceListView = React.lazy(() => import('~/pages/mallManage/produceManag ...@@ -62,6 +62,7 @@ const ProduceListView = React.lazy(() => import('~/pages/mallManage/produceManag
const ProduceDetailView = React.lazy( const ProduceDetailView = React.lazy(
() => import('~/pages/mallManage/produceManage/produceDetail'), () => import('~/pages/mallManage/produceManage/produceDetail'),
); //产品详情 ); //产品详情
const MakeListView = React.lazy(() => import('~/pages/mallManage/makeManage/makeList'));
const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表 const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
const IndustryDetailView = React.lazy( const IndustryDetailView = React.lazy(
() => import('~/pages/mallManage/industryManage/industryDetail'), () => import('~/pages/mallManage/industryManage/industryDetail'),
...@@ -304,10 +305,19 @@ export const routerList: Array<RouteObjectType> = [ ...@@ -304,10 +305,19 @@ export const routerList: Array<RouteObjectType> = [
}, },
}, },
{ {
path: '/mallManage/makeList',
element: withLoadingComponent(<MakeListView />),
meta: {
id: 10170,
icon: <SmileOutlined />,
title: '品牌管理',
},
},
{
path: '/mallManage/industryList', path: '/mallManage/industryList',
element: withLoadingComponent(<IndustryListView />), element: withLoadingComponent(<IndustryListView />),
meta: { meta: {
id: 10170, id: 10180,
icon: <SmileOutlined />, icon: <SmileOutlined />,
title: '行业方案', title: '行业方案',
}, },
...@@ -316,7 +326,7 @@ export const routerList: Array<RouteObjectType> = [ ...@@ -316,7 +326,7 @@ export const routerList: Array<RouteObjectType> = [
path: '/mallManage/industryDetail', path: '/mallManage/industryDetail',
element: withLoadingComponent(<IndustryDetailView />), element: withLoadingComponent(<IndustryDetailView />),
meta: { meta: {
id: 10180, id: 10190,
icon: <SmileOutlined />, icon: <SmileOutlined />,
title: '行业详情', title: '行业详情',
hidden: true, hidden: true,
......
...@@ -33,3 +33,12 @@ export const urlToBase64 = (url: string) => { ...@@ -33,3 +33,12 @@ export const urlToBase64 = (url: string) => {
}; };
}); });
}; };
// 过滤对象属性
export const filterObjAttr = (obj: any, key: string[]) => {
return Object.keys(obj).reduce((pre: any, cur: string) => {
if (!key.includes(cur)) {
pre[cur] = obj[cur];
}
return pre;
}, {});
};
...@@ -12,7 +12,7 @@ export default defineConfig({ ...@@ -12,7 +12,7 @@ export default defineConfig({
proxy: { proxy: {
'/api': { '/api': {
// target: 'http://192.168.3.111:8077',后端女 // target: 'http://192.168.3.111:8077',后端女
target: 'https://test.iuav.shop', target: 'http://192.168.3.17:8099',
changeOrigin: true, changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''), rewrite: (path) => path.replace(/^\/api/, ''),
}, },
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论