当前位置: 首页 > news >正文

我是如何带领团队开发工作流项目的

出处:http://atomti.iteye.com/blog/496334

最近有不少朋友写信问我一些关于团队开发的问题,由于这段时间有些忙,没有回复.今天写一篇这方面的文章向大家介绍一下我是如何带领团队开发工作流项目的

关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台UI开发方式,后台服务与前台UI对接方式,代码文档,页面的开发文档,源码管理,单元测试,以及单元测试文档,实现思路设计文档,数据库文档,数据库设计规范,编码规范,操做数据的方法命名规则 方面的一些片断,这是一个为期6个月的工作流平台开发项目,是今年3月份启动的,现在已完成,比计划时间多出25天.核心开发人员(不包括美工,需求,黑盒测试)共有12人(编号从114到125)

补充一点:在UI草图设计上,这次想用绘图板,但最后还是使用铅笔绘制+扫描的方式制做的.

目录

项目开发方式说明图1

后台服务开发方式说明图1

前台UI开发方式说明图2

后台服务与前台UI对接方式说明图3

代码文档(片断节选)4

页面的开发文档(片断节选)5

源码管理6

单元测试,以及单元测试文档(片断节选)7

实现思路设计文档(片断节选)9

数据库文档11

数据库设计规范(片断节选)13

编码规范(片断节选)13

操做数据的方法命名规则13

项目开发方式说明图

后台服务开发方式说明图

前台UI开发方式说明图

后台服务与前台UI对接方式说明图

代码文档(片断节选)

方法签名

public int? addBaseEnumeration(string powerID, List<baseEnumeration> list)

返回值

  • [0]:方法未完成
  • [null]:操作成功
  • [401]:参数[powerID]没通过[security.checkPowerID方法]验证
  • [-1]:参数[list][null]
  • [-2]:参数[list]中的[baseEnumeration.rowID][Guid.Empty]
  • [-3]:参数[list]中的[baseEnumeration.entity][null][string.Empty]
  • [-4]:参数[list]中的[baseEnumeration.field][null][string.Empty]
  • [-5]:参数[list]中的[baseEnumeration.entityType][null][string.Empty]
  • [-6]:参数[list]中的[baseEnumeration.title][null][string.Empty]
  • [-7]:参数[list]中的[baseEnumeration.value][null][string.Empty]
  • [-8]:参数[list]中存在[rowID]重复的记录
  • [-9]:参数[list]中存在[Entity][field][value]重复的记录
  • [3] :参数[list]中的[baseEnumeration.rowID]在数据库中已存在
  • [4] :联合唯一索引[Entity][field][value]在数据库中已存在
  • [5] :参数[entityType]的传入值不是枚举表[entitytype]的基础枚举数据
  • [6] :插入时数据库异常
  • [7] :不能插入[entity]["insertBaseEnumeration"],[field]["entitytype"]的数据

参数

  • [powerID]: 权限参数
  • [list]: 多条baseEnumeration表记录,的泛型集合

约束

<1> 调用[security.checkPowerID方法]判断[powerID],如果[security.checkPowerID方法]返回[false],返回[401]

<2> 如果参数[list][null],返回[-1]

<3> 如果参数[list]中的[baseEnumeration.rowID][Guid.Empty],返回[-2]

<4> 如果参数[list]中的[baseEnumeration.entity][null][string.Empty], 返回[-3]

<5> 如果参数[list]中的[baseEnumeration.field][null][string.Empty], 返回[-4]

<6> 如果参数[list]中的[baseEnumeration.entityType][null][string.Empty], 返回[-5]

<7> 如果参数[list]中的[baseEnumeration.title][null][string.Empty], 返回[-6]

<8> 如果参数[list]中的[baseEnumeration.value][null][string.Empty], 返回[-7]

<9> 如果参数[list]中存在[rowID]重复的记录,返回[-8]

<10>如果参数[list]中存在[entity][field][value]重复的记录,返回[-9]

<11>如果参数[list]中的[baseEnumeration.rowID]在数据库中已存在, 返回[3]

<12>如果联合唯一索引[entity][field][value]在数据库中已存在, 返回[4]

