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

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

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

表单列表

f7

startDataForm

启动时填写的表单

f8

inputFormItems

传入表单

f9

inputFormItemsExpandData

传入表单扩展数据

f10

commandOption

命令选项

f11

commandOptionExpandData

命令选项扩展数据

f12

ownedType

流程归属类型

f13

timelimitUnit

时限单位

l1

来自iTimelimit

timelimit

时限

l2

overtimeOperate

超时操作

l3

calendar

日历

l4

residualTimelimit

剩余时限

l5

createDepartmentNo

创建部门编号

创建该流程模板的人员所在部门的编号

createDepartmentName

创建部门名称

 

createDutyNo

创建职能编号

创建该流程模板的人员所担任的职能的编号

createDutyName

创建职能名称

 

createPersonNo

创建人员编号

创建该流程模板的人员的编号

createPersonName

创建人员名称

 

createTime

创建时间

 

isCheckout

是否签出

如果为真,签出人可以对流程模板进行修改,非签出人不能再将该模板签出进行修改,如果为假,就可以将该流程签出进行修改

checkoutPersonNo

签出人员编号

 

checkoutPersonName

签出人员名称

 

checkoutTime

签出时间

 

checkinTime

签入时间

 

isFreeze

是否冻结

如果为真,流程模板处于冻结状态,不能被启动

如果为假,流程模板可以正常启动

wfFlow 流程表 表结构

编号

字段

中文对照

外创

模创

外改

数据类型

主键

非空

唯一

外键约束/字段值选项

 

rowID

行编号

     

uniqueidentifier

 
 

state

状态

     

int

       

f1

flowID

流程编号

 

 

nvarchar(50)

 

 

f2

flowName

流程名称

 

 

nvarchar(50)

 

   

f3

flowType

流程类型

 

 

nvarchar(50)

 

 

option.flowType

f4

flowDescription

流程说明

 

 

nvarchar(MAX)

 

   

f5

businessType

业务类型

 

 

nvarchar(50)

 

 

wfBusinessType.businessType

f6

startWindow

启动窗体

 

 

nvarchar(255)

 

   

f7

dataFormList

表单列表

 

 

nvarchar(MAX)

 

   

f8

startDataForm

启动时填写的表单

 

 

nvarchar(MAX)

 

   

f9

inputFormItems

传入表单

 

 

nvarchar(MAX)

 

   

f10

inputFormItemsExpandData

传入表单扩展数据

 

 

nvarchar(MAX)

 

   

f11

commandOption

命令选项

 

 

nvarchar(255)

 

   

f12

commandOptionExpandData

命令选项扩展数据

 

 

nvarchar(MAX)

 

   

f13

ownedType

流程归属类型

 

 

nvarchar(50)

 

 

option.ownedType

l1

timelimitUnit

时限单位

 

 

nvarchar(50)

 

 

option.timelimitUnit

l2

timelimit

时限

 

 

int

 

   

l3

overtimeOperate

超时操作

 

 

nvarchar(50)

 

   

l4

calendar

日历

 

 

nvarchar(50)

 

   

I5

residualTimelimit

剩余时限

 

 

int

 

   
 

createDepartmentNo

创建部门编号

   

nvarchar(50)

 

   
 

createDepartmentName

创建部门名称

   

nvarchar(50)

 

   
 

createDutyNo

创建职能编号

   

nvarchar(50)

 

   
 

createDutyName

创建职能名称

   

nvarchar(50)

 

   
 

createPersonNo

创建人员编号

   

nvarchar(50)

 

   
 

createPersonName

创建人员名称

   

nvarchar(50)

 

   
 

createTime

创建时间

   

datetime

 

   
 

isCheckout

是否签出

 

int

 

   
 

checkoutPersonNo

签出人员编号

 

nvarchar(50)

       
 

checkoutPersonName

签出人员名称

 

nvarchar(50)

       
 

checkoutTime

签出时间

 

datetime

       
 

checkinTime

签入时间

 

datetime

       
 

isFreeze

是否冻结

 

int

 

   

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

SQL Server 类型

C# 类型

说明

nvarchar(50)

string

  • 字符类的[唯一索引]
  • 标识类信息,如用户名,口令,性别
  • 标签类信息
  • 标记类信息
  • 状态标识 :如:[成功],[失败],[运行中]

对应的UI为单行行文本框,标签,提示文字

nvarchar(255)

string

  • 小量的描述信息,两行以上
  • 磁盘文件的路径信息

对应的UI为垂直滚动条的多行文本框,或多段的标签

nvarchar(MAX)

string

  • 文章
  • 二进制串行化信息
  • XML数据
  • 大字符数据

对应的UI为双滚动条的多行文本框

编码规范(片断节选)

操做数据的方法命名规则

前缀

含义

传入

返回

get

得到单条记录

rowID

单条记录对象

唯一键

search

查询多条记录

唯一键

List<记录对象>

非唯一键

多个参数, [and/or]关系组合

select

查询多条记录

唯一键,[字段名]

List<string>

字段名所对应的[表.字段.ToString()]

非唯一键,[字段名]

多个参数, [and/or]关系组合,[字段名]

change

修改单条

记录对像

执行状态

stringResult.state 执行状态

stringResult.value 出问题的字段

set

修改单条

唯一键,[字段名],[值]

执行状态

rowID,[字段名],[值]

update

修改多条

(事物)

List<记录对象>

执行状态

modify

修改多条

(无事物)

List<记录对象>

