系列目录

步骤设计很重要,特别是规则的选择。

我这里分为几个规则

1.按自行选择(在起草时候自行选审批人,比较灵活)

2.按上级(无需指定,当时需要知道用户的上司是谁,可以在职位管理设置,或者在用户表直接设置)

3.按职位(选择职位,直接获得该职位的人员)

4.按部门(按部门,直接获得该部分的人员)

5.按人员(设置步骤时就指定人员)

以上用户必须和部门,职位,上级有所关联,只要做好一个其实全部都同理

表结构分析:Flow_FormStep中有IsAllCheck字段我设计这个的目的是批量审核,比如我选择了部门,那么这个步骤要全部门的人都审核通过才算通过否则其中一人审核即可

先创建一个新的表单,必须有新的表单才能设置步骤

OK,新建好表单的字段之后,就可以设置步骤了

步骤设置很简单,就是一个从表关系,对应了表单的ID。从表可以直接简单看出关系,但设计其实比较有复杂,当选择组织架构,按职位,按指定人。都必须弹出窗口来进行选择,所以还要设计多3个弹出窗口,我这里只设计按人员筛选为例,因为按人员之前在权限管理的角色组管理已经实现

我这里“又”设计成了一个手风琴,具体实现如下

新建步骤和修改步骤=设计步骤

核心Action

[SupportFilter(ActionName = "Edit")]
public ActionResult EditStep(string id)
{
ViewBag.Perm = GetPermission();
Flow_FormModel flowFormModel = m_BLL.GetById(id);
List<Flow_StepModel> stepList = stepBLL.GetList(ref setNoPagerDescBySort, flowFormModel.Id);//获得全部步骤
foreach (var r in stepList)//获取步骤下面的步骤规则
{
r.stepRuleList = GetStepRuleListByStepId(r.Id);
}
flowFormModel.stepList = stepList;//获取表单关联的步骤
ViewBag.Form = flowFormModel;
Flow_StepModel model = new Flow_StepModel();
model.FormId = flowFormModel.Id;
model.IsEditAttr = true;
return View(model);
} [HttpPost]
[SupportFilter(ActionName = "Edit")]
public JsonResult EditStep(Flow_StepModel model)
{
model.Id = ResultHelper.NewId;
if (model != null && ModelState.IsValid)
{ if (stepBLL.Create(ref errors, model))
{
LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",Name" + model.Name, "成功", "创建", "Flow_Step");
return Json(JsonHandler.CreateMessage(, Suggestion.InsertSucceed, model.Id));
}
else
{
string ErrorCol = errors.Error;
LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",Name" + model.Name + "," + ErrorCol, "失败", "创建", "Flow_Step");
return Json(JsonHandler.CreateMessage(, Suggestion.InsertFail + ErrorCol));
}
}
else
{
return Json(JsonHandler.CreateMessage(, Suggestion.InsertFail));
}
}

Controller

完整EditStep.cshtml代码

