背景:

        以前需求方产生需求,需要找相关人员沟通,沟通后需要邮箱通知,还会询问邮件格式怎么写,

        (有些需求可能会使用gitlab存放,让相关人员按格式抄送,反正大家都烦闷,效率奇低).


需求:

        0.日常运维工作表单流程化归类,具备审核执行回滚分派功能,便于前期协调处理和后期统计分析.

        1.流程和任务结构实现,能够增删改查等操作.

        2.分用户显示,实现待处理、已处理、我发起等列表

        3.工单状态化,支持"提交->审核->执行->结束",加入回滚工单的效果,相关分派和邮件触发报警(重点).

        4.流程工单内容需求不同,导致表单字段动态生成,根据状态禁止某些字段只读.


益处:    

        开发需要创建机器资源,通过表单填写即可,运维执行通过,直接对接到ucloud api接口直接创建.(提高自动化水平)

        工单需求信息知会,需求是否已经产生,当前状态步骤.

        量化运维工作内容,通过统计分析归类,提高工作效率非常有帮助(最近处理事务,如何更好提高效率).


后期开发方向:

        一键接单, 未处理工单为Open, 通过设置一键接单, 可以显示用户正在处理, 处理需要时间较长工单.

        监控告警以工单形式发出,让运维人员以工单工作流方式处理.

        进行日常工作分析归类,需要完成大量工单测试数据.


大众点评公司样例, 归类大多数日常工作. 

workflow_11.png


###########################################################################################
###########################################################################################
##-----------------------------------------------------------------------------------------
#workflow模块关系图(models相关模块说明)

##-----------------------------------------------------------------------------------------


workflow_12.png


##-----------------------------------------------------------------------------------------
#工单创建过程和状态化说明

##-----------------------------------------------------------------------------------------

通过页面直接创建某个工单任务.

workflow_1.png


获取相关流程描述,不同流程步骤不一致.

workflow_2.png


工单任务创建, 注意此部分由固定字段和动态字段组成. 注意下面的'提交'和'保存'操作, 通向不同Step.

workflow_3.png


分用户显示, 待处理工单key为undone, 再传递userid和订单状态,获取需要操作的工单.

if key == "undone/":

        qset = (Q(order_people=u1)&Q(step__in=Step.objects.exclude(tag="end")))

workflow_6.png


实现部分字段只读状态, 只允许修改部分字段.

workflow_7.png


前面处理步骤为'VM虚拟机创建_vmcreate-approval', 此处为'VM虚拟机创建_vmcreate-exec', 工单状态化.

workflow_6.png


流程步骤说明

workflow_8.png


流程流转步骤说明:

workflow_9.png


##-----------------------------------------------------------------------------------------
#动态定义表单说明:

##-----------------------------------------------------------------------------------------

存放相关流程动态定义字段和默认设置.

workflow_10.png

用户创建任务时,通过使用以下代码进行组装处理.

#通过传入流程ID进行内容组装(process固定字段+parameter变动字段)
def getParameterForm(id):
    pobj = Process.SearchOne(int(id))
    form = CreateOrderForm(initial={"process":id,"step":pobj.begin})
    if pobj:
        palameterlist = pobj.parameter_process.select_related().order_by("sorting")
        if len(palameterlist) == 0:
            print "不需要进行封装处理"
        for item in palameterlist:
            form.fields['parameter-'+str(item.id)] = forms.ChoiceField(label=item.title,widget=forms.Select(),choices=(eval(item.optional_item)),initial=item.initial_value,required=True,)
    return form
#In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?
#links https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled-so-that-it-cannot
#使用以下共用表单模块.
class ReadOnlyFieldsMixin(object):
    readonly_fields =()
    #print "这是最终要处理的字段", readonly_fields
    def __init__(self, *args, **kwargs):
        super(ReadOnlyFieldsMixin, self).__init__(*args, **kwargs)
        for field in (field for name, field in self.fields.iteritems() if name in self.readonly_fields):
            field.widget.attrs['disabled'] = 'true'
            field.required = False
    def clean(self):
        cleaned_data = super(ReadOnlyFieldsMixin,self).clean()
        for field in self.readonly_fields:
           cleaned_data[field] = getattr(self.instance, field)
        return cleaned_data

#Usage, just define which ones must be read only:
#调用处理方法.
#class MyFormWithReadOnlyFields(ReadOnlyFieldsMixin, CreateOrderForm):
#    readonly_fields = ("name","desc","process","step","expire_time")


技术链接:

        loonapp先生的<利用django实现工作流>

数据来源于http://www.loonapp.com/blog/27/https://github.com/bbaobelief/workflow

当然是直接抄他的构思, 以此为基础进行二次开发.           

        糯米糊糊先生的<Django:我是怎么做到使用django动态定义表单(form)>

数据来源于http://blog.csdn.net/huyoo/article/details/6627967(),  

此动态表单技术暂时用于workflow项目.