完成流程实例列表/详情、流程模版添加

This commit is contained in:
yubaolee
2017-01-20 16:51:30 +08:00
parent 8a48855f04
commit b46729b31d
44 changed files with 3224 additions and 695 deletions

View File

@@ -0,0 +1,67 @@
using System;
using System.Web.Mvc;
using Infrastructure;
using OpenAuth.App;
using OpenAuth.App.SSO;
using OpenAuth.Mvc.Controllers;
namespace OpenAuth.Mvc.Areas.FlowManage.Controllers
{
/// <summary>
/// 通用申请流程处理
/// <para>李玉宝新增于2016-09-08 19:21:59</para>
/// </summary>
public class CommonAppliesController : Controller
{
private WFProcessInstanceService _app;
public CommonAppliesController()
{
_app = AutofacExt.GetFromFac<WFProcessInstanceService>();
}
public ActionResult Index()
{
return View();
}
public string Load(string type, int pageCurrent = 1, int pageSize = 30)
{
return JsonHelper.Instance.Serialize(_app.Load(AuthUtil.GetCurrentUser().User.Id.ToString(), type, pageCurrent, pageSize));
}
/// <summary>
/// 进度查看
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult ProcessLookForm()
{
return View();
}
/// <summary>
/// 删除申请
/// </summary>
public string Delete(Guid[] ids)
{
try
{
foreach (var id in ids)
{
_app.DeleteProcess(id);
}
}
catch (Exception ex)
{
throw;
}
return string.Empty;
}
}
}

View File

