%%%------------------------------------------------------------------- %%% @author panse %%% @copyright (C) 2018, %%% @doc %%% %%% @end %%% Created : 06. 八月 2018 10:16 %%%------------------------------------------------------------------- -module(device_info). -author("panse"). %%% 设备信息表 %%-record(device_info, {node_id, uuid, device_name, dev_address, %% father_node, node_online, create_time, update_time, create_by, del_flag}). -record(device_info, {node_id, uuid, device_id, cluster_id, create_time, update_time, create_by, del_flag}). -include_lib("stdlib/include/ms_transform.hrl"). -include_lib("stdlib/include/qlc.hrl"). %% API %%% 创建,增,删,改,查 -export([create_deviceInfotable/2, add_deviceInfo/4, del_DevInfo/1, findDeviceInfo/2]). %%-export([del_deviceInfo/1]). %%% 查找在线设备,数据格式转换 -export([findDeviceOnlineList/2, deviceOnlineList2Maps/1]). %%% 根据节点名返回uuid -export([findNodeId/1]). %%% 创建基本设备表 %%% 应仅在集群初始化的时候调用一次 create_deviceInfotable(Nodes, TableName) -> Ret = mnesia:create_table(TableName, [{disc_copies, Nodes}, {attributes, record_info(fields, device_info)} ]), io:format("create_deviceInfoTable Ret=~p~n", [Ret]), syncTool:changeTableConfig(Nodes, TableName), %% mnesia:change_table_copy_type(TableName, node(), disc_copies), Ret. %%% 增加设备信息 %%% %%% @DevId 设备uuid %%% @DevName 设备名称 %%% @DevAdd 设备地址 %%% @NodeId 节点地址名称 name@ip %%% @FNode 父节点地址 add_deviceInfo(UUid, DevId, NodeId, ClusterID) -> CreateTime = syncTool:getTimeStr(), UpdateTime = syncTool:getTimeStr(), %% io:format("UpdateTime=~p~n", [UpdateTime]), CreateUser = node(), Delflag = "0", F = fun() -> mnesia:write(#device_info{uuid = UUid, device_id = DevId, node_id = NodeId, cluster_id = ClusterID, create_time = CreateTime, update_time = UpdateTime, create_by = CreateUser, del_flag = Delflag}) end, mnesia:activity(transaction, F). %%% 物理删除 del_DevInfo(NodeName) -> mnesia:transaction( fun() -> mnesia:delete({device_info, NodeName}) end). %%逻辑删除 %%del_deviceInfo(NodeName) -> %% %%根据id获取整条记录 %% [ADR | TheList] = findDeviceInfo('device_info', NodeName), %% io:format("ADR ~p~n~n~n~n", [ADR]), %% TempADR = erlang:setelement(8, ADR, syncTool:getTimeStr()), %% NewADR = erlang:setelement(10, TempADR, '1'), %% io:format("NewADR ~p~n~n~n~n", [NewADR]), %% %% #todoupdate_time %% %%修改记录的删除状态 %% mnesia:transaction( %% fun() -> %% %mnesia:delete({account, ID}) %% mnesia:write(#device_info{uuid = element(1, NewADR), device_name = element(2, NewADR), %% dev_address = element(3, NewADR), node_id = element(4, NewADR), father_node = element(5, NewADR), %% node_online = element(6, NewADR), create_time = element(7, NewADR), update_time = element(8, NewADR), %% create_by = element(9, NewADR), del_flag = element(10, NewADR)}) %% end). %%del_deviceInfo(NodeName) -> %%修改记录的删除状态 %% mnesia:transaction( %% fun() -> %% [P] = mnesia:wread({'device_info', NodeName}), %% mnesia:write(P#device_info{update_time=getTimeStr(),del_flag="1"}) %% end %% ). %%% 查询设备信息 %%% @TableName 表名 %%% @Expertise 约束条件的值 findDeviceInfo(TableName, Expertise) -> F = fun() -> qlc:eval(qlc:q([{NodeId, Uuid, DevID, CluID, CreateTime, UpdateTime, CreateUser, Delflag} || #device_info{node_id = NodeId, uuid = Uuid, device_id = DevID, cluster_id = CluID, create_time = CreateTime, update_time = UpdateTime, create_by = CreateUser, del_flag = Delflag} <- mnesia:table(TableName), NodeId =:= Expertise])) end, mnesia:activity(transaction, F). %%%lists:flatten 查询在线设备列表 findDeviceOnlineList(_TableName, []) -> []; findDeviceOnlineList(TableName, _ExpertiseList = [OnlineNode | T]) -> F = fun() -> qlc:eval(qlc:q([{NodeId, Uuid, DevID, CluID, CreateTime, UpdateTime, CreateUser, Delflag} || #device_info{node_id = NodeId, uuid = Uuid, device_id = DevID, cluster_id = CluID, create_time = CreateTime, update_time = UpdateTime, create_by = CreateUser, del_flag = Delflag} <- mnesia:table(TableName), NodeId =:= OnlineNode])) end, [mnesia:activity(transaction, F) | findDeviceOnlineList(TableName, T)]. %%% 在线设备list转map转list deviceOnlineList2Maps([]) -> []; deviceOnlineList2Maps(_ExpertiseList = [OnlineNodes | T]) -> [OnlineNode | TEMP] = OnlineNodes, [ClusterInfo | Temp2] = clusterInfo:findClusterInfo('cluster_info', element(4, OnlineNode)), io:format("ClusterInfo ~p~n~n~n", [ClusterInfo]), TemMaps = #{"node_id" => element(1, OnlineNode), "uuid" => element(2, OnlineNode), "device_id" => element(3, OnlineNode), "cluster_id" => element(4, OnlineNode), "cluster_name" => element(2, ClusterInfo), "create_time" => element(5, OnlineNode), "update_time" => element(6, OnlineNode), "create_by" => element(7, OnlineNode), "del_flag" => element(8, OnlineNode) %tableName,id,tableDesc,tableType,create_time,update_time,create_by,del_flag }, io:format("~p~n~n~n", [TemMaps]), [maps:to_list(TemMaps) | deviceOnlineList2Maps(T)]. %%根据节点名称查找id findNodeId(NodeName) -> F = fun() -> MatchHead = #device_info{uuid = '$1', node_id = '$2', _ = '_'}, Guard = [], Result = ['$$'], mnesia:select('device_info', [{MatchHead, Guard, Result}]) end, mnesia:transaction(F).