Browse Source

Merge branch 'master' into kitchenmanage

tmp
zhaoy 7 months ago
parent
commit
5dbf202f5d
11 changed files with 804 additions and 43 deletions
  1. +7
    -0
      config/routes.js
  2. +147
    -0
      src/pages/database/bom/components/BomBatching.jsx
  3. +31
    -6
      src/pages/database/bom/components/CreateBom.jsx
  4. +96
    -0
      src/pages/database/bom/components/UpdateBom.jsx
  5. +152
    -33
      src/pages/database/bom/index.jsx
  6. +37
    -0
      src/pages/database/bom/services.js
  7. +1
    -1
      src/pages/database/goods/goodsbom/components/CreateBom.jsx
  8. +1
    -1
      src/pages/database/goods/goodstypemanage/components/CreateAttribute.jsx
  9. +2
    -2
      src/pages/database/goods/newgoods/index.jsx
  10. +312
    -0
      src/pages/device/technology/index.jsx
  11. +18
    -0
      src/pages/device/technology/services.js

+ 7
- 0
config/routes.js View File

@@ -210,6 +210,13 @@ export default [
component: './device/productmanage',
access: 'k14',
},
{
name: '设备工艺',
icon: 'smile',
path: '/device/technology',
component: './device/technology',
access: 'k14',
},
// {
// name: '设备工艺信息',
// icon: 'smile',


+ 147
- 0
src/pages/database/bom/components/BomBatching.jsx View File

@@ -0,0 +1,147 @@
import React, { useState,useRef,useEffect } from 'react';
import { PlusOutlined} from '@ant-design/icons';
import { Modal, Form, Input, Button, Select,Radio,message,Tag,Divider,Space } from 'antd';
import { GetByidBomList } from '../services';
import {
EditableProTable,
ProTable
} from '@ant-design/pro-table';
const GoodsbomFrom = (props) => {
const { Option, OptGroup } = Select;
const [dataSource, setDataSource] = useState([]);
const [editableKeys, setEditableRowKeys] = useState([]);
const [form] = Form.useForm();

useEffect(() => {
let soredata=[];
if(props.BomId){
GetByidBomList(props.BomId).then((t)=>{
var data=t.data
if(data.bomEntry.length>0){
data.bomEntry.map(x=>{
var item={
id:x.id,
bomId:x.bomId,
batchingId:x.batchingId,
dosage:x.bomQty
}
console.log("item",item)
soredata.push(item)
})
}
console.log("soredata",soredata)
if(soredata.length>0){
setEditableRowKeys(soredata.map((item) => item.id))
setDataSource(soredata);
}
})
}
},[props])
const columns=[
{
title: '主键',
dataIndex: 'id',
key: 'id',
hideInTable: true,
hideInSearch: true,
tip: '规则名称是唯一的 key',
},
{
title: '配方',
dataIndex: 'bomId',
hideInTable: true,
hideInSearch: true,
},
{
title: '物料名称',
dataIndex: 'batchingId',
formItemProps: (form, { rowIndex }) => {
return {
rules:
rowIndex > 1 ? [{ required: true, message: '此项为必填项' }] : [],
};
},
valueType: 'select',
fieldProps: {
showSearch:true,
options: props.matedata.map((item, index) => {return {label:item.name,value:item.id}})
},
width: '25%',
},
{
title: '用量',
dataIndex: 'dosage',
valueType:'digit',
width: '15%',
},
{
title: '操作',
valueType: 'option',
width: '15%',
render: () => {
return null;
},
},
]
const headleOk=()=>{
if(dataSource.length==0){
check=false;
message.error("请选择物料")
}else{
props.onBomBatchingFinish(dataSource);
//setDataSource([])
}
}
return (
<Modal
title={'配方详情'}
width={1040}
visible={props.BomBatchingVisible}
bodyStyle={{ padding: '32px 40px 1px 48px' }}
okText="确认"
cancelText="取消"
onOk={headleOk}
onCancel={() => {
props.onBomBatchingCancel();
}}
destroyOnClose
>
<EditableProTable
columns={columns}
rowKey="id"
value={dataSource}
onChange={setDataSource}
recordCreatorProps={{
newRecordType: 'dataSource',
record: () => ({
id: Date.now(),
bomId:props.BomId
}),
}}
editable={{
type: 'multiple',
editableKeys,
actionRender: (row, config, defaultDoms) => {
return [defaultDoms.delete,defaultDoms.Button];
},
onValuesChange: (record, recordList) => {
setDataSource(recordList);
},
onDelete:async (key, row) =>{
console.log(key)
console.log(row)
},
onChange: setEditableRowKeys,
}}/>
</Modal>
//vessels
);
};