@@ -18,12 +18,12 @@ namespace OpenAuth.Mvc.Areas.FlowManage.Controllers
/// </summary>
public class FlowDesignController :Controller
{
private WorkflowService wfFlowInfoBLL;
private WFSchemeService wfFlowInfoBLL;
private UserManagerApp userBLL;
public FlowDesignController()
{
wfFlowInfoBLL = AutofacExt.GetFromFac<WorkflowService>();
wfFlowInfoBLL = AutofacExt.GetFromFac<WFSchemeService>();
userBLL = AutofacExt.GetFromFac<UserManagerApp>();
}

View File

@@ -0,0 +1,85 @@
using System;
using System.Web.Mvc;
using Infrastructure;
using OpenAuth.App;
using OpenAuth.Domain;
using OpenAuth.Mvc;
namespace LeaRun.Application.Web.Areas.FlowManage.Controllers
{
/// <summary>
/// 版 本 6.1
/// Copyright (c) 2013-2016 上海力软信息技术有限公司
/// 创建人:陈彬彬
/// 日 期2016.03.19 14:27
/// 描 述:流程发起
/// </summary>
public class FlowLaunchController : Controller
{
private WFRuntimeService wfProcessBll;
public FlowLaunchController()
{
wfProcessBll = AutofacExt.GetFromFac<WFRuntimeService>();
}
#region
//
// GET: /FlowManage/FlowLaunch/
/// <summary>
/// 管理
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult Index()
{
return View();
}
/// <summary>
/// 预览
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult PreviewIndex()
{
return View();
}
/// <summary>
/// 创建流程实例
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult FlowProcessNewForm()
{
return View();
}
#endregion
#region
/// <summary>
/// 创建流程实例
/// </summary>
/// <param name="wfSchemeInfoId">流程模板信息Id</param>
/// <param name="frmData">表单数据</param>
/// <param name="type">0发起3草稿</param>
/// <returns></returns>
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateProcess(Guid wfSchemeInfoId, string wfProcessInstanceJson, string frmData)
{
WFProcessInstance wfProcessInstanceEntity = wfProcessInstanceJson.ToObject<WFProcessInstance>();
string text = "创建成功";
if (wfProcessInstanceEntity.EnabledMark == 1)//发起流程
{
wfProcessBll.CreateInstance(Guid.NewGuid(), wfSchemeInfoId, wfProcessInstanceEntity, frmData);
}
else if (wfProcessInstanceEntity.EnabledMark == 3)//草稿
{
wfProcessBll.CreateRoughdraft(Guid.NewGuid(), wfSchemeInfoId, wfProcessInstanceEntity, frmData);
text = "草稿保存成功";
}
return Content(text);
}
#endregion
}
}

View File

@@ -0,0 +1,152 @@
using System;
using System.Web.Mvc;
using Infrastructure;
using OpenAuth.App;
namespace OpenAuth.Mvc.Areas.FlowManage.Controllers
{
public class FlowProcessController :Controller
{
private WFRuntimeService wfProcessBll ;
public FlowProcessController(WFRuntimeService service)
{
wfProcessBll = service;
}
#region
/// <summary>
/// 流程监控
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult MonitoringIndex()
{
return View();
}
/// <summary>
/// 流程指派
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult DesignationIndex()
{
return View();
}
/// <summary>
/// 流程进度查看
/// </summary>
/// <returns></returns>\
[HttpGet]
public ActionResult ProcessLookFrom()
{
return View();
}
/// <summary>
/// 流程指派
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult ProcessDesignate()
{
return View();
}
#endregion
#region ()
/// <summary>
/// 获取进程模板Json
/// </summary>
/// <param name="keyValue"></param>
/// <returns></returns>
[HttpGet]
public ActionResult GetProcessSchemeJson(Guid keyValue)
{
var data = wfProcessBll.GetProcessSchemeEntity(keyValue);
return Content(data.ToJson());
}
/// <summary>
/// 已办流程进度查看,根据当前访问人的权限查看表单内容
/// </summary>
/// <param name="keyValue"></param>
/// <returns></returns>
[HttpGet]
public ActionResult GetProcessSchemeEntityByUserId(Guid keyValue)
{
var data = wfProcessBll.GetProcessSchemeByUserId(keyValue);
return Content(data.ToJson());
}
/// <summary>
/// 已办流程进度查看,根据当前节点的权限查看表单内容
/// </summary>
/// <param name="keyValue"></param>
/// <param name="isPermission"></param>
/// <returns></returns>
[HttpGet]
public ActionResult GetProcessSchemeEntityByNodeId(Guid keyValue, string nodeId)
{
var data = wfProcessBll.GetProcessSchemeEntityByNodeId(keyValue, nodeId);
return Content(data.ToJson());
}
/// <summary>
/// 获取进程信息
/// </summary>
/// <param name="keyValue"></param>
/// <returns></returns>
[HttpGet]
public ActionResult GetProcessInfoJson(Guid keyValue)
{
var processInstance = wfProcessBll.GetProcessInstanceEntity(keyValue);
var processScheme = wfProcessBll.GetProcessSchemeEntity(processInstance.ProcessSchemeId);
var JsonData = new
{
processInstance = processInstance,
processScheme = processScheme
};
return Content(JsonData.ToJson());
}
/// <summary>
/// 获取进程实例
/// </summary>
/// <param name="keyValue"></param>
/// <returns></returns>
[HttpGet]
public ActionResult GetProcessInstanceJson(Guid keyValue)
{
var processInstance = wfProcessBll.GetProcessInstanceEntity(keyValue);
return Content(processInstance.ToJson());
}
#endregion
#region
/// <summary>
/// 删除工作流实例进程
/// </summary>
/// <param name="keyValue">主键值</param>
/// <returns></returns>
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteProcess(Guid keyValue)
{
wfProcessBll.DeleteProcess(keyValue);
return Content("删除成功。");
}
/// <summary>
/// 审核流程
/// </summary>
/// <param name="processId">工作流实例主键Id</param>
/// <param name="processId">审核数据</param>
/// <returns></returns>
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult VerificationProcess(Guid processId, string verificationData)
{
wfProcessBll.VerificationProcess(processId, verificationData);
return Content("审核成功。");
}
#endregion
}
}

View File

@@ -31,7 +31,7 @@
<div class="col-md-9">
<div class="widget-box widget-color-blue">
<div class="widget-header">
@Html.Action("MenuHeader", "Home")
@Html.Action("MenuHeader", "Home", new {area=""})
</div>
<div class="widget-body gridwidth">
<div class="widget-main">

View File

@@ -0,0 +1,72 @@
@{
ViewBag.Title = "查看流程进度";
Layout = "~/Views/Shared/_FlowForm.cshtml";
}
<script>
var processSchemeId = request('processSchemeId');
var ActivityId = request('activityId');
$(function () {
var schemeContent;
$.SetForm({
url: "../../FlowManage/FlowProcess/GetProcessSchemeJson",
param: { keyValue: processSchemeId },
success: function (data) {
schemeContent = JSON.parse(JSON.parse(data.SchemeContent).SchemeContent);
frmdata = JSON.parse(JSON.parse(data.SchemeContent).frmData);
$('#frmpreview').frmPreview({
tablecotent: schemeContent.Frm.FrmContent,
width:1080
});
$('#FlowPanel').flowdesign({
width: $(window).width()+3,
height: $(window).height()-42,
flowcontent: schemeContent.Flow,
haveTool: false,
isprocessing: true,
activityId: ActivityId,
nodeData: schemeContent.Flow.nodes
});
$('#frmpreview').frmSetData(frmdata);
$('#frmpreview').find('input,select,textarea,.ui-select').attr('disabled', 'disabled');
}
});
});
</script>
<ul class="nav nav-tabs">
<li class="active"><a href="#FlowPanel" data-toggle="tab">流程信息</a></li>
<li><a href="#frmpreview" data-toggle="tab">表单信息</a></li>
</ul>
<div class="tab-content">
<div id="FlowPanel" class="tab-pane active">
</div>
<div id="frmpreview" class="tab-pane app_layout app_preview">
</div>
</div>
<style>
body {
overflow: hidden;
}
.app_preview {
height: 620px;
}
.app_preview .item_field_value {
width: 964px;
}
.app_preview .item_row {
background-color: #fff;
}
.app_layout .item_field_label {
background-color: #fff;
}
input, textarea {
background: #fff !important;
}
</style>

View File

@@ -0,0 +1,226 @@
@{
ViewBag.Title = "我的流程";
Layout = "~/Views/Shared/_Index.cshtml";
}
<script src="~/Content/scripts/plugins/pagination/jquery.pagination-1.2.7.js"></script>
<link href="~/Content/scripts/plugins/pagination/jquery.pagination.css" rel="stylesheet" />
<script>
var params="";
$(function () {
InitialPage();
GetSchemeType();
GetGrid();
});
//初始化页面
function InitialPage() {
//resize重设(表格、树形)宽高
$(window).resize(function (e) {
window.setTimeout(function () {
$("#taskblock").height($(window).height() - 131);
$("#itemTree").height($(window).height() - 52);
}, 200);
e.stopPropagation();
});
}
//加载树
function GetSchemeType() {
$.SetForm({
url: "../../SystemManage/DataItemDetail/GetDataItemTreeJson",
param: { EnCode: "FlowSort" },
success: function (data) {
$.each(data, function (id, item) {
var row = '<li><a data-value="' + item.id + '">' + item.text + '</a></li>';
$('#SchemeType').find('ul').append(row);
});
$('#SchemeType').find('li>a').click(function () {
var id = $(this).attr('data-value');
var text = $(this).html();
var queryJson = { SchemeType: id };
params = { queryJson: JSON.stringify(queryJson) };
$("#girdPager").page('remote', 0, params);
$('#SchemeType').find('.dropdown-text').html(text);
});
}
})
}
//加载表格
function GetGrid() {
$("#taskblock").height($(window).height() - 131);
$("#girdPager").panginationEx({
url: "../../FlowManage/FlowProcess/GetRuntimePageListJson",
success: function (data) {
var $flowlist = $("#flowlist");
$flowlist.html("");
if (data.length > 0) {
$('.no-data').hide();
}
else {
$('.no-data').show();
}
$.each(data, function (i, item) {
var _listhtml = '<li><div style="width: ' + (item.isfinish == 4 ? '239px' : '160px') + '; line-height: 38px;margin-top:11px; float: right;">' + (item.isfinish == 4 ? '<a class="btn btn-warning applicationmodel" style="margin-right:4px;" >重新申请</a>' : '') + '<a class="btn btn-success previewmodel" style="margin-right:4px;">进度查看</a><a class="btn btn-danger deletemodel" >流程召回</a></div>';
_listhtml += '<div style="float: left;">';
_listhtml += '<span class="item-text">' + item.code + '/' + item.customname + '</span>';
_listhtml += '<div><span class=\"label label-success-learun\" data-toggle="tooltip" data-placement="top" title="流程分类" >' + item.schemetypename + '</span>';
_listhtml += '<span style="margin-left:5px;" class=\"label label-inverse-learun\" data-toggle="tooltip" data-placement="top" title="当前节点">' + item.activityname + '</span>';
if (item.enabledmark == 1) {
if (item.isfinish == 3) {
_listhtml += '<span style="margin-left:5px;" class=\"label label-danger\" data-toggle="tooltip" data-placement="top" title="状态">不通过</span>';
}
else if (item.isfinish == 1) {
_listhtml += '<span style="margin-left:5px;" class=\"label label-success\" data-toggle="tooltip" data-placement="top" title="状态">通过完成</span>';
}
else if (item.isfinish == 0) {
_listhtml += '<span style="margin-left:5px;" class=\"label label-info\" data-toggle="tooltip" data-placement="top" title="状态" >处理中</span>';
}
else if (item.isfinish == 4) {
_listhtml += '<span style="margin-left:5px;" class=\"label label-warning\" data-toggle="tooltip" data-placement="top" title="状态" >被驳回</span>';
}
}
else {
_listhtml += '<span style="margin-left:5px;" class=\"label label-important-learun\" data-toggle="tooltip" data-placement="top" title="状态" >暂停</span>';
}
switch (item.wflevel)
{
case 1:
_listhtml += '<span style="margin-left:5px;" class=\"label label-danger\" data-toggle="tooltip" data-placement="top" title="等级" >重要</span>';
break;
case 2:
_listhtml += '<span style="margin-left:5px;" class=\"label label-success\" data-toggle="tooltip" data-placement="top" title="等级" >普通</span>';
break;
case 3:
_listhtml += '<span style="margin-left:5px;" class=\"label label-warning\" data-toggle="tooltip" data-placement="top" title="等级" >一般</span>';
break;
}
_listhtml += '</div><p>By.' + item.createusername + '-' + item.createdate + ' | 备注:' + item.description + '</p>';
_listhtml += '</div></li>';
var $_listhtml = $(_listhtml);
$_listhtml.find('.previewmodel')[0].processInstanceId = item.id;
$_listhtml.find('.previewmodel')[0].activityId = item.activityid;
$_listhtml.find('.previewmodel')[0].processSchemeId = item.processschemeid;
$_listhtml.find('.previewmodel')[0].processname = item.code + '/' + item.customname;
$_listhtml.find('.deletemodel')[0].processInstanceId = item.id;
$_listhtml.find('.deletemodel')[0].processSchemeId = item.processschemeid;
if ($_listhtml.find('.applicationmodel').length > 0)
{
$_listhtml.find('.applicationmodel')[0].processInstanceId = item.id;
$_listhtml.find('.applicationmodel')[0].activityId = item.activityid;
$_listhtml.find('.applicationmodel')[0].processSchemeId = item.processschemeid;
$_listhtml.find('.applicationmodel')[0].processname = item.code + '/' + item.customname;
}
$flowlist.append($_listhtml);
});
$('[data-toggle="tooltip"]').tooltip();
//进度查看
$('.previewmodel').click(function () {
var $_btn = $(this).context;
var _processInstanceId = $_btn.processInstanceId;
var _processSchemeId = $_btn.processSchemeId;
var _processname = $_btn.processname;
var _activityId = $_btn.activityId;
dialogOpen({
id: "ProcessLookForm",
title: '进度查看【' + _processname + '】',
url: '/FlowManage/FlowMyProcess/ProcessLookForm?processSchemeId=' + _processSchemeId + '&activityId=' + _activityId,
width: "1100px",
height: "700px",
btn:null,
callBack: function (iframeId) {
}
});
});
//流程召回
$('.deletemodel').click(function () {
var $_btn = $(this).context;
var $this = $(this);
var _ProcessInstanceId = $_btn.processInstanceId;
if (_ProcessInstanceId) {
$.ConfirmAjax({
msg: "注:您确定要召回吗?该操作将无法恢复",
url: "../../FlowManage/FlowProcess/DeleteVirtualProcess",
param: { keyValue: _ProcessInstanceId },
success: function (data) {
$("#girdPager").page('remote', '', params);
}
})
} else {
dialogMsg('请选择需要召回的流程!', 0);
}
});
//重新申请
$('.applicationmodel').click(function () {
var $_btn = $(this).context;
var _processInstanceId = $_btn.processInstanceId;
var _processSchemeId = $_btn.processSchemeId;
var _processname = $_btn.processname;
var _activityId = $_btn.activityId;
dialogOpen({
id: "ProcessAgainNewForm",
title: '重新申请【' + _processname + '】',
url: '/FlowManage/FlowMyProcess/ProcessAgainNewForm?keyValue=' + _processInstanceId + '&activityId=' + _activityId,
width: "1100px",
height: "700px",
btn: null,
callBack: function (iframeId) {
}
});
});
},
sortname: "CreateDate desc"
});
//查询事件
$("#btn_Search").click(function () {
var queryJson = { Keyword: $("#txt_Keyword").val() };
params = { queryJson: JSON.stringify(queryJson) };
$("#girdPager").page('remote', 0, params);
});
}
//回调函数
function callBack() {
$("#girdPager").page('remote', '', params);
}
</script>
<div class="titlePanel">
<div class="title-search">
<table>
<tr>
<td>
<div id="SchemeType" class="btn-group">
<a class="btn btn-default dropdown-text" data-toggle="dropdown">选择流程分类</a>
<a class="btn btn-default dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></a>
<ul class="dropdown-menu"></ul>
</div>
</td>
<td style="padding-left: 5px;">
<input id="txt_Keyword" type="text" class="form-control" placeholder="请输入要查询关键字" style="width: 200px;" />
</td>
<td style="padding-left: 5px;">
<a id="btn_Search" class="btn btn-primary"><i class="fa fa-search"></i>&nbsp;查询</a>
</td>
</tr>
</table>
</div>
<div class="toolbar">
<div class="btn-group">
<a id="lr-replace" class="btn btn-default" onclick="reload();"><i class="fa fa-refresh"></i>&nbsp;刷新</a>
</div>
</div>
</div>
<div class="taskblockPanel">
<div id="taskblock" class="taskblock">
<ul id="flowlist"></ul>
</div>
<div id="girdPager" class="m-pagination"></div>
<div class="no-data"></div>
</div>

View File

@@ -0,0 +1,161 @@
@{
ViewBag.Title = "再次申请";
Layout = "~/Views/Shared/_FlowForm.cshtml";
}
<script>
var keyValue = request('keyValue');
var ProcessSchemeId = "";
var activityId =request('activityId');
$(function () {
initialPage();
})
//初始化页面
function initialPage() {
$('.FlowPanelall').height($.windowHeight() - 40);
$('#Description').height($.windowHeight() - 390);
//获取表单
$.SetForm({
url: "../../FlowManage/FlowProcess/GetProcessInfoJson",
param: { keyValue: keyValue },
success: function (data) {
var _schemeContent = JSON.parse(JSON.parse(data.processScheme.SchemeContent).SchemeContent);
var _frmdata = JSON.parse(JSON.parse(data.processScheme.SchemeContent).frmData);
$('#frmpreview').frmPreview({
tablecotent: _schemeContent.Frm.FrmContent
});
$('#frmpreview').frmSetData(_frmdata);
$('#ProcessInfo').SetWebControls(data.processInstance);
$('#wfLevel' + data.processInstance.wfLevel).trigger("click");
ProcessSchemeId = data.processInstance.ProcessSchemeId;
var _node = "";
for(var i in _schemeContent.Flow.nodes)
{
if(_schemeContent.Flow.nodes[i].id == activityId)
{
_node = _schemeContent.Flow.nodes[i];
break;
}
}
var _username = top.clientuserData[_node.setInfo.UserId] == undefined ? _node.setInfo.UserId : top.clientuserData[_node.setInfo.UserId].RealName;
_username = _username == "System" ? '超级管理员' : '_username';
$('#ruser').html('驳回人:' + _username + (_node.setInfo.TagedTime != undefined ?'-' +_node.setInfo.TagedTime:''));
$('#rDescription').html('备注:' + _node.setInfo.description);
}
});
}
//提交表单
function btn_Finish() {
if (!$('#ProcessInfo').Validform()) {
return false;
}
var _postData = $("#ProcessInfo").GetWebControls(keyValue);
_postData["EnabledMark"] = 1;
_postData["ProcessSchemeId"] = ProcessSchemeId;
_postData["wfLevel"] = $('input[name="wfLevel"]:checked').val();
var _data = $("#frmpreview").frmGetData();
$.SaveForm({
url: "../../FlowManage/FlowRoughdraft/EditionRoughdraftProcess",
param: { "keyValue": keyValue, "frmData": JSON.stringify(_data), "wfProcessInstanceJson": JSON.stringify(_postData) },
loading: "正在保存数据...",
success: function () {
$.currentIframe().callback();
}
})
}
</script>
<div class="FlowPanelall">
<div id="frmpreview" class="tab-pane app_layout app_preview active">
</div>
</div>
<div class="FlowInfoPanel" id="ProcessInfo">
<div class="alert alert-danger" style="text-align: left; margin-bottom: 10px;height:98px;overflow-y:auto;">
<p><i class="fa fa-warning alert-dismissible" style="position: relative; top: 1px; font-size: 15px; padding-right: 5px;"></i>
此流程被驳回,需要重新申请!
</p>
<p id="ruser">驳回人:</p>
<p id="rDescription">备注:</p>
</div>
<div style="color:#9f9f9f;padding-bottom:15px;padding-left:5px;"><i style="padding-right:5px;" class="fa fa-info-circle"></i><span>填写左侧表单和实例信息,重新申请</span></div>
<table class="form">
<tr>
<td class="formTitle">流程实例编号<font face="宋体">*</font></td>
</tr>
<tr>
<td class="formValue">
<input id="Code" disabled type="text" class="form-control" isvalid="yes" checkexpession="NotNull" />
</td>
</tr>
<tr>
<td class="formTitle">自定义标题<font face="宋体">*</font></td>
</tr>
<tr>
<td class="formValue">
<input id="CustomName" type="text" class="form-control" isvalid="yes" checkexpession="NotNull" />
</td>
</tr>
<tr>
<td class="formTitle">重要等级<font face="宋体">*</font></td>
</tr>
<tr>
<td class="formValue">
<div class="rdio rdio-color_a"><input name="wfLevel" id="wfLevel1" value="1" type="radio" /><label for="wfLevel1">重要</label></div>
<div class="rdio rdio-color_f"><input name="wfLevel" id="wfLevel2" value="2" type="radio" checked /><label for="wfLevel2">普通</label></div>
<div class="rdio rdio-color_c"><input name="wfLevel" id="wfLevel3" value="3" type="radio" /><label for="wfLevel3">一般</label></div>
</td>
</tr>
<tr>
<td class="formTitle">备注</td>
</tr>
<tr>
<td class="formValue">
<textarea id="Description" class="form-control" style="height: 383px;"></textarea>
</td>
</tr>
</table>
</div>
<div class="form-button">
<a id="btn_finish" class="btn btn-success" onclick="btn_Finish();">完成提交</a>
</div>
<style>
body {
overflow: hidden;
}
.app_preview .item_field_value {
width: 664px;
}
.app_preview .item_row {
background-color: #fff;
}
.app_layout .item_field_label {
background-color: #fff;
}
.FlowPanelall {
width: 800px;
float: left;
overflow-y:auto;
}
.FlowInfoPanel {
float: right;
width: 300px;
height: 659px;
z-index: 1000;
background: rgba(0,0,0,0.01);
padding: 10px;
border-left: 1px solid #ccc;
}
.form .formTitle {
text-align: left;
padding-left: 5px;
}
form .formTitle font {
right: auto !important;
margin-left: 5px;
}
.formValue input, .formValue textarea {
border-radius: 5px;
}
input, textarea {
background: #fff !important;
}
</style>

View File

@@ -0,0 +1,67 @@
@{
ViewBag.Title = "查看流程进度";
Layout = "~/Views/Shared/_FlowForm.cshtml";
}
<script>
var processSchemeId = request('processSchemeId');
var ActivityId = request('activityId');
$(function () {
var schemeContent;
$.SetForm({
url: "../../FlowManage/FlowProcess/GetProcessSchemeJson",
param: { keyValue: processSchemeId },
success: function (data) {
schemeContent = JSON.parse(JSON.parse(data.SchemeContent).SchemeContent);
frmdata = JSON.parse(JSON.parse(data.SchemeContent).frmData);
$('#frmpreview').frmPreview({
tablecotent: schemeContent.Frm.FrmContent,
width:1080
});
$('#FlowPanel').flowdesign({
width: $(window).width()+3,
height: $(window).height()-42,
flowcontent: schemeContent.Flow,
haveTool: false,
isprocessing: true,
activityId: ActivityId,
nodeData: schemeContent.Flow.nodes
});
$('#frmpreview').frmSetData(frmdata);
$('#frmpreview').find('input,select,textarea,.ui-select').attr('disabled', 'disabled');
}
});
});
</script>
<ul class="nav nav-tabs">
<li class="active"><a href="#FlowPanel" data-toggle="tab">流程信息</a></li>
<li><a href="#frmpreview" data-toggle="tab">表单信息</a></li>
</ul>
<div class="tab-content">
<div id="FlowPanel" class="tab-pane active">
</div>
<div id="frmpreview" class="tab-pane app_layout app_preview">
</div>
</div>
<style>
body {
overflow:hidden;
}
.app_preview {
height:620px;
}
.app_preview .item_field_value {
width:964px;
}
.app_preview .item_row {
background-color: #fff;
}
.app_layout .item_field_label {
background-color: #fff;
}
input, textarea {
background: #fff!important;
}
</style>

View File

@@ -51,25 +51,35 @@ function MainGrid() {
index: "Id",
hidden: true
},
{
name: "ProcessSchemeId",
index: "ProcessSchemeId",
hidden: true
},
{
name: "ActivityId",
index: "ActivityId",
hidden: true
},
{
index: "Name",
name: "Name",
label: "申请名称"
index: "Code",
name: "Code",
label: "流程编号"
},
{
index: "Comment",
name: "Comment",
label: "申请描述"
},
{
index: "StateName",
name: "StateName",
label: "流程状态"
},
{
index: "WorkflowName",
name: "WorkflowName",
index: "CustomName",
name: "CustomName",
label: "流程名称"
},
{
index: "ActivityName",
name: "ActivityName",
label: "当前节点"
},
{
index: "CreateDate",
name: "CreateDate",
label: "创建时间"
}
],
url: url + selectedId,
@@ -194,7 +204,7 @@ function detail() {
title: selected.Name,
skin: "layui-layer-rim", //加上边框
area: ["800px", "600px"], //宽高
content: "/CommonApplies/Detail?id=" + selected.Id,
content: "/FlowManage/CommonApplies/ProcessLookForm?processSchemeId=" + selected.ProcessSchemeId + "&activityId="+selected.ActivityId,
maxmin: true, //开启最大化最小化按钮
end: function() {
list.reload();

View File

@@ -1,163 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Infrastructure;
using OpenAuth.App;
using OpenAuth.App.SSO;
using OpenAuth.App.ViewModel;
using OpenAuth.Domain;
using OpenAuth.Mvc.Models;
using OptimaJet.Workflow.Core.Runtime;
using ProcessStatus = OptimaJet.Workflow.Core.Persistence.ProcessStatus;
namespace OpenAuth.Mvc.Controllers
{
/// <summary>
/// 通用申请流程处理
/// <para>李玉宝新增于2016-09-08 19:21:59</para>
/// </summary>
public class CommonAppliesController : BaseController
{
private CommonApplyApp _app;
public CommonAppliesController()
{
_app = AutofacExt.GetFromFac<CommonApplyApp>();
}
public ActionResult Index()
{
return View();
}
public string Load(string type, int pageCurrent = 1, int pageSize = 30)
{
return JsonHelper.Instance.Serialize(_app.Load(AuthUtil.GetCurrentUser().User.Id, type, pageCurrent, pageSize));
}
[HttpPost]
public string Edit(CommonApply apply)
{
try
{
apply.UserId = AuthUtil.GetCurrentUser().User.Id;
_app.AddOrUpdate(apply);
CreateWorkflowIfNotExists(apply.Id,apply.WorkflowName);
}
catch (Exception ex)
{
Result.Status = false;
Result.Message = ex.Message;
}
return JsonHelper.Instance.Serialize(Result);
}
public ActionResult Detail(Guid id)
{
CommonApplyVM apply = _app.Get(id);
apply.Commands = GetCommands(id);
return View(apply);
}
/// <summary>
/// 删除申请
/// </summary>
public string Delete(Guid[] ids)
{
try
{
_app.Del(ids);
}
catch (Exception ex)
{
Result.Status = false;
Result.Message = ex.Message;
throw;
}
return JsonHelper.Instance.Serialize(Result);
}
/// <summary>
/// 执行命令
/// </summary>
[HttpPost]
public string ExeCmd(Guid id, string cmd)
{
try
{
ExecuteCommand(id, cmd, null);
}
catch (Exception ex)
{
Result.Status = false;
Result.Message = ex.Message;
throw;
}
return JsonHelper.Instance.Serialize(Result);
}
private void CreateWorkflowIfNotExists(Guid id, string schemecode)
{
if (WorkflowInit.Runtime.IsProcessExists(id))
return;
using (var sync = new WorkflowSync(WorkflowInit.Runtime, id))
{
WorkflowInit.Runtime.CreateInstance(schemecode, id);
sync.StatrtWaitingFor(new List<ProcessStatus> { ProcessStatus.Initialized, ProcessStatus.Initialized });
sync.Wait(new TimeSpan(0, 0, 10));
}
}
/// <summary>
/// 获取当前登陆用户可执行的命令
/// </summary>
/// <param name="id">流程实体ID</param>
private CommandModel[] GetCommands(Guid id)
{
var result = new List<CommandModel>();
var commands = WorkflowInit.Runtime.GetAvailableCommands(id, AuthUtil.GetCurrentUser().User.Id.ToString());
foreach (var workflowCommand in commands) //去除相同的
{
if (result.Count(c => c.Key == workflowCommand.CommandName) == 0)
result.Add(new CommandModel {
Key = workflowCommand.CommandName,
Value = workflowCommand.LocalizedName,
Classifier = workflowCommand.Classifier });
}
return result.ToArray();
}
/// <summary>
/// 执行指令
/// </summary>
/// <param name="id">流程实例ID</param>
/// <param name="commandName">命令名称</param>
/// <param name="apply">申请实体</param>
private void ExecuteCommand(Guid id, string commandName, CommonApply apply)
{
var currentUser =AuthUtil.GetCurrentUser().User.Id.ToString();
var commands = WorkflowInit.Runtime.GetAvailableCommands(id, currentUser);
var command =
commands.FirstOrDefault(
c => c.CommandName.Equals(commandName, StringComparison.CurrentCultureIgnoreCase));
if (command == null)
return;
WorkflowInit.Runtime.ExecuteCommand(id, currentUser, currentUser, command);
}
}
}

View File

@@ -28,39 +28,39 @@ namespace OpenAuth.Mvc
}
protected void Application_Error(object sender, EventArgs e)
{
var app = (MvcApplication)sender;
var context = app.Context;
var ex = app.Server.GetLastError();
LogHelper.Fatal(ex.Message);
//protected void Application_Error(object sender, EventArgs e)
//{
// var app = (MvcApplication)sender;
// var context = app.Context;
// var ex = app.Server.GetLastError();
// LogHelper.Fatal(ex.Message);
context.Response.Clear();
context.ClearError();
var httpException = ex as HttpException;
var routeData = new RouteData();
routeData.Values["controller"] = "error";
routeData.Values["exception"] = ex;
routeData.Values["action"] = "http500";
if (httpException != null)
{
// context.Response.Clear();
// context.ClearError();
// var httpException = ex as HttpException;
// var routeData = new RouteData();
// routeData.Values["controller"] = "error";
// routeData.Values["exception"] = ex;
// routeData.Values["action"] = "http500";
// if (httpException != null)
// {
switch (httpException.GetHttpCode())
{
case 404:
routeData.Values["action"] = "http404";
break;
case 401: //没有登录
routeData.Values["action"] = "http401";
break;
case 400: //演示版本,没有执行的权限
routeData.Values["action"] = "DemoError";
break;
}
}
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));
}
// switch (httpException.GetHttpCode())
// {
// case 404:
// routeData.Values["action"] = "http404";
// break;
// case 401: //没有登录
// routeData.Values["action"] = "http401";
// break;
// case 400: //演示版本,没有执行的权限
// routeData.Values["action"] = "DemoError";
// break;
// }
// }
// IController controller = new ErrorController();
// controller.Execute(new RequestContext(new HttpContextWrapper(context), routeData));
//}
}
}

