Files
number_zj/20220330_Vote/Ewide.RoadFlow/Serivce/FlowRun/FlowRunService.cs
2022-03-30 17:54:33 +08:00

3362 lines
167 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Ewide.Core;
using Ewide.RoadFlowLite.Utility;
using Furion;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using RoadFlow.Data;
using RoadFlow.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.RoadFlowLite.Serivce.FlowRun
{
[Route("/api/roadflow/FlowRun/")]
[ApiDescriptionSettings("RoadFlow")]
public class FlowRunService : IFlowRunService, IDynamicApiController, ITransient
{
private readonly IUserManager _userManager;
private readonly IDictionary _dictionary;
private readonly IApplibrary _appLibrary;
private readonly IFlowTask _flowTask;
private readonly IFlow _flow;
private readonly IUserDummy _userDummy;
private readonly IFlowButton _flowButton;
private readonly IFlowComment _flowComment;
private readonly IForm _form;
private readonly ILog _log;
private readonly IFlowDynamic _dynamic;
private readonly IFlowArchive _flowArchive;
private readonly IOrganize _organize;
private readonly IProgram _program;
public FlowRunService(
IUserManager userManager,
IDictionary dictionary,
IApplibrary appLibrary,
IFlow flow,
IFlowTask flowTask,
IUserDummy userDummy,
IFlowButton flowButton,
IFlowComment flowComment,
IForm form,
ILog log,
IFlowDynamic dynam,
IFlowArchive flowArchive,
IOrganize organize,
IProgram program
)
{
_userManager = userManager;
_dictionary = dictionary;
_appLibrary = appLibrary;
_flow = flow;
_flowTask = flowTask;
_userDummy = userDummy;
_flowButton = flowButton;
_flowComment = flowComment;
_form = form;
_log = log;
_dynamic = dynam;
_flowArchive = flowArchive;
_organize = organize;
_program = program;
}
[HttpGet("hello")]
[AllowAnonymous]
public dynamic Hello()
{
string hello = "hello".DESEncrypt();
return hello + ":" + hello.DESDecrypt();
}
#region
/// <summary>
/// 得到可以发起的流程
/// </summary>
/// <returns></returns>
[HttpGet("GetStartFlows")]
[AllowAnonymous]
public dynamic GetStartFlows(string keyWord)
{
//string keyWord = args.GetJsonValue("keyword");//搜索关键字
string userId = _userManager.UserId;
var types = _dictionary.GetAllChilds("system_applibrarytype_flow", true);
var allFlows = _flow.GetStartFlows(userId);
var flows = !keyWord.IsNullOrWhiteSpace() ? allFlows.Where(p => p.Name.ContainsIgnoreCase(keyWord)).GroupBy(p => p.Type) : allFlows.GroupBy(p => p.Type);
JArray jArray = new JArray();
foreach (var type in types)
{
var typeFlows = flows.Where(p => p.Key.ToString() == type.Id);
if (!typeFlows.Any())
{
continue;
}
JObject jObject = new JObject()
{
{ "type", type.Title }
};
JArray jArray1 = new JArray();
foreach (var flow in typeFlows)
{
foreach (var flowModel in flow.OrderBy(p => p.Name))
{
var appModel = _appLibrary.GetByCode(flowModel.Id.ToString());
if (appModel == null)
{
continue;
}
jArray1.Add(new JObject() {
{ "id", flowModel.Id },
{ "name", flowModel.Name },
{ "ico", flowModel.Ico },
{ "color", flowModel.Color },
{ "openModel", appModel.OpenMode },//打开方式
{ "url", appModel.Address },
});
}
}
jObject.Add("childs", jArray1);
jArray.Add(jObject);
}
return jArray;// RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray);
}
/// <summary>
/// 得到流程运行时加载的数据
/// </summary>
/// <returns></returns>
[HttpPost("GetRun")]
[AllowAnonymous]
public dynamic GetRun([FromBody] JObject args)
{
string flowId = args.GetJsonValue("flowid");
string stepId = args.GetJsonValue("stepid");
string groupId = args.GetJsonValue("groupid");
string taskId = args.GetJsonValue("taskid");
bool isDisplay = "1".Equals(args.GetJsonValue("display"));
bool isMobile = "1".Equals(args.GetJsonValue("ismobile")) || "1".Equals(args.GetJsonValue("mobile"));
bool isCompleted = "1".Equals(args.GetJsonValue("completed")) || "1".Equals(args.GetJsonValue("iscompleted"));//是否是查看已完成,已完成要显示,催办,收回等按钮。
int ismobile = args.GetJsonValue("ismobile").ToInt(0);//客户端类型 0PC 1移动端
if (!flowId.IsGuid(out Guid flowGuid))
{
throw Oops.Oh("流程ID错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
var (dynamicTaskModel, flowTaskModel, groupTasks) = _flowTask.GetDynamicTask(groupId, taskId);
var flowRunModel = _flow.GetFlowRunModel(flowId, true, dynamicTaskModel);
if (null == flowRunModel)
{
throw Oops.Oh("未找到流程");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowRunModel"].Value);
}
SysUser userModel = _userManager.User;
string userId = userModel == null ? string.Empty : userModel.Id;
var taskModel = flowTaskModel == null ? taskId.IsGuid() ? _flowTask.GetOneById(taskId) : null : flowTaskModel;
if (_flowTask.IsOpenTask(userId, taskModel, flowRunModel) == -1)
{
throw Oops.Oh("您不能处理当前步骤");
//判断当前人员是否可以处理当前任务
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["YourCannotHandleTask"].Value);
}
if (taskModel != null && taskModel.Status == 2)
{
//如果任务已经完成,则设置为只读
isDisplay = true;
}
if (!stepId.IsGuid(out Guid stepGuid))
{
//第一步,新发起判断流程是否可以发起
if (taskModel == null && flowRunModel.Status != 1)
{
throw Oops.Oh("流程状态错误,不能开始");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CannotStart"].Value + flowRunModel.Name + localizer["CannotStartFlow"].Value);
}
//如果没有步骤id则从taskModel中取没有taskModel则取流程第一步
stepGuid = taskModel == null ? flowRunModel.FirstStepId : taskModel.StepId.ToGuid();
}
var stepModel = flowRunModel.Steps.Find(p => p.Id == stepGuid);
if (null == stepModel)
{
throw Oops.Oh("未找到当前步骤");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowStep"].Value);
}
//检查并发
if (stepModel.StepBase.ConcurrentModel == 1 && null != taskModel && taskModel.TaskType != 5 && taskModel.TaskType != 11)
{
//2021-3-25修改增加了检查并发时要判断策略分组
groupTasks = groupTasks != null ? groupTasks : _flowTask.GetListByGroupId(taskModel.GroupId);
IEnumerable<RoadFlow.Model.rf_flowtask> openTasks;
if (stepModel.StepBase.HanlderModelGroup == 2)
{
openTasks = groupTasks.Where(p => p.TaskType != 5 && p.TaskType != 11 && p.OtherType == taskModel.OtherType && p.Status == 1 && p.ReceiveId != userId && p.PrevId == taskModel.PrevId);
}
else
{
openTasks = groupTasks.Where(p => p.TaskType != 5 && p.TaskType != 11 && p.Status == 1 && p.ReceiveId != userId && p.PrevId == taskModel.PrevId);
}
if (openTasks.Any())
{
throw Oops.Oh("当前流程正由 " + openTasks.FirstOrDefault().ReceiveName + " 操作中,请稍后再试");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CurrentStepHandleing"].Value + openTasks.FirstOrDefault().ReceiveName + localizer["CurrentStepHandleingWait"].Value);
}
}
//如果是流程第一步判断是否有权限发起
if (taskModel == null && stepModel.Id == flowRunModel.FirstStepId
&& !stepModel.StepBase.DefaultHandler.IsNullOrWhiteSpace()
&& !_userDummy.IsIn(userId.ToString(), stepModel.StepBase.DefaultHandler))
{
throw Oops.Oh("不能发起流程");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CannotStartCurrentFlow"].Value);
}
//更新任务状态为处理中
if (null != taskModel && taskModel.Status == 0)
{
_flowTask.UpdateStatus(taskModel.Id, 1, 1, taskModel.OpenTime.HasValue ? new DateTime?() : DateExtensions.Now);
}
string flowTaskNote = string.Empty;//要显示的备注信息
string lang = RoadFlow.Utility.Tools.GetCurrentLanguage(App.HttpContext);//当前语言
#region
JObject flowObject = new JObject();
#region
//RoadFlow.Business.FlowButton flowButton = new RoadFlow.Business.FlowButton();
var flowButtons = _flowButton.GetAll();
JArray buttonsArray = new JArray();
//是否是抄送任务
bool isCopyFor = taskModel != null && taskModel.TaskType == 5;
//是否是征求意见
bool isSolicitOpition = taskModel != null && taskModel.TaskType == 11;
string printButtonId = "CADD9F81-2B8C-479B-A7F1-3CEC775768FA".ToLower();//打印按钮ID
if (isDisplay)
{
//添加打印按钮
var printButton = flowButtons.Find(p => p.Id == printButtonId);
if (printButton != null)
{
buttonsArray.Add(new JObject() {
{ "id", printButton.Id },
{ "title", _flowButton.GetLanguageTitle(printButton, out string note, lang) },
{ "ico", printButton.Ico },
{ "scripts", printButton.Script },
{ "note", note },
});
}
//添加处理过程按钮
var porcessButton = flowButtons.Find(p => p.Id == "D9511329-A03E-4AF2-84E5-73BEDA0D3F42".ToLower());
if (porcessButton != null)
{
buttonsArray.Add(new JObject() {
{ "id", porcessButton.Id },
{ "title", _flowButton.GetLanguageTitle(porcessButton, out string note, lang) },
{ "ico", porcessButton.Ico },
{ "scripts", porcessButton.Script },
{ "note", note },
});
}
//如果可以催办,添加催办和收回按钮
if (isCompleted && taskModel != null)
{
bool isHasten = _flowTask.IsHasten(taskModel.Id, out bool isWithdraw);
if (isHasten)
{
buttonsArray.Add(new JObject() {
{ "id", GuidExtensions.NewGuid().ToString() },
{ "title", "催办" },//localizer["Urging"].Value
{ "ico", "icon-comment-edit-outline" },
{ "scripts", "this.hasten();" },
{ "note", "" },
});
}
if (isWithdraw)
{
buttonsArray.Add(new JObject() {
{ "id", GuidExtensions.NewGuid().ToString() },
{ "title", "撤销" },//localizer["Withdraw"].Value
{ "ico", "icon-format-rotate-90" },
{ "scripts", "this.withdraw();" },
{ "note", "" },
});
}
}
}
else if (isCopyFor)
{
//抄送显示打印和已阅知按钮
var printButton = flowButtons.Find(p => p.Id == printButtonId);
if (printButton != null)
{
buttonsArray.Add(new JObject() {
{ "id", printButton.Id },
{ "title", _flowButton.GetLanguageTitle(printButton, out string note, lang) },
{ "ico", printButton.Ico },
{ "scripts", printButton.Script },
{ "note", note },
});
}
//已阅知按钮
var readButton = flowButtons.Find(p => p.Id == "AA27EAB5-66F0-4CDE-958F-1F28DA4B4392".ToLower());
if (readButton != null)
{
buttonsArray.Add(new JObject() {
{ "id", readButton.Id },
{ "title", _flowButton.GetLanguageTitle(readButton, out string note, lang) },
{ "ico", readButton.Ico },
{ "scripts", readButton.Script },
{ "note", note },
});
}
}
else if (isSolicitOpition)
{
if (!taskModel.Note.IsNullOrWhiteSpace())
{
flowTaskNote = taskModel.Note;
}
var printButton = flowButtons.Find(p => p.Id == printButtonId);
if (printButton != null)
{
buttonsArray.Add(new JObject() {
{ "id", printButton.Id },
{ "title", _flowButton.GetLanguageTitle(printButton, out string note, lang) },
{ "ico", printButton.Ico },
{ "scripts", printButton.Script },
{ "note", note },
});
}
//回复按钮
var replyButton = flowButtons.Find(p => p.Id == "C87911A2-0846-4CC1-99A8-DFC6681E323A".ToLower());
if (replyButton != null)
{
buttonsArray.Add(new JObject() {
{ "id", replyButton.Id },
{ "title", _flowButton.GetLanguageTitle(replyButton, out string note, lang) },
{ "ico", replyButton.Ico },
{ "scripts", replyButton.Script },
{ "note", note },
});
}
}
else
{
foreach (var button in stepModel.StepButtons)
{
var buttonModel = flowButtons.Find(p => p.Id == button.Id.ToString());
if (buttonModel != null)
{
string title = _flowButton.GetLanguageTitle(buttonModel, out string note, lang);
buttonsArray.Add(new JObject() {
{ "id", button.Id },
{ "title", button.ShowTitle.IsNullOrWhiteSpace() ? title : button.ShowTitle },
{ "ico", buttonModel.Ico },
{ "scripts", buttonModel.Script },
{ "note", button.Note.IsNullOrWhiteSpace() ? note : button.Note },
});
}
}
}
flowObject.Add("buttons", buttonsArray);
flowObject.Add("isCopyFor", isCopyFor ? 1 : 0);
flowObject.Add("isDisplay", isDisplay ? 1 : 0);
flowObject.Add("flowType", stepModel.StepBase.FlowType);//流转类型
#endregion
//步骤意见设置
JObject signObject = new JObject
{
{ "type", isDisplay ? 0 : isSolicitOpition ? 1 : stepModel.SignatureType },//如果是征求意见,则始终显示意见栏
{ "comment", taskModel!=null ? taskModel.Comments : "" },
{ "attachment", taskModel!=null ? taskModel.Attachment : ""},
{ "issign", taskModel!=null ? taskModel.IsSign : 0 },
{ "signsrc", _userDummy.GetSignSrcVue(userId.ToString(), userModel.Name)},
{ "show", stepModel.CommentDisplay },//本步骤是否要显示意见
};
if (stepModel.SignatureType > 0 || isSolicitOpition)
{
//常用意见
JArray commentArray = new JArray();
var comments = _flowComment.GetListByUserId(userId);
foreach (var comment in comments)
{
commentArray.Add(new JObject() { { "value", comment.Comments }, { "title", comment.Comments } });
}
signObject.Add("commentoptions", commentArray);
signObject.Add("isattachment", isSolicitOpition ? 1 : stepModel.Attachment);//如果是征求意见,则始终可以传附件
}
flowObject.Add("sign", signObject);
flowObject.Add("archive", stepModel.Archives);//步骤是否归档
//流程调试模式
flowObject.Add("debug", flowRunModel.Debug > 0 && flowRunModel.DebugUserIds.ContainsIgnoreCase(userId.ToString()) ? flowRunModel.Debug : 0);
#endregion
//添加备注
flowObject.Add("flowTaskNote", flowTaskNote);
#region
JObject formObject = new JObject();
if (stepModel != null && stepModel.StepForm != null)
{
int formType = ismobile;
if (formType == 1 && stepModel.StepForm.MobileId.IsEmptyGuid())
{
formType = 0;//如果是移动端没有设置移动端表单取PC端表单
}
switch (formType)
{
//PC表单
case 0:
if (stepModel.StepForm.Id.IsNotEmptyGuid())
{
var appModel = _appLibrary.GetOneById(stepModel.StepForm.Id.ToString());
if (appModel != null)
{
if (appModel.Code.IsGuid(out Guid formId))
{
formObject = _form.GetRunJObject(appModel.Code);
}
else
{
formObject.Add("form_iscustomeform", 1);//0设计表单 1自定义表单
formObject.Add("url", appModel.Address);
}
}
}
break;
case 1:
//移动端表单
if (stepModel.StepForm.MobileId.IsNotEmptyGuid())
{
var appModel = _appLibrary.GetOneById(stepModel.StepForm.MobileId.ToString()); ;
if (appModel != null)
{
if (appModel.Code.IsGuid(out Guid formId))
{
formObject = _form.GetRunJObject(appModel.Code);
}
else
{
formObject.Add("form_iscustomeform", 1);//0设计表单 1自定义表单
formObject.Add("url", appModel.Address);
}
}
}
break;
}
}
if (formObject.IsEmptyJObject())
{
//如果没有设置表单,返回空对象,以免表单加载时报错
formObject = _form.GetRunJObject(string.Empty);
}
#endregion
#region
JObject formDataObject = new JObject() {
{ "form_id", formObject.Value<string>("id") },
{ "form_dbconnid", formObject.Value<string>("conn") },
{ "form_dbtable", formObject.Value<string>("table") },
{ "form_dbtableprimarykey", formObject.Value<string>("primaryKey") },
{ "form_titlefield", formObject.Value<string>("titleField") },
{ "form_dbtabletitleexpression", formObject.Value<string>("titleExpression") },
{ "form_instanceid", taskModel == null ? App.HttpContext.Request.Querys("instanceid") : taskModel.InstanceId },
{ "form_fieldstatus", new JObject() },
{ "flowid", taskModel == null ? flowId : taskModel.FlowId.ToString() },
{ "stepid", taskModel == null ? stepId : taskModel.StepId.ToString() },
{ "taskid", taskId },
{ "groupid", taskModel == null ? groupId : taskModel.GroupId.ToString() },
};
JObject statusObject = new JObject();//字段状态
JObject checkObject = new JObject();//字段检查
string formatJson = formObject.ContainsKey("formatJson") ? formObject.Value<JArray>("formatJson").ToString(Newtonsoft.Json.Formatting.None) : "";//字段显示格式JSON
JObject valueTypeObject = formObject.Value<JObject>("valueTypeJson");//字段值类型JSON
JObject defaultValueJson = formObject.Value<JObject>("defaultValueJson");//默认值JSON
//获取表单数据
JArray formDataArray = _form.GetFormData(formObject.Value<string>("conn"), formObject.Value<string>("table"),
formObject.Value<string>("primaryKey"), taskModel == null ? "" : taskModel.InstanceId, stepId
, flowId, formatJson, out string fieldStatusJson, taskModel == null ? "" : taskModel.GroupId.ToString()).ToJArray();
foreach (JObject valueObject in formDataArray)
{
formDataObject.Add(valueObject.Value<string>("name"), valueObject.Value<string>("value"));
}
#region
if (formObject.ContainsKey("datatableJson"))
{
foreach (JObject dtObject in formObject.Value<JArray>("datatableJson"))
{
string id = dtObject.Value<string>("id");
int source = dtObject.Value<string>("source").ToInt(0);
string text = dtObject.Value<string>("text");
string conn = dtObject.Value<string>("conn");
if (source == 0 && conn.IsGuid(out Guid connGuid))//SQL
{
var (rows, cols) = _form.GetDataTablJArray(conn, RoadFlow.Business.Wildcard.Filter(text, userModel, formDataObject));
formDataObject.Add(id, new JObject() { { "rows", rows }, { "cols", cols }, { "selects", new JArray() } });
}
if (source == 1)//URL
{
JObject urlObject;
try
{
urlObject = HttpHelper.HttpGet((App.HttpContext.Request.IsHttps ? "https://" : "http://") + App.HttpContext.Request.Host.Value + RoadFlow.Business.Wildcard.Filter(text, userModel, formDataObject)).ToJObject();
}
catch
{
urlObject = null;
}
if (urlObject != null)
{
JArray rowsArray = new JArray();
try
{
rowsArray = urlObject.ContainsKey("rows") ? urlObject.Value<JArray>("rows") : new JArray();
}
catch { }
JArray colssArray = new JArray();
try
{
colssArray = urlObject.ContainsKey("cols") ? urlObject.Value<JArray>("cols") : new JArray();
}
catch { }
formDataObject.Add(id, new JObject() { { "rows", rowsArray }, { "cols", colssArray }, { "selects", new JArray() } });
}
else
{
formDataObject.Add(id, new JObject() { { "rows", new JArray() }, { "cols", new JArray() }, { "selects", new JArray() } });
}
}
}
}
#endregion
#region
JArray subTableJarray = formObject.Value<JArray>("subtableJson");
if (subTableJarray != null)
{
foreach (JObject sdtObject in subTableJarray)
{
string id = sdtObject.Value<string>("id");
JArray sRows = _form.GetSubTableJarray(sdtObject, formObject.Value<string>("conn"), taskModel == null ? "" : taskModel.InstanceId);
if (formDataObject.ContainsKey(id))
{
formDataObject[id] = new JObject() { { "rows", sRows } };
}
else
{
formDataObject.Add(id, new JObject() { { "rows", sRows } });
}
}
//默认值
formDataObject.Add("subtableDefaultValue", _form.GetSubTableDefaultValueJArray(subTableJarray, userModel));
}
#endregion
JArray fieldStatusJArray = fieldStatusJson.ToJArray();
if (!fieldStatusJArray.IsEmptyJArray())
{
//表单验证类型
int validatePromptType = formObject.Value<string>("validatePromptType").ToInt(0);
foreach (JObject fieldStatusObject in fieldStatusJArray)
{
string filed = fieldStatusObject.Value<string>("name");
if (!statusObject.ContainsKey(filed))
{
int status = fieldStatusObject.Value<string>("status").ToInt(0);
if ((isCopyFor || isSolicitOpition) && status == 0)
{
status = 1;//如果是抄送或者征求意见,字段是编辑则设置为只读状态。
}
statusObject.Add(filed, status);
}
//验证json
int check = fieldStatusObject.Value<string>("check").ToInt(0);
if (check > 0)
{
//判断是不是子表
int isSubTable = 0;
string subTableId = string.Empty;//子表ID
string fieldShowName = string.Empty;//子表字段的显示标题
if (!subTableJarray.IsEmptyJArray())
{
foreach (JObject subTableJObject in subTableJarray)
{
string table = subTableJObject.Value<string>("subTable");
if (filed.StartsWith(table.ToUpper() + "-"))
{
isSubTable = 1;
subTableId = subTableJObject.Value<string>("id");
string fieldName = filed.Replace(table.ToUpper() + "-", "");
//查找子表字段设置的显示名称。
foreach (JObject subTableRowJObject in subTableJObject.Value<JArray>("rows"))
{
if (subTableRowJObject.Value<string>("field").EqualsIgnoreCase(fieldName))
{
fieldShowName = subTableRowJObject.Value<string>("fieldName");
break;
}
}
break;
}
}
}
//验证类型,string,decimal......
string validType = valueTypeObject.IsEmptyJObject() ? "string" : valueTypeObject.Value<string>(filed);
JObject cObject = new JObject() {
{ "type", validType.IsNullOrWhiteSpace() ? "string" : validType },
{ "required", check == 2 },
{ "title", fieldShowName },
{ "msg", "" },
//{ "msg", fieldShowName + localizer["CannotbeEmpty"] },
{ "showtype", validatePromptType },
{ "position", isMobile ? 1 : 0 },
{ "ispass", true },
{ "issubtable", isSubTable },
{ "subtableid", subTableId },
};
if ("ajax".Equals(validType))
{
//如果是AJAX验证要添加url属性
cObject.Add("url", RoadFlow.Business.Wildcard.Filter(valueTypeObject.Value<string>(filed + "-AJAXURL"), userModel, taskModel));
}
checkObject.Add(filed, cObject);
}
}
}
//判断是否采用默认值。
if (defaultValueJson != null)
{
foreach (var j in defaultValueJson)
{
//如果数据表里已经有值,不设置默认值
if (formDataObject.ContainsKey(j.Key) && !formDataObject.Value<string>(j.Key).IsNullOrEmpty())
{
continue;
}
//如果是隐藏,不设置默认值
if (statusObject.ContainsKey(j.Key) && 2 == statusObject.Value<string>(j.Key).ToInt(0))
{
continue;
}
string defaultValue = j.Value.Value<string>();
if (!defaultValue.IsNullOrWhiteSpace())
{
//组织通配符obj参数
RoadFlow.Model.FlowRunModel.EventParam eventParam = new RoadFlow.Model.FlowRunModel.EventParam
{
FlowId = flowGuid,
FlowRunModel = flowRunModel
};
if (formDataObject.ContainsKey(j.Key))
{
formDataObject[j.Key] = RoadFlow.Business.Wildcard.Filter(defaultValue, userModel, eventParam);
}
else
{
formDataObject.Add(j.Key, RoadFlow.Business.Wildcard.Filter(defaultValue, userModel, eventParam));
}
}
}
}
//移出不需要输出到客户端的数据
//formObject.Remove("validatePromptType");
//formObject.Remove("formatJson");
//formObject.Remove("valueTypeJson");
//formObject.Remove("defaultValueJson");
if (formObject.ContainsKey("data"))
{
formObject["data"] = formDataObject;
}
else
{
formObject.Add("data", formDataObject);
}
if (formObject.ContainsKey("fieldStatus"))
{
formObject["fieldStatus"] = statusObject;
}
else
{
formObject.Add("fieldStatus", statusObject);
}
if (formObject.ContainsKey("validate"))
{
formObject["validate"] = checkObject;
}
else
{
formObject.Add("validate", checkObject);
}
#endregion
JObject jObject = new JObject() {
{ "form", formObject },
{ "flow", flowObject },
};
return jObject;//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: jObject);
}
/// <summary>
/// 得到子表数据
/// </summary>
/// <returns></returns>
[HttpPost("GetSubtableData")]
public dynamic GetSubtableData([FromBody] JObject args)
{
string subtableJson = args.GetJsonValue("subtablejson");//子表ID
string instanceId = args.GetJsonValue("instanceid");
string connId = args.GetJsonValue("connid");
JObject subtableJObject = subtableJson.ToJObject();
if (subtableJObject.IsEmptyJObject() || instanceId.IsNullOrWhiteSpace() || !connId.IsGuid(out Guid connGuid))
{
return new JArray();
// RoadFlowCommon.Tools.GetReturnJsonString(jArray: new JArray());
}
JArray sRows = _form.GetSubTableJarray(subtableJObject, connId, instanceId);
return sRows;
//RoadFlowCommon.Tools.GetReturnJsonString(jArray: sRows);
}
/// <summary>
/// 得到要发送的步骤
/// </summary>
/// <returns></returns>
[HttpPost("GetSendSteps")]
public dynamic GetSendSteps([FromBody] JObject args)
{
string flowId = args.GetJsonValue("flowid");
string stepId = args.GetJsonValue("stepid");
string taskId = args.GetJsonValue("taskid");
string groupId = args.GetJsonValue("groupid");
bool freeSend = "1".Equals(args.GetJsonValue("freesend"));
if (!flowId.IsGuid(out Guid flowGuid))
{
throw Oops.Oh("流程错误");
//RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
var (dynamicTask, currentTask, groupTasks) = _flowTask.GetDynamicTask(groupId, null);
var flowRunModel = _flow.GetFlowRunModel(flowId, true, dynamicTask);
if (null == flowRunModel)
{
throw Oops.Oh("找不到流程运行模块");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowRunModel"].Value);
}
if (!stepId.IsGuid(out Guid stepGuid))
{
stepGuid = flowRunModel.FirstStepId;
}
var stepModel = flowRunModel.Steps.Find(p => p.Id == stepGuid);
if (null == stepModel)
{
throw Oops.Oh("找不到流程步骤");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowStep"].Value);
}
string userId = _userManager.UserId;
string groupGuid = groupId;
string instanceId = string.Empty;
RoadFlow.Model.rf_flowtask flowTaskModel = null;
if (taskId.IsGuid(out Guid taskGuid))
{
flowTaskModel = _flowTask.GetOneById(taskId);
if (null != flowTaskModel)
{
groupGuid = flowTaskModel.GroupId;
instanceId = flowTaskModel.InstanceId;
}
}
var (json, msg, nextSteps) = _flowTask.GetNextSteps(flowRunModel, stepGuid, groupGuid, taskId, instanceId, userId, freeSend);
//if (!msg.IsNullOrWhiteSpace())
//{
// return RoadFlowCommon.Tools.GetReturnJsonString(false, msg);
//}
JObject otherJSON = json.ToJObject();//返回的其他设置json
JObject jObject = new JObject() {
{ "flowType", stepModel.StepBase.FlowType },
{ "autoConfirm", stepModel.StepBase.AutoConfirm },
};
JArray jArray = new JArray();
JObject dynamicStepOject = new JObject()
{
{ "flowtype", -1 },
{ "runedit", -1 },
{ "steps", new JArray() }
};//动态步骤
foreach (var step in nextSteps)
{
#region
JArray selectType = new JArray();
if (step.StepBase.HandlerType.ToInt(0) == 1)
{
selectType.Add("dept");
}
else if (step.StepBase.HandlerType.ToInt(0) == 2)
{
selectType.Add("station");
}
else if (step.StepBase.HandlerType.ToInt(0) == 3)
{
selectType.Add("workgroup");
}
else if (step.StepBase.HandlerType.ToInt(0) == 4)
{
selectType.Add("user");
}
else
{
selectType.Add("unit");
selectType.Add("dept");
selectType.Add("station");
selectType.Add("workgroup");
selectType.Add("user");
}
#endregion
#region
string selectRange = step.StepBase.SelectRange;
//将默认处理者设置为选择范围。
if (step.StepBase.SelectRangeForDefaultHandler >= 0)
{
selectRange += "," + step.RunDefaultMembers;
if (step.StepBase.SelectRangeForDefaultHandler == 1)//如果是把默认处理者作为选择范围,默认不选中,则这里清空默认处理者。
{
step.RunDefaultMembers = "";
}
}
#endregion
#region
int runSelect = step.StepBase.RunSelect;
if (otherJSON.ContainsKey("runselect_" + step.Id.ToLowerString()))
{
runSelect = otherJSON.Value<string>("runselect_" + step.Id.ToLowerString()).ToInt(1);
}
#endregion
JObject stepObject = new JObject()
{
{ "id", step.Id.ToString() },
{ "name", step.Name },
{ "members", step.RunDefaultMembers },
//flowTaskModel != null && flowTaskModel.TaskType==6是为了判断前加签不用指定完成时间。
{ "setTime", flowTaskModel != null && flowTaskModel.TaskType==6 ? 0 : step.SendSetWorkTime },
{ "time", "" },
{ "runSelect", runSelect },
{ "rootId", selectRange },
{ "dynamic", step.Dynamic },
{ "parallelorserial", "0" }//默认并行审批
};
if (selectType.Count > 0)
{
stepObject.Add("selectType", selectType);
}
jArray.Add(stepObject);
if (step.Dynamic == 2)
{
dynamicStepOject = _flowTask.GetDynamicStepFromFieldValue(flowRunModel, step, instanceId);
foreach (JObject jObject1 in dynamicStepOject.Value<JArray>("steps"))
{
jObject1.Add("runSelect", runSelect);
jObject1.Add("rootId", selectRange);
if (selectType.Count > 0)
{
jObject1.Add("selectType", selectType);
}
}
}
}
jObject.Add("steps", jArray);
jObject.Add("dynamicSteps", dynamicStepOject);
return jObject;
//return RoadFlowCommon.Tools.GetReturnJsonString(true, "", jObject: jObject);
}
/// <summary>
/// 得到要退回的步骤
/// </summary>
/// <returns></returns>
[HttpPost("GetBackSteps")]
public dynamic GetBackSteps([FromBody] JObject args)
{
string flowid = args.GetJsonValue("flowid");
string taskid = args.GetJsonValue("taskid");
string stepid = args.GetJsonValue("stepid");
string groupid = args.GetJsonValue("groupid");
if (!flowid.IsGuid())
{
throw Oops.Oh("流程id错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
if (!stepid.IsGuid())
{
throw Oops.Oh("步骤id错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
var (selectUser, message, backSteps) = new FlowTask().GetBackSteps(flowid, stepid, groupid, taskid, string.Empty, _userManager.UserId);
if (!message.IsNullOrWhiteSpace())
{
throw Oops.Oh(message);
// return RoadFlowCommon.Tools.GetReturnJsonString(false, message);
}
var organize = new Organize();
JObject jObject = new JObject();
JArray jArray = new JArray();
foreach (var step in backSteps)
{
jArray.Add(new JObject()
{
{ "id", step.Id.ToString() },
{ "name", step.Name },
{ "members", step.RunDefaultMembers },
{ "membernames", organize.GetNames(step.RunDefaultMembers) },
{ "selectmembers", selectUser.ToInt(0) },//是否可以选择人员
});
}
jObject.Add("steps", jArray);
return jObject;
//RoadFlowCommon.Tools.GetReturnJsonString(true, "", jObject: jObject);
}
/// <summary>
/// 执行流程
/// </summary>
/// <returns></returns>
[HttpPost("Execute")]
public dynamic Execute([FromBody] JObject args)
{
string paramsJSON = args.GetJsonValue("params");
string issign = args.GetJsonValue("issign");
string comment = args.GetJsonValue("comment");
string attachment = args.GetJsonValue("attachment");
string flowid = args.GetJsonValue("flowid");
string instanceid = args.GetJsonValue("form_instanceid");
string taskid = args.GetJsonValue("taskid");
string stepid = args.GetJsonValue("stepid");
string groupid = args.GetJsonValue("groupid");
string ismobile = args.GetJsonValue("ismobile");
string signpassword = args.GetJsonValue("signpassword");//签章密码
bool isCustomeForm = "1".Equals(args.GetJsonValue("form_iscustomeform"));//是否是自定义表单
var currentUserModel = _userManager.User;
if (currentUserModel == null)
{
throw Oops.Oh("用户不存在");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundUserLoginInfo"].Value);
}
#region
if (paramsJSON.IsNullOrWhiteSpace())
{
throw Oops.Oh("执行参数为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ExecPramEmpty"].Value);
}
if (!flowid.IsGuid())
{
throw Oops.Oh("工作流错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
Flow flow = new Flow();
FlowTask flowTask = new FlowTask();
//查找当前任务是否有动态步骤,有则从动态步骤中取流程运行时
var (dynamicTaskModel, flowTaskModel, groupTasks) = flowTask.GetDynamicTask(groupid, taskid);
var flowRunModel = flow.GetFlowRunModel(flowid, true, dynamicTaskModel);
//================================================
if (null == flowRunModel)
{
throw Oops.Oh("工作流运行模块错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowRunModel"].Value);
}
JObject paramsObject = JObject.Parse(paramsJSON);
string opation = paramsObject.Value<string>("type");
if (opation.IsNullOrWhiteSpace())
{
throw Oops.Oh("执行类型错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundExecType"].Value);
}
#endregion
#region
//2021-3-24增加设置发起流程时的兼职部门关系ID
// if (!taskid.IsGuid() && !groupid.IsGuid())
//{
// currentUserModel.PartTimeId = _userManager.UserId;//Current.GetPartTimeId(Request);
// }
//2021-3-24增加完
RoadFlow.Model.FlowRunModel.Execute executeModel = new RoadFlow.Model.FlowRunModel.Execute();
switch (opation)
{
case "freesubmit": //自由流程发送
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.FreeSubmit;
break;
case "submit":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.Submit;
break;
case "save":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.Save;
break;
case "back":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.Back;
break;
case "completed":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.Completed;
break;
case "redirect":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.Redirect;
break;
case "addwrite":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.AddWrite;
break;
case "copyforcompleted": //抄送完成(已阅知)
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.CopyforCompleted;
break;
case "taskend":
executeModel.ExecuteType = RoadFlow.Model.FlowRunModel.Execute.Type.TaskEnd;
break;
}
executeModel.IsAutoSubmit = false;
executeModel.Comment = comment.Trim();
executeModel.FlowId = flowid.ToGuid();
executeModel.GroupId = groupid.ToGuid();
executeModel.InstanceId = instanceid;
executeModel.IsSign = issign.ToInt(0);
executeModel.Note = string.Empty;
executeModel.OtherType = 0;
executeModel.Sender = currentUserModel;
executeModel.StepId = stepid.IsGuid(out Guid stepId) ? stepId : flowRunModel.FirstStepId;
executeModel.TaskId = taskid.ToGuid();
executeModel.ParamsJSON = paramsJSON;
executeModel.Attachment = attachment;
List<(Guid, string, Guid?, int?, List<SysUser>, DateTime?)> nextSteps = new List<(Guid, string, Guid?, int?, List<SysUser>, DateTime?)>();
var currentStepModel = flowRunModel.Steps.Find(p => p.Id == executeModel.StepId);
if (null == currentStepModel)
{
throw Oops.Oh("未找到工作流步骤");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowStep"].Value);
}
JArray stepsArray = paramsObject.Value<JArray>("steps");
if (null != stepsArray)
{
Organize organize = new Organize();
FlowEntrust flowEntrust = new FlowEntrust();
UserDummy user = new UserDummy();
List<RoadFlow.Model.rf_flowreceive> flowReceives = new List<RoadFlow.Model.rf_flowreceive>();//2021-3-15增加记录接收人方便下次默认查找。
foreach (JObject stepObject in stepsArray)
{
string id = stepObject.Value<string>("id");
string name = stepObject.Value<string>("name");//步骤名称
string beforeStepId = stepObject.Value<string>("beforestepid");//原步骤ID(动态步骤的原步骤ID)
string parallelorserial = stepObject.Value<string>("parallelorserial");//0并且 1串行
string member = stepObject.Value<string>("member");
string completedTime = stepObject.Value<string>("completedtime");
if (!id.IsGuid(out Guid nextStepId))
{
continue;
}
var nextStepModel = flowRunModel.Steps.Find(p => p.Id == nextStepId);
//2021-6-19注释掉了这里的NULL判断因为动态步骤时这里为空。在下面的判断中再增加null判断。
//if (nextStepModel == null)
//{
// continue;
//}
DateTime? completedDateTime = new DateTime?();
if (completedTime.IsDateTime(out DateTime cTime))
{
completedDateTime = cTime;
}
if (executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Submit ||
executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Back ||
executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Redirect ||
executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.FreeSubmit)
{
//var userList = organize.GetAllUsers(member);
//2021-3-25修改人员按选择的组织分组。
List<SysUser> userList;
//2021-6-19增加了nextStepModel != null判断
if (nextStepModel != null && nextStepModel.StepBase.HanlderModelGroup == 2)
{
userList = new List<SysUser>();
foreach (string memberId in member.Split(',', StringSplitOptions.RemoveEmptyEntries))
{
int userGroup = RoadFlow.Utility.Tools.GetRandomInt(1, 100000);
var users = organize.GetAllUsers(memberId);
foreach (var userModel in users)
{
var userModel1 = userModel;
// userModel1.QQ = "3" + userGroup.ToString();
userList.Add(userModel1);
}
}
}
else
{
userList = organize.GetAllUsers(member);
}
//2021-3-25修改完
//2021-1-12增加判断如果发送时选择了人这里没有获取到人不提交。(如选择的是部门,工作组而部门或工作组下没有人的情况)
if (!member.IsNullOrEmpty() && userList.Count == 0)
{
throw Oops.Oh("没有接收人");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, name + localizer["NoReceiver"].Value,jObject: new JObject() { { "debugMessage", name + localizer["NoReceiver"].Value } });
}
nextSteps.Add((nextStepId, name,
beforeStepId.IsGuid(out Guid beforeStepGuid1) ? new Guid?(beforeStepGuid1) : new Guid?(),
parallelorserial.IsInt(out int parallelorserialInt1) ? new int?(parallelorserialInt1) : new int?(),
userList, completedDateTime));
}
//2021-3-15增加记录接收人方便下次默认查找。
//2021-6-19增加了nextStepModel != null判断
if (nextStepModel != null && nextStepModel.StepBase.LastHadler == 1 && !member.IsNullOrWhiteSpace()
&& (executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Submit
|| executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.FreeSubmit))
{
flowReceives.Add(new RoadFlow.Model.rf_flowreceive()
{
Id = GuidExtensions.NewGuid().ToString(),
FlowId = flowid,
StepId = id,
SenderId = currentUserModel.Id,
SendTime = DateExtensions.Now,
Members = member
});
}
}
new RoadFlow.Data.FlowReceive().AddRange(flowReceives);//2021-3-15增加记录接收人方便下次默认查找。
}
executeModel.Steps = nextSteps;
#endregion
#region
//判断抄送完成和终止任务不保存数据,如果是系统判断,在点发送时已经保存过了,这里不保存
if ((executeModel.ExecuteType != RoadFlow.Model.FlowRunModel.Execute.Type.CopyforCompleted
&& executeModel.ExecuteType != RoadFlow.Model.FlowRunModel.Execute.Type.TaskEnd
&& currentStepModel.StepBase.FlowType != 0 && currentStepModel.StepBase.FlowType != 5)
|| executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Save)
{
try
{
var (newInstanceId, errMsg) = _form.SaveDataVue(args, null);// localizer);
if (!errMsg.IsNullOrEmpty())//如果有错误信息,则返回,不提交流程。
{
_log.Add("处理流程(" + flowRunModel.Name + ")保存数据时发生了错误", errMsg);
throw Oops.Oh("数据保存失败");
/*return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["SaveDataError"].Value, jObject: new JObject() {
{ "debugMessage", errMsg },
});*/
}
if (executeModel.InstanceId.IsNullOrWhiteSpace())//如果发起流程没有实例ID,则将新产生的实例ID赋值。
{
executeModel.InstanceId = newInstanceId;
}
}
catch (Exception err)
{
_log.Add(err, "处理流程(" + flowRunModel.Name + ")保存数据时发生了错误");
throw Oops.Oh("数据保存失败");
/*
return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["SaveDataError"].Value, jObject: new JObject() {
{ "debugMessage", flowRunModel.Debug > 0 ? err.Message + err.StackTrace : string.Empty },
});*/
}
}
#endregion
#region
string taskTitle = string.Empty;
if (isCustomeForm)
{
taskTitle = args.GetJsonValue("form_tasktitle");
}
else
{
string form_dbtabletitleexpression = args.GetJsonValue("form_dbtabletitleexpression");//标题表达式
if (form_dbtabletitleexpression.IsNullOrWhiteSpace())
{
taskTitle = args.GetJsonValue(args.GetJsonValue("form_dbtable") + "-" + args.GetJsonValue("form_titlefield"));
}
else
{
string tableName = args.GetJsonValue("form_dbtable");
taskTitle = _form.ReplaceTitleExpression(form_dbtabletitleexpression, tableName, executeModel.InstanceId, args);
}
}
executeModel.Title = taskTitle;
#endregion
//添加动态流程步骤JSON(不是第一步时,第一步在流程提交时添加)
if (RoadFlow.Utility.Config.EnableDynamicStep
&& executeModel.Steps.Exists(p => p.beforeStepId.IsNotEmptyGuid())
&& executeModel.TaskId.IsNotEmptyGuid()
&& executeModel.GroupId.IsNotEmptyGuid())
{
var newFlowRunModel = _dynamic.Add(executeModel, groupTasks);
if (null != newFlowRunModel)
{
flowRunModel = newFlowRunModel;
}
//如果是顺序处理,要删掉后面的步骤。
executeModel.Steps.RemoveAll(p => p.parallelOrSerial.HasValue && p.parallelOrSerial == 1 && p.stepId != p.beforeStepId);
}
//===================
//执行流程
var executeResult = flowTask.Execute(executeModel, flowRunModel, null); //localizer);
#region ()
if (executeResult != null && executeResult.AutoSubmitTasks.Count > 0)
{
foreach (var autoSubmitTask in executeResult.AutoSubmitTasks)
{
var autoSubmitResult = flowTask.AutoSubmit(autoSubmitTask.Id.ToGuid());
_log.Add("流程完成后自动提交了任务 - " + (autoSubmitResult.IsSuccess ? "成功" : "失败") + " - " + autoSubmitTask.FlowName
+ " - " + autoSubmitTask.StepName + " - " + autoSubmitTask.Title, _userManager.UserId, autoSubmitTask.ToString(), LogType.,
others: "执行结果:" + autoSubmitResult.ToString());
}
}
#endregion
#region
if (currentStepModel.Archives == 1
&& (executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Submit
|| executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.FreeSubmit
|| executeModel.ExecuteType == RoadFlow.Model.FlowRunModel.Execute.Type.Completed))
{
string formHtml = args.GetJsonValue("archive_formHtml");
string comments = args.GetJsonValue("archive_comments");
//var db = dbs.First();
//string formDataJson = new Business.Form().GetFormData(db.ConnectionId.ToString(),
// db.Table, db.PrimaryKey, executeModel.InstanceId, executeModel.StepId.ToString(), executeModel.FlowId.ToString(),
// Request.Forms("form_dataformatjson"), out string fieldStatusJSON);
string formDataJson = args.GetJsonValue("archive_formDataJSON");
string executeUserId = string.Empty;
string executeUserName = string.Empty;
if (executeResult.CurrentTask != null)
{
executeUserId = !executeResult.CurrentTask.ReceiveOrganizeId.IsNullOrWhiteSpace()
? IOrganize.PREFIX_RELATION + executeResult.CurrentTask.ReceiveOrganizeId
: IOrganize.PREFIX_USER + executeResult.CurrentTask.ReceiveId.ToString();
executeUserName = executeResult.CurrentTask.ReceiveName;
}
else
{
executeUserId = IOrganize.PREFIX_USER + executeModel.Sender.Id.ToString();
executeUserName = executeModel.Sender.Name;
}
//加上本步骤的处理意见
if (executeResult.CurrentTask != null)
{
string serverUrl = args.GetJsonValue("archive_serverurl");
comments += "<div class=\"roadui_flowcommentdiv\"><table cellpadding=\"0\" cellspacing=\"0\""
+ " border=\"0\" width=\"100%\" class=\"roadui_flowcommenttable\"><tr>"
+ "<td style=\"width:15%;\">" + /*localizer["Step"].Value*/"步骤" + "" + executeResult.CurrentTask.StepName + "</td><td style=\"width:15%;\">"
+ /*localizer["Handler"].Value*/"处理者" + "" + executeResult.CurrentTask.ReceiveName + "</td><td style=\"width:22%;\">" +
//localizer["ReceiveTime"].Value
"接收时间"
+ "" + executeResult.CurrentTask.ReceiveTime.ToDateTimeString() + "</td>"
+ "<td style=\"width:23%;\">" +
"完成时间"
//localizer["CompletedTime"].Value
+ "" + executeResult.CurrentTask.CompletedTime1.ToDateTimeString() + "</td><td style=\"width:15%;\">"
+
"处理类型"
//localizer["HandleType"].Value
+ "" + flowTask.GetExecuteTypeTitle(executeResult.CurrentTask.ExecuteType) + "</td></tr>"
+ (executeModel.Comment.IsNullOrEmpty() ? "" : "<tr><td colspan=\"5\"><span>" +
//localizer["HandleOpinion"].Value
"处理选项"
+
"" + executeModel.Comment + "</span>")
+ (executeModel.IsSign == 1 ? "<span><img src=\"" + serverUrl.Replace("/RoadFlowWeb", "") + "/roadflow-files/user-signs/" +
executeResult.CurrentTask.ReceiveId.ToLower() + "/default.png\" border=\"0\" class=\"roadui_flowcommentsignimg\"/></span>" : "")
+ (executeModel.Comment.IsNullOrEmpty() ? "" : "</td></tr>")
+ (executeModel.Attachment.IsNullOrWhiteSpace() ? ""
: "<tr><td colspan=\"5\">" +
"附件"
//localizer["Accessories"].Value
+ "<span><span style=\"margin-right:10px;\">"
+ executeModel.Attachment.ToVueFilesShowString(false, serverUrl: serverUrl) + "</span></span></td></tr>")
+ "</table></div>";
}
RoadFlow.Model.rf_flowarchive flowArchiveModel = new RoadFlow.Model.rf_flowarchive
{
Comments = comments.Trim(),
DataJson = formDataJson,
FlowId = flowRunModel.Id.ToString(),
FlowName = flowRunModel.Name,
Id = GuidExtensions.NewGuid().ToString(),
InstanceId = executeModel.InstanceId,
StepId = currentStepModel.Id.ToString(),
StepName = currentStepModel.Name,
TaskId = executeResult.CurrentTask == null ? executeModel.TaskId.ToString() : executeResult.CurrentTask.Id,
Title = executeResult.CurrentTask == null ? executeModel.Title : executeResult.CurrentTask.Title,
UserId = executeUserId,
UserName = executeUserName,
WriteTime = DateExtensions.Now,
FormHtml = formHtml
};
new FlowArchive().Add(flowArchiveModel);
}
#endregion
_log.Add("处理了流程 " + flowRunModel.Name + "] - 步骤 " + flowTask.GetStepName(flowRunModel, executeModel.StepId) + " - 标题 " + executeModel.Title, _userManager.UserId, paramsJSON, LogType., oldContents: "执行参数:" + executeModel.ToString(), others: "返回:" + executeResult.ToString());
//如果下一步接收者中有当前人员则直接打开
var nextTask = executeResult.NextTasks?.Find(p => p.ReceiveId == executeModel.Sender.Id && p.Status.In(0, 1));
JObject returnObject = nextTask == null ? new JObject() { { "opation", "close" } } :
new JObject() {
{ "instanceid", nextTask.InstanceId },
{ "taskid", nextTask.Id.ToString() },
{ "flowid", nextTask.FlowId.ToString() },
{ "stepid", nextTask.StepId.ToString() },
{ "groupid", nextTask.GroupId.ToString() },
{ "title", nextTask.Title },
{ "debugMessage", flowRunModel.Debug > 0 ? executeResult.ToString() : string.Empty },
{ "opation", "refresh" },
};
return returnObject;
// RoadFlowCommon.Tools.GetReturnJsonString(executeResult.IsSuccess, executeResult.Messages, jObject: returnObject);
}
/// <summary>
/// 抄送
/// </summary>
[HttpPost("CopyFor")]
public string CopyFor([FromBody] JObject args)
{
string taskid = args.GetJsonValue("taskId");
string user = args.GetJsonValue("receiveUserId");
var users = new Organize().GetAllUsers(user);
if (users.Count == 0)
{
throw Oops.Oh("未找到接收人");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NoReceiver"].Value);
}
var taskModel = _flowTask.GetOneById(taskid);
string msg = _flowTask.CopyFor(taskModel, users, null); // localizer);
return msg == "1" ? "抄送成功" : msg;
//return RoadFlowCommon.Tools.GetReturnJsonString("1".Equals(msg), "1".Equals(msg) ? localizer["CopyforSuccessfully"].Value : msg);
}
/// <summary>
/// 征求意见
/// </summary>
/// <returns></returns>
[HttpPost("SolicitOpinion")]
public string SolicitOpinion([FromBody] JObject args)
{
string taskId = args.GetJsonValue("taskid");
string receiver = args.GetJsonValue("receiver");//接收人
string visibility = args.GetJsonValue("visibility");//意见可见性
string note = args.GetJsonValue("note");//意见说明
if (!taskId.IsGuid(out Guid taskGuid))
{
throw Oops.Oh("未找到当前任务");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
//int i = new Business.FlowSolicitOpinion().Solicit(taskGuid, receiver, visibility.ToInt(0), note);
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
string msg = _flowTask.SolicitOpinion(_flowTask.GetOneById(taskGuid.ToString()), new Organize().GetAllUsers(receiver), visibility.ToInt(20), note, null);// localizer); ;
return msg == "1" ? "已发起意见征求" : msg;
// return RoadFlowCommon.Tools.GetReturnJsonString("1".Equals(msg), "1".Equals(msg) ? localizer["SolicitOpinionSuccessfully"].Value : msg);
}
/// <summary>
/// 查询征求意见
/// </summary>
/// <returns></returns>
[HttpGet("GetSolicitOpinion")]
public dynamic GetSolicitOpinion(string taskId, string serverurl)
{
if (!taskId.IsGuid(out Guid taskGuid))
{
throw Oops.Oh("任务id错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
var taskModel = _flowTask.GetOneById(taskId);
if (taskModel == null)
{
throw Oops.Oh("未找到当前任务错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
if (taskModel.ReceiveId != _userManager.UserId)
{
throw Oops.Oh("权限错误,无法读取意见征询");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CannotViewSolicitOpinion"].Value);
}
var opinionTasks = _flowTask.GetListByGroupId(taskModel.GroupId).FindAll(p => p.PrevId == taskModel.Id && p.TaskType == 11);
JArray jArray = new JArray();
foreach (var opinionTask in opinionTasks.OrderByDescending(p => p.CompletedTime1).ThenBy(p => p.ReceiveTime))
{
jArray.Add(new JObject() {
{ "id", opinionTask.Id },
{ "name", opinionTask.ReceiveName },
{ "sendTime", opinionTask.ReceiveTime.ToShortDateTimeString() },
{ "isReturn", opinionTask.Status == 2 ? 1 : 0 },
{ "returnTime", opinionTask.CompletedTime1.ToShortDateTimeString() },
{ "returnContent", opinionTask.Comments },
{ "returnFiles", opinionTask.Attachment.ToVueFilesShowString(isBr:false, serverUrl:serverurl) },
});
}
return jArray;
//RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray);
}
/// <summary>
/// 验证签章密码
/// </summary>
/// <returns></returns>
[HttpPost("ValidPass")]
public string ValidPass([FromBody] JObject args)
{
string pass = args.GetJsonValue("pass");
var userModel = _userManager.User;
if (userModel == null || pass.IsNullOrWhiteSpace()
|| !new UserDummy().GetMD5Password(userModel.Id, pass.Trim()).Equals(userModel.Password))
{
throw Oops.Oh("密码错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["PasswordError"].Value);
}
else
{
return "密码正确";
//return RoadFlowCommon.Tools.GetReturnJsonString(true);
}
}
/// <summary>
/// 得到待办列表
/// </summary>
/// <returns></returns>
[HttpPost("GetWait")]
public dynamic GetWait([FromBody] JObject args)
{
string title = args.GetJsonValue("title");
string flow = args.GetJsonValue("flow");
string date1 = args.GetJsonValue("date1");
string date2 = args.GetJsonValue("date2");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
bool isMobile = "1".Equals(args.GetJsonValue("ismobile"));
string userId = _userManager.UserId;
if (order.IsNullOrWhiteSpace())
{
order = "ReceiveTime DESC";
}
var dt = _flowTask.GetWaitTask(size, number, userId, flow, title, date1, date2, order, out int total);
JArray jArray = new JArray();
foreach (var dr in dt)
{
string status = isMobile ? "" : "<span class=\"roadui_liststatus roadui_liststatus_normal\">" + /*localizer["Normal"].Value*/"正常" + "</span>";
if (dr.CompletedTime != null)
{
DateTime nowTime = DateExtensions.Now;
if (nowTime > dr.CompletedTime)
{
status = isMobile ? "<span class=\"roadui_new_red\">" + /*localizer["Overdue"].Value */"逾期" + "</span>" : "<span title='" + /*localizer["RequiredCompletionTime"].Value*/"截止时间" + dr.CompletedTime.Value.ToString("yyyy-MM-dd HH:mm") +
"' class=\"roadui_liststatus roadui_liststatusovertime\">" +/*localizer["Overdue"].Value */"逾期" + "</span>";
}
else if ((dr.CompletedTime - nowTime).Value.Days < 3)
{
double day = Math.Ceiling((dr.CompletedTime - nowTime).Value.TotalDays);
string dsystring = day == 0 ? (dr.CompletedTime - nowTime).Value.Hours + /*localizer["Hour"].Value*/"小时" : day.ToString() + /*localizer["Day"].Value*/"天";
status = isMobile ? "<span class=\"roadui_new_warning\">" + dsystring + /*localizer["Expire"].Value*/"有效期" + "</span>" : "<span title='" +/* localizer["RequiredCompletionTime"].Value */"截止时间" + dr.CompletedTime.Value.ToString("yyyy-MM-dd HH:mm") +
"' class=\"roadui_liststatus roadui_liststatuswarning\">" + dsystring + /*localizer["Expire"].Value*/"有效期" + "</span>";
}
else
{
status = isMobile ? "" : "<span title='" + /* localizer["RequiredCompletionTime"].Value */"截止时间" + dr.CompletedTime.Value.ToString("yyyy-MM-dd HH:mm") +
"' class=\"roadui_liststatus roadui_liststatus_normal\">" + /*localizer["Normal"].Value*/"正常" + "</span>";
}
}
//按钮组,这里用于存放要显示的按钮
JArray buttonArray = new JArray() {
{ /*localizer["Handle"].Value*/"处理" },{ /*localizer["Process"].Value */ "进行"}
};
if (_flowTask.IsDelete(dr.Id))//第一步发起人可以作废
{
buttonArray.Add(/*localizer["Nullify"].Value*/"作废");
}
string taskTypeStr = _flowTask.GetTaskTypeTitle(dr.TaskType, null);// localizer);
string titleNote = taskTypeStr.IsNullOrWhiteSpace() ? string.Empty : "<span class=\"roadui_new\">" + taskTypeStr + "</span>";//任务类型
JObject jObject = new JObject()
{
{ "Id", dr.Id },
{ "FlowId", dr.FlowId},
{ "StepId", dr.StepId},
{ "GroupId", dr.GroupId },
{ "InstanceId", dr.InstanceId },
{ "Title", titleNote + dr.Title },
{ "FlowName", dr.FlowName },
{ "StepName", dr.StepName},
{ "SenderName", dr.SenderName },
{ "ReceiveTime", dr.ReceiveTime.ToShortDateTimeString() },
{ "CompletedTime", status },
{ "Opation", new JObject(){ { "buttons", buttonArray } } },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//return RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 得到已办列表
/// </summary>
/// <returns></returns>
[HttpPost("GetCompleted")]
public dynamic GetCompleted([FromBody] JObject args)
{
string title = args.GetJsonValue("title");
string flow = args.GetJsonValue("flow");
string date1 = args.GetJsonValue("date1");
string date2 = args.GetJsonValue("date2");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
string userId = _userManager.UserId;
if (order.IsNullOrWhiteSpace())
{
order = "CompletedTime1 DESC";
}
var dt = _flowTask.GetCompletedTask(size, number, userId, flow, title, date1, date2, order, out int total);
JArray jArray = new JArray();
foreach (var dr in dt)
{
//按钮组,这里用于存放要显示的按钮
JArray buttonArray = new JArray() {
//{ localizer["Form"].Value },{ localizer["Process"].Value }
{ "来自"},{ "处理"}
};
bool isHasten = _flowTask.IsHasten(dr.Id, out bool isWithdraw);//是否可以催办, isWithdraw 是否可以撤回
if (isWithdraw)
{
buttonArray.Add("撤回"/*localizer["Withdraw"].Value*/);
}
if (isHasten)
{
buttonArray.Add("催促"/*localizer["Urging"].Value*/);
}
JObject jObject = new JObject()
{
{ "Id", dr.Id },
{ "FlowId", dr.FlowId },
{ "StepId", dr.StepId},
{ "GroupId", dr.GroupId },
{ "Title", dr.Title },
{ "InstanceId", dr.InstanceId },
{ "FlowName", dr.FlowName },
{ "StepName", dr.StepName},
{ "SenderName", dr.SenderName },
{ "ReceiveTime", dr.ReceiveTime.ToShortDateTimeString() },
{ "CompletedTime1", dr.CompletedTime1!=null? dr.CompletedTime1.ToShortDateTimeString() : string.Empty },
{ "Opation", new JObject(){ { "buttons", buttonArray } } },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 得到批量处理待办列表
/// </summary>
/// <returns></returns>
[HttpPost("GetWaitBatch")]
public dynamic GetWaitBatch([FromBody] JObject args)
{
string title = args.GetJsonValue("title");
string flow = args.GetJsonValue("flow");
string date1 = args.GetJsonValue("date1");
string date2 = args.GetJsonValue("date2");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
string userId = _userManager.UserId;
if (order.IsNullOrWhiteSpace())
{
order = "ReceiveTime DESC";
}
var dt = _flowTask.GetWaitTask(size, number, userId, flow, title, date1, date2, order, out int total, 1);
JArray jArray = new JArray();
foreach (var dr in dt)
{
string status = "<span class=\"roadui_liststatus roadui_liststatus_normal\">" + /*localizer["Normal"].Value*/"正常" + "</span>";
if (dr.CompletedTime != null)
{
DateTime nowTime = DateExtensions.Now;
if (nowTime > dr.CompletedTime)
{
status = "<span title='" + /* localizer["RequiredCompletionTime"].Value */"截止时间" + dr.CompletedTime.Value.ToString("yyyy-MM-dd HH:mm") +
"' class=\"roadui_liststatus roadui_liststatusovertime\">" + /*localizer["Overdue"].Value */"逾期" + "</div>";
}
else if ((dr.CompletedTime - nowTime).Value.Days < 3)
{
double day = Math.Ceiling((dr.CompletedTime - nowTime).Value.TotalDays);
string dsystring = day == 0 ? (dr.CompletedTime - nowTime).Value.Hours + /*localizer["Hour"].Value*/"小时" : day.ToString() + /*localizer["Day"].Value*/"天";
status = "<span title='" + /* localizer["RequiredCompletionTime"].Value */"截止时间" + dr.CompletedTime.Value.ToString("yyyy-MM-dd HH:mm") +
"' class=\"roadui_liststatus roadui_liststatuswarning\">" + dsystring + /*localizer["Expire"].Value*/"有效期" + "</span>";
}
else
{
status = "<span title='" + /* localizer["RequiredCompletionTime"].Value */"截止时间" + dr.CompletedTime.Value.ToString("yyyy-MM-dd HH:mm") +
"' class=\"roadui_liststatus roadui_liststatus_normal\">" + /*localizer["Normal"].Value*/"正常" + "</span>";
}
}
//按钮组,这里用于存放要显示的按钮
JArray buttonArray = new JArray() {
{ /*localizer["Handle"].Value*/"处理" },{ /*localizer["Process"].Value */ "进行"}
};
if (_flowTask.IsDelete(dr.Id))//第一步发起人可以作废
{
buttonArray.Add(/*localizer["Nullify"].Value*/"作废");
}
string taskTypeStr = _flowTask.GetTaskTypeTitle(dr.TaskType, null);// localizer);
string titleNote = taskTypeStr.IsNullOrWhiteSpace() ? string.Empty : "<span class=\"roadui_new\">" + taskTypeStr + "</span>";//任务类型
JObject jObject = new JObject()
{
{ "Id", dr.Id },
{ "FlowId", dr.FlowId},
{ "StepId", dr.StepId },
{ "GroupId", dr.GroupId},
{ "InstanceId", dr.InstanceId},
{ "Title", titleNote + dr.Title},
{ "FlowName", dr.FlowName},
{ "StepName", dr.StepName },
{ "SenderName", dr.SenderName },
{ "ReceiveTime", dr.ReceiveTime.ToDateTimeString() },
{ "CompletedTime", status },
{ "Opation", new JObject(){ { "buttons", buttonArray } } },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//return RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 查询我发起的流程
/// </summary>
/// <returns></returns>
[HttpPost("GetMyStart")]
public dynamic GetMyStart([FromBody] JObject args)
{
string title = args.GetJsonValue("title");
string flow = args.GetJsonValue("flow");
string date1 = args.GetJsonValue("date1");
string date2 = args.GetJsonValue("date2");
string status = args.GetJsonValue("status");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
string userId = _userManager.UserId;
if (order.IsNullOrWhiteSpace())
{
order = "ReceiveTime DESC";
}
var dt = _flowTask.GetMyStartList(size, number, userId, flow, title, date1, date2, status, order, out int total);
JArray jArray = new JArray();
foreach (var dr in dt)
{
JObject jObject = new JObject()
{
{ "Id", dr.Id},
{ "FlowId", dr.FlowId},
{ "StepId", dr.StepId},
{ "GroupId", dr.GroupId},
{ "Title", dr.Title },
{ "InstanceId", dr.InstanceId},
{ "FlowName", dr.FlowName},
{ "ReceiveTime", dr.ReceiveTime.ToShortDateTimeString() },
{ "StepName", dr.CurrentStepName.ToString().IsNullOrWhiteSpace() ? "<span class=\"roadui_liststatus roadui_liststatus_normal\">"+ /*localizer["Completed"].Value*/"已完成" +"</span>" : dr.CurrentStepName.ToString() },
{ "Opation", "" },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 查询已委托的任务
/// </summary>
/// <returns></returns>
[HttpPost("GetMyEntrust")]
public dynamic GetMyEntrust([FromBody] JObject args)
{
string title = args.GetJsonValue("title");
string flow = args.GetJsonValue("flow");
string date1 = args.GetJsonValue("date1");
string date2 = args.GetJsonValue("date2");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
string userId = _userManager.UserId;
if (order.IsNullOrWhiteSpace())
{
order = "ReceiveTime DESC";
}
var dt = _flowTask.GetEntrustTask(size, number, userId, flow, title, date1, date2, order, out int total);
JArray jArray = new JArray();
foreach (var dr in dt)
{
bool isEntrustWithdraw = dr.Status < 1; //_flowTask.IsEntrustWithdraw(dr["Id"].ToString().ToGuid());//是否可以撤回
//按钮组,这里用于存放要显示的按钮
JArray buttonArray = new JArray();
if (isEntrustWithdraw)
{
buttonArray.Add(/*localizer["Withdraw"].Value*/"撤回");
}
JObject jObject = new JObject()
{
{ "Id", dr.Id},
{ "FlowId", dr.FlowId},
{ "StepId", dr.StepId },
{ "GroupId", dr.GroupId },
{ "Title", dr.Title},
{ "FlowName", dr.FlowName },
{ "StepName", dr.StepName },
{ "SenderName", dr.SenderName },
{ "ReceiveTime", dr.ReceiveTime.ToShortDateTimeString() },
{ "ReceiveName", dr.ReceiveName },
{ "Status", _flowTask.GetExecuteTypeTitle(dr.ExecuteType) },
{ "Opation", new JObject(){ { "buttons", buttonArray } } },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 待办批量处理
/// </summary>
/// <returns></returns>
[HttpPost("WaitBatchExecute")]
public string WaitBatchExecute([FromBody] JObject args)
{
string[] ids = args.GetJsonValue("taskids").Split(',');
string executeType = args.GetJsonValue("executeType");
string comment = args.GetJsonValue("comment");
string serverUrl = args.GetJsonValue("archive_serverurl");
bool isMobile = "1".Equals(args.GetJsonValue("ismobile")) || "1".Equals(args.GetJsonValue("ismobile"));
int i = 0;
var userModel = _userManager.User;
foreach (string id in ids)
{
if (id.IsGuid(out Guid taskId))
{
var executeResultModel = _flowTask.AutoSubmit(taskId, executeType.IsNullOrWhiteSpace() ? "submit" : executeType, comment);
if (executeResultModel.IsSuccess)
{
i++;
#region
var currentTask = _flowTask.GetOneById(id);
if (currentTask != null)
{
//查找当前任务是否有动态步骤,有则从动态步骤中取流程运行时
var (dynamicTaskModel, flowTaskModel, groupTasks) = _flowTask.GetDynamicTask(currentTask.GroupId, currentTask.Id);
var flowRunModel = _flow.GetFlowRunModel(currentTask.FlowId, true, dynamicTaskModel);
var currentStepModel = flowRunModel.Steps.Find(p => p.Id == currentTask.StepId.ToGuid());
if (currentStepModel.Archives == 1)
{
var dbs = flowRunModel.Databases;
if (dbs.Count > 0)
{
StringBuilder comments = new StringBuilder();
var nowgroupTasks = _flowTask.GetListByGroupId(currentTask.GroupId).FindAll(p => p.Status == 2).OrderBy(p => p.Sort);
foreach (var nowtask in nowgroupTasks)
{
comments.Append("<div class=\"roadui_flowcommentdiv\"><table cellpadding=\"0\" cellspacing=\"0\""
+ " border=\"0\" width=\"100%\" class=\"roadui_flowcommenttable\"><tr>"
+ "<td style=\"width:15%;\">" + "步骤"/*localizer["Step"].Value*/ + "" + nowtask.StepName + "</td><td style=\"width: 15%;\">"
+ /*localizer["Handler"].Value*/"处理人" + "" + nowtask.ReceiveName + "</td><td style=\"width:22%;\">"
+ /*localizer["ReceiveTime"].Value*/"接收时间" + "" + nowtask.ReceiveTime.ToDateTimeString() + "</td>"
+ "<td style=\"width:23%;\">" +
/*localizer["CompletedTime"].Value*/"完成时间" + "" + nowtask.CompletedTime1.ToDateTimeString() + "</td><td style=\"width:15%;\">"
+ /*localizer["HandleType"].Value*/"处理类型" + "" + _flowTask.GetExecuteTypeTitle(nowtask.ExecuteType) + "</td></tr>"
+ (nowtask.Comments.IsNullOrEmpty() ? "" : "<tr><td colspan=\"5\"><span>" +
/*localizer["HandleOpinion"].Value*/"处理意见" + "" + nowtask.Comments + "</span>")
+ (nowtask.IsSign == 1 ? "<span><img src=\"" + serverUrl.Replace("/RoadFlowWeb", "") + "/roadflow-files/user-signs/"
+ nowtask.ReceiveId.ToLower() + "/default.png\" border=\"0\" class=\"roadui_flowcommentsignimg\"/></span>" : "")
+ (nowtask.Comments.IsNullOrEmpty() ? "" : "</td></tr>")
+ (nowtask.Attachment.IsNullOrWhiteSpace() ? ""
: "<tr><td colspan=\"5\">" + /*localizer["Accessories"].Value*/"附件" + "<span><span style=\"margin-right:10px;\">"
+ nowtask.Attachment.ToVueFilesShowString(false, serverUrl: serverUrl) + "</span></span></td></tr>")
+ "</table></div>");
}
var db = dbs.First();
string executeUserId = string.Empty;
string executeUserName = string.Empty;
executeUserId = !currentTask.ReceiveOrganizeId.IsNullOrWhiteSpace()
? IOrganize.PREFIX_RELATION + currentTask.ReceiveOrganizeId
: IOrganize.PREFIX_USER + currentTask.ReceiveId.ToString();
executeUserName = currentTask.ReceiveName;
string formHtml = string.Empty;//表单HTML
string formDataJson = string.Empty;//表单数据
var applbiraryModel = _appLibrary.GetOneById(isMobile && currentStepModel.StepForm.MobileId.IsNotEmptyGuid() ? currentStepModel.StepForm.MobileId.ToString() : currentStepModel.StepForm.Id.ToString());
if (applbiraryModel != null && applbiraryModel.Code.IsGuid(out Guid formGuid))
{
var formObject = _form.GetRunJObject(formGuid.ToString());
if (formObject != null)
{
if (formObject.ContainsKey("html"))
{
formHtml = formObject.Value<string>("html");
}
#region
JObject formDataObject = new JObject() {
{ "form_id", formObject.Value<string>("id") },
{ "form_dbconnid", formObject.Value<string>("conn") },
{ "form_dbtable", formObject.Value<string>("table") },
{ "form_dbtableprimarykey", formObject.Value<string>("primaryKey") },
{ "form_titlefield", formObject.Value<string>("titleField") },
{ "form_dbtabletitleexpression", formObject.Value<string>("titleExpression") },
{ "form_instanceid", currentTask.InstanceId },
{ "form_fieldstatus", new JObject() },
{ "flowid", currentTask.FlowId.ToString() },
{ "stepid", currentTask.StepId.ToString() },
{ "taskid", currentTask.Id.ToString() },
{ "groupid", currentTask.GroupId.ToString() },
};
string formatJson = formObject.ContainsKey("formatJson") ? formObject.Value<JArray>("formatJson").ToString(Newtonsoft.Json.Formatting.None) : "";//字段显示格式JSON
JObject valueTypeObject = formObject.Value<JObject>("valueTypeJson");//字段值类型JSON
JObject defaultValueJson = formObject.Value<JObject>("defaultValueJson");//默认值JSON
//获取表单数据
JArray formDataArray = _form.GetFormData(formObject.Value<string>("conn"), formObject.Value<string>("table"),
formObject.Value<string>("primaryKey"), currentTask.InstanceId, currentTask.StepId.ToString()
, currentTask.FlowId.ToString(), formatJson, out string fieldStatusJson, currentTask.GroupId.ToString()).ToJArray();
//将归档字段状态全部设置为只读
JArray archiveFieldStatusArray = fieldStatusJson.ToJArray();
JObject archiveFieldStatusObject = new JObject();
if (archiveFieldStatusArray != null)
{
foreach (var jobject in archiveFieldStatusArray)
{
archiveFieldStatusObject.Add(jobject.Value<string>("name"), 1);
}
}
formDataObject.Add("archive_fieldStatus", archiveFieldStatusObject.ToString(Newtonsoft.Json.Formatting.None));
foreach (JObject valueObject in formDataArray)
{
formDataObject.Add(valueObject.Value<string>("name"), valueObject.Value<string>("value"));
}
if (formDataArray.IsEmptyJArray() && defaultValueJson != null)//是否是第一次加载,判断是否采用默认值。
{
foreach (var j in defaultValueJson)
{
string defaultValue = j.Value.Value<string>();
if (!defaultValue.IsNullOrWhiteSpace())
{
//组织通配符obj参数
RoadFlow.Model.FlowRunModel.EventParam eventParam = new RoadFlow.Model.FlowRunModel.EventParam
{
FlowId = currentTask.FlowId.ToGuid(),
FlowRunModel = flowRunModel
};
formDataObject.Add(j.Key, RoadFlow.Business.Wildcard.Filter(defaultValue, userModel, eventParam));
}
}
}
#region
if (formObject.ContainsKey("datatableJson"))
{
foreach (JObject dtObject in formObject.Value<JArray>("datatableJson"))
{
string dtId = dtObject.Value<string>("id");
int source = dtObject.Value<string>("source").ToInt(0);
string text = dtObject.Value<string>("text");
string conn = dtObject.Value<string>("conn");
if (source == 0 && conn.IsGuid(out Guid connGuid))//SQL
{
var (rows, cols) = _form.GetDataTablJArray(connGuid.ToString(), RoadFlow.Business.Wildcard.Filter(text, userModel, formDataObject));
formDataObject.Add(dtId, new JObject() { { "rows", rows }, { "cols", cols }, { "selects", new JArray() } });
}
if (source == 1)//URL
{
JObject urlObject;
try
{
urlObject = HttpHelper.HttpGet((Furion.App.HttpContext.Request.IsHttps ? "https://" : "http://") + Furion.App.HttpContext.Request.Host.Value + RoadFlow.Business.Wildcard.Filter(text, userModel, formDataObject)).ToJObject();
}
catch
{
urlObject = null;
}
if (urlObject != null)
{
JArray rowsArray = new JArray();
try
{
rowsArray = urlObject.ContainsKey("rows") ? urlObject.Value<JArray>("rows") : new JArray();
}
catch { }
JArray colssArray = new JArray();
try
{
colssArray = urlObject.ContainsKey("cols") ? urlObject.Value<JArray>("cols") : new JArray();
}
catch { }
formDataObject.Add(dtId, new JObject() { { "rows", rowsArray }, { "cols", colssArray }, { "selects", new JArray() } });
}
else
{
formDataObject.Add(dtId, new JObject() { { "rows", new JArray() }, { "cols", new JArray() }, { "selects", new JArray() } });
}
}
}
}
#endregion
#region
JArray subTableJarray = formObject.Value<JArray>("subtableJson");
if (subTableJarray != null)
{
foreach (JObject sdtObject in subTableJarray)
{
string subDtId = sdtObject.Value<string>("id");
JArray sRows = _form.GetSubTableJarray(sdtObject, formObject.Value<string>("conn"), currentTask.InstanceId);
if (formDataObject.ContainsKey(id))
{
formDataObject[subDtId] = new JObject() { { "rows", sRows } };
}
else
{
formDataObject.Add(subDtId, new JObject() { { "rows", sRows } });
}
}
//默认值
formDataObject.Add("subtableDefaultValue", _form.GetSubTableDefaultValueJArray(subTableJarray, userModel));
}
#endregion
formDataJson = formDataObject.ToString(Newtonsoft.Json.Formatting.None);
#endregion
}
}
RoadFlow.Model.rf_flowarchive flowArchiveModel = new RoadFlow.Model.rf_flowarchive
{
Comments = comments.ToString(),
DataJson = formDataJson,
FlowId = flowRunModel.Id.ToString(),
FlowName = flowRunModel.Name,
Id = Guid.NewGuid().ToString(),
InstanceId = currentTask.InstanceId,
StepId = currentStepModel.Id.ToString(),
StepName = currentStepModel.Name,
TaskId = currentTask.Id,
Title = currentTask.Title,
UserId = executeUserId,
UserName = executeUserName,
WriteTime = DateExtensions.Now,
FormHtml = formHtml
};
_flowArchive.Add(flowArchiveModel);
}
}
}
#endregion
}
else
{
_log.Add("批量提交待办事项发生了错误 - " + executeResultModel.Messages, _userManager.UserId, executeResultModel.ToString(), LogType.);
}
}
}
return "成功处理" + i.ToString() + "条";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["HandleSuccess"].Value + i.ToString() + localizer["TodoItems"].Value);
}
/// <summary>
/// 作废待办
/// </summary>
/// <returns></returns>
[HttpGet("DeleteTask")]
public string DeleteTask(string deltaskid)
{
if (!deltaskid.IsGuid(out Guid taskId))
{
throw Oops.Oh("任务id错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
var taskModel = _flowTask.GetOneById(deltaskid);
if (null == taskModel)
{
throw Oops.Oh("未找到当前任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["NotFoundCurrentTask"].Value);
}
_flowTask.DeleteByGroupId(taskModel.GroupId);
var flowrunModel = _flow.GetFlowRunModel(taskModel.FlowId);
if (null == flowrunModel)
{
throw Oops.Oh("未找到执行对象");
// return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["NotFoundFlowRunModel"].Value);
}
var stepModel = flowrunModel.Steps.Find(p => p.Id == taskModel.StepId.ToGuid());
if (null == stepModel)
{
//return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["NotFoundFlowStep"].Value);
}
var applibrary = _appLibrary.GetOneById(stepModel.StepForm.Id.ToString());
if (null != applibrary && applibrary.Code.IsGuid(out Guid formId))
{
_form.DeleteFormData(formId.ToString(), taskModel.InstanceId);//, localizer: localizer);
}
return "成功作废";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["NullifySuccessfully"].Value);
}
/// <summary>
/// 撤回
/// </summary>
/// <returns></returns>
[HttpGet("Withdraw")]
public string Withdraw(string taskId , string groupId)
{
if (!taskId.IsGuid(out Guid taskGuid) || !groupId.IsGuid(out Guid groupGuid))
{
throw Oops.Oh("参数错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ParameterError"].Value);
}
var groupTasks = _flowTask.GetListByGroupId(groupId);
var taskModel = groupTasks.Find(p => p.Id == taskId);
if (taskModel == null)
{
throw Oops.Oh("未找到当前任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
if (taskModel.ReceiveId != _userManager.UserId)
{
throw Oops.Oh("您无权处理当前任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["YourCannotHandleTask"].Value);
}
var tasks = groupTasks.FindAll(p => p.PrevId == taskGuid.ToString() && p.Status <= 0);
if (tasks.Count == 0)
{
throw Oops.Oh("不能撤销");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CannotWithdraw"].Value);
}
List<RoadFlow.Model.rf_flowtask> removeTasks = new List<RoadFlow.Model.rf_flowtask>();
foreach (var task in tasks)
{
removeTasks.Add(task);
}
List<RoadFlow.Model.rf_flowtask> updateTasks = new List<RoadFlow.Model.rf_flowtask>();
var currentTask = groupTasks.Find(p => p.Id == taskGuid.ToString());
if (null == currentTask)
{
throw Oops.Oh("未找到当前任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
currentTask.Status = 0;
currentTask.ExecuteType = 0;
currentTask.Comments = "";
currentTask.IsSign = 0;
currentTask.CompletedTime1 = new DateTime?();
updateTasks.Add(currentTask);
#region 退
var flowRunModel = _flow.GetFlowRunModel(currentTask.FlowId);
var currentStep = flowRunModel?.Steps.Find(p => p.Id == currentTask.StepId.ToGuid());
List<(string, object[], int)> executeSqls = new List<(string, object[], int)>();
RoadFlow.Model.FlowRunModel.EventParam eventParam = new RoadFlow.Model.FlowRunModel.EventParam
{
FlowId = currentTask.FlowId.ToGuid(),
StepId = currentTask.StepId.ToGuid(),
FlowRunModel = flowRunModel,
GroupId = currentTask.GroupId.ToGuid(),
InstanceId = currentTask.InstanceId,
TaskId = currentTask.Id.ToGuid(),
TaskTitle = currentTask.Title
};
if (currentStep != null)
{
if (!currentStep.StepEvent.BackBefore.IsNullOrWhiteSpace())
{
if (currentStep.StepEvent.BackBefore.Trim().StartsWith("[sql]"))
{
//如果是以[sql]开头则说明是SQL语句
object[] objects = new object[] { eventParam.TaskId, eventParam.InstanceId, eventParam.GroupId };
executeSqls.Add((RoadFlow.Business.Wildcard.Filter(currentStep.StepEvent.BackBefore.Trim(), null, null).TrimStart("[sql]".ToCharArray()), objects, 0));
}
else
{
var (eventReturn, err) = RoadFlow.Utility.Tools.ExecuteMethod(currentStep.StepEvent.BackBefore.Trim(), eventParam);
if (null != err)
{
_log.Add("撤回任务时执行退回前事件发生了错误-" + flowRunModel.Name + "-" + currentStep.Name + "-" + currentStep.StepEvent.SubmitBefore, _userManager.UserId, "参数:" + eventParam.ToString() + " 错误:" + err.Message + err.StackTrace + err.Source, LogType.);
}
}
}
//退回后SQL
if (!currentStep.StepEvent.BackAfter.IsNullOrWhiteSpace() && currentStep.StepEvent.BackAfter.Trim().StartsWith("[sql]"))
{
//如果是以[sql]开头则说明是SQL语句
object[] objects = new object[] { eventParam.TaskId, eventParam.InstanceId, eventParam.GroupId };
executeSqls.Add((RoadFlow.Business.Wildcard.Filter(currentStep.StepEvent.BackAfter.Trim(), null, null).TrimStart("[sql]".ToCharArray()), objects, 1));
}
//退回通过后sql
if (!currentStep.StepEvent.BackPassAfter.IsNullOrWhiteSpace() && currentStep.StepEvent.BackPassAfter.Trim().StartsWith("[sql]"))
{
//如果是以[sql]开头则说明是SQL语句
object[] objects = new object[] { eventParam.TaskId, eventParam.InstanceId, eventParam.GroupId };
executeSqls.Add((RoadFlow.Business.Wildcard.Filter(currentStep.StepEvent.BackPassAfter.Trim(), null, null).TrimStart("[sql]".ToCharArray()), objects, 1));
}
}
#endregion
_flowTask.Update(removeTasks, updateTasks, null, executeSqls);
#region 退退
//退回后事件
if (!currentStep.StepEvent.BackAfter.IsNullOrWhiteSpace() && !currentStep.StepEvent.BackAfter.Trim().StartsWith("[sql]"))
{
var (eventReturn, err) = Tools.ExecuteMethod(currentStep.StepEvent.BackAfter.Trim(), eventParam);
if (null != err)
{
_log.Add("撤回任务时执行退回后事件发生了错误-" + flowRunModel.Name + "-" + currentStep.Name + "-" + currentStep.StepEvent.SubmitBefore, _userManager.UserId, "参数:" + eventParam.ToString() + " 错误:" + err.Message + err.StackTrace + err.Source, LogType.);
}
}
//退回通过后事件
if (!currentStep.StepEvent.BackPassAfter.IsNullOrWhiteSpace() && !currentStep.StepEvent.BackPassAfter.Trim().StartsWith("[sql]"))
{
var (eventReturn, err) = Tools.ExecuteMethod(currentStep.StepEvent.BackPassAfter.Trim(), eventParam);
if (null != err)
{
_log.Add("撤回任务时执行退回通过后事件发生了错误-" + flowRunModel.Name + "-" + currentStep.Name + "-" + currentStep.StepEvent.SubmitBefore, _userManager.UserId, "参数:" + eventParam.ToString() + " 错误:" + err.Message + err.StackTrace + err.Source, LogType.);
}
}
#endregion
return "撤回成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["WithdrawSuccessfully"].Value);
}
/// <summary>
/// 撤回已委托的任务
/// </summary>
/// <returns></returns>
[HttpGet("WithdrawEntrust")]
public string WithdrawEntrust(string taskid)
{
if (!taskid.IsGuid(out Guid tid))
{
throw Oops.Oh("任务id错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
var taskModel = _flowTask.GetOneById(taskid);
if (null == taskModel)
{
throw Oops.Oh("未找到当前任务");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
if (taskModel.EntrustUserId.IsNullOrWhiteSpace())
{
throw Oops.Oh("并非委托任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIsNotWtTask"].Value);
}
taskModel.ReceiveId = taskModel.EntrustUserId;
taskModel.ReceiveName = _userDummy.Get(taskModel.EntrustUserId).Name;
taskModel.EntrustUserId = new Guid?().ToString();
taskModel.Note = "";
_flowTask.Update(taskModel);
return "撤回成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["WithdrawSuccessfully1"].Value);
}
/// <summary>
/// 得到催办信息
/// </summary>
/// <returns></returns>
[HttpGet("GetHastenInfo")]
public dynamic GetHastenInfo(string taskId, string groupId)
{
if (!taskId.IsGuid(out Guid taskGuid) || !groupId.IsGuid(out Guid groupGuid))
{
throw Oops.Oh("参数错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ParameterError"].Value);
}
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
//得到可以催办的人员
var groupTasks = _flowTask.GetListByGroupId(groupId);
var hastenTasks = groupTasks.FindAll(p => p.PrevId == taskId && p.Status.In(0, 1));
if (hastenTasks.Count == 0)
{
throw Oops.Oh("参数错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ParameterError"].Value);
}
JObject jObject = new JObject();
JArray jArray = new JArray();
foreach (var task in hastenTasks)
{
JObject jObject1 = new JObject
{
{ "value", task.ReceiveId },
{ "title", task.ReceiveName }
};
if (task.Status.In(0, 1) && !jArray.Contains(jObject1))
{
jArray.Add(jObject1);
}
}
jObject.Add("users", jArray);
jObject.Add("contents", /*localizer["YourHasTodoTask"].Value*/"您有待处理的任务" + hastenTasks.FirstOrDefault().Title + "你有待处理任务" /*localizer["YourHasTodoTaskHandle"].Value*/);
return jObject;
//return RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: jObject);
}
/// <summary>
/// 保存催办
/// </summary>
/// <returns></returns>
[HttpPost("SaveHasten")]
public string SaveHasten([FromBody] JObject args)
{
string userId = args.GetJsonValue("UserId");
string type = args.GetJsonValue("Type");
string contents = args.GetJsonValue("Contents");
string groupId = args.GetJsonValue("GropuId");
string taskId = args.GetJsonValue("TaskId");
//得到可以催办的人员
var groupTasks = _flowTask.GetListByGroupId(groupId);
var hastenTasks = groupTasks.FindAll(p => p.PrevId == taskId && p.Status.In(0, 1));
List<RoadFlow.Model.rf_flowtask> hastenTasks1 = new List<RoadFlow.Model.rf_flowtask>();
foreach (string user in userId.Split(','))
{
if (!user.IsGuid(out Guid userGuid))
{
continue;
}
var taskModel = hastenTasks.Find(p => p.ReceiveId == user);
if (taskModel != null && !hastenTasks1.Exists(p => p.ReceiveId == user))
{
hastenTasks1.Add(taskModel);
}
}
_flowTask.SendMessage(hastenTasks1, _userManager.User, type, contents);
return "催办成功";
//return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["UrgingSuccessfully"].Value);
}
/// <summary>
/// 得到处理过程
/// </summary>
/// <returns></returns>
[HttpGet("GetProcess")]
public dynamic GetProcess(string groupId, string stepId, string serverurl, string stringissubflow)
{
bool isSubFlow = "1".Equals(stringissubflow);//是否是查看子流程
if (!groupId.IsGuid(out Guid groupGuid))
{
throw Oops.Oh("参数错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ParameterError"].Value);
}
//Guid userId = Current.GetUserId(Request);
string userId = _userManager.UserId;
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
//RoadFlow.Business.User user = new RoadFlow.Business.User();
//RoadFlow.Business.Organize organize = new RoadFlow.Business.Organize();
//RoadFlow.Business.FileManage fileManage = new RoadFlow.Business.FileManage();
List<RoadFlow.Model.rf_flowtask> groupTasks;
if (isSubFlow)
{
var gTasks = _flowTask.GetListByGroupId(groupId).OrderByDescending(p => p.Sort).Where(p => p.SubFlowGroupId.IsGuid() && p.StepId == stepId);
groupTasks = gTasks.Any() ? _flowTask.GetListByGroupId(gTasks.FirstOrDefault().SubFlowGroupId) : new List<RoadFlow.Model.rf_flowtask>();
}
else
{
groupTasks = _flowTask.GetListByGroupId(groupId);
}
if (_flowTask.IsOpenProcess(userId, groupTasks) == -1)
{
throw Oops.Oh("无法查看进程");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CannotViewProcess"].Value);
}
JArray jArray = new JArray();
foreach (var task in groupTasks)
{
//如果是征求意见并且仅征求人自己可见,则不显示。
if (task.TaskType == 11 && task.OtherType == 20 && task.SenderId != userId && task.ReceiveId != userId)
{
continue;
}
JObject jObject = new JObject()
{
{ "Id", task.Id.ToString() },
{ "FlowId", task.FlowId.ToString() },
{ "StepId", task.StepId.ToString() },
{ "StepName", task.StepName },
{ "SenderName", task.SenderName },
{ "ReceiveTime", task.ReceiveTime.ToShortDateTimeString() },
{ "ReceiveName", task.ReceiveName },
{ "TaskType", task.TaskType },
{ "OtherType", task.OtherType },
//{ "ReceiveOrg", task.ReceiveOrganizeId.HasValue ? organize.GetParentsName(task.ReceiveOrganizeId.Value, false) : user.GetOrganizeMainShowHtml(task.ReceiveId, false) },
{ "ReceiveOrg", "" },
{ "CompletedTime1", task.CompletedTime1.HasValue ? task.CompletedTime1.Value.ToShortDateTimeString() : string.Empty },
{ "Status", _flowTask.GetExecuteTypeTitle(task.ExecuteType,null) },// localizer) },
{ "Status1", task.Status },
{ "ExecuteType", task.ExecuteType },
{ "Comments", task.Comments },
//{ "Attachment", task.Attachment.ToVueFilesShowString(isBr:false, serverUrl:serverurl) },
{ "Attachment", "" },//fileManage.GetFileShowArray(task.Attachment, RoadFlow.Business.FileManage.RootPath, serverurl) },
{ "IsSign", task.IsSign },
{ "Note", task.Note },
};
if (task.IsSign == 1)
{
//签章图片地址
var userModel = _userDummy.Get(task.ReceiveId);
jObject.Add("SignSrc", userModel == null ? "" : _userDummy.GetSignSrcVue(userModel.Id.ToString(), userModel.Name));
}
jArray.Add(jObject);
}
//dynamicStep作为区分是否是动态步骤 的msg返回 步骤id|groupid。
var dynamicStep = groupTasks.Find(p => !p.BeforeStepId.IsNullOrWhiteSpace() && p.BeforeStepId.IsNullOrWhiteSpace());
return jArray;
//return RoadFlowCommon.Tools.GetReturnJsonString(true, dynamicStep == null ? "" : dynamicStep.BeforeStepId.Value.ToString() + "|" + dynamicStep.GroupId.ToString(), jArray: jArray);
}
/// <summary>
/// 得到一个步骤的后续步骤
/// </summary>
/// <returns></returns>
[HttpGet("GetNextSteps")]
public dynamic GetNextSteps(string stepId, string flowId, string taskId, string groupId)
{
if (!flowId.IsGuid(out Guid flowGuid))
{
throw Oops.Oh("工作流ID错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
if (!taskId.IsGuid())
{
throw Oops.Oh("请先保存任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FirstSaveTask"].Value);
}
var flowRunModel = _flow.GetFlowRunModel(flowId);
if (null == flowRunModel)
{
throw Oops.Oh("未找到流程执行对象");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowRunModel"].Value);
}
if (!stepId.IsGuid(out Guid stepGuid))
{
stepGuid = flowRunModel.FirstStepId;
}
var nextSteps = _flow.GetAllNextSteps(flowRunModel, stepGuid);
JArray jArray = new JArray();
var nextStepsHandle = _flowTask.GetNextStepsHandle(_flowTask.GetListByGroupId(groupId));
foreach (var step in nextSteps)
{
jArray.Add(new JObject() {
{ "id", step.Id },
{ "name", step.Name },
{ "member", nextStepsHandle.ContainsKey(step.Id) ? nextStepsHandle[step.Id] : string.Empty }, //已经设置的人员
});
}
return jArray;
//RoadFlowCommon.Tools.GetReturnJsonString(true, jArray: jArray);
}
/// <summary>
/// 保存指定的步骤处理人
/// </summary>
/// <returns></returns>
[HttpPost("SaveStepsProcessor")]
public string SaveStepsProcessor([FromBody] JObject args)
{
int length = args.GetJsonValue("length").ToInt(0);//("length").ToInt(0);
string taskId = args.GetJsonValue("taskid");
if (!taskId.IsGuid(out Guid taskGuid))
{
throw Oops.Oh("任务id错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
//Business.FlowTask flowTask = new Business.FlowTask();
var taskModel = _flowTask.GetOneById(taskId);
if (null == taskModel)
{
throw Oops.Oh("未找到当前任务");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
JArray jArray = new JArray();
for (int i = 0; i < length; i++)
{
string id = args.GetJsonValue(i.ToString() + "[id]");
string member = args.GetJsonValue(i.ToString() + "[member]");
JObject jObject = new JObject
{
{ "stepId", id },
{ "handle", member }
};
jArray.Add(jObject);
}
taskModel.NextStepsHandle = jArray.ToString(Newtonsoft.Json.Formatting.None);
_flowTask.Update(taskModel);
return "设置成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["SetSuccessfully"].Value);
}
/// <summary>
/// 得到当前任务主流程信息
/// </summary>
/// <returns></returns>
[HttpGet("GetMainFlowInfo")]
public dynamic GetMainFlowInfo(string taskId)
{
if (!taskId.IsGuid(out Guid taskGuid))
{
throw Oops.Oh("任务ID错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
// RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
var taskModel = _flowTask.GetOneById(taskId);
if (taskModel == null)
{
throw Oops.Oh("未找到当前任务");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
var tasks = _flowTask.GetListBySubFlowGroupId(taskModel.GroupId);
if (tasks.Count == 0)
{
throw Oops.Oh("未找到主流程");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundMainFlow"].Value);
}
var task = tasks.FirstOrDefault();
JObject jObject = new JObject()
{
{ "Id", task.Id.ToString() },
{ "FlowId", task.FlowId.ToString() },
{ "StepId", task.StepId.ToString() },
{ "InstanceId", task.InstanceId },
{ "GroupId", task.GroupId }
};
return jObject;
//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: jObject);
}
#endregion
#region
/// <summary>
/// 查询实例管理列表
/// </summary>
/// <returns></returns>
[HttpPost("GetInstanceManage")]
public dynamic GetInstanceManage([FromBody] JObject args)
{
string FlowId = args.GetJsonValue("FlowId");
string Title = args.GetJsonValue("Title");
string ReceiveId = args.GetJsonValue("ReceiveId");
string Date1 = args.GetJsonValue("date1");
string Date2 = args.GetJsonValue("date2");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
string userId = _userManager.UserId;
if (order.IsNullOrWhiteSpace())
{
order = "ReceiveTime DESC";
}
if (FlowId.IsNullOrWhiteSpace())
{
FlowId = _flow.GetManageInstanceFlowIds(userId).JoinSqlIn();
}
var dt = _flowTask.GetInstanceList(size, number, FlowId, Title, ReceiveId.RemoveUserPrefix(), Date1, Date2, order, out int total);
JArray jArray = new JArray();
foreach (var dr in dt)
{
JObject jObject = new JObject()
{
{ "Id", dr.Id },
{ "FlowId", dr.FlowId},
{ "StepId", dr.StepId },
{ "GroupId", dr.GroupId},
{ "Title", dr.Title },
{ "FlowName", dr.FlowName},
{ "StepName", dr.StepName },
{ "ReceiveName", dr.ReceiveName},
{ "ReceiveTime",dr.ReceiveTime.ToShortDateTimeString() },
{ "ExecuteType", _flowTask.GetExecuteTypeTitle(dr.ExecuteType) },
{ "Opation", "" },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//return RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 得到实例管理的任务列表
/// </summary>
/// <returns></returns>
[HttpGet("GetInstanceManageTasks")]
public dynamic GetInstanceManageTasks(string groupId)
{
if (!groupId.IsGuid(out Guid groupGuid))
{
throw Oops.Oh("参数错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ParameterError"].Value);
}
var groupTasks = _flowTask.GetListByGroupId(groupId);
JArray jArray = new JArray();
foreach (var task in groupTasks)
{
//按钮组,这里用于存放要显示的按钮
JArray buttonArray = new JArray() {
//{ localizer["Status"].Value },{ localizer["Process"].Value }
{ "状态"},{ "处理"}
};
if (task.ExecuteType.In(0, 1) && 5 != task.TaskType && 11 != task.TaskType)
{
buttonArray.Add("设计");//localizer["TaskType_Designate"].Value);
buttonArray.Add("前往");// localizer["TaskType_Goto"].Value);
}
buttonArray.Add("删除");// localizer["Delete"].Value);
JObject jObject = new JObject()
{
{ "Id", task.Id.ToString() },
{ "StepId", task.StepId.ToString() },
{ "StepName", task.StepName },
{ "SenderName", task.SenderName },
{ "ReceiveTime", task.ReceiveTime.ToDateTimeString() },
{ "ReceiveName", task.ReceiveName },
{ "CompletedTime1", task.CompletedTime1.ToDateTimeString() },
{ "ExecuteType", task.ExecuteType },
{ "Status", _flowTask.GetExecuteTypeTitle(task.ExecuteType) },
{ "Note", task.Note },
{ "Opation", new JObject(){ { "buttons", buttonArray } } },
};
jArray.Add(jObject);
}
return jArray;
//RoadFlowCommon.Tools.GetReturnJsonString(true, jArray: jArray);
}
/// <summary>
/// 改变任务状态
/// </summary>
/// <returns></returns>
[HttpPost("ChageTaskStatus")]
public string ChageTaskStatus([FromBody] JObject args)
{
string taskId = args.GetJsonValue("taskId");
string executeType = args.GetJsonValue("executeType");
if (!taskId.IsGuid(out Guid taskGuid) || !executeType.IsInt(out int executeTypeInt))
{
throw Oops.Oh("参数错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["ParameterError"].Value);
}
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
var taskModel = _flowTask.GetOneById(taskId);
if (taskModel == null)
{
throw Oops.Oh("未找到当前任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
int oldStatus = taskModel.ExecuteType;
taskModel.ExecuteType = executeTypeInt;
if (executeTypeInt < 2)
{
taskModel.Status = executeTypeInt;
}
else
{
taskModel.Status = 2;
}
_flowTask.Update(taskModel);
_log.Add("改变了任务状态-" + taskModel.Title,_userManager.UserId, taskModel.Id.ToString(), LogType., "旧状态:" + oldStatus, "新状态:" + taskModel.ExecuteType);
return "状态改变成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["StatusChangeSuccessfully"].Value);
}
/// <summary>
/// 删除单条任务(仅删除task不删除表单数据等其它)
/// </summary>
/// <returns></returns>
[HttpGet("DeleteOneTask")]
public string DeleteOneTask(string deltaskid)
{
if (!deltaskid.IsGuid(out Guid taskId))
{
throw Oops.Oh("任务ID错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
var taskModel = _flowTask.GetOneById(deltaskid);
if (null == taskModel)
{
throw Oops.Oh("未找到当前任务");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
_flowTask.DeleteBy(x=>x.Id==deltaskid);
_log.Add("管理员删除了流程任务-" + taskModel.Title + "-" + taskModel.Id,_userManager.UserId ,taskModel.ToString(), LogType.);
return "删除成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["DeleteSuccessfully"].Value);
}
/// <summary>
/// 指派任务
/// </summary>
/// <returns></returns>
[HttpPost("DesignateTask")]
public string DesignateTask([FromBody] JObject args)
{
string taskid = args.GetJsonValue("taskId");
string user = args.GetJsonValue("UserId");
if (!taskid.IsGuid(out Guid taskId))
{
throw Oops.Oh("任务ID错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
if (user.IsNullOrWhiteSpace())
{
throw Oops.Oh("未选择指派用户");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NoSelectDesignateUser"].Value);
}
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
var taskModel = _flowTask.GetOneById(taskid);
if (null == taskModel)
{
throw Oops.Oh("未找到当前用户");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
string msg = _flowTask.Designate(taskModel, _organize.GetAllUsers(user), null);//localizer);
_log.Add("指派了任务-" + taskModel.Title,_userManager.UserId ,taskModel.ToString() + "-" + msg, LogType., others: user);
if (msg == "1")
return "指派成功";
else
throw Oops.Oh(msg);
//RoadFlowCommon.Tools.GetReturnJsonString("1".Equals(msg), "1".Equals(msg) ? localizer["DesignateSuccessfully"].Value : msg);
}
/// <summary>
/// 得到要跳转的步骤
/// </summary>
/// <returns></returns>
[HttpGet("GetGotoSteps")]
public dynamic GetGotoSteps(string taskid)
{
if (!taskid.IsGuid(out Guid taskId))
{
throw Oops.Oh("任务ID错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
var taskModel = _flowTask.GetOneById(taskid);
if (null == taskModel)
{
throw Oops.Oh("未找到当前任务");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
var flowRunModel = _flow.GetFlowRunModel(taskModel.FlowId);
if (null == flowRunModel)
{
throw Oops.Oh("未找到当前任务步骤");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundFlowRunModel"].Value);
}
JArray jArray = new JArray();
foreach (var step in flowRunModel.Steps)
{
jArray.Add(new JObject()
{
{ "id", step.Id },
{ "name", step.Name },
{ "users", "" },
});
}
return jArray;// RoadFlowCommon.Tools.GetReturnJsonString(true, jArray: jArray);
}
/// <summary>
/// 跳转任务
/// </summary>
/// <returns></returns>
[HttpPost("GotoTask")]
public string GotoTask([FromBody] JObject args)
{
string taskid = args.GetJsonValue("taskId");
string steps = args.GetJsonValue("steps");
if (!taskid.IsGuid(out Guid taskId))
{
throw Oops.Oh("任务ID错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["TaskIdError"].Value);
}
//RoadFlow.Business.FlowTask flowTask = new RoadFlow.Business.FlowTask();
var taskModel = _flowTask.GetOneById(taskid);
if (null == taskModel)
{
throw Oops.Oh("未找到当前任务");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundCurrentTask"].Value);
}
Dictionary<Guid, List<SysUser>> dicts = new Dictionary<Guid, List<SysUser>>();
JArray stepsArray = JArray.Parse(steps);
foreach (JObject stepObject in stepsArray)
{
string stepId = stepObject.Value<string>("id");
if (!stepId.IsGuid(out Guid stepGuid))
{
continue;
}
string member = stepObject.Value<string>("users");
if (member.IsNullOrWhiteSpace())
{
continue;
}
dicts.Add(stepGuid, _organize.GetAllUsers(member));
}
string msg = _flowTask.GoTo(taskModel, dicts, null);// localizer);
_log.Add("跳转了任务-" + taskModel.Title,_userManager.UserId ,taskModel.ToString() + "-" + msg, LogType., others: Newtonsoft.Json.JsonConvert.SerializeObject(dicts));
if (msg == "1")
return "跳转成功";
else
throw Oops.Oh(msg);
//return RoadFlowCommon.Tools.GetReturnJsonString("1".Equals(msg), "1".Equals(msg) ? localizer["GotoSuccessfully"].Value : msg);
}
/// <summary>
/// 删除实例
/// </summary>
/// <returns></returns>
[HttpGet("DeleteInstance")]
public string DeleteInstance(string groupId, string taskId)
{
if (!groupId.IsGuid(out Guid guid))
{
throw Oops.Oh("组ID错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["GroupidError"].Value);
}
var groupTasks = _flowTask.GetListByGroupId(groupId);
if (groupTasks.Count > 0)
{
_flowTask.DeleteByGroupId(groupId);// groupTasks.ToArray());
_log.Add("管理员删除了流程实例-" + groupTasks.First().Title,_userManager.UserId,Newtonsoft.Json.JsonConvert.SerializeObject(groupTasks), LogType.);
}
//删除实例对应的业务表数据
if (taskId.IsGuid(out Guid taskGuid))
{
var taskModel = groupTasks.Find(p => p.Id == taskId);
if (taskModel != null)
{
var flowrunModel = _flow.GetFlowRunModel(taskModel.FlowId);
if (null == flowrunModel)
{
throw Oops.Oh("未找到流程模型");
// return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["NotFoundFlowRunModel"].Value);
}
var stepModel = flowrunModel.Steps.Find(p => p.Id == taskModel.StepId.ToGuid());
if (null == stepModel)
{
//return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["NotFoundFlowStep"].Value);
}
var applibrary = _appLibrary.GetOneById(stepModel.StepForm.Id.ToString());
if (null != applibrary && applibrary.Code.IsGuid(out Guid formId))
{
_form.DeleteFormData(formId.ToString(), taskModel.InstanceId,null, isVue: true); //localizer: localizer,
}
}
}
return "删除成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["DeleteSuccessfully"].Value);
}
#endregion
#region
/// <summary>
/// 归档查询
/// </summary>
/// <returns></returns>
[HttpPost("GetArchives")]
public dynamic GetArchives([FromBody] JObject args)
{
string FlowId = args.GetJsonValue("FlowId");
string StepName = args.GetJsonValue("StepName");
string Title = args.GetJsonValue("Title");
string date1 = args.GetJsonValue("date1");
string date2 = args.GetJsonValue("date2");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
if (order.IsNullOrWhiteSpace())
{
order = "WriteTime DESC";
}
var dt = _flowArchive.GetPagerData(out int total, size, number, FlowId, StepName, Title, date1, date2, order);
JArray jArray = new JArray();
foreach (var dr in dt)
{
JObject jObject = new JObject()
{
{ "Id", dr.Id },
{ "Title", dr.Title},
{ "FlowName", dr.FlowName},
{ "StepName", dr.StepName },
{ "WriteTime", dr.WriteTime.ToShortDateTimeString() },
{ "UserName", dr.UserName },
{ "Opation", "" },
};
jArray.Add(jObject);
}
JObject json = new JObject() {
{ "total", total }
};
json.Add("rows", jArray);
return json;
//RoadFlowCommon.Tools.GetReturnJsonString(jObject: json);
}
/// <summary>
/// 查询一条归档
/// </summary>
/// <returns></returns>
[HttpGet("GetArchive")]
public dynamic GetArchive(string archiveid)
{
if (!archiveid.IsGuid(out Guid archiveGuid))
{
throw Oops.Oh("Id错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["IdError"].Value);
}
var archiveModel = _flowArchive.GetOneById(archiveid);
if (archiveModel == null)
{
throw Oops.Oh("未找到归档");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundArchive"].Value);
}
return archiveModel.ToJObject();
//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: archiveModel.ToJObject());
}
#endregion
#region
/// <summary>
/// 得到流程运行时加载的数据
/// </summary>
/// <returns></returns>
[HttpPost("GetEditRun")]
public dynamic GetEditRun([FromBody] JObject args)
{
string applibraryId = args.GetJsonValue("applibraryid");
string instanceId = args.GetJsonValue("instanceid");
string programId = args.GetJsonValue("programid");
string previewFormId = args.GetJsonValue("previewformid");//预览表单ID预览表单时有用。
bool isDisplay = "1".Equals(args.GetJsonValue("display"));
string flowId = args.GetJsonValue("flowid");
string stepId = args.GetJsonValue("stepid");
string subtableName = args.GetJsonValue("subtablelinkfield").Split('-')[0];//子表弹出编辑模式的子表名称。
bool isSubtablePopup = !subtableName.IsNullOrWhiteSpace() && !args.GetJsonValue("subtableid").IsNullOrWhiteSpace();//是否是子表弹出编辑模式
Guid previewFormGuid = previewFormId.ToGuid();
if (!applibraryId.IsGuid(out Guid applibraryGuid) && previewFormGuid.IsEmptyGuid())
{
throw Oops.Oh(previewFormGuid.IsEmptyGuid() ? programId.IsGuid() ? "未设置表格" : "首次保存预览" : "Appid错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, previewFormGuid.IsEmptyGuid() ? programId.IsGuid() ? localizer["NoSetForm"].Value : localizer["FirstSavePreview"].Value : localizer["AppIdError"].Value);
}
SysUser userModel = _userManager.User;
#region
JObject formObject = new JObject();
if (previewFormGuid.IsNotEmptyGuid())//预览表单
{
string attrJson = args.GetJsonValue("attrjson");
string eventJson = args.GetJsonValue("eventjson");
formObject = _form.GetRunJObject(previewFormGuid.ToString(), attrJson, eventJson);
}
else
{
var appModel = _appLibrary.GetOneById(applibraryGuid.ToString());
if (appModel != null)
{
if (appModel.Code.IsGuid(out Guid formId))
{
formObject = _form.GetRunJObject(appModel.Code);
}
else
{
formObject.Add("form_iscustomeform", 1);//0设计表单 1自定义表单
formObject.Add("url", appModel.Address);
}
}
}
#endregion
#region
JObject formDataObject = new JObject() {
{ "form_id", formObject.Value<string>("id") },
{ "form_dbconnid", formObject.Value<string>("conn") },
{ "form_dbtable", formObject.Value<string>("table") },
{ "form_dbtableprimarykey", formObject.Value<string>("primaryKey") },
{ "form_titlefield", formObject.Value<string>("titleField") },
{ "form_dbtabletitleexpression", formObject.Value<string>("titleExpression") },
{ "form_instanceid", instanceId },
{ "form_fieldstatus", new JObject() },
{ "applibraryid", applibraryId },
};
JObject statusObject = new JObject();//字段状态
JObject checkObject = new JObject();//字段检查
string formatJson = formObject.ContainsKey("formatJson") ? formObject.Value<JArray>("formatJson").ToString(Newtonsoft.Json.Formatting.None) : "[]";//字段显示格式JSON
JObject valueTypeObject = formObject.ContainsKey("valueTypeJson") ? formObject.Value<JObject>("valueTypeJson") : new JObject();//字段值类型JSON
JObject defaultValueJson = formObject.ContainsKey("defaultValueJson") ? formObject.Value<JObject>("defaultValueJson") : new JObject();//默认值JSON
//获取表单数据
JArray formDataArray = _form.GetFormData(formObject.Value<string>("conn"), formObject.Value<string>("table"),
formObject.Value<string>("primaryKey"), instanceId, stepId
, programId.IsGuid() ? string.Empty : flowId, formatJson, out string fieldStatusJson).ToJArray();
foreach (JObject valueObject in formDataArray)
{
formDataObject.Add(valueObject.Value<string>("name"), valueObject.Value<string>("value"));
}
if (formDataArray.IsEmptyJArray())//是否是第一次加载,判断是否采用默认值。
{
foreach (var j in defaultValueJson)
{
string defaultValue = j.Value.Value<string>();
if (!defaultValue.IsNullOrWhiteSpace())
{
formDataObject.Add(j.Key, RoadFlow.Business.Wildcard.Filter(defaultValue, userModel));
}
}
}
#region
foreach (JObject dtObject in formObject.ContainsKey("datatableJson") ? formObject.Value<JArray>("datatableJson") : new JArray())
{
string id = dtObject.Value<string>("id");
int source = dtObject.Value<string>("source").ToInt(0);
string text = dtObject.Value<string>("text");
string conn = dtObject.Value<string>("conn");
if (source == 0 && conn.IsGuid(out Guid connGuid))//SQL
{
var (rows, cols) = _form.GetDataTablJArray(connGuid.ToString(), RoadFlow.Business.Wildcard.Filter(text, userModel, formDataObject));
formDataObject.Add(id, new JObject() { { "rows", rows }, { "cols", cols }, { "selects", new JArray() } });
}
if (source == 1)//URL
{
JObject urlObject;
try
{
urlObject = HttpHelper.HttpGet((Furion.App.HttpContext.Request.IsHttps ? "https://" : "http://") + Furion.App.HttpContext.Request.Host.Value + RoadFlow.Business.Wildcard.Filter(text, userModel, formDataObject)).ToJObject();
}
catch
{
urlObject = null;
}
if (urlObject != null)
{
JArray rowsArray = new JArray();
try
{
rowsArray = urlObject.ContainsKey("rows") ? urlObject.Value<JArray>("rows") : new JArray();
}
catch
{
}
JArray colssArray = new JArray();
try
{
colssArray = urlObject.ContainsKey("cols") ? urlObject.Value<JArray>("cols") : new JArray();
}
catch
{
}
formDataObject.Add(id, new JObject() { { "rows", rowsArray }, { "cols", colssArray }, { "selects", new JArray() } });
}
}
}
#endregion
#region
JArray subTableJarray = formObject.ContainsKey("subtableJson") ? formObject.Value<JArray>("subtableJson") : new JArray();
foreach (JObject sdtObject in subTableJarray)
{
string id = sdtObject.Value<string>("id");
JArray sRows = _form.GetSubTableJarray(sdtObject, formObject.Value<string>("conn"), instanceId);
if (formDataObject.ContainsKey(id))
{
formDataObject[id] = new JObject() { { "rows", sRows } };
}
else
{
formDataObject.Add(id, new JObject() { { "rows", sRows } });
}
}
//默认值
formDataObject.Add("subtableDefaultValue", _form.GetSubTableDefaultValueJArray(subTableJarray, userModel));
#endregion
JArray fieldStatusJArray = fieldStatusJson.ToJArray();
if (!fieldStatusJArray.IsEmptyJArray())
{
//表单验证类型
int validatePromptType = formObject.Value<string>("validatePromptType").ToInt(0);
foreach (JObject fieldStatusObject in fieldStatusJArray)
{
string filed = fieldStatusObject.Value<string>("name");
if (isSubtablePopup && !filed.Split('-')[0].EqualsIgnoreCase(subtableName))
{
continue;//如果是子表弹出编辑,则只取子表的字段状态
}
if (!statusObject.ContainsKey(filed))
{
int status = fieldStatusObject.Value<string>("status").ToInt(0);
if (isDisplay && status == 0)
{
status = 1;//如果是显示,字段是编辑则设置为只读状态。
}
statusObject.Add(filed, status);
}
//验证json
int check = fieldStatusObject.Value<string>("check").ToInt(0);
if (check > 0)
{
//判断是不是子表
int isSubTable = 0;
string subTableId = string.Empty;//子表ID
string fieldShowName = string.Empty;//子表字段的显示标题
foreach (JObject subTableJObject in subTableJarray)
{
string table = subTableJObject.Value<string>("subTable");
if (filed.StartsWith(table.ToUpper() + "-"))
{
isSubTable = 1;
subTableId = subTableJObject.Value<string>("id");
string fieldName = filed.Replace(table.ToUpper() + "-", "");
//查找子表字段设置的显示名称。
foreach (JObject subTableRowJObject in subTableJObject.Value<JArray>("rows"))
{
if (subTableRowJObject.Value<string>("field").EqualsIgnoreCase(fieldName))
{
fieldShowName = subTableRowJObject.Value<string>("fieldName");
break;
}
}
break;
}
}
//验证类型,string,decimal......
string validType = valueTypeObject.IsEmptyJObject() ? "string" : valueTypeObject.Value<string>(filed);
JObject cObject = new JObject() {
{ "type", validType.IsNullOrWhiteSpace() ? "string" : validType },
{ "required", check == 2 },
{ "title", fieldShowName },
{ "msg", fieldShowName + "不可为空" },//localizer["CannotbeEmpty"].Value },
{ "showtype", validatePromptType },
{ "position", 0 },
{ "ispass", true },
{ "issubtable", isSubTable },
{ "subtableid", subTableId },
};
if ("ajax".Equals(validType))
{
//如果是AJAX验证要添加url属性
cObject.Add("url", RoadFlow.Business.Wildcard.Filter(valueTypeObject.Value<string>(filed + "-AJAXURL"), userModel));
}
checkObject.Add(filed, cObject);
}
}
}
//移出不需要输出到客户端的数据
//formObject.Remove("validatePromptType");
//formObject.Remove("formatJson");
//formObject.Remove("valueTypeJson");
//formObject.Remove("defaultValueJson");
if (formObject.ContainsKey("data"))
{
formObject["data"] = formDataObject;
}
else
{
formObject.Add("data", formDataObject);
}
if (formObject.ContainsKey("fieldStatus"))
{
formObject["fieldStatus"] = statusObject;
}
else
{
formObject.Add("fieldStatus", statusObject);
}
if (formObject.ContainsKey("validate"))
{
formObject["validate"] = checkObject;
}
else
{
formObject.Add("validate", checkObject);
}
#endregion
JObject jObject = new JObject() {
{ "form", formObject },
};
return jObject;
//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: jObject);
}
/// <summary>
/// 保存直接编辑的表单
/// </summary>
/// <returns></returns>
[HttpPost("SaveEditData")]
public dynamic SaveEditData([FromBody] JObject args)
{
try
{
var (newInstanceId, errMsg) = _form.SaveDataVue(args);
JObject jObject = new JObject
{
{ "instanceid", newInstanceId }
};
#region
if (args.GetJsonValue("programid").IsGuid(out Guid programGuid))
{
var programRunModel = _program.GetRunModel(programGuid.ToString());
if (programRunModel != null && !programRunModel.EditEvents.IsNullOrWhiteSpace())
{
bool isAdd = args.GetJsonValue("instanceid").IsNullOrWhiteSpace();//是新增还是修改
Dictionary<string, object> eventParams = new Dictionary<string, object>
{
{ "ProgramId", programGuid },//设计的应用程序ID
{ "InstanceId", newInstanceId },//删除的ID,多个逗号隔开
{ "EditModel", isAdd ? 0 : 1 } //编辑方式 0 新增 1修改 2删除
};
var (_, err) = Tools.ExecuteMethod(programRunModel.EditEvents.Trim(), eventParams);
if (err != null)
{
_log.Add(err, "执行应用程序设计数据" + (isAdd ? "新增" : "修改") + "后事件发生错误-" + programGuid + "-" + programRunModel.Name + "-" + programRunModel.EditEvents);
}
}
}
#endregion
return jObject;
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["SaveSuccessfully"].Value, jObject: jObject);
}
catch (Exception err)
{
_log.Add(err, "直接保存表单数据时发生了错误");
throw Oops.Oh("保存失败");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["SaveFail"].Value);
}
}
#endregion
#region API
/// <summary>
/// 得到步骤相关信息
/// </summary>
/// <returns></returns>
[HttpGet("GetStepInfo")]
public dynamic GetStepInfo(string flowId, string stepId, string instanceId, string taskId,string freesend)
{
bool isFreeSend = "1".Equals(freesend);
if (!flowId.IsGuid(out Guid flowGuid))
{
throw Oops.Oh("流程ID错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["FlowIdError"].Value);
}
RoadFlow.Model.rf_flowtask currentTaskModel = taskId.IsGuid(out Guid taskGuid) ? _flowTask.GetOneById(taskId) : null;
var flowRunModel = _flow.GetFlowRunModel(flowId, true, currentTaskModel);
if (flowRunModel == null)
{
throw Oops.Oh("未找到流程运行模型");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["Execute_NotFoundFlowRunModel"].Value);
}
if (!stepId.IsGuid(out Guid stepGuid))
{
stepGuid = flowRunModel.FirstStepId;
}
var stepModel = flowRunModel.Steps.Find(p => p.Id == stepGuid);
if (null == stepModel)
{
throw Oops.Oh("未找到步骤运行模型");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["Execute_NotFoundStepRunModel"].Value);
}
//检查权限,如果不是任务接收者,又不是第一步处理者,不能获取信息。
string userId = _userManager.UserId;
if ((currentTaskModel != null && currentTaskModel.ReceiveId != userId)
|| (!stepModel.StepBase.DefaultHandler.IsNullOrWhiteSpace()
&& !_userDummy.IsIn(userId.ToString(), stepModel.StepBase.DefaultHandler)))
{
throw Oops.Oh("您无权进行当前操作");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["Execute_SubmitCurrentTaskCanotProcess"].Value);
}
//得到字段状态
JObject fieldStatusObject = new JObject();
foreach (var fieldStatus in stepModel.StepFieldStatuses)
{
string[] fieldArray = fieldStatus.Field.Split('.');
string table = fieldArray.Length > 1 ? fieldArray[1] : string.Empty;
string field = fieldArray.Length > 2 ? fieldArray[2] : string.Empty;
fieldStatusObject.Add(table.ToUpper() + "-" + field.ToUpper(), fieldStatus.Status);
}
var (html, msg, nextSteps) = _flowTask.GetNextSteps(flowRunModel, stepGuid, currentTaskModel == null ? string.Empty : currentTaskModel.GroupId,
taskGuid.ToString(), instanceId, userId, isFreeSend, false, null, null);// localizer);
JArray stepsArray = new JArray();
foreach (var nextStep in nextSteps)
{
stepsArray.Add(new JObject()
{
{ "id", nextStep.Id },
{ "name", nextStep.Name },
{ "members", nextStep.RunDefaultMembers },
{ "note", nextStep.Note }
});
}
JObject jObject = new JObject() {
{ "fieldStatus", fieldStatusObject },
{ "nextSteps", stepsArray }
};
return jObject;
//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: jObject);
}
/// <summary>
/// 根据json执行流程
/// </summary>
/// <param name="json">
/// <para>{id:'任务id',flowId:'流程ID',instanceId:'实例id',title:'任务标题',comment:'处理意见',type:'处理类型',note:'备注',</para>
/// <para> senderId:'发送人id',sign:'是否签章 0|1',steps:[{id:'接收步骤id',name:'接收步骤名称',member:'接收人',completedtime:'要求完成时间'}]}</para>
/// </param>
/// <returns></returns>
[HttpPost("ExecuteFromJSON")]
public dynamic ExecuteFromJSON([FromBody] JObject args)
{
string json = args.GetJsonValue("json");
var executeResult = _flowTask.ExecuteFromJSON(json, null);// localizer);
return executeResult.ToJObject();
//RoadFlowCommon.Tools.GetReturnJsonString(executeResult.IsSuccess, executeResult.Messages, jObject: executeResult.ToJObject());
}
#endregion
}
}