无法完成修改的List<记录对象>

insert

添加单条

记录对象

执行状态

add

批量添加

(事物)

List<记录对象>

执行状态

stringResult.state 执行状态

stringResult.value 出问题的字段

append

批量添加

(无事物)

List<记录对象>

无法完成添加的List<记录对象>

remove

删除单条

rowID

执行状态

唯一键

delete

删除多条

(事物)

List<记录对象>

执行状态

clear

删除多条

(事物)

多个参数, [and/or]关系组合

执行状态

wipe

删除多条

(无事物)

List<记录对象>

无法完成删除的List<记录对象>

execute

执行sql

SQL 字串

存储过程

执行状态

stringResult.state 执行状态

stringResult.value 问题

stringResult.state 执行状态

stringResult.value 返回对象的XML

binding

添加单条(关系表)

记录对象

执行状态

unbinding

删除单条(关系表)

rowID

执行状态

我是如何带领团队开发项目的相关推荐

  1. 艾伟也谈项目管理,我是如何带领团队开发项目的

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

  2. SSH+ExtJs4开发项目的Demo实例视频讲解

    大家好.应大家的需求和一些迷茫的人不知道如何去ExtJs开发.所以我做了一套视频和源码共享一下.分享一下经验. 搭建了SSH的框架.因为我在网上找SSH的时候.都只有一个Demo的实例.本身真正的作用 ...

  3. 关于白石画廊香港分社发起基于区块链技术的美术品在线拍卖平台开发项目的ICO众筹的公告

    香港 -- (美国商业资讯) -- 白石画廊香港位于香港(地址:香港特区黄竹坑道12号香华工业大厦6楼,董事会理事长:白石幸生https://www.whitestone-gallery.com/)宣 ...

  4. 关涛:接手一个6年的平台型系统,我是如何带领团队破局前行的

    原文链接:点击打开链接 摘要: 12月20日的北京云栖大会上,由云栖社区主办的开发者技术进阶峰会再度开启,在此之前,我们整理了2017杭州云栖大会开发者技术进阶专场上的精彩分享内容. 摘要:12月20 ...

  5. Web 开发项目的6个最佳Java框架

    由于许多原因,Java 几乎是每个开发人员最喜欢的面向对象语言.Java 框架是企业倾向于 Java 开发的另一个原因.选择 Java 的众多原因之一是它提供了大量其他 Java 框架. 在这篇博文中 ...

  6. Subclipse-用于Eclipse开发项目的SVN版本管理

    如题. 在Eclipse中可以通过 help->market....来安装subversion 配合Eciplse使用的说明 http://www.blogjava.net/gdhqs/ htt ...

  7. 干货分享,我是怎么寻找暴利赚钱项目的

    我被问的最多的问题是,你有没有什么赚钱的项目,这句话我听得耳朵都起茧了,所以今天我要和大家分享一下我找项目的方法. 在分享方法之前,我想明确一点,能让你赚钱的项目,往往是那些你现在看不懂.过去不知道的 ...

  8. 「团队管理」UCD领域如何带领前端开发团队

    文章目录 前言 一.代码规范 二.低代码 三.UCD 四.AI+前端 五.团队扩容 六.二八法则 七.前端开发实际场景 八.前期准备 8.1 UI历年项目产品 8.2 产品清单 8.3 前端技术负责人 ...

  9. 梳理项目的pom文件

    [前言] Maven是一款十分棒的项目管理工具:毫无疑问pom文件是Maven项目中的命脉,管理着各个jar包之间相互依赖关系: 最近将项目中的pom文件重新梳理了一遍,发现pom文件如果乱了,后续会 ...

最新文章

  1. c语言图像浏览器,单片机采用浏览器进行监控将给软件的编程带来极大的便利...
  2. noclobber属性
  3. Windows消息:如何自定义窗口消息与线程消息
  4. 判断随机抽取代码_高中数学中离散型随机变量的分布列知道吗?均值与方差能干什么?...
  5. Linux C中发现无法连接到math.h中的数学函数解决办法
  6. linux增加调整虚拟内存
  7. python运维常用模块-运维常用python库模块
  8. 如何安装tensorflow
  9. 基础html交代选择器,html 选择器之基础选择器
  10. 齿轮的正负变位设计要点
  11. PlaySound的同步播放与异步播放
  12. iconfont 在项目中使用阿里icon
  13. linux设置usb选择性暂停,usb大容量存储设备是什么?无法启动怎么解决?
  14. Scope参数错误或没有Scope权限
  15. ubuntu20.04下opencv4.4编译、给图片加中文标注及tensorflow的问题记录、ubuntu下使用cv::text::OCRTesseract模块字符识别
  16. 复合函数的极限与连续
  17. PPT倒计时制作技巧及模板素材下载
  18. 移动端+京东移动端首页制作
  19. 抖音国庆小游戏是如何实现的?带你走近 Cocos
  20. Maven2的相关知识[zt]

热门文章

  1. 20条.net编码习惯 【转】
  2. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别
  3. shell中的括号(小括号,中括号,大括号/花括号)
  4. CSS单位 px pt em和rem 之间的区别
  5. Magento教程 25:如何修改系统发送的通知信件?
  6. UITableView 系列四 :项目中行的操作 (添加移动和删除)(实例)
  7. 用户空间与内核空间数据交换的方式(1)------debugfs
  8. Android五大布局详解
  9. 【Linux学习】linux源代码版本控制RCS
  10. 树视图的代码 TreeView