Enviar unha notificación ao equipo cando o estado do elemento de traballo se actualice na aplicación de exemplo Fitos
A aplicación de mostra Fitos para Microsoft Teams permite aos usuarios rastrexar o progreso da conclusión dos elementos de traballo en proxectos a través de fitos. Aínda que a aplicación permite actualizar e manter elementos de traballo, actualmente non hai notificacións estándar sobre as actualizacións de elementos de traballo para o equipo.
Neste artigo, aprenderemos a crear un fluxo de Power Automate para enviar unha notificación de tarxeta adaptativa ao equipo (no que está instalada a aplicación) cando o estado do elemento de traballo cambia.
Requisitos previos
Para completar este exercicio, precisaríamos a posibilidade de iniciar sesión en equipos que estarán dispoñibles como parte de determinadas subscricións a Microsoft 365 e tamén terán que ter o modelo de Fitos de Power Apps para equipos instalado. Esta aplicación pódese instalar desde https://aka.ms/TeamsInspection.
Iniciar sesión na aplicación Fitos
Seleccione a icona Power Apps á esquerda e vaia á pestana Compilación.
Seleccione o equipo no que está instalada a aplicación Fitos no menú esquerdo da aplicación.
Seleccione Aplicacións instaladas e seleccione Fitos para abrir a aplicación. A aplicación Fitos abrirase.
Engadir unha condición para chamar ao fluxo Power Automate
Na vista de árbore do panel esquerdo, seleccione a pantalla Proxectos.
Na pantalla, prema o botón Alt e seleccione para abrir calquera proxecto. Abrirase a pantalla Engadir/Editar elemento de traballo.
Seleccione o botón Listo.
Seleccione a propiedade OnSelect do botón feito.
Ao seleccionar o botón Feito, xunto coas outras actualizacións que se executan en segundo plano, tamén queremos desencadear un fluxo que enviaría unha actualización de tarxeta adaptativa ao equipo se se actualiza o estado do elemento de traballo. Para facer este cambio, engada o seguinte á parte superior da fórmula OnSelect:
If( locEditWorkItem, //adding code to call a flow when status changes If( locSelectedWorkItem.'Work Item Status'.'Project Work Item Status' \<\> cmbAddWorkItemStatus.Selected.'Project Work Item Status', true //your flow call will come here );Copie todo o código desde a propiedade OnSelect do botón Feito e pégueo nun editor de texto para usalo despois.
Seleccione ... (puntos suspensivos) xunto a Configuración na fita superior e seleccione Power Automate.
A ventá emerxente Datos ábrese coa opción de Crea un novo fluxo.
Seleccione o botón Crear un novo fluxo. Abrirase unha ventá do navegador coa nova pantalla do fluxo de Power Automate.
Actualice o nome do fluxo para - "Enviar unha notificación de tarxeta adaptativa cando cambie o estado do pedido de traballo".
Seleccione a opción para desencadear Power Apps na lista de disparadores. Crearase o novo fluxo e cargarase o paso Power Apps na pantalla.
Crear o fluxo Power Automate
Despois de seguir os pasos da sección anterior, seleccione o botón do paso + Novo.
Seleccione a acción Obter unha fila por ID e seleccione Nome da táboa como Elementos de traballo do proxecto.
En ID de fila, abra o contido dinámico e seleccione a opción Preguntar en Power Apps.
Cambie o nome do paso a "Obter un rexistro de traballo".
Seleccione o botón do paso +Seguinte de novo e seleccione a acción Obter unha fila por ID e seleccione Nome da táboa como Estatutos de elementos de traballo.
En ID de fila abra o contido dinámico e seleccione Estado do elemento de traballo (valor).
Cambie o nome do paso a Obter rexistro de estado do elemento de traballo.
Engada outro paso seleccionando +Novo paso.
Engada a variable Iniciar a acción.
Cambie o nome do paso para inicializar a variable - Título da tarxeta
Nome - "varCardTitle"
Tipo - "Cadea"
Valor = Actualización de estado para o elemento de traballo {e logo seleccione contido dinámico Nome do elemento de traballo engadido no paso 3}
Engada outro paso seleccionando +Novo paso.
Engada a variable Iniciar a acción.
- Cambie o nome do paso para iniciar a variable - Revisar ligazón
- Nome - "varReviewWorkItemLink"
- Tipo - "Cadea"
- Valor - deixar en branco - engadirase máis tarde.
Nota
Despois de engadir un novo paso, é posible que vexa un aviso no comprobador de fluxo. Espérase este aviso porque se chama o fluxo desde a aplicación Power Apps e engadindo un novo paso a un fluxo chamado desde unha aplicación Power Apps pode romper a conexión coa aplicación. Máis tarde no exercicio, substituiremos a conexión ao fluxo para solucionar este aviso.
Para a acción Revisar a ligazón do elemento de traballo, usaremos a ligazón á aplicación. Para atopar esta ligazón, abra o equipo onde está instalada a aplicación Fitos e copie a ligazón da pestana na que está instalada a aplicación. Pode copiar a ligazón á pestana abríndoa e seleccionando ... (puntos suspensivos) na esquina superior dereita.
O URL terá un aspecto similar ao seguinte: exemplo:
https://teams.microsoft.com/l/entity/GUID/_djb2_msteams_prefix_956529380?context=%7B%22subEntityId%22%3Anull%2C%22channelId%22%3A%2219%3AGUID%40thread.tacv2%22%7D&groupId=GUID&tenantId=GUIDPara continuar, copie a parte do URL que aparece despois de contexto= e use un descodificador de URL como https://www.urldecoder.org/ para descodificar o URL.
Copie ese texto descodificado e volva ao fluxo de Power Automate.
Volva á variable Inicializar- Revise a ligazón do elemento do traballo ste.
Estableza o campo Valor no texto URL descodificado copiado anteriormente.
Engada un novo paso coa acción Redactar, e no campo Entradas, pegue o seguinte fragmento.
replace(replace(replace(variables('varReviewWorkItemLink'),'{','%7B'),'"','%22'),'}','%7D')Engada outro paso seleccionando +Novo paso.
Seleccione a acción Publicar cartón adaptable nun chat ou nunha canle (versión preliminar).
Publicar como - usuario
Publicar en - Canle
Equipo - {o equipo no que está instalada a súa aplicación}
Canle - Xeral
Tarxeta adaptativa: pegue o seguinte código JSON:
Nota
O seguinte código JSON contén referencias dinámicas a valores de pasos de fluxo anteriores. Estes deberían resolverse automaticamente na referencia correcta, pero se non o fan, actualíceos manualmente coa referencia correcta. Por exemplo, @{outputs('Get_Work_Item_Status_record')?['body/msft_name']} fai referencia á columna de nome do paso Estado do elemento de traballo.
{ "type": "AdaptiveCard", "body": [ { "type": "TextBlock", "size": "large", "weight": "Bolder", "text": "Status Update for @{outputs('Get_Work_Item_record')?['body/msft_name']}", "wrap": true }, { "type": "TextBlock", "text": "Status for Work Item '@{outputs('Get_Work_Item_record')?['body/msft_name']}' has been updated to @{outputs('Get_Work_Item_Status_record')?['body/msft_name']}", "wrap": true } ], "actions": [ { "type": "Action.OpenUrl", "title": "View @{variables('varCardTitle')}", //Update the part of the following URL before "context=" with the URL copied in step 12. "url": "[https://teams.microsoft.com/l/entity/040880f4-0c68-4c38-8821-d5efd2b6ddbe/_djb2_msteams_prefix_956529380?context=@{outputs('Compose](https://teams.microsoft.com/l/entity/040880f4-0c68-4c38-8821-d5efd2b6ddbe/_djb2_msteams_prefix_956529380?context=@%7boutputs('Compose)')}" } ], "$schema": "<http://adaptivecards.io/schemas/adaptive-card.json>", "version": "1.2" }
Garde o fluxo.
Desencadear o fluxo desde Power Apps
Despois de gardar o fluxo, volva aos equipos e abra a aplicación en Power Apps.
Na vista de árbore, seleccione a pantalla Engadir/Editar elemento de traballo.
Seleccione o botón Actualizar.
Actualice a propiedade OnSelect para asegurarse de que o fluxo está desencadeado.
Copie a fórmula de onde a pegara anteriormente na propiedade OnSelect.
Na primeira condición If que se engadiu na parte superior, substitúa "true" pola función de execución usada para activar o disparador de fluxo. Vexa o exemplo a continuación.
If( locEditWorkItem, //adding code to call a flow when status changes If( locSelectedWorkItem.'Work Item Status'.'Project Work Item Status' \<\> cmbAddWorkItemStatus.Selected.'Project Work Item Status', SendAdaptivecardnotificationwhenthestatusoftheworkorderchanges.Run(locSelectedWorkItem.'Project Work item') //your flow call will come here ); //end code
Actualizar a pantalla de carga
Na vista de árbore, seleccione a Pantalla de carga.
Expanda a pantalla de carga e logo conLoading_HiddenHelper debaixo dela.
Seleccione o temporizador tmrLoadingDelay e seleccione a propiedade OnTimerEnd.
Se a aplicación se abre a través da ligazón da tarxeta adaptativa, debería abrir directamente o rexistro do elemento de traballo que se actualizou, o que significa que necesitaríamos un xeito de comprobar se se está pasando á identificación un elemento de traballo.
A fórmula da páxina de carga cómpre actualizarse para incluír o número de elemento de traballo, polo que necesitamos actualizar a propiedade OnTimerEnd ao seguinte:
If( gblAppLoaded,// && !IsBlankOrError(gblAppStyles), If( !IsBlank(Param("subEntityId")), //check if the parameter is blank or not If( //if the parameter is not blank, check if the user is on a mobile device or desktop/web and then populate the relevant variables and collections to make deep linking work (!IsBlank(Param("hostClientType")) && (Param("hostClientType") = "android" Or Param("hostClientType") = "ios")) || (IsBlank(Param("hostClientType")) && (Acceleration.X > 0 || Acceleration.Y > 0 || Acceleration.Z > 0)) Or tglAdmin_Mobile.Value, //project cover colors ClearCollect( colMobileProjectCoverColors, { Color: "#F4B9B9", Theme: "default", Base: "Color1" }, { Color: "#94BFFF", Theme: "default", Base: "Color2" }, { Color: "#E6F0FF", Theme: "default", Base: "Color3" }, { Color: "#5AC6CC", Theme: "default", Base: "Color4" }, { Color: "#C5E9EA", Theme: "default", Base: "Color5" }, { Color: "#F0F9FA", Theme: "default", Base: "Color6" }, { Color: "#EE6F99", Theme: "default", Base: "Color7" }, { Color: "#F495BF", Theme: "default", Base: "Color8" }, { Color: "#F4D2DC", Theme: "default", Base: "Color9" }, { Color: "#CEF0CD", Theme: "default", Base: "Color10" }, { Color: "#BDBDE6", Theme: "default", Base: "Color11" }, { Color: "#E2E2F6", Theme: "default", Base: "Color12" }, { Color: "#F4F4FC", Theme: "default", Base: "Color13" }, { Color: "#FBF6D9", Theme: "default", Base: "Color14" }, { Color: "#791818", Theme: "dark", Base: "Color1" }, { Color: "#053385", Theme: "dark", Base: "Color2" }, { Color: "#6264A7", Theme: "dark", Base: "Color3" }, { Color: "#002F31", Theme: "dark", Base: "Color4" }, { Color: "#025C5F", Theme: "dark", Base: "Color5" }, { Color: "#03787C", Theme: "dark", Base: "Color6" }, { Color: "#461525", Theme: "dark", Base: "Color7" }, { Color: "#CC3D6D", Theme: "dark", Base: "Color8" }, { Color: "#EA5788", Theme: "dark", Base: "Color9" }, { Color: "#043615", Theme: "dark", Base: "Color10" }, { Color: "#33344A", Theme: "dark", Base: "Color11" }, { Color: "#6264A7", Theme: "dark", Base: "Color12" }, { Color: "#464775", Theme: "dark", Base: "Color13" }, { Color: "#FFAA44", Theme: "dark", Base: "Color14" } ); //local table of character widths, used for auto width labels ClearCollect( colMobileCharsWidth, staticCharWidths ); //stock project cover images ClearCollect( colMobileStockImages, {appStockImage: Blank()}, {appStockImage: ProjectCover_Future}, {appStockImage: ProjectCover_Work}, {appStockImage: ProjectCover_Shapes}, {appStockImage: ProjectCover_Design}, {appStockImage: ProjectCover_Flow}, {appStockImage: ProjectCover_Abstract}, {appStockImage: ProjectCover_Mountain}, {appStockImage: ProjectCover_Vision}, {appStockImage: ProjectCover_DarkShapes}, {appStockImage: ProjectCover_Morning}, {appStockImage: ProjectCover_Sublime}, {appStockImage: ProjectCover_Tech}, {appStockImage: ProjectCover_Neon}, {appStockImage: ProjectCover_City} ); Set( gblMobileProject, LookUp( 'Project Work Items', 'Project Work item' = GUID(Param("subEntityId")) ).Project ); ClearCollect( colMobileWorkItems, Filter( 'Project Work Items', Project.Project = gblMobileProject.Project ) ); UpdateContext( { locMobileCompletionStatus: First( Sort( 'Project Work Item Statuses', Sequence, Ascending ) ) } ); Clear(colMobileWorkItemStatuses); ForAll( Sort( Filter( 'Project Work Item Statuses', 'Project Work Item Status' <> locMobileCompletionStatus.'Project Work Item Status' ), Sequence, Ascending ), Collect( colMobileWorkItemStatuses, { Name: ThisRecord.Name, Color: ThisRecord.Color, 'Color Dark': ThisRecord.'Color Dark', 'Project Work Item Status': ThisRecord.'Project Work Item Status', Sequence: ThisRecord.Sequence } ) ); Collect( colMobileWorkItemStatuses, { Name: locMobileCompletionStatus.Name, Color: locMobileCompletionStatus.Color, 'Color Dark': locMobileCompletionStatus.'Color Dark', 'Project Work Item Status': locMobileCompletionStatus.'Project Work Item Status', Sequence: locMobileCompletionStatus.Sequence } ); Navigate( 'Mobile Work Item Details Screen', ScreenTransition.None, { locMobileSelectedWorkItem: LookUp( 'Project Work Items', 'Project Work item' = GUID(Param("subEntityId")) ), locMobileShowWorkItemDetail: true, locMobileShowSearchWorkItem: false, locMobileNavToDetailFromAbout: true } ), Set( gblProject, LookUp( 'Project Work Items', 'Project Work item' = GUID(Param("subEntityId")) ).Project ); UpdateContext( { locCompletionStatus: First( Sort( 'Project Work Item Statuses', Sequence, Ascending ) ) } ); Clear(colWorkItemStatuses); ForAll( Sort( Filter( 'Project Work Item Statuses', 'Project Work Item Status' <> locCompletionStatus.'Project Work Item Status' ), Sequence, Ascending ), Collect( colWorkItemStatuses, { Name: ThisRecord.Name, Color: ThisRecord.Color, 'Color Dark': ThisRecord.'Color Dark', 'Project Work Item Status': ThisRecord.'Project Work Item Status', Sequence: ThisRecord.Sequence } ) ); Collect( colWorkItemStatuses, { Name: locCompletionStatus.Name, Color: locCompletionStatus.Color, 'Color Dark': locCompletionStatus.'Color Dark', 'Project Work Item Status': locCompletionStatus.'Project Work Item Status', Sequence: locCompletionStatus.Sequence } ); Navigate( 'Add/Edit Work Item', ScreenTransition.None, { locEditWorkItem: true, locSelectedWorkItem: LookUp( 'Project Work Items', 'Project Work item' = GUID(Param("subEntityId")) ), locAddProject: false, locExpandProjectList: true, locProjectSortOrder: true, locSortWorkItemBy: "eta", locShowSearchWorkItem: false, locAddWorkItem: false, locProjectStatusSelection: "Milestone status", locWorkItemSortOrder: true } ) ), If( //if the parameter is blank, check if the user is on a mobile device or desktop/web and redirect the user accordingly (!IsBlank(Param("hostClientType")) && (Param("hostClientType") = "android" Or Param("hostClientType") = "ios")) || (IsBlank(Param("hostClientType")) && Acceleration.X > 0) Or tglAdmin_Mobile.Value, Navigate( 'Mobile Projects Screen', ScreenTransition.None ), Navigate( 'Projects Screen', ScreenTransition.None, { locShowFirstRun: gblFirstRun, locShowPowerAppsPrompt: gblRecordUserSettings.'Display Splash (Power Apps)' = 'Display Splash (Power Apps) (Project User Settings)'.Yes } ) ) ) )
Publicar a aplicación Fitos
Completáronse todos os cambios na aplicación Fitos. A aplicación agora pódese publicar seleccionando o botón Publicar en Teams na parte superior dereita.
Probar o fluxo Power Automate
Vaia a Teams e abra a aplicación Fitos.
Abra un elemento de traballo existente e actualice o estado a un valor diferente.
Recíbese unha notificación de tarxeta adaptativa na canle de Teams onde está instalada a aplicación.
Consulte tamén
- Implementar aplicación de distribución ampla de exemplo de Fitos
- Personalizar a aplicación de exemplo Fitos
- Nocións acerca da arquitectura da aplicación de exemplo Fitos
- Personalizar as aplicacións de exemplo
- Preguntas máis frecuentes para as aplicacións de exemplo
- Usar aplicacións de exemplo da tenda de Microsoft Teams
Nota
Pode indicarnos as súas preferencias para o idioma da documentación? Realice unha enquisa breve. (teña en conta que esa enquisa está en inglés)
Esta enquisa durará sete minutos aproximadamente. Non se recompilarán datos persoais (declaración de privacidade).
Comentarios
Enviar e ver os comentarios