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

本文介绍了一个为期六个月的工作流平台开发项目的实战经验,涵盖团队建设、项目管理、前后端开发对接、文档编写、源码管理及单元测试等内容。

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

关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台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 

user1 

user1 

user1 

step2

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

 

departmentNo 

dutyNo 

modelNo 

action 

scope 

all 

m1 

see 

 

B 

all 

m2 

see 

 

all 

all 

m3 

see 

 

m4 

see 

 

 

 

 

数据库文档

wfFlow 流程表

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

flowID

流程编号

f1

来自iFlow

flowName

流程名称

f2

flowType

流程类型

f3

flowDescription

流程说明

f4

businessType

业务类型

f5

startWindow

启动窗体

f6

dataFormList

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值