mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-07-16 07:59:54 +08:00
更改gooflow的导出数据格式,方便后端读取
This commit is contained in:
parent
37789838fa
commit
1a880c0daf
@ -1,64 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace OpenAuth.App.Extention
|
||||
{
|
||||
public interface IWF_Runtime
|
||||
{
|
||||
#region 工作流实例流转API
|
||||
/// <summary>
|
||||
/// 工作流实例运行信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
WF_RuntimeModel runtimeModel{get;}
|
||||
/// <summary>
|
||||
/// 获取实例接下来运行的状态
|
||||
/// </summary>
|
||||
/// <returns>-1无法运行,0会签开始,1会签结束,2一般节点,4流程运行结束</returns>
|
||||
int GetStatus();
|
||||
/// <summary>
|
||||
/// 获取节点类型 0会签开始,1会签结束,2一般节点,开始节点,4流程运行结束
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
/// <returns></returns>
|
||||
int GetNodeStatus(string nodeId);
|
||||
/// <summary>
|
||||
/// 获取会签下面需要审核的ID列表
|
||||
/// </summary>
|
||||
/// <param name="shuntnodeId"></param>
|
||||
/// <returns></returns>
|
||||
List<string> GetCountersigningNodeIdList(string shuntnodeId);
|
||||
/// <summary>
|
||||
/// 通过节点Id获取下一个节点Id
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
/// <returns></returns>
|
||||
string GetNextNodeByNodeId(string nodeId);
|
||||
/// <summary>
|
||||
/// 节点会签审核
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
/// <param name="flag"></param>
|
||||
/// <returns>-1不通过,1等待,其它通过</returns>
|
||||
string NodeConfluence(string nodeId, bool flag,string userId, string description = "");
|
||||
/// <summary>
|
||||
/// 驳回节点0"前一步"1"第一步"2"某一步" 3"不处理"
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
string RejectNode();
|
||||
/// <summary>
|
||||
/// 驳回节点0"前一步"1"第一步"2"某一步" 3"不处理"
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
/// <returns></returns>
|
||||
string RejectNode(string nodeId);
|
||||
/// <summary>
|
||||
/// 标记节点1通过,-1不通过,0驳回
|
||||
/// </summary>
|
||||
/// <param name="nodeId"></param>
|
||||
/// <param name="flag"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="description"></param>
|
||||
void MakeTagNode(string nodeId, int flag,string userId, string description = "");
|
||||
#endregion
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@ using Infrastructure;
|
||||
|
||||
namespace OpenAuth.App.Extention
|
||||
{
|
||||
public class WF_Runtime : IWF_Runtime
|
||||
public class WF_Runtime
|
||||
{
|
||||
private WF_RuntimeModel _runtimeModel = null;
|
||||
|
||||
|
@ -182,100 +182,6 @@ namespace OpenAuth.App
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除工作流实例进程(删除草稿使用)
|
||||
/// </summary>
|
||||
/// <param name="keyValue">主键</param>
|
||||
/// <returns></returns>
|
||||
public int DeleteProcess(string keyValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
FlowInstance entity = UnitWork.FindSingle<FlowInstance>(u =>u.Id ==keyValue);
|
||||
|
||||
UnitWork.Delete<FlowInstance>(u =>u.Id == keyValue);
|
||||
UnitWork.Save();
|
||||
return 1;
|
||||
}
|
||||
catch {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 虚拟操作实例
|
||||
/// </summary>
|
||||
/// <param name="keyValue"></param>
|
||||
/// <param name="state">0暂停,1启用,2取消(召回)</param>
|
||||
/// <returns></returns>
|
||||
public int OperateVirtualProcess(string keyValue,int state)
|
||||
{
|
||||
try
|
||||
{
|
||||
FlowInstance entity = UnitWork.FindSingle<FlowInstance>(u =>u.Id ==keyValue);
|
||||
if (entity.IsFinish == 1)
|
||||
{
|
||||
throw new Exception("实例已经审核完成,操作失败");
|
||||
}
|
||||
else if (entity.IsFinish == 2)
|
||||
{
|
||||
throw new Exception("实例已经取消,操作失败");
|
||||
}
|
||||
/// 流程是否完成(0运行中,1运行结束,2被召回,3不同意,4表示被驳回)
|
||||
string content = "";
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
if (entity.Disabled == 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
entity.Disabled = 0;
|
||||
content = "【暂停】暂停了一个流程进程【" + entity.Code + "/" + entity.CustomName + "】";
|
||||
break;
|
||||
case 1:
|
||||
if (entity.Disabled == 1)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
entity.Disabled = 1;
|
||||
content = "【启用】启用了一个流程进程【" + entity.Code + "/" + entity.CustomName + "】";
|
||||
break;
|
||||
case 2:
|
||||
entity.IsFinish = 2;
|
||||
content = "【召回】召回了一个流程进程【" + entity.Code + "/" + entity.CustomName + "】";
|
||||
break;
|
||||
}
|
||||
UnitWork.Update(entity);
|
||||
FlowInstanceOperationHistory processOperationHistoryEntity = new FlowInstanceOperationHistory();
|
||||
processOperationHistoryEntity.InstanceId = entity.Id;
|
||||
processOperationHistoryEntity.Content = content;
|
||||
UnitWork.Add(processOperationHistoryEntity);
|
||||
UnitWork.Save();
|
||||
return 1;
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 流程指派
|
||||
/// </summary>
|
||||
/// <param name="processId"></param>
|
||||
/// <param name="makeLists"></param>
|
||||
public void DesignateProcess(string processId, string makeLists)
|
||||
{
|
||||
try
|
||||
{
|
||||
FlowInstance entity = new FlowInstance();
|
||||
entity.Id = processId;
|
||||
entity.MakerList = makeLists;
|
||||
UnitWork.Update(entity);
|
||||
}
|
||||
catch {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@ -306,7 +212,7 @@ namespace OpenAuth.App
|
||||
frmData = frmData,
|
||||
processId = processId
|
||||
};
|
||||
IWF_Runtime wfruntime = null;
|
||||
WF_Runtime wfruntime = null;
|
||||
|
||||
if (frmData == null)
|
||||
{
|
||||
@ -390,7 +296,7 @@ namespace OpenAuth.App
|
||||
previousId = FlowInstance.PreviousId,
|
||||
processId = processId
|
||||
};
|
||||
IWF_Runtime wfruntime = new WF_Runtime(wfRuntimeInitModel);
|
||||
WF_Runtime wfruntime = new WF_Runtime(wfRuntimeInitModel);
|
||||
|
||||
|
||||
#region »áÇ©
|
||||
@ -560,7 +466,7 @@ namespace OpenAuth.App
|
||||
previousId = FlowInstance.PreviousId,
|
||||
processId = processId
|
||||
};
|
||||
IWF_Runtime wfruntime = new WF_Runtime(wfRuntimeInitModel);
|
||||
WF_Runtime wfruntime = new WF_Runtime(wfRuntimeInitModel);
|
||||
|
||||
|
||||
string resnode = "";
|
||||
@ -608,138 +514,6 @@ namespace OpenAuth.App
|
||||
throw;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 召回流程进程
|
||||
/// </summary>
|
||||
/// <param name="processId"></param>
|
||||
public void CallingBackProcess(string processId)
|
||||
{
|
||||
try
|
||||
{
|
||||
OperateVirtualProcess(processId, 2);
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 终止一个实例(彻底删除)
|
||||
/// </summary>
|
||||
/// <param name="processId"></param>
|
||||
/// <returns></returns>
|
||||
public void KillProcess(string processId)
|
||||
{
|
||||
try
|
||||
{
|
||||
UnitWork.Delete<FlowInstance>(u => u.Id == processId);
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取某个节点(审核人所能看到的提交表单的权限)
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
public string GetProcessSchemeContentByNodeId(string data, string nodeId)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<dynamic> list = new List<dynamic>();
|
||||
dynamic schemeContentJson = data.ToJson();//获取工作流模板内容的json对象;
|
||||
string schemeContent1 = schemeContentJson.SchemeContent.Value;
|
||||
dynamic schemeContentJson1 = schemeContent1.ToJson();
|
||||
string FrmContent = schemeContentJson1.Frm.FrmContent.Value;
|
||||
dynamic FrmContentJson = FrmContent.ToJson();
|
||||
|
||||
foreach (var item in schemeContentJson1.Flow.nodes)
|
||||
{
|
||||
if (item.id.Value == nodeId && item.setInfo != null)
|
||||
{
|
||||
foreach (var item1 in item.setInfo.frmPermissionInfo)
|
||||
{
|
||||
foreach (var item2 in FrmContentJson)
|
||||
{
|
||||
if (item2.control_field.Value == item1.fieldid.Value)
|
||||
{
|
||||
if (item1.look.Value == true)
|
||||
{
|
||||
if (item1.down != null)
|
||||
{
|
||||
item2.down = item1.down.Value;
|
||||
}
|
||||
list.Add(item2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
schemeContentJson1.Frm.FrmContent = list.ToJson().ToString();
|
||||
schemeContentJson.SchemeContent = schemeContentJson1.ToString();
|
||||
return schemeContentJson.ToString();
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取某个节点(审核人所能看到的提交表单的权限)
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
/// <param name="userId"></param>
|
||||
/// <returns></returns>
|
||||
public string GetProcessSchemeContentByUserId(string data, string userId)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<dynamic> list = new List<dynamic>();
|
||||
dynamic schemeContentJson = data.ToJson();//获取工作流模板内容的json对象;
|
||||
string schemeContent1 = schemeContentJson.SchemeContent.Value;
|
||||
dynamic schemeContentJson1 = schemeContent1.ToJson();
|
||||
string FrmContent = schemeContentJson1.Frm.FrmContent.Value;
|
||||
dynamic FrmContentJson = FrmContent.ToJson();
|
||||
|
||||
foreach (var item in schemeContentJson1.Flow.nodes)
|
||||
{
|
||||
if (item.setInfo != null && item.setInfo.UserId != null && item.setInfo.UserId.Value == userId)
|
||||
{
|
||||
foreach (var item1 in item.setInfo.frmPermissionInfo)
|
||||
{
|
||||
foreach (var item2 in FrmContentJson)
|
||||
{
|
||||
if (item2.control_field.Value == item1.fieldid.Value)
|
||||
{
|
||||
if (item1.look.Value == true)
|
||||
{
|
||||
if (item1.down != null)
|
||||
{
|
||||
item2.down = item1.down.Value;
|
||||
}
|
||||
list.Add(item2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
schemeContentJson1.Frm.FrmContent = list.ToJson().ToString();
|
||||
schemeContentJson.SchemeContent = schemeContentJson1.ToString();
|
||||
return schemeContentJson.ToString();
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
@ -747,7 +521,7 @@ namespace OpenAuth.App
|
||||
/// </summary>
|
||||
/// <param name="wfruntime"></param>
|
||||
/// <returns></returns>
|
||||
private string GetMakerList(IWF_Runtime wfruntime)
|
||||
private string GetMakerList(WF_Runtime wfruntime)
|
||||
{
|
||||
try
|
||||
{
|
||||
@ -912,11 +686,6 @@ namespace OpenAuth.App
|
||||
}
|
||||
|
||||
|
||||
public FlowInstance GetProcessInstanceEntity(string keyValue)
|
||||
{
|
||||
return UnitWork.FindSingle<FlowInstance>(u => u.Id == keyValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ÉóºËÁ÷³Ì
|
||||
/// <para>ÀîÓñ±¦ÓÚ2017-01-20 15:44:45</para>
|
||||
@ -955,9 +724,9 @@ namespace OpenAuth.App
|
||||
}
|
||||
|
||||
|
||||
public void Add(FlowInstance flowScheme)
|
||||
public void Add(FlowInstance instance)
|
||||
{
|
||||
Repository.Add(flowScheme);
|
||||
Repository.Add(instance);
|
||||
}
|
||||
|
||||
public void Update(FlowInstance flowScheme)
|
||||
|
@ -13,22 +13,15 @@ namespace OpenAuth.App
|
||||
* view
|
||||
*/
|
||||
private static string temp_view = "<div style=\"{0}\"/>{1}</div>";
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* 功能: html
|
||||
*/
|
||||
public static string GetHtml(Form form, string action){
|
||||
|
||||
//action=action!=null && !""==(action)?action:"view";
|
||||
|
||||
var tableData =new Dictionary<string, Object>();//表单数据
|
||||
|
||||
string html = form.ContentParse;
|
||||
foreach (var json in form.ContentData.ToList<JObject>())
|
||||
{
|
||||
|
||||
|
||||
public static string GetHtml(string contentData, string contentParse, string action)
|
||||
{
|
||||
var tableData = new Dictionary<string, Object>();//表单数据
|
||||
|
||||
string html = contentParse;
|
||||
foreach (var json in contentData.ToList<JObject>())
|
||||
{
|
||||
string name = "";
|
||||
string leipiplugins = json.GetValue("leipiplugins").ToString();
|
||||
if ("checkboxs" == (leipiplugins))
|
||||
@ -54,11 +47,11 @@ namespace OpenAuth.App
|
||||
case "checkboxs":
|
||||
temp_html = GetCheckboxs(json, tableData, action);
|
||||
break;
|
||||
|
||||
|
||||
case "qrcode"://二维码
|
||||
temp_html = GetQrcode(json, tableData, action);
|
||||
break;
|
||||
|
||||
|
||||
case "progressbar"://进度条 (未做处理)
|
||||
/*temp_html = GetProgressbar(json, tableData, action);*/
|
||||
break;
|
||||
@ -69,11 +62,22 @@ namespace OpenAuth.App
|
||||
|
||||
html = html.Replace("{" + name + "}", temp_html);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* 功能: html
|
||||
*/
|
||||
public static string GetHtml(Form form, string action){
|
||||
|
||||
//action=action!=null && !""==(action)?action:"view";
|
||||
return GetHtml(form.ContentData, form.ContentParse, action);
|
||||
|
||||
}
|
||||
|
||||
//text
|
||||
private static string GetTextBox(JObject item, Dictionary<string,Object> formData,string action)
|
||||
{
|
||||
|
@ -107,7 +107,6 @@
|
||||
<Compile Include="AuthorizeApp.cs" />
|
||||
<Compile Include="CategoryApp.cs" />
|
||||
<Compile Include="Define.cs" />
|
||||
<Compile Include="Extention\IWF_Runtime.cs" />
|
||||
<Compile Include="Extention\WF_Runtime.cs" />
|
||||
<Compile Include="Extention\WF_RuntimeInitModel.cs" />
|
||||
<Compile Include="Extention\WF_RuntimeModel.cs" />
|
||||
|
@ -1605,13 +1605,22 @@ GooFlow.prototype={
|
||||
var t=this.$editable;
|
||||
this.$editable=false;
|
||||
if(data.title) this.setTitle(data.title);
|
||||
if(data.initNum) this.$max=data.initNum;
|
||||
for(var i in data.nodes)
|
||||
this.addNode(i,data.nodes[i]);
|
||||
for(var j in data.lines)
|
||||
this.addLine(j,data.lines[j]);
|
||||
for(var k in data.areas)
|
||||
this.addArea(k,data.areas[k]);
|
||||
if (data.initNum) this.$max = data.initNum;
|
||||
|
||||
if (data != "") {
|
||||
var length,k;
|
||||
for (k = 0, length = data.nodes.length; k < length; k++) {
|
||||
this.addNode(data.nodes[k].id, data.nodes[k]);
|
||||
}
|
||||
for (k = 0, length = data.lines.length; k < length; k++) {
|
||||
this.addLine(data.lines[k].id, data.lines[k]);
|
||||
}
|
||||
for (k = 0,length = data.areas.length; k < length; k++) {
|
||||
this.addArea(data.areas[k].id, data.areas[k]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.$editable=t;
|
||||
this.$deletedItem={};
|
||||
//自行重构工作区,使之大小自适应
|
||||
@ -1657,27 +1666,31 @@ GooFlow.prototype={
|
||||
exportData:function(){
|
||||
var ret={};
|
||||
ret.title=this.$title;
|
||||
ret.nodes={};
|
||||
ret.lines={};
|
||||
ret.areas={};
|
||||
ret.nodes=[];
|
||||
ret.lines=[];
|
||||
ret.areas=[];
|
||||
ret.initNum=this.$max;
|
||||
for(var k1 in this.$nodeData){
|
||||
if(!this.$nodeData[k1].marked){
|
||||
delete this.$nodeData[k1]["marked"];
|
||||
}
|
||||
ret.nodes[k1]=JSON.parse(JSON.stringify(this.$nodeData[k1]));
|
||||
ret.nodes.push(JSON.parse(JSON.stringify(this.$nodeData[k1])));
|
||||
//ret.nodes[k1]=JSON.parse(JSON.stringify(this.$nodeData[k1]));
|
||||
}
|
||||
for(var k2 in this.$lineData){
|
||||
if(!this.$lineData[k2].marked){
|
||||
delete this.$lineData[k2]["marked"];
|
||||
}
|
||||
ret.lines[k2]=JSON.parse(JSON.stringify(this.$lineData[k2]));
|
||||
ret.lines.push(JSON.parse(JSON.stringify(this.$lineData[k2])));
|
||||
// ret.lines[k2]=JSON.parse(JSON.stringify(this.$lineData[k2]));
|
||||
}
|
||||
for(var k3 in this.$areaData){
|
||||
if(!this.$areaData[k3].marked){
|
||||
delete this.$areaData[k3]["marked"];
|
||||
}
|
||||
ret.areas[k3]=JSON.parse(JSON.stringify(this.$areaData[k3]));
|
||||
|
||||
ret.areas.push(JSON.parse(JSON.stringify(this.$areaData[k3])));
|
||||
// ret.areas[k3]=JSON.parse(JSON.stringify(this.$areaData[k3]));
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
@ -1953,7 +1966,10 @@ GooFlow.prototype={
|
||||
}
|
||||
},
|
||||
//增加一条线
|
||||
addLine:function(id,json){
|
||||
addLine: function (id, json) {
|
||||
if (json.id == undefined) {
|
||||
$.extend(json, { id: id });
|
||||
}
|
||||
if(typeof this.onItemAdd==='function' && this.onItemAdd(id,"line",json)===false)return;
|
||||
if(this.$undoStack&&this.$editable){
|
||||
this.pushOper("delLine",[id]);
|
||||
|
@ -103,16 +103,15 @@
|
||||
}
|
||||
};
|
||||
|
||||
var load = function () {
|
||||
var url = '/flowschemes/load';
|
||||
$.getJSON(url, function (json) {
|
||||
zTreeObj = $.fn.zTree.init($("#frmTree"), setting);
|
||||
zTreeObj.addNodes(null, json.data);
|
||||
|
||||
$("#menutree").html("点击预览表单效果");
|
||||
zTreeObj.expandAll(true);
|
||||
});
|
||||
};
|
||||
var url = '/flowschemes/load';
|
||||
$.getJSON(url, function (json) {
|
||||
zTreeObj = $.fn.zTree.init($("#frmTree"), setting);
|
||||
zTreeObj.addNodes(null, json.data);
|
||||
|
||||
$("#menutree").html("点击预览表单效果");
|
||||
zTreeObj.expandAll(true);
|
||||
});
|
||||
|
||||
var setCheck = function (id) { //设置已经选中的表单
|
||||
if (id == null | id == '') return;
|
||||
@ -125,13 +124,10 @@
|
||||
}
|
||||
|
||||
return {
|
||||
load: load,
|
||||
setCheck: setCheck
|
||||
}
|
||||
}();
|
||||
|
||||
frmTree.load();
|
||||
|
||||
if (update) {
|
||||
$.getJSON('/FlowInstances/get?id=' + id,
|
||||
function (data) {
|
||||
|
@ -56,16 +56,14 @@
|
||||
}
|
||||
};
|
||||
|
||||
var load = function () {
|
||||
var url = '/forms/load';
|
||||
$.getJSON(url, function (json) {
|
||||
zTreeObj = $.fn.zTree.init($("#frmTree"), setting);
|
||||
zTreeObj.addNodes(null, json.data);
|
||||
var url = '/forms/load';
|
||||
$.getJSON(url, function (json) { //todo:这个地方要用同步方式,不然后面的setCheck会出问题
|
||||
zTreeObj = $.fn.zTree.init($("#frmTree"), setting);
|
||||
zTreeObj.addNodes(null, json.data);
|
||||
|
||||
$("#menutree").html("点击预览表单效果");
|
||||
zTreeObj.expandAll(true);
|
||||
});
|
||||
};
|
||||
$("#menutree").html("点击预览表单效果");
|
||||
zTreeObj.expandAll(true);
|
||||
});
|
||||
|
||||
var setCheck = function (id) { //设置已经选中的表单
|
||||
if (id == null | id == '') return;
|
||||
@ -78,7 +76,6 @@
|
||||
}
|
||||
|
||||
return {
|
||||
load: load,
|
||||
setCheck: setCheck
|
||||
}
|
||||
}();
|
||||
@ -121,9 +118,6 @@
|
||||
});
|
||||
/*=========流程设计(end)=====================*/
|
||||
|
||||
|
||||
frmTree.load();
|
||||
|
||||
if (update) {
|
||||
$.getJSON('/flowschemes/get?id=' + id,
|
||||
function (data) {
|
||||
|
@ -80,7 +80,7 @@
|
||||
var iframeWin = window[layero.find('iframe')[0]['name']]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
|
||||
iframeWin.submit();
|
||||
},
|
||||
cancel: function (index) {
|
||||
no: function (index) {
|
||||
layer.close(index);
|
||||
mainList();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user