`

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

阅读更多

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

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

<span styl

分享到:
评论

相关推荐

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

    该案例为一个为期六个月的工作流平台开发项目,该项目从今年三月份启动,现已顺利完成,虽然比原计划多用了25天的时间,但整体来看仍取得了良好的成果。 #### 二、团队构成 本项目的开发团队由12名核心成员组成...

    <>

    在《如何带领团队开发项目》一书中,作者分享了实际案例,指导项目经理如何有效地管理团队进行软件开发,特别是工作流平台的开发。以下是对书中涉及的关键知识点的详细解释: 1. 团队建设:项目成功的关键在于团队...

    C#软件项目开发全程剖析

    在“C#软件项目开发全程剖析”一文中,将通过具体案例和实践练习的方式,带领读者从项目规划、需求分析、系统设计、编码实现、测试验证,直至部署上线的完整过程,帮助读者全面掌握C#开发的各个环节。通过理论与实践...

    软件项目经理总结-总结.docx

    在软件开发项目中,项目经理的作用无可替代。他们承担着确保项目顺利推进、团队成员协调、以及实现最终项目目标...通过上述多维度的工作,项目经理能够确保项目管理的成功,最终带领团队交付符合预期的高质量软件产品。

    DarkWarrior:玄武是针对影视特效和动画行业的项目流程管理系统,基于图形图像行业流行的 Python开发语言,整合现有CG工作流程,通过看板、甘特图、日历的展现可以更容易的管理工作和艺术家,可以随时根据突发状况对计划进行监督和调整,无论您在什么地点只要有网络环境就可以进行沟通。可以轻松管理您所有动画、特效项目,在线Web访问,从中调取任何的项目、任务、资产、镜头进行协同审查或团队沟通

    DarkWarrior是我在2016年带领团队创业开发的项目,这两年一直躺在硬盘里,不如开源出来分享给大家。 由于产品设计是在2015年做的,前端使用bootstrap实现,后端使用django 1.8,现在来说有点老,但程序本身很好用,...

    Jira Software v8.8用户手册(英文完整版)

    例如,用户可以创建项目特定的组件来组织工作,并通过看板来展示和管理团队的工作流。 ### 版本计划与管理 在敏捷项目中,版本计划是管理产品发布的关键部分。手册中详细介绍了如何规划版本,如何在Scrum和Kanban...

    2021年信息系统项目管理师《综合知识》考试题及答案.doc

    需求分析工作可由专门的系统分析人员或项目经理带领的技术团队完成。 6. 获取需求的方法包括问卷调查、会议讨论和获取原型,但不包括决策分析,因为决策分析是一种运筹学方法,主要用于处理复杂和不确定环境下的...

    物联网发展专项资金项目申请报告.doc

    项目总负责人润滋润滋带领团队成功研发了一系列高科技创新成果,获得省科技创新成果奖。 5. 项目目标与内容: 目标包括制定企业内部技术标准,建设物联网感知体验中心,以及推动市场推广和产业化。内容包括物联网...

    2019年软件开发工程师年度工作总结.doc

    不具备技术基础的管理者往往难以带领团队成功完成项目。同时,技术的变化速度很快,需要定期更新知识,避免被淘汰。 4. **时间管理与自我提升**:软件开发人员应确保每天有专门的时间用于学习和提高。例如,平均...

    2022年个人述职报告范文[Word稿].doc

    通过明确的目标和步骤,我带领团队有效地推进了项目进度,并保证了最终产品的质量。 在个人述职报告中,通过这些具体的工作内容和成果展示,我不仅仅是在向管理层汇报我的工作表现,更重要的是在进行自我分析和反思...

    前端开发工程师 - 宋宁宁1

    6. **项目管理**:在客服系统项目中,宋宁宁不仅开发了部分功能页面,还承担了带领新人的任务,这显示了他的团队合作和指导能力。 7. **数据可视化**:通过Echarts,宋宁宁在多个项目中实现了销售数据的可视化展示...

    Java实习总结(三篇).docx

    我了解到,一个项目的成功不仅仅依赖于高质量的代码,还需要一个明确的开发流程来指导整个项目的进行。数据库设计和表的建设是其中的关键步骤,它们决定了数据的组织方式和访问效率。在实习期间,我参与设计了简单的...

    Oracle 9i JDeveloper开发指南

    总之,"Oracle 9i JDeveloper开发指南"是一份宝贵的资源,它将带领你深入理解Oracle JDeveloper的各个方面,提升你的Java EE开发能力。无论你是初学者还是有经验的开发者,这份指南都将是你学习和工作中不可或缺的...

    it部门年度总结怎么写(精品资料)..doc

    总结而言,IT部门在过去一年中不仅承担了多个关键项目的开发工作,还通过团队合作提升了个人技能和团队凝聚力。未来,部门将继续致力于技术创新和团队建设,为公司的业务发展提供强有力的技术支持。通过不断的努力和...

    计算机实习报告总结 (2).docx

    实习初期,我对即将从事的软件开发工作充满好奇与期待。很快,我就被分配到一个项目组中,负责企业管理系统中的人事管理模块。在指导老师的带领下,我们使用了流行的Spring框架、Hibernate框架等Java主流技术进行...

    2021最新信息系统项目管理师《综合知识》考试题及答案.doc

    需求分析可以由专门的系统分析人员或项目经理带领的技术团队完成。软件需求包括业务需求、用户需求、功能需求和非功能需求。 6. 获取需求的方法通常包括问卷调查、会议讨论和获取原型,但不包括决策分析,因为决策...

    亚马逊工作方法探秘:创新利器 2 Pizza Team.docx

    2) 成员构成:团队应由各领域的专家组成,避免层级结构,强调经验丰富的成员带领并培养新人,确保团队的全面性和自主性。 04 运行机制 2 Pizza Team的成功运行依赖于以下几个关键要素: - 自主决策:团队拥有高度...

    PHP for Flash FMS网站开发手札.pdf

    这一章节的重要性在于它为后续的开发工作奠定了坚实的基础,使得开发者能够专注于代码编写与功能实现,而无需过多地担心环境兼容性问题。 ### PHP for Flash 动态网站开发基础入门 接下来,本书将带领初学者快速...

Global site tag (gtag.js) - Google Analytics