@model App.Models.Flow.Flow_StepModel
@using App.Common;
@using App.Models.Flow;
@using App.Admin;
@using App.Models.Sys;
@{
ViewBag.Title = "创建";
Layout = "~/Views/Shared/_Index_LayoutEdit.cshtml";
List<permModel> perm = (List<permModel>)ViewBag.Perm;
if (perm == null)
{
perm = new List<permModel>();
}
Flow_FormModel formModel = (Flow_FormModel)ViewBag.Form;
}
<style>
.stepContent table td {
padding: 3px;
} .lineheight {
line-height: 20px;
}
</style>
<script type="text/javascript">
$(function () {
$(".icon-delete").click(function () {
if ($(this).next("a").attr("class") == "accordion-collapse accordion-expand") {
$(this).next("a").trigger("click");
}
});
$("#FlowRule").change(function () {
$("#Execution").val("");
$("#ExecutionName").val("");
if ($("#FlowRule").val() == "上级" || $("#FlowRule").val() == "自选") {
$("#ruleExecution").hide();
} else if ($("#FlowRule").val() == "职位") {
$("#selExc").html("审批职位");
$("#ruleExecution").show();
}
else if ($("#FlowRule").val() == "部门") {
$("#selExc").html("审批部门");
$("#ruleExecution").show();
} else if ($("#FlowRule").val() == "人员") {
$("#selExc").html("审批人员");
$("#ruleExecution").show();
}
});
$("#selExc").click(function () {
var html = $("#selExc").html()
if (html == "审批人员") {
$("#modalwindow").html("<iframe width='100%' height='100%' scrolling='no' frameborder='0'' src='/SysHelper/UserLookUp'></iframe>");
$("#modalwindow").window({ title: '选择人员', width: , height: , iconCls: 'icon-add' }).window('open');
} else if (html == "审批职位") {
$("#modalwindow").html("<iframe width='100%' height='100%' scrolling='no' frameborder='0'' src='/SysHelper/PosMulLookUp'></iframe>");
$("#modalwindow").window({ title: '选择职位', width: , height: , iconCls: 'icon-add' }).window('open');
} else if (html == "审批部门") {
$("#modalwindow").html("<iframe width='100%' height='100%' scrolling='no' frameborder='0'' src='/SysHelper/DepMulLookUp'></iframe>");
$("#modalwindow").window({ title: '选择部门', width: , height: , iconCls: 'icon-add' }).window('open');
}
});
}); var idx = @(formModel.stepList.Count());
function Create() {
if ($("form").valid()) {
$.ajax({
url: "@Url.Action("EditStep")",
type: "Post",
data: $("form").serialize(),
dataType: "json",
success: function (data) {
var stepId = data.value;
var currentIDX = idx + ;
$('#stepList').accordion('add', {
title: '第 ' + (idx + ) + ' 步',
iconCls: 'pic_244',
content: '<div class="stepContent" style="padding:5px"><table class="wid100f"><tr><td style="width:100px;" class="tr">步骤名称:</td><td>'+$("#Name").val()+'</td></tr><tr><td class="tr">步骤说明:</td><td>'+$("#Remark").val()+'</td></tr></table></div>',
tools: [{
iconCls: 'icon-delete',
handler: function (i) {
DeleteStep(stepId);
}
}]
});
idx++;
$("#Sort").val(idx);
$(".icon-delete").click(function () {
if ($(this).next("a").attr("class") == "accordion-collapse accordion-expand") {
$(this).next("a").trigger("click");
}
});
}
});
}
} function DeleteStep(stepId)
{
$.messager.confirm('提示', '你要删除当前步骤及条件吗?', function (r) {
if (r) {
$.post("@Url.Action("DeleteStep")?id=" + stepId, function (data) {//从数据库删除
if (data.type == )
{
var pp = $('#stepList').accordion('getSelected');
if (pp) {
var index = $('#stepList').accordion('getPanelIndex', pp) $('#stepList').accordion('remove', index);
idx--;
//删除后需要重新设置标题
$("#stepList .panel .panel-title").each(function (i) {
$(this).html('第 ' + (i + ) + ' 步');
})
}
$.messageBox5s('提示', data.message);
}
}, "json"); }
});
} function SetSelResult(result,resultName)
{ $("#Execution").val(result);
$("#ExecutionName").val(resultName);
}
function GetSelResult()
{
var arrayObj = new Array()
arrayObj[]= $("#Execution").val();
arrayObj[]= $("#ExecutionName").val();
return arrayObj;
}
//ifram 返回
function frameReturnByClose() {
$("#modalwindow").window('close');
}
</script>
<div id="modalwindow" class="easyui-window" data-options="modal:true,closed:true,minimizable:false,shadow:false"></div> <table style="height: 393px;">
<tr>
<td style="width: 480px; border-right: 1px #ccc solid; vertical-align: top">
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.FormId)
@Html.HiddenFor(model => model.Sort)
<table class="fromEditTable setTextWidth100" style="width: 100%">
<tbody>
<tr>
<td style="width: 100px; text-align: right;">表单名称:
</td>
<td colspan="">
@Html.DisplayFor(model => formModel.Name)
</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.Name):
</td>
<td>
@Html.EditorFor(model => model.Name)
</td>
<td>@Html.ValidationMessageFor(model => model.Name)</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.Remark):
</td>
<td colspan="">
@Html.TextAreaFor(model => model.Remark, new { @style = "width:330px;height:50px" })
</td> </tr> <tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.FlowRule):
</td>
<td>
<select id="FlowRule" name="FlowRule">
<option value="自选">自行指定人</option>
<option value="上级">按上级</option>
<option value="职位">按职位</option>
<option value="部门">按部门</option>
<option value="人员">按人员</option>
</select>
</td>
<td>@Html.ValidationMessageFor(model => model.FlowRule)</td>
</tr>
<tr id="ruleExecution" style="display: none">
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.Execution):
</td>
<td colspan="">
@Html.HiddenFor(model => model.Execution)
<input id="ExecutionName" disabled="disabled" type="text" style="width: 200px" />
<a class="icon-add" id="selExc" href="#" ></a>
</td>
<td>@Html.ValidationMessageFor(model => model.Execution)</td>
</tr> <tr style="display:none">
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.IsAllCheck):
</td>
<td colspan="">
@Html.CheckBoxFor(model => model.IsAllCheck, new { @checked = "checked" })
<span class="gray">当规则或者角色被选择为多人时候,是否启用多人审核才通过</span>
</td> </tr> <tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.CompulsoryOver):
</td>
<td colspan="">
@Html.CheckBoxFor(model => model.CompulsoryOver)
<span class="gray">审核人是否可以强制完成整个流程</span>
</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;">
@Html.LabelFor(model => model.IsEditAttr):
</td>
<td colspan="">
@Html.CheckBoxFor(model => model.IsEditAttr)
<span class="gray">审核者是否可以编辑发起者的附件</span>
</td>
</tr>
<tr>
<td style="width: 100px; text-align: right;"></td>
<td colspan="">
<a href="javascript:Create()" class="easyui-linkbutton" data-options="iconCls:'icon-add'">添加步骤</a>
</td>
</tr>
</tbody>
</table>
} </td>
<td style="width: 414px;">
<div id="stepList" class="easyui-accordion" data-options="animate:false" style="width: 414px; height: 393px; overflow-y: auto; border: 0px;">
@for (int i = ; i < formModel.stepList.Count(); i++)
{
<div title="第 @(i + 1) 步" data-options="iconCls:'pic_244'
,tools: [{
iconCls: 'icon-delete',
handler: function (i) {
DeleteStep('@(@formModel.stepList[i].Id)'); }
}]">
<div class="stepContent" style="padding: 5px">
<table class="wid100f">
<tr>
<td style="width: 100px;" class="tr">步骤名称:</td>
<td>@formModel.stepList[i].Name</td>
</tr>
<tr>
<td class="tr">步骤说明:</td>
<td>@formModel.stepList[i].Remark</td>
</tr>
</table> </div>
</div>
} </div>
</td>
</tr>
</table>

