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