feat: init_inspection

This commit is contained in:
dawnwinterLiu 2022-09-22 12:01:33 +08:00
parent 715952ca63
commit 39320e128f
2 changed files with 64 additions and 1 deletions

View File

@ -119,6 +119,7 @@ init(?TYPE, ChannelId, #{<<"offline">> := OffLine} = Args) ->
dgiot_parse_hook:subscribe(<<"Product/*">>, put, ChannelId), dgiot_parse_hook:subscribe(<<"Product/*">>, put, ChannelId),
dgiot_parse_hook:subscribe(<<"Product/*">>, delete, ChannelId), dgiot_parse_hook:subscribe(<<"Product/*">>, delete, ChannelId),
dgiot_parse_hook:subscribe(<<"Channel/*">>, delete, ChannelId), dgiot_parse_hook:subscribe(<<"Channel/*">>, delete, ChannelId),
dgiot_parse_hook:subscribe(<<"Maintenance">>, post, ChannelId),
{ok, State, []}. {ok, State, []}.
handle_init(#state{env = #{<<"checktime">> := CheckTime}} = State) -> handle_init(#state{env = #{<<"checktime">> := CheckTime}} = State) ->
@ -135,7 +136,6 @@ handle_message(check, #state{id = ChannelId, env = #{<<"offline">> := OffLine, <
dgiot_device:sync_parse(OffLine), dgiot_device:sync_parse(OffLine),
{ok, State}; {ok, State};
handle_message({sync_parse, Pid, 'after', get, Token, <<"Device">>, #{<<"results">> := Results} = ResBody}, State) -> handle_message({sync_parse, Pid, 'after', get, Token, <<"Device">>, #{<<"results">> := Results} = ResBody}, State) ->
SessionToken = dgiot_parse_auth:get_usersession(dgiot_utils:to_binary(Token)), SessionToken = dgiot_parse_auth:get_usersession(dgiot_utils:to_binary(Token)),
Cookie = case dgiot_parse_auth:get_cookie(SessionToken) of Cookie = case dgiot_parse_auth:get_cookie(SessionToken) of
@ -262,6 +262,10 @@ handle_message({sync_parse, _Pid, 'before', delete, _Token, <<"Channel">>, Objec
end, end,
{ok, State}; {ok, State};
handle_message({sync_parse, _Pid, 'after', post, _Token, <<"Maintenance">>, QueryData}, State) ->
dgiot_product:init_inspection(QueryData),
{ok, State};
handle_message({update_schemas_json}, State) -> handle_message({update_schemas_json}, State) ->
%% %%
dgiot_parse:update_schemas_json(), dgiot_parse:update_schemas_json(),

View File

@ -25,6 +25,7 @@
-export([create_product/1, create_product/2, add_product_relation/2, delete_product_relation/1]). -export([create_product/1, create_product/2, add_product_relation/2, delete_product_relation/1]).
-export([get_prop/1, get_props/1, get_props/2, get_unit/1, do_td_message/1, update_properties/2, update_properties/0]). -export([get_prop/1, get_props/1, get_props/2, get_unit/1, do_td_message/1, update_properties/2, update_properties/0]).
-export([update_topics/0, update_product_filed/1]). -export([update_topics/0, update_product_filed/1]).
-export([get_initdata/2, init_inspection/1, get_inspection/1]).
-export([save_keys/1, get_keys/1, get_control/1, save_control/1, save_channel/1, save_tdchannel/1, save_taskchannel/1, get_channel/1, get_tdchannel/1, get_taskchannel/1, get_interval/1]). -export([save_keys/1, get_keys/1, get_control/1, save_control/1, save_channel/1, save_tdchannel/1, save_taskchannel/1, get_channel/1, get_tdchannel/1, get_taskchannel/1, get_interval/1]).
-type(result() :: any()). %% todo -type(result() :: any()). %% todo
@ -474,3 +475,61 @@ get_props(ProductId, Keys) ->
do_td_message(ProfuctId) -> do_td_message(ProfuctId) ->
ChannelId = dgiot_parse_id:get_channelid(dgiot_utils:to_binary(?BRIDGE_CHL), <<"TD">>, <<"TD资源通道"/utf8>>), ChannelId = dgiot_parse_id:get_channelid(dgiot_utils:to_binary(?BRIDGE_CHL), <<"TD">>, <<"TD资源通道"/utf8>>),
dgiot_channelx:do_message(ChannelId, {sync_product, <<"Product">>, ProfuctId}). dgiot_channelx:do_message(ChannelId, {sync_product, <<"Product">>, ProfuctId}).
get_initdata(Type, ProductId) ->
case dgiot_product:lookup_prod(ProductId) of
{ok, #{<<"thing">> := #{<<"properties">> := Props}}} ->
lists:foldl(fun(#{<<"devicetype">> := Devicetype, <<"name">> := Name,
<<"identifier">> := Identifier} = X, Acc) ->
DataType = maps:get(<<"datatype">>, X, #{}),
Typea = maps:get(<<"type">>, X, <<>>),
Specs = maps:get(<<"specs">>, DataType, #{}),
Unit = maps:get(<<"unit">>, Specs, <<"">>),
Size = size(Type),
case binary:match(Devicetype, Type) of
{0, Size} ->
Acc ++ [#{
<<"devicetype">> => Devicetype,
<<"identifier">> => Identifier, <<"name">> => Name,
<<"type">> => Typea, <<"number">> => <<>>,
<<"unit">> => Unit}];
_O ->
Acc
end
end, [], Props);
_ ->
[]
end.
%%
init_inspection(#{<<"objectId">> := MaintenanceId, <<"info">> := Info, <<"product">> := #{<<"objectId">> := ProductId}, <<"device">> := #{<<"objectId">> := DeviceId}} = _QueryData) ->
InitData = get_initdata(<<"巡检"/utf8>>, ProductId),
dgiot_parse:update_object(<<"Maintenance">>, MaintenanceId, #{<<"info">> => Info#{<<"dynamicdata">> => InitData}}),
%%
%% $dg/device/{productId}/{deviceAddr}/init/response/inspection
case dgiot_device:lookup(DeviceId) of
{ok, #{<<"devaddr">> := DevAddr}} ->
InspectionTopic = <<"$dg/device/", ProductId/binary, "/", DevAddr/binary, "/init/response/inspection">>,
Data = get_inspection(DeviceId),
dgiot_mqtt:publish(DeviceId, InspectionTopic, jsx:encode(Data));
_ ->
pass
end.
get_inspection(DeviceId) ->
Where = #{
<<"where">> => #{
<<"device">> => DeviceId
},
<<"keys">> => [<<"number">>, <<"status">>, <<"info">>],
<<"order">> => <<"-createdAt">>
},
case dgiot_parse:query_object(<<"Maintenance">>, Where) of
{ok, #{<<"results">> := Results}} ->
lists:foldl(fun(_X, Acc) ->
Acc++[]
end, [], Results);
_ ->
[]
end.