using Ewide.Core;
using Ewide.RoadFlowLite.Utility;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using RoadFlow.Data;
using RoadFlow.Utility;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.RoadFlowLite.Serivce.Form
{
[Route("/api/roadflow/Form/")]
[ApiDescriptionSettings("RoadFlow")]
public class FormService : IDynamicApiController, ITransient
{
private readonly IDictionary _dic;
private readonly ILog _log;
private readonly IUserManager _userManager;
private readonly IForm _form;
private readonly IApplibrary _appLibrary;
public FormService( ILog log, IUserManager userManager,IForm form, IDictionary dictionary,IApplibrary applibrary)
{
_form = form;
_log = log;
_userManager = userManager;
_dic = dictionary;
_appLibrary = applibrary;
}
///
/// 查询表单列表
///
///
[HttpPost("GetList")]
public dynamic GetList([FromBody] JObject args)
{
string name = args.GetJsonValue("name");
string typeId = args.GetJsonValue("type");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
if (order.IsNullOrWhiteSpace())
{
order = "CreateDate DESC";
}
if (typeId.IsGuid(out Guid typeGuidId))
{
var childsId = _dic.GetAllChildsId(typeId);
typeId = childsId.JoinSqlIn(false);
}
else
{
typeId = string.Empty;
}
string userId = _userManager.UserId;
var forms = _form.GetPagerList(out int total, size, number, userId, name, typeId, order);
JArray jArray = new JArray();
foreach (var dr in forms)
{
JObject jObject = new JObject()
{
{ "Id", dr.Id},
{ "Name", dr.Name },
{ "CreateDate", dr.CreateDate==null ? dr.CreateDate.ToDateTimeString() : string.Empty },
{ "CreateUserName", dr.CreateUserName},
};
jArray.Add(jObject);
}
JObject jObject1 = new JObject
{
{ "total", total },
{ "rows", jArray }
};
return jObject1;// RoadFlowCommon.Tools.GetReturnJsonString(jObject: jObject1);
}
///
/// 查询已删除表单列表
///
///
[HttpPost("GetRemoveList")]
public dynamic GetRemoveList([FromBody] JObject args)
{
string name = args.GetJsonValue("name");
int number = args.GetJsonValue("number").ToInt();
int size = args.GetJsonValue("size").ToInt();
string order = args.GetJsonValue("order");
if (order.IsNullOrWhiteSpace())
{
order = "CreateDate DESC";
}
string userId = _userManager.UserId;
var forms = _form.GetPagerList(out int total, size, number, userId, name, string.Empty, order, 2);
JArray jArray = new JArray();
foreach (var dr in forms)
{
JObject jObject = new JObject()
{
{ "Id", dr.Id},
{ "Name", dr.Name},
{ "CreateDate", dr.CreateDate.ToShortDateString() },
{ "CreateUserName", dr.CreateUserName},
};
jArray.Add(jObject);
}
JObject jObject1 = new JObject
{
{ "total", total },
{ "rows", jArray }
};
return jObject1; //RoadFlowCommon.Tools.GetReturnJsonString(jObject: jObject1);
}
///
/// 得到设计时HTML
///
///
[HttpGet("GetDesignHtml")]
public dynamic GetDesignHtml(string formId)
{
if (!formId.IsGuid(out Guid formGuid))
{
throw Oops.Oh("ID错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["IdError"].Value);
}
var formModel = _form.GetOneById(formId);
if (null == formModel)
{
throw Oops.Oh("未找到表格");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundForm"].Value);
}
JObject jObject = new JObject() {
{ "success", true },
{ "attr", formModel.attribute.ToJObject() },
{ "html", formModel.Html },
{ "event", formModel.EventJSON.ToJArray() },
{ "subtable", formModel.SubtableJSON.ToJArray() }
};
return jObject;//RoadFlowCommon.Tools.GetReturnJsonString(jObject: jObject);
}
///
/// 保存表单
///
///
[HttpPost("Save")]
public dynamic Save([FromBody] JObject args)
{
Console.WriteLine(args["attJSON"]);
string attJSON = args.GetJsonValue("attJSON");
string eventJSON = args.GetJsonValue("eventJSON");
string subtableJSON = args.GetJsonValue("subtableJSON");
string html = args.GetJsonValue("html");
bool isNew = "1".Equals(args.GetJsonValue("isnew"));
JObject jObject = attJSON.ToJObject();
if (jObject.IsEmptyJObject())
{
throw Oops.Oh("表格属性错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormAttError"].Value }, { "id", "" } });
}
string id = jObject.Value("id");
string name = jObject.Value("name");
string formType = jObject.Value("formType");
string manageUser = jObject.Value("manageUser");
string userId = _userManager.UserId;
if (!id.IsGuid(out Guid guid) && !isNew)
{
throw Oops.Oh("表格ID不能为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormIdCannotEmpty"].Value }, { "id", "" } });
}
if (name.IsNullOrWhiteSpace())
{
throw Oops.Oh("表格名不能为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormNameEmpty"].Value }, { "id", "" } });
}
if (!formType.IsGuid(out Guid typeId))
{
throw Oops.Oh("表格类型不能为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormTypeEmpty"].Value }, { "id", "" } });
}
if (manageUser.IsNullOrWhiteSpace())//如果没有指定管理者,则默认为创建人员
{
manageUser = IOrganize.PREFIX_USER + userId.ToString();
}
var formModel = isNew ? null : _form.GetOneById(guid.ToString());
if (null == formModel)
{
formModel = new RoadFlow.Model.rf_form
{
Id = GuidExtensions.NewGuid().ToString(),
Status = 0,
CreateDate = DateExtensions.Now,
CreateUserId = userId,
CreateUserName = _userManager.User.Name
};
if (jObject.ContainsKey("id"))
{
jObject["id"] = formModel.Id;
}
else
{
jObject.Add("id", formModel.Id);
}
}
formModel.Name = name.Trim();
formModel.FormType = typeId.ToString();
formModel.EventJSON = eventJSON;
formModel.SubtableJSON = subtableJSON;
formModel.attribute = isNew ? jObject.ToString(Newtonsoft.Json.Formatting.None) : attJSON;
formModel.Html = html;
formModel.EditDate = DateExtensions.Now;
formModel.ManageUser = manageUser.ToLower();
_ = isNew ? _form.Add(formModel) : _form.Update(formModel);
_log.Add((isNew ? "新增" : "修改") + "了表单-" + name,_userManager.UserId, formModel.ToString(), LogType.流程管理);
return new JObject() { { "msg","保存成功" }, { "id", formModel.Id } };
//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: new JObject() { { "msg", localizer["SaveSuccessfully"].Value }, { "id", formModel.Id } });
}
///
/// 删除表单(作删除标记)
///
///
[HttpPost("Delete")]
public string Delete([FromBody] JObject args)
{
string ids = args.GetJsonValue("ids");
foreach (string id in ids.Split(','))
{
if (!id.IsGuid(out Guid formId))
{
continue;
}
var formModel = _form.GetOneById(id);
if (null == formModel)
{
continue;
}
_form.DeleteAndApplibrary(formModel, 0);
_log.Add("删除了表单(作删除标记)-" + formModel.Name,_userManager.UserId ,formId.ToString(), LogType.流程管理);
}
return "删除成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["DeleteSuccessfully"].Value);
}
///
/// 彻底删除表单
///
///
[HttpPost("ThoroughDelete")]
public string ThoroughDelete([FromBody] JObject args)
{
string ids = args.GetJsonValue("ids");
foreach (string id in ids.Split(','))
{
if (!id.IsGuid(out Guid formId))
{
continue;
}
var formModel = _form.GetOneById(id);
if (null == formModel)
{
continue;
}
_form.DeleteAndApplibrary(formModel, 1);
_log.Add("彻底删除了表单-" + formModel.Name, _userManager.UserId,formModel.ToString(), LogType.流程管理);
}
return "删除成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["DeleteSuccessfully"].Value);
}
///
/// 恢复删除表单
///
///
[HttpGet("Recovery")]
public string Recovery(string id)
{
if (!id.IsGuid(out Guid formId))
{
throw Oops.Oh("Id错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["IdError"].Value);
}
var formModel = _form.GetOneById(id);
if (null == formModel)
{
throw Oops.Oh("未找到待恢复表格");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundRecovery"].Value);
}
formModel.Status = 0;
_form.Update(formModel);
_log.Add("恢复了表单-" + formModel.Name,_userManager.UserId, formId.ToString(),LogType.流程管理);
return "恢复成功";
//RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["RecoverySuccessfully"].Value);
}
///
/// 发布表单
///
///
[HttpPost("Publish")]
public dynamic Publish([FromBody] JObject args)
{
string attJSON = args.GetJsonValue("attJSON");
string eventJSON = args.GetJsonValue("eventJSON");
string subtableJSON = args.GetJsonValue("subtableJSON");
string html = args.GetJsonValue("html");
string runHtml = args.GetJsonValue("runHtml");
bool isNew = "1".Equals(args.GetJsonValue("isnew"));
#region 保存数据
JObject jObject = attJSON.ToJObject();
if (jObject.IsEmptyJObject())
{
throw Oops.Oh("表格属性错误");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormAttError"].Value }, { "id", "" } });
}
string id = jObject.Value("id");
string name = jObject.Value("name");
string formType = jObject.Value("formType");
string manageUser = jObject.Value("manageUser");
string userId = _userManager.UserId;
if (!id.IsGuid(out Guid guid) && !isNew)
{
throw Oops.Oh("表格ID不能为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormIdCannotEmpty"].Value }, { "id", "" } });
}
if (name.IsNullOrWhiteSpace())
{
throw Oops.Oh("表格名不能为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormNameEmpty"].Value }, { "id", "" } });
}
if (!formType.IsGuid(out Guid typeId))
{
throw Oops.Oh("表格类型不能为空");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, jObject: new JObject() { { "msg", localizer["FormTypeEmpty"].Value }, { "id", "" } });
}
if (manageUser.IsNullOrWhiteSpace())//如果没有指定管理者,则默认为创建人员
{
manageUser = IOrganize.PREFIX_USER + userId.ToString();
}
var formModel = isNew ? null : _form.GetOneById(guid.ToString());
if (null == formModel)
{
formModel = new RoadFlow.Model.rf_form
{
Id = GuidExtensions.NewGuid().ToString(),
Status = 0,
CreateDate = DateExtensions.Now,
CreateUserId = userId,
CreateUserName = _userManager.User.Name
};
if (jObject.ContainsKey("id"))
{
jObject["id"] = formModel.Id;
}
else
{
jObject.Add("id", formModel.Id);
}
}
formModel.Name = name.Trim();
formModel.FormType = typeId.ToString();
formModel.EventJSON = eventJSON;
formModel.SubtableJSON = subtableJSON;
formModel.attribute = isNew ? jObject.ToString(Newtonsoft.Json.Formatting.None) : attJSON;
formModel.Html = html;
formModel.RunHtml = runHtml;
formModel.EditDate = DateExtensions.Now;
formModel.ManageUser = manageUser.ToLower();
_ = isNew ? _form.Add(formModel) : _form.Update(formModel);
#endregion
#region 加入应用程序库
var appModel = _appLibrary.GetByCode(formModel.Id.ToString());
bool isAddAppModel = false;
if (appModel == null)
{
isAddAppModel = true;
appModel = new RoadFlow.Model.rf_applibrary()
{
Id = GuidExtensions.NewGuid().ToString(),
Code = formModel.Id.ToString()
};
}
appModel.Title = formModel.Name;
appModel.Title_en = appModel.Title_en.IsNullOrEmpty() ? formModel.Name : appModel.Title_en;
appModel.Title_zh = appModel.Title_zh.IsNullOrEmpty() ? formModel.Name : appModel.Title_zh;
appModel.Type = formModel.FormType;
appModel.Address = appModel.Code;//VUE不需要地址,这里填入表单ID,方便查看,直接从数据表加载HTML//formModel.Id.ToLowerString() + ".html";
_ = isAddAppModel ? _appLibrary.Add(appModel) : _appLibrary.Update(appModel);
#endregion
#region 更新缓存
_form.ClearRunJObjectCache(formModel.Id);
#endregion
_log.Add("发布了表单-" + name,_userManager.UserId ,formModel.ToString(), LogType.流程管理, others: appModel.ToString());
return new JObject() { { "msg", "发布成功" }, { "id", formModel.Id } };
//RoadFlowCommon.Tools.GetReturnJsonString(true, jObject: new JObject() { { "msg", localizer["PublishSuccessfully"].Value }, { "id", formModel.Id } });
}
///
/// 另存为
///
///
[HttpPost("SaveAs")]
public string SaveAs([FromBody] JObject args)
{
string formId = args.GetJsonValue("id");
string formName = args.GetJsonValue("name");
if (!formId.IsGuid(out Guid formGuid))
{
throw Oops.Oh("Id错误");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["IdError"].Value);
}
if (formName.IsNullOrWhiteSpace())
{
throw Oops.Oh("名字不能为空");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NameEmpty"].Value);
}
var formModel = _form.GetOneById(formId);
if (null == formModel)
{
throw Oops.Oh("未找到源表格");
// return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["SaveAsNotFound"].Value);
}
var userModel = _userManager.User;
formModel.Id = GuidExtensions.NewGuid().ToString();
formModel.Name = formName.Trim();
formModel.CreateDate = DateExtensions.Now;
formModel.EditDate = formModel.CreateDate;
formModel.CreateUserId = userModel.Id;
formModel.CreateUserName = userModel.Name;
formModel.Status = 0;
JObject jObject;
try
{
jObject = JObject.Parse(formModel.attribute);
jObject["id"] = formModel.Id;
jObject["name"] = formModel.Name;
formModel.attribute = jObject.ToString(Newtonsoft.Json.Formatting.None);
}
catch (Exception err)
{
throw Oops.Oh(err.Message);
//return RoadFlowCommon.Tools.GetReturnJsonString(false, err.Message);
}
if (_form.Add(formModel) == 1)
{
return "保存成功";
//return RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["SaveAsSuccessfully"].Value);
}
else
{
throw Oops.Oh("保存失败");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["SaveAsFailed"].Value);
}
}
///
/// 根据sql得到下拉选项
///
///
[HttpPost("GetOpitonsBySql")]
public dynamic GetOpitonsBySql([FromBody] JObject args)
{
string connId = args.GetJsonValue("connid");
string sql = args.GetJsonValue("sql");
string value = args.GetJsonValue("value");
JArray jArray = _form.GetJArrayOptionsBySQL(connId, sql, value);
return jArray;
//RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray);
}
///
/// 根据url得到下拉选项
///
///
[HttpPost("GetOpitonsByUrl")]
public dynamic GetOpitonsByUrl([FromBody] JObject args)
{
string url = args.GetJsonValue("url");
string value = args.GetJsonValue("value");
string parentvalue = args.GetJsonValue("parentvalue");
string queryString = "value=" + value + "&parentvalue=" + parentvalue;
url = url.Contains('?') ? url + "&" + queryString : url + "?" + queryString;
string options = _form.GetOptionsByUrl(url);
return options.ToJArray();
//RoadFlowCommon.Tools.GetReturnJsonString(jArray: options.ToJArray());
}
///
/// 导入表单
///
///
[HttpPost("ImportForm")]
public string ImportForm([FromBody] JObject args)
{
var files = args.GetJsonValue("files");
if (files.IsNullOrWhiteSpace())
{
throw Oops.Oh("没有导入文件");
//return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NoImportFile"].Value);
}
System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
foreach (string file in files.Split(','))
{
string filePath = RoadFlow.Utility.Config.FilePath + file.DESDecrypt();
if (!System.IO.File.Exists(filePath))
{
continue;
}
var stream = System.IO.File.OpenRead(filePath);
int count = (int)stream.Length;
byte[] b = new byte[count];
stream.Read(b, 0, count);
string json = System.Text.Encoding.UTF8.GetString(b);
string msg = _form.ImportForm(json, false);
stream.Close();
stream.DisposeAsync();
try
{
System.IO.File.Delete(filePath);
}
catch (IOException err)
{
_log.Add(err);
}
if (!"1".Equals(msg))
{
stringBuilder.Append(msg + ",");
}
}
string msg1 = stringBuilder.ToString();
if (msg1.IsNullOrWhiteSpace())
return "导入成功";
else
throw Oops.Oh(msg1);
//RoadFlowCommon.Tools.GetReturnJsonString(msg1.IsNullOrWhiteSpace(), msg1.IsNullOrWhiteSpace() ? localizer["ImportSuccessfully"].Value : msg1);
}
}
}