Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
I
integrated-scheduling-v3
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张晓彤
integrated-scheduling-v3
Commits
dc367fbe
Commit
dc367fbe
authored
Jun 08, 2022
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
分许调度数据层更新
parent
bbee0737
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
120 additions
and
50 deletions
+120
-50
group.py
core/group.py
+37
-5
dispatchInfo.py
data/dispatchInfo.py
+64
-33
tables.py
tables.py
+19
-12
No files found.
core/group.py
View file @
dc367fbe
...
@@ -8,14 +8,14 @@
...
@@ -8,14 +8,14 @@
from
data.dispatchInfo
import
DispatchInfo
from
data.dispatchInfo
import
DispatchInfo
from
bidict
import
bidict
from
bidict
import
bidict
from
alg.algorithm
import
AlgorithmBase
from
alg.algorithm
import
AlgorithmBase
,
Congestion
class
Group
:
class
Group
:
"""
"""
class for group instance.
class for group instance.
"""
"""
def
__init__
(
self
,
group_id
):
def
__init__
(
self
,
group_id
,
truck
,
dump
,
excavator
):
""" Generate a group obj.
""" Generate a group obj.
:param group_id: (uuid) group_id
:param group_id: (uuid) group_id
"""
"""
...
@@ -23,8 +23,8 @@ class Group:
...
@@ -23,8 +23,8 @@ class Group:
self
.
group_id
=
group_id
self
.
group_id
=
group_id
# group devices
# group devices
self
.
excavator_dict
=
{}
# excavator_id ->
un
load_area_id
self
.
excavator_dict
=
{}
# excavator_id -> load_area_id
self
.
dump_dict
=
{}
# dump_id -> load_area_id
self
.
dump_dict
=
{}
# dump_id ->
un
load_area_id
self
.
truck_set
=
set
()
# truck_id
self
.
truck_set
=
set
()
# truck_id
# road network info.
# road network info.
...
@@ -41,6 +41,11 @@ class Group:
...
@@ -41,6 +41,11 @@ class Group:
self
.
excavator_uuid_index_dict
=
bidict
()
self
.
excavator_uuid_index_dict
=
bidict
()
self
.
dump_uuid_index_dict
=
bidict
()
self
.
dump_uuid_index_dict
=
bidict
()
# device obj.
self
.
truck
=
truck
self
.
dump
=
dump
self
.
excavator
=
excavator
def
update_xx_
(
self
):
def
update_xx_
(
self
):
"""
"""
update above parameters.
update above parameters.
...
@@ -48,6 +53,22 @@ class Group:
...
@@ -48,6 +53,22 @@ class Group:
"""
"""
pass
pass
def
update_device_map
(
self
):
"""
update above parameters.
:return:
"""
self
.
truck_uuid_index_dict
=
DispatchInfo
.
dump_group_dict
pass
def
update_road_network_info
(
self
,
para
):
"""
:return:
"""
pass
return
def
group_dispatch
(
self
,
solver
):
def
group_dispatch
(
self
,
solver
):
"""
"""
Receive a alg obj. and output dispatch plan for trucks in this group.
Receive a alg obj. and output dispatch plan for trucks in this group.
...
@@ -57,4 +78,15 @@ class Group:
...
@@ -57,4 +78,15 @@ class Group:
"""
"""
assert
isinstance
(
solver
,
AlgorithmBase
)
assert
isinstance
(
solver
,
AlgorithmBase
)
s
=
solver
(
self
)
# algorithm init
s
=
solver
(
self
)
# algorithm init
return
s
.
solve
()
# algorithm solve
for
truck_id
in
self
.
truck_set
:
value
=
s
.
solve
(
truck_id
)
# algorithm solve
return
value
def
target_2_match_id
(
self
,
target
):
pass
group
=
Group
(
"group123"
)
group
.
group_dispatch
(
Congestion
)
data/dispatchInfo.py
View file @
dc367fbe
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# @Time : 2022/5/30 14:45
# @Time : 2022/5/30 14:45
# @Author : Opfer
# @Author : Opfer
# @Site :
# @Site :
# @File : dispatchInfo.py
# @File : dispatchInfo.py
# @Software: PyCharm
# @Software: PyCharm
import
numpy
as
np
from
settings
import
*
from
settings
import
*
import
pandas
as
pd
logger
=
get_logger
(
"mqc.dispatchInfo"
)
logger
=
get_logger
(
"mqc.dispatchInfo"
)
...
@@ -20,23 +22,20 @@ class DispatchInfo:
...
@@ -20,23 +22,20 @@ class DispatchInfo:
# device group structure
# device group structure
group_dump_dict
=
{}
# team_id -> dict {unload_area_id, unload_area_id, ...}
group_dump_dict
=
{}
# team_id -> dict {unload_area_id, unload_area_id, ...}
# {group_id:unload_area_id,...}
group_excavator_dict
=
{}
# team_id -> dict {[excavator_id, excavator_id], ...}
group_excavator_dict
=
{}
# team_id -> dict {[excavator_id, load_area_id], ...}
load_exactor_dict
=
{}
# 装载区id-->>电铲编号的映射
# {group_id: [excavator_id, unload_area_id], ...}
exactor_load_dict
=
{}
# 电铲编号->>装载区id的映射
group_truck_dict
=
{}
# team_id -> dict {truck_id, ...}
group_truck_dict
=
{}
# team_id -> dict # {group_id:[truck_id,truck_id],...}
# {group_id:[truck_id,truck_id],...}
dump_group_dict
=
{}
# unload_area_id -> team_id
dump_group_dict
=
{}
# unload_area_id -> team_id
excavator_group_dict
=
{}
# excavator_id -> team_id
excavator_group_dict
=
{}
# excavator_id -> team_id
问题:多个key值对应一个value值
truck_group_dict
=
{}
# truck_id -> team_id
truck_group_dict
=
{}
# truck_id -> team_id
# group feature
# group feature
group_mode
=
{}
# 四种模式:全智能、空车智能、定铲定铲和分流配比模式
group_mode
=
{}
# 数据格式: {team_id:mode_code}
# {mode_name:mode_code}
# route_distance(路网距离)
# route_distance(路网距离)
load_
excavator_distance
=
{}
# 装载区-挖机(电铲)的距离 数据格式 -->> {load_area_id:[exactor_uuid:to_load_distance],
}
load_
distance
=
{}
# 装载区-挖机(电铲)的距离 数据格式 -->>{team_id:np.array
}
unload_
excavator_distance
=
{}
# 卸载区-挖机(电铲)的距离 数据格式 -->> {unload_area_id:[exactor_uuid:to_unload_distance],
}
unload_
distance
=
{}
# 卸载区-挖机(电铲)的距离 数据格式 -->>{team_id:np.array
}
@classmethod
@classmethod
def
renew_set
(
cls
):
def
renew_set
(
cls
):
...
@@ -46,16 +45,17 @@ class DispatchInfo:
...
@@ -46,16 +45,17 @@ class DispatchInfo:
@desc:实例化对象,可直接访问
@desc:实例化对象,可直接访问
"""
"""
cls
.
group_dump_dict
=
{}
cls
.
group_dump_dict
=
{}
# cls.group_dump_dict.keys() 相当于所有的team_id
cls
.
dump_group_dict
=
{}
cls
.
dump_group_dict
=
{}
# cls.dump_group_dict.keys() 相当于所有的卸载区 unload_area_id
cls
.
group_excavator_dict
=
{}
cls
.
group_excavator_dict
=
{}
cls
.
excavator_group_dict
=
{}
cls
.
excavator_group_dict
=
{}
cls
.
excavator_group_dict
=
{}
cls
.
load_exactor_dict
=
{}
# cls.load_exactor_dict.keys() 相当于所有的装载区 load_area_id
cls
.
exactor_load_dict
=
{}
cls
.
group_truck_dict
=
{}
cls
.
group_truck_dict
=
{}
cls
.
truck_group_dict
=
{}
cls
.
truck_group_dict
=
{}
cls
.
group_mode
=
{}
cls
.
group_mode
=
{}
cls
.
load_
excavator_distance
=
{}
cls
.
load_
distance
=
{}
# to_load_diatance-->>空车模式
cls
.
unload_
excavator_distance
=
{}
cls
.
unload_
distance
=
{}
# to_unload_distance-->>重车模式
@classmethod
@classmethod
def
update_device_group_structure
(
cls
):
def
update_device_group_structure
(
cls
):
...
@@ -66,7 +66,7 @@ class DispatchInfo:
...
@@ -66,7 +66,7 @@ class DispatchInfo:
"""
"""
logger
=
get_logger
(
"mqc.update_device_group_structure"
)
logger
=
get_logger
(
"mqc.update_device_group_structure"
)
try
:
try
:
# group_dump_dict = {} -->> {
group_id:unload_area_id
,...}
# group_dump_dict = {} -->> {
team_id:[unload_area_id,unload_area_id]
,...}
# dump_group_dict = {} # unload_area_id -> team_id
# dump_group_dict = {} # unload_area_id -> team_id
group_code_dict
=
{}
# group_code-->>team_id的映射
group_code_dict
=
{}
# group_code-->>team_id的映射
for
valve
in
session_mysql
.
query
(
DispatchMatch
)
.
filter_by
(
group_type
=
1
)
.
all
():
for
valve
in
session_mysql
.
query
(
DispatchMatch
)
.
filter_by
(
group_type
=
1
)
.
all
():
...
@@ -76,12 +76,15 @@ class DispatchInfo:
...
@@ -76,12 +76,15 @@ class DispatchInfo:
else
:
else
:
cls
.
group_dump_dict
[
valve
.
team_id
]
.
append
(
valve
.
unload_area_id
)
cls
.
group_dump_dict
[
valve
.
team_id
]
.
append
(
valve
.
unload_area_id
)
cls
.
dump_group_dict
[
valve
.
unload_area_id
]
=
valve
.
team_id
# 一个unload_area_id只对应一个team_id
cls
.
dump_group_dict
[
valve
.
unload_area_id
]
=
valve
.
team_id
# 一个unload_area_id只对应一个team_id
# group_excavator_dict = {} -->> {
group_id: [excavator_id, unload_area
_id], ...} # 一个team_id对应一组excavator_id, unload_area_id
# group_excavator_dict = {} -->> {
team_id: [excavator_id, excavator
_id], ...} # 一个team_id对应一组excavator_id, unload_area_id
# excavator_group_dict = {} -->> excavator_id -> team_id 一个excavator_id只对应一个team_id
# excavator_group_dict = {} -->> excavator_id -> team_id 一个excavator_id只对应一个team_id
for
item
in
session_mysql
.
query
(
DispatchMatch
)
.
filter_by
(
group_type
=
1
)
.
all
():
for
item
in
session_mysql
.
query
(
DispatchMatch
)
.
filter_by
(
group_type
=
1
)
.
all
():
cls
.
group_excavator_dict
[
item
.
team_id
]
=
[
item
.
exactor_id
,
item
.
unload_area_id
]
if
item
.
team_id
in
cls
.
group_excavator_dict
:
cls
.
group_excavator_dict
[
item
.
team_id
]
.
append
(
item
.
exactor_id
)
else
:
cls
.
group_excavator_dict
[
item
.
team_id
]
=
[
item
.
exactor_id
]
cls
.
excavator_group_dict
[
item
.
exactor_id
]
=
item
.
team_id
cls
.
excavator_group_dict
[
item
.
exactor_id
]
=
item
.
team_id
# group_truck_dict = {} -->> {
group
_id:[truck_id,truck_id],...}
# group_truck_dict = {} -->> {
team
_id:[truck_id,truck_id],...}
# truck_group_dict = {} -->> truck_id -> team_id
# truck_group_dict = {} -->> truck_id -> team_id
for
key
in
session_mysql
.
query
(
DispatchEquipment
)
.
filter_by
(
group_type
=
1
)
.
all
():
for
key
in
session_mysql
.
query
(
DispatchEquipment
)
.
filter_by
(
group_type
=
1
)
.
all
():
if
key
.
group_code
in
group_code_dict
:
if
key
.
group_code
in
group_code_dict
:
...
@@ -101,10 +104,18 @@ class DispatchInfo:
...
@@ -101,10 +104,18 @@ class DispatchInfo:
@author:maqc
@author:maqc
@desc:处理其它类型的数据
@desc:处理其它类型的数据
"""
"""
# 新增:team_id-->>group_code;group_code-->>mode_code.结果:team_id-->>mode_code
logger
=
get_logger
(
"mqc.update_group_mode"
)
logger
=
get_logger
(
"mqc.update_group_mode"
)
team_group_dict
=
{}
# team_id-->>group_code的一个映射,格式:{team_id:group_code}
group_mode_dict
=
{}
# group-->>mode_code的一个映射,格式:{group_code:mode_code}
try
:
try
:
for
value
in
session_mysql
.
query
(
DispatchMode
)
.
all
():
for
pos
in
session_mysql
.
query
(
DispatchMatch
)
.
filter_by
(
group_type
=
1
)
.
all
():
cls
.
group_mode
[
value
.
mode_name
]
=
value
.
mode_code
team_group_dict
[
pos
.
team_id
]
=
pos
.
group_code
for
item
in
session_mysql
.
query
(
DispatchGroup
)
.
filter_by
(
group_type
=
1
)
.
all
():
group_mode_dict
[
item
.
group_code
]
=
item
.
mode_code
for
key
,
value
in
team_group_dict
.
items
():
if
value
in
group_mode_dict
:
cls
.
group_mode
[
key
]
=
group_mode_dict
[
value
]
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"派车模式数据更新异常"
)
logger
.
error
(
"派车模式数据更新异常"
)
logger
.
error
(
es
)
logger
.
error
(
es
)
...
@@ -115,7 +126,13 @@ class DispatchInfo:
...
@@ -115,7 +126,13 @@ class DispatchInfo:
update basic paras (group_set, dict, num ...)
update basic paras (group_set, dict, num ...)
:return:
:return:
"""
"""
pass
try
:
for
value
in
session_postgre
.
query
(
DiggingWorkArea
)
.
all
():
cls
.
load_exactor_dict
[
value
.
Id
]
=
value
.
Exactorld
cls
.
exactor_load_dict
[
value
.
Exactorld
]
=
value
.
Id
except
Exception
as
es
:
logger
.
error
(
"初始化数据更新异常"
)
logger
.
error
(
es
)
@classmethod
@classmethod
# 距离-->>数据格式:矩阵-->>to_load_distance
# 距离-->>数据格式:矩阵-->>to_load_distance
...
@@ -125,17 +142,31 @@ class DispatchInfo:
...
@@ -125,17 +142,31 @@ class DispatchInfo:
@author:maqc
@author:maqc
@desc:更新路网距离,返回矩阵格式数据
@desc:更新路网距离,返回矩阵格式数据
"""
"""
load_exactor_dict
=
{}
# 装载区id-->>电铲编号的映射
logger
=
get_logger
(
"mqc.update_route_distance"
)
logger
=
get_logger
(
"mqc.update_route_distance"
)
try
:
try
:
for
value
in
session_postgre
.
query
(
DiggingWorkArea
)
.
all
():
df
=
pd
.
DataFrame
()
# 记录装载区与卸载区之间的距离
load_exactor_dict
[
value
.
Id
]
=
value
.
Exactorld
for
item
in
session_postgre
.
query
(
WalkTime
)
.
all
():
for
value
in
session_postgre
.
query
(
WalkTime
)
.
all
():
temp
=
str
(
item
.
load_area_id
),
str
(
item
.
unload_area_id
),
item
.
to_load_distance
,
item
.
to_unload_distance
if
value
.
load_area_id
in
load_exactor_dict
:
df
=
pd
.
concat
([
df
,
pd
.
DataFrame
([
temp
])],
axis
=
0
,
ignore_index
=
True
)
cls
.
load_excavator_distance
[
value
.
load_area_id
]
=
[
load_exactor_dict
[
value
.
load_area_id
],
for
team_id
in
list
(
cls
.
group_dump_dict
.
keys
()):
value
.
to_load_distance
]
unload_nums
=
list
(
set
(
cls
.
group_dump_dict
[
team_id
]))
# 获取同一个team_id对应的卸载区列表
cls
.
unload_excavator_distance
[
value
.
unload_area_id
]
=
[
load_exactor_dict
[
value
.
load_area_id
],
exactor_nums
=
list
(
set
(
cls
.
group_excavator_dict
[
team_id
]))
# 获取同一个team_id对应的电铲列表
value
.
to_unload_distance
]
unload_exactor_matrix
=
np
.
zeros
(
(
len
(
unload_nums
),
len
(
exactor_nums
)))
# 初始化距离矩阵,记录从卸载区-->>电铲的距离,即to_load_distance,空车模式
load_exactor_matrix
=
np
.
array
(
unload_exactor_matrix
)
.
T
# 初始化距离矩阵,记录从装载区-->>电铲的距离,即to_unload_distance,重车模式
for
i
in
range
(
len
(
unload_nums
)):
for
j
in
range
(
len
(
exactor_nums
)):
id
=
set
(
df
.
loc
[
df
[
1
]
==
str
(
unload_nums
[
i
])]
.
index
.
to_list
())
&
set
(
df
.
loc
[
df
[
0
]
==
str
(
cls
.
exactor_load_dict
[
j
])]
.
index
.
to_list
())
# 集合属性
unload_exactor_matrix
[
i
][
j
]
=
df
.
iloc
[
list
(
id
)[
0
]][
2
]
for
m
in
range
(
len
(
exactor_nums
)):
for
n
in
range
(
len
(
unload_nums
)):
id
=
set
(
df
.
loc
[
df
[
0
]
==
str
(
cls
.
exactor_load_dict
[
m
])]
.
index
.
to_list
())
&
set
(
df
.
loc
[
df
[
1
]
==
str
(
unload_nums
[
n
])]
.
index
.
to_list
())
load_exactor_matrix
[
m
][
n
]
=
df
.
iloc
[
list
(
id
)[
0
]][
3
]
cls
.
load_distance
[
team_id
]
=
unload_exactor_matrix
cls
.
unload_distance
[
team_id
]
=
load_exactor_matrix
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"路网数据更新异常"
)
logger
.
error
(
"路网数据更新异常"
)
logger
.
error
(
es
)
logger
.
error
(
es
)
tables.py
View file @
dc367fbe
...
@@ -15,9 +15,11 @@ from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN
...
@@ -15,9 +15,11 @@ from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN
from
sqlalchemy.orm
import
sessionmaker
,
scoped_session
from
sqlalchemy.orm
import
sessionmaker
,
scoped_session
from
sqlalchemy.ext.declarative
import
declarative_base
from
sqlalchemy.ext.declarative
import
declarative_base
from
urllib.parse
import
quote
from
urllib.parse
import
quote
import
json
import
json
,
os
json_file
=
"config.json"
relative_path
=
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
# 获取当前文件夹的绝对路径
json_file
=
os
.
path
.
join
(
relative_path
,
"config.json"
)
# json_file = "config.json"
with
open
(
json_file
)
as
f
:
with
open
(
json_file
)
as
f
:
mysql_config
=
json
.
load
(
f
)[
"mysql"
]
mysql_config
=
json
.
load
(
f
)[
"mysql"
]
...
@@ -519,7 +521,7 @@ class Material(Base):
...
@@ -519,7 +521,7 @@ class Material(Base):
class
DispatchMode
(
Base
):
class
DispatchMode
(
Base
):
__tab
el
name__
=
'sys_dispatch_mode'
__tab
le
name__
=
'sys_dispatch_mode'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
mode_name
=
Column
(
VARCHAR
(
30
))
mode_name
=
Column
(
VARCHAR
(
30
))
...
@@ -534,21 +536,24 @@ class DispatchMode(Base):
...
@@ -534,21 +536,24 @@ class DispatchMode(Base):
class
DispatchGroup
(
Base
):
class
DispatchGroup
(
Base
):
__tab
el
name__
=
'sys_dispatch_group'
__tab
le
name__
=
'sys_dispatch_group'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
group_type
=
Column
(
Integer
)
group_type
=
Column
(
Integer
)
group_code
=
Column
(
VARCHAR
(
36
))
group_code
=
Column
(
VARCHAR
(
36
))
mode_id
=
Column
(
VARCHAR
(
36
))
mode_id
=
Column
(
VARCHAR
(
36
))
mode_code
=
Column
(
Integer
)
def
__init__
(
self
,
group_type
,
group_code
,
mode_id
):
def
__init__
(
self
,
id
,
group_type
,
group_code
,
mode_id
,
mode_code
):
self
.
id
=
id
self
.
group_type
=
group_type
self
.
group_type
=
group_type
self
.
group_code
=
group_code
self
.
group_code
=
group_code
self
.
mode_id
=
mode_id
self
.
mode_id
=
mode_id
self
.
mode_code
=
mode_code
class
DispatchMatch
(
Base
):
class
DispatchMatch
(
Base
):
__tab
el
name__
=
'sys_dispatch_match'
__tab
le
name__
=
'sys_dispatch_match'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
group_type
=
Column
(
Integer
)
group_type
=
Column
(
Integer
)
group_code
=
Column
(
VARCHAR
(
36
))
group_code
=
Column
(
VARCHAR
(
36
))
match_code
=
Column
(
VARCHAR
(
36
))
match_code
=
Column
(
VARCHAR
(
36
))
...
@@ -556,7 +561,8 @@ class DispatchMatch(Base):
...
@@ -556,7 +561,8 @@ class DispatchMatch(Base):
unload_area_id
=
Column
(
VARCHAR
(
36
))
unload_area_id
=
Column
(
VARCHAR
(
36
))
exactor_id
=
Column
(
VARCHAR
(
36
))
exactor_id
=
Column
(
VARCHAR
(
36
))
def
__init__
(
self
,
group_type
,
group_code
,
match_code
,
team_id
,
unload_area_id
,
exactor_id
):
def
__init__
(
self
,
id
,
group_type
,
group_code
,
match_code
,
team_id
,
unload_area_id
,
exactor_id
):
self
.
id
=
id
self
.
group_type
=
group_type
self
.
group_type
=
group_type
self
.
group_code
=
group_code
self
.
group_code
=
group_code
self
.
match_code
=
match_code
self
.
match_code
=
match_code
...
@@ -566,15 +572,16 @@ class DispatchMatch(Base):
...
@@ -566,15 +572,16 @@ class DispatchMatch(Base):
class
DispatchEquipment
(
Base
):
class
DispatchEquipment
(
Base
):
__tab
el
name__
=
'sys_dispatch_equipment'
__tab
le
name__
=
'sys_dispatch_equipment'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
group_type
=
Column
(
Integer
)
group_type
=
Column
(
Integer
)
group_code
=
Column
(
VARCHAR
(
36
))
group_code
=
Column
(
VARCHAR
(
36
))
match_code
=
Column
(
VARCHAR
(
36
))
match_code
=
Column
(
VARCHAR
(
36
))
isdeleted
=
Column
(
Integer
)
isdeleted
=
Column
(
Integer
)
equipment_id
=
Column
(
VARCHAR
(
36
))
equipment_id
=
Column
(
VARCHAR
(
36
))
def
__init__
(
self
,
group_type
,
group_code
,
match_code
,
isdeleted
,
equipment_id
):
def
__init__
(
self
,
id
,
group_type
,
group_code
,
match_code
,
isdeleted
,
equipment_id
):
self
.
id
=
id
self
.
group_type
=
group_type
self
.
group_type
=
group_type
self
.
group_code
=
group_code
self
.
group_code
=
group_code
self
.
match_code
=
match_code
self
.
match_code
=
match_code
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment