Yanko 1 개월 전
부모
커밋
5100a1cf9d
6개의 변경된 파일323개의 추가작업 그리고 334개의 파일을 삭제
  1. +1
    -1
      frontend/config/proxy.ts
  2. +1
    -1
      frontend/src/api/sys/dto.d.ts
  3. +281
    -269
      frontend/src/pages/deviceProductInfo/index.tsx
  4. +22
    -54
      frontend/src/pages/final/index.tsx
  5. +5
    -5
      frontend/src/pages/stock/index.tsx
  6. +13
    -4
      frontend/src/pages/workInfo/index.tsx

+ 1
- 1
frontend/config/proxy.ts 파일 보기

@@ -6,7 +6,7 @@
export default {
dev: {
'/api/': {
target: 'http://localhost:5502',
target: 'http://192.168.1.12:5502',
pathRewrite: {
'/api': '/api'
},


+ 1
- 1
frontend/src/api/sys/dto.d.ts 파일 보기

@@ -85,7 +85,7 @@ declare namespace RolelTypes {
}
//人员
declare namespace UserTypes {
// 登录参数类型
// 登录
type LoginParams = {
account: string,
pwd: string


+ 281
- 269
frontend/src/pages/deviceProductInfo/index.tsx 파일 보기

@@ -28,15 +28,19 @@ interface ParmForm {
}


const ParmsTypeList = [{

label: '数据',
value: 0
},
{
label: '数组',
value: 1
}
const ParmsTypeList = [
{
label: '数据',
value: 0
},
{
label: '多选',
value: 1
},
{
label: '单选',
value: 2
}
]

export default () => {
@@ -53,7 +57,7 @@ export default () => {

// useEffect(()=>{
// console.log("funcParams");
const [isParamsUnit, setIsParamsUnit] = useState<boolean>();
const [isParamsUnit, setIsParamsUnit] = useState<number>(0);

// },[funcParams])
const [paramsModelOpen, setParamsModelOpen] = useState<boolean>(false);
@@ -71,23 +75,23 @@ export default () => {
{
title: '主键',
dataIndex: 'id',
formItemProps:{
hidden:true
formItemProps: {
hidden: true
},
search: false,
},
{
title: '名称',
dataIndex: 'name',
formItemProps:{
rules:[{ required: true, message: '此项为必填项!' }]
formItemProps: {
rules: [{ required: true, message: '此项为必填项!' }]
},
},
{
title: '编码',
dataIndex: 'code',
formItemProps:{
rules:[{ required: true, message: '此项为必填项!' }]
formItemProps: {
rules: [{ required: true, message: '此项为必填项!' }]
},
search: false,
},
@@ -99,7 +103,7 @@ export default () => {
{
title: '操作',
valueType: 'option',
fixed:'right',
fixed: 'right',
render: (text, row) => [
<Space key={+new Date() + Math.random()}>
<Button type='primary' size='small' onClick={() => {
@@ -215,7 +219,7 @@ export default () => {
}
}}
pagination={{
pageSize: 5,
pageSize: 10,
showSizeChanger: false
}}
rowKey="id"
@@ -252,269 +256,277 @@ export default () => {
<div>产品名称:{selectRow?.name}</div>
<div>产品描述:{selectRow?.description}</div>
</ProCard>
<ProTable<deviceProduct.output>
type={funcfromType as 'table'}
cardBordered
bordered
scroll={{ x: true }}
rowClassName={(record: any, index: number, indent: number) => {
if (index % 2 === 0) {
return ''; // 偶数行的类名
} else {
return 'even-row-background'; // 奇数行的类名
}
}}
headerTitle="列表"
formRef={funcRef}
actionRef={funcActionRef}
search={false}
columns={[
{
title: '功能主键',
dataIndex: 'id',
search: false,
formItemProps: {
hidden: true
},
readonly: true,
},
{
title: '功能名称',
dataIndex: 'name',
ellipsis: true,
search: false,

<ProTable<deviceProduct.output>
type={funcfromType as 'table'}
cardBordered
bordered
scroll={{ x: true }}
rowClassName={(record: any, index: number, indent: number) => {
if (index % 2 === 0) {
return ''; // 偶数行的类名
} else {
return 'even-row-background'; // 奇数行的类名
}
}}
headerTitle="列表"
formRef={funcRef}
actionRef={funcActionRef}
search={false}
columns={[
{
title: '功能主键',
dataIndex: 'id',
search: false,
formItemProps: {
hidden: true
},
{
title: '功能编码',
hideInDescriptions: true,
dataIndex: 'code',
search: false,
}, {
title: '输入参数',
hideInDescriptions: true,
hideInTable: true,
dataIndex: "params",
search: false,
renderFormItem(schema, config, form, action?) {
// let b = JSON.parse(config?.record!.params);
return (
<div>
{funcParams.map((res: ParmForm, index: number) => (
<Row key={+new Date() + Math.random()} style={{ borderBottom: "0.5px solid #f3e0e0", margin: "10px" }}>
<Space split={<Divider type="vertical" />}>
<div>参数名称:{res.paramName}</div>
<div>参数代码:{res.paramCode}</div>
<Button type='link' onClick={() => {
setParamsModelOpen(true)
setTimeout(() => {
paramsForm.setFieldsValue(funcParams[index]);
}, 100);
}}>设置</Button>
<Button type='link' onClick={() => {
const newData = [...funcParams];
newData.splice(index, 1);
setTimeout(() => {
setFuncParams(newData);
}, 100);
}}>删除</Button>
</Space>
</Row>
)
)}
<Button type='link' onClick={() => {
paramsForm.resetFields();
setParamsModelOpen(true)
}}>+增加参数</Button>
<Modal
maskClosable={false} destroyOnClose title="设置参数" footer={false} onCancel={() => setParamsModelOpen(false)} open={paramsModelOpen}>
<ProForm form={paramsForm} id="paramsForm"
onFinish={async (values) => {
console.log(values);
const b = paramsForm.getFieldsValue();
if (b.id) {
funcParams.forEach((res) => {
if (res.id === b.id) {
res.paramCode = b.paramCode;
res.paramName = b.paramName;
res.paramType = b.paramType;
res.paramUnit = b.paramUnit;
}
})
setFuncParams(funcParams);
} else {
b.id = uuid()
funcParams.push(b);
}
setFuncParams(funcParams);
console.log(b);
setParamsModelOpen(false)
readonly: true,
},
{
title: '功能名称',
dataIndex: 'name',
ellipsis: true,
search: false,
},
{
title: '功能编码',
hideInDescriptions: true,
dataIndex: 'code',
search: false,
}, {
title: '输入参数',
hideInDescriptions: true,
hideInTable: true,
dataIndex: "params",
search: false,
renderFormItem(schema, config, form, action?) {
// let b = JSON.parse(config?.record!.params);
return (
<div>
{funcParams.map((res: ParmForm, index: number) => (
<Row key={+new Date() + Math.random()} style={{ borderBottom: "0.5px solid #f3e0e0", margin: "10px" }}>
<Space split={<Divider type="vertical" />}>
<div>参数名称:{res.paramName}</div>
<div>参数代码:{res.paramCode}</div>
<Button type='link' onClick={() => {
setParamsModelOpen(true)
setTimeout(() => {
console.log('funcParams[index]', funcParams[index]);

}}>
<Form.Item label="主键" hidden name="id">
<Input></Input>
</Form.Item>
<Form.Item label="参数名称" name="paramName" rules={[{ required: true, message: '此项为必填项!' }]}>
<Input></Input>
</Form.Item>
<Form.Item label="参数代码" name="paramCode" rules={[{ required: true, message: '此项为必填项!' }]}>
<Input></Input>
</Form.Item>
<Form.Item label="参数类型" name="paramType" rules={[{ required: true, message: '此项为必填项!' }]}>
<Select onChange={(value) => {
if (value === 0) {
setIsParamsUnit(false)
} else {
setIsParamsUnit(true)
paramsForm.setFieldsValue(funcParams[index]);
setIsParamsUnit(funcParams[index].paramType)
}, 100);
}}>设置</Button>
<Button type='link' onClick={() => {
const newData = [...funcParams];
newData.splice(index, 1);
setTimeout(() => {
setFuncParams(newData);
}, 100);
}}>删除</Button>
</Space>
</Row>
)
)}
<Button type='link' onClick={() => {
paramsForm.resetFields();
setParamsModelOpen(true)
}}>+增加参数</Button>
<Modal
maskClosable={false} destroyOnClose title="设置参数" footer={false} onCancel={() => setParamsModelOpen(false)} open={paramsModelOpen}>
<ProForm form={paramsForm} id="paramsForm"
onFinish={async (values) => {
console.log(values);
const b = paramsForm.getFieldsValue();
if (b.id) {
funcParams.forEach((res) => {
if (res.id === b.id) {
res.paramCode = b.paramCode;
res.paramName = b.paramName;
res.paramType = b.paramType;
res.paramUnit = b.paramUnit;
}
}} placeholder="选择数据类型" options={ParmsTypeList}>
})
setFuncParams(funcParams);
} else {
b.id = uuid()
funcParams.push(b);
}
setFuncParams(funcParams);
console.log(b);
setParamsModelOpen(false)

</Select>
</Form.Item>
<Form.Item label="参数单位" hidden={isParamsUnit} name="paramUnit" rules={[{ required: !isParamsUnit, message: '此项为必填项!' }]}>
<Input></Input>
</Form.Item>
</ProForm>
</Modal>
</div>
)
},
}}>
<Form.Item label="主键" hidden name="id">
<Input></Input>
</Form.Item>
<Form.Item label="参数名称" name="paramName" rules={[{ required: true, message: '此项为必填项!' }]}>
<Input></Input>
</Form.Item>
<Form.Item label="参数代码" name="paramCode" rules={[{ required: true, message: '此项为必填项!' }]}>
<Input></Input>
</Form.Item>
<Form.Item label="参数类型" name="paramType" rules={[{ required: true, message: '此项为必填项!' }]}>
<Select onChange={(value) => {
setIsParamsUnit(value)
}} placeholder="选择数据类型" options={ParmsTypeList}>

},
{
title: '描述',
dataIndex: 'description',
search: false,
},
{
title: '操作',
valueType: 'option',
dataIndex: 'id',
fixed:'right',
render: (text, row) => [
<Space key={+new Date() + Math.random()}>
<a onClick={() => {
setFuncFromType('form')
console.log('row', row);
setTimeout(() => {
funcRef.current?.setFieldsValue(row)
if (row.params) {
const ppp = JSON.parse(row.params)
setFuncParams(ppp)
} else {
setFuncParams([])
</Select>
</Form.Item>
{isParamsUnit ===1 ?
<Form.Item label="参数单位" name="paramUnit" rules={[{ required: true, message: '此项为必填项!' }]}>
<Input></Input>
</Form.Item>:""
}
{isParamsUnit === 2 ?
<Form.Item label="数据源" name="paramSouce" rules={[{ required: true, message: '此项为必填项!' }]}>
<Input.TextArea rows={10}>
</Input.TextArea>
</Form.Item>
:""
}
</ProForm>
</Modal>
</div>
)
},

}, 200);
},
{
title: '描述',
dataIndex: 'description',
search: false,
},
{
title: '操作',
valueType: 'option',
dataIndex: 'id',
fixed: 'right',
render: (text, row) => [
<Space key={+new Date() + Math.random()}>
<a onClick={() => {
setFuncFromType('form')
console.log('row', row);
setTimeout(() => {
funcRef.current?.setFieldsValue(row)
if (row.params) {
const ppp = JSON.parse(row.params)
setFuncParams(ppp)
} else {
setFuncParams([])
}

}} key={+new Date() + Math.random()} target="_blank" rel="noopener noreferrer">
编辑
</a>
<Popconfirm
key="del"
title="确定要删除此条数据吗?"
onConfirm={() => {
}, 200);

deviceProducFunctiontApi.Del(row).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.info("删除成功!");
Reolod()
} else {
message.error(res.errors);
}
})
}}
onCancel={() => {
message.info('已取消删除');
}}
okText="确认"
cancelText="关闭"
>
<a>
删除
</a>
</Popconfirm>
</Space>
],
},
]}
onSubmit={(params: any) => {
console.log(params, funcParams);
params.params = JSON.stringify(funcParams);
params.deviceProductId = selectRow?.id
if (funcfromType === 'form') {
if (params.id) {
deviceProducFunctiontApi.Update(params).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.info("更新成功!");
setFuncFromType('table')
FuncReolod()
} else {
message.error(res.errors);
}
})
} else {
deviceProducFunctiontApi.Add(params).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.info("新增成功!");
setFuncFromType('table')
FuncReolod()
} else {
message.error(res.errors);
}
})
}
}
}}
request={async (params = {}) => {
const jsonData: deviceProductFunction.queryPage = {
pageIndex: params.current || 1,
pageSize: params.pageSize || 10,
deviceProductId: selectRow?.id
};
const response = await deviceProducFunctiontApi.PagedList(jsonData);
if (response.statusCode === 200) {
return {
data: response.data.items,
success: true,
total: response.data.total,
};
}} key={+new Date() + Math.random()} target="_blank" rel="noopener noreferrer">
编辑
</a>
<Popconfirm
key="del"
title="确定要删除此条数据吗?"
onConfirm={() => {

deviceProducFunctiontApi.Del(row).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.info("删除成功!");
Reolod()
} else {
message.error(res.errors);
}
})
}}
onCancel={() => {
message.info('已取消删除');
}}
okText="确认"
cancelText="关闭"
>
<a>
删除
</a>
</Popconfirm>
</Space>
],
},
]}
onSubmit={(params: any) => {
console.log(params, funcParams);
params.params = JSON.stringify(funcParams);
params.deviceProductId = selectRow?.id
if (funcfromType === 'form') {
if (params.id) {
deviceProducFunctiontApi.Update(params).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.info("更新成功!");
setFuncFromType('table')
FuncReolod()
} else {
message.error(res.errors);
}
})
} else {
return {
data: [],
success: false,
total: 0,
};
}
}}
form={{
ignoreRules: true,// 自定义提交按钮的属性
submitter: {
onReset: () => {
funcRef.current?.resetFields();
setFuncFromType("table")
},
searchConfig: { resetText: funcfromType === 'form' ? '返回' : '重置', submitText: funcfromType === 'form' ? '提交' : '查询' },
deviceProducFunctiontApi.Add(params).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.info("新增成功!");
setFuncFromType('table')
FuncReolod()
} else {
message.error(res.errors);
}
})
}
}}
pagination={{
pageSize: 5,
showSizeChanger: false
}}
rowKey="id"
dateFormatter="string"
}
}}
request={async (params = {}) => {
const jsonData: deviceProductFunction.queryPage = {
pageIndex: params.current || 1,
pageSize: params.pageSize || 10,
deviceProductId: selectRow?.id
};
const response = await deviceProducFunctiontApi.PagedList(jsonData);
if (response.statusCode === 200) {
return {
data: response.data.items,
success: true,
total: response.data.total,
};
} else {
return {
data: [],
success: false,
total: 0,
};
}
}}
form={{
ignoreRules: true,// 自定义提交按钮的属性
submitter: {
onReset: () => {
funcRef.current?.resetFields();
setFuncFromType("table")
},
searchConfig: { resetText: funcfromType === 'form' ? '返回' : '重置', submitText: funcfromType === 'form' ? '提交' : '查询' },
}
}}
pagination={{
pageSize: 10,
showSizeChanger: false
}}
rowKey="id"
dateFormatter="string"

toolBarRender={() => [
<Button key="3" type="primary" onClick={() => {
setFuncFromType('form');
setFuncParams([])
}}>
<PlusOutlined />
添加功能
</Button>,
]}
/>

toolBarRender={() => [
<Button key="3" type="primary" onClick={() => {
setFuncFromType('form');
setFuncParams([])
}}>
<PlusOutlined />
添加功能
</Button>,
]}
/>
</>
}
</>


+ 22
- 54
frontend/src/pages/final/index.tsx 파일 보기

@@ -236,10 +236,10 @@ const final = () => {
.then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
res.data.map((item: any) => (
item.value = item.id,
item.label = item.materialName
item.value = item.materialCode,
item.label = item.materialName+`(${item.mode==1?"人工":"设备"})`
))
console.log(res.data);
console.log('物料信息',res.data);

setMaterialParmList(res.data)
}
@@ -469,7 +469,7 @@ const final = () => {
<Badge.Ribbon text={devicesItem.status == '0' ? '未设置' : '已设置'} color={devicesItem.status == '0' ? '' : 'pink'}>
<CheckCard onClick={(v) => {
setcurrentproductionProcess(item)
setcurrentproductionDev(devicesItem.code)
setcurrentproductionDev(devicesItem)
setStepTitle(item.processName + '-' + devicesItem.name + '[' + devicesItem.code + ']')
console.log('currentproductionline', currentproductionline);

@@ -506,9 +506,7 @@ const final = () => {
</Card>
}
<Modal maskClosable={false} open={isEditModalOpen}
width={1000}


width={1200}
// title={<Tag color='#0960bd' bordered style={{fontSize:'18px',borderRadius:'0px'}}>{stepTitle}</Tag>}
onCancel={() => {
setIsEditModalOpen(false)
@@ -517,19 +515,6 @@ const final = () => {
}
onOk={() => setIsEditModalOpen(false)}
footer={false}
// footer={[
// <Button
// key="back"
// onClick={() => {
// setIsEditModalOpen(false)
// }}
// >
// 返回
// </Button>,
// <Button key="submit" danger type="primary" onClick={() => setIsEditModalOpen(false)} >
// 完成配置
// </Button>,
// ]}
>
<DragSortTable<CraftsTypes.craftsInfoOutput>
tableStyle={{ overflowY: 'auto', overflowX: 'hidden', maxHeight: '500px' }}
@@ -542,11 +527,11 @@ const final = () => {
setIsSchemaModalOpen(true)
setDeviceParm([]);
setSpinStatus(true)


const jsonData: deviceProductFunction.queryParms = {
deviceProductId: selectRowItem?.deviceProductId
deviceProductId: currentproductionDev?.deviceType
};
console.log('jsonData',jsonData);
DeviceProductFunctionAPI.List(jsonData).then((res: MyResponse.Content) => {
if (res.succeeded) {
setDeviceFun(res.data);
@@ -600,7 +585,7 @@ const final = () => {
console.log('sss', currentproductionProcess?.devicesInfo);
const b = JSON.stringify(currentproductionProcess?.devicesInfo);
const c: any[] = JSON.parse(b);
const d = c.filter(x => x.code != currentproductionDev);
const d = c.filter(x => x.code != currentproductionDev.code);
setM_device(d);
setisConfigDevOpen(true)
}}
@@ -629,34 +614,17 @@ const final = () => {

hideInSearch: true
},
// {
// title: '产线工序',
// dataIndex: 'productLineStepsName',
// align: 'center',
// hideInSearch: true
// }
// ,
// {
// title: '设备类型',
// dataIndex: 'deviceTypeName',
// align: 'center',
// hideInSearch: true
// },
// {
// title: '设备名称',
// dataIndex: 'deviceName',
// align: 'center',
// hideInSearch: true
// },
{
title: '功能',
dataIndex: 'deviceProductFunctionName',
hideInSearch: true,
width:200
},
{
title: '设备参数预览',
width: 100,
hideInSearch: true,
render(dom, entity, index, action, schema) {
const deviceFunParams = JSON.parse(entity?.deviceFunParams);
if (entity?.deviceStepParms) {
@@ -671,9 +639,9 @@ const final = () => {
deviceStepParms[citem]?.map(
(s: any) => {
if (wl == '') {
wl = materialParmList.find((x: any) => x.value == s).label
wl = materialParmList.find((x: any) => x.value == s)?.label
} else {
wl = wl + ',' + materialParmList.find((x: any) => x.value == s).label
wl = wl + ',' + materialParmList.find((x: any) => x.value == s)?.label
}
}
)
@@ -689,7 +657,7 @@ const final = () => {
<Space size='small' direction="vertical" align='start'>
{
newParms.map((sss) => (
<Tag>{sss.name}</Tag>
<div style={{wordWrap:'break-word'}}>{sss.name}</div>
))
}
</Space>
@@ -946,7 +914,7 @@ const final = () => {
columns={[
{
title: '物料名称',
dataIndex: 'materialId',
dataIndex: 'materialCode',
valueType: 'select',
ellipsis: true,
request: async () => {
@@ -957,7 +925,7 @@ const final = () => {
res.data.map((item: MaterialsTypes.Info) => (
myData.push({
label: `${item.name}[${item.unit}]`,
value: item.id,
value: item.code,
})
))
}
@@ -979,7 +947,7 @@ const final = () => {
text: '设备',
},
'1': {
text: '其他',
text: '人工',
},
}
},
@@ -1226,7 +1194,7 @@ const final = () => {
const jsonData: finalCraftStepsTypes.addInput = {
productLineStepsId: currentproductionProcess.id,
description: froms.description,
deviceId: currentproductionDev,
deviceId: currentproductionDev.code,
finalId: selectRowItem.id,
deviceProductFunctionId: froms.deviceProductFunctionId!,
params: JSON.stringify(values)
@@ -1265,7 +1233,7 @@ const final = () => {
const jsonData: finalCraftStepsTypes.addInput = {
productLineStepsId: currentproductionProcess.id,
description: value.description,
deviceId: currentproductionDev,
deviceId: currentproductionDev.code,
finalId: selectRowItem.id,
deviceProductFunctionId: '',
params: ''
@@ -1337,7 +1305,7 @@ const final = () => {
lineId: currentproductionline.key,
copyDeviceId: value.deviceId,
productLineStepsId: currentproductionProcess.id,
toDeviceId: currentproductionDev
toDeviceId: currentproductionDev.code
}).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
message.success('同步成功!');
@@ -1345,7 +1313,7 @@ const final = () => {
setTimeout(() => {
const jsondata = {
lineId: currentproductionline.key,
deviceId: currentproductionDev,
deviceId: currentproductionDev.code,
finalId: selectRowItem?.id,
productLineStepsId: currentproductionProcess.id
}


+ 5
- 5
frontend/src/pages/stock/index.tsx 파일 보기

@@ -126,7 +126,7 @@ export default () => {
// 下拉列表信息
const RegionDataList = async () => {

const data = await materialAPI.selectlist();
const data = await materialAPI.List();
// console.log(data);

setRegionData(data.data);
@@ -266,13 +266,13 @@ export default () => {
>
<Input />
</Form.Item>
<Form.Item label="料仓原料" name="materialId" rules={[{ required: true, message: '此项为必填项!' }]} >
<Form.Item label="料仓原料" name="materialCode" rules={[{ required: true, message: '此项为必填项!' }]} >
<Select placeholder='请选择原料'>
{RegionData.map((item: MySelectType.Select) => {
{RegionData.map((item: any) => {
console.log(item);

return <Select.Option value={item.key} key={item.key}>
<span>{item.value}</span>
return <Select.Option value={item.code} key={item.code}>
<span>{item.name}</span>
</Select.Option>
})}
</Select>


+ 13
- 4
frontend/src/pages/workInfo/index.tsx 파일 보기

@@ -623,6 +623,8 @@ export default () => {
const UpdateGY = (lineId: string, finalId: string) => {
productlineInfoStepsAPI.List({ lineId: lineId, finalId: finalId }).then((res: MyResponse.Content) => {
if (res.statusCode === 200) {
console.log('res.data',res.data);
setLineProcessList(res.data);
}
})
@@ -992,16 +994,23 @@ export default () => {
</div>
<Card title='选择设备' size="small" bordered={false} style={{ height: '200px', overflowY: 'auto', overflowX: 'hidden' }} className={styles.gongyi_tag_device}>

<Form.Item name={'pro:' + item.id} rules={[{ required: item.devicesInfo.length > 0, message: `产线工序路线[${index + 1}-${item.processName}]未选择设备!`,validator:(rule, value)=>{
message.error(rule.message)
} }]} >
<Form.Item name={'pro:' + item.id}
rules={[{ required: item.devicesInfo.length > 0,
message: `产线工序路线[${index + 1}-${item.processName}]未选择设备!`,validator(rule, value, callback) {
if (value || item.devicesInfo.length == 0) {
return Promise.resolve();
}else{
message.error(`产线工序路线[${index + 1}-${item.processName}]未选择设备!`)
}
},}]}>
<CheckCard.Group >
{
item.devicesInfo.length > 0 ?
<Space title='设备' direction="vertical">
{item.devicesInfo.map((devicesItem: any, devicesIndex: number) => (
<CheckCard onClick={(v) => {
}} size='small' title={devicesItem.name} value={devicesItem.id} />
}} size='small' title={devicesItem.name} value={devicesItem.code} />
))}
</Space>
: <Empty />


불러오는 중...
취소
저장