<13>如果参数[entity]["baseEnumeration"],[field][entitytype]的数据,返回[7]

<14>如果参数[entityType]的传入值不是枚举表[entitytype]的基础枚举数据, 返回[5]

<15>如果插入时数据库异常, 返回[6]

说明

[Entity][field][value] 联合唯一索引

<14>获取[Entitytype]基础枚举数据时,使用[23 selectBaseEnumerationTypeName]得到枚举类型名称

单元测试

(组合测试),(自动判断返回状态),(自动判断返回结果)

WFServiceTestProject. manageServiceTest. addBaseEnumerationTest()

//[26] 批量添加枚举

public int? addBaseEnumeration(string powerID, List<baseEnumeration> list)

{

//<1>

if (!security.checkPowerID(powerID))

{

return 401;

}

//<2>

if (list == null)

{

return -1;

}

using (wxwinterDBDataContext db = new wxwinterDBDataContext())

{

//<3>

if (list.Count(p => p.rowID == Guid.Empty) > 0)

{

return -2;

}

//<4>

if (list.Count(p => string.IsNullOrEmpty(p.entity)) > 0)

{

return -3;

}

//<5>

if (list.Count(p => string.IsNullOrEmpty(p.field)) > 0)

{

return -4;

}

//<6>

if (list.Count(p => string.IsNullOrEmpty(p.entityType)) > 0)

{

return -5;

}

...............................

页面的开发文档(片断节选)

模块编号

Wxwinter.Index.Power.manageDutyControl

模块需要调用的其它UI模块列表

Wxwinter.Index.Power.insertDutyControl

Wxwinter.Index.Power.changeDutyControl

模块的调用入口UI

Wxwinter.Index.Power.navigationOrganizationControl

UI类型

[ V ] 中控件 700 * 500

工具栏按钮的调用路径

[ V ] 无工具栏

模块调用方式

[ V ] 模式化弹出框

action说明

不需要action

源码管理

单元测试,以及单元测试文档(片断节选)

文档

×

方法签名

public int? transactComplete(string powerID , Guid instanceID , Guid stateID , string transactResult , status status)

×

返回值

  • [0]:方法未完成
  • [null]:操作成功
  • [401]:参数[powerID]没通过[security.checkPowerID方法]验证
  • [-1]:[instanceID]为[Guid.empty]
  • [-2]:[stateID]为[Guid.empty]
  • [1]:[wfStateTransactTask]表中没有指定完成的办理任务
  • [2]:所指定的办理任务处在非等待状态
  • [3]:数据库提交失败

×

参数

  • [powerID]: 权限参数
  • [instanceID]:实例编号
  • [stateID]:状态编号
  • [transactResult]:办理结果
  • [status]:身份

×

约束

<1>调用[security.checkPowerID方法]判断[powerID],如果[security.checkPowerID方法]返回[false],返回[401]

<2>调用[checkInstanceState()]方法对[instanceID][stateID]指定的实例状态进行验证,返回值不为[null],返回[checkInstanceState()]的返回值

<3>调用[checkStatus()]方法对[status]进行验证,返回值不为[null],返回[checkStatus()]的返回值

<4>得到[wfStateTransactTask]表中

[

wfStateTransactTask.instanceID = instanceID

&& wfStateTransactTask.stateID = stateID

&& wfStateTransactTask.departmentNo = status.departmentNo

&& wfStateTransactTask.dutyNo = status.dutyNo

&& wfStateTransactTask.personNo = status.personNo

]

的记录并赋给变量[taskInfo],如果不存在,返回[1]

<5>如果[taskInfo.runState != runState.wait],返回[2]

<6>修改

[

taskInfo.runState=runState.end

taskInfo.completeTime=System.DateTime.Now

taskInfo.transactResult=transactResult

]

用[taskInfo]修改[wfStateTransactTask]表中记录

<7>向[wfStepList]中插入数据

[

flowID = taskInfo.flowID

flowName = taskInfo.flowName

nodeID = taskInfo.nodeID

nodeName = taskInfo.nodeName

departmentNo = status.departmentNo

departmentName = status.departmentName

dutyNo = status.dutyNo

dutyName = status.dutyName

personNo = status.personNo

personName = status.personName

instanceID = taskInfo.instanceID

stateID = taskInfo.stateID

processID = taskInfo.processID

processName = taskInfo.processName

stepAction = stepAction.办理

stepTime = System.DateTime.Now

taskID = stepAction.办理

]

<8>如果数据库提交失败,返回[3],成功,返回[null]

×

说明

调用[checkInstanceState()]方法对实例状态进行验证

×

单元测试

单元测试选项

范围

判断

影响

(无)

(不需要)

(全路径)

(正常路径)

(简单调用)

(组合测试)

(已在外部调试通过)

(自动判断返回状态)

(自动判断返回结果)

(人工判断返回结果,结果控制台输出)

(人工判断返回结果,结果存入磁盘)

(自动判断操作结果)

(人工判断操作结果,结果存入数据库)

(人工判断操作结果,结果存入数据库)

(不出异常即可)

(说明…)

(操作数据库,完成测试后已复原)

(操作数据库,已做state标记)

(操作数据库,需要手工复原)

(操作临时数据库)

实现思路设计文档(片断节选)

例1:工作流结构的解析

例2:删除部门职能人员的约束

例3:查询用户的模块权限

public List<viewRelationModel> searchModelPowerOfPerson(string powerID,string personNo)

searchModelPowerOfPerson("","user1")

step1

使用 searchStatusList("", "user1") 得到[得到身份列表]

departmentNo

dutyNo

personNo

A

X

user1

B

Y

user1

C

Z

user1

step2

用得到的身份与[powerRelationModel]对比,并返回如下算法的集合

departmentNo

dutyNo

modelNo

action

scope

all

X

m1

see

B

all

m2

see

all

all

m3

see

C

Z

m4

see

数据库文档

wfFlow 流程表

表说明:存储流程模板的属性信息,该表内容是将xoml存入时,解析xoml后一次性生成的,不能修改

flowID

流程编号

f1

来自iFlow

flowName

流程名称

f2

flowType

流程类型

f3

flowDescription

流程说明

f4

businessType

业务类型

f5

startWindow

启动窗体

f6

dataFormList

  • 14:46
  • 浏览 (8)
  • 评论 (0)
  • 分类: 项目管理
  • 相关推荐
评论
发表评论
表情图标

相关文章:

  • SVN 版本管理
  • Win32 OpenGL系列专题
  • Nebula3 SDK Nov 2009 更新内容
  • iPhone 多线程编程
  • 面试中如何自我介绍如何回答我的优缺点
  • [常见问题]iPhone NSURLConnection delegate methods得不到调用
  • 内容管理系统(CMS)
  • 钱学森最后一次系统谈话:大学要有创新精神
  • 《程序员羊皮卷》走进Tech•Ed2009
  • 《程序员羊皮卷》走进Tech?Ed2009
  • Mondrian系列(三)-如何设计Mondrian的Schema(1)
  • 三大运营商的应用商店之路
  • OpenSSL介绍
  • 在Windows下编译OpenSSL(VS2005)【转】
  • 柏林墙倒塌20年纪念
  • avalon2.2的VM生成过程
  • git 常用命令
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java超时控制的实现
  • Less 日常用法
  • Mocha测试初探
  • Spark RDD学习: aggregate函数
  • SpringBoot 实战 (三) | 配置文件详解
  • Spring核心 Bean的高级装配
  • Vultr 教程目录
  • 关于springcloud Gateway中的限流
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊聊redis的数据结构的应用
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 小程序button引导用户授权
  • Nginx实现动静分离
  • #git 撤消对文件的更改
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (31)对象的克隆
  • (39)STM32——FLASH闪存
  • (C++)八皇后问题
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)Eureka服务搭建,服务注册,服务发现
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一) storm的集群安装与配置
  • (转)Linux整合apache和tomcat构建Web服务器
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Framework杂记
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET企业级应用架构设计系列之技术选型
  • @RequestMapping处理请求异常
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C# 开发技巧]实现属于自己的截图工具
  • [C]编译和预处理详解
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [Editor]Unity Editor类常用方法