View File

@@ -78,8 +78,7 @@ namespace OpenAuth.Mvc.Models
{
var nextState = WorkflowInit.Runtime.GetLocalizedStateName(e.ProcessId, e.ProcessInstance.CurrentState);
var _app = AutofacExt.GetFromFac<CommonApplyApp>();
_app.ChangeState(e.ProcessId, e.ProcessInstance.CurrentState, nextState);
}
/// <summary>

View File

@@ -150,6 +150,8 @@
<Compile Include="App_Start\BundleConfig.cs" />
<Compile Include="App_Start\FilterConfig.cs" />
<Compile Include="App_Start\RouteConfig.cs" />
<Compile Include="Areas\FlowManage\Controllers\FlowLaunchController.cs" />
<Compile Include="Areas\FlowManage\Controllers\FlowProcessController.cs" />
<Compile Include="Areas\FlowManage\Controllers\FormDesignController.cs" />
<Compile Include="Areas\FlowManage\Controllers\FlowDesignController.cs" />
<Compile Include="Areas\FlowManage\FlowManageAreaRegistration.cs" />
@@ -159,7 +161,7 @@
<Compile Include="Controllers\WorkflowSchemasController.cs" />
<Compile Include="Controllers\DesignerController.cs" />
<Compile Include="Controllers\ErrorController.cs" />
<Compile Include="Controllers\CommonAppliesController.cs" />
<Compile Include="Areas\FlowManage\Controllers\CommonAppliesController.cs" />
<Compile Include="Controllers\HomeController.cs" />
<Compile Include="Controllers\LoginController.cs" />
<Compile Include="Controllers\ModuleElementManagerController.cs" />
@@ -1515,9 +1517,12 @@
<Content Include="Content\styles\fonts\fontawesome-webfont.woff" />
<Content Include="Content\styles\fonts\fontawesome-webfont.woff2" />
<Content Include="Content\styles\fonts\FontAwesome.otf" />
<Content Include="Areas\FlowManage\Views\FlowMyProcess\Index.cshtml" />
<Content Include="Areas\FlowManage\Views\FlowMyProcess\ProcessAgainNewForm.cshtml" />
<Content Include="Areas\FlowManage\Views\FlowMyProcess\ProcessLookForm.cshtml" />
<Content Include="Areas\FlowManage\Views\CommonApplies\ProcessLookForm.cshtml" />
<None Include="Properties\PublishProfiles\default.pubxml" />
<Content Include="Views\Designer\Index.cshtml" />
<Content Include="Views\CommonApplies\Detail.cshtml" />
<None Include="Views\Error\NoAccess.cshtml" />
<Content Include="Views\Home\git.cshtml" />
<Content Include="Web.config">
@@ -1537,7 +1542,7 @@
<Content Include="Views\ResourceManager\AssignRes.cshtml" />
<Content Include="Views\StockManager\Index.cshtml" />
<Content Include="Views\Shared\_Layout.cshtml" />
<Content Include="Views\CommonApplies\Index.cshtml" />
<Content Include="Areas\FlowManage\Views\CommonApplies\Index.cshtml" />
<Content Include="Views\WorkflowSchemas\Index.cshtml" />
<Content Include="Views\Home\Navbar.cshtml" />
<Content Include="Views\Shared\Blank.cshtml" />

