simple terminal
This commit is contained in:
parent
2e2b0cab8b
commit
2794fe393d
@ -17,12 +17,10 @@
|
|||||||
handle_request("POST", "/terminal/create", _, TerminalInfo) ->
|
handle_request("POST", "/terminal/create", _, TerminalInfo) ->
|
||||||
lager:debug("[terminal_handler] create post params: ~p", [TerminalInfo]),
|
lager:debug("[terminal_handler] create post params: ~p", [TerminalInfo]),
|
||||||
|
|
||||||
case valid_terminal_info(TerminalInfo) of
|
case convert_terminal_info(TerminalInfo) of
|
||||||
true ->
|
{ok, Terminal} ->
|
||||||
TerminalId = id_generator_model:new_terminal_id(),
|
TerminalId = terminal_model:next_id(),
|
||||||
Terminal = convert_terminal_info(TerminalId, TerminalInfo),
|
case terminal_model:add_terminal(Terminal#terminal{terminal_id = TerminalId}) of
|
||||||
|
|
||||||
case terminal_model:add_terminal(Terminal) of
|
|
||||||
ok ->
|
ok ->
|
||||||
{ok, 200, iot_util:json_data(TerminalId)};
|
{ok, 200, iot_util:json_data(TerminalId)};
|
||||||
{error, Reason} when is_binary(Reason) ->
|
{error, Reason} when is_binary(Reason) ->
|
||||||
@ -31,8 +29,7 @@ handle_request("POST", "/terminal/create", _, TerminalInfo) ->
|
|||||||
{error, Reason} when is_binary(Reason) ->
|
{error, Reason} when is_binary(Reason) ->
|
||||||
{ok, 200, iot_util:json_error(-1, <<"database error">>)}
|
{ok, 200, iot_util:json_error(-1, <<"database error">>)}
|
||||||
end;
|
end;
|
||||||
false ->
|
{error, Error} ->
|
||||||
Error = terminal_error(TerminalInfo),
|
|
||||||
{ok, 200, iot_util:json_error(-1, Error)}
|
{ok, 200, iot_util:json_error(-1, Error)}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -40,35 +37,29 @@ handle_request("POST", "/terminal/create", _, TerminalInfo) ->
|
|||||||
handle_request("POST", "/terminal/batch_import", _, TerminalInfos) ->
|
handle_request("POST", "/terminal/batch_import", _, TerminalInfos) ->
|
||||||
lager:debug("[terminal_handler] batch_import post params: ~p", [TerminalInfos]),
|
lager:debug("[terminal_handler] batch_import post params: ~p", [TerminalInfos]),
|
||||||
|
|
||||||
%% serial_number是必填项
|
{SuccessList, FailedList} = lists:foldl(fun(TerminalInfo, {SuccessList0, FailedList0}) ->
|
||||||
case lists:any(fun(Info) -> not is_map_key(<<"serial_number">>, Info) orelse maps:get(<<"serial_number">>, Info) == <<"">> end, TerminalInfos) of
|
case convert_terminal_info(TerminalInfo) of
|
||||||
true ->
|
{ok, Terminal = #terminal{serial_number = SerialNumber}} ->
|
||||||
{ok, 200, iot_util:json_error(-1, <<"serial_number missed">>)};
|
TerminalId = terminal_model:next_id(),
|
||||||
false ->
|
case terminal_model:add_terminal(Terminal#terminal{terminal_id = TerminalId}) of
|
||||||
case lists:all(fun valid_terminal_info/1, TerminalInfos) of
|
|
||||||
true ->
|
|
||||||
ImportResult = lists:map(fun(TerminalInfo = #{<<"serial_number">> := SerialNumber}) ->
|
|
||||||
TerminalId = id_generator_model:new_terminal_id(),
|
|
||||||
Terminal = convert_terminal_info(TerminalId, TerminalInfo),
|
|
||||||
case terminal_model:add_terminal(Terminal) of
|
|
||||||
ok ->
|
ok ->
|
||||||
{SerialNumber, TerminalId};
|
SuccessItem = #{<<"serial_number">> => SerialNumber, <<"terminal_id">> => TerminalId},
|
||||||
|
{[SuccessItem|SuccessList0], FailedList0};
|
||||||
{error, Reason} when is_binary(Reason) ->
|
{error, Reason} when is_binary(Reason) ->
|
||||||
lager:debug("[host_handler] add_host get error: ~p", [Reason]),
|
ErrorItem = maps:put(<<"error_message">>, Reason, TerminalInfo),
|
||||||
{SerialNumber, Reason};
|
{SuccessList0, [ErrorItem|FailedList0]}
|
||||||
|
end;
|
||||||
{error, Reason} ->
|
{error, Reason} ->
|
||||||
{SerialNumber, <<"failed">>}
|
ErrorItem = maps:put(<<"error_message">>, Reason, TerminalInfo),
|
||||||
|
{SuccessList0, [ErrorItem|FailedList0]}
|
||||||
end
|
end
|
||||||
end, TerminalInfos),
|
end, {[], []}, TerminalInfos),
|
||||||
|
ImportResult = #{
|
||||||
|
<<"success_list">> => lists:reverse(SuccessList),
|
||||||
|
<<"failed_list">> => lists:reverse(FailedList)
|
||||||
|
},
|
||||||
|
|
||||||
{ok, 200, iot_util:json_data(ImportResult)};
|
{ok, 200, iot_util:json_data(ImportResult)};
|
||||||
false ->
|
|
||||||
%% 反馈错误信息
|
|
||||||
InvalidTerminalInfos = lists:filter(fun(Info) -> not valid_terminal_info(Info) end, TerminalInfos),
|
|
||||||
ErrorInfos = lists:map(fun(Info = #{<<"serial_number">> := SerialNumber}) -> {SerialNumber, terminal_error(Info)} end, InvalidTerminalInfos),
|
|
||||||
{ok, 200, iot_util:json_error(-1, maps:from_list(ErrorInfos))}
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
|
|
||||||
%% 获取终端的统计信息
|
%% 获取终端的统计信息
|
||||||
handle_request("GET", "/terminal/stat", _, _) ->
|
handle_request("GET", "/terminal/stat", _, _) ->
|
||||||
@ -161,46 +152,58 @@ handle_request(_, Path, _, _) ->
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
%% 将map转换成record
|
%% 将map转换成record
|
||||||
convert_terminal_info(TerminalId, TerminalInfo) when is_integer(TerminalId), is_map(TerminalInfo) ->
|
convert_terminal_info(#{<<"host_id">> := HostId, <<"serial_number">> := SerialNumber, <<"name">> := Name, <<"code">> := Code, <<"access_protocol">> := AccessProtocol,
|
||||||
#terminal{
|
<<"product_id">> := ProductId, <<"vendor_id">> := VendorId, <<"model">> := Model, <<"cell_id">> := CellId}) ->
|
||||||
terminal_id = TerminalId,
|
|
||||||
|
CheckResult = if
|
||||||
|
Name == <<>> ->
|
||||||
|
{error, <<"name is empty">>};
|
||||||
|
HostId == <<>> ->
|
||||||
|
{error, <<"host_id is empty">>};
|
||||||
|
SerialNumber == <<>> ->
|
||||||
|
{error, <<"serial_number is empty">>};
|
||||||
|
Code == <<>> ->
|
||||||
|
{error, <<"code is empty">>};
|
||||||
|
AccessProtocol == <<>> ->
|
||||||
|
{error, <<"access_protocol is empty">>};
|
||||||
|
Model == <<>> ->
|
||||||
|
{error, <<"model is empty">>};
|
||||||
|
not is_integer(ProductId) orelse ProductId < 0 ->
|
||||||
|
{error, <<"product_id is error">>};
|
||||||
|
not is_integer(VendorId) orelse VendorId < 0 ->
|
||||||
|
{error, <<"vendor_id is error">>};
|
||||||
|
not is_integer(CellId) orelse CellId < 0 ->
|
||||||
|
{error, <<"cell_id is error">>};
|
||||||
|
true ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
|
|
||||||
|
case CheckResult of
|
||||||
|
ok ->
|
||||||
|
{ok, #terminal{
|
||||||
%% 关联主机
|
%% 关联主机
|
||||||
host_id = maps:get(<<"host_id">>, TerminalInfo, <<"">>),
|
host_id = HostId,
|
||||||
%% 序列号
|
%% 序列号
|
||||||
serial_number = maps:get(<<"serial_number">>, TerminalInfo, <<"">>),
|
serial_number = SerialNumber,
|
||||||
%% 名称
|
%% 名称
|
||||||
name = maps:get(<<"name">>, TerminalInfo, <<"">>),
|
name = Name,
|
||||||
%% 设备编码
|
%% 设备编码
|
||||||
code = maps:get(<<"code">>, TerminalInfo, <<"">>),
|
code = Code,
|
||||||
%% 接入协议
|
%% 接入协议
|
||||||
access_protocol = maps:get(<<"access_protocol">>, TerminalInfo, <<"">>),
|
access_protocol = AccessProtocol,
|
||||||
%% 产品ID,枚举类型
|
%% 产品ID,枚举类型
|
||||||
product_id = maps:get(<<"product_id">>, TerminalInfo, 0),
|
product_id = ProductId,
|
||||||
%% 厂商ID,枚举类型
|
%% 厂商ID,枚举类型
|
||||||
vendor_id = maps:get(<<"vendor_id">>, TerminalInfo, 0),
|
vendor_id = VendorId,
|
||||||
%% 型号
|
%% 型号
|
||||||
model = maps:get(<<"model">>, TerminalInfo, <<"">>),
|
model = Model,
|
||||||
%% 所在单元ID,管理系统负责
|
%% 所在单元ID
|
||||||
cell_id = maps:get(<<"cell_id">>, TerminalInfo, 0),
|
cell_id = CellId,
|
||||||
%% 终端状态
|
%% 终端状态
|
||||||
status = ?TERMINAL_STATUS_OFFLINE,
|
status = ?TERMINAL_STATUS_OFFLINE,
|
||||||
%% 最后上线时间
|
%% 最后上线时间
|
||||||
update_ts = 0
|
update_ts = iot_util:timestamp()
|
||||||
}.
|
}};
|
||||||
|
{error, Reason} ->
|
||||||
%% 检查是否是合法的主机信息
|
{error, Reason}
|
||||||
valid_terminal_info(#{<<"name">> := Name, <<"model">> := Model, <<"cell_id">> := CellId, <<"serial_number">> := SerialNumber}) ->
|
|
||||||
Name =/= <<"">> andalso Model =/= <<"">> andalso CellId > 0 andalso SerialNumber =/= <<"">>.
|
|
||||||
|
|
||||||
%% 获取错误信息
|
|
||||||
terminal_error(M) when is_map(M) ->
|
|
||||||
if
|
|
||||||
not is_map_key(<<"name">>, M) orelse map_get(<<"name">>, M) == <<>> ->
|
|
||||||
<<"name is empty">>;
|
|
||||||
not is_map_key(<<"model">>, M) orelse map_get(<<"model">>, M) == <<>> ->
|
|
||||||
<<"model is empty">>;
|
|
||||||
not is_map_key(<<"serial_number">>, M) orelse map_get(<<"serial_number">>, M) == <<>> ->
|
|
||||||
<<"serial_number is empty">>;
|
|
||||||
true ->
|
|
||||||
<<"unknown error">>
|
|
||||||
end.
|
end.
|
||||||
@ -14,9 +14,15 @@
|
|||||||
-define(TAB_NAME, terminal).
|
-define(TAB_NAME, terminal).
|
||||||
|
|
||||||
%% API
|
%% API
|
||||||
|
-export([next_id/0]).
|
||||||
-export([get_terminal/1, get_all_terminals/0, get_host_terminals/1, find_terminals/3, get_stat/0, table_size/0, match_spec/1]).
|
-export([get_terminal/1, get_all_terminals/0, get_host_terminals/1, find_terminals/3, get_stat/0, table_size/0, match_spec/1]).
|
||||||
-export([change_status/2, delete/1, to_map/1, add_terminal/1, update_terminal/2]).
|
-export([change_status/2, delete/1, to_map/1, add_terminal/1, update_terminal/2]).
|
||||||
|
|
||||||
|
%% 生成信息的id信息
|
||||||
|
-spec next_id() -> Id :: integer().
|
||||||
|
next_id() ->
|
||||||
|
id_generator_model:new_terminal_id().
|
||||||
|
|
||||||
-spec get_terminal(TerminalId :: integer()) -> {ok, #terminal{}} | undefined.
|
-spec get_terminal(TerminalId :: integer()) -> {ok, #terminal{}} | undefined.
|
||||||
get_terminal(TerminalId) when is_integer(TerminalId) ->
|
get_terminal(TerminalId) when is_integer(TerminalId) ->
|
||||||
case mnesia:dirty_read(?TAB_NAME, TerminalId) of
|
case mnesia:dirty_read(?TAB_NAME, TerminalId) of
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user