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

  1. Seleccione a icona Power Apps á esquerda e vaia á pestana Compilación.

  2. Seleccione o equipo no que está instalada a aplicación Fitos no menú esquerdo da aplicación.

  3. 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

  1. Na vista de árbore do panel esquerdo, seleccione a pantalla Proxectos.

  2. Na pantalla, prema o botón Alt e seleccione para abrir calquera proxecto. Abrirase a pantalla Engadir/Editar elemento de traballo.

  3. Seleccione o botón Listo.

  4. Seleccione a propiedade OnSelect do botón feito.

  5. 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
    
    ); 
    
  6. Copie todo o código desde a propiedade OnSelect do botón Feito e pégueo nun editor de texto para usalo despois.

  7. Seleccione ... (puntos suspensivos) xunto a Configuración na fita superior e seleccione Power Automate.

  8. A ventá emerxente Datos ábrese coa opción de Crea un novo fluxo.

  9. Seleccione o botón Crear un novo fluxo. Abrirase unha ventá do navegador coa nova pantalla do fluxo de Power Automate.

  10. Actualice o nome do fluxo para - "Enviar unha notificación de tarxeta adaptativa cando cambie o estado do pedido de traballo".

  11. 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

  1. Despois de seguir os pasos da sección anterior, seleccione o botón do paso + Novo.

  2. Seleccione a acción Obter unha fila por ID e seleccione Nome da táboa como Elementos de traballo do proxecto.

  3. En ID de fila, abra o contido dinámico e seleccione a opción Preguntar en Power Apps.

  4. Cambie o nome do paso a "Obter un rexistro de traballo".

  5. 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.

  6. En ID de fila abra o contido dinámico e seleccione Estado do elemento de traballo (valor).

  7. Cambie o nome do paso a Obter rexistro de estado do elemento de traballo.

  8. Engada outro paso seleccionando +Novo paso.

  9. 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}

  10. Engada outro paso seleccionando +Novo paso.

  11. 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.

  12. 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=GUID

  13. Para 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.

  14. Copie ese texto descodificado e volva ao fluxo de Power Automate.

  15. Volva á variable Inicializar- Revise a ligazón do elemento do traballo ste.

  16. Estableza o campo Valor no texto URL descodificado copiado anteriormente.

  17. Engada un novo paso coa acción Redactar, e no campo Entradas, pegue o seguinte fragmento.

    replace(replace(replace(variables('varReviewWorkItemLink'),'{','%7B'),'"','%22'),'}','%7D')
    
  18. Engada outro paso seleccionando +Novo paso.

  19. 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"
      
             }
      
  20. Garde o fluxo.

Desencadear o fluxo desde Power Apps

  1. Despois de gardar o fluxo, volva aos equipos e abra a aplicación en Power Apps.

  2. Na vista de árbore, seleccione a pantalla Engadir/Editar elemento de traballo.

  3. Seleccione o botón Actualizar.

  4. Actualice a propiedade OnSelect para asegurarse de que o fluxo está desencadeado.

  5. Copie a fórmula de onde a pegara anteriormente na propiedade OnSelect.

  6. 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

  1. Na vista de árbore, seleccione a Pantalla de carga.

  2. Expanda a pantalla de carga e logo conLoading_HiddenHelper debaixo dela.

  3. Seleccione o temporizador tmrLoadingDelay e seleccione a propiedade OnTimerEnd.

  4. 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.

  5. 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

  1. Vaia a Teams e abra a aplicación Fitos.

  2. Abra un elemento de traballo existente e actualice o estado a un valor diferente.

  3. Recíbese unha notificación de tarxeta adaptativa na canle de Teams onde está instalada a aplicación.

Consulte tamén

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).