Domanda

Il mio elenco attività contiene i seguenti campi

1) Data di inizio
2) Data di scadenza
3) Sondaggio inviato da

Attraverso i flussi di lavoro di Visual Studio desidero ottenere lo scenario seguente.Qualcuno può darmi un'idea di quali azioni dovrei usare.

Nota:Qui l'attività è già assegnata nell'elenco delle attività.All'attivazione del flusso di lavoro devo recuperare l'elemento Attività, inviare un'e-mail ed eseguire nuovamente il passaggio seguente.

  1. Invia un'e-mail al sondaggio inviato da (utente) quando l'attività viene creata.

  2. Invia un'e-mail al sondaggio inviato da (utente) quando manca una settimana alla data di scadenza dell'attività (se l'attività non è stata completata)

  3. Invia un'e-mail al sondaggio inviato da (utente) quando mancano due giorni alla scadenza dell'attività (se l'attività non è stata completata)

  4. Invia un'e-mail al sondaggio inviato da (utente) alla data di scadenza (se l'attività non è stata completata)

  5. Contrassegna l'attività come "Non completata" e rimuovi le autorizzazioni dell'indagine inviata da (utente) quando l'attività ha superato la data di scadenza e non è stata completata


Di seguito è riportato lo scenario che ho provato.

Progettista del flusso di lavoro:Workflow sampleCodice attivato dal flusso di lavoro:

  private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
        {
            try
            {


                CurrentDate = String.Format("{0:MM/dd/yyyy}", CTDate);
                SPListItem CurrentWorkflowitem = onWorkflowActivated1.WorkflowProperties.Item;
                _ItemListDuedate = DateTime.Parse(Convert.ToString(CurrentWorkflowitem["Due Date"]));
                _ItemSurveySubmittedBy = Convert.ToString(CurrentWorkflowitem["Survey Submitted By"]);
                _ItemStatus = Convert.ToString(workflowProperties.Item["Status"]);
                SPFieldUserValue SubmitteduserValue = new SPFieldUserValue(CurrentWorkflowitem.Web, _ItemSurveySubmittedBy);
                SubmittedUserLastName = SubmitteduserValue.User.Name.Split(',').LastOrDefault();
                SubmittedUserEmail = SubmitteduserValue.User.Email;              
            }

            catch (Exception ex)
            {

                SendEmailToAdmin(ex.Message);
            }

        }

LOOP DI STATO DEL FLUSSO DI LAVORO:

private void WorkflowStatus_Loop(object sender, ConditionalEventArgs e)
        {
           bool workflowstatus= CompareCurrentDate_DueDate(_ItemStatus, _ItemListDuedate);
           if (workflowstatus)
           {
               e.Result = true;
           }
 private bool CompareCurrentDate_DueDate(String CurrentStatus, DateTime ListDuedate)
        {
            try
            {
                if (CurrentStatus != "Completed")
                {
                    CTDate = DateTime.Parse(Convert.ToString(DateTime.Now));
                    int Cmin = CTDate.Minute;
                    int Listmin = ListDuedate.Minute;
                    diff = Cmin - Listmin;
                    //TimeSpan age = ListDueDate.Subtract(CTDate);
                    // diff = Convert.ToInt32(age.Days);
                    if (diff > 48)
                    {
                        datechk = false;

                    }
                }
                else
                {
                    datechk = false;
                }

            }
            catch (Exception ex)
            {
                datechk = false;
                SendEmailToAdmin(ex.Message);

            }
            return datechk;
        }}

Code to check Status 
 private void codeToCheckStatus_Initial(object sender, EventArgs e)
        {
            try
            {


                String Duedate = String.Format("{0:MM/dd/yyyy}", _ItemListDuedate);
                Remainder1 = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["Remainder1"];
                Remainder2 = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["Remainder2"];
                Remainder3 = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["Remainder3"];
                InitialMail = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["InitialMail"];

                if (InitialMail == true)
                {
                    Email_Body = "Please complete the below survey before the Due date has completed. ";
                    Email_Subject = "Survey Task with Title " + onWorkflowActivated1.WorkflowProperties.Item.Title + "has been assigned";
                    HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
                    SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
                    updatelist("InitialMail", false);
                }
                if (diff == 41 && Remainder1 == true)
                {
                    Email_Subject = "Week Remainder Email for the Task " + workflowProperties.Item.Title;
                    Email_Body = "The Task is due kindly act on it";
                    HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
                    SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
                    updatelist("Remainder1", false);

                }
                if (diff == 44 && Remainder2 == true)
                {
                    Email_Subject = "Two Day Remainder Email for the Task " + workflowProperties.Item.Title;
                    Email_Body = "The Task is due kindly act on it";
                    HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
                    SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
                    updatelist("Remainder2", false);

                }
                if (diff == 45 && Remainder3 == true)
                {

                    Email_Subject = "Same Day Remainder Email for the Task " + workflowProperties.Item.Title;
                    Email_Body = "The Task has been update as completed and you dont have permissions for the same";
                    HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
                    SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
                    //SPListItem wfitem = workflowProperties.Item;
                    //wfitem["Remainder3"] = false;
                    //wfitem["Status"] = "Completed";
                    //SPRoleAssignmentCollection SPRoleAssColn = wfitem.RoleAssignments;
                    //for (int i = SPRoleAssColn.Count - 1; i >= 0; i--)
                    //{
                    //    SPRoleAssignment roleAssign = SPRoleAssColn[i];
                    //    SPRoleAssColn.Remove(i);
                    //}
                    //wfitem.Update();

                    updatelist("Remainder3", false);

                    SPListItem wfitem = workflowProperties.Item;
                    wfitem["Status"] = "Completed";
                    wfitem.SystemUpdate();
                }
            }
            catch (Exception ex)
            {
               // datechk = false;
                SendEmailToAdmin(ex.Message);

            }

        }
        private void updatelist(string field, Boolean value)
        {
            SPListItem wfitem = workflowProperties.Item;
            wfitem[field] = value;
            wfitem.SystemUpdate();
        }

Ho provato con il flusso di lavoro Designer Reusable.In allegato è il mio flusso di lavoro Designer.Come indicato di seguito, non possiamo ottenere la colonna di stato aggiornata quando utilizziamo flussi di lavoro riutilizzabili.Quando ho utilizzato Titolo, il flusso di lavoro funziona correttamente

Designer Workflow

È stato utile?

Soluzione 3

Sono stato in grado di ottenere questo risultato creando una colonna calcolata con lo stato modificato.Durante questo periodo sto ritardando il flusso di lavoro di 2 giorni nel flusso di lavoro.

In questo momento sto controllando questa colonna calcolata con l'elemento corrente.Se lo stato è completato, terminerò il flusso di lavoro.

Altri suggerimenti

Se capisci la tua query, probabilmente puoi utilizzare un processo timer personalizzato che eseguirà l'iterazione di tutte le attività aperte e in base alla logica personalizzata invierà e-mail agli utenti specifici.Puoi inviare e-mail tramite SPUtlity. Invia e-mail e puoi anche terminare il flusso di lavoro in modo programmatico da questo/

Questa è solo un'altra soluzione al tuo problema.

So che non è una soluzione VS, ma utilizzo esattamente quel tipo di scenari Pianificatore del flusso di lavoro HarePoint.
È gratuito per uso commerciale ed è anche estremamente facile da usare.

Quello che devi fare è creare un semplice flusso di lavoro in SharePoint Designer che controlli se Oggi è il giorno richiesto (ad esempio DueDate-2).
Se sì, fai tutto ciò che è necessario fare, altrimenti interrompi il flusso di lavoro.
E pianifica questo flusso di lavoro in HarePoint in modo che venga eseguito una volta al giorno all'una di notte (ad esempio).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top