export default GoodsbomFrom;

+ 31
- 6
src/pages/database/bom/components/CreateBom.jsx View File

@@ -6,12 +6,11 @@ import { AddBomType } from '../services';

const App = (props) => {

const [form] = Form.useForm();
const inputRef = useRef(null);
const [typename, settypename] = useState('');
const [dataSource, setDataSource] = useState([]);
const [editableKeys, setEditableRowKeys] = useState([]);
const onNameChange = (event) => {
settypename(event.target.value);
}
@@ -69,13 +68,39 @@ const App = (props) => {

}

const headleOk = () => {
props.form.validateFields().then((values) => {
var check = true;
var data = values;
debugger
if (dataSource.length == 0) {
check = false;
message.error("请选择物料")
} else {
data.mate = dataSource.map(x => { return { batchingId: x.batchingId, dosage: x.dosage } });
}
if (check) {
props.form.resetFields();
props.onFinish(data);
setDataSource([])
}

}).catch((info) => {
message.error("请填写必填信息")
});
}

return (
<>

<Modal title="Basic Modal"
onCancel={props.onCancel}
open={props.modalVisible} >
<Form layout="horizontal" preserve={false} form={form} >
<Modal title="新增菜谱"
width={600}
onCancel={props.onCancel}
open={props.modalVisible}
okText="确认"
cancelText="取消"
onOk={headleOk}>
<Form layout="horizontal" preserve={false} form={props.form} >

<Form.Item name="bomName" label="配方名称" rules={[{ required: true, message: '配方名称' }]}>
<Input placeholder="请输入配方名称" />


+ 96
- 0
src/pages/database/bom/components/UpdateBom.jsx View File

@@ -0,0 +1,96 @@
import React, { useState, useEffect, useRef } from 'react';
import { Modal, Form, Input, Button, Select, Switch, InputNumbe, Divider, Space } from 'antd';
import { PlusOutlined } from '@ant-design/icons';

const UpdateBom = (props) => {
const { Option, OptGroup } = Select;
const [typename, settypename] = useState('');
const inputRef = useRef(null);


const onNameChange = (event) => {
settypename(event.target.value);
}

const addItem = (e) => {
e.preventDefault();

if (typename == 0) {
message.error("请输入名称");
} else {
var parm = { name: typename }
AddBomType(parm).then((r) => {
if (r.succeeded) {
message.success('添加成功');
props.initTypeList();
settypename('');
} else {
message.error(r.errors);
}
})
}

}

const headleOk = () => {
props.onUpdateBomSave()
}


return (
<Modal
title={'编辑'}
width={640}
visible={props.updateModalVisible}
bodyStyle={{ padding: '32px 40px 48px' }}
onCancel={() => {
props.onCancel();
}}
onOk={headleOk}
destroyOnClose
>
<Form
layout="vertical"
preserve={false}
form={props.form}
// initialValues={props.values}
onFinish={props.onFinish}
>
<Form.Item name="id" hidden={true}>
<Input />
</Form.Item>
<Form.Item name="name" label="配方名称" >
<Input placeholder="配方名称" />
</Form.Item>
<Form.Item name="bomTypeList" label="配方分类" >
<Select
style={{ width: '100%' }}
mode="tags"
placeholder="请选配方分类"
options={props.bomTypeData}
dropdownRender={(menu) => (
<>
{menu}
<Divider style={{ margin: '8px 0' }} />
<Space style={{ padding: '0 8px 4px' }}>
<Input
placeholder="请输入配方分类"
ref={inputRef}
value={typename}
onChange={onNameChange}
onKeyDown={(e) => e.stopPropagation()}
/>
<Button type="text" icon={<PlusOutlined />} onClick={addItem}>
新增
</Button>
</Space>
</>
)}
/>
</Form.Item>
</Form>
</Modal>
);
};

export default UpdateBom;

+ 152
- 33
src/pages/database/bom/index.jsx View File

@@ -1,20 +1,31 @@
import { PlusOutlined } from '@ant-design/icons';
import { Button, message, Input, Drawer, Modal, Space, Tag, Popconfirm } from 'antd';
import { Button, message, Input, Drawer, Modal, Space, Tag, Popconfirm, Form } from 'antd';
import React, { useState, useRef, useEffect } from 'react';
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout';
import ProTable from '@ant-design/pro-table';
import { bomPage, getproductpage,GetbomTypelist } from './services';
import { bomPage, getproductpage, GetbomTypelist, AddBom, UpdateBomInfo, UpdateBomBatcing,DelBom } from './services';
import CreateBom from './components/CreateBom';
import UpdateBom from './components/UpdateBom';
import BomBatching from './components/BomBatching'


const GoodsBomsManage = (props) => {
const actionRef = useRef();
const [modalVisible, setModalVisible] = useState(false);
const [updateModalVisible, setupdateModalVisible] = useState(false);
const [matedata, setMatedata] = useState([]);
const [bomTypeData,setbomTypeData]= useState([]);
const [bomTypeData, setbomTypeData] = useState([]);
const [selectedRowsState, setSelectedRows] = useState([]);
const [BomId, setBomId] = useState();
const [form] = Form.useForm();
const [form2] = Form.useForm();
const [currentRow, setCurrentRow] = useState();
const [BomBatchingVisible, setBomBatchingVisible] = useState(false);


useEffect(() => {
initGetbomType();
intBatching();//默认原料

}, []);

function intBatching() {
@@ -37,8 +48,8 @@ const GoodsBomsManage = (props) => {
})

}
function initGetbomType(){
GetbomTypelist().then((r)=>{
function initGetbomType() {
GetbomTypelist().then((r) => {
var list = [];
if (r.data.length > 0) {
r.data.forEach((item) => {
@@ -47,60 +58,79 @@ const GoodsBomsManage = (props) => {
}
setbomTypeData(list)
})
}

const columns = [
{
title: '主键',
dataIndex: 'id',
key: 'id',
hideInTable: true,
hideInSearch: true,
tip: '规则名称是唯一的 key',
render: (dom, entity) => {
return (
<a
onClick={() => {
setCurrentRow(entity);
setShowDetail(true);
}}
>
{dom}
</a>
);
},
},
{
title: '配方名称',
key: 'name',
dataIndex: 'name',
valueType: 'textarea',
width: 300,
hideInForm: true,
hideInSearch: false,
},
{
title: '配方类型',
dataIndex: 'isMain',
hideInForm: true,
valueEnum: {
false: {
text: '辅料',
status: 'Processing',
},
true: {
text: '主料',
status: 'Success',
},
},
title: '配方分类',
dataIndex: 'bomTypeList',
search: false,

render: (_, record) => (
<Space>
{
bomTypeData.filter((x) => {
let findId = record.bomTypeList.find((findItem) => findItem === x.value);
let findBomType = bomTypeData.find((bomItem) => bomItem.value === findId);
return findBomType != null || undefined;
}).map((item) => (
<Tag color="#87d068" key={item.value}>
{item.text}
</Tag>
))}
</Space>
),
},
{
title: '操作',
dataIndex: 'option',
valueType: 'option',
width: 250,
render: (_, record) => [
<a
key="primary"
key="primary3"
type="primary"
onClick={() => {
setUpdateBomVisible(true);
setBomId(record.bomId)
setCurrentRow(record);
form2.setFieldsValue(record);
setupdateModalVisible(true);
}}
>
更新
</a>,
<a
key="primary"
key="primary1"
type="primary"
onClick={() => {
setBomBatchingVisible(true);
setBomId(record.bomId)
setBomId(record.id)
}}
>
配方详情
@@ -108,19 +138,72 @@ const GoodsBomsManage = (props) => {
<Popconfirm
type="primary"
key="primary"
title="确认删除吗?"
title="删除后可能影响商品配方,确认删除吗?"
okText="是"
cancelText="否"
onConfirm={async () => {

const hide = message.loading('正在删除');
try {
DelBom(record.id);
hide();
message.success('删除成功,即将刷新');
actionRef.current.reloadAndRest();
return true;
} catch (error) {
hide();
message.error('删除失败,请重试');
actionRef.current.reloadAndRest();
return false;
}
}}
onCancel={() => { }}
>
<a href="#">删除</a>
</Popconfirm>,

],
}
]
},
];

const onUpdateBomSave = () => {
form2
.validateFields()
.then((values) => {
console.log(values)
var parm = { id: values.id, name: values.bomName, IsMain: values.bomType == '1' ? true : false, bomTypeIds: values.bomTypeList }
UpdateBomInfo(parm).then((r) => {
if (r.data) {
message.success('修改成功');
setupdateModalVisible(false);
actionRef.current.reload();
setBomId('')
} else {
message.error(r.errors || "修改失败");
}
})
})
}


const onBomBatchingCancel = () => {
setBomBatchingVisible(false);
setBomId('')
}

const onBomBatchingFinish = (form) => {
console.log("form", form)
var parm = { bomId: BomId, bomEntry: form };
UpdateBomBatcing(parm).then((r) => {
if (r.succeeded) {
message.success('修改成功');
setBomBatchingVisible(false);
actionRef.current.reload();
setBomId('')
} else {
message.error(r.errors);
}
})
}


return (
@@ -167,10 +250,46 @@ const GoodsBomsManage = (props) => {
{/* 新增菜谱 */}
<CreateBom modalVisible={modalVisible}
matedata={matedata}
form={form}
bomTypeData={bomTypeData}
initTypeList={initTypeList}
onCancel={() => { setModalVisible(false); }}
onFinish={async (value) => {
await AddBom(value).then((r) => {
if (r.data) {
message.success("添加成功")
setModalVisible(false);
} else {
message.error("添加失败")
}
actionRef.current.reloadAndRest();
})
}}
onCancel={() => { setModalVisible(false); form.resetFields(); }}
/>

{/* 修改菜谱 */}
<UpdateBom
updateModalVisible={updateModalVisible}
onUpdateBomSave={onUpdateBomSave}
values={currentRow || {}}
form={form2}
bomTypeData={bomTypeData}
onFinish={async (value) => {

}}
onCancel={() => {
setupdateModalVisible(false);
setCurrentRow(undefined);
}}
/>

{/* 配方详情 */}
<BomBatching BomBatchingVisible={BomBatchingVisible}
matedata={matedata}
onBomBatchingCancel={onBomBatchingCancel}
BomId={BomId}
onBomBatchingFinish={onBomBatchingFinish} />


</PageContainer>
);


+ 37
- 0
src/pages/database/bom/services.js View File

@@ -7,6 +7,14 @@ export async function bomPage(data) {
data:data,
});
}
export async function AddBom(data) {
return request(getDataBaseUrl()+'/api/bom/AddBom', {
method: 'POST',
data:data,
});
}



export async function AddBomType (data) {
return request(getDataBaseUrl()+`/api/bom/addbomtype`, {
@@ -31,3 +39,32 @@ export async function bomPage(data) {
});
}


export async function GetByidBomList(data) {
return request(getDataBaseUrl()+`/api/bom/getbyidbomlist?bomId=`+data, {
method: 'Get',
});
}

export async function UpdateBomInfo(data) {
return request(getDataBaseUrl()+`/api/bom/update`, {
method: 'Post',
data: data,
});
}

export async function UpdateBomBatcing(data) {
return request(getDataBaseUrl()+`/api/bom/updatebombatcing`, {
method: 'Post',
data: data,
});
}

export async function DelBom (data) {
return request(getDataBaseUrl()+`/api/bom/DelBom?id=${data}`, {
method: 'post',
//data: data,
});
}


+ 1
- 1
src/pages/database/goods/goodsbom/components/CreateBom.jsx View File

@@ -71,7 +71,7 @@ const GoodsbomFrom = (props) => {
setEditableRowKeys(soredata.map((item) => item.id))
setDataSource(soredata);
}
},[props])
},[])
const columns=[
{
title: '物料名称',


+ 1
- 1
src/pages/database/goods/goodstypemanage/components/CreateAttribute.jsx View File

@@ -273,7 +273,7 @@ const handleUpdate = async (fields) => {
onClick={async () => {
await handleRemove(selectedRowsState);
setSelectedRows([]);
actionRef.current?.reloadAndRest?.();
actionRef.current?.AndRest?.();
}}
>
删除


+ 2
- 2
src/pages/database/goods/newgoods/index.jsx View File

@@ -378,7 +378,7 @@ const GoodsManage = () => {
// cancelText="否"
// onConfirm={() => {
// handleRemove([record.id]);
// actionRef.current?.reloadAndRest();
// actionRef.current?.AndRest();
// }}
// onCancel={() => {}}
// >
@@ -444,7 +444,7 @@ const GoodsManage = () => {
onClick={async () => {
await handleRemove(selectedRowsState);
setSelectedRows([]);
actionRef.current?.reloadAndRest?.();
actionRef.current?.AndRest?.();
}}
>
删除


+ 312
- 0
src/pages/device/technology/index.jsx View File

@@ -0,0 +1,312 @@

import { Modal, Button, message, Form, Upload, Select ,Popconfirm} from 'antd';
import React, { useState, useRef, useEffect } from 'react';
import { PageContainer, FooterToolbar } from '@ant-design/pro-layout';
import { PlusOutlined } from '@ant-design/icons';
import ProTable from '@ant-design/pro-table';
import {GetTechnologyPage,GetProductList,GetDeviceVesionList } from "./services"
import { history } from 'umi';
const key = 'message';




const GoodsTypeManage = () => {
const [createModalVisible, handleModalVisible] = useState(false);
const actionRef = useRef();
const [DictData, setDictData] = useState([]);
const [DeviceVesionData, setDeviceVesionData] = useState([]);
const [currentRow, setCurrentRow] = useState();
const [selectedRowsState, setSelectedRows] = useState([]);
const [isModalOpen, setIsModalOpen] = useState(false);
const [isAddGoodsTemplate,setIsAddGoodsTemplate]=useState(false);
const [form] = Form.useForm();
const props = {
beforeUpload: (file) => {
if (
file.type !== 'application/vnd.ms-excel' &&
file.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
) {
message.error(`${file.name} 不是 exelce 文件`);
}
return file.type == 'application/vnd.ms-excel' ||
file.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
? true
: Upload.LIST_IGNORE;
},
name: 'file',
data: { "id": currentRow?.id, "deviceClientType": currentRow?.deviceTypeKey, "version": currentRow?.vesion,"isAddGoodsTemplate":isAddGoodsTemplate},
action: '/saasbase/api/goods/goodstemplateexport',
headers: {
Authorization: 'Bearer ' + localStorage.getItem('token')
},
onChange(info) {
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList);
}
setIsAddGoodsTemplate(false);
if (info.file.status === 'done') {
setIsModalOpen(false);
actionRef.current.reload();
message.success(`${info.file.name} 文件上传成功.`);
} else if (info.file.status === 'error') {
message.error(`${info.file.name} 文件上载失败.`);
}
}
};
const columns = [
{
title: '主键',
dataIndex: 'id',
hideInSearch: true,
hideInTable: true,
tip: '规则名称是唯一的 key'
},
{
title: '所属产品',
dataIndex: 'productName',
valueType: 'textarea',
},
{
title: '版本号',
dataIndex: 'vesion',
valueType: 'textarea',
},
{
title: '时间',
dataIndex: 'createTime',
valueType: 'textarea',
},
// {
// title: '是否存在模板',
// dataIndex: 'templatePath',
// valueType: 'textarea',
// hideInSearch: true,
// render: (_, record) => [
// <div>
// <Tag color="#f50" style={{ textAlign: "center", display: (record.templatePath == null||record.templatePath == "") ? "none" : "block" }} >存在模板</Tag>
// <Tag style={{ textAlign: "center", display: (record.templatePath == null||record.templatePath == "")? "block" : "none" }} color="#2db7f5">无模板</Tag>
// </div>],
// },
{
title: '操作',
dataIndex: 'option',
valueType: 'option',
fixed: 'right',
width: 700,
render: (_, record) => [
<a
key="config"
onClick={() => {
handleModalVisible(true);
setCurrentRow(record);
// form.setFielsValue(record)
}} > 详情</a>,
<a
key="config"
onClick={() => {
handleModalVisible(true);
setCurrentRow(record);
// form.setFielsValue(record)
}} > 下载</a>,
<Popconfirm
type="primary"
key="primary11"
title="确认删除吗?"
okText="是"
cancelText="否"
onConfirm={() => {
DelDeviceVesion([record.id]).then((r) => {

if (r.data) {
message.success('删除成功');
actionRef.current.reload();
} else {
message.error(r.errors);
}
});
}}
onCancel={() => { }}
>
<a href="#">删除</a>
</Popconfirm>,
// <a
// key="config"
// onClick={() => {
// setCurrentRow(record);
// setIsModalOpen(true);
// setIsAddGoodsTemplate(false);
// }} > 上传设备工艺模型</a>,
// <a
// key="config"
// onClick={() => {
// setCurrentRow(record);
// setIsModalOpen(true);
// setIsAddGoodsTemplate(true);
// }} > 上传商品工艺模版</a>,
// <a
// key="config"
// href={record.templatePath}

// > 下载工艺模板</a>,
<a
key="config"
onClick={() => {
history.push({
pathname: '/device/productmanage',
query: {
isAdd: false,
values: record,
tabStatus: 'basis'
},
});
}} > 管理</a>,
],
},
];
useEffect(() => {
GetProductList().then((r) => {
var arr = r.data;
if (r.succeeded) {
var list = [];
arr.forEach((item) => {
list.push({
label: item.name,
text:item.name,
id: item.id,
});
});
//setDicDataAny(data);
setDictData(list);
}
});
}, [])
const handleChange = (value) => {
console.log(`selected ${value}`);
GetDeviceVesionList(value).then((r)=>{
var arr = r.data;
if (r.succeeded) {
var list = [];
arr.forEach((item) => {
list.push({
label: item.vesion,
text:item.vesion,
id: item.id,
});
});
//setDicDataAny(data);
setDeviceVesionData(list);
}
})
};
const handleVisChange=(value)=>{
console.log(`selected ${value}`);
}
return (
<PageContainer host header={{
title: '',
breadcrumb: {},
}}>
<ProTable
headerTitle="设备版本"
actionRef={actionRef}
rowKey="id"
pagination={{ defaultPageSize: 10 }}
search={{
labelWidth: 120,
}}
toolBarRender={() => [
<Button
type="primary"
key="primary"
onClick={() => {
// form.setFielsValue(currentRow)
setIsModalOpen(true);
}} >
<PlusOutlined /> 导入工艺模版
</Button>,
]}
request={async (params) => {
var data = [];
var total = 0;
await GetTechnologyPage(params).then((r) => {
data = r.data.data;
total = r.data.total;
});
return {
data: data,
success: true,
total: total,
};
}}
columns={columns}
rowSelection={{
onChange: (_, selectedRows) => {
setSelectedRows(selectedRows);
},
}}
/>
{selectedRowsState?.length > 0 && (
<FooterToolbar
extra={
<div>
已选择{' '}
<a
style={{
fontWeight: 600,
}}
>
{selectedRowsState.length}
</a>{' '}
项 &nbsp;&nbsp;
</div>
}
>
<Button
onClick={async () => {
await handleRemove(selectedRowsState);
setSelectedRows([]);
actionRef.current?.reloadAndRest?.();
}}
>
删除
</Button>
</FooterToolbar>
)}
<Modal title="上传工艺模版" open={isModalOpen} footer={null} maskClosable={false}
destroyOnClose onCancel={() => { setIsModalOpen(false) }}>
<div style={{marginBottom:10}}>
<span style={{marginRight:10}}>选择产品</span>
<Select style={{width: '60%'}} onChange={handleChange}>
{DictData.map((item, index) => {
return (
<Select.Option index={index} value={item.id} key={item.id}>
{item.label}
</Select.Option>
);
})}
</Select>
</div>
<div style={{marginBottom:10}}>
<span style={{marginRight:10}}>选择版本</span>
<Select style={{width: '60%'}} onChange={handleVisChange}>
{DeviceVesionData.map((item, index) => {
return (
<Select.Option index={index} value={item.id} key={item.id}>
{item.label}
</Select.Option>
);
})}
</Select>
</div>
<Upload {...props} maxCount={1}>
<Button style={{marginLeft:'55%'}}>导入工艺模版</Button>
</Upload>
</Modal>

</PageContainer>
);
};

export default GoodsTypeManage;

+ 18
- 0
src/pages/device/technology/services.js View File

@@ -0,0 +1,18 @@
import { request } from 'umi';
import { getDataBaseUrl } from '@/global_data';
export async function GetTechnologyPage(data) {
return request(getDataBaseUrl()+`/api/technology/page`, {
method: 'POST',
data: data,
});
}
export async function GetProductList() {
return request(getDataBaseUrl()+`/api/product/list`, {
method: 'Get',
});
}
export async function GetDeviceVesionList(data) {
return request(getDataBaseUrl()+`/api/devicevesion/getdevicevesion?productId=`+data, {
method: 'Get',
});
}

Loading…
Cancel
Save