代码分析,控制器中的删除,修改,直接复制代码生成器生成的即可。

ActionResult EditStep,返回Flow_Step模型的同时也返回了Flow_Form的模型。

我修改了Flow_FormModel,让他支持自己的从表关系,必须添加以下2段即可

public List<Flow_FormAttrModel> attrList { get; set; }
public List<Flow_StepModel> stepList { get; set; }

注:本节一点悬念和技术点都没有,就是一个主表和从表的关系,只不过我是换了另一种方式来显示罢了

ASP.NET MVC5+EF6+EasyUI 后台管理系统(45)-工作流设计-设计步骤的更多相关文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理   http://ww ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试

    1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构

    系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析

    系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控

    系列目录 先补充一个平面化登陆页面代码,自己更换喜欢的颜色背景 @using Apps.Common; @{ Layout = null; } <!DOCTYPE html> <ht ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox

    系列目录 https://yunpan.cn/cZVeSJ33XSHKZ  访问密码 0fc2 今天整合lightbox插件Fancybox1.3.4,发现1.3.4版本太老了.而目前easyui 1 ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(38)-Easyui-accordion+tree漂亮的菜单导航

    系列目录 本节主要知识点是easyui 的手风琴加树结构做菜单导航 有园友抱怨原来菜单非常难看,但是基于原有树形无限级别的设计,没有办法只能已树形展示 先来看原来的效果 改变后的效果,当然我已经做好了 ...

随机推荐

  1. Fis3前端工程化之项目实战

    Fis3项目 项目目录结构: E:. │ .gitignore │ fis-conf.js │ index.html │ package.json │ README.md │ ├─material │ ...

  2. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  3. 在SQL2008查找某数据库中的列是否存在某个值

    在SQL2008查找某数据库中的列是否存在某个值 --SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型: ...

  4. 在Ubuntu下搭建ASP.NET 5开发环境

    在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...

  5. 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...

  6. ABP文档 - 目录

    ABP框架 概览 介绍 多层结构 模块系统 启动配置 多租户 集成OWIN 共同结构 依赖注入 会话 缓存 日志 设置管理 时间 领域层 实体 值对象(新) 仓储 领域服务 工作单元 领域事件(Eve ...

  7. 探索ASP.NET MVC5系列之~~~1.基础篇---必须知道的小技能

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程 汇总:http://www.cnblogs.com/dunitian/p/4822808.html#mvc 本章D ...

  8. 安装eclipse的maven插件

    我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...

  9. NLP点滴——文本相似度

    [TOC] 前言 在自然语言处理过程中,经常会涉及到如何度量两个文本之间的相似性,我们都知道文本是一种高维的语义空间,如何对其进行抽象分解,从而能够站在数学角度去量化其相似性.而有了文本之间相似性的度 ...

  10. bash字符串操作

    参考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 问题:bash怎么提取字符串的最后一位?例如python中strin ...