Pregunta

Mi lista de tareas tiene los siguientes campos

1) fecha de inicio
2) Fecha de vencimiento
3) Encuesta presentada por

A través de los flujos de trabajo de Visual Studio, quiero lograr el siguiente escenario. ¿Alguien puede darme una idea de qué acciones debo usar?

NOTA: Aquí la tarea ya está asignada en la lista de tareas. En el flujo de trabajo activado, necesito buscar el elemento de la tarea y enviar un correo electrónico y hacer el siguiente paso nuevamente.

  1. Envíe un correo electrónico a la encuesta enviada por (usuario) cuando se crea la tarea.

  2. Envíe un correo electrónico a la encuesta enviada por (usuario) cuando la tarea sea una semana a partir de la fecha de vencimiento (si la tarea no se completa)

  3. Envíe un correo electrónico a la encuesta enviada por (usuario) cuando la tarea sea dos días a partir de la fecha de vencimiento (si la tarea no se completa)

  4. Envíe un correo electrónico a la encuesta enviada por (usuario) en la fecha de vencimiento (si la tarea no se completa)

  5. Marque la tarea como "no completada" y elimine la encuesta enviada por los permisos (usuario) cuando la tarea ha pasado la fecha de vencimiento y no se complete


    a continuación es el escenario que probé.

    Diseñador de flujo de trabajo: muestra de flujo de trabajo OnWorkFlowActivatedCode:

      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);
                }
    
            }
    

    Bucle de estado del flujo de trabajo:

    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();
            }
    

    Intenté con el flujo de trabajo reutilizable de diseñador. Adjunto es mi flujo de trabajo de diseñador. Como se indicó a continuación, no podemos obtener la columna de estado actualizada cuando vamos para flujos de trabajo reutilizables. Cuando utilicé el título, el flujo de trabajo está funcionando bien

    Diseñador de flujo de trabajo

¿Fue útil?

Solución 3

I was able to achieve this by creating a calculated column which has the status modified. During this time I am delaying the workflow for 2 days in the workflow.

At this time I am checking this calculated column with current item. If status is completed I am ending the workflow.

Otros consejos

If a understand you query, You can probably use some custom timer job which will iterate through all the open tasks and based on your custom logic it will send emails to the specific users. You can send email by SPUtlity.Send email and you can even end the workflow programatically from this/

This is only a another solution to your problem.

I know it's not VS solution, but for exactly that kind of scenarios I use HarePoint Workflow Scheduler.
It's free for commercial use and extremely easy to use as well.

What you need to do is to create a simple workflow in SharePoint Designer that checks if Today is the day you require (for example DueDate-2).
If yes, do whatever needs to be done, if not then stop the workflow.
And schedule this workflow in HarePoint to be run once a day at 1am (for example).

Licenciado bajo: CC-BY-SA con atribución
scroll top