View File

@@ -1,47 +0,0 @@
@{
Layout = null;
}
@using OptimaJet.Workflow.Core.Model
@model OpenAuth.App.ViewModel.CommonApplyVM
<script src="/Scripts/jquery.js"></script>
<script src="/Scripts/jquery-ui.js"></script>
<script src="/Scripts/kinetic-v5.1.0.min.js"></script>
<script src="/Scripts/workflowdesigner.min.js"></script>
<script src="/Scripts/designerconstants.js"></script>
<script src="/Scripts/ace.js"></script>
<script src="/Scripts/json5.js"></script>
<script src="/BllScripts/queryString.js"></script>
<link href="/Content/plugins/jQueryUI/base/jquery-ui.min.css" rel="stylesheet" />
<link href="/Content/workflowdesigner.css" rel="stylesheet" type="text/css" />
<input value="@Model.Id" id="processId" type="hidden" />
<input value="@Model.WorkflowName" id="schemeCode" type="hidden" />
@if (Model.Commands.Length > 0)
{
<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
<p>
<span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
下图蓝色为当前状态,你可以执行:
@foreach (var cmd in Model.Commands)
{
if (cmd.Classifier == TransitionClassifier.Reverse)
{
<button class="workflowcmd" value="@cmd.Key">@cmd.Value</button>
}
else
{
<button class="workflowcmd" value="@cmd.Key">@cmd.Value</button>
}
}
</p>
</div>
}
<div id="wfdesigner"></div>
<script src="/BllScripts/queryString.js"></script>
<script src="/BllScripts/processDetail.js?v=1"></script>

View File

@@ -169,7 +169,7 @@
</script>
<!-- #section:basics/sidebar -->
@Html.Action("Navbar","Home")
@Html.Action("Navbar","Home", new {area=""})
<!-- /section:basics/sidebar -->
<